干燥机配套车间生产管理系统/云平台服务端
baoshiwei
2023-06-07 34ff338ff4d6575f9a25457286b3a5aad6b8823b
增加车间监控和设备监控
已添加26个文件
已修改5个文件
4031 ■■■■■ 文件已修改
src/assets/images/dry/chaiwangban.gif 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/chuliao.gif 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/chuliao1.gif 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/fanliao.gif 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/fengji.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/fengjixuanzhuan - 副本.psd 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/fengjixuanzhuan.gif 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/fengjixuanzhuan.psd 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/fengjixz.gif 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/fengxiangsheng.gif 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/guanmen.gif 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/kaimen.gif 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/liuliangji.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/refeng.gif 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/refeng2.gif 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/shangjiantou.gif 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/shangjiantoutou.gif 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/shangliao.gif 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/shebei1.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/yaocai.jpg 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/zhuangwangban.gif 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/zuojiantou.gif 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dry/api/DryEquipment.api.ts 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dry/api/DryOrder.api.ts 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dry/dataDefine/DryEquipment.data.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dry/monitor/Eqp copy 2.vue 763 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dry/monitor/Eqp copy.vue 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dry/monitor/Eqp.vue 1770 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dry/monitor/WorkShop copy.vue 516 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dry/monitor/WorkShop.vue 536 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/usersetting/UserSetting.data.ts 261 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/dry/chaiwangban.gif
src/assets/images/dry/chuliao.gif
src/assets/images/dry/chuliao1.gif
src/assets/images/dry/fanliao.gif
src/assets/images/dry/fengji.png
src/assets/images/dry/fengjixuanzhuan - ¸±±¾.psd
Binary files differ
src/assets/images/dry/fengjixuanzhuan.gif
src/assets/images/dry/fengjixuanzhuan.psd
Binary files differ
src/assets/images/dry/fengjixz.gif
src/assets/images/dry/fengxiangsheng.gif
src/assets/images/dry/guanmen.gif
src/assets/images/dry/kaimen.gif
src/assets/images/dry/liuliangji.png
src/assets/images/dry/refeng.gif
src/assets/images/dry/refeng2.gif
src/assets/images/dry/shangjiantou.gif
src/assets/images/dry/shangjiantoutou.gif
src/assets/images/dry/shangliao.gif
src/assets/images/dry/shebei1.png
src/assets/images/dry/yaocai.jpg
src/assets/images/dry/zhuangwangban.gif
src/assets/images/dry/zuojiantou.gif
src/views/dry/api/DryEquipment.api.ts
@@ -5,6 +5,7 @@
enum Api {
    list = '/dry/dryEquipment/list',
    queryById = '/dry/dryEquipment/queryById',
    listAll = '/dry/dryEquipment/listAll',
    save = '/dry/dryEquipment/add',
    edit = '/dry/dryEquipment/edit',
@@ -29,6 +30,13 @@
export const list = (params) => defHttp.get({ url: Api.list, params })
/**
 * æ ¹æ®ID查询机台
 * @param params
 * @returns
 */
export const queryById = (params) => defHttp.get({ url: Api.queryById, params })
/**
 * æ‰€æœ‰æœºå°
 * @param params
 */
src/views/dry/api/DryOrder.api.ts
@@ -1,64 +1,70 @@
import { useMessage } from "/@/hooks/web/useMessage";
import { defHttp } from '/@/utils/http/axios';
import { useMessage } from '/@/hooks/web/useMessage'
import { defHttp } from '/@/utils/http/axios'
const { createConfirm } = useMessage();
const { createConfirm } = useMessage()
enum Api {
  list = '/dry/dryOrder/list',
  save='/dry/dryOrder/add',
  edit='/dry/dryOrder/edit',
  deleteOne = '/dry/dryOrder/delete',
  deleteBatch = '/dry/dryOrder/deleteBatch',
  importExcel = '/dry/dryOrder/importExcel',
  exportXls = '/dry/dryOrder/exportXls',
    list = '/dry/dryOrder/list',
    queryByEqp = 'dry/dry/queryByEqp',
    save = '/dry/dryOrder/add',
    edit = '/dry/dryOrder/edit',
    deleteOne = '/dry/dryOrder/delete',
    deleteBatch = '/dry/dryOrder/deleteBatch',
    importExcel = '/dry/dryOrder/importExcel',
    exportXls = '/dry/dryOrder/exportXls',
}
/**
 * å¯¼å‡ºapi
 * @param params
 */
export const getExportUrl = Api.exportXls;
export const getExportUrl = Api.exportXls
/**
 * å¯¼å…¥api
 */
export const getImportUrl = Api.importExcel;
export const getImportUrl = Api.importExcel
/**
 * åˆ—表接口
 * @param params
 */
export const list = (params) =>
  defHttp.get({url: Api.list, params});
export const list = (params) => defHttp.get({ url: Api.list, params })
/**
 * æŸ¥è¯¢æœºå°å½“前工单
 * @param params
 */
export const queryByEqp = (params) => defHttp.get({ url: Api.queryByEqp, params })
/**
 * åˆ é™¤å•个
 */
export const deleteOne = (params,handleSuccess) => {
  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
    handleSuccess();
  });
export const deleteOne = (params, handleSuccess) => {
    return defHttp.delete({ url: Api.deleteOne, params }, { joinParamsToUrl: true }).then(() => {
        handleSuccess()
    })
}
/**
 * æ‰¹é‡åˆ é™¤
 * @param params
 */
export const batchDelete = (params, handleSuccess) => {
  createConfirm({
    iconType: 'warning',
    title: '确认删除',
    content: '是否删除选中数据',
    okText: '确认',
    cancelText: '取消',
    onOk: () => {
      return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {
        handleSuccess();
      });
    }
  });
    createConfirm({
        iconType: 'warning',
        title: '确认删除',
        content: '是否删除选中数据',
        okText: '确认',
        cancelText: '取消',
        onOk: () => {
            return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {
                handleSuccess()
            })
        },
    })
}
/**
 * ä¿å­˜æˆ–者更新
 * @param params
 */
export const saveOrUpdate = (params, isUpdate) => {
  let url = isUpdate ? Api.edit : Api.save;
  return defHttp.post({url: url, params});
    const url = isUpdate ? Api.edit : Api.save
    return defHttp.post({ url: url, params })
}
src/views/dry/dataDefine/DryEquipment.data.ts
@@ -152,6 +152,7 @@
    code: string
    name: string
    type: string
    type_dictText: string
    remark: string
    shop_id: string
    enable: string
src/views/dry/monitor/Eqp copy 2.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,763 @@
<template>
    <div class="eqpBox">
        <div class="eqpRow">
            <div class="eqpImage">
                <div class="topLeft">
                    <div class="eqpName">设备:{{ eqp.name }}</div>
                    <div class="eqpName">型号:{{ eqp.type }}</div>
                    <div class="eqpName">药材:{{ realData?.herbName }}</div>
                    <div class="eqpName">投料:{{ realData?.feed }} ç­</div>
                    <div class="eqpName">重量:{{ realData?.originWeight }} Kg</div>
                </div>
                <div class="topMid">
                    <div class="shangJianTou"></div>
                    <div class="zoujiantou"></div>
                    <div class="eqpInfoText" style="padding-top: 40px; text-align: center">热风烘干中</div>
                </div>
                <div class="topRight">
                    <div :id="'moisChart'" style="width: 660px; height: 285px"></div>
                </div>
                <div class="midLeft">
                    <div style="width: 300px; background: white; border-radius: 10px; padding: 30px 50px">
                        <div style="height: 1px; font-size: 18px; text-align: center; margin-top: 10px; margin-bottom: -10px"
                            >初始:{{ (realData?.mois[0] * 100).toFixed(2) }}%</div
                        >
                        <div id="moisture" style="width: 200px; height: 300px"></div>
                        <div style="height: 1px; font-size: 18px; text-align: center; margin-top: -25px">目标:{{ (realData?.mois[2] * 100).toFixed(2) }}%</div>
                        <div style="width: 200px; font-size: 18px; text-align: center; margin-top: 60px; font-weight: bold">含水率</div>
                    </div>
                    <div style="width: 260px; padding-left: 60px">
                        <div style="width: 200px; height: 100px; padding-top: 60px; padding-left: 10px">
                            <div style="display: flex; line-height: 40px; align-items: baseline">
                                <div style="width: 10px; margin-right: 10px; height: 10px; background-color: #2c4d90"> </div> çƒ˜åŽ»é‡é‡ï¼š<span class="eqpInfoText"
                                    >40</span
                                >
                                Kg</div
                            >
                            <div style="display: flex; line-height: 40px; align-items: baseline">
                                <div style="width: 10px; margin-right: 10px; height: 10px; background-color: #1595ea"> </div> å‰©ä½™é‡é‡ï¼š<span class="eqpInfoText"
                                    >151</span
                                >
                                Kg
                            </div>
                        </div>
                        <div id="weight" style="width: 200px; height: 300px"></div>
                    </div>
                </div>
                <div class="midMid">
                    <div class="outDiv">
                        <div style="height: 100px; width: 400px">
                            <Progress
                                :stroke-color="{
                                    from: '#108ee9',
                                    to: '#87d068',
                                }"
                                :percent="realData?.percent"
                                status="active"
                                :show-info="false"
                            />
                            <div style="padding-top: 10px; display: flex; justify-content: space-between; font-weight: bold">
                                <span>干燥 52 Min</span>
                                <span>预计 120 Min</span>
                            </div>
                        </div>
                    </div>
                    <div class="outDiv eqpStatus">
                        <div
                            style="
                                font-size: 28px;
                                margin-top: 80px;
                                color: white;
                                background-color: #1595ea;
                                height: 60px;
                                width: 180px;
                                line-height: 60px;
                                text-align: center;
                                border-radius: 5px;
                                font-weight: bold;
                            "
                            >正在干燥</div
                        >
                        <!-- <div
                            class="eqpInfoText blingbling"
                            style="
                                position: absolute;
                                max-height: 130px;
                                max-width: 360px;
                                border-radius: 10px;
                                background-color: #ce0000;
                                color: white;
                                padding: 10px;
                            "
                        >
                            <div class="outDiv">
                                <div><Icon icon="bx:error" :size="30" /> </div>
                                <div><span> æœ‰ä¸€ä¸ªæ•…障,请检查机器。</span></div>
                            </div>
                        </div> -->
                        <!-- <div class="eqpInfoText blingbling">
                            <div><Icon icon="bx:error" :size="30" /> </div>
                                <div><span style="font-size: 20px">正在烘干</span></div>
                        </div> -->
                    </div>
                </div>
                <div class="midRight">
                    <div style="display: flex">
                        <div style="height: 210px; width: 360px">
                            <div style="height: 150px; padding: 0 20px 0 90px; display: flex">
                                <div style="max-height: 150px; width: 220px">
                                    <div style="width: 10px; height: 35px; margin-top: -1px; background-color: #ff1515"></div>
                                    <div style="width: 10px; height: 35px; background-color: yellow"></div>
                                    <div style="width: 10px; height: 35px; background-color: rgb(0, 219, 48)"></div>
                                </div>
                                <div> </div>
                            </div>
                            <div style="padding-left: 150px; padding-top: 20px">
                                <div class="eqpInfoText">热风温度:70 Â°C</div>
                                <div class="eqpInfoText">风机频率:56 Hz</div>
                            </div>
                        </div>
                        <div style="height: 430px; width: 220px; padding: 20px 20px; background: white; border-radius: 10px">
                            <div style="text-align: center; margin-top: 10px; font-size: 18px; font-weight: bold">{{ realData.windTemp }} Â°C</div>
                            <div style="height: 230px; width: 220px; margin-top: 30px; margin-left: 55px">
                                <a-slider v-model:value="realData.tempValue" :min="0" range :max="100" :marks="marks" vertical />
                            </div>
                            <div style="text-align: center; margin-top: 55px; font-size: 18px; font-weight: bold">风箱温度</div>
                        </div>
                    </div>
                </div>
                <!-- <div class="fault">机器故障:机器貌似有一点点故障</div>
                <div class="eqpName">{{ eqp.name }}</div> -->
            </div>
        </div>
    </div>
