From 8d4c67323bee47d6225f150e9f61868c6434a358 Mon Sep 17 00:00:00 2001
From: zhaowei <zhaowei>
Date: 星期三, 03 九月 2025 17:48:01 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/views/dashboard/eamIndex/EamManagerSignage.vue |  435 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 435 insertions(+), 0 deletions(-)

diff --git a/src/views/dashboard/eamIndex/EamManagerSignage.vue b/src/views/dashboard/eamIndex/EamManagerSignage.vue
new file mode 100644
index 0000000..acfafe0
--- /dev/null
+++ b/src/views/dashboard/eamIndex/EamManagerSignage.vue
@@ -0,0 +1,435 @@
+<template>
+  <div class="outer-container">
+    <div class="left-container">
+      <a-card title="鎶�鏈姸鎬�">
+        <a-spin class="spinning-container" :spinning="spinning1">
+          <div id="tech_condition_chart" style="width:100%;height: 100%;"></div>
+        </a-spin>
+      </a-card>
+
+      <a-card title="璁惧鎶ヤ慨鏁呴殰">
+        <a-spin class="spinning-container" :spinning="spinning2">
+          <div id="warranty_malfunction_chart" style="width:100%;height: 100%;"></div>
+        </a-spin>
+      </a-card>
+    </div>
+
+
+    <div class="right-container">
+      <div class="right-top-container">
+        <a-card title="涓変繚璁″垝">
+          <div class="support-plan-container">
+            <div v-for="(item,index) in maintenanceEleList" :key="index" class="support-plan-item">
+              <div>{{item.planTime}}</div>
+              <div class="plan-value-container">
+                <div class="plan-value">{{$data.thirdMaintenanceParams[item.planValueLabel]}}</div>
+                <div>鍙�</div>
+              </div>
+            </div>
+          </div>
+        </a-card>
+        <a-card title="浜屼繚璁″垝">
+          <div class="support-plan-container">
+            <div v-for="(item,index) in maintenanceEleList" :key="index" class="support-plan-item">
+              <div>{{item.planTime}}</div>
+              <div class="plan-value-container">
+                <div class="plan-value">{{$data.secondMaintenanceParams[item.planValueLabel]}}</div>
+                <div>鍙�</div>
+              </div>
+            </div>
+          </div>
+        </a-card>
+      </div>
+
+      <a-card title="鎴戠殑寰呭姙" class="right-bottom-container">
+        <a slot="extra" href="#" @click="$router.push('/flowable/workflow/FlowTodo')">鏇村</a>
+
+        <todo-list ref="todoList"
+                   :defaultCategories="['equipment_transfer','equipment_scrap','spare_part_apply','equipment_seal_up','equipment_unseal','equipment_return','sbdjApproval','eam_repair','equipment_lean_out','second_maintenance','third_maintenance']"
+        />
+      </a-card>
+    </div>
+  </div>
+</template>
+
+<script>
+  import TodoList from '../TodoList'
+  import signageApi from '@/api/signage'
+
+  export default {
+    name: 'EamManagerSignage',
+    components: { TodoList },
+    data() {
+      return {
+        spinning1: false,
+        spinning2: false,
+        techConditionChart: '',
+        warrantyMalfunctionChart: '',
+        thirdMaintenanceParams: {
+          thisMonthMaintenancePlanNum: 0,
+          thisMonthMaintenanceRealNum: 0,
+          nextMonthMaintenancePlanNum: 0,
+          maintenanceOverdueNum: 0
+        },
+        secondMaintenanceParams: {
+          thisMonthMaintenancePlanNum: 0,
+          thisMonthMaintenanceRealNum: 0,
+          nextMonthMaintenancePlanNum: 0,
+          maintenanceOverdueNum: 0
+        },
+        maintenanceEleList: [
+          {
+            planTime: '鏈湀璁″垝',
+            planValueLabel: 'thisMonthMaintenancePlanNum',
+            backgroundColor: '#719D8E',
+            code: 'bysbzs'
+          },
+          {
+            planTime: '鏈湀瀹屾垚',
+            planValueLabel: 'thisMonthMaintenanceRealNum',
+            backgroundColor: '#409EFF',
+            code: 'bwc'
+          },
+          {
+            planTime: '涓嬫湀璁″垝',
+            planValueLabel: 'nextMonthMaintenancePlanNum',
+            backgroundColor: '#A8985D',
+            code: 'xysb'
+          },
+          {
+            planTime: '瓒呮湡',
+            planValueLabel: 'maintenanceOverdueNum',
+            backgroundColor: '#E86A6A',
+            code: ''
+          }
+        ]
+      }
+    },
+    mounted() {
+      window.addEventListener('resize', this.handleWindowResize)
+      this.getChartDataByApi()
+      this.$refs.todoList.loadData(1)
+    },
+    beforeDestroy() {
+      window.removeEventListener('resize', this.handleWindowResize)
+    },
+    methods: {
+      /* 璋冪敤鎺ュ彛鑾峰彇鍥捐〃鏁版嵁姹囨�绘柟娉� */
+      getChartDataByApi() {
+        this.getTechConditionDataByApi()
+        this.getWarrantyMalfunctionDataByApi()
+        this.getThirdMaintenanceConditionByApi()
+        this.getSecondMaintenanceConditionByApi()
+      },
+
+      /* 璋冪敤鎺ュ彛鑾峰彇鎶�鏈姸鎬� */
+      getTechConditionDataByApi() {
+        this.techConditionChart = this.$echarts.init(document.getElementById('tech_condition_chart'))
+        this.spinning1 = true
+        signageApi.getEquipmentTechnologyStatusApi()
+          .then(res => {
+            if (res.success && res.result) {
+              this.techConditionData = [
+                {
+                  value: res.result.length > 0 ? res.result[0].qualifiedCount : 0,
+                  name: '鍚堟牸'
+                },
+                {
+                  value: res.result.length > 0 ? res.result[0].limitedUseCount : 0,
+                  name: '闄愮敤'
+                },
+                {
+                  value: res.result.length > 0 ? res.result[0].disabledCount : 0,
+                  name: '绂佺敤'
+                }
+              ]
+              this.drawTechConditionChart()
+            }
+          })
+      },
+
+      /* 璋冪敤鎺ュ彛鑾峰彇鏁呴殰鎶ヤ慨 */
+      getWarrantyMalfunctionDataByApi() {
+        this.warrantyMalfunctionChart = this.$echarts.init(document.getElementById('warranty_malfunction_chart'))
+        this.spinning2 = true
+        signageApi.getReportRepairEquipmentApi()
+          .then(res => {
+            if (res.success && res.result) {
+              this.warrantyMalfunctionData = [
+                {
+                  value: res.result.length > 0 ? res.result[0].noStopCount : 0,
+                  name: '杩愯'
+                },
+                {
+                  value: res.result.length > 0 ? res.result[0].failurTotalCount : 0,
+                  name: '鎶ヤ慨'
+                },
+                {
+                  value: res.result.length > 0 ? res.result[0].stopCount : 0,
+                  name: '鍋滄満'
+                }
+              ]
+              this.drawWarrantyMalfunctionChart()
+            }
+          })
+      },
+
+      /* 璋冪敤鎺ュ彛鑾峰彇涓変繚鎯呭喌 */
+      getThirdMaintenanceConditionByApi() {
+        signageApi.getThirdMaintenancePlanApi()
+          .then(res => {
+            if (res.success && res.result) {
+              this.thirdMaintenanceParams.thisMonthMaintenancePlanNum = res.result.thisMonthCount
+              this.thirdMaintenanceParams.thisMonthMaintenanceRealNum = res.result.thisMonthFinishCount
+              this.thirdMaintenanceParams.nextMonthMaintenancePlanNum = res.result.nextMonthCount
+              this.thirdMaintenanceParams.maintenanceOverdueNum = res.result.thisMonthOverdueCount
+            }
+          })
+      },
+
+      /* 璋冪敤鎺ュ彛鑾峰彇浜屼繚鎯呭喌 */
+      getSecondMaintenanceConditionByApi() {
+        signageApi.getSecondMaintenancePlanApi()
+          .then(res => {
+            if (res.success && res.result) {
+              this.secondMaintenanceParams.thisMonthMaintenancePlanNum = res.result.thisMonthCount
+              this.secondMaintenanceParams.thisMonthMaintenanceRealNum = res.result.thisMonthFinishCount
+              this.secondMaintenanceParams.nextMonthMaintenancePlanNum = res.result.nextMonthCount
+              this.secondMaintenanceParams.maintenanceOverdueNum = res.result.thisMonthOverdueCount
+            }
+          })
+      },
+
+      /* 缁樺埗鎶�鏈姸鎬侀ゼ鍥� */
+      drawTechConditionChart() {
+        const option = {
+          tooltip: {
+            trigger: 'item',
+            formatter: function(params) {
+              return '<span style="font-weight:bolder;">' + params.name + '</span><br/>' +
+                '<span style="display:inline-block; width:10px; height:10px; border-radius:100px; margin-right:5px; background:' + params.color + '"></span>' + `${params.value}锛�${params.percent}%锛塦
+            }
+          },
+          legend: {
+            bottom: 0,
+            right: 'center',
+            itemWidth: 14,
+            itemHeight: 14,
+            itemGap: 15,
+            textStyle: {
+              color: 'inherit',
+              fontSize: 14
+            },
+            data: ['鍚堟牸', '闄愮敤', '绂佺敤']
+          },
+          grid: {
+            containLabel: true
+          },
+          series: [
+            {
+              type: 'pie',
+              radius: ['40%', '55%'],
+              center: ['50%', '40%'],
+              color: [
+                '#4DC794',
+                '#3DB1F6',
+                '#F76E6D'
+              ],
+              label: {
+                position: 'outside',
+                show: true,
+                color: 'inherit',
+                fontSize: 16,
+                formatter: function(params) {
+                  if (params.name !== '') {
+                    return `${params.name}:${params.value}`
+                  }
+                }
+              },
+              labelLine: {
+                show: true,
+                length2: 15,
+                length: 15,
+                lineStyle: {
+                  color: 'rgba(0,0,0,.45)'
+                }
+              },
+              data: this.techConditionData
+            }
+          ]
+        }
+        this.techConditionChart.setOption(option, true)
+        this.spinning1 = false
+      },
+
+      /* 缁樺埗璁惧鎶ヤ慨鏁呴殰楗煎浘 */
+      drawWarrantyMalfunctionChart() {
+        const option = {
+          tooltip: {
+            trigger: 'item',
+            formatter: function(params) {
+              return '<span style="font-weight:bolder;">' + params.name + '</span><br/>' +
+                '<span style="display:inline-block; width:10px; height:10px; border-radius:100px; margin-right:5px; background:' + params.color + '"></span>' + `${params.value}锛�${params.percent}%锛塦
+            }
+          },
+          legend: {
+            bottom: 0,
+            right: 'center',
+            itemWidth: 14,
+            itemHeight: 14,
+            itemGap: 15,
+            textStyle: {
+              color: 'inherit',
+              fontSize: 14
+            },
+            data: ['杩愯', '鎶ヤ慨', '鍋滄満']
+          },
+          grid: {
+            containLabel: true
+          },
+          series: {
+            type: 'pie',
+            radius: ['40%', '55%'],
+            center: ['50%', '40%'],
+            color: [
+              '#4DC794',
+              '#3DB1F6',
+              '#F76E6D'
+            ],
+            label: {
+              position: 'outside',
+              show: true,
+              color: 'inherit',
+              fontSize: 16,
+              formatter: function(params) {
+                if (params.name !== '') {
+                  return `${params.name}:${params.value}`
+                }
+              }
+            },
+            labelLine: {
+              show: true,
+              length2: 15,
+              length: 15
+            },
+            data: this.warrantyMalfunctionData
+          }
+        }
+        this.warrantyMalfunctionChart.setOption(option, true)
+        this.spinning2 = false
+      },
+
+      /**
+       * 绐楀彛灏哄鍙樺寲鏃惰Е鍙�
+       * 璋冩暣鍥捐〃灏哄浠ラ�傚簲鍒嗚鲸鐜�
+       */
+      handleWindowResize() {
+        if (this.techConditionChart) this.techConditionChart.resize()
+        if (this.warrantyMalfunctionChart) this.warrantyMalfunctionChart.resize()
+      }
+    }
+  }
+</script>
+
+<style scoped lang="less">
+  @container-margin: 10px;
+
+  .outer-container {
+    display: flex;
+    justify-content: space-between;
+    height: 100vh;
+
+    .left-container {
+      width: 30%;
+      height: 100%;
+      margin-right: @container-margin;
+
+      & > div:first-child {
+        margin-bottom: @container-margin;
+      }
+
+      /deep/ .ant-card {
+        height: calc(100% / 2 - (@container-margin / 2));
+        display: flex;
+        flex-direction: column;
+
+        .ant-card-body {
+          flex: 1;
+        }
+      }
+    }
+
+    .right-container {
+      width: 70%;
+      height: 100%;
+      display: flex;
+      flex-direction: column;
+
+      .right-top-container {
+        display: flex;
+        margin-bottom: @container-margin;
+
+        /deep/ .ant-card {
+          flex: 1;
+
+          &:first-child {
+            margin-right: @container-margin;
+          }
+          .ant-card-body {
+            padding: 0;
+          }
+        }
+
+        .support-plan-container {
+          display: flex;
+          justify-content: space-around;
+          flex-wrap: wrap;
+
+          .support-plan-item {
+            border-radius: 3px;
+            width: calc(100% / 2);
+            padding: 25px;
+            text-align: center;
+            border-left: 1px solid #e8e8e8;
+            border-bottom: 1px solid #e8e8e8;
+
+            .plan-value-container {
+              margin-top: 5px;
+              display: flex;
+              justify-content: center;
+              align-items: center;
+
+              .plan-value {
+                margin-right: 10px;
+                font-size: 30px;
+              }
+            }
+          }
+        }
+      }
+
+      .right-bottom-container {
+        flex: 1;
+        overflow: hidden;
+        display: flex;
+        flex-direction: column;
+        & ::-webkit-scrollbar {
+          width: 6px; /* 婊氬姩鏉″搴� */
+        }
+
+        /deep/ .ant-card-body {
+          padding: 6px 24px 12px;
+          flex: 1;
+          overflow: auto;
+        }
+      }
+    }
+  }
+
+  .spinning-container {
+    height: 100%;
+    /deep/ .ant-spin-container {
+      height: 100%;
+    }
+  }
+</style>
\ No newline at end of file

--
Gitblit v1.9.3