<template>  
 | 
    <view class="main_app">  
 | 
        <view v-if="info.status || info.status == 0" class="head_bg" :style="{ 
 | 
            background: `linear-gradient(180deg, ${statusM[info.status].color} 0%, rgba(247, 247, 247, 0) 100%)` 
 | 
        }"></view>  
 | 
        <view class="info">  
 | 
            <image v-if="info.status == 2" class="icon" src="@/static/side/ic_dabiaoed.png" mode=""></image>  
 | 
            <image v-if="info.status == 3" class="icon" src="@/static/side/ic_dabiao.png" mode=""></image>  
 | 
            <view class="head">  
 | 
                <view class="name">{{ info.title || info.planTitle }}</view>  
 | 
                <view class="status" v-if="info.status || info.status == 0" :style="{color: statusM[info.status].color}">{{statusM[info.status].name}}</view>  
 | 
            </view>  
 | 
            <view class="line">  
 | 
                <view class="la">任务日期:</view>  
 | 
                <view class="val" v-if="info.startDate">{{ info.startDate.slice(0, 10) }}</view>  
 | 
            </view>  
 | 
            <view class="line">  
 | 
                <view class="la">执行时间:</view>  
 | 
                <view class="val" v-if="info.startDate && info.endDate">{{ info.startDate.slice(11,16) }} 至  
 | 
                    {{ info.endDate.slice(11, 16) }}</view>  
 | 
            </view>  
 | 
            <view class="line">  
 | 
                <view class="la">完成情况:</view>  
 | 
                <view class="val">{{info.finishNum || 0}}/{{info.patrolNum}}</view>  
 | 
            </view>  
 | 
        </view>  
 | 
        <view class="title">巡检点列表({{list.length}})</view>  
 | 
        <view class="list">  
 | 
            <view class="item" v-for="item in list" @click="itemClick(item)">  
 | 
                <view class="icon"></view>  
 | 
                <view class="content">  
 | 
                    <view class="head">  
 | 
                        <view>{{item.pointName}}</view>  
 | 
                        <view class="status" :class="{ gray: item.status == 1 }">{{ item.status == 1 ? '已巡检' : '待巡检' }}</view>  
 | 
                    </view>  
 | 
                    <template v-if="item.status == 1">  
 | 
                        <view class="line">  
 | 
                            <view class="la">巡检结果:</view>  
 | 
                            <view class="val" :class="{ red: item.dealStatus == 1 }">{{ item.dealStatus == 0 ? '正常' : '异常' }}</view>  
 | 
                        </view>  
 | 
                        <view class="line">  
 | 
                            <view class="la">巡检时间:</view>  
 | 
                            <view class="val">{{item.dealDate}}</view>  
 | 
                        </view>  
 | 
                    </template>  
 | 
                    <view class="desc" v-else>{{item.content}}</view>  
 | 
                </view>  
 | 
            </view>  
 | 
        </view>  
 | 
        <view class="footer" v-if="flag">  
 | 
            <view class="sub_btn">扫码巡检</view>  
 | 
        </view>  
 | 
    </view>  
 | 
</template>  
 | 
  
 | 
<script>  
 | 
    import {  
 | 
        ywPatrolDetail,  
 | 
        ywPatrolTaskRecord  
 | 
    } from '@/api' 
 | 
    import dayjs from 'dayjs';  
 | 
    export default {  
 | 
        data() {  
 | 
            return {  
 | 
                id: '',  
 | 
                info: {},  
 | 
                list: [], 
 | 
                flag: false, 
 | 
                statusM: [ 
 | 
                    { color: '#4593f7', name: '待开始' }, 
 | 
                    { color: '#73e09a', name: '进行中' }, 
 | 
                    { color: '#f1a93f', name: '已超期' }, 
 | 
                    { color: '#b9b9b9', name: '已处理' }, 
 | 
                ]  
 | 
            };  
 | 
        },  
 | 
        onLoad(option) {  
 | 
            this.id = option.id  
 | 
            this.getDetail()  
 | 
        }, 
 | 
        onShow() { 
 | 
            this.getDetail() 
 | 
        },  
 | 
        methods: {  
 | 
            itemClick(item) { 
 | 
                if(!this.flag) return  
 | 
                uni.navigateTo({  
 | 
                    url: '/pages/polling/point?id=' + item.id  
 | 
                })  
 | 
            },  
 | 
            getDetail() {  
 | 
                const {  
 | 
                    id  
 | 
                } = this  
 | 
                ywPatrolDetail(id).then(res => {  
 | 
                    this.info = res.data 
 | 
                    let time = new Date(res.data.startDate.slice(0, 10) + ' 00:00:00').getTime() 
 | 
                    this.flag = new Date().getTime() > time  
 | 
                })  
 | 
                ywPatrolTaskRecord({  
 | 
                    capacity: 999,  
 | 
                    page: 1,  
 | 
                    model: {  
 | 
                        taskId: id  
 | 
                    }  
 | 
                }).then(res => {  
 | 
                    this.list = res.data.records  
 | 
                })  
 | 
            },  
 | 
            async startScan() { 
 | 
                  try { 
 | 
                    const video = document.getElementById('video'); 
 | 
                    const stream = await navigator.mediaDevices.getUserMedia({ video: { facingMode: "environment" } }); 
 | 
                    video.srcObject = stream; 
 | 
             
 | 
                    // 使用 QrScanner 解析 
 | 
                    const qrScanner = new QrScanner(video, result => { 
 | 
                      alert(`扫描结果: ${result}`); 
 | 
                      qrScanner.stop(); // 停止扫码 
 | 
                    }); 
 | 
                    qrScanner.start(); 
 | 
                  } catch (err) { 
 | 
                    console.error('打开摄像头失败:', err); 
 | 
                  } 
 | 
                } 
 | 
        }  
 | 
    }  
 | 