</template>
<script setup lang="ts">
    import { router } from '/@/router'
    import { onMounted, ref, onUnmounted } from 'vue'
    import { Progress } from 'ant-design-vue'
    import * as echarts from 'echarts'
    import 'echarts-liquidfill'
    import { Icon, IconPicker, SvgIcon } from '/@/components/Icon/index'
    import { defHttp } from '/@/utils/http/axios'
    import { queryById } from '../api/DryEquipment.api'
    import { dryEquipment } from '../dataDefine/DryEquipment.data'
    import { useUserStore } from '/@/store/modules/user'
    const Timer = ref()
    const marks = ref<Record<number, any>>({
        0: '0°C',
        1: '',
        2: '',
        3: '',
        4: '',
        5: '',
        6: '',
        7: '',
        8: '',
        9: '',
        10: '',
        11: '',
        12: '',
        13: '',
        14: '',
        15: '',
        16: '',
        17: '',
        18: '',
        19: '',
        20: '',
        21: '',
        22: '',
        23: '',
        24: '',
        25: '25°C',
        26: '',
        27: '',
        28: '',
        29: '',
        30: '',
        31: '',
        32: '',
        33: '',
        34: '',
        35: '',
        36: '',
        37: '',
        38: '',
        39: '',
        40: '',
        41: '',
        42: '',
        43: '',
        44: '',
        45: '',
        46: '',
        47: '',
        48: '',
        49: '',
        50: '50°C',
        51: '',
        52: '',
        53: '',
        54: '',
        55: '',
        56: '',
        57: '',
        58: '',
        59: '',
        60: '',
        61: '',
        62: '',
        63: '',
        64: '',
        65: '',
        66: '',
        67: '',
        68: '',
        69: '',
        70: '',
        71: '',
        72: '',
        73: '',
        74: '',
        75: '75°C',
        76: '',
        77: '',
        78: '',
        79: '',
        80: '',
        81: '',
        82: '',
        83: '',
        84: '',
        85: '',
        86: '',
        87: '',
        88: '',
        89: '',
        90: '',
        91: '',
        92: '',
        93: '',
        94: '',
        95: '',
        96: '',
        97: '',
        98: '',
        99: '',
        100: '100°C',
    })
    const eqp = ref({} as dryEquipment)
    const userStore = useUserStore()
    const realData = ref({})
    realData.value.tempValue = [0, 100]
    realData.value.mois = [0, 0, 0]
    var moisChart: echarts.ECharts
    var waterChart: echarts.ECharts
    var weightChart: echarts.ECharts
    function initCharts() {
        let domId = 'moisChart'
        let chartDom: HTMLElement = document.getElementById(domId) as HTMLElement
        let waterDom: HTMLElement = document.getElementById('moisture') as HTMLElement
        let weightDom: HTMLElement = document.getElementById('weight') as HTMLElement
        moisChart = echarts.init(chartDom)
        waterChart = echarts.init(waterDom)
        weightChart = echarts.init(weightDom)
        const option = {
            color: ['#2C4D90', '#CE0000'],
            title: {
                text: '含水率温度趋势',
            },
            tooltip: {
                trigger: 'axis',
            },
            grid: {
                left: 30,
                right: 35,
                top: 50,
                bottom: 30,
            },
            legend: {
                right: 20,
            },
            // toolbox: {
            //     show: true,
            //     feature: {
            //         dataZoom: {
            //             yAxisIndex: 'none',
            //         },
            //         dataView: { readOnly: false },
            //         magicType: { type: ['line', 'bar'] },
            //         restore: {},
            //         saveAsImage: {},
            //     },
            // },
            xAxis: {
                type: 'value',
                //boundaryGap: false,
                // data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
            },
            yAxis: {
                type: 'value',
            },
            // yAxis: {
            //     type: 'value',
            //     axisLabel: {
            //         formatter: '{value} Â°C',
            //     },
            // },
            series: [
                {
                    name: '含水率',
                    type: 'line',
                    smooth: true,
                    symbol: 'none',
                    data: [
                        [1, 1],
                        [2, 2],
                    ],
                    markLine: {
                        data: [{ type: 'average', name: 'Avg' }],
                    },
                },
                {
                    name: '温度',
                    type: 'line',
                    smooth: true,
                    symbol: 'none',
                    data: [
                        [1, 10],
                        [2, 20],
                    ],
                    // markLine: {
                    //     data: [
                    //         { type: 'average', name: 'Avg' },
                    //         [
                    //             {
                    //                 symbol: 'none',
                    //                 x: '90%',
                    //                 yAxis: 'max',
                    //             },
                    //             {
                    //                 symbol: 'circle',
                    //                 label: {
                    //                     position: 'start',
                    //                     formatter: 'Max',
                    //                 },
                    //                 type: 'max',
                    //                 name: '最高点',
                    //             },
                    //         ],
                    //     ],
                    // },
                },
            ],
        }
        const waterOption = {
            series: [
                {
                    type: 'liquidFill',
                    radius: '100%',
                    //waveAnimation: false,
                    amplitude: 3,
                    animationDuration: 5,
                    //animationDurationUpdate: 0,
                    data: realData.value.mois,
                    shape:
                        'path://M828.817,706.209C828.817,881.725,686.98,1024,512,1024c-174.98,0-316.817-142.275-316.817-317.791C195.183,530.74,512,0,512,0s316.817,530.74,316.817,706.209z',
                    outline: {
                        show: false,
                    },
                    label: {
                        // formatter: function () {
                        //     //console.log(`output->params`,params,mois.value)
                        //     return (
                        //         '' +
                        //         // +'初始'+(mois.value[0]*100).toFixed(2) + '%\n\n\n'
                        //         (mois.value[1] * 100).toFixed(2) +
                        //         '%'
                        //         // + '\n\n\n目标'+(mois.value[2]*100).toFixed(2) + '%'
                        //     )
                        // },
                        fontSize: 18,
                        //position: ['50%',(100-mois.value[1]*100).toFixed(2) + '%'],
                    },
                },
            ],
        }
        const weightOption = {
            //         title: {
            //   text: 'Referer of a Website',
            //   subtext: 'Fake Data',
            //   left: 'center'
            // },
            color: ['#1595EA', '#2C4D90', '#FF7F7F'],
            tooltip: {
                trigger: 'item',
            },
            radius: [0, '85%'],
            // grid: {
            //     top: 20,
            //     left: 20,
            //     right: 20,
            //     bottom: 20,
            // },
            // legend: {
            //     orient: 'vertical',
            //     left: 'left',
            // },
            series: [
                {
                    name: '重量数据',
                    type: 'pie',
                    radius: '50%',
                    data: [
                        { value: 1048, name: '剩余重量' },
                        { value: 735, name: '烘去重量' },
                    ],
                    label: {
                        show: false,
                    },
                    labelLine: {
                        show: false,
                    },
                    emphasis: {
                        itemStyle: {
                            shadowBlur: 10,
                            shadowOffsetX: 0,
                            shadowColor: 'rgba(0, 0, 0, 0.5)',
                        },
                    },
                },
            ],
        }
        option && moisChart.setOption(option)
        waterOption && waterChart.setOption(waterOption)
        weightOption && weightChart.setOption(weightOption)
    }
    function queryEqp() {
        queryById({ id: router.currentRoute.value.params.id }).then((res) => {
            // console.log(`output->res`, res)
            eqp.value = res
            queryRealTime()
            setTimeout(initCharts, 500)
        })
    }
    function queryRealTime() {
        let tenantId = userStore.getTenant
        let eqpCode = eqp.value.code
        let queryRealTimeUrl = '/dry/real/getRealTimeData'
        defHttp.get({ url: queryRealTimeUrl, params: { tenantid: tenantId, machineid: eqpCode } }).then((res) => {
            console.log(`output->res`, res)
            if (res && res.trendVo) {
                res.tempValue = [res.windTemp, 100]
                res.percent = ((res.dryTime / res.et) * 100).toFixed(2)
                res.mois = [(res.initial / 100).toFixed(2), (res.trendVo.moisture / 100).toFixed(2), (res.target / 100).toFixed(2)]
                if (waterChart) {
                    waterChart.setOption({
                        series: [
                            {
                                data: res.mois,
                                label: {
                                    formatter: function () {
                                        return res.trendVo.moisture + '%'
                                    },
                                    fontSize: 10,
                                },
                            },
                        ],
                    })
                }
                if (weightChart) {
                    weightChart.setOption({})
                }
                if (res && res.detailList) {
                    res.moisList = []
                    res.detailList.forEach((item) => {
                        res.moisList.push([item.totalTime, item.moisture])
                    })
                    // for (var i = res.detailList.length - 1; i > 0; i--) {
                    //     console.log(`output->res.detailList[i]`, res.detailList[i])
                    //     res.moisList.push([res.detailList[i].totalTime, res.detailList[i].moisture])
                    // }
                    console.log(`output->res.moisList` + JSON.stringify(res.moisList))
                }
                if (res && res.bellowsTemp) {
                    // let map = new Map(Object.entries(res.bellowsTemp))
                    // console.log(`output->map`, map)
                    Array.from(Object.entries(res.bellowsTemp))
                    var arr = Object.keys(res.bellowsTemp)
                    var temArr = []
                    arr.forEach((item) => {
                        temArr.push([item * 1, res.bellowsTemp[item]])
                    })
                    console.log(`output->arr` + JSON.stringify(temArr))
                    res.tempArr = temArr
                }
                if (moisChart) {
                    console.log(`output->更新chart`)
                    moisChart.setOption({
                        series: [
                            {
                                data: res.moisList,
                                markLine: {
                                    symbol: 'none',
                                    data: [
                                        {
                                            name: '目标',
                                            yAxis: res.target,
                                        },
                                    ],
                                    label: {
                                        formatter: '{b}\n{c}%',
                                    },
                                },
                            },
                            {
                                data: res.tempArr,
                            },
                        ],
                    })
                }
            } else {
                res = {
                    tempValue: [0, 100],
                    percent: 0,
                    mois: [],
                }
            }
            realData.value = res
        })
    }
    queryEqp()
    // DOM挂载完成后渲染图表
    onMounted(() => {
        Timer.value = setInterval(queryRealTime, 3000)
    })
    onUnmounted(() => {
        clearInterval(Timer.value)
        Timer.value = null
    })
