<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 }"> 
 | 
                            <image v-if="item.status == 1" src="@/static/plan_ic_finish@2x.png" class="icon" mode=""></image> 
 | 
                            <text>{{ item.status == 1 ? '已巡检' : '待巡检' }}</text> 
 | 
                        </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"> 
 | 
                                <text>{{item.dealDate}}</text> 
 | 
                                <text v-if="item.status == 1" class="detail">查看详情</text> 
 | 
                            </view>  
 | 
                        </view>  
 | 
                    </template>  
 | 
                    <view class="desc" v-else>{{item.content}}</view>  
 | 
                </view>  
 | 
            </view>  
 | 
        </view>  
 | 
        <view class="footer" @click="openSc" v-if="flag">  
 | 
            <view class="sub_btn">扫码巡检</view>  
 | 
        </view> 
 | 
        <!--  --> 
 | 
        <view class="reader-box" @click="stopScan" v-if="isScaning"> 
 | 
            <view class="reader" id="reader"></view> 
 | 
        </view>  
 | 
    </view>  
 | 
</template>  
 | 
  
 | 
<script>  
 | 
    import {  
 | 
        ywPatrolDetail,  
 | 
        ywPatrolTaskRecord, 
 | 
        getPointRecordByCode  
 | 
    } from '@/api'  
 | 
    import dayjs from 'dayjs';  
 | 
    import {  
 | 
        Html5Qrcode  
 | 
    } from 'html5-qrcode';  
 | 
    export default {  
 | 
        data() {  
 | 
            return {  
 | 
                id: '',  
 | 
                info: {},  
 | 
                list: [],  
 | 
                flag: false,  
 | 
                statusM: [{  
 | 
                        color: '#4593f7',  
 | 
                        name: '待开始'  
 | 
                    },  
 | 
                    {  
 | 
                        color: '#73e09a',  
 | 
                        name: '进行中'  
 | 
                    },  
 | 
                    {  
 | 
                        color: '#f1a93f',  
 | 
                        name: '已超期'  
 | 
                    },  
 | 
                    {  
 | 
                        color: '#b9b9b9',  
 | 
                        name: '已处理'  
 | 
                    },  
 | 
                ],  
 | 
                html5Qrcode: null,  
 | 
                isScaning: false,  
 | 
            };  
 | 
        },  
 | 
        onLoad(option) {  
 | 
            this.id = option.id  
 | 
            // this.getDetail()  
 | 
        },  
 | 
        onShow() {  
 | 
            this.getDetail()  
 | 
        },  
 | 
        methods: {  
 | 
            openSc() {  
 | 
                this.isScaning = true;  
 | 
                Html5Qrcode.getCameras().then((devices) => {  
 | 
                    if (devices && devices.length) {  
 | 
                        this.html5Qrcode = new Html5Qrcode('reader');  
 | 
                        this.html5Qrcode.start({  
 | 
                                facingMode: 'environment'  
 | 
                            }, {  
 | 
                                focusMode: 'continuous', //设置连续聚焦模式  
 | 
                                fps: 5, //设置扫码识别速度  
 | 
                                qrbox: 280 //设置二维码扫描框大小  
 | 
                            },  
 | 
                            (decodeText, decodeResult) => {  
 | 
                                if (decodeText) { //这里decodeText就是通过扫描二维码得到的内容  
 | 
                                    this.stopScan(); //关闭扫码功能  
 | 
                                    getPointRecordByCode({  
 | 
                                        taskId: this.id,  
 | 
                                        pointCode: decodeText  
 | 
                                    }).then(ress => {  
 | 
                                        if (ress.data) {  
 | 
                                            uni.navigateTo({  
 | 
                                                url: '/pages/polling/point?id=' + ress.data.id  
 | 
                                            })  
 | 
                                        } else {  
 | 
                                            this.showToast('未匹配到巡检点,请重新扫描')  
 | 
                                        }  
 | 
                                    })  
 | 
                                }  
 | 
                            },  
 | 
                            (err) => {  
 | 
                                // console.log(err);  //错误信息  
 | 
                            }  
 | 
                        );  
 | 
                    }  
 | 
                });  
 | 
            },  
 | 
  
 | 
            stopScan() {  
 | 
                console.log('停止扫码')  
 | 
                this.isScaning = false;  
 | 
                if (this.html5Qrcode) {  
 | 
                    this.html5Qrcode.stop();  
 | 
                }  
 | 
            },  
 | 
            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).getTime()  
 | 
                    console.log('res.data.startDate', new Date().getTime());  
 | 
                    this.flag = new Date().getTime() > time && (this.info.status == 0 || this.info.status == 1)  
 | 
                })  
 | 
                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 - 490rpx);  
 | 
            overflow: auto; 
 | 
            padding-bottom: 160rpx;  
 | 
            .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; 
 | 
                    width: 100%; 
 | 
                    .val{ 
 | 
                        display: flex; 
 | 
                        justify-content: space-between; 
 | 
                        align-items: center; 
 | 
                        flex: 1; 
 | 
                        .detail{ 
 | 
                            color: $primaryColor; 
 | 
                            font-size: 26rpx; 
 | 
                        } 
 | 
                    }  
 | 
                }  
 | 
  
 | 
                .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 {  
 | 
                            font-size: 28rpx;  
 | 
                            color: $primaryColor;  
 | 
                            font-weight: 400; 
 | 
                            display: flex; 
 | 
                            align-items: center; 
 | 
                            .icon{ 
 | 
                                width: 40rpx; 
 | 
                                height: 40rpx; 
 | 
                                // border-radius: 50%; 
 | 
                                // overflow: hidden; 
 | 
                                background: none; 
 | 
                            } 
 | 
                              
 | 
                        }  
 | 
  
 | 
                        .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;  
 | 
            }  
 | 
        }  
 | 
  
 | 
    }  
 | 
  
 | 
    .reader-box { 
 | 
        position: fixed; 
 | 
        top: 0; 
 | 
        bottom: 0; 
 | 
        left: 0; 
 | 
        right: 0; 
 | 
        background-color: rgba(0, 0, 0, 0.5); 
 | 
    } 
 | 
     
 | 
    .reader { 
 | 
        width: 100%; 
 | 
        // width: 540rpx; 
 | 
        // height: 540rpx; 
 | 
        position: absolute; 
 | 
        top: 50%; 
 | 
        left: 50%; 
 | 
        transform: translate(-50%, -50%); 
 | 
    } 
 | 
</style> 
 |