</script>  
 | 
  
 | 
<style lang="scss">  
 | 
    page {  
 | 
        background: #F7F7F7;  
 | 
    }  
 | 
  
 | 
    .main_app {  
 | 
        padding: 30rpx;  
 | 
  
 | 
        .head_bg {  
 | 
            // background: linear-gradient(180deg, #008BFF 0%, rgba(247, 247, 247, 0) 100%);  
 | 
            height: 240rpx;  
 | 
            width: 750rpx;  
 | 
            position: absolute;  
 | 
            top: 0;  
 | 
            left: 0;  
 | 
        }  
 | 
  
 | 
        .info {  
 | 
            width: 690rpx;  
 | 
            box-shadow: 0rpx 4rpx 16rpx 0rpx #E5E5E5;  
 | 
            border-radius: 20rpx;  
 | 
            opacity: 0.95;  
 | 
            padding: 30rpx 30rpx 10rpx;  
 | 
            margin-bottom: 40rpx;  
 | 
            background: linear-gradient(#FFFFFF 0%, #FFFFFF 48%, #F0F5FF 100%);  
 | 
            position: relative;  
 | 
  
 | 
            .icon {  
 | 
                position: absolute;  
 | 
                right: 30rpx;  
 | 
                bottom: 30rpx;  
 | 
                width: 160rpx;  
 | 
                height: 122rpx;  
 | 
            }  
 | 
  
 | 
            .head {  
 | 
                display: flex;  
 | 
                justify-content: space-between;  
 | 
                margin-bottom: 30rpx;  
 | 
  
 | 
                .name {  
 | 
                    font-weight: 600;  
 | 
                    font-size: 34rpx;  
 | 
                }  
 | 
  
 | 
                .status {  
 | 
                    color: $primaryColor;  
 | 
                } 
 | 
                .gray{ 
 | 
                    color: gray; 
 | 
                }  
 | 
            }  
 | 
  
 | 
        }  
 | 
  
 | 
        .title {  
 | 
            font-weight: 600;  
 | 
            font-size: 32rpx;  
 | 
            color: #222222;  
 | 
            margin-bottom: 30rpx;  
 | 
        }  
 | 
  
 | 
        .line {  
 | 
            display: flex;  
 | 
            margin-bottom: 20rpx;  
 | 
  
 | 
            .la {  
 | 
                color: #666666;  
 | 
            }  
 | 
        }  
 | 
  
 | 
        .list {  
 | 
            height: calc(100vh - 720rpx);  
 | 
            overflow: auto;  
 | 
  
 | 
            .item {  
 | 
                width: 690rpx;  
 | 
                height: 188rpx;  
 | 
                background: linear-gradient(#FFFFFF 0%, #FFFFFF 48%, #F0F5FF 100%);  
 | 
                box-shadow: 0rpx 4rpx 12rpx 0rpx #E5E5E5;  
 | 
                border-radius: 12rpx;  
 | 
                opacity: 0.95;  
 | 
                display: flex;  
 | 
                padding: 20rpx 30rpx 0 16rpx;  
 | 
                margin-bottom: 20rpx;  
 | 
                .line{ 
 | 
                    margin-bottom: 10rpx; 
 | 
                }  
 | 
                .icon {  
 | 
                    width: 10rpx;  
 | 
                    height: 148rpx;  
 | 
                    background: $primaryColor;  
 | 
                    border-radius: 6rpx;  
 | 
                    margin-right: 24rpx;  
 | 
                }  
 | 
  
 | 
                .content {  
 | 
                    flex: 1;  
 | 
  
 | 
                    .head {  
 | 
                        display: flex;  
 | 
                        align-items: center;  
 | 
                        justify-content: space-between;  
 | 
                        font-weight: 500;  
 | 
                        font-size: 32rpx;  
 | 
                        margin-bottom: 16rpx;  
 | 
  
 | 
                        .status {  
 | 
                            offset-anchor: 28rpx;  
 | 
                            color: $primaryColor;  
 | 
                            font-weight: 400;  
 | 
                        } 
 | 
                        .gray{ 
 | 
                            color: #999999; 
 | 
                        }  
 | 
                    }  
 | 
  
 | 
                    .desc {  
 | 
                        font-size: 26rpx;  
 | 
                        color: #666666;  
 | 
                        display: -webkit-box;  
 | 
                        -webkit-line-clamp: 2;  
 | 
                        -webkit-box-orient: vertical;  
 | 
                        overflow: hidden;  
 | 
                        text-overflow: ellipsis;  
 | 
                        width: 100%;  
 | 
                    }  
 | 
                }  
 | 
            }  
 | 
        }  
 | 
  
 | 
        .footer {  
 | 
            position: fixed;  
 | 
            bottom: 0rpx;  
 | 
            left: 0rpx;  
 | 
            width: 750rpx;  
 | 
            height: 172rpx;  
 | 
            background-color: #fff;  
 | 
            padding: 20rpx 40rpx;  
 | 
  
 | 
            .sub_btn {  
 | 
  
 | 
                width: 670rpx;  
 | 
                height: 88rpx;  
 | 
                background: $primaryColor;  
 | 
                box-shadow: 0rpx 8rpx 20rpx 0rpx rgba(0, 104, 255, 0.3);  
 | 
                border-radius: 44rpx;  
 | 
                display: flex;  
 | 
                align-items: center;  
 | 
                justify-content: center;  
 | 
                font-weight: 500;  
 | 
                font-size: 32rpx;  
 | 
                color: #FFFFFF;  
 | 
            }  
 | 
        }  
 | 
  
 | 
    }  
 | 
</style> 
 |