</script>
<style scoped>
    .eqpBox {
        height: 100%;
    }
    .eqpRow {
    }
    .eqpImage {
        height: 850px;
        width: 1700px;
        background-image: url(/src/assets/images/dry/ganzaoji-z.png);
        background-repeat: no-repeat;
        background-position: 200px 235px;
        /* background-color: red; */
        display: flex;
        flex-wrap: wrap;
        align-content: flex-start;
    }
    .topLeft {
        margin: 20px 40px 60px 20px;
        padding: 15px;
        background: white;
        border-radius: 10px;
        height: 325px;
        width: 440px;
        background-image: url(/src/assets/images/dry/yaocai.jpg);
        background-repeat: no-repeat;
        background-size: 164px 132px;
        background-position: 239px 65px;
    }
    .topMid {
        margin: 20px 20px 60px 40px;
        background: white;
        border-radius: 10px;
        background-image: url(/src/assets/images/dry/fanliao.gif);
        background-repeat: no-repeat;
        background-position: 0px 20px;
        background-size: 400px;
        width: 400px;
        padding: 20px;
    }
    .topRight {
        margin: 20px 20px 60px 20px;
        background: white;
        border-radius: 10px;
        width: 700px;
        padding: 20px;
    }
    .midLeft {
        height: 450px;
        width: 600px;
        display: flex;
        padding: 0 20px 20px 20px;
    }
    .midMid {
        width: 500px;
        padding-top: 50px;
    }
    .midRight {
        background-image: url(/src/assets/images/dry/fengjixz.gif);
        background-repeat: no-repeat;
        background-position: 150px 260px;
        background-size: 120px 120px;
        width: 600px;
    }
    .shangJianTou {
        margin-left: 140px;
        width: 70px;
        height: 100px;
        background-image: url(/src/assets/images/dry/shangjiantoutou.gif);
        background-repeat: no-repeat;
        background-position: 0px 0px;
        background-size: 70px 100px;
    }
    .zoujiantou {
        margin-left: 225px;
        margin-top: 30px;
        width: 100px;
        height: 70px;
        background-image: url(/src/assets/images/dry/zuojiantou.gif);
        background-repeat: no-repeat;
        background-position: 0px 0px;
        background-size: 100px 70px;
    }
    .fault {
        padding: 10px;
        height: 60px;
        font-size: 26px;
        width: 100%;
        text-align: right;
        color: red;
    }
    .eqpName {
        padding: 20px;
        font-size: 18px;
        font-weight: bold;
        height: 40px;
        width: 236px;
    }
    .eqpInfoText {
        font-size: 18px;
        font-weight: bold;
    }
    .eqpStatus {
        height: 200px;
        /* background-image: url(/src/assets/images/dry/fengjixz.gif);
        background-repeat: no-repeat;
        background-position: 0px 0px;
        background-size: 100px 70px; */
    }
    :deep() .ant-slider-mark-text {
        padding-left: 15px;
        font-size: 10px;
    }
    :deep() .ant-slider-mark-text::before {
        content: '';
        display: block;
        width: 6px;
        height: 1px;
        background-color: #1890ff;
        position: absolute;
        top: 10px;
        left: 0px;
    }
    :deep() .ant-slider-rail {
        width: 10px !important;
        border-radius: 6px 6px 0 0;
        background: linear-gradient(to top, #ce0000 0%, #ce0000 40%, #ce0000 75%, rgb(160, 160, 160) 100%);
    }
    :deep() .ant-slider-track {
        background: rgb(216, 216, 216);
        height: 20px;
        width: 10px !important;
        border-radius: 6px 6px 0 0;
    }
    :deep() .ant-slider-track:hover {
    }
    :deep() .ant-slider-handle {
        display: none;
    }
    :deep() .ant-slider-dot {
        display: none;
    }
    :deep() .ant-slider-step {
        width: 10px !important;
    }
    :deep() .ant-slider-step > :first-child {
        display: block !important;
        width: 30px !important;
        height: 30px !important;
        bottom: -26px !important;
        left: -6px;
        border: none;
        background: #ce0000;
    }
    :deep() .progress {
        padding: 25px 25px;
        width: 360px;
        display: flex;
    }
    :deep() .ant-progress-bg {
        height: 25px !important;
    }
    .outDiv {
        display: flex;
        justify-content: center;
    }
    .blingbling {
        -webkit-animation: scaleout 1.5s infinite ease-in-out;
        animation: scaleout 1.5s infinite ease-in-out;
    }
    @-webkit-keyframes scaleout {
        0% {
            -webkit-transform: scale(1);
        }
        100% {
            -webkit-transform: scale(1.1);
            opacity: 0;
        }
    }
    @keyframes scaleout {
        0% {
            transform: scale(1);
            -webkit-transform: scale(1);
        }
        100% {
            transform: scale(1.1);
            -webkit-transform: scale(1.1);
            opacity: 0;
        }
    }
</style>
src/views/dry/monitor/Eqp copy.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,106 @@
<template>
    <div class="eqpBox">
        <div class="eqpRow">
            <div class="eqpImage">
                <div class="fault">机器故障:机器貌似有一点点故障</div>
                <div class="eqpName">{{ eqp.name }}</div>
            </div>
            <div class="progress"></div>
            <div class="realData"></div>
            <div class="realChart"></div>
        </div>
    </div>
</template>
<script setup lang="ts">
    import { router } from '/@/router'
    import { ref } from 'vue'
    // import { Progress } from 'ant-design-vue'
    // import * as echarts from 'echarts'
    import { defHttp } from '/@/utils/http/axios'
    import { queryById } from '../api/DryEquipment.api'
    import { dryEquipment } from '../dataDefine/DryEquipment.data'
    import { useUserStore } from '/@/store/modules/user'
    const eqp = ref({} as dryEquipment)
    const userStore = useUserStore()
    function queryEqp() {
        queryById({ id: router.currentRoute.value.params.id }).then((res) => {
            // console.log(`output->res`, res)
            eqp.value = res
            queryRealTime()
        })
    }
    function queryRealTime() {
        let tenantId = userStore.getTenant
        let eqpCode = eqp.value.code
        let queryRealTimeUrl = '/dry/real/getRealTimeData'
        defHttp.get({ url: queryRealTimeUrl, params: { tenantid: tenantId, machineid: eqpCode } }).then((res) => {
            console.log(`output->res`, res)
        })
    }
    queryEqp()
</script>
<style scoped>
    .eqpBox {
        height: 100%;
    }
    .eqpRow {
        display: flex;
        flex-wrap: wrap;
    }
    .eqpImage {
        height: 420px;
        width: 800px;
        background-image: url('../../../assets/images/dry/ganzaoji-z.png');
        background-repeat: no-repeat;
        background-size: 100% 100%;
        background-position: 20px 0px;
        flex-grow: 0;
        flex-shrink: 0;
    }
    .progress {
        height: 420px;
        width: 800px;
        background: salmon;
        flex-grow: 0;
        flex-shrink: 0;
    }
    .realData {
        width: 800px;
        height: 420px;
        background: lawngreen;
        flex-grow: 0;
        flex-shrink: 0;
    }
    .realChart {
        width: 800px;
        height: 420px;
        background: gold;
        flex-grow: 0;
        flex-shrink: 0;
    }
    .fault {
        padding: 10px;
        height: 60px;
        font-size: 26px;
        width: 100%;
        text-align: right;
        color: red;
    }
    .eqpName {
        text-align: center;
        font-size: 26px;
        font-weight: bold;
        height: 40px;
        width: 236px;
        margin-top: 80px;
        margin-left: 249px;
    }
</style>
src/views/dry/monitor/Eqp.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1770 @@
<template>
    <div class="eqpBox">
        <div class="eqpRow">
            <div class="eqpImage">
                <div class="leftEqp">
                    <div class="leftTop">
                        <div class="leftTop1">
                            <Icon icon="emojione:hourglass-with-flowing-sand" :size="50" />
                            <div>
                                <div class="mainInfo">{{ realData?.remain | 0 }}min</div>
                                <div class="subhead">剩余时间</div>
                            </div>
                        </div>
                        <div class="leftTop1">
                            <!-- <Icon icon="mdi:chart-finance" :size="50" />
                            <div>
                                <div class="mainInfo">98 %</div>
                                <div class="subhead">干燥效率</div>
                            </div> -->
                        </div>
                        <div class="leftTop3" :style="{ 'background-image': 'url(/src/assets/images/dry/' + realData?.gif + '.gif)' }"></div>
                        <div class="outDiv eqpStatus">
                            <div
                                style="
                                    font-size: 28px;
                                    margin-top: 60px;
                                    color: white;
                                    background-color: #1595ea;
                                    height: 60px;
                                    width: 180px;
                                    line-height: 60px;
                                    text-align: center;
                                    border-radius: 5px;
                                    font-weight: bold;
                                "
                            >
                                æ­£åœ¨å¹²ç‡¥
                            </div>
                            <!-- <div
                                class="eqpInfoText blingbling"
                                style="
                                    position: absolute;
                                    max-height: 130px;
                                    max-width: 360px;
                                    border-radius: 10px;
                                    background-color: #ce0000;
                                    color: white;
                                    padding: 10px;
                                "
                            >
                                <div class="outDiv">
                                    <div><Icon icon="bx:error" :size="30" /> </div>
                                    <div><span> æœ‰ä¸€ä¸ªæ•…障,请检查机器。</span></div>
                                </div>
                            </div> -->
                        </div>
                    </div>
                    <div class="leftMid">
                        <div id="efficiencyLine" style="width: 780px; height: 150px"></div>
                        <div style="height: 0px; display: flex; width: 780px; padding: 0 60px; justify-content: space-between">
                            <div style="width: 100px; height: 20px">0 min</div>
                            <div style="width: 100px; height: 20px; text-align: right">{{ realData?.totalTime | 0 }} min</div>
                        </div>
                        <div id="progressBar" style="width: 780px; height: 80px"></div>
                    </div>
                    <!-- <div class="outDiv">
                        <div style="height: 100px; width: 400px">
                            <Progress
                                :stroke-color="{
                                    from: '#108ee9',
                                    to: '#87d068',
                                }"
                                :percent="realData?.percent"
                                status="active"
                                :show-info="false"
                            />
                            <div style="padding-top: 10px; display: flex; justify-content: space-between; font-weight: bold">
                                <span>干燥 52 Min</span>
                                <span>预计 120 Min</span>
                            </div>
                        </div>
                    </div> -->
                </div>
                <div class="rightInfo">
                    <div class="rightTop">
                        <div class="herbInfo">
                            <div class="curEqp">
                                <div class="eqpName">
                                    <div class="mainInfo" style="font-size: 26px">{{ eqp.name }}</div>
                                    <div class="subhead">{{ eqp.type }}</div>
                                    <!-- è®¾å¤‡ï¼š{{ eqp.name }}</div>
                                <div class="eqpName">型号:{{ eqp.type }}</div> -->
                                </div>
                            </div>
                            <div class="curHerb">
                                <div class="eqpName" style="margin-left: 100px">
                                    <div class="mainInfo" style="font-size: 26px">{{ realData?.herbName }}</div>
                                    <div class="subhead">干燥配方</div>
                                </div>
                                <div class="formula">
                                    <div class="formulaItem">
                                        <Icon icon="icon-park-twotone:box" :size="35" />
                                        <div>
                                            <div class="mainInfo2">{{ realData?.feed }}筐</div>
                                            <div class="subhead2">投料量</div>
                                        </div>
                                    </div>
                                    <div class="formulaItem">
                                        <Icon icon="bx:wind" :size="35" />
                                        <div>
                                            <div class="mainInfo2">{{ realData?.windTemp }}°C</div>
                                            <div class="subhead2">热风</div>
                                        </div>
                                    </div>
                                    <div class="formulaItem">
                                        <Icon icon="tabler:target-arrow" :size="35" />
                                        <div>
                                            <div class="mainInfo2">{{ realData?.target }}%</div>
                                            <div class="subhead2">目标</div>
                                        </div>
                                    </div>
                                </div>
                                <!-- <div class="eqpName">{{ realData?.herbName }}</div>
                                <div class="eqpName">{{ realData?.feed }} ç­</div> -->
                            </div>
                        </div>
                        <div class="tempMoisChart">
                            <div :id="'moisChart'" style="width: 550px; height: 320px"></div>
                        </div>
                    </div>
                    <div class="rightTwo">
                        <div class="infoChart">
                            <div class="chartTittle">含水率</div>
                            <div class="outDiv" style="padding-top: 20px">
                                <div class="leftData">
                                    <div class="center" style="height: 50%">
                                        <div class="centerText">
                                            <div class="mainInfo3"
                                                ><span>{{ realData?.target }}</span
                                                >%
                                            </div>
                                            <div class="subhead2">目标含水率</div>
                                        </div>
                                    </div>
                                    <div class="center" style="height: 50%">
                                        <div>
                                            <div class="mainInfo3"
                                                ><span>{{ realData?.initial }}</span
                                                >%</div
                                            >
                                            <div class="subhead2">来料含水率</div>
                                        </div>
                                    </div>
                                </div>
                                <div id="moisture" style="width: 170px; height: 133px"></div>
                            </div>
                            <div class="subhead2" style="margin-top: -37px; padding-left: 172px">实时含水率</div>
                        </div>
                        <div class="infoChart">
                            <div class="chartTittle">风箱温度</div>
                            <div class="outDiv">
                                <div id="bellowsTemp" style="width: 220px; height: 200px">
                                    <Icon icon="emojione:hourglass-with-flowing-sand" :size="50" />
                                </div>
                            </div>
                        </div>
                        <div class="infoChart">
                            <div class="chartTittle">风机频率</div>
                            <div class="outDiv" style="padding-top: 10px">
                                <div id="fanFreq" style="width: 220px; height: 200px"></div>
                            </div>
                        </div>
                        <div class="infoChart">
                            <div class="chartTittle">
                                å¹²ç‡¥æ•ˆçއ(kg/h)
                                <div style="width: 120px; display: flex; justify-content: space-between">
                                    <div class="label good">&gt;{{ standard.xiaolv }} ä¼˜ </div>
                                    <div class="label bad">&lt;{{ standard.xlMin }} å·®</div>
                                </div>
                            </div>
                            <div class="outDiv" style="padding-top: 20px">
                                <div class="leftData">
                                    <div class="center" style="height: 50%">
                                        <div class="centerText">
                                            <div class="mainInfo3"
                                                ><span>{{ (realData?.originWeight - realData?.yield) | 0 }}</span
                                                >kg
                                            </div>
                                            <div class="subhead2">水分蒸发</div>
                                        </div>
                                    </div>
                                    <div class="center" style="height: 50%">
                                        <div>
                                            <div class="mainInfo3">{{ realData?.dryTime | 0 }}min</div>
                                            <div class="subhead2">干燥用时</div>
                                        </div>
                                    </div>
                                </div>
                                <div class="rightChart center">
                                    <div class="center compareBar">
                                        <div class="barTop">{{ standard.xiaolv }}</div>
                                        <div class="barBack">
                                            <div class="barDiv" :style="{ height: realData?.xlsHeight }"></div>
                                        </div>
                                        <div style="line-height: 18px">
                                            é¢å®š
                                            <br />
                                            æ•ˆçއ
                                        </div>
                                    </div>
                                    <div class="center compareBar">
                                        <div class="barTop">{{ realData?.xiaolv | 0 }}</div>
                                        <div class="barBack">
                                            <div
                                                class="barDiv"
                                                :class="{ good: realData?.xlgood, bad: realData?.xlbad }"
                                                :style="[realData?.xlrHeight && { height: realData?.xlrHeight }]"
                                            >
                                            </div>
                                        </div>
                                        <div style="line-height: 18px">
                                            å®žæ—¶
                                            <br />
                                            æ•ˆçއ
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="infoChart">
                            <div class="chartTittle"
                                >蒸汽消耗(m³/kg)
                                <div style="width: 120px; display: flex; justify-content: space-between">
                                    <div class="label bad">&gt;{{ standard.zhengqi }} å·®</div>
                                    <div class="label good">&lt;{{ standard.zqMin }} ä¼˜</div>
                                </div>
                            </div>
                            <div class="outDiv" style="padding-top: 20px">
                                <div class="leftData">
                                    <div class="center" style="height: 100%">
                                        <div class="centerText">
                                            <div class="mainInfo3"><span>45</span>m³ </div>
                                            <div class="subhead2">蒸汽用量</div>
                                        </div>
                                    </div>
                                </div>
                                <div class="rightChart center">
                                    <div class="center compareBar">
                                        <div class="barTop">25</div>
                                        <div class="barBack">
                                            <div class="barDiv" id="zhengqiS"></div>
                                        </div>
                                        <div style="line-height: 18px">
                                            é¢å®š
                                            <br />
                                            æ¶ˆè€—
                                        </div>
                                    </div>
                                    <div class="center compareBar">
                                        <div class="barTop">26</div>
                                        <div class="barBack">
                                            <div class="barDiv" id="zhengqiR"> </div>
                                        </div>
                                        <div style="line-height: 18px">
                                            å®žæ—¶
                                            <br />
                                            æ¶ˆè€—
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="infoChart">
                            <div class="chartTittle">
                                <div> ç”µèƒ½æ¶ˆè€—(kw/h/kg) </div>
                                <div class="rightLabel">
                                    <div class="label bad">&gt;{{ standard.dian }} å·®</div>
                                    <div class="label good">&lt;{{ standard.dMin }} ä¼˜</div>
                                </div>
                            </div>
                            <div class="outDiv" style="padding-top: 20px">
                                <div class="leftData">
                                    <div class="center" style="height: 100%">
                                        <div class="centerText">
                                            <div class="mainInfo3"><span>45</span>kw/h </div>
                                            <div class="subhead2">电能用量</div>
                                        </div>
                                    </div>
                                </div>
                                <div class="rightChart center">
                                    <div class="center compareBar">
                                        <div class="barTop">12</div>
                                        <div class="barBack">
                                            <div class="barDiv" id="dianS"></div>
                                        </div>
                                        <div style="line-height: 18px">
                                            é¢å®š
                                            <br />
                                            æ¶ˆè€—
                                        </div>
                                    </div>
                                    <div class="center compareBar">
                                        <div class="barTop">10</div>
                                        <div class="barBack">
                                            <div class="barDiv" id="dianR"></div>
                                        </div>
                                        <div style="line-height: 18px">
                                            å®žæ—¶
                                            <br />
                                            æ¶ˆè€—
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</template>
<script setup lang="ts">
    import { router } from '/@/router'
    import { onMounted, ref, onUnmounted } from 'vue'
    import { Progress } from 'ant-design-vue'
    import * as echarts from 'echarts'
    import 'echarts-liquidfill'
    import { Icon, IconPicker, SvgIcon } from '/@/components/Icon/index'
    import { defHttp } from '/@/utils/http/axios'
    import { queryById } from '../api/DryEquipment.api'
    import { dryEquipment } from '../dataDefine/DryEquipment.data'
    import { useUserStore } from '/@/store/modules/user'
    const Timer = ref()
    const marks = ref<Record<number, any>>({
        0: '0°C',
        1: '',
        2: '',
        3: '',
        4: '',
        5: '',
        6: '',
        7: '',
        8: '',
        9: '',
        10: '',
        11: '',
        12: '',
        13: '',
        14: '',
        15: '',
        16: '',
        17: '',
        18: '',
        19: '',
        20: '',
        21: '',
        22: '',
        23: '',
        24: '',
        25: '25°C',
        26: '',
        27: '',
        28: '',
        29: '',
        30: '',
        31: '',
        32: '',
        33: '',
        34: '',
        35: '',
        36: '',
        37: '',
        38: '',
        39: '',
        40: '',
        41: '',
        42: '',
        43: '',
        44: '',
        45: '',
        46: '',
        47: '',
        48: '',
        49: '',
        50: '50°C',
        51: '',
        52: '',
        53: '',
        54: '',
        55: '',
        56: '',
        57: '',
        58: '',
        59: '',
        60: '',
        61: '',
        62: '',
        63: '',
        64: '',
        65: '',
        66: '',
        67: '',
        68: '',
        69: '',
        70: '',
        71: '',
        72: '',
        73: '',
        74: '',
        75: '75°C',
        76: '',
        77: '',
        78: '',
        79: '',
        80: '',
        81: '',
        82: '',
        83: '',
        84: '',
        85: '',
        86: '',
        87: '',
        88: '',
        89: '',
        90: '',
        91: '',
        92: '',
        93: '',
        94: '',
        95: '',
        96: '',
        97: '',
        98: '',
        99: '',
        100: '100°C',
    })
    const eqp = ref({} as dryEquipment)
    const userStore = useUserStore()
    const realData = ref({})
    const standard = ref({
        xiaolv: 220,
        xlMin: 200,
        zhengqi: 50,
        zqMin: 45,
        dian: 8,
        dMin: 7.5,
    })
    //realData.value.tempValue = [0, 100]
    realData.value.mois = [0, 0, 0]
    var moisChart: echarts.ECharts
    var waterChart: echarts.ECharts
    var bellowsTempChart: echarts.ECharts
    var fanFreqChart: echarts.ECharts
    var progressBarChart: echarts.ECharts
    var efficiencyLineChart: echarts.ECharts
    function initCharts() {
        let domId = 'moisChart'
        let chartDom: HTMLElement = document.getElementById(domId) as HTMLElement
        let waterDom: HTMLElement = document.getElementById('moisture') as HTMLElement
        let bellowsTempDom: HTMLElement = document.getElementById('bellowsTemp') as HTMLElement
        let fanFreqDom: HTMLElement = document.getElementById('fanFreq') as HTMLElement
        let progressBarDom: HTMLElement = document.getElementById('progressBar') as HTMLElement
        let efficiencyLineDom: HTMLElement = document.getElementById('efficiencyLine') as HTMLElement
        // let weightDom: HTMLElement = document.getElementById('weight') as HTMLElement
        moisChart = echarts.init(chartDom)
        waterChart = echarts.init(waterDom)
        bellowsTempChart = echarts.init(bellowsTempDom)
        fanFreqChart = echarts.init(fanFreqDom)
        progressBarChart = echarts.init(progressBarDom)
        efficiencyLineChart = echarts.init(efficiencyLineDom)
        const option = {
            color: ['#2C4D90', '#CE0000'],
            title: {
                text: '含水率温度趋势',
            },
            tooltip: {
                trigger: 'axis',
            },
            grid: {
                left: 50,
                right: 50,
                top: 50,
                bottom: 40,
            },
            legend: {
                right: 20,
            },
            // toolbox: {
            //     show: true,
            //     feature: {
            //         dataZoom: {
            //             yAxisIndex: 'none',
            //         },
            //         dataView: { readOnly: false },
            //         magicType: { type: ['line', 'bar'] },
            //         restore: {},
            //         saveAsImage: {},
            //     },
            // },
            xAxis: {
                type: 'value',
                //boundaryGap: false,
                // data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
                min: 0,
                max: function (value) {
                    if (value.max < 100) {
                        return 100
                    } else {
                        return value.max
                    }
                },
            },
            yAxis: {
                type: 'value',
                boundaryGap: ['10%', '10%'],
                // min: 0,
                // max: function (value) {
                //     if (value.max < 100) {
                //         return 100
                //     } else {
                //         return value.max
                //     }
                // },
            },
            // yAxis: {
            //     type: 'value',
            //     axisLabel: {
            //         formatter: '{value} Â°C',
            //     },
            // },
            series: [
                {
                    name: '含水率',
                    type: 'line',
                    smooth: true,
                    symbol: 'none',
                    data: [
                        [1, 1],
                        [2, 2],
                    ],
                    lineStyle: {
                        width: 1,
                    },
                    markLine: {
                        data: [{ type: 'average', name: 'Avg' }],
                    },
                },
                {
                    name: '温度',
                    type: 'line',
                    smooth: true,
                    symbol: 'none',
                    data: [
                        [1, 10],
                        [2, 20],
                    ],
                    lineStyle: {
                        width: 1,
                    },
                    // markLine: {
                    //     data: [
                    //         { type: 'average', name: 'Avg' },
                    //         [
                    //             {
                    //                 symbol: 'none',
                    //                 x: '90%',
                    //                 yAxis: 'max',
                    //             },
                    //             {
                    //                 symbol: 'circle',
                    //                 label: {
                    //                     position: 'start',
                    //                     formatter: 'Max',
                    //                 },
                    //                 type: 'max',
                    //                 name: '最高点',
                    //             },
                    //         ],
                    //     ],
                    // },
                },
            ],
        }
        const waterOption = {
            series: [
                {
                    type: 'liquidFill',
                    radius: '100%',
                    //waveAnimation: false,
                    amplitude: 3,
                    animationDuration: 5,
                    //animationDurationUpdate: 0,
                    data: realData.value.mois,
                    shape:
                        'path://M828.817,706.209C828.817,881.725,686.98,1024,512,1024c-174.98,0-316.817-142.275-316.817-317.791C195.183,530.74,512,0,512,0s316.817,530.74,316.817,706.209z',
                    outline: {
                        show: false,
                    },
                    label: {
                        // formatter: function () {
                        //     //console.log(`output->params`,params,mois.value)
                        //     return (
                        //         '' +
                        //         // +'初始'+(mois.value[0]*100).toFixed(2) + '%\n\n\n'
                        //         (mois.value[1] * 100).toFixed(2) +
                        //         '%'
                        //         // + '\n\n\n目标'+(mois.value[2]*100).toFixed(2) + '%'
                        //     )
                        // },
                        fontSize: 20,
                        //position: ['50%',(100-mois.value[1]*100).toFixed(2) + '%'],
                    },
                },
            ],
        }
        const bellowsOption = {
            series: [
                {
                    type: 'gauge',
                    center: ['50%', '60%'],
                    startAngle: 215,
                    endAngle: -35,
                    min: 0,
                    max: 80,
                    splitNumber: 8,
                    itemStyle: {
                        color: '#FFAB91',
                    },
                    progress: {
                        show: true,
                        width: 10,
                    },
                    pointer: {
                        show: false,
                    },
                    axisLine: {
                        lineStyle: {
                            width: 10,
                        },
                    },
                    axisTick: {
                        distance: -15,
                        splitNumber: 5,
                        length: 3,
                        lineStyle: {
                            width: 1,
                            color: '#999',
                        },
                    },
                    splitLine: {
                        distance: -18,
                        length: 6,
                        lineStyle: {
                            width: 2,
                            color: '#999',
                        },
                    },
                    axisLabel: {
                        distance: -13,
                        color: '#999',
                        fontSize: 9,
                    },
                    anchor: {
                        show: false,
                    },
                    title: {
                        show: false,
                    },
                    detail: {
                        valueAnimation: true,
                        width: '60%',
                        lineHeight: 40,
                        borderRadius: 8,
                        offsetCenter: [0, '0%'],
                        fontSize: 20,
                        fontWeight: 'bolder',
                        formatter: '{value}°C',
                        color: 'inherit',
                    },
                    data: [
                        {
                            value: 20,
                        },
                    ],
                },
                {
                    type: 'gauge',
                    center: ['50%', '60%'],
                    startAngle: 215,
                    endAngle: -35,
                    min: 0,
                    max: 80,
                    itemStyle: {
                        color: '#FD7347',
                    },
                    progress: {
                        show: true,
                        width: 3,
                    },
                    pointer: {
                        show: false,
                    },
                    axisLine: {
                        show: false,
                    },
                    axisTick: {
                        show: false,
                    },
                    splitLine: {
                        show: false,
                    },
                    axisLabel: {
                        show: false,
                    },
                    detail: {
                        show: false,
                    },
                    data: [
                        {
                            value: 20,
                        },
                    ],
                },
            ],
        }
        const fanFreqOption = {
            series: [
                {
                    type: 'gauge',
                    progress: {
                        show: true,
                        width: 9,
                    },
                    axisLine: {
                        lineStyle: {
                            width: 9,
                        },
                    },
                    axisTick: {
                        show: false,
                    },
                    splitLine: {
                        distance: 3,
                        length: 4,
                        lineStyle: {
                            width: 1,
                            color: '#999',
                        },
                    },
                    axisLabel: {
                        distance: 15,
                        color: '#999',
                        fontSize: 10,
                    },
                    anchor: {
                        show: true,
                        showAbove: true,
                        size: 10,
                        itemStyle: {
                            borderWidth: 3,
                        },
                    },
                    title: {
                        show: false,
                    },
                    detail: {
                        valueAnimation: true,
                        fontSize: 20,
                        offsetCenter: [0, '70%'],
                        formatter: '{value}Hz',
                    },
                    data: [
                        {
                            value: 56,
                        },
                    ],
                },
            ],
        }
        // const weightOption = {
        //     //         title: {
        //     //   text: 'Referer of a Website',
        //     //   subtext: 'Fake Data',
        //     //   left: 'center'
        //     // },
        //     color: ['#1595EA', '#2C4D90', '#FF7F7F'],
        //     tooltip: {
        //         trigger: 'item',
        //     },
        //     radius: [0, '85%'],
        //     // grid: {
        //     //     top: 20,
        //     //     left: 20,
        //     //     right: 20,
        //     //     bottom: 20,
        //     // },
        //     // legend: {
        //     //     orient: 'vertical',
        //     //     left: 'left',
        //     // },
        //     series: [
        //         {
        //             name: '重量数据',
        //             type: 'pie',
        //             radius: '50%',
        //             data: [
        //                 { value: 1048, name: '剩余重量' },
        //                 { value: 735, name: '烘去重量' },
        //             ],
        //             label: {
        //                 show: false,
        //             },
        //             labelLine: {
        //                 show: false,
        //             },
        //             emphasis: {
        //                 itemStyle: {
        //                     shadowBlur: 10,
        //                     shadowOffsetX: 0,
        //                     shadowColor: 'rgba(0, 0, 0, 0.5)',
        //                 },
        //             },
        //         },
        //     ],
        // }
        const progressBarOption = {
            // tooltip: {
            //     trigger: 'axis',
            //     axisPointer: {
            //         // Use axis to trigger tooltip
            //         type: 'shadow', // 'shadow' as default; can also be 'line' or 'shadow'
            //     },
            // },
            // color: [
            //     '#0653F6',
            //     // '#1B61E7',
            //     '#3673D5',
            //     // '#4A80C8',
            //     '#608FB8',
            //     // '#719BAD',
            //     '#82A6A1',
            //     // '#8DAD9A',
            //     '#9CB790',
            //     // '#A7BE88',
            //     '#B3C681',
            //     '#CAD671',
            //     '#DBE165',
            // ],
            animation: false, // å…³é—­åŠ¨ç”»
            color: ['#397FD7', '#2D8CDE', '#239CE5', '#1DA4E8', '#14B2EF', '#0BC4FA', '#02D2FF', '#19EEFF', '#33FAFF', '#5EFFF8'],
            grid: {
                top: '12%',
                left: '20',
                right: '55',
                bottom: '3%',
                containLabel: true,
            },
            xAxis: {
                min: 0,
                max: 150,
                show: false,
                type: 'value',
                axisLine: {
                    show: false,
                },
                axisTick: {
                    show: false,
                },
            },
            yAxis: {
                show: false,
                axisLine: {
                    show: false,
                },
                axisTick: {
                    show: false,
                },
                type: 'category',
                data: ['时间'],
            },
            series: [
                // {
                //     name: '第一阶段',
                //     type: 'bar',
                //     stack: 'total',
                //     label: {
                //         show: true,
                //     },
                //     barWidth: 26,
                //     emphasis: {
                //         focus: 'series',
                //     },
                //     data: [30],
                // },
                // {
                //     name: '第二阶段',
                //     type: 'bar',
                //     stack: 'total',
                //     label: {
                //         show: true,
                //     },
                //     emphasis: {
                //         focus: 'series',
                //     },
                //     data: [30],
                // },
                // {
                //     name: 'Affiliate Ad',
                //     type: 'bar',
                //     stack: 'total',
                //     label: {
                //         show: true,
                //     },
                //     emphasis: {
                //         focus: 'series',
                //     },
                //     data: [20],
                // },
                // {
                //     name: 'Video Ad',
                //     type: 'bar',
                //     stack: 'total',
                //     label: {
                //         show: true,
                //     },
                //     emphasis: {
                //         focus: 'series',
                //     },
                //     data: [15],
                // },
                // {
                //     name: 'Search Engine',
                //     type: 'bar',
                //     stack: 'total',
                //     label: {
                //         show: true,
                //     },
                //     emphasis: {
                //         focus: 'series',
                //     },
                //     data: [10],
                // },
                // {
                //     name: 'df Engine',
                //     type: 'bar',
                //     stack: 'total',
                //     label: {
                //         show: true,
                //     },
                //     emphasis: {
                //         focus: 'series',
                //     },
                //     data: [5],
                // },
                // {
                //     name: 'df Engine',
                //     type: 'bar',
                //     stack: 'total',
                //     label: {
                //         show: true,
                //     },
                //     emphasis: {
                //         focus: 'series',
                //     },
                //     data: [5],
                // },
                // {
                //     name: 'df Engine',
                //     type: 'bar',
                //     stack: 'total',
                //     label: {
                //         show: true,
                //     },
                //     emphasis: {
                //         focus: 'series',
                //     },
                //     data: [
                //         {
                //             value: 35,
                //             itemStyle: {
                //                 color: '#c0c0c0',
                //             },
                //         },
                //     ],
                // },
            ],
        }
        const efficiencyLineOption = {
            title: {},
            tooltip: {
                trigger: 'axis',
            },
            grid: {
                top: '20%',
                left: '17',
                right: '57',
                bottom: '0%',
                containLabel: true,
            },
            legend: {},
            xAxis: {
                show: false,
                axisLine: {
                    show: false,
                },
                axisTick: {
                    show: false,
                },
                type: 'value',
                min: 0,
                max: 150,
                // data: [15, 15, 10, 7.5, 5, 2.5, 2.5, 1],
            },
            yAxis: {
                show: false,
                axisLine: {
                    show: false,
                },
                axisTick: {
                    show: false,
                },
                type: 'value',
                axisLabel: {
                    formatter: '{value} Â°C',
                },
            },
            series: [
                {
                    name: '干燥效率',
                    type: 'line',
                    lineStyle: {
                        width: 1,
                    },
                    // [[15,10], [15,11], [10,6], [7.5,12], [5,12], [2.5,5], [2.5,9], [1,7]]
                    data: [
                        [0, 1],
                        [15, 10],
                        [45, 11],
                        [70, 6],
                    ],
                    markPoint: {
                        data: [
                            { type: 'max', name: 'Max' },
                            { type: 'min', name: 'Min' },
                        ],
                    },
                    // markLine: {
                    //     data: [{ type: 'average', name: 'Avg' }],
                    // },
                },
            ],
        }
        option && moisChart.setOption(option)
        waterOption && waterChart.setOption(waterOption)
        bellowsOption && bellowsTempChart.setOption(bellowsOption)
        fanFreqOption && fanFreqChart.setOption(fanFreqOption)
        progressBarOption && progressBarChart.setOption(progressBarOption)
        efficiencyLineOption && efficiencyLineChart.setOption(efficiencyLineOption)
    }
    function queryEqp() {
        queryById({ id: router.currentRoute.value.params.id }).then((res) => {
            // console.log(`output->res`, res)
            eqp.value = res
            queryRealTime()
            setTimeout(initCharts, 500)
        })
    }
    function queryRealTime() {
        let tenantId = userStore.getTenant
        let eqpCode = eqp.value.code
        let queryRealTimeUrl = '/dry/real/getRealTimeData'
        defHttp.get({ url: queryRealTimeUrl, params: { tenantid: tenantId, machineid: eqpCode } }).then((res) => {
            //console.log(`output->res`, res)
            if (res && res.trendVo) {
                //    res.tempValue = [res.windTemp, 100]
                //res.percent = ((res.dryTime / res.et) * 100).toFixed(2)
                /**水滴图含水量 */
                res.mois = [
                    (res.trendVo.moisture / 100).toFixed(2),
                    (res.trendVo.moisture / 100 / 1.5).toFixed(2),
                    (res.trendVo.moisture / 100 / 3).toFixed(2),
                ]
                if (waterChart) {
                    waterChart.setOption({
                        series: [
                            {
                                data: res.mois,
                                label: {
                                    formatter: function () {
                                        return res.trendVo.moisture + '%'
                                    },
                                    fontSize: 20,
                                },
                            },
                        ],
                    })
                }
                /**温度环形图 */
                if (bellowsTempChart) {
                    bellowsTempChart.setOption({
                        series: [{ data: [{ value: res.windTemp }] }, { data: [{ value: res.windTemp }] }],
                    })
                }
                /**风机频率环形图 */
                if (fanFreqChart) {
                    fanFreqChart.setOption({
                        series: [
                            {
                                data: [
                                    {
                                        value: res.trendVo.fanFrequency,
                                    },
                                ],
                            },
                        ],
                    })
                }
                /**干燥进度、走势与阶段效率和阶段消耗 */
                if (res && res.detailList) {
                    var progressSeries = []
                    var ganZaoXiaoLv = []
                    var zhengQiXiaoHao = []
                    var dianNengXiaoHao = []
                    var totalTime = 0
                    var beforeWeight = 0
                    res.moisList = []
                    res.detailList.forEach((item) => {
                        console.log(`output->item`, item)
                        res.moisList.push([item.totalTime, item.moisture])
                        console.log(`output->totalTime,item.totalTime`, totalTime, item.totalTime)
                        var curDryTime = item.totalTime - totalTime
                        if (curDryTime > 0) {
                            progressSeries.push({
                                name: item.moisture,
                                type: 'bar',
                                stack: 'total',
                                label: {
                                    show: true,
                                },
                                emphasis: {
                                    focus: 'series',
                                },
                                data: [item.totalTime - totalTime],
                            })
                            ganZaoXiaoLv.push([curDryTime / 2 + totalTime, (((beforeWeight - item.weight) / curDryTime) * 60).toFixed(1)])
                            totalTime = item.totalTime
                        }
                        beforeWeight = item.weight
                    })
                    if (res.remain) {
                        if (res.dryTime - totalTime > 0) {
                            progressSeries.push({
                                name: '当前',
                                type: 'bar',
                                stack: 'total',
                                label: {
                                    show: true,
                                },
                                emphasis: {
                                    focus: 'series',
                                },
                                data: [
                                    {
                                        value: res.dryTime - totalTime,
                                    },
                                ],
                            })
                        }
                        progressSeries.push({
                            name: '剩余',
                            type: 'bar',
                            stack: 'total',
                            label: {
                                show: true,
                            },
                            emphasis: {
                                focus: 'series',
                            },
                            data: [
                                {
                                    value: res.remain - (res.dryTime - totalTime),
                                    itemStyle: {
                                        color: '#c0c0c0',
                                    },
                                },
                            ],
                        })
                    }
                    /**干燥进度 */
                    if (progressBarChart) {
                        console.log(`output->progressSeries`, progressSeries)
                        progressBarChart.setOption(
                            {
                                xAxis: {
                                    max: totalTime + res.remain,
                                },
                                series: progressSeries,
                            },
                            { replaceMerge: ['series'] }
                        )
                    }
                    res.totalTime = totalTime + res.remain
                    /**干燥效率、消耗 */
                    if (efficiencyLineChart) {
                        console.log(`output->ganZaoXiaoLv`, ganZaoXiaoLv)
                        efficiencyLineChart.setOption({
                            xAxis: {
                                max: totalTime + res.remain,
                            },
                            series: [{ data: ganZaoXiaoLv }, { data: zhengQiXiaoHao }, { data: dianNengXiaoHao }],
                        })
                    }
                    res.moisList.push([res.dryTime, res.trendVo.moisture])
                }
                /**温度趋势 */
                if (res && res.bellowsTemp) {
                    Array.from(Object.entries(res.bellowsTemp))
                    var arr = Object.keys(res.bellowsTemp)
                    var temArr = []
                    arr.forEach((item) => {
                        temArr.push([item * 1, res.bellowsTemp[item]])
                    })
                    //console.log(`output->arr` + JSON.stringify(temArr))
                    res.tempArr = temArr
                }
                /**干燥过程趋势 */
                if (moisChart) {
                    //console.log(`output->更新chart`)
                    moisChart.setOption({
                        series: [
                            {
                                data: res.moisList,
                                markLine: {
                                    symbol: 'none',
                                    data: [
                                        {
                                            name: '目标',
                                            yAxis: res.target,
                                        },
                                    ],
                                    label: {
                                        formatter: '{b}\n{c}%',
                                    },
                                },
                            },
                            {
                                data: res.tempArr,
                            },
                        ],
                    })
                }
                /**效率对比图 */
                res.xiaolv = (((res.originWeight - res.yield) / res.dryTime) * 60).toFixed(2)
                if (res.xiaolv > standard.value.xiaolv) {
                    res.xlgood = true
                    res.xlsHeight = (standard.value.xiaolv / res.xiaolv) * 100 + '%'
                    res.xlrHeight = '100%'
                } else if (res.xiaolv < standard.value.xlMin) {
                    res.xlbad = true
                    res.xlsHeight = '100%'
                    res.xlrHeight = (res.xiaolv / standard.value.xiaolv) * 100 + '%'
                }
                /**gif动图 */
                res.gif = 'refeng2'
            } else {
                res = {
                    mois: [],
                }
            }
            console.log(`output->res`, res)
            realData.value = res
        })
    }
    queryEqp()
    // DOM挂载完成后渲染图表
    onMounted(() => {
        Timer.value = setInterval(queryRealTime, 3000)
    })
    onUnmounted(() => {
        clearInterval(Timer.value)
        Timer.value = null
    })
