wy пре 1 година
родитељ
комит
f1883fb753

+ 351 - 0
src/views/component/facility/facilityData.vue

@@ -0,0 +1,351 @@
+<!--
+    author:luoaoxuan
+    subject:设施环境通用组件
+-->
+<template>
+    <div class="ficily-data">
+        <el-row type="flex">
+            <el-col style="margin:0 0 5px 0">
+                <div class="button">
+                    <el-button v-if="!isCul" type="danger" size="mini" icon="ibps-icon-close" @click="goRemove">删除</el-button>
+                    <el-button v-if="!isCul" type="success" size="mini" icon="ibps-icon-plus" @click="goAdd">添加</el-button>
+                </div>
+            </el-col>
+        </el-row>
+        <el-row type="flex">
+            <el-col>
+                <el-table :data="forms" border @selection-change="handleSelectionChange">
+                    <el-table-column
+                        width="50"
+                        type="selection"
+                    />
+                    <el-table-column label="参数名称" prop="label">
+                        <template slot-scope="{row}">
+                            <el-input v-if="!readonly && !isCul" v-model="row.label" size="mini" placeholder="请输入" />
+                            <span v-else>{{ row.label|| '/' }}</span>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="参数单位" prop="unit" width="120">
+                        <template slot-scope="{row}">
+                            <el-autocomplete
+                                v-if="!readonly && !isCul"
+                                v-model="row.unit"
+                                class="inline-input"
+                                :fetch-suggestions="querySearch"
+                                placeholder="请输入"
+                                size="mini"
+                            />
+                            <span v-else>{{ row.unit || '/' }}</span>
+                        </template>
+                    </el-table-column>
+
+                    <el-table-column label="参数范围限值" prop="range" width="300">
+                        <template slot-scope="{row}">
+                            <NumberRange v-model="row.range" :precision="2" :disabled="readonly || isCul" /></template>
+                    </el-table-column>
+
+                    <el-table-column label="参数修正值" prop="fixValue" width="120">
+                        <template slot-scope="{row}">
+                            <el-input v-if="!readonly && !isCul" v-model="row.fixValue" size="mini" placeholder="请输入" type="number" />
+                            <span v-else>{{ row.fixValue|| '/' }}</span>
+                        </template>
+                    </el-table-column>
+
+                    <el-table-column label="填写频率" prop="rate">
+                        <template slot="header" slot-scope="">
+                            <el-tooltip class="item" effect="dark" content="配置参数填写周期,适用于参数填写频率与监测周期不一致的情况。若为空则表示该参数每次推送都需填写。" placement="top-start">
+                                <span>
+                                    填写频率
+                                    <i class="el-icon-question" />
+                                </span>
+                            </el-tooltip>
+                        </template>
+                        <template slot-scope="{row,$index}">
+                            <span>{{ row.rate || '/' }}</span>
+                            <el-button v-if="!readonly && !isCul" size="mini" icon="ibps-icon-edit" type="text" style="margin-left:10px" @click="openDialog(row,$index)">编辑</el-button>
+                        </template>
+                    </el-table-column>
+
+                    <el-table-column v-if="isCul" label="参数值" prop="value">
+                        <template slot-scope="{row}">
+                            <el-input v-if="!readonly" v-model="row.value" size="mini" placeholder="请输入" type="number" :readonly="readonly" />
+                            <span v-else>{{ row.value || '/' }}</span>
+                        </template>
+                    </el-table-column>
+
+                    <el-table-column v-if="isCul" label="最终值" prop="result">
+                        <template slot-scope="{row}">
+                            <span>{{ row.result || '/' }}</span>
+                        </template>
+                    </el-table-column>
+
+                    <el-table-column v-if="isCul" label="状态" prop="status">
+                        <template slot-scope="{row}">
+                            <span>{{ row.status || '/' }}</span>
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </el-col>
+        </el-row>
+        <FacilityDataDialog v-if="dialogShow" :dialog-visible.sync="dialogShow" :params="dialogParams" @submit="dialogSubmit" />
+    </div>
+</template>
+<script>
+import NumberRange from '@/views/component/xcomponent/numberRange.vue'
+import FacilityDataDialog from './facilityDataDialog.vue'
+export default {
+    components: {
+        NumberRange, FacilityDataDialog
+    },
+    props: {
+        formData: {
+            type: Object,
+            default: () => {}
+        },
+        readonly: {
+            type: Boolean,
+            default: false
+        },
+        isCul: {
+            type: Boolean,
+            default: true
+        }
+    },
+    data () {
+        return {
+            dialogParams: {},
+            dialogShow: false,
+            isFirst: true,
+            forms: [],
+            multipleSelection: []
+        }
+    },
+    computed: {
+    },
+    watch: {
+        formData: {
+            handler (val) {
+                // console.log('formData', val)
+                if (val.lieBiaoShuJu) {
+                    if (!this.isCul) {
+                        this.forms = this.initData(val.lieBiaoShuJu)
+                    } else {
+                        if (this.isFirst) {
+                            this.forms = this.initData(val.lieBiaoShuJu)
+                            this.isFirst = false
+                        }
+                    }
+                }
+                this.culXiuZheng()
+            },
+            deep: true,
+            immediate: true
+        },
+        forms: {
+            handler (val) {
+                // console.log('forms', val)
+                this.culXiuZheng()
+                this.$emit('change-data', 'lieBiaoShuJu', JSON.stringify(val))
+            },
+            deep: true
+        }
+    },
+    mounted () {
+        // console.log('mounted', this.formData)
+    },
+    methods: {
+        // 弹窗的提交事件
+        dialogSubmit (data, index) {
+            this.$set(this.forms, index, data)
+            // console.log('form', this.forms)
+        },
+        openDialog (row, $index) {
+            this.dialogParams = {
+                ...row,
+                $index
+            }
+            this.dialogShow = true
+        },
+        // 计算时间差
+        getDayDifference (date1, date2) {
+            // 将两个日期转换为Date对象
+            const d1 = new Date(date1)
+            const d2 = new Date(date2)
+            // 计算两个日期之间的毫秒差
+            const timeDiff = d2.getTime() - d1.getTime()
+            // 将毫秒差转换为天数并返回
+            const dayDiff = Math.ceil(timeDiff / (1000 * 3600 * 24))
+            // console.log(dayDiff)
+            return dayDiff
+        },
+        // 初始化数据
+        initData (data) {
+            const ans = JSON.parse(data)
+            const result = []
+            if (this.isFirst) {
+                console.log(ans)
+                console.log('formData', this.formData)
+            }
+            ans.forEach(item => {
+                if (!Object.hasOwn(item, 'label')) {
+                    item.label = ''
+                }
+                if (!Object.hasOwn(item, 'unit')) {
+                    item.unit = '℃'
+                }
+                if (!Object.hasOwn(item, 'range')) {
+                    item.range = [null, null]
+                }
+                if (!Object.hasOwn(item, 'fixValue')) {
+                    item.fixValue = ''
+                }
+                if (!Object.hasOwn(item, 'value')) {
+                    item.value = ''
+                }
+                if (!Object.hasOwn(item, 'result')) {
+                    item.result = ''
+                }
+                if (!Object.hasOwn(item, 'rate')) {
+                    item.rate = ''
+                }
+                if (!Object.hasOwn(item, 'status')) {
+                    item.status = ''
+                }
+                if (!Object.hasOwn(item, 'period')) {
+                    item.period = ''
+                }
+                if (!Object.hasOwn(item, 'date')) {
+                    item.date = ''
+                }
+                if (!Object.hasOwn(item, 'startTime')) {
+                    item.startTime = ''
+                }
+
+                // this.formData.jianCeShiJian = '2024-10-20' // 测试用
+                if (!item.result && (item.rate && (this.formData.jianCeShiJian || this.readonly))) {
+                    let jianCeShiJian = ''
+                    if (this.readonly) {
+                        jianCeShiJian = this.formData.bianZhiShiJian?.slice(0, 10)
+                    } else {
+                        jianCeShiJian = this.formData.jianCeShiJian?.slice(0, 10)
+                    }
+                    const thatDate = new Date(jianCeShiJian)
+                    let day = thatDate.getDay() // 周几
+                    if (day === 0) { // 周日得到结果为0 需要特判
+                        day = 7
+                    }
+                    const dayofMonth = thatDate.getDate() // 多少号
+                    let dayDiff = ''
+                    console.log(`监测时间:${jianCeShiJian},周${day}`)
+                    switch (item.period) {
+                        case 'day':
+                            if (item.date.indexOf(day) > -1) {
+                                result.push(item)
+                            }
+                            break
+                        case 'week':
+                            if (item.date === day) {
+                                result.push(item)
+                            }
+                            break
+                        case 'month':
+                            if (item.date === dayofMonth) {
+                                result.push(item)
+                            }
+                            break
+                        case 'repeat':
+                            dayDiff = this.getDayDifference(item.startTime, jianCeShiJian)
+                            if (dayDiff >= 0 && dayDiff % (item.date + 1) === 0) {
+                                result.push(item)
+                            }
+                            break
+                        default:
+                            break
+                    }
+                } else {
+                    result.push(item)
+                }
+            })
+            return result
+        },
+        // 默认单位
+        querySearch (queryString, cb) {
+            const units = [{ value: '℃' }, { value: '%' }, { value: 'Pa' }, { value: 'MΩ·CM' }, { value: 'uS/cm' }, { value: 'cfu/ml' }]
+            // 调用 callback 返回建议列表的数据
+            cb(units)
+        },
+        // 计算状态
+        getStatus (range, result) {
+            let [min, max] = range
+            if (min === null || min === '' || typeof min === 'undefined') min = Number.NEGATIVE_INFINITY
+            if (max === null || max === '' || typeof max === 'undefined') max = Number.POSITIVE_INFINITY
+            if (+min === 0 && +max === 0) {
+                return '正常'
+            }
+            if (+result <= +max && +result >= +min) {
+                return '正常'
+            }
+            return '失控'
+        },
+        // 计算修正值
+        culXiuZheng () {
+            if (!this.isCul) return
+            if (this.readonly) return
+            this.forms.forEach(item => {
+                if (item.value) {
+                    if (item.fixValue) {
+                        item.result = (+item.fixValue + +item.value).toFixed(2)
+                    } else {
+                        item.result = (+item.value).toFixed(2)
+                    }
+                    item.status = this.getStatus(item.range, item.result)
+                } else {
+                    item.result = ''
+                    item.status = ''
+                }
+            })
+        },
+        formatData (val) {
+            return JSON.stringify(val)
+        },
+        goAdd () {
+            if (this.forms.length >= 10) {
+                return this.$message({
+                    message: '超过最大限制!',
+                    type: 'warning'
+                })
+            }
+            this.forms.push({
+                label: '',
+                range: [],
+                fixValue: '',
+                value: '',
+                result: '',
+                status: '',
+                unit: '',
+                period: '',
+                date: ''
+            })
+        },
+        goRemove () {
+            this.forms = this.forms.filter(item => !this.multipleSelection.includes(item))
+        },
+        handleSelectionChange (val) {
+            this.multipleSelection = val
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.ficily-data{
+    margin-bottom: 20px;
+    .button{
+        display: flex;
+        flex-direction: row-reverse;
+        .el-button{
+            margin-left: 5px;
+        }
+    }
+
+}
+</style>

+ 208 - 0
src/views/component/facility/facilityDataDialog.vue

@@ -0,0 +1,208 @@
+<template>
+    <el-dialog
+        :title="title"
+        :visible.sync="dialogVisible"
+        width="60%"
+        append-to-body
+        class="dialog"
+        :close-on-click-modal="false"
+        :close-on-press-escape="false"
+        :show-close="false"
+    >
+        <div class="contain">
+            <div class="form">
+                <el-form ref="formRef" :model="form" label-width="120" :rules="rules">
+                    <el-row class="item">
+                        <el-col>
+                            <el-form-item label="监测周期:" prop="period">
+                                <el-select v-model="form.period" placeholder="请选择" size="mini" :clearable="true" style="width:100%" @change="periodChange()">
+                                    <el-option
+                                        v-for="item in periodList"
+                                        :key="item.value"
+                                        :label="item.label"
+                                        :value="item.value"
+                                    />
+                                </el-select>
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                    <el-row v-if="form.period" class="item">
+                        <el-col>
+                            <el-form-item label="监测频率:" prop="date">
+                                <el-select
+                                    v-if="form.period==='day' || form.period==='week'"
+                                    v-model="form.date"
+                                    :multiple="form.period==='day'"
+                                    placeholder="请选择"
+                                    size="mini"
+                                    style="width:100%"
+                                >
+                                    <el-option
+                                        v-for="item in weekDays"
+                                        :key="item.value"
+                                        :label="item.label"
+                                        :value="item.value"
+                                    />
+                                </el-select>
+                                <el-select v-if="form.period==='month'" v-model="form.date" placeholder="请选择" size="mini" style="width:100%">
+                                    <el-option
+                                        v-for="item in 28"
+                                        :key="item"
+                                        :label="`第${item}天`"
+                                        :value="item"
+                                    />
+                                </el-select>
+                                <div v-if="form.period==='repeat'" style="display:flex;align-items: center;width:100%">
+                                    <el-select v-model="form.date" placeholder="请选择" size="mini" style="width:100%">
+                                        <el-option
+                                            v-for="item in 30"
+                                            :key="item"
+                                            :label="`每隔${item}天`"
+                                            :value="item"
+                                        />
+                                    </el-select>
+                                </div>
+
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                    <el-row v-if="form.period==='repeat'" class="item">
+                        <el-col>
+                            <el-form-item label="开始时间:" prop="startTime">
+                                <el-date-picker
+                                    v-model="form.startTime"
+                                    :clearable="false"
+                                    type="date"
+                                    placeholder="选择监测开始时间"
+                                    :picker-options="pickerOptions"
+                                    value-format="yyyy-MM-dd"
+                                    size="mini"
+                                    style="width:100%"
+                                />
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                </el-form>
+
+            </div>
+        </div>
+        <span slot="footer" class="dialog-footer">
+            <el-button type="primary" size="mini" icon="ibps-icon-save" @click="handleConfirm">确 定</el-button>
+            <el-button size="mini" icon="ibps-icon-close" @click="handleClose">取 消</el-button>
+        </span>
+    </el-dialog>
+</template>
+
+<script>
+import dayjs from 'dayjs'
+
+export default {
+    props: {
+        params: {
+            type: Object,
+            default: () => {}
+        },
+        dialogVisible: {
+            type: Boolean,
+            default: false
+        }
+    },
+    data () {
+        return {
+            title: '',
+            rules: {
+                period: [
+                    { required: true, message: '请选择监测周期', trigger: 'blur' }
+                ],
+                date: [
+                    { required: true, message: '请选择查询的日期', trigger: 'blur' }
+                ],
+                startTime: [
+                    { required: true, message: '请选择开始时间', trigger: 'blur' }
+                ]
+            },
+            pickerOptions: {
+                disabledDate (time) {
+                    return time.getTime() < (Date.now() - (24 * 60 * 1000 * 60))
+                }
+            },
+            form: {
+                period: '',
+                date: '',
+                startTime: dayjs().format('YYYY-MM-DD')
+            },
+            periodList: [{ label: '日监测', value: 'day' }, { label: '周监测', value: 'week' }, { label: '月监测', value: 'month' }, { label: '按时间间隔监测', value: 'repeat' }],
+            weekDays: [{ label: '周一', value: 1 }, { label: '周二', value: 2 }, { label: '周三', value: 3 }, { label: '周四', value: 4 }, { label: '周五', value: 5 }, { label: '周六', value: 6 }, { label: '周日', value: 7 }]
+        }
+    },
+    mounted () {
+        this.form = this.params
+        if (!this.params.rate) {
+            this.title = '新增'
+        } else {
+            this.form = this.params
+            this.title = '修改'
+        }
+        // this.form = this.params
+    },
+    methods: {
+        handleClose () {
+            this.$emit('update:dialogVisible', false)
+        },
+        async handleConfirm () {
+            try {
+                await this.$refs.formRef.validate()
+                let rate = '每天'
+                switch (this.form.period) {
+                    case 'day':
+                        if (this.form.date.length !== 7) {
+                            this.form.date.sort((a, b) => a - b)
+                            rate = '每周' + this.form.date.join(',')
+                        }
+                        break
+                    case 'week':
+                        rate = '每周' + this.form.date
+                        break
+                    case 'month':
+                        rate = '每个月第' + this.form.date + '天'
+                        break
+                    case 'repeat':
+                        rate = this.form.startTime + '起每隔' + this.form.date + '天'
+                        break
+                    default:
+                        break
+                }
+                this.form.rate = rate
+                this.$emit('submit', this.form, this.params.$index)
+                this.handleClose()
+            } catch (error) {
+                console.log(error)
+            }
+        },
+        periodChange () {
+            if (this.form.period === 'day') {
+                this.form.date = []
+            } else {
+                this.form.date = ''
+            }
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.contain{
+    padding: 20px;
+    .form{
+        .item{
+            width: 600px;
+        }
+    }
+}
+
+::v-deep{
+    .el-form-item__content{
+        display: flex;
+    }
+}
+</style>

+ 596 - 0
src/views/component/facility/ultStatic.vue

@@ -0,0 +1,596 @@
+<template>
+    <el-dialog
+        v-loading="loading"
+        :title="title"
+        :visible.sync="dialogVisible"
+        :close-on-click-modal="false"
+        :close-on-press-escape="false"
+        :show-close="false"
+        append-to-body
+        fullscreen
+        class="dialog paper-detail-dialog"
+        top="0"
+    >
+        <div slot="title" class="dialog-title">
+            <span class="dialogtitle">{{ title }}</span>
+            <div>
+                <ibps-toolbar :actions="toolbars" @action-event="handleActionEvent" />
+            </div>
+        </div>
+        <div class="container">
+            <div class="left" :style="{width:initWidth}">
+                <div class="search">
+                    <div class="item">
+                        <div class="label">维护月份:</div>
+                        <div class="content">
+                            <el-date-picker
+                                v-model="month"
+                                :clearable="false"
+                                type="month"
+                                placeholder="选择查询的月份"
+                                value-format="yyyy-MM"
+                                :picker-options="pickerOptions"
+                                size="mini"
+                                @change="handleMonthChange"
+                            />
+                        </div>
+                    </div>
+                    <div class="item">
+                        <div class="label">部门:</div>
+                        <ibps-user-selector
+                            v-model="position"
+                            type="position"
+                            readonly-text="text"
+                            :disabled="false"
+                            :multiple="false"
+                            :filter="filter"
+                            filtrate
+                        />
+                    </div>
+                    <div class="item">
+                        <div class="label">灯管号:</div>
+                        <div class="content">
+                            <el-input v-model="deviceNo" size="mini" />
+                        </div>
+                    </div>
+                    <div class="item">
+                        <div class="label">紫外灯名:</div>
+                        <div class="content">
+                            <el-input v-model="deviceName" size="mini" />
+                        </div>
+                    </div>
+                    <div class="item">
+                        <div class="label">岗位:</div>
+                        <div class="content">
+                            <el-input v-model="gangWei" size="mini" />
+                        </div>
+                    </div>
+                </div>
+                <div class="hearder">
+                    <div class="agend">
+                        <div class="item">
+                            <div class="green-circle" />
+                            <span>已完成</span>
+                        </div>
+                        <!-- <div class="item">
+                            <div class="orange-circle" />
+                            <span>部分完成</span>
+                        </div> -->
+                        <div class="item">
+                            <div class="red-circle" />
+                            <span>待处理</span>
+                        </div>
+                        <!-- <div class="item">
+                            <div class="red-bg" />
+                            <span>设备状况异常</span>
+                        </div> -->
+                        <div class="item-time">
+                            <span>统计时间:{{ curTime }}</span>
+                        </div>
+                    </div>
+                </div>
+
+                <div v-if="fliterData.length>0" class="table">
+                    <div class="column">
+                        <div class="item">紫外灯/日期</div>
+                        <div v-for="(item,index) in fliterData" :key="index" class="item" style="cursor:pointer" @click="goLookStatic(item)">
+                            <span style="padding:0 6px">{{ item.deng_guan_hao_ }}/{{ item.zi_wai_deng_ming_ }}</span>
+                        </div>
+                    </div>
+                    <div class="column">
+                        <div v-for="(item,index) in formatData" :key="index" class="content-item">
+                            <div class="item">{{ index+1 }}</div>
+                            <div v-for="(i,ind) in item" :key="ind" class="item">
+                                <el-tooltip v-show="i.count>0" class="item" effect="light" placement="top-start">
+                                    <template slot="content">
+                                        <div>
+                                            <div v-for="(ii,indd) in i.data" :key="indd" class="detail">
+                                                <el-divider />
+                                                <div class="detail-item">
+                                                    <div class="item" style="margin:2px 0">处理人:{{ switchIdToUserName(ii.qian_ming_)|| '/' }}</div>
+                                                    <div class="item" style="margin:2px 0">岗位:{{ ii.gang_wei_|| '/' }}</div>
+                                                    <div class="item" style="margin:2px 0">额定时长:{{ ii.e_ding_shi_chang_|| '/' }}</div>
+                                                    <div class="item" style="margin:2px 0">已使用总时长:{{ ii.zsc2|| '/' }}</div>
+                                                    <div class="item" style="margin:2px 0">当次使用时长:{{ ii.shi_yong_shi_chan|| '/' }}</div>
+                                                    <div class="item" style="margin:2px 0">使用时间:{{ ii.sysj1|| '/' }}</div>
+                                                    <div class="item" style="margin:2px 0">擦拭情况:{{ ii.wan_cheng_qing_ku|| '/' }}</div>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </template>
+                                    <div class="green-circle" />
+                                    <!-- <div v-else class="orange-circle" /> -->
+                                </el-tooltip>
+                                <div v-if=" i.count===0 && i.show" class="red-circle" />
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <el-empty v-else description="暂无数据" />
+            </div>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+import dayjs from 'dayjs'
+import ibpsUserSelector from '@/business/platform/org/selector'
+export default {
+    components: {
+        ibpsUserSelector
+    },
+    props: {
+        params: {
+            type: Object,
+            default: function () {
+                return {}
+            }
+        },
+        dialogVisible: {
+            type: Boolean,
+            default: false
+        }
+    },
+    data () {
+        const monthList = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
+        const monthValue = dayjs().format('YYYY-MM')
+        const year = +monthValue.split('-')[0]
+        const month = +monthValue.split('-')[1]
+        const monthDays = monthList[month - 1]
+        if ((year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0)) {
+            monthList[1] = 29
+        }
+        const { userId, position, level, mainPosition } = this.$store.getters
+        return {
+            dialogParams: {},
+            MaintenanceStaticVisible: false,
+            pickerOptions: {
+                disabledDate (time) {
+                    return time.getTime() > Date.now()
+                }
+            },
+            curTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
+            deviceNo: '',
+            deviceName: '',
+            gangWei: '',
+            monthList: monthList,
+            month: monthValue,
+            monthDays: monthDays,
+            userId: userId,
+            position: (mainPosition && mainPosition.id) || position,
+            level: level.second || level.first,
+            loading: false,
+            title: '设备维护统计',
+            toolbars: [
+                { key: 'export', label: '导出', type: 'primary', hidden: true },
+                { key: 'cancel', label: '退出', type: 'danger' }
+            ],
+            initWidth: '1800px',
+            isEdit: false,
+            isFinished: false,
+            readonly: false,
+            preParams: {},
+            Ids: [],
+            form: {
+            },
+            rules: {
+
+            },
+            dataList: [],
+            type: [],
+            filter: [{
+                descVal: '1',
+                includeSub: true,
+                old: 'position',
+                partyId: this.$store.getters.userInfo.employee.positions,
+                partyName: '',
+                scriptContent: '',
+                type: 'user',
+                userType: 'position'
+            }],
+            totalList: []
+        }
+    },
+    computed: {
+        fliterData () {
+            const fliterData = this.dataList
+            let result = []
+            fliterData.forEach(item => {
+                const { she_shi_id_, zi_wai_deng_ming_, deng_guan_hao_, bu_men_, gang_wei_ } = item
+                const t = result.find(i => i.she_shi_id_ === she_shi_id_)
+                if (t) {
+                    t.children.push(item)
+                } else {
+                    result.push({
+                        she_shi_id_: she_shi_id_ || '',
+                        zi_wai_deng_ming_: zi_wai_deng_ming_ || '',
+                        deng_guan_hao_: deng_guan_hao_ || '',
+                        bu_men_: bu_men_ || '',
+                        gang_wei_: gang_wei_ || '',
+                        children: [item]
+                    })
+                }
+            })
+            // console.log('fliterData', result)
+            this.totalList.forEach(item => {
+                const { she_shi_id_, zi_wai_deng_ming_, deng_guan_hao_, bian_zhi_bu_men_, gang_wei_ } = item
+                const t = result.find(i => i.she_shi_id_ === item.she_shi_id_)
+                if (!t) {
+                    result.push({
+                        she_shi_id_: she_shi_id_ || '',
+                        zi_wai_deng_ming_: zi_wai_deng_ming_ || '',
+                        deng_guan_hao_: deng_guan_hao_ || '',
+                        bu_men_: bian_zhi_bu_men_ || '',
+                        gang_wei_: gang_wei_ || '',
+                        children: []
+                    })
+                }
+            })
+            if (this.position) {
+                result = result.filter(item => item.bu_men_ === this.position)
+            }
+            if (this.deviceNo) {
+                result = result.filter(item => item.deng_guan_hao_.indexOf(this.deviceNo) > -1)
+            }
+            if (this.deviceName) {
+                result = result.filter(item => item.zi_wai_deng_ming_.indexOf(this.deviceName) > -1)
+            }
+            if (this.gangWei) {
+                result = result.filter(item => item.gang_wei_.indexOf(this.gangWei) > -1)
+            }
+            return result
+        },
+        formatData () {
+            const answer = new Array(this.monthDays)
+            for (let i = 0; i < this.monthDays; i++) {
+                const arr = []
+                const day = ('0' + (i + 1)).slice(-2)
+                const fullDay = this.month + '-' + day
+                // console.log(fullDay)
+                this.fliterData.forEach(item => {
+                    const obj = {
+                        data: [],
+                        count: 0,
+                        show: true,
+                        fullDay
+                    }
+                    const tempList = item.children.filter(k => k.ri_qi_.slice(0, 10) === fullDay)
+                    obj.count = tempList.length
+                    obj.data = tempList
+                    if (new Date(fullDay).getTime() > new Date(this.curTime).getTime()) {
+                        obj.show = false
+                    }
+                    arr.push(obj)
+                })
+                answer[i] = arr
+            }
+            // console.log('answer', answer)
+            return answer
+        }
+    },
+    async mounted () {
+        this.init()
+        const sql = `select she_shi_id_,zi_wai_deng_ming_,deng_guan_hao_,bian_zhi_bu_men_,gang_wei_ from t_jykzwdxdjlbsc where di_dian_='${this.level}' and shi_fou_ting_yong='1'`
+        const { variables: { data }} = await this.$common.request('sql', sql)
+        this.totalList = data
+    },
+    methods: {
+        handleActionEvent ({ key }) {
+            switch (key) {
+                case 'cancel':
+                    this.closeDialog()
+                    break
+                case 'export':
+                    this.handleExport()
+                    break
+                default:
+                    break
+            }
+        },
+        // 查看设备统计
+        goLookStatic (row) {
+            // this.dialogParams = row
+            // this.dialogParams.searchMonth = this.month
+            // this.MaintenanceStaticVisible = true
+        },
+        // 人员id 转人员名称
+        switchIdToUserName (id) {
+            const { userList } = this.$store.getters
+            const temp = userList.find(item => item.userId === id)
+            return temp ? temp.userName : ''
+        },
+        async handleMonthChange (val) {
+            const year = +val.split('-')[0]
+            const month = +val.split('-')[1]
+            this.monthDays = this.monthList[month - 1]
+            if ((year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0)) {
+                this.monthList[1] = 29
+            } else {
+                this.monthList[1] = 28
+            }
+            await this.init()
+        },
+        // 获取人员部门
+        getPersonPosition (id) {
+            const userList = this.$store.getters.userList
+            const bianzhiUserid = userList.find(i => i.userId === id)
+            if (bianzhiUserid) {
+                return bianzhiUserid.positionId
+            }
+        },
+        checkRequired (flag) {
+        },
+        // 刷新
+        async goRefresh () {
+        },
+        // 关闭当前窗口
+        closeDialog (needRefresh) {
+            this.$emit('update:dialogVisible', false, needRefresh)
+        },
+        async init () {
+            this.loading = true
+            this.title = `紫外灯消毒月度统计`
+            const y = +this.month.split('-')[0]
+            const m = +this.month.split('-')[1]
+            const sql = `select a.id_,a.parent_id_,a.she_bei_hao_,a.ri_qi_,a.bu_men_,a.wan_cheng_qing_ku,a.pi_ci_,a.shi_yong_shi_chan,a.zong_shi_chang_ as zsc1,a.qian_ming_,a.fang_jian_di_zhi_,a.e_ding_shi_chang_,a.zi_wai_deng_id_,a.gang_wei_,a.pan_ding_ri_qi_ as pdrq1,b.zi_wai_deng_ming_,b.zong_shi_chang_ as zsc2,b.deng_guan_hao_,b.ri_chang_zhao_she,b.shang_ci_xiao_du_,b.she_shi_id_,b.fang_jian_,b.shi_fou_gen_huan_,b.shi_fou_ting_yong,b.pan_ding_ri_qi_ as pdrq2 FROM t_jykzwdxdjlbzb a LEFT JOIN t_jykzwdxdjlbsc b ON a.zi_wai_deng_id_=b.id_ where b.di_dian_='${this.level}' and b.shi_fou_ting_yong='1' and YEAR(a.ri_qi_) = ${y} and MONTH(a.ri_qi_) = ${m}`
+            const { variables: { data }} = await this.$common.request('sql', sql)
+            // console.log('data', data)
+            this.dataList = data
+            // this.dataList.forEach(item => {
+            //     if (!Object.hasOwn(item, 'wei_hu_lei_xing_') || !item.wei_hu_lei_xing_) {
+            //         item.wei_hu_lei_xing_ = '按需保养'
+            //     }
+            // })
+            this.loading = false
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.paper-detail-dialog {
+    ::v-deep {
+        .el-dialog__header {
+            text-align: center;
+        }
+    }
+.dialog-title{
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    div{
+        z-index: 99999999;
+        position: absolute;
+        right:8vw;
+    }
+    .dialogtitle{
+        font-size: 22px;
+        font-family: SimHei;
+        font-weight: bold;
+        color: #222;
+    }
+}
+.container {
+        display: flex;
+        width: 100%;
+        justify-content: center;
+        .el-row{
+            margin: 0 !important;
+        }
+        .required{
+            color: #606266 !important;
+            &::before{
+                content: '*';
+                margin: 0 4px 0 -7.5px;
+                color: red;
+            }
+        }
+        .left{
+            height: calc(100vh - 100px);
+            box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+            padding:20px;
+            overflow-y: auto;
+            .agend{
+                margin: 20px 0 10px 0;
+                display: flex;
+                .item-time{
+                    margin-left: 40px;
+                    width: 200px;
+                }
+                .item{
+                    width: 100px;
+                    display: flex;
+                    align-items: center;
+                    gap: 4px;
+                    .green-circle {
+                        width: 12px;
+                        height: 12px;
+                        background-color: #67C23A;
+                        border-radius: 50%;
+                    }
+                    .red-circle {
+                        width: 12px;
+                        height: 12px;
+                        background-color: #F56C6C;
+                        border-radius: 50%;
+                    }
+                    .orange-circle {
+                        width: 12px;
+                        height: 12px;
+                        background-color: #E6A23C;
+                        border-radius: 50%;
+                    }
+                    .red-bg {
+                        width: 12px;
+                        height: 12px;
+                        background-color: #F56C6C;
+                        opacity: .7;
+                    }
+                }
+            }
+            .search{
+                display: flex;
+                .item{
+                    width: 300px;
+                    display: flex;
+                    align-items: center;
+                    .label{
+                        font-size: 12px;
+                        width: 60px;
+                    }
+                }
+            }
+            .item{
+                width: 100%;
+            }
+            .title{
+                margin: 16px 0 6px -16px;
+            }
+            .table{
+                display: flex;
+                .column{
+                    flex: 1;
+                    &:nth-child(2){
+                        display: flex;
+                    }
+                    >.item{
+                        height: 46px;
+                        line-height: 46px;
+                        min-width: 100px;
+                        border-bottom: 1px solid #333;
+                        border-right: 1px solid #333;
+                        border-left: 1px solid #333;
+                        white-space: nowrap;
+                    }
+                    @media screen and (max-width: 1800px) {
+                         >.item{
+                            height: 40px;
+                            line-height: 40px;
+                        }
+                    }
+                    @media screen and (max-width: 1550px) {
+                         >.item{
+                            height: 34px;
+                            line-height: 34px;
+                        }
+                    }
+                    >.item:nth-child(1){
+                        font-weight: 600;
+                        border-top: 1px solid #333;
+                        height: 30px;
+                        line-height: 30px;
+                        text-align: center;
+                    }
+                    >.item:not(:first-child) {
+                        :hover{
+                            color: #409EFF;
+                        }
+                    }
+                    .content-item{
+                        .unusual{
+                            background-color: #F56C6C;
+                            opacity: .7;
+                        }
+                        >.item{
+                            position: relative;
+                            height: 46px;
+                            width: 46px;
+                            text-align: center;
+                            line-height: 46px;
+                            border-bottom: 1px solid #333;
+                            border-right: 1px solid #333;
+                        }
+                        @media screen and (max-width: 1800px) {
+                            >.item{
+                                height: 40px;
+                                width: 40px;
+                                line-height: 40px;
+
+                            }
+                        }
+                        @media screen and (max-width: 1550px) {
+                            >.item{
+                                height: 34px;
+                                width: 34px;
+                                line-height: 34px;
+
+                            }
+                        }
+                        >.item:nth-child(1){
+                            font-weight: 600;
+                            border-top: 1px solid #333;
+                            height: 30px;
+                            line-height: 30px;
+                        }
+                        .green-circle {
+                            cursor: pointer;
+                            position: absolute;
+                            top: 50%;
+                            left: 50%;
+                            transform: translate(-50%, -50%);
+                            width: 10px;
+                            height: 10px;
+                            background-color: #67C23A;
+                            border-radius: 50%;
+                        }
+                        .red-circle {
+                            cursor: pointer;
+                            position: absolute;
+                            top: 50%;
+                            left: 50%;
+                            transform: translate(-50%, -50%);
+                            width: 10px;
+                            height: 10px;
+                            background-color: #F56C6C;
+                            border-radius: 50%;
+                        }
+                        .orange-circle {
+                            cursor: pointer;
+                            position: absolute;
+                            top: 50%;
+                            left: 50%;
+                            transform: translate(-50%, -50%);
+                            width: 10px;
+                            height: 10px;
+                            background-color: #E6A23C;
+                            border-radius: 50%;
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+    ::v-deep {
+        .el-form-item__label{
+            text-align: left;
+            font-size: 12px !important;
+        }
+        .el-form-item__content{
+            font-size: 12px !important;
+        }
+        .el-divider--horizontal{
+            margin: 10px 0;
+        }
+    }
+</style>