Houjie
2025-04-18 77cc3af3cea60471fb2d45ab5da10c4673a6f559
提交
已添加12个文件
已修改3个文件
12453 ■■■■■ 文件已修改
common/router/modules/routes.js 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages.json 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/TaskManager/TaskManagerDeils/TaskManagerDeils.vue 345 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/TaskManager/TaskManagerList.vue 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/ToDoList/ToDoList.vue 366 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/ToDoList/ToDoListDeils/ToDoListDeils.vue 345 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/device/deviceDeils/deviceDeils.vue 215 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/device/deviceWebDeils/deviceWebDeils.vue 227 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
static/home/128/icon_sacan.png 补丁 | 查看 | 原始文档 | blame | 历史
static/zhanwei.png 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/mumu-getQrcode/changelog.md 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/mumu-getQrcode/components/mumu-getQrcode/jsQR.js 10102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/mumu-getQrcode/components/mumu-getQrcode/mumu-getQrcode.vue 436 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/mumu-getQrcode/package.json 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/mumu-getQrcode/readme.md 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
common/router/modules/routes.js
@@ -1,5 +1,4 @@
const routes = [
    {
const routes = [{
     path: "/pages/login/login",
     name: 'login',
         meta: {
@@ -163,7 +162,20 @@
            title: '待办',
        },
    },
    {
        path: '/pages/TaskManager/TaskManagerDeils/TaskManagerDeils',
        name: 'TaskManagerDeils',
        meta: {
            title: '已办详情',
        },
    },
    {
        path: '/pages/ToDoList/ToDoListDeils/ToDoListDeils',
        name: 'ToDoListDeils',
        meta: {
            title: '待办详情',
        },
    },
    {
        path: '/pages/annotation/annotationDetail',
        name: 'annotationDetail',
pages.json
@@ -200,6 +200,20 @@
            {
                "navigationBarTitleText" : ""
            }
        },
        {
            "path" : "pages/TaskManager/TaskManagerDeils/TaskManagerDeils",
            "style" :
            {
                "navigationBarTitleText" : ""
            }
        },
        {
            "path" : "pages/ToDoList/ToDoListDeils/ToDoListDeils",
            "style" :
            {
                "navigationBarTitleText" : ""
            }
        }
pages/TaskManager/TaskManagerDeils/TaskManagerDeils.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,345 @@
<template>
    <view class="container">
        <cu-custom :bgColor="NavBarColor" :isBack="true" backRouterName="productionTask">
            <block slot="backText">返回</block>
            <block slot="content">已办详情</block>
        </cu-custom>
        <view class="container">
            <uni-forms ref="form" :modelValue="formData" validate-trigger="bind" err-show-type="undertext">
                <uni-group top="1">
                    <view class="text-gray margin-bottom-lg">—————————— åŸºæœ¬ä¿¡æ¯ â€”—————————</view>
                    <uni-forms-item name="num" label="工单号:">
                        <uni-easyinput v-model="formData.equipmentCode" :disabled="true" />
                    </uni-forms-item>
                    <uni-forms-item required name="num" label="设备编码:">
                        <uni-easyinput v-model="formData.equipmentCode" :disabled="true" />
                    </uni-forms-item>
                    <uni-forms-item name="remark" label="标准名称:">
                        <uni-easyinput v-model="formData.equipmentName" :disabled="true" />
                    </uni-forms-item>
                    <uni-forms-item name="remark" label="保养日期:">
                        <uni-easyinput v-model="formData.equipmentModel" :disabled="true" />
                    </uni-forms-item>
                    <uni-forms-item name="outNum" label="保养人:">
                        <uni-easyinput v-model="formData.equipmentSpecification" :disabled="true" />
                    </uni-forms-item>
                    <uni-forms-item name="outNum" label="保养周期:">
                        <uni-easyinput v-model="formData.equipmentSpecification" :disabled="true" />
                    </uni-forms-item>
                    <uni-forms-item name="outNum" label="备注:">
                        <uni-easyinput v-model="formData.equipmentSpecification" :disabled="true" />
                    </uni-forms-item>
                    <uni-forms-item name="outNum" label="保养图片:">
                        <view class="grid col-4 grid-square flex-sub">
                            <view class="bg-img" v-for="(item,index) in imgList" :key="index" @tap="ViewImage"
                                :data-url="imgList[index]">
                                <image :src="imgList[index]" mode="aspectFill"></image>
                                <view class="cu-tag bg-red radius" @tap.stop="DelImg" :data-index="index">
                                    <text class='cuIcon-close'></text>
                                </view>
                            </view>
                            <view class="solids" @tap="ChooseImage" v-if="imgList.length<1">
                                <text class='cuIcon-cameraadd'></text>
                            </view>
                        </view>
                    </uni-forms-item>
                    <view class="text-gray margin-bottom-lg">—————————— ç­ç»„长确认 â€”—————————</view>
                    <uni-forms-item name="outNum" required label="确认类型:">
                        <uni-data-select :localdata="formData.msListCategory" popup-title="请选择" @change="changeType"
                            :clear="false">
                        </uni-data-select>
                    </uni-forms-item>
                    <uni-forms-item name="outNum" required label="确认意见:">
                        <uni-easyinput type="textarea" v-model="formData.ttitle" placeholder="请输入内容"></uni-easyinput>
                    </uni-forms-item>
                </uni-group>
            </uni-forms>
            <view class="text-gray margin-bottom-lg">—————————— ä¿å…»é¡¹ä¿¡æ¯ â€”—————————</view>
            <uni-card margin="10px" spacing="1px" v-for="(item,index) in partTakeAdviceDetailList" :key="index">
                <view class="flex">
                    <view class="flex-sub text-light bg-white padding-xs margin-xs radius">行号:</view>
                    <view class="flex-sub bg-white padding-xs margin-xs radius text-right">{{index+1}}
                    </view>
                </view>
                <view class="flex">
                    <view class="flex-sub text-light bg-white padding-xs margin-xs radius">保养项:</view>
                    <view class="flex-sub bg-white padding-xs margin-xs text-bold radius text-right">
                        {{item.title}}
                    </view>
                </view>
                <view class="flex">
                    <view class="flex-sub text-light bg-white padding-xs margin-xs radius">子保养项:</view>
                    <view class="flex-sub bg-white padding-xs margin-xs radius text-right"
                        v-if="item.small!=null && item.small.length>10">
                        {{(item.small).toString().substr(0,10)+'...'}}
                    </view>
                    <view class="flex-sub bg-white padding-xs margin-xs radius text-right" v-else>
                        {{item.small}}
                    </view>
                </view>
                <view class="flex">
                    <view class="flex-sub text-light bg-white  padding-xs margin-xs radius">保养要求:</view>
                    <view class="flex-sub bg-white padding-xs margin-xs radius text-right"
                        v-if="item.yaoqiu!=null && item.yaoqiu.length>10">
                        {{(item.yaoqiu).toString().substr(0,10)+'...'}}
                    </view>
                    <view class="flex-sub bg-white padding-xs margin-xs radius text-right" v-else>
                        {{item.yaoqiu}}
                    </view>
                </view>
                <view class="flex">
                    <view class="flex-sub text-light bg-white  padding-xs margin-xs radius">保养结果:</view>
                    <view class="flex-sub bg-white padding-xs     text-right margin-xs radius">
                        <uni-data-select :localdata="item.restle" :clear="true" />
                    </view>
                </view>
                <view class="flex">
                    <view class="flex-sub text-light bg-white  padding-xs margin-xs radius">异常描述:</view>
                    <view class="flex-sub bg-white padding-xs     text-right margin-xs radius">
                        <uni-easyinput v-model="item.desc" :disabled="true" />
                    </view>
                </view>
                <view class="flex">
                    <view class="flex-sub text-light bg-white  padding-xs margin-xs radius">是否报修:</view>
                    <view class="flex-sub bg-white padding-xs     text-right margin-xs radius">
                        <uni-data-select :localdata="item.type" />
                    </view>
                </view>
            </uni-card>
        </view>
    </view>
</template>
<script>
    import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js";
    export default {
        mixins: [MescrollMixin], // ä½¿ç”¨mixin
        data() {
            return {
                scrollLeft: 0,
                searchValue: '',
                imgList: [],
                uploadUrl: "/sys/common/upload",
                formData: {},
                partTakeAdviceDetailList: [{
                    title: "机床空气过滤",
                    small: "外壳及管路",
                    yaoqiu: "过滤网,过滤棉完好,无油",
                    restle: [{
                            text: "正常",
                            value: 0
                        },
                        {
                            text: "异常",
                            value: 1
                        }
                    ]
                }],
                NavBarColor: this.NavBarColor,
                url: {
                    stallList: "/eam/equipment/queryById"
                },
                id: '',
                upOption: {
                    page: {
                        num: 0, // å½“前页码,默认0,回调之前会加1,即callback(page)会从1开始
                        size: 10 // æ¯é¡µæ•°æ®çš„æ•°é‡
                    },
                    noMoreSize: 4, //如果列表已无数据,可设置列表的总数量要大于半页才显示无更多数据;避免列表数据过少(比如只有一条数据),显示无更多数据会不好看; é»˜è®¤5
                    empty: {
                        tip: '~ æš‚无数据 ~', // æç¤º
                    },
                    loading: '',
                    text: '全部',
                    isShowNoMore: false,
                    textNoMore: '我是有底线的 >_<'
                },
                styles: {
                    color: '#2979FF',
                    borderColor: '#2979FF'
                },
                msg1Count: 0,
                msg2Count: 0,
                msg1Title: ""
            }
        },
        computed: {
            top() {
                return this.CustomBar * 2 + 160
            },
            style() {
                var StatusBar = this.StatusBar;
                var CustomBar = this.CustomBar;
                var style = `height:${CustomBar}px;padding-top:${StatusBar}px;`;
                return style
            },
        },
        onShow() {
        },
        onLoad: function(option) {
            const annItem = JSON.parse(decodeURIComponent(option.item));
            this.id = annItem.id
        },
        created() {
            this.upCallback()
        },
        methods: {
            ChooseImage() {
                var that = this;
                uni.chooseImage({
                    count: 4, //默认9
                    sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
                    sourceType: ['album'], //从相册选择
                    success: (res) => {
                        that.$http.upload(that.uploadUrl, {
                                filePath: res.tempFilePaths[0],
                                name: 'file'
                            })
                            .then(res => {
                                that.myFormData.avatar = res.data.message;
                            })
                            .catch(err => {
                                that.$tip.error(err.data.message)
                            });
                        this.imgList = res.tempFilePaths
                    }
                });
            },
            ViewImage(e) {
                uni.previewImage({
                    urls: this.imgList,
                    current: e.currentTarget.dataset.url
                });
            },
            DelImg(e) {
                uni.showModal({
                    title: '提示',
                    content: '确定要删除这段回忆吗?',
                    cancelText: '再看看',
                    confirmText: '再见',
                    success: res => {
                        if (res.confirm) {
                            this.imgList.splice(e.currentTarget.dataset.index, 1)
                        }
                    }
                })
            },
            upCallback() {
                this.$http.get(this.url.stallList, {
                    params: {
                        pageNo: 999,
                        pageSize: 1,
                        order: 'asc',
                        column: 'createTime',
                        id: this.id
                    },
                }).then(res => {
                    this.announcement1 = res.data.result
                    console.log("url", res)
                    //设置列表数据
                    if (res.data.success) {
                        console.log("res", res.data.result.equipmentCode)
                        this.formData = this.announcement1
                    }
                }).catch(() => {
                    //联网失败, ç»“束加载
                })
            },
            /* æ£€ç´¢ */
            getSera(res) {
                this.msgList = [];
                if (keyword == 0) {
                    this.$http.get(this.url.stallList, {
                        params: {
                            pageNo: 1,
                            pageSize: 999,
                            order: "desc",
                            column: "createTime",
                            equipmentCode: res
                        }
                    }).then(res => {
                        //联网成功的回调,隐藏下拉刷新和上拉加载的状态;
                        this.announcement1 = res.data.result.records
                        this.mescroll.endSuccess(this.announcement1.length);
                        console.log("url", res)
                        //设置列表数据
                        if (res.data.success) {
                            console.log("res", res.data)
                            this.msg1Count = res.data.result.total
                            this.msg1Title = "通知(" + res.data.result.total + ")";
                            for (let annItem of this.announcement1) {
                                this.msgList.push(annItem)
                            }
                        }
                        if (page.num == 1) {
                            this.msgList = []; //如果是第一页需手动制空列表
                            this.msgList = this.msgList.concat(this.announcement1); //追加新数据
                        }
                    }).catch(() => {
                        //联网失败, ç»“束加载
                        this.mescroll.endErr();
                    })
                }
            },
            mescrollInit(mescroll) {
                console.log('mescrollInit')
                this.mescroll = mescroll;
            },
        },
    }
</script>
<style>
    .is-hover {
        color: rgba(255, 255, 255, 0.6);
        background-color: #55aaff;
        border-color: #55aaff;
    }
    .content {
        margin-top: 5px;
    }
    .content scroll-view {
        scrollIndicator: "none"
    }
    .popupView {
        margin-top: 85px;
        height: auto;
    }
</style>
pages/TaskManager/TaskManagerList.vue
@@ -44,19 +44,19 @@
                        <view class="flex">
                            <view class="flex-sub text-light bg-white padding-xs margin-xs radius">流程名称:</view>
                            <view class="flex-sub bg-white padding-xs margin-xs   text-bold  radius text-right">
                                {{item.partName}}
                                {{item.procDefName}}
                            </view>
                        </view>
                        <view class="flex">
                            <view class="flex-sub text-light bg-white padding-xs margin-xs radius">流程描述:</view>
                            <view class="flex-sub bg-white padding-xs margin-xs     radius text-right">
                                {{item.taskType}}
                                {{item.description}}
                            </view>
                        </view>
                        <view class="flex">
                            <view class="flex-sub text-light bg-white padding-xs margin-xs radius">流程发起人:</view>
                            <view class="flex-sub bg-white padding-xs margin-xs   text-blue   radius text-right">
                                {{item.priority}}
                                {{item.startUserName}}
                            </view>
                        </view>
                        
@@ -64,7 +64,7 @@
                        <view class="flex">
                            <view class="flex-sub text-light bg-white padding-xs margin-xs radius">任务名称:</view>
                            <view class="flex-sub bg-white padding-xs margin-xs     radius text-right">
                                {{item.taskDesc}}
                                {{item.taskName}}
                            </view>
                        </view>
                    </uni-card>
@@ -90,8 +90,7 @@
                colorIndex: 0,
                activeColor: '#5277A6',
                url: {
                    stallList: "/assign/flow/finishedList"
                    stallList: "assign/flow/finishedList"
                },
                upOption: {
@@ -112,15 +111,7 @@
                    color: '#2979FF',
                    borderColor: '#2979FF'
                },
                msgList: [{
                    partName: "设备A",
                    taskType: "维护",
                    taskDesc: "定期检查",
                    priority: "高",
                    dueaDate: "2023-10-10",
                    ssignee: "张三",
                    status: 1
                }], //列表数据
                msgList: [], //列表数据
                announcement1: [],
                msg1Count: 0,
                msg2Count: 0,
@@ -153,92 +144,50 @@
             * @param {Object} item
             * è¯¦æƒ…页面
             */
            // onClickProductionTask(item) {
            //     let keyword = this.TabCur
            //     uni.navigateTo({
            //     url: '/pages/mes/om/workSheetOpToolingBorrowDeils/workSheetOpToolingBorrowDeils?keyword=' + keyword
            //     })
            onClickProductionTask(item) {
                uni.navigateTo({
                    url: '/pages/TaskManager/TaskManagerDeils/TaskManagerDeils?item=' +
                        encodeURIComponent(JSON.stringify(item))
            // },
                })
            },
            
            search() {
                this.$refs.popup.open();
            },
        
            // upCallback(page) {
            //     let keyword = this.TabCur
            //     if (keyword == 0) {
            upCallback(page) {
                this.$http.get(this.url.stallList, {
                    params: {
                        pageNo: page.num,
                        pageSize: page.size
                    },
            //         this.$http.get(this.url.stallList, {
            //             params: {
            //                 pageNo: page.num,
            //                 pageSize: page.size,
            //                 order: 'asc',
            //                 column: 'createTime',
            //                 status: 1
            //             },
                }).then(res => {
                    this.announcement1 = res.data.result.records
                    this.mescroll.endSuccess(this.announcement1.length);
                    console.log("url", res)
                    //设置列表数据
                    if (res.data.success) {
                        console.log("res", res.data)
                        this.msg1Count = res.data.result.total
                        this.msg1Title = "通知(" + res.data.result.total + ")";
                        for (let annItem of this.announcement1) {
                            this.msgList.push(annItem)
                        }
                    }
                    if (page.num == 1) {
                        this.msgList = []; //如果是第一页需手动制空列表
                        this.msgList = this.msgList.concat(this.announcement1); //追加新数据
                    }
            //         }).then(res => {
            //             this.announcement1 = res.data.result.records
            //             this.mescroll.endSuccess(this.announcement1.length);
            //             console.log("url", res)
            //             //设置列表数据
            //             if (res.data.success) {
            //                 console.log("res", res.data)
            //                 this.msg1Count = res.data.result.total
            //                 this.msg1Title = "通知(" + res.data.result.total + ")";
            //                 for (let annItem of this.announcement1) {
            //                     this.msgList.push(annItem)
            //                 }
            //             }
            //             if (page.num == 1) {
            //                 this.msgList = []; //如果是第一页需手动制空列表
            //                 this.msgList = this.msgList.concat(this.announcement1); //追加新数据
            //             }
            //         }).catch(() => {
            //             //联网失败, ç»“束加载
            //             this.mescroll.endErr();
            //         })
            //     } else if (keyword == 1) {
            //         this.$http.get(this.url.stallList, {
            //             params: {
            //                 pageNo: page.num,
            //                 pageSize: page.size,
            //                 order: 'desc',
            //                 status: 3,
            //                 column: 'createTime'
            //             },
            //         }).then(res => {
            //             this.announcement1 = res.data.result.records
            //             this.mescroll.endSuccess(this.announcement1.length);
            //             console.log("url", res)
            //             //设置列表数据
            //             if (res.data.success) {
            //                 console.log("res", res.data)
            //                 this.msg2Count = res.data.result.total
            //                 this.msg1Title = "通知(" + res.data.result.total + ")";
            //                 for (let annItem of this.announcement1) {
            //                     this.msgList.push(annItem)
            //                 }
            //             }
            //             if (page.num == 1) {
            //                 this.msgList = []; //如果是第一页需手动制空列表
            //                 this.msgList = this.msgList.concat(this.announcement1); //追加新数据
            //             }
            //         }).catch(() => {
            //             //联网失败, ç»“束加载
            //             this.mescroll.endErr();
            //         })
            //     }
            // },
                }).catch(() => {
                    //联网失败, ç»“束加载
                    this.mescroll.endErr();
                })
            },
            resetTask() {
@@ -383,7 +332,6 @@
</script>
<style>
    .is-hover {
        color: rgba(255, 255, 255, 0.6);
        background-color: #55aaff;
pages/ToDoList/ToDoList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,366 @@
<template>
    <view class="container">
        <cu-custom :bgColor="NavBarColor" :isBack="true" backRouterName="productionTask">
            <block slot="backText">返回</block>
            <block slot="content">待办</block>
        </cu-custom>
        <view style="width: 100%;">
            <uni-popup ref="popup" background-color="#fff" :type="type">
                <view class="popupView">
                    <!-- åŸºç¡€è¡¨å•校验 -->
                    <uni-forms ref="form" :modelValue="formData" validate-trigger="bind" err-show-type="undertext">
                        <uni-group title="" top="0">
                            <uni-forms-item name="numbers" label="领料申请单号:">
                                <uni-easyinput type="text" v-model="formData.num" placeholder="请输入领料申请单号检索" />
                            </uni-forms-item>
                            <uni-forms-item name="name" label="领料产品:">
                                <uni-easyinput v-model="formData.partNumNameModel" placeholder="请输入领料产品" />
                            </uni-forms-item>
                        </uni-group>
                    </uni-forms>
                    <view class="flex">
                        <view
                            class="cuIcon-search flex-sub bg-blue padding-sm margin-xs margin-left-lg margin-right-lg text-sm text-center"
                            @click="getSera">查询
                        </view>
                        <view
                            class="cuIcon-refresh flex-sub bg-white solids padding-sm margin-xs radius text-sm text-center margin-left-lg margin-right-lg"
                            @click="resetTask">重置</view>
                    </view>
                </view>
            </uni-popup>
        </view>
        <view class="container">
            <mescroll-uni ref="mescrollRef" @init="mescrollInit" :top="top" @down="downCallback" @up="upCallback">
                <!-- åˆ—表信息开始 -->
                <view class="content">
                    <uni-card margin="10px" spacing="1px" v-for="(item,index) in msgList" :key="index"
                        @click="onClickProductionTask(item)">
                        <view class="flex">
                            <view class="flex-sub text-light bg-white padding-xs margin-xs radius">流程名称:</view>
                            <view class="flex-sub bg-white padding-xs margin-xs   text-bold  radius text-right">
                                {{item.flowName}}
                            </view>
                        </view>
                        <view class="flex">
                            <view class="flex-sub text-light bg-white padding-xs margin-xs radius">流程描述:</view>
                            <view class="flex-sub bg-white padding-xs margin-xs     radius text-right">
                                {{item.title}}
                            </view>
                        </view>
                        <view class="flex">
                            <view class="flex-sub text-light bg-white padding-xs margin-xs radius">之前处理人:</view>
                            <view class="flex-sub bg-white padding-xs margin-xs   text-blue   radius text-right">
                                {{item.preNodeAssignee_dictText}}
                            </view>
                        </view>
                        <view class="flex">
                            <view class="flex-sub text-light bg-white padding-xs margin-xs radius">前驱节点:</view>
                            <view class="flex-sub bg-white padding-xs margin-xs   text-blue   radius text-right">
                                {{item.preNode}}
                            </view>
                        </view>
                        <view class="flex">
                            <view class="flex-sub text-light bg-white padding-xs margin-xs radius">当前节点:</view>
                            <view class="flex-sub bg-white padding-xs margin-xs     radius text-right">
                                {{item.name}}
                            </view>
                        </view>
                    </uni-card>
                </view>
            </mescroll-uni>
        </view>
    </view>
</template>
<script>
    import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js";
    export default {
        mixins: [MescrollMixin], // ä½¿ç”¨mixin
        data() {
            return {
                type: 'top',
                scrollLeft:0,
                formData: {
                    num: '',
                    partNumNameModel: ''
                },
                NavBarColor: this.NavBarColor,
                activeColor: '#5277A6',
                url: {
                    stallList: "/assign/flow/toTaskBySelf"
                },
                upOption: {
                    page: {
                        num: 0, // å½“前页码,默认0,回调之前会加1,即callback(page)会从1开始
                        size: 10 // æ¯é¡µæ•°æ®çš„æ•°é‡
                    },
                    noMoreSize: 4, //如果列表已无数据,可设置列表的总数量要大于半页才显示无更多数据;避免列表数据过少(比如只有一条数据),显示无更多数据会不好看; é»˜è®¤5
                    empty: {
                        tip: '~ æš‚无数据 ~', // æç¤º
                    },
                    loading: '',
                    text: '全部',
                    isShowNoMore: false,
                    textNoMore: '我是有底线的 >_<'
                },
                styles: {
                    color: '#2979FF',
                    borderColor: '#2979FF'
                },
                msgList: [], //列表数据
                announcement1: [],
                msg1Count: 0,
                msg2Count: 0,
                msg1Title: ""
            }
        },
        computed: {
            top() {
                return this.CustomBar * 2 + 130
            },
            style() {
                var StatusBar = this.StatusBar;
                var CustomBar = this.CustomBar;
                var style = `height:${CustomBar}px;padding-top:${StatusBar}px;`;
                return style
            },
        },
        onShow() {
            if (this.mescroll) {
                this.mescroll.resetUpScroll()
            }
        },
        created() {},
        methods: {
            /**
             * @param {Object} item
             * è¯¦æƒ…页面
             */
            onClickProductionTask(item) {
            uni.navigateTo({
                url: '/pages/ToDoList/ToDoListDeils/ToDoListDeils?item=' +
                    encodeURIComponent(JSON.stringify(item))
            })
            },
            search() {
                this.$refs.popup.open();
            },
            upCallback(page) {
                    this.$http.get(this.url.stallList, {
                        params: {
                            pageNo: page.num,
                            pageSize: page.size,
                            order: 'asc',
                            column: 'createTime'
                        },
                    }).then(res => {
                        this.announcement1 = res.data.result.records
                        this.mescroll.endSuccess(this.announcement1.length);
                        console.log("url", res)
                        //设置列表数据
                        if (res.data.success) {
                            console.log("res", res.data)
                            this.msg1Count = res.data.result.total
                            this.msg1Title = "通知(" + res.data.result.total + ")";
                            for (let annItem of this.announcement1) {
                                this.msgList.push(annItem)
                            }
                        }
                        if (page.num == 1) {
                            this.msgList = []; //如果是第一页需手动制空列表
                            this.msgList = this.msgList.concat(this.announcement1); //追加新数据
                        }
                    }).catch(() => {
                        //联网失败, ç»“束加载
                        this.mescroll.endErr();
                    })
            },
            resetTask() {
                this.formData.num = ''
                this.formData.partNumNameModel = ''
                this.$refs.popup.close();
                this.mescroll.resetUpScroll()
            },
            /* æ£€ç´¢ */
            getSera() {
                this.$refs.popup.close();
                let keyword = this.TabCur
                this.msgList = [];
                if (keyword == 0) {
                    this.$http.get(this.url.stallList, {
                        params: {
                            pageNo: 1,
                            pageSize: 999,
                            order: "desc",
                            column: "createTime",
                            num: '*' + this.formData.num + '*',
                            partNumNameModel: '*' + this.formData.partNumNameModel + '*',
                            status: 'published'
                        }
                    }).then(res => {
                        //联网成功的回调,隐藏下拉刷新和上拉加载的状态;
                        this.announcement1 = res.data.result.records
                        this.mescroll.endSuccess(this.announcement1.length);
                        console.log("url", res)
                        //设置列表数据
                        if (res.data.success) {
                            console.log("res", res.data)
                            this.msg1Count = res.data.result.total
                            this.msg1Title = "通知(" + res.data.result.total + ")";
                            for (let annItem of this.announcement1) {
                                this.msgList.push(annItem)
                            }
                        }
                        if (page.num == 1) {
                            this.msgList = []; //如果是第一页需手动制空列表
                            this.msgList = this.msgList.concat(this.announcement1); //追加新数据
                        }
                    }).catch(() => {
                        //联网失败, ç»“束加载
                        this.mescroll.endErr();
                    })
                } else if (keyword == 1) {
                    this.$http.get(this.url.stallList, {
                        params: {
                            pageNo: 1,
                            pageSize: 999,
                            order: "desc",
                            column: "createTime",
                            status: 'training',
                            num: '*' + this.formData.num + '*',
                            partNumNameModel: '*' + this.formData.partNumNameModel + '*'
                        }
                    }).then(res => {
                        //联网成功的回调,隐藏下拉刷新和上拉加载的状态;
                        this.announcement1 = res.data.result.records
                        this.mescroll.endSuccess(this.announcement1.length);
                        console.log("url", res)
                        //设置列表数据
                        if (res.data.success) {
                            console.log("res", res.data)
                            this.msg1Count = res.data.result.total
                            this.msg2Title = "通知(" + res.data.result.total + ")";
                            for (let annItem of this.announcement1) {
                                this.msgList.push(annItem)
                            }
                        }
                        if (page.num == 1) {
                            this.msgList = []; //如果是第一页需手动制空列表
                            this.msgList = this.msgList.concat(this.announcement1); //追加新数据
                        }
                    }).catch(() => {
                        //联网失败, ç»“束加载
                        this.mescroll.endErr();
                    })
                } else if (keyword == 2) {
                    this.$http.get(this.url.stallList, {
                        params: {
                            pageNo: 1,
                            pageSize: 999,
                            order: "desc",
                            column: "createTime",
                            status: 'completed',
                            num: '*' + this.formData.num + '*',
                            partNumNameModel: '*' + this.formData.partNumNameModel + '*'
                        }
                    }).then(res => {
                        //联网成功的回调,隐藏下拉刷新和上拉加载的状态;
                        this.announcement1 = res.data.result.records
                        this.mescroll.endSuccess(this.announcement1.length);
                        console.log("url", res)
                        //设置列表数据
                        if (res.data.success) {
                            console.log("res", res.data)
                            this.msg3Count = res.data.result.total
                            this.msg1Title = "通知(" + res.data.result.total + ")";
                            for (let annItem of this.announcement1) {
                                this.msgList.push(annItem)
                            }
                        }
                        if (page.num == 1) {
                            this.msgList = []; //如果是第一页需手动制空列表
                            this.msgList = this.msgList.concat(this.announcement1); //追加新数据
                        }
                    }).catch(() => {
                        //联网失败, ç»“束加载
                        this.mescroll.endErr();
                    })
                }
            },
            mescrollInit(mescroll) {
                console.log('mescrollInit')
                this.mescroll = mescroll;
            },
        },
    }
</script>
<style>
    .is-hover {
        color: rgba(255, 255, 255, 0.6);
        background-color: #55aaff;
        border-color: #55aaff;
    }
    .content {
        margin-top: 5px;
    }
    .content scroll-view {
        scrollIndicator: "none"
    }
    .popupView {
        margin-top: 85px;
        height: auto;
    }
</style>
pages/ToDoList/ToDoListDeils/ToDoListDeils.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,345 @@
<template>
    <view class="container">
        <cu-custom :bgColor="NavBarColor" :isBack="true" backRouterName="productionTask">
            <block slot="backText">返回</block>
            <block slot="content">待办详情</block>
        </cu-custom>
        <view class="container">
            <uni-forms ref="form" :modelValue="formData" validate-trigger="bind" err-show-type="undertext">
                <uni-group top="1">
                    <view class="text-gray margin-bottom-lg">—————————— åŸºæœ¬ä¿¡æ¯ â€”—————————</view>
                    <uni-forms-item name="num" label="工单号:">
                        <uni-easyinput v-model="formData.equipmentCode" :disabled="true" />
                    </uni-forms-item>
                    <uni-forms-item required name="num" label="设备编码:">
                        <uni-easyinput v-model="formData.equipmentCode" :disabled="true" />
                    </uni-forms-item>
                    <uni-forms-item name="remark" label="标准名称:">
                        <uni-easyinput v-model="formData.equipmentName" :disabled="true" />
                    </uni-forms-item>
                    <uni-forms-item name="remark" label="保养日期:">
                        <uni-easyinput v-model="formData.equipmentModel" :disabled="true" />
                    </uni-forms-item>
                    <uni-forms-item name="outNum" label="保养人:">
                        <uni-easyinput v-model="formData.equipmentSpecification" :disabled="true" />
                    </uni-forms-item>
                    <uni-forms-item name="outNum" label="保养周期:">
                        <uni-easyinput v-model="formData.equipmentSpecification" :disabled="true" />
                    </uni-forms-item>
                    <uni-forms-item name="outNum" label="备注:">
                        <uni-easyinput v-model="formData.equipmentSpecification" :disabled="true" />
                    </uni-forms-item>
                    <uni-forms-item name="outNum" label="保养图片:">
                        <view class="grid col-4 grid-square flex-sub">
                            <view class="bg-img" v-for="(item,index) in imgList" :key="index" @tap="ViewImage"
                                :data-url="imgList[index]">
                                <image :src="imgList[index]" mode="aspectFill"></image>
                                <view class="cu-tag bg-red radius" @tap.stop="DelImg" :data-index="index">
                                    <text class='cuIcon-close'></text>
                                </view>
                            </view>
                            <view class="solids" @tap="ChooseImage" v-if="imgList.length<1">
                                <text class='cuIcon-cameraadd'></text>
                            </view>
                        </view>
                    </uni-forms-item>
                    <view class="text-gray margin-bottom-lg">—————————— ç­ç»„长确认 â€”—————————</view>
                    <uni-forms-item name="outNum" required label="确认类型:">
                        <uni-data-select :localdata="formData.msListCategory" popup-title="请选择" @change="changeType"
                            :clear="false">
                        </uni-data-select>
                    </uni-forms-item>
                    <uni-forms-item name="outNum" required label="确认意见:">
                        <uni-easyinput type="textarea" v-model="formData.ttitle" placeholder="请输入内容"></uni-easyinput>
                    </uni-forms-item>
                </uni-group>
            </uni-forms>
            <view class="text-gray margin-bottom-lg">—————————— ä¿å…»é¡¹ä¿¡æ¯ â€”—————————</view>
            <uni-card margin="10px" spacing="1px" v-for="(item,index) in partTakeAdviceDetailList" :key="index">
                <view class="flex">
                    <view class="flex-sub text-light bg-white padding-xs margin-xs radius">行号:</view>
                    <view class="flex-sub bg-white padding-xs margin-xs radius text-right">{{index+1}}
                    </view>
                </view>
                <view class="flex">
                    <view class="flex-sub text-light bg-white padding-xs margin-xs radius">保养项:</view>
                    <view class="flex-sub bg-white padding-xs margin-xs text-bold radius text-right">
                        {{item.title}}
                    </view>
                </view>
                <view class="flex">
                    <view class="flex-sub text-light bg-white padding-xs margin-xs radius">子保养项:</view>
                    <view class="flex-sub bg-white padding-xs margin-xs radius text-right"
                        v-if="item.small!=null && item.small.length>10">
                        {{(item.small).toString().substr(0,10)+'...'}}
                    </view>
                    <view class="flex-sub bg-white padding-xs margin-xs radius text-right" v-else>
                        {{item.small}}
                    </view>
                </view>
                <view class="flex">
                    <view class="flex-sub text-light bg-white  padding-xs margin-xs radius">保养要求:</view>
                    <view class="flex-sub bg-white padding-xs margin-xs radius text-right"
                        v-if="item.yaoqiu!=null && item.yaoqiu.length>10">
                        {{(item.yaoqiu).toString().substr(0,10)+'...'}}
                    </view>
                    <view class="flex-sub bg-white padding-xs margin-xs radius text-right" v-else>
                        {{item.yaoqiu}}
                    </view>
                </view>
                <view class="flex">
                    <view class="flex-sub text-light bg-white  padding-xs margin-xs radius">保养结果:</view>
                    <view class="flex-sub bg-white padding-xs     text-right margin-xs radius">
                        <uni-data-select :localdata="item.restle" :clear="true" />
                    </view>
                </view>
                <view class="flex">
                    <view class="flex-sub text-light bg-white  padding-xs margin-xs radius">异常描述:</view>
                    <view class="flex-sub bg-white padding-xs     text-right margin-xs radius">
                        <uni-easyinput v-model="item.desc" :disabled="true" />
                    </view>
                </view>
                <view class="flex">
                    <view class="flex-sub text-light bg-white  padding-xs margin-xs radius">是否报修:</view>
                    <view class="flex-sub bg-white padding-xs     text-right margin-xs radius">
                        <uni-data-select :localdata="item.type" />
                    </view>
                </view>
            </uni-card>
        </view>
    </view>
</template>
<script>
    import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js";
    export default {
        mixins: [MescrollMixin], // ä½¿ç”¨mixin
        data() {
            return {
                scrollLeft: 0,
                searchValue: '',
                imgList: [],
                uploadUrl: "/sys/common/upload",
                formData: {},
                partTakeAdviceDetailList: [{
                    title: "机床空气过滤",
                    small: "外壳及管路",
                    yaoqiu: "过滤网,过滤棉完好,无油",
                    restle: [{
                            text: "正常",
                            value: 0
                        },
                        {
                            text: "异常",
                            value: 1
                        }
                    ]
                }],
                NavBarColor: this.NavBarColor,
                url: {
                    stallList: "/eam/equipment/queryById"
                },
                id: '',
                upOption: {
                    page: {
                        num: 0, // å½“前页码,默认0,回调之前会加1,即callback(page)会从1开始
                        size: 10 // æ¯é¡µæ•°æ®çš„æ•°é‡
                    },
                    noMoreSize: 4, //如果列表已无数据,可设置列表的总数量要大于半页才显示无更多数据;避免列表数据过少(比如只有一条数据),显示无更多数据会不好看; é»˜è®¤5
                    empty: {
                        tip: '~ æš‚无数据 ~', // æç¤º
                    },
                    loading: '',
                    text: '全部',
                    isShowNoMore: false,
                    textNoMore: '我是有底线的 >_<'
                },
                styles: {
                    color: '#2979FF',
                    borderColor: '#2979FF'
                },
                msg1Count: 0,
                msg2Count: 0,
                msg1Title: ""
            }
        },
        computed: {
            top() {
                return this.CustomBar * 2 + 160
            },
            style() {
                var StatusBar = this.StatusBar;
                var CustomBar = this.CustomBar;
                var style = `height:${CustomBar}px;padding-top:${StatusBar}px;`;
                return style
            },
        },
        onShow() {
        },
        onLoad: function(option) {
            const annItem = JSON.parse(decodeURIComponent(option.item));
            this.id = annItem.id
        },
        created() {
            this.upCallback()
        },
        methods: {
            ChooseImage() {
                var that = this;
                uni.chooseImage({
                    count: 4, //默认9
                    sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
                    sourceType: ['album'], //从相册选择
                    success: (res) => {
                        that.$http.upload(that.uploadUrl, {
                                filePath: res.tempFilePaths[0],
                                name: 'file'
                            })
                            .then(res => {
                                that.myFormData.avatar = res.data.message;
                            })
                            .catch(err => {
                                that.$tip.error(err.data.message)
                            });
                        this.imgList = res.tempFilePaths
                    }
                });
            },
            ViewImage(e) {
                uni.previewImage({
                    urls: this.imgList,
                    current: e.currentTarget.dataset.url
                });
            },
            DelImg(e) {
                uni.showModal({
                    title: '提示',
                    content: '确定要删除这段回忆吗?',
                    cancelText: '再看看',
                    confirmText: '再见',
                    success: res => {
                        if (res.confirm) {
                            this.imgList.splice(e.currentTarget.dataset.index, 1)
                        }
                    }
                })
            },
            upCallback() {
                this.$http.get(this.url.stallList, {
                    params: {
                        pageNo: 999,
                        pageSize: 1,
                        order: 'asc',
                        column: 'createTime',
                        id: this.id
                    },
                }).then(res => {
                    this.announcement1 = res.data.result
                    console.log("url", res)
                    //设置列表数据
                    if (res.data.success) {
                        console.log("res", res.data.result.equipmentCode)
                        this.formData = this.announcement1
                    }
                }).catch(() => {
                    //联网失败, ç»“束加载
                })
            },
            /* æ£€ç´¢ */
            getSera(res) {
                this.msgList = [];
                if (keyword == 0) {
                    this.$http.get(this.url.stallList, {
                        params: {
                            pageNo: 1,
                            pageSize: 999,
                            order: "desc",
                            column: "createTime",
                            equipmentCode: res
                        }
                    }).then(res => {
                        //联网成功的回调,隐藏下拉刷新和上拉加载的状态;
                        this.announcement1 = res.data.result.records
                        this.mescroll.endSuccess(this.announcement1.length);
                        console.log("url", res)
                        //设置列表数据
                        if (res.data.success) {
                            console.log("res", res.data)
                            this.msg1Count = res.data.result.total
                            this.msg1Title = "通知(" + res.data.result.total + ")";
                            for (let annItem of this.announcement1) {
                                this.msgList.push(annItem)
                            }
                        }
                        if (page.num == 1) {
                            this.msgList = []; //如果是第一页需手动制空列表
                            this.msgList = this.msgList.concat(this.announcement1); //追加新数据
                        }
                    }).catch(() => {
                        //联网失败, ç»“束加载
                        this.mescroll.endErr();
                    })
                }
            },
            mescrollInit(mescroll) {
                console.log('mescrollInit')
                this.mescroll = mescroll;
            },
        },
    }
</script>
<style>
    .is-hover {
        color: rgba(255, 255, 255, 0.6);
        background-color: #55aaff;
        border-color: #55aaff;
    }
    .content {
        margin-top: 5px;
    }
    .content scroll-view {
        scrollIndicator: "none"
    }
    .popupView {
        margin-top: 85px;
        height: auto;
    }
</style>
pages/device/deviceDeils/deviceDeils.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,215 @@
<template>
    <view class="container">
        <cu-custom :bgColor="NavBarColor" :isBack="true" backRouterName="productionTask">
            <block slot="backText">返回</block>
            <block slot="content">设备详情</block>
        </cu-custom>
        <view class="container">
            <uni-forms ref="form" :modelValue="formData" validate-trigger="bind" err-show-type="undertext">
                <uni-group top="1">
                    <uni-forms-item  name="num" label="设备图片:">
                        <image  style="height: 100px; width: 300px;"    :src="formData.equipmentImagel?formData.equipmentImage:'/static/zhanwei.png'"></image>
                    </uni-forms-item>
                    <uni-forms-item required name="num" label="设备编号:">
                        <uni-easyinput v-model="formData.equipmentCode" :disabled="true" />
                    </uni-forms-item>
                    <uni-forms-item name="remark" label="设备名称:">
                        <uni-easyinput v-model="formData.equipmentName" :disabled="true" />
                    </uni-forms-item>
                    <uni-forms-item name="remark" label="设备型号:">
                        <uni-easyinput v-model="formData.equipmentModel" :disabled="true" />
                    </uni-forms-item>
                    <uni-forms-item name="outNum" label="设备规格:">
                        <uni-easyinput v-model="formData.equipmentSpecification"  :disabled="true" />
                    </uni-forms-item>
                    <view class="text-gray margin-bottom-lg">—————————— åŸºæœ¬ä¿¡æ¯ â€”—————————</view>
                    <uni-forms-item name="taskCode" label="设备分类:">
                        <uni-easyinput :disabled="true" v-model="formData.equipmentCategory"/>
                    </uni-forms-item>
                    <uni-forms-item name="endLocation" label="出厂日期:">
                        <uni-easyinput :disabled="true" v-model="formData.leaveFactoryDate" />
                    </uni-forms-item>
                    <uni-forms-item name="endLocation" label="验收日期:">
                        <uni-easyinput :disabled="true" v-model="formData.acceptanceCheckDate" />
                    </uni-forms-item>
                    <uni-forms-item name="endLocation" label="安装位置:">
                        <uni-easyinput :disabled="true" v-model="formData.installationPosition" />
                    </uni-forms-item>
                    <uni-forms-item name="endLocation" label="资产状态:">
                        <uni-easyinput :disabled="true" v-model="formData.assetStatus" />
                    </uni-forms-item>
                    <uni-forms-item name="endLocation" label="设备管理员:">
                        <uni-easyinput :disabled="true" v-model="formData.equipmentManager" />
                    </uni-forms-item>
                </uni-group>
            </uni-forms>
        </view>
    </view>
</template>
<script>
    import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js";
    export default {
        mixins: [MescrollMixin], // ä½¿ç”¨mixin
        data() {
            return {
                scrollLeft: 0,
                searchValue: '',
                formData: {},
                NavBarColor: this.NavBarColor,
                url: {
                    stallList: "/eam/equipment/queryById"
                },
                id: '',
                upOption: {
                    page: {
                        num: 0, // å½“前页码,默认0,回调之前会加1,即callback(page)会从1开始
                        size: 10 // æ¯é¡µæ•°æ®çš„æ•°é‡
                    },
                    noMoreSize: 4, //如果列表已无数据,可设置列表的总数量要大于半页才显示无更多数据;避免列表数据过少(比如只有一条数据),显示无更多数据会不好看; é»˜è®¤5
                    empty: {
                        tip: '~ æš‚无数据 ~', // æç¤º
                    },
                    loading: '',
                    text: '全部',
                    isShowNoMore: false,
                    textNoMore: '我是有底线的 >_<'
                },
                styles: {
                    color: '#2979FF',
                    borderColor: '#2979FF'
                },
                msg1Count: 0,
                msg2Count: 0,
                msg1Title: ""
            }
        },
        computed: {
            top() {
                return this.CustomBar * 2 + 160
            },
            style() {
                var StatusBar = this.StatusBar;
                var CustomBar = this.CustomBar;
                var style = `height:${CustomBar}px;padding-top:${StatusBar}px;`;
                return style
            },
        },
        onShow() {
        },
        onLoad: function(option) {
            const annItem = JSON.parse(decodeURIComponent(option.item));
            this.id = annItem.id
        },
        created() {
            this.upCallback()
        },
        methods: {
            upCallback() {
                this.$http.get(this.url.stallList, {
                    params: {
                        pageNo: 999,
                        pageSize: 1,
                        order: 'asc',
                        column: 'createTime',
                        id: this.id
                    },
                }).then(res => {
                    this.announcement1 = res.data.result
                    console.log("url", res)
                    //设置列表数据
                    if (res.data.success) {
                        console.log("res", res.data.result.equipmentCode)
                        this.formData = this.announcement1
                    }
                }).catch(() => {
                    //联网失败, ç»“束加载
                })
            },
            /* æ£€ç´¢ */
            getSera(res) {
                this.msgList = [];
                if (keyword == 0) {
                    this.$http.get(this.url.stallList, {
                        params: {
                            pageNo: 1,
                            pageSize: 999,
                            order: "desc",
                            column: "createTime",
                            equipmentCode: res
                        }
                    }).then(res => {
                        //联网成功的回调,隐藏下拉刷新和上拉加载的状态;
                        this.announcement1 = res.data.result.records
                        this.mescroll.endSuccess(this.announcement1.length);
                        console.log("url", res)
                        //设置列表数据
                        if (res.data.success) {
                            console.log("res", res.data)
                            this.msg1Count = res.data.result.total
                            this.msg1Title = "通知(" + res.data.result.total + ")";
                            for (let annItem of this.announcement1) {
                                this.msgList.push(annItem)
                            }
                        }
                        if (page.num == 1) {
                            this.msgList = []; //如果是第一页需手动制空列表
                            this.msgList = this.msgList.concat(this.announcement1); //追加新数据
                        }
                    }).catch(() => {
                        //联网失败, ç»“束加载
                        this.mescroll.endErr();
                    })
                }
            },
            mescrollInit(mescroll) {
                console.log('mescrollInit')
                this.mescroll = mescroll;
            },
        },
    }
</script>
<style>
    .is-hover {
        color: rgba(255, 255, 255, 0.6);
        background-color: #55aaff;
        border-color: #55aaff;
    }
    .content {
        margin-top: 5px;
    }
    .content scroll-view {
        scrollIndicator: "none"
    }
    .popupView {
        margin-top: 85px;
        height: auto;
    }
</style>
pages/device/deviceWebDeils/deviceWebDeils.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,227 @@
<template>
    <view class="container">
        <cu-custom :bgColor="NavBarColor" :isBack="true" backRouterName="productionTask">
            <block slot="backText">返回</block>
            <!-- <cu-custom :bgColor="NavBarColor" backRouterName="index">
            <block slot="right">
                <view @tap="$debounce(BackPage)">
                    <view class="cuIcon-back back">返回</view>
                </view>
            </block> -->
            <block slot="content">设备详情</block>
        </cu-custom>
        <view class="container">
            <uni-forms ref="form" :modelValue="formData" validate-trigger="bind" err-show-type="undertext">
                <uni-group top="1">
                    <uni-forms-item name="num" label="设备图片:">
                        <image style="height: 100px; width: 300px;"
                            :src="formData.equipmentImagel?formData.equipmentImage:'/static/zhanwei.png'"></image>
                    </uni-forms-item>
                    <uni-forms-item required name="num" label="设备编号:">
                        <uni-easyinput v-model="formData.equipmentCode" :disabled="true" />
                    </uni-forms-item>
                    <uni-forms-item name="remark" label="设备名称:">
                        <uni-easyinput v-model="formData.equipmentName" :disabled="true" />
                    </uni-forms-item>
                    <uni-forms-item name="remark" label="设备型号:">
                        <uni-easyinput v-model="formData.equipmentModel" :disabled="true" />
                    </uni-forms-item>
                    <uni-forms-item name="outNum" label="设备规格:">
                        <uni-easyinput v-model="formData.equipmentSpecification" :disabled="true" />
                    </uni-forms-item>
                    <view class="text-gray margin-bottom-lg">—————————— åŸºæœ¬ä¿¡æ¯ â€”—————————</view>
                    <uni-forms-item name="taskCode" label="设备分类:">
                        <uni-easyinput :disabled="true" v-model="formData.equipmentCategory" />
                    </uni-forms-item>
                    <uni-forms-item name="endLocation" label="出厂日期:">
                        <uni-easyinput :disabled="true" v-model="formData.leaveFactoryDate" />
                    </uni-forms-item>
                    <uni-forms-item name="endLocation" label="验收日期:">
                        <uni-easyinput :disabled="true" v-model="formData.acceptanceCheckDate" />
                    </uni-forms-item>
                    <uni-forms-item name="endLocation" label="安装位置:">
                        <uni-easyinput :disabled="true" v-model="formData.installationPosition" />
                    </uni-forms-item>
                    <uni-forms-item name="endLocation" label="资产状态:">
                        <uni-easyinput :disabled="true" v-model="formData.assetStatus" />
                    </uni-forms-item>
                    <uni-forms-item name="endLocation" label="设备管理员:">
                        <uni-easyinput :disabled="true" v-model="formData.equipmentManager" />
                    </uni-forms-item>
                </uni-group>
            </uni-forms>
            <view class="flex">
                <button class="flex-sub  cu-btn bg-blue margin-sm  padding-sm lg" hover-class="is-hover"
                    @click="getSera()">点检</button>
                <button class="flex-sub  cu-btn bg-blue margin-sm  padding-sm lg" hover-class="is-hover"
                    @click="resetTask">保养</button>
                <button class="flex-sub  cu-btn bg-blue margin-sm  padding-sm lg" hover-class="is-hover"
                    @click="resetTask">ç»´ä¿®</button>
                <button class="flex-sub  cu-btn bg-blue margin-sm  padding-sm lg" hover-class="is-hover"
                    @click="resetTask">周养</button>
            </view>
        </view>
    </view>
</template>
<script>
    import {
        stringify
    } from "querystring";
    import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js";
    export default {
        mixins: [MescrollMixin], // ä½¿ç”¨mixin
        data() {
            return {
                formData: {},
                NavBarColor: this.NavBarColor,
                url: {
                    stallList: "/eam/equipment/queryById"
                },
                id: '',
                upOption: {
                    page: {
                        num: 0, // å½“前页码,默认0,回调之前会加1,即callback(page)会从1开始
                        size: 10 // æ¯é¡µæ•°æ®çš„æ•°é‡
                    },
                    noMoreSize: 4, //如果列表已无数据,可设置列表的总数量要大于半页才显示无更多数据;避免列表数据过少(比如只有一条数据),显示无更多数据会不好看; é»˜è®¤5
                    empty: {
                        tip: '~ æš‚无数据 ~', // æç¤º
                    },
                    loading: '',
                    text: '全部',
                    isShowNoMore: false,
                    textNoMore: '我是有底线的 >_<'
                },
                styles: {
                    color: '#2979FF',
                    borderColor: '#2979FF'
                },
                msg1Count: 0,
                msg2Count: 0,
                msg1Title: ""
            }
        },
        computed: {
            top() {
                return this.CustomBar * 2 + 160
            },
            style() {
                var StatusBar = this.StatusBar;
                var CustomBar = this.CustomBar;
                var CustomBar = this.CustomBar;
                var style = `height:${CustomBar}px;padding-top:${StatusBar}px;`;
                return style
            },
        },
        onLoad(options) {
            const decodedEquipmentId = decodeURIComponent(options.equipmentId);
            this.id = decodedEquipmentId;
            // const data = options.query;
            // this.id = JSON.parse(data).equipmentId;
            // console.log(data)
            // this.id = options.equipmentId;
            // console.log(options)
            console.log(this.id)
            if (!this.id) {
                uni.showModal({
                    title: '提示',
                    content: "错误不存在",
                    showCancel: false
                });
            } else {
                this.upCallback();
            }
        },
        onShow() {
            // ä»Žè·¯ç”±å‚数中获取equipmentId
            const equipmentIdFromRoute = this.$router.query.equipmentId;
            if (equipmentIdFromRoute) {
                // å¦‚果存在,更新this.id
                this.id = equipmentIdFromRoute;
                // é‡æ–°èŽ·å–è®¾å¤‡è¯¦æƒ…æ•°æ®
                this.upCallback();
            }
        },
        watch: {
            // ç›‘听$route变化
            $route(to, from) {
                // æ›´æ–°equipmentId参数
                this.id = to.query.equipmentId;
                console.log('更新后的equipmentId:', this.equipmentId);
            }
        },
        created() {},
        methods: {
            getSera() {
                console.log('getSera æ–¹æ³•被调用');
                uni.navigateTo({
                    url: '/pages/TaskManager/TaskManagerList'
                });
            },
        upCallback() {
            console.log("id", this.id)
            this.$http.get(this.url.stallList, {
                params: {
                    pageNo: 999,
                    pageSize: 1,
                    order: 'asc',
                    column: 'createTime',
                    id: this.id
                },
            }).then(res => {
                this.announcement1 = res.data.result
                console.log("url", res)
                //设置列表数据
                if (res.data.success) {
                    console.log("res", res.data.result.equipmentCode)
                    this.formData = this.announcement1
                }
            }).catch(() => {
                //联网失败, ç»“束加载
            })
        },
        mescrollInit(mescroll) {
            console.log('mescrollInit')
            this.mescroll = mescroll;
        },
    },
    }
</script>
<style>
    .is-hover {
        color: rgba(255, 255, 255, 0.6);
        background-color: #55aaff;
        border-color: #55aaff;
    }
    .content {
        margin-top: 5px;
    }
    .content scroll-view {
        scrollIndicator: "none"
    }
    .popupView {
        margin-top: 85px;
        height: auto;
    }
</style>
static/home/128/icon_sacan.png
static/zhanwei.png
uni_modules/mumu-getQrcode/changelog.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
## 1.3.0(2022-06-28)
1. [修改] - ä¹‹å‰ä½¿ç”¨ canvas åœ¨é¡µé¢ä¸Šå±•示画面,改为 video æ ‡ç­¾åœ¨é¡µé¢å±•示视频流画面。
2. [增强] - çŽ°åœ¨åªèŽ·å–æ‰«ææ¡†ä¸­çš„ç”»é¢è¿›è¡ŒäºŒç»´ç è¯†åˆ«ï¼Œè¿™æ ·å¯æœ‰æ•ˆçš„èŠ‚çœèµ„æºä¸Žæé«˜è¯†åˆ«æ•ˆçŽ‡ã€‚
3. [增强] - æå‡è°ƒç”¨æ‘„像头的分辨率。
4. [增强] - æå‡è¯†åˆ«å¤§äºŒç»´ç çš„能力,之前在低端机上识别大二维码容易识别不到。
5. [新增] - æ–°å¢žé”™è¯¯äº‹ä»¶è¿”回,返回内部报错。错误说明请查看文档。
## 1.2.1(2022-06-01)
新增闪光灯开关(只有在谷歌内核浏览器中显示,推荐微信内置浏览器)
新增https环境检测(总有人不看介绍,直接使用导致无法正常调用摄像头。)
更新文档
## 1.2.0(2022-06-01)
新增闪光灯开关(只有在谷歌内核浏览器中显示,推荐微信内置浏览器)
新增https环境检测(总有人不看介绍,直接使用导致无法正常调用摄像头。)
## 1.1.0(2022-01-25)
1.支持全屏 -
2.支持前置摄像头 -
3.支持高清调用摄像头 -
## 1.0.4(2021-12-24)
更新插件说明
## 1.0.3(2021-12-21)
希望大家多去我小程序中逛一些,就当支持作者了。谢谢大家,底下有小程序二维码。
## 1.0.2(2021-12-21)
更新文档
## 1.0.1(2021-12-21)
正式上线插件
## 1.0.0(2021-12-21)
1.0.0
uni_modules/mumu-getQrcode/components/mumu-getQrcode/jsQR.js
¶Ô±ÈÐÂÎļþ
ÎļþÌ«´ó
uni_modules/mumu-getQrcode/components/mumu-getQrcode/mumu-getQrcode.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,436 @@
<template>
    <view class="canvasBox">
        <template v-if="isUse">
            <view class="box">
                <view class="line"></view>
                <view class="angle"></view>
            </view>
            <view class="box2" v-if="isUseTorch">
                <view class="track" @click="openTrack">
                    <svg
                        t="1653920715959"
                        class="icon"
                        viewBox="0 0 1024 1024"
                        version="1.1"
                        xmlns="http://www.w3.org/2000/svg"
                        p-id="1351"
                        width="32"
                        height="32"
                    >
                        <path
                            d="M651.353043 550.479503H378.752795L240.862609 364.315031c-3.688944-4.897391-5.660621-10.876025-5.660621-17.045466v-60.040745c0-15.773416 12.847702-28.621118 28.621118-28.621118h502.459627c15.773416 0 28.621118 12.847702 28.621118 28.621118v59.977143c0 6.105839-1.971677 12.084472-5.660621 17.045466l-137.890187 186.228074zM378.752795 598.308571v398.024348c0 15.328199 12.402484 27.667081 27.667081 27.667081h217.266087c15.328199 0 27.667081-12.402484 27.66708-27.667081V598.308571H378.752795z m136.300124 176.942112c-14.564969 0-26.331429-11.76646-26.331428-26.331428v-81.283975c0-14.564969 11.76646-26.331429 26.331428-26.331429 14.564969 0 26.331429 11.76646 26.331429 26.331429v81.283975c0 14.564969-11.76646 26.331429-26.331429 26.331428zM512 222.608696c-17.554286 0-31.801242-14.246957-31.801242-31.801243V31.801242c0-17.554286 14.246957-31.801242 31.801242-31.801242s31.801242 14.246957 31.801242 31.801242v159.006211c0 17.554286-14.246957 31.801242-31.801242 31.801243zM280.932174 205.881242c-9.47677 0-18.889938-4.197764-25.122981-12.275279L158.242981 67.991056a31.864845 31.864845 0 0 1 5.597019-44.648944 31.864845 31.864845 0 0 1 44.648944 5.597018l97.502609 125.551305a31.864845 31.864845 0 0 1-5.597019 44.648944c-5.787826 4.579379-12.656894 6.741863-19.46236 6.741863zM723.987081 205.881242c-6.805466 0-13.674534-2.162484-19.462361-6.678261a31.794882 31.794882 0 0 1-5.597018-44.648944l97.566211-125.551304a31.794882 31.794882 0 0 1 44.648944-5.597019 31.794882 31.794882 0 0 1 5.597019 44.648944l-97.566211 125.551305c-6.360248 8.077516-15.709814 12.27528-25.186584 12.275279z"
                            fill="#ffffff"
                            p-id="1352"
                        ></path>
                    </svg>
                    {{ trackStatus ? '关闭闪光灯' : '打开闪光灯' }}
                </view>
            </view>
            <view class="mask1 mask" :style="'height:' + maskHeight + 'px;'"></view>
            <view
                class="mask2 mask"
                :style="'width:' + maskWidth + 'px;top:' + maskHeight + 'px;height:' + canvasHeight + 'px'"
            ></view>
            <view class="mask3 mask" :style="'height:' + maskHeight + 'px;'"></view>
            <view
                class="mask4 mask"
                :style="'width:' + maskWidth + 'px;top:' + maskHeight + 'px;height:' + canvasHeight + 'px'"
            ></view>
        </template>
        <template v-else>
            <slot name="error">
                <view class="error">
                    <view class="on1">相机权限被拒绝,请尝试如下操作:</view>
                    <view>· åˆ·æ–°é¡µé¢åŽé‡è¯•ï¼›</view>
                    <view>· åœ¨ç³»ç»Ÿä¸­æ£€æµ‹å½“前App或浏览器的相机权限是否被禁用;</view>
                    <view>· å¦‚果依然不能体验,建议在微信中打开链接;</view>
                </view>
            </slot>
        </template>
    </view>
</template>
<script>
import jsQR from './jsQR.js'
export default {
    props: {
        continue: {
            type: Boolean,
            default: false // false ç›‘听一次   true æŒç»­ç›‘听
        },
        exact: {
            type: String,
            default: 'environment' // environment åŽæ‘„像头  user å‰æ‘„像头
        },
        size: {
            type: String,
            default: 'whole' // whole å…¨å±  balf åŠå±
        },
        definition: {
            type: Boolean,
            default: false // fasle æ­£å¸¸  true é«˜æ¸…
        }
    },
    data() {
        return {
            windowWidth: 0,
            windowHeight: 0,
            video: null,
            canvas2d: null,
            canvas2d2: null,
            canvasWidth: 200,
            canvasHeight: 200,
            maskWidth: 0,
            maskHeight: 0,
            inter: 0,
            track: null,
            isUseTorch: false,
            trackStatus: false,
            isParse: false,
            isUse: true
        }
    },
    mounted() {
        if (origin.indexOf('https') === -1) throw '请在 https çŽ¯å¢ƒä¸­ä½¿ç”¨æ‘„åƒå¤´ç»„ä»¶ã€‚'
        this.windowWidth = document.documentElement.clientWidth || document.body.clientWidth
        this.windowHeight = document.documentElement.clientHeight || document.body.clientHeight
        this.windowHeight = this.size === 'whole' ? this.windowHeight : this.windowHeight / 2
        this.isParse = true
        this.$nextTick(() => {
            this.createMsk()
            this.openScan()
        })
    },
    destroyed() {
        this.closeCamera()
    },
    methods: {
        openScan() {
            const width = this.transtion(this.windowHeight)
            const height = this.transtion(this.windowWidth)
            const videoParam = {
                audio: false,
                video: {
                    facingMode: { exact: this.exact },
                    width,
                    height
                }
            }
            navigator.mediaDevices
                .getUserMedia(videoParam)
                .then(stream => {
                    this.video = document.createElement('video')
                    this.video.width = this.windowWidth
                    this.video.height = this.windowHeight
                    const canvas = document.createElement('canvas')
                    canvas.id = 'canvas'
                    canvas.width = this.transtion(this.canvasWidth)
                    canvas.height = this.transtion(this.canvasHeight)
                    canvas.style = 'display:none;'
                    //canvas.style = 'position: fixed;top: 0;z-index: 999;left:0'
                    this.canvas2d = canvas.getContext('2d')
                    // è®¾ç½®å½“前宽高 æ»¡å±
                    const canvasBox = document.querySelector('.canvasBox')
                    canvasBox.append(this.video)
                    canvasBox.append(canvas)
                    canvasBox.style = `width:${this.windowWidth}px;height:${this.windowHeight}px;`
                    // åˆ›å»ºç¬¬äºŒä¸ªcanvas
                    const canvas2 = document.createElement('canvas')
                    canvas2.id = 'canvas2'
                    canvas2.width = this.canvasWidth
                    canvas2.height = this.canvasHeight
                    canvas2.style = 'position: absolute;top: 50%;left: 50%;z-index: 20;transform: translate(-50%, -50%);'
                    this.canvas2d2 = canvas2.getContext('2d')
                    canvasBox.append(canvas2)
                    this.video.srcObject = stream
                    this.video.setAttribute('playsinline', true)
                    this.video.play()
                    this.tick()
                    this.track = stream.getVideoTracks()[0]
                    setTimeout(() => {
                        this.isUseTorch = this.track.getCapabilities().torch || null
                    }, 500)
                })
                .catch(err => {
                    this.isUse = false
                    this.$emit('error', err)
                })
        },
        closeCamera() {
            this.isParse = false
            if (this.video && this.video.srcObject) {
                this.video.srcObject.getTracks().forEach(track => {
                    track.stop()
                })
            }
        },
        tick() {
            if (!this.isParse) return
            if (this.video.readyState === this.video.HAVE_ENOUGH_DATA) {
                this.canvas2d.drawImage(
                    this.video,
                    this.transtion(this.maskWidth),
                    this.transtion(this.maskHeight),
                    this.transtion(200),
                    this.transtion(200),
                    0,
                    0,
                    this.transtion(this.canvasWidth),
                    this.transtion(this.canvasHeight)
                )
                const imageData = this.canvas2d.getImageData(
                    0,
                    0,
                    this.transtion(this.canvasWidth),
                    this.transtion(this.canvasHeight)
                )
                const code = jsQR(imageData.data, imageData.width, imageData.height, {
                    inversionAttempts: 'dontInvert'
                })
                this.canvas2d2.clearRect(0, 0, this.canvasWidth, this.canvasHeight)
                if (code) {
                    this.drawLine(code.location.topLeftCorner, code.location.topRightCorner)
                    this.drawLine(code.location.topRightCorner, code.location.bottomRightCorner)
                    this.drawLine(code.location.bottomRightCorner, code.location.bottomLeftCorner)
                    this.drawLine(code.location.bottomLeftCorner, code.location.topLeftCorner)
                    if (code.data) {
                        this.getData(code.data)
                    }
                }
            }
            requestAnimationFrame(this.tick)
        },
        drawLine(begin, end, color = '#FF3B58') {
            this.canvas2d2.beginPath()
            this.canvas2d2.moveTo(this.nutranstion(begin.x), this.nutranstion(begin.y))
            this.canvas2d2.lineTo(this.nutranstion(end.x), this.nutranstion(end.y))
            this.canvas2d2.lineWidth = 4
            this.canvas2d2.strokeStyle = color
            this.canvas2d2.stroke()
        },
        getData(data) {
            this.$emit('success', data)
            if (!this.continue) {
                this.closeCamera()
            }
        },
        openTrack() {
            this.trackStatus = !this.trackStatus
            this.track.applyConstraints({
                advanced: [{ torch: this.trackStatus }]
            })
        },
        createMsk() {
            this.maskWidth = this.windowWidth / 2 - this.canvasWidth / 2
            this.maskHeight = this.windowHeight / 2 - this.canvasHeight / 2
        },
        transtion(number) {
            return this.definition ? number * 2.8 : number * 1.8
        },
        nutranstion(number) {
            return this.definition ? number / 2.8 : number / 1.8
        }
    }
}
</script>
<style scoped>
page {
    background-color: #333333;
}
.canvasBox {
    width: 100vw;
    height: 100vh;
    position: relative;
    background-image: linear-gradient(
            0deg,
            transparent 24%,
            rgba(32, 255, 77, 0.1) 25%,
            rgba(32, 255, 77, 0.1) 26%,
            transparent 27%,
            transparent 74%,
            rgba(32, 255, 77, 0.1) 75%,
            rgba(32, 255, 77, 0.1) 76%,
            transparent 77%,
            transparent
        ),
        linear-gradient(
            90deg,
            transparent 24%,
            rgba(32, 255, 77, 0.1) 25%,
            rgba(32, 255, 77, 0.1) 26%,
            transparent 27%,
            transparent 74%,
            rgba(32, 255, 77, 0.1) 75%,
            rgba(32, 255, 77, 0.1) 76%,
            transparent 77%,
            transparent
        );
    background-size: 3rem 3rem;
    background-position: -1rem -1rem;
    z-index: 10;
    background-color: #1110;
}
.box {
    width: 200px;
    height: 200px;
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    overflow: hidden;
    border: 0.1rem solid rgba(0, 255, 51, 0.2);
    z-index: 11;
}
.line {
    height: calc(100% - 2px);
    width: 100%;
    background: linear-gradient(180deg, rgba(0, 255, 51, 0) 43%, #00ff33 211%);
    border-bottom: 3px solid #00ff33;
    transform: translateY(-100%);
    animation: radar-beam 2s infinite alternate;
    animation-timing-function: cubic-bezier(0.53, 0, 0.43, 0.99);
    animation-delay: 1.4s;
}
.box:after,
.box:before,
.angle:after,
.angle:before {
    content: '';
    display: block;
    position: absolute;
    width: 3vw;
    height: 3vw;
    z-index: 12;
    border: 0.2rem solid transparent;
}
.box:after,
.box:before {
    top: 0;
    border-top-color: #00ff33;
}
.angle:after,
.angle:before {
    bottom: 0;
    border-bottom-color: #00ff33;
}
.box:before,
.angle:before {
    left: 0;
    border-left-color: #00ff33;
}
.box:after,
.angle:after {
    right: 0;
    border-right-color: #00ff33;
}
@keyframes radar-beam {
    0% {
        transform: translateY(-100%);
    }
    100% {
        transform: translateY(0);
    }
}
.msg {
    text-align: center;
    padding: 20rpx 0;
}
.box2 {
    width: 300px;
    height: 200px;
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    z-index: 20;
}
.track {
    position: absolute;
    bottom: -100px;
    left: 50%;
    transform: translateX(-50%);
    z-index: 20;
    color: #fff;
    display: flex;
    flex-direction: column;
    align-items: center;
}
.mask {
    position: absolute;
    z-index: 10;
    background-color: rgba(0, 0, 0, 0.55);
}
.mask1 {
    top: 0;
    left: 0;
    right: 0;
}
.mask2 {
    right: 0;
}
.mask3 {
    right: 0;
    left: 0;
    bottom: 0;
}
.mask4 {
    left: 0;
}
.error {
    color: #fff;
    padding: 40rpx;
    font-size: 24rpx;
    background-color: #333333;
    position: fixed;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 550rpx;
    border-radius: 20rpx;
}
.error .on1 {
    font-size: 30rpx;
}
</style>
uni_modules/mumu-getQrcode/package.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,83 @@
{
  "id": "mumu-getQrcode",
  "displayName": "H5调用摄像头识别二维码(原生H5调用,不需要任何sdk,本地扫描识别,不需要后端)",
  "version": "1.3.0",
  "description": "在浏览器中调用手机摄像头进行扫码,无须任何sdk,支持市面上绝大部分手机。在安卓系统上可以打开闪光灯",
  "keywords": [
    "h5扫码",
    "原生H5调用摄像头",
    "二维码",
    "闪光灯"
],
  "repository": "",
  "engines": {
    "HBuilderX": "^3.1.0"
  },
  "dcloudext": {
    "category": [
        "前端组件",
        "通用组件"
    ],
    "sale": {
      "regular": {
        "price": "4.55"
      },
      "sourcecode": {
        "price": "30.00"
      }
    },
    "contact": {
      "qq": "1139027508"
    },
    "declaration": {
      "ads": "无",
      "data": "无",
      "permissions": "摄像头"
    },
    "npmurl": ""
  },
  "uni_modules": {
    "dependencies": [],
    "encrypt": [],
    "platforms": {
      "cloud": {
        "tcb": "y",
        "aliyun": "y"
      },
      "client": {
        "Vue": {
          "vue2": "y",
          "vue3": "y"
        },
        "App": {
          "app-vue": "n",
          "app-nvue": "n"
        },
        "H5-mobile": {
          "Safari": "y",
          "Android Browser": "y",
          "微信浏览器(Android)": "y",
          "QQ浏览器(Android)": "y"
        },
        "H5-pc": {
          "Chrome": "n",
          "IE": "n",
          "Edge": "n",
          "Firefox": "n",
          "Safari": "n"
        },
        "小程序": {
          "微信": "n",
          "阿里": "n",
          "百度": "n",
          "字节跳动": "n",
          "QQ": "n"
        },
        "快应用": {
          "华为": "u",
          "联盟": "u"
        }
      }
    }
  }
}
uni_modules/mumu-getQrcode/readme.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,137 @@
## æ’件简绍
### å®žçŽ°åŽŸç†
> äºŒç»´ç è¯†åˆ«åŠŸèƒ½ä½¿ç”¨çš„æ˜¯jsQR这个库,调用摄像头使用的     navigator.mediaDevices.getUserMedia è¿™ä¸ªH5的api。通过canvas画布把摄像头获取到的数据展现到页面上,同时循环监听jsQR解析。
### ä½¿ç”¨çŽ¯å¢ƒ
经测试发现大部分浏览器都可以正常使用(微信,QQ,谷歌,火狐,safari),少数的安卓自带浏览器无法使用(浏览器内核版本过低)。需要https环境才能使用,本地测试可以在 manifest.json  ä¸­ç‚¹å‡»æºç å±•示,找到h5 ï¼Œæ·»åŠ ï¼š"devServer" : { "https" : true}
需要https环境才能使用!!!
需要https环境才能使用!!!
需要https环境才能使用!!!
**小知识点:苹果设备上不论什么浏览器都是safari套壳的,不论是谷歌还是火狐都是safari套壳。这也就是代表在苹果上无需担心无法使用此插件。(造成这样的现象是因为苹果有一则协议,浏览器只能使用safari内核)**
在安卓系统上可以打开闪光灯
#### é€šè¿‡è„šæ‰‹æž¶åˆ›å»ºçš„ uni é¡¹ç›®ï¼Œéœ€è¦çœ‹è¿™é‡Œ
如果你是通过脚手架创建的 uni çš„项目,需要自行安装 `jsQR` ä¾èµ–,并且修改组件中源码中的引入。通过 HBuilder åˆ›å»ºçš„项目不需要此操作。
```bash
# å®‰è£… jsQR
npm install jsqr --save
# ä¿®æ”¹ç»„件源码对 jsQR ä¾èµ–
import jsQR from "jsqr"
```
### æ’件使用
**插件已支持 uni_modules æ”¯æŒç»„ä»¶easycom,以下代码演示的是普通使用**
``` html
<!-- HTML -->
    <mumu-get-qrcode @success='qrcodeSucess' @error="qrcodeError" ></mumu-get-qrcode>
```
``` javascript
// js
import mumuGetQrcode from '@/uni_modules/mumu-getQrcode/components/mumu-getQrcode/mumu-getQrcode.vue'
// å«Œè·¯å¾„长的话可以单独复制出来
export default {
        components: {
            mumuGetQrcode
        },
        methods: {
            qrcodeSucess(data) {
                uni.showModal({
                    title: '成功',
                    content: data,
                    success: () => {
                        uni.navigateBack({})
                    }
                })
            },
      qrcodeError(err) {
        console.log(err)
        uni.showModal({
          title: '摄像头授权失败',
          content: '摄像头授权失败,请检测当前浏览器是否有摄像头权限。',
          success: () => {
            uni.navigateBack({})
          }
        })
      }
        }
    }
```
### ç›¸å…³API
##### å¯ä¼ å±žæ€§ï¼ˆProps)
| å‚æ•°       | è¯´æ˜Ž                                              | ç±»åž‹    | é»˜è®¤å€¼      |
| ---------- | ------------------------------------------------- | ------- | ----------- |
| continue   | æ˜¯å¦è¿žç»­èŽ·å–ã€‚false ç›‘听一次   true æŒç»­ç›‘听      | Boolean | false       |
| exact      | é€‰è°ƒç”¨æ‘„像头。environment åŽæ‘„像头  user å‰æ‘„像头 | String  | environment |
| size       | æ‰«ç å±å¹•大小。whole å…¨å±  balf åŠå±               | String  | whole       |
| definition | è°ƒç”¨æ‘„像头清晰度。fasle æ­£å¸¸  true é«˜æ¸…           | Boolean | false       |
##### äº‹ä»¶ï¼ˆEvents)
| äº‹ä»¶å  | è¯´æ˜Ž                                       | å›žè°ƒå‚æ•°           |
| ------- | ------------------------------------------ | ------------------ |
| success | æ£€æµ‹åˆ°å›¾ä¸­æœ‰äºŒç»´ç å¹¶è¯»å–到数据是回调       | äºŒç»´ç æ•°æ®         |
| error   | ç»„件内部发送错误,通常是摄像头没有调用成功 | é”™è¯¯ä¿¡æ¯ï¼Œè¯¦æƒ…见下 |
**常见的错误信息:**
- `AbortError`[中止错误]
  å°½ç®¡ç”¨æˆ·å’Œæ“ä½œç³»ç»Ÿéƒ½æŽˆäºˆäº†è®¿é—®è®¾å¤‡ç¡¬ä»¶çš„æƒåˆ©ï¼Œè€Œä¸”未出现可能抛出`NotReadableError`异常的硬件问题,但仍然有一些问题的出现导致了设备无法被使用。
- `NotAllowedError`[拒绝错误]
  ç”¨æˆ·æ‹’绝了当前的浏览器实例的访问请求;或者用户拒绝了当前会话的访问;或者用户在全局范围内拒绝了所有媒体访问请求。
- `NotFoundError`[找不到错误]
  æ‰¾ä¸åˆ°æ»¡è¶³è¯·æ±‚参数的媒体类型。
- `NotReadableError`[无法读取错误]
  å°½ç®¡ç”¨æˆ·å·²ç»æŽˆæƒä½¿ç”¨ç›¸åº”的设备,操作系统上某个硬件、浏览器或者网页层面发生的错误导致设备无法被访问。
- `OverconstrainedError`[无法满足要求错误]
  æŒ‡å®šçš„要求无法被设备满足,此异常是一个类型为`OverconstrainedError`的对象,拥有一个`constraint`属性,这个属性包含了当前无法被满足的`constraint`对象,还拥有一个`message`属性,包含了阅读友好的字符串用来说明情况。
- `SecurityError`[安全错误]
  åœ¨`getUserMedia()` è¢«è°ƒç”¨çš„ [`Document`](https://developer.mozilla.org/zh-CN/docs/Web/API/Document) ä¸Šé¢ï¼Œä½¿ç”¨è®¾å¤‡åª’体被禁止。这个机制是否开启或者关闭取决于单个用户的偏好设置。
- `TypeError`[类型错误]
  constraints å¯¹è±¡æœªè®¾ç½®ï¼»ç©ºï¼½ï¼Œæˆ–者都被设置为`false`。
##### æ’æ§½ ï¼ˆslot)
| æ’槽名称 | è¯´æ˜Ž                             | é»˜è®¤å€¼             |
| -------- | -------------------------------- | ------------------ |
| error    | å½“发送错误时,在页面上显示的内容 | ç›¸æœºæƒé™è¢«æ‹’绝提示 |
### æ¡ˆä¾‹æ¼”示
![enter description here](https://h5plugin.mumudev.top/public/getQrcode/qrcode.png)
## æ”¯æŒä½œè€…
![支持作者](https://student.mumudev.top/wxMP.jpg)