</script>
<style scoped>
    .eqpBox {
        height: 100%;
    }
    .eqpRow {
    }
    .eqpImage {
        height: 860px;
        width: 1800px;
        background-image: url(/src/assets/images/dry/ganzaoji-x.png);
        background-repeat: no-repeat;
        background-position: 160px 280px;
        /* background-color: red; */
        padding: 10px;
        display: flex;
        flex-wrap: wrap;
        align-content: flex-start;
    }
    .leftEqp {
        height: 840px;
        width: 780px;
        /* background-color: white;
        background-image: url(/src/assets/images/dry/shebei1.png);
        background-repeat: no-repeat;
        background-size: 125%;
        border-radius: 10px;
        background-position: -119px 293px; */
    }
    .leftTop {
        height: 600px;
        display: flex;
        justify-content: center;
        align-content: flex-start;
        background-color: white;
        background-image: url(/src/assets/images/dry/shebei1.png);
        background-repeat: no-repeat;
        background-size: 110%;
        border-radius: 10px;
        flex-wrap: wrap;
        background-position: -78px 119px;
    }
    .leftMid {
        padding-top: 10px;
        width: 780px;
        height: 230px;
        /* border: 1px solid; */
        margin-top: 10px;
        border-radius: 10px;
        background: white;
    }
    .mainInfo {
        line-height: 33px;
        padding-left: 10px;
        font-size: 30px;
    }
    .subhead {
        color: #a19f9c;
        font-size: 16px;
        padding-left: 10px;
    }
    .mainInfo2 {
        line-height: 20px;
        padding-left: 0px;
        font-size: 16px;
    }
    .subhead2 {
        color: #a19f9c;
        font-size: 10px;
        padding-left: 0px;
    }
    .zhengqi {
        height: 180px;
        width: 200px;
        background-image: url(/src/assets/images/dry/liuliangji.png);
        background-repeat: no-repeat;
        background-size: 160px;
        /* border-radius: 10px; */
        background-position: 17px -6px;
    }
    .liuliangji {
    }
    .leftData {
        height: 180px;
        width: 120px;
    }
    .rightChart {
        height: 180px;
        width: 170px;
        margin-top: -30px;
    }
    .leftTop1 {
        width: 220px;
        height: 200px;
        text-align: center;
        display: flex;
        justify-content: center;
        align-items: center;
        font-size: 30px;
        color: #727272;
    }
    .leftTop2 {
        width: 250px;
        height: 200px;
        text-align: center;
        display: flex;
        justify-content: center;
        align-items: center;
        font-size: 30px;
        color: #727272;
    }
    .leftTop3 {
        width: 340px;
        height: 200px;
        /* background-image: url(/src/assets/images/dry/fanliao.gif); */
        background-repeat: no-repeat;
        background-position: 0px 20px;
        background-size: 300px;
        border-radius: 50px;
    }
    .eqpStatus {
        width: 780px;
        height: 300px;
        padding: 100px;
    }
    .rightInfo {
        display: flex;
        flex-wrap: wrap;
        align-content: flex-start;
        height: 850px;
        width: 900px;
    }
    .rightTop {
        display: flex;
        height: 360px;
        padding-left: 10px;
    }
    .rightTwo {
        display: flex;
        flex-wrap: wrap;
    }
    .infoChart {
        width: 290px;
        height: 230px;
        background: white;
        margin-left: 10px;
        margin-top: 10px;
        border-radius: 10px;
    }
    .chartTittle {
        width: 290px;
        height: 30px;
        font-size: 16px;
        display: flex;
        justify-content: space-between;
        padding: 15px 15px;
    }
    .chartInfo {
        width: 60px;
        height: 180px;
    }
    .compareBar {
        width: 55px;
        height: 140px;
    }
    .margintop-30 {
        margin-top: -30px;
    }
    .barTop {
        width: 55px;
        height: 30px;
    }
    .barBack {
        width: 30px;
        height: 100px;
        /* border: 1px solid black; */
        display: flex;
        flex-wrap: wrap;
        align-content: flex-end;
    }
    .barDiv {
        width: 100%;
        background-color: #1595ea;
    }
    .bad {
        background-color: #fdcb6e;
    }
    .rightLabel {
        width: 120px;
        display: flex;
        justify-content: space-between;
    }
    .label {
        text-align: center;
        width: 50px;
        border-radius: 4px;
        height: 20px;
        font-size: 10px;
        line-height: 21px;
    }
    .good {
        background-color: #75f94d;
    }
    .mainInfo3 {
        font-size: 24px;
    }
    .herbInfo {
        width: 290px;
        height: 360px;
        color: #727272;
    }
    .curEqp {
        width: 290px;
        height: 120px;
        background: white;
        border-radius: 10px;
    }
    .curHerb {
        margin-top: 10px;
        width: 290px;
        height: 230px;
        background: white;
        border-radius: 10px;
        background-image: url(/src/assets/images/dry/yaocai.jpg);
        background-repeat: no-repeat;
        background-size: 110px 90px;
        background-position: 10px 10px;
    }
    .tempMoisChart {
        width: 590px;
        height: 360px;
        background: white;
        margin-left: 10px;
        padding: 20px;
        border-radius: 10px;
    }
    .topLeft {
        margin: 20px 40px 60px 20px;
        padding: 15px;
        background: white;
        border-radius: 10px;
        height: 325px;
        width: 440px;
        /* background-image: url(/src/assets/images/dry/yaocai.jpg); */
        background-repeat: no-repeat;
        background-size: 164px 132px;
        background-position: 239px 65px;
        display: flex;
    }
    .topMid {
        margin: 20px 20px 60px 40px;
        background: white;
        border-radius: 10px;
        background-image: url(/src/assets/images/dry/fanliao.gif);
        background-repeat: no-repeat;
        background-position: 0px 20px;
        background-size: 400px;
        width: 400px;
        padding: 20px;
    }
    .topRight {
        margin: 20px 20px 60px 20px;
        background: white;
        border-radius: 10px;
        width: 700px;
        padding: 20px;
    }
    .midLeft {
        height: 450px;
        width: 600px;
        display: flex;
        padding: 0 20px 20px 20px;
    }
    .midMid {
        width: 500px;
        padding-top: 50px;
    }
    .midRight {
        background-image: url(/src/assets/images/dry/fengjixz.gif);
        background-repeat: no-repeat;
        background-position: 150px 260px;
        background-size: 120px 120px;
        width: 600px;
    }
    .shangJianTou {
        margin-left: 140px;
        width: 70px;
        height: 100px;
        background-image: url(/src/assets/images/dry/shangjiantoutou.gif);
        background-repeat: no-repeat;
        background-position: 0px 0px;
        background-size: 70px 100px;
    }
    .zoujiantou {
        margin-left: 225px;
        margin-top: 30px;
        width: 100px;
        height: 70px;
        background-image: url(/src/assets/images/dry/zuojiantou.gif);
        background-repeat: no-repeat;
        background-position: 0px 0px;
        background-size: 100px 70px;
    }
    .fault {
        padding: 10px;
        height: 60px;
        font-size: 26px;
        width: 100%;
        text-align: right;
        color: red;
    }
    .eqpName {
        padding: 20px;
        height: 160px;
    }
    .formula {
        display: flex;
        width: 290px;
        height: 40px;
        padding: 0 20px;
        justify-content: space-around;
        justify-items: center;
    }
    .formulaItem {
        display: flex;
        width: 85px;
        height: 40px;
    }
    .eqpInfoText {
        font-size: 18px;
        font-weight: bold;
    }
    :deep() .ant-slider-mark-text {
        padding-left: 15px;
        font-size: 10px;
    }
    :deep() .ant-slider-mark-text::before {
        content: '';
        display: block;
        width: 6px;
        height: 1px;
        background-color: #1890ff;
        position: absolute;
        top: 10px;
        left: 0px;
    }
    :deep() .ant-slider-rail {
        width: 10px !important;
        border-radius: 6px 6px 0 0;
        background: linear-gradient(to top, #ce0000 0%, #ce0000 40%, #ce0000 75%, rgb(160, 160, 160) 100%);
    }
    :deep() .ant-slider-track {
        background: rgb(216, 216, 216);
        height: 20px;
        width: 10px !important;
        border-radius: 6px 6px 0 0;
    }
    :deep() .ant-slider-track:hover {
    }
    :deep() .ant-slider-handle {
        display: none;
    }
    :deep() .ant-slider-dot {
        display: none;
    }
    :deep() .ant-slider-step {
        width: 10px !important;
    }
    :deep() .ant-slider-step > :first-child {
        display: block !important;
        width: 30px !important;
        height: 30px !important;
        bottom: -26px !important;
        left: -6px;
        border: none;
        background: #ce0000;
    }
    :deep() .progress {
        padding: 25px 25px;
        width: 360px;
        display: flex;
    }
    :deep() .ant-progress-bg {
        height: 25px !important;
    }
    .outDiv {
        display: flex;
        justify-content: center;
        justify-items: center;
    }
    .blingbling {
        -webkit-animation: scaleout 1.5s infinite ease-in-out;
        animation: scaleout 1.5s infinite ease-in-out;
    }
    .center {
        display: flex;
        justify-content: center;
        justify-items: center;
        align-items: center;
        flex-wrap: wrap;
        text-align: center;
    }
    .centerText {
        width: 100%;
        text-align: center;
    }
    @-webkit-keyframes scaleout {
        0% {
            -webkit-transform: scale(1);
        }
        100% {
            -webkit-transform: scale(1.1);
            opacity: 0;
        }
    }
    @keyframes scaleout {
        0% {
            transform: scale(1);
            -webkit-transform: scale(1);
        }
        100% {
            transform: scale(1.1);
            -webkit-transform: scale(1.1);
            opacity: 0;
        }
    }
</style>
src/views/dry/monitor/WorkShop copy.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,516 @@
<template>
    <div class="workshop">
        <div class="eqp-row">
            <div v-for="(item, index) in eqps" :key="index">
                <div class="eqp-card">
                    <div class="eqp-content">
                        <div class="chart">
                                <div>
                                <div class="progress">
                                    <div style="">
                                        <div>加热</div>
                                        <div></div>
                                    <span class="info-text">36</span> åˆ†é’Ÿ
                                    </div>
                                    <div style=" padding: 0 10px;width: 200px;height: 40px;">
                                        <div style="padding-top: 10px">
                                                <Progress
                                                    :stroke-color="{
                                                        from: '#108ee9',
                                                        to: '#87d068',
                                                    }"
                                                    :percent="55.9"
                                                    status="active"
                                                    :show-info="false">
                                            </Progress>
                                        </div>
                                    </div>
                                    <div>
                                        <div>预计 </div>
                                        <div><span class="info-text">90</span>  åˆ†é’Ÿ
                                        </div>
                                    </div>
                            </div>
                            <div style="height:50px; text-align: left; padding-left: 25px; display: flex;">
                                <div class="herbInfo">
                                    <div>药材:<span class="info-text">当归</span></div>
                                    <div>投料:<span class="info-text">16</span> ç­</div>
                                </div>
                                <div class="herbInfo">
                                    <div>原始重量:<span class="info-text">160</span> Kg</div>
                                    <div>实时重量:<span class="info-text">70</span> Kg</div>
                                </div>
                            </div>
                        </div>
                            <div class="eqpStatus">
                                <div > <span class="info-text">翻料</span>  </div>
                            </div>
                        </div>
                        <!-- <div :id="'chartDom' + item.id" class="chart"> </div> -->
                        <div class="info">
                            <div class="leftInfo" @click="gotoEqp(item.id)">
                                <!-- <div class="herbName"> å½“å½’ </div> -->
                                <div class="eqpName">{{ item.name }}</div>
                            </div>
                            <div class="rightInfo">
                                <div style="width: 120px" >
                                    <div style="    height: 1px;
    font-size: 10px;
    text-align: center;
    margin-top: 10px;
    margin-bottom: -10px; ">初始:{{ (mois[0] * 100).toFixed(2) }}%</div>
                                    <div :id="'moisture' + item.id" style="width: 110px; height: 187px"></div>
                                    <div style="height: 1px;
    font-size: 10px;
    text-align: center;
    margin-top: -25px;">目标:{{ (mois[2] * 100).toFixed(2) }}%</div>
                                    <div style="    width: 110px;
    text-align: center;
    margin-top: 23px;">含水率</div>
                                </div>
                                <div class="tempChart"    style="pointer-events: none; cursor: none;"  :id="'tempDom' + item.id">
                                    <a-slider v-model:value="tempValue"
                                     :min="0" range :max="100" :marks="marks" vertical />
                                     <div>热风:<span class="info-text">{{ tempValue[0] }}</span> Â°C</div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</template>
<script setup lang="ts">
    import { onMounted, ref } from 'vue'
    import { Progress } from 'ant-design-vue'
    import * as echarts from 'echarts'
    import 'echarts-liquidfill'
    import { listAll } from '../api/DryEquipment.api'
    import { dryEquipment } from '../dataDefine/DryEquipment.data'
    import { router } from '/@/router';
    const eqps = ref([] as dryEquipment[])
    const mois = ref([0.3939,0.2112,0.11])
    const tempValue = ref(<Record<number, number>>([70, 100]))
    const marks = ref<Record<number, any>>({
        0: '0°C',
        1: '',
        2: '',
        3: '',
        4: '',
        5: '',
        6: '',
        7: '',
        8: '',
        9: '',
        10: '',
        11: '',
        12: '',
        13: '',
        14: '',
        15: '',
        16: '',
        17: '',
        18: '',
        19: '',
        20: '',
        21: '',
        22: '',
        23: '',
        24: '',
        25: '25°C',
        26: '',
        27: '',
        28: '',
        29: '',
        30: '',
        31: '',
        32: '',
        33: '',
        34: '',
        35: '',
        36: '',
        37: '',
        38: '',
        39: '',
        40: '',
        41: '',
        42: '',
        43: '',
        44: '',
        45: '',
        46: '',
        47: '',
        48: '',
        49: '',
        50: '50°C',
        51: '',
        52: '',
        53: '',
        54: '',
        55: '',
        56: '',
        57: '',
        58: '',
        59: '',
        60: '',
        61: '',
        62: '',
        63: '',
        64: '',
        65: '',
        66: '',
        67: '',
        68: '',
        69: '',
        70: '',
        71: '',
        72: '',
        73: '',
        74: '',
        75: '75°C',
        76: '',
        77: '',
        78: '',
        79: '',
        80: '',
        81: '',
        82: '',
        83: '',
        84: '',
        85: '',
        86: '',
        87: '',
        88: '',
        89: '',
        90: '',
        91: '',
        92: '',
        93: '',
        94: '',
        95: '',
        96: '',
        97: '',
        98: '',
        99: '',
        100: '100°C',
    })
    function listAllEqp() {
        listAll({ enable: 'Y' })
            .then((result) => {
                console.log(`output->result`, result)
                eqps.value = result
                setTimeout(initCharts, 1000)
            })
            .catch((err) => {
                console.log(`output->err`, err)
            })
    }
    // var wetCharts: Map<string, echarts.ECharts> = new Map()
        var moistureCharts: Map<String, echarts.ECharts> = new Map()
     function initCharts() {
    //     console.log(`output->initChart`)
         eqps.value.forEach((item) => {
    //         console.log(`output->item.id`, item.id)
             let domId = 'moisture' + item.id
    //         console.log(`output->domId`, domId)
             var chartDom: HTMLElement = document.getElementById(domId) as HTMLElement
    //         console.log(`output->chartDom`, chartDom)
             let myChart = echarts.init(chartDom)
         //    var option
//              option = {
//                 grid: {
//                     left: 30,
//                     top: 15,
//                     bottom: 13,
//                     right: 45
//                 },
//   xAxis: {
//     type: 'category',
//         show: false,
//     data: ['含水率'],
//         axisLine: {
//             show: false,
//         },
//         axisTick: {
//             show: false,
//         }
//   },
//   yAxis: {
//     type: 'value',
//         axisLine: {
//             show: false,
//         },
//         min: 0,
//         max: 100,
//         axisTick: {
//             show: true,
//         },
//         splitLine: {
//             show: false
//         }
//   },
//   series: [
//     {
//       data: [20],
//       type: 'bar',
//       showBackground: true,
//       backgroundStyle: {
//         color: 'rgba(180, 180, 180, 0.2)'
//       },
//             label: {
//                 show: true,
//             },
//             barWidth: 20,
//             markLine: {
//                 symbol: 'none',
//                 data: [
//                     {symbol: 'none',
//                         xAxis:0,
//                         x:60,
//                         yAxis:60,
//                         lineStyle:{
//                             color: '#000',
//                             width:1,
//                         },
//                         label: {
//                             formatter: '初始\n'+ '{c}%'
//                         }
//                     },
//                     {symbol: 'none',
//                         xAxis:0,
//                         x:60,
//                         yAxis:11,
//                         lineStyle:{
//                             color: '#000',
//                             width:1,
//                         },
//                         label: {
//                             formatter: '目标\n'+ '{c}%'
//                         }
//                     },
//                     // {yAxis: 0},
//                     // {yAxis: 100}
//                 ]
//             }
//     },
//   ]
// };
const option = {
    series: [{
        type: 'liquidFill',
                radius: '100%',
                //waveAnimation: false,
                amplitude: 3,
        animationDuration: 5,
        //animationDurationUpdate: 0,
        data: mois.value,
                shape: 'path://M828.817,706.209C828.817,881.725,686.98,1024,512,1024c-174.98,0-316.817-142.275-316.817-317.791C195.183,530.74,512,0,512,0s316.817,530.74,316.817,706.209z',
                outline: {
            show: false
        },
                label: {
                    formatter: function(params) {
                        console.log(`output->params`,params,mois.value)
                        return ''
                        // +'初始'+(mois.value[0]*100).toFixed(2) + '%\n\n\n'
                        + (mois.value[1]*100).toFixed(2) + '%'
                        // + '\n\n\n目标'+(mois.value[2]*100).toFixed(2) + '%'
                        ;
                    },
                    fontSize: 10,
                    position: ['50%',(100-mois.value[1]*100).toFixed(2) + '%'],
                }
    }]
};
             option && myChart.setOption(option)
             moistureCharts.set(item.id, myChart)
         })
     }
     function gotoEqp(id: string) {
        router.push('/dashboard/eqp/'+id)
     }
    listAllEqp()
    // DOM挂载完成后渲染图表
    onMounted(() => {})
</script>
<style>
    .workshop {
    }
    .eqp-row {
        display: flex;
        flex-wrap: wrap;
    }
    .eqp-card {
        width: 566px;
        height: 400px;
        padding: 6px 6px;
    }
    .eqp-content {
        height: 100%;
        background-color: white;
        background-image: url('../../../assets/images/dry/ganzaoji-x.png');
        background-repeat: no-repeat;
        background-size: 60% 60%;
        background-position: 10px 150px;
        border-radius: 8px;
    }
    .chart {
        width: 550px;
        height: 160px;
        display: flex;
        text-align: center;
    }
    .progress {
        padding:25px 25px;
        width: 360px;
        display: flex;
    }
    .ant-progress-bg {
        height: 25px !important;
    }
    .eqpStatus {
        width:170px;
        background-position: 0 -10px;
        background-image: url('../../../assets/images/dry/ganzaoji.gif');
        background-size: 100% 100%;
        display: inline-flex;
        flex-direction: column-reverse;
        padding: 15px;
    }
    .info {
        display: flex;
    }
    .leftInfo {
        width: 335px;
        /* background: gray; */
    }
    .rightInfo {
        flex: 1;
        height: 210px;
        display: flex;
    }
    .info-text {
        font-size: 16px;
        font-weight: bold;
    }
    .herbName {
        margin-top: -10px;
        width: 180px;
        height: 35px;
        background: rgb(56, 56, 56);
        margin-left: 120px;
        text-align: center;
        color: white;
        font-size: 16px;
        font-weight: bold;
        line-height: 35px;
    }
    .eqpName {
        margin-top: 68px;
        margin-left: 174px;
        width: 95px;
        font-weight: bold;
        text-align: center;
        background-color: white;
    }
    .tempChart {
        padding-top: 10px;
        height: 150px;
        width: 100px;
    }
    .herbInfo {
    width: 160px;
    }
    .ant-slider-mark-text {
        padding-left: 15px;
        font-size: 10px;
    }
    .ant-slider-mark-text::before {
        content: '';
        display: block;
        width: 6px;
        height: 1px;
        background-color: #1890ff;
        position: absolute;
        top: 10px;
        left: 0px;
    }
    .ant-slider-rail {
        width: 6px !important;
        border-radius: 6px 6px 0 0;
        background: linear-gradient(to top, #ce0000 0%, #ce0000 40%, #ce0000 75%, rgb(160, 160, 160) 100%);
    }
    .ant-slider-track {
        background: rgb(175, 175, 175);
        height: 20px;
        width: 6px !important;
        border-radius: 6px 6px 0 0;
    }
    .ant-slider-track:hover {
    }
    .ant-slider-handle {
        display: none;
    }
    .ant-slider-dot {
        display: none;
    }
    .ant-slider-step {
        width: 10px !important;
    }
    .ant-slider-step > :first-child {
        display: block !important;
        width: 22px !important;
        height: 22px !important;
        bottom: -17px !important;
        left: -4px;
        border: none;
        background: #ce0000;
    }
</style>
src/views/dry/monitor/WorkShop.vue
@@ -1,87 +1,92 @@
<template>
    <div class="workshop">
        <div class="eqp-row">
            <div v-for="(item, index) in eqps" :key="index">
                <div class="eqp-card">
                    <div class="eqp-content">
                        <div class="chart">
                                <div>
                                <div class="progress">
                                    <div style="">
                                        <div>加热</div>
                                        <div></div>
                                    <span class="info-text">36</span> åˆ†é’Ÿ
                                    </div>
                                    <div style=" padding: 0 10px;width: 200px;height: 40px;">
                                        <div style="padding-top: 10px">
                                                <Progress
                                                    :stroke-color="{
                                                        from: '#108ee9',
                                                        to: '#87d068',
                                                    }"
                                                    :percent="55.9"
                                                    status="active"
                                                    :show-info="false">
                                            </Progress>
                                        </div>
                                    </div>
                                    <div>
                                        <div>预计 </div>
                                        <div><span class="info-text">90</span>  åˆ†é’Ÿ
                                        </div>
                                    </div>
                            </div>
                            <div style="height:50px; text-align: left; padding-left: 25px; display: flex;">
                                <div class="herbInfo">
                                    <div>药材:<span class="info-text">当归</span></div>
                                    <div>投料:<span class="info-text">16</span> ç­</div>
            <div class="eqp-card" v-for="(item, index) in eqps" :key="index">
                <div class="eqp-content">
                    <div class="chart">
                        <div>
                            <div class="progress">
                                <div style="">
                                    <div>加热</div>
                                    <div></div>
                                    <span class="info-text">{{ realTime.get(item.id)?.dryTime | 0 }}</span> åˆ†é’Ÿ
                                </div>
                                <div class="herbInfo">
                                    <div>原始重量:<span class="info-text">160</span> Kg</div>
                                    <div>实时重量:<span class="info-text">70</span> Kg</div>
                                </div>
                            </div>
                        </div>
                            <div class="eqpStatus">
                                <div > <span class="info-text">运行</span>  </div>
                            </div>
                        </div>
                        <!-- <div :id="'chartDom' + item.id" class="chart"> </div> -->
                        <div class="info">
                            <div class="leftInfo">
                                <!-- <div class="herbName"> å½“å½’ </div> -->
                                <div class="eqpName">{{ item.name }}</div>
                                <div style="padding: 0 10px; width: 200px; height: 40px">
                                    <div style="padding-top: 10px">
                                        <Progress
                                            :stroke-color="{
                                                from: '#108ee9',
                                                to: '#87d068',
                                            }"
                                            :percent="realTime.get(item.id)?.percent"
                                            status="active"
                                            :show-info="false"
                                        />
                                    </div>
                                </div>
                                <div>
                                    <div>预计 </div>
                                    <div
                                        ><span class="info-text">{{ (realTime.get(item.id)?.dryTime + realTime.get(item.id)?.remain) | 0 }}</span> åˆ†é’Ÿ
                                    </div>
                                </div>
                            </div>
                            <div class="rightInfo">
                                <div style="width: 120px" >
                                    <div style="    height: 1px;
    font-size: 10px;
    text-align: center;
    margin-top: 10px;
    margin-bottom: -10px; ">初始:{{ (mois[0] * 100).toFixed(2) }}%</div>
                                    <div :id="'moisture' + item.id" style="width: 110px; height: 187px"></div>
                                    <div style="height: 1px;
    font-size: 10px;
    text-align: center;
    margin-top: -25px;">目标:{{ (mois[2] * 100).toFixed(2) }}%</div>
                                    <div style="    width: 110px;
    text-align: center;
    margin-top: 23px;">含水率</div>
                            <div style="height: 50px; text-align: left; padding-left: 25px; display: flex">
                                <div class="herbInfo">
                                    <div
                                        >药材:<span class="info-text">{{ realTime.get(item.id)?.herbName }}</span></div
                                    >
                                    <div
                                        >投料:<span class="info-text">{{ realTime.get(item.id)?.feed | 0 }}</span> ç­</div
                                    >
                                </div>
                                <div class="tempChart"    style="pointer-events: none; cursor: none;"  :id="'tempDom' + item.id">
                                    <a-slider v-model:value="tempValue"
                                     :min="0" range :max="100" :marks="marks" vertical />
                                     <div>热风:<span class="info-text">{{ tempValue[0] }}</span> Â°C</div>
                                <div class="herbInfo">
                                    <div
                                        >原始重量:<span class="info-text">{{ realTime.get(item.id)?.originWeight | 0 }}</span> Kg</div
                                    >
                                    <div
                                        >实时重量:<span class="info-text">{{ realTime.get(item.id)?.yield | 0 }}</span> Kg</div
                                    >
                                </div>
                            </div>
                        </div>
                        <div class="eqpStatus">
                            <div> <span class="info-text">翻料</span> </div>
                        </div>
                    </div>
                    <!-- <div :id="'chartDom' + item.id" class="chart"> </div> -->
                    <div class="info">
                        <div class="leftInfo">
                            <div style="width: 120px">
                                <div style="height: 1px; font-size: 10px; text-align: center; margin-top: 10px; margin-bottom: -10px"
                                    >初始:{{ realTime.get(item.id)?.initial }}%</div
                                >
                                <div :id="'moisture' + item.id" style="width: 110px; height: 187px"></div>
                                <div style="height: 1px; font-size: 10px; text-align: center; margin-top: -25px">目标:{{ realTime.get(item.id)?.target }}%</div>
                                <div style="width: 110px; text-align: center; margin-top: 23px">含水率</div>
                            </div>
                            <!-- <div class="herbName"> å½“å½’ </div> -->
                            <div style="flex: 1" @click="gotoEqp(item.id)"
                                ><div class="eqpName">{{ item.name }}</div></div
                            >
                        </div>
                        <div class="rightInfo">
                            <div class="tempChart" style="pointer-events: none; cursor: none" :id="'tempDom' + item.id">
                                <a-slider
                                    v-if="realTime.get(item.id)"
                                    v-model:value="realTime.get(item.id).tempValue"
                                    :min="0"
                                    range
                                    :max="100"
                                    :marks="marks"
                                    vertical
                                />
                                <div
                                    >热风:<span class="info-text">{{ realTime.get(item.id)?.windTemp | 0 }}</span> Â°C</div
                                >
                            </div>
                        </div>
                    </div>
@@ -92,17 +97,22 @@
</template>
<script setup lang="ts">
    import { onMounted, ref } from 'vue'
    import { onMounted, ref, onUnmounted } from 'vue'
    import { Progress } from 'ant-design-vue'
    import * as echarts from 'echarts'
    import 'echarts-liquidfill'
    import { listAll } from '../api/DryEquipment.api'
    import { dryEquipment } from '../dataDefine/DryEquipment.data'
    import { router } from '/@/router'
    import { defHttp } from '/@/utils/http/axios'
    import { useUserStore } from '/@/store/modules/user'
    const eqps = ref([] as dryEquipment[])
    const mois = ref([0.3939,0.2112,0.11])
    const mois = ref([0, 0, 0])
    const userStore = useUserStore()
    const Timer = ref()
    const tempValue = ref(<Record<number, number>>([70, 100]))
    const realTime = ref(new Map())
    const marks = ref<Record<number, any>>({
        0: '0°C',
@@ -212,7 +222,8 @@
            .then((result) => {
                console.log(`output->result`, result)
                eqps.value = result
                setTimeout(initCharts, 1000)
                setTimeout(initCharts, 500)
                updateRealTime()
            })
            .catch((err) => {
                console.log(`output->err`, err)
@@ -221,150 +232,206 @@
    // var wetCharts: Map<string, echarts.ECharts> = new Map()
        var moistureCharts: Map<String, echarts.ECharts> = new Map()
    var moistureCharts: Map<String, echarts.ECharts> = new Map()
     function initCharts() {
    //     console.log(`output->initChart`)
         eqps.value.forEach((item) => {
    //         console.log(`output->item.id`, item.id)
             let domId = 'moisture' + item.id
    //         console.log(`output->domId`, domId)
             var chartDom: HTMLElement = document.getElementById(domId) as HTMLElement
    //         console.log(`output->chartDom`, chartDom)
             let myChart = echarts.init(chartDom)
         //    var option
//              option = {
//                 grid: {
//                     left: 30,
//                     top: 15,
//                     bottom: 13,
//                     right: 45
//                 },
//   xAxis: {
//     type: 'category',
//         show: false,
//     data: ['含水率'],
//         axisLine: {
//             show: false,
//         },
//         axisTick: {
//             show: false,
//         }
//   },
//   yAxis: {
//     type: 'value',
//         axisLine: {
//             show: false,
//         },
//         min: 0,
//         max: 100,
//         axisTick: {
//             show: true,
//         },
//         splitLine: {
//             show: false
//         }
//   },
//   series: [
//     {
//       data: [20],
//       type: 'bar',
//       showBackground: true,
//       backgroundStyle: {
//         color: 'rgba(180, 180, 180, 0.2)'
//       },
//             label: {
//                 show: true,
//             },
//             barWidth: 20,
//             markLine: {
//                 symbol: 'none',
//                 data: [
//                     {symbol: 'none',
//                         xAxis:0,
//                         x:60,
//                         yAxis:60,
//                         lineStyle:{
//                             color: '#000',
//                             width:1,
//                         },
//                         label: {
//                             formatter: '初始\n'+ '{c}%'
//                         }
//                     },
//                     {symbol: 'none',
//                         xAxis:0,
//                         x:60,
//                         yAxis:11,
//                         lineStyle:{
//                             color: '#000',
//                             width:1,
//                         },
//                         label: {
//                             formatter: '目标\n'+ '{c}%'
//                         }
//                     },
    function initCharts() {
        //     console.log(`output->initChart`)
        eqps.value.forEach((item) => {
            //         console.log(`output->item.id`, item.id)
            let domId = 'moisture' + item.id
            //         console.log(`output->domId`, domId)
            var chartDom: HTMLElement = document.getElementById(domId) as HTMLElement
            //         console.log(`output->chartDom`, chartDom)
            let myChart = echarts.init(chartDom)
            //    var option
            //              option = {
            //                 grid: {
            //                     left: 30,
            //                     top: 15,
            //                     bottom: 13,
            //                     right: 45
            //                 },
            //   xAxis: {
            //     type: 'category',
            //         show: false,
            //     data: ['含水率'],
            //         axisLine: {
            //             show: false,
            //         },
            //         axisTick: {
            //             show: false,
            //         }
            //   },
            //   yAxis: {
            //     type: 'value',
//                     // {yAxis: 0},
//                     // {yAxis: 100}
//                 ]
//             }
//     },
//   ]
// };
const option = {
            //         axisLine: {
            //             show: false,
            //         },
            //         min: 0,
            //         max: 100,
            //         axisTick: {
            //             show: true,
            //         },
            //         splitLine: {
            //             show: false
            //         }
            //   },
            //   series: [
            //     {
            //       data: [20],
            //       type: 'bar',
            //       showBackground: true,
            //       backgroundStyle: {
            //         color: 'rgba(180, 180, 180, 0.2)'
            //       },
            //             label: {
            //                 show: true,
            //             },
            //             barWidth: 20,
            //             markLine: {
            //                 symbol: 'none',
            //                 data: [
            //                     {symbol: 'none',
            //                         xAxis:0,
            //                         x:60,
            //                         yAxis:60,
    series: [{
        type: 'liquidFill',
                radius: '100%',
                //waveAnimation: false,
                amplitude: 3,
        animationDuration: 5,
        //animationDurationUpdate: 0,
        data: mois.value,
                shape: 'path://M828.817,706.209C828.817,881.725,686.98,1024,512,1024c-174.98,0-316.817-142.275-316.817-317.791C195.183,530.74,512,0,512,0s316.817,530.74,316.817,706.209z',
                outline: {
            show: false
        },
                label: {
            //                         lineStyle:{
            //                             color: '#000',
            //                             width:1,
                    formatter: function(params) {
                        console.log(`output->params`,params,mois.value)
            //                         },
            //                         label: {
            //                             formatter: '初始\n'+ '{c}%'
            //                         }
            //                     },
            //                     {symbol: 'none',
            //                         xAxis:0,
            //                         x:60,
            //                         yAxis:11,
                        return ''
                        // +'初始'+(mois.value[0]*100).toFixed(2) + '%\n\n\n'
                        + (mois.value[1]*100).toFixed(2) + '%'
                        // + '\n\n\n目标'+(mois.value[2]*100).toFixed(2) + '%'
                        ;
            //                         lineStyle:{
            //                             color: '#000',
            //                             width:1,
            //                         },
            //                         label: {
            //                             formatter: '目标\n'+ '{c}%'
            //                         }
            //                     },
            //                     // {yAxis: 0},
            //                     // {yAxis: 100}
            //                 ]
            //             }
            //     },
            //   ]
            // };
            const option = {
                series: [
                    {
                        type: 'liquidFill',
                        radius: '100%',
                        //waveAnimation: false,
                        amplitude: 3,
                        animationDuration: 5,
                        //animationDurationUpdate: 0,
                        data: mois.value,
                        shape:
                            'path://M828.817,706.209C828.817,881.725,686.98,1024,512,1024c-174.98,0-316.817-142.275-316.817-317.791C195.183,530.74,512,0,512,0s316.817,530.74,316.817,706.209z',
                        outline: {
                            show: false,
                        },
                        label: {
                            formatter: function () {
                                //console.log(`output->params`,params,mois.value)
                                return (
                                    '' +
                                    // +'初始'+(mois.value[0]*100).toFixed(2) + '%\n\n\n'
                                    (mois.value[1] * 100).toFixed(2) +
                                    '%'
                                    // + '\n\n\n目标'+(mois.value[2]*100).toFixed(2) + '%'
                                )
                            },
                            fontSize: 10,
                            //position: ['50%',(100-mois.value[1]*100).toFixed(2) + '%'],
                        },
                    },
                    fontSize: 10,
                    position: ['50%',(100-mois.value[1]*100).toFixed(2) + '%'],
                ],
            }
            option && myChart.setOption(option)
            moistureCharts.set(item.id, myChart)
        })
    }
    function gotoEqp(id: string) {
        router.push('/dashboard/eqp/' + id)
    }
    function updateRealTime() {
        console.log(`output->定时刷新数据`)
        eqps.value.forEach((item) => {
            queryRealTime(item)
        })
    }
    function queryRealTime(eqp: dryEquipment) {
        let tenantId = userStore.getTenant
        let eqpCode = eqp.code
        let queryRealTimeUrl = '/dry/real/getRealTimeData'
        defHttp.get({ url: queryRealTimeUrl, params: { tenantid: tenantId, machineid: eqpCode } }).then((res) => {
            console.log(`output->res`, res)
            if (res && res.trendVo) {
                res.tempValue = [res.windTemp, 100]
                res.percent = ((res.dryTime / res.et) * 100).toFixed(2)
                res.mois = [
                    (res.trendVo.moisture / 100).toFixed(2),
                    (res.trendVo.moisture / 100 / 1.5).toFixed(2),
                    (res.trendVo.moisture / 100 / 3).toFixed(2),
                ]
                moistureCharts.get(eqp.id)?.setOption({
                    series: [
                        {
                            data: res.mois,
                            label: {
                                formatter: function () {
                                    return res.trendVo.moisture + '%'
                                },
                                fontSize: 10,
                                //position: ['50%',(100- res.trendVo.moisture)+ '%'],
                            },
                        },
                    ],
                })
            } else {
                res = {
                    tempValue: [0, 100],
                    percent: 0,
                    mois: [],
                }
    }]
};
            }
             option && myChart.setOption(option)
             moistureCharts.set(item.id, myChart)
         })
     }
            realTime.value.set(eqp.id, res)
        })
    }
    listAllEqp()
    // DOM挂载完成后渲染图表
    onMounted(() => {})
    onMounted(() => {
        Timer.value = setInterval(updateRealTime, 3000)
    })
    onUnmounted(() => {
        clearInterval(Timer.value)
        Timer.value = null
    })
</script>
<style>
<style scoped>
    .workshop {
    }
    .eqp-row {
@@ -376,6 +443,8 @@
        width: 566px;
        height: 400px;
        padding: 6px 6px;
        flex-grow: 0;
        flex-shrink: 0;
    }
    .eqp-content {
@@ -384,7 +453,7 @@
        background-image: url('../../../assets/images/dry/ganzaoji-x.png');
        background-repeat: no-repeat;
        background-size: 60% 60%;
        background-position: 10px 150px;
        background-position: 105px 150px;
        border-radius: 8px;
    }
@@ -395,30 +464,31 @@
        display: flex;
        text-align: center;
    }
    .progress {
        padding:25px 25px;
    :deep() .progress {
        padding: 25px 25px;
        width: 360px;
        display: flex;
    }
    .ant-progress-bg {
    :deep() .ant-progress-bg {
        height: 25px !important;
    }
    .eqpStatus {
        width:170px;
        background-position: 0 -10px;
        background-image: url('../../../assets/images/dry/ganzaoji.gif');
        background-size: 100% 100%;
        width: 170px;
        background-position: 0 0px;
        background-image: url('../../../assets/images/dry/refeng2.gif');
        background-size: 180px;
        background-repeat: no-repeat;
        display: inline-flex;
        flex-direction: column-reverse;
        padding: 15px;
    }
    .info {
        display: flex;
    }
    .leftInfo {
        width: 335px;
        width: 445px;
        display: flex;
        /* background: gray; */
    }
    .rightInfo {
@@ -445,29 +515,29 @@
    }
    .eqpName {
        margin-top: 68px;
        margin-left: 174px;
        margin-left: 150px;
        width: 95px;
        font-weight: bold;
        text-align: center;
        background-color: white;
        height: 22px;
    }
    .tempChart {
        padding-top: 10px;
        height: 150px;
        width: 100px;
    }
    .herbInfo {
    width: 160px;
        width: 160px;
    }
    .ant-slider-mark-text {
    :deep() .ant-slider-mark-text {
        padding-left: 15px;
        font-size: 10px;
    }
    .ant-slider-mark-text::before {
    :deep() .ant-slider-mark-text::before {
        content: '';
        display: block;
        width: 6px;
@@ -478,30 +548,30 @@
        top: 10px;
        left: 0px;
    }
    .ant-slider-rail {
    :deep() .ant-slider-rail {
        width: 6px !important;
        border-radius: 6px 6px 0 0;
        background: linear-gradient(to top, #ce0000 0%, #ce0000 40%, #ce0000 75%, rgb(160, 160, 160) 100%);
    }
    .ant-slider-track {
    :deep() .ant-slider-track {
        background: rgb(175, 175, 175);
        height: 20px;
        width: 6px !important;
        border-radius: 6px 6px 0 0;
    }
    .ant-slider-track:hover {
    :deep() .ant-slider-track:hover {
    }
    .ant-slider-handle {
    :deep() .ant-slider-handle {
        display: none;
    }
    .ant-slider-dot {
    :deep() .ant-slider-dot {
        display: none;
    }
    .ant-slider-step {
    :deep() .ant-slider-step {
        width: 10px !important;
    }
    .ant-slider-step > :first-child {
    :deep() .ant-slider-step > :first-child {
        display: block !important;
        width: 22px !important;
        height: 22px !important;
src/views/system/usersetting/UserSetting.data.ts
@@ -1,146 +1,145 @@
import { FormSchema } from '/@/components/Form/index';
import { rules } from '/@/utils/helper/validator';
import { FormSchema } from '/@/components/Form/index'
import { rules } from '/@/utils/helper/validator'
export interface ListItem {
  key: string;
  title: string;
  description: string;
  extra?: string;
  avatar?: string;
  color?: string;
    key: string
    title: string
    description: string
    extra?: string
    avatar?: string
    color?: string
}
// tab的list
export const settingList = [
  {
    key: '1',
    name: '个人信息',
    component: 'BaseSetting',
    icon:'ant-design:user-outlined'
  },
  {
    key: '2',
    name: '我的租户',
    component: 'TenantSetting',
    icon:'ant-design:team-outlined'
  },
   {
    key: '3',
    name: '账号安全',
    component: 'AccountSetting',
    icon:'ant-design:lock-outlined'
  },
  {
    key: '4',
    name: '第三方APP',
    component: 'WeChatDingSetting',
    icon: 'ant-design:contacts-outlined',
  },
];
    {
        key: '1',
        name: '个人信息',
        component: 'BaseSetting',
        icon: 'ant-design:user-outlined',
    },
    // {
    //   key: '2',
    //   name: '我的租户',
    //   component: 'TenantSetting',
    //   icon:'ant-design:team-outlined'
    // },
    //  {
    //   key: '3',
    //   name: '账号安全',
    //   component: 'AccountSetting',
    //   icon:'ant-design:lock-outlined'
    // },
    // {
    //   key: '4',
    //   name: '第三方APP',
    //   component: 'WeChatDingSetting',
    //   icon: 'ant-design:contacts-outlined',
    // },
]
/**
 * ç”¨æˆ·è¡¨å•
 */
export const formSchema: FormSchema[] = [
  {
    field: 'realname',
    component: 'Input',
    label: '姓名',
    colProps: { span: 24 },
    required:true
  },
  {
    field: 'birthday',
    component: 'DatePicker',
    label: '生日',
    colProps: { span: 24 },
    componentProps:{
      showTime:false,
      valueFormat:"YYYY-MM-DD",
      getPopupContainer: () => document.body,
    },
  },
  {
    field: 'sex',
    component: 'RadioGroup',
    label: '性别',
    colProps: { span: 24 },
    componentProps:{
      options: [
        {
          label: '男',
          value: 1,
        },
        {
          label: '女',
          value: 2,
        },
      ],
    }
  },
  {
    field: 'relTenantIds',
    component: 'JDictSelectTag',
    label: '租户',
    colProps: { span: 24 },
    componentProps:{
      mode:'multiple',
      dictCode:'sys_tenant,name,id',
      disabled:true
    }
  },
  {
    field: 'post',
    component: 'JDictSelectTag',
    label: '职位',
    colProps: { span: 24 },
    componentProps:{
      mode:'multiple',
      dictCode:'sys_position,name,code',
      disabled:true
    }
  },
  {
    label: '',
    field: 'id',
    component: 'Input',
    show: false,
  },
    {
        field: 'realname',
        component: 'Input',
        label: '姓名',
        colProps: { span: 24 },
        required: true,
    },
    {
        field: 'birthday',
        component: 'DatePicker',
        label: '生日',
        colProps: { span: 24 },
        componentProps: {
            showTime: false,
            valueFormat: 'YYYY-MM-DD',
            getPopupContainer: () => document.body,
        },
    },
    {
        field: 'sex',
        component: 'RadioGroup',
        label: '性别',
        colProps: { span: 24 },
        componentProps: {
            options: [
                {
                    label: '男',
                    value: 1,
                },
                {
                    label: '女',
                    value: 2,
                },
            ],
        },
    },
    {
        field: 'relTenantIds',
        component: 'JDictSelectTag',
        label: '租户',
        colProps: { span: 24 },
        componentProps: {
            mode: 'multiple',
            dictCode: 'sys_tenant,name,id',
            disabled: true,
        },
    },
    {
        field: 'post',
        component: 'JDictSelectTag',
        label: '职位',
        colProps: { span: 24 },
        componentProps: {
            mode: 'multiple',
            dictCode: 'sys_position,name,code',
            disabled: true,
        },
    },
    {
        label: '',
        field: 'id',
        component: 'Input',
        show: false,
    },
]
//密码弹窗
export const formPasswordSchema: FormSchema[] = [
  {
    label: '用户账号',
    field: 'username',
    component: 'Input',
    componentProps: { readOnly: true },
  },
  {
    label: '旧密码',
    field: 'oldpassword',
    component: 'InputPassword',
    required: true,
  },
  {
    label: '新密码',
    field: 'password',
    component: 'StrengthMeter',
    componentProps: {
      placeholder: '请输入新密码',
    },
    rules: [
      {
        required: true,
        message: '请输入新密码',
      },
    ],
  },
  {
    label: '确认新密码',
    field: 'confirmpassword',
    component: 'InputPassword',
    dynamicRules: ({ values }) => rules.confirmPassword(values, true),
  },
];
    {
        label: '用户账号',
        field: 'username',
        component: 'Input',
        componentProps: { readOnly: true },
    },
    {
        label: '旧密码',
        field: 'oldpassword',
        component: 'InputPassword',
        required: true,
    },
    {
        label: '新密码',
        field: 'password',
        component: 'StrengthMeter',
        componentProps: {
            placeholder: '请输入新密码',
        },
        rules: [
            {
                required: true,
                message: '请输入新密码',
            },
        ],
    },
    {
        label: '确认新密码',
        field: 'confirmpassword',
        component: 'InputPassword',
        dynamicRules: ({ values }) => rules.confirmPassword(values, true),
    },
]