Compare commits

129 Commits

Author SHA1 Message Date
e238691040 Merge pull request 'lb' (#27) from lb into master
Reviewed-on: #27
2023-02-01 10:02:31 +08:00
lb
942da81c4f update V3dApp data.js 2023-02-01 09:57:44 +08:00
lb
637d181638 update 3doverview 2023-01-31 17:02:23 +08:00
159edc9fc3 Merge pull request 'lb' (#26) from lb into master
Reviewed-on: #26
2023-01-31 16:13:18 +08:00
lb
0eaf7fd13e Merge branch 'master' into lb 2023-01-31 16:06:00 +08:00
lb
c98608a941 update 修改公用工程消耗氧气CDA天然气值 2023-01-31 15:55:55 +08:00
4d7d2e0c3d Merge pull request 'lb' (#25) from lb into master
Reviewed-on: #25
2022-12-16 09:02:44 +08:00
lb
50670208c1 update remote url 2022-12-16 08:38:32 +08:00
SanDiego
f0714123b7 update gotoHome 2022-12-15 16:50:59 +08:00
lb
4200801c7b update公用工程 2022-12-05 11:22:18 +08:00
lb
f4ba65a25f update 实时产量和能耗时间为近7天 2022-12-02 16:44:12 +08:00
989f9b9976 Merge pull request 'update remove首页二字' (#23) from lb into master
Reviewed-on: #23
2022-12-02 14:09:47 +08:00
lb
4f91525bea update remove首页二字 2022-12-02 14:01:52 +08:00
9b3d8b4926 Merge pull request 'lb' (#22) from lb into master
Reviewed-on: #22
2022-12-01 08:57:55 +08:00
lb
fedff36ff0 Merge branch 'master' into lb 2022-12-01 08:55:17 +08:00
62bb4c05e8 Merge pull request '1' (#21) from zjl into master
Reviewed-on: #21
2022-11-28 16:53:01 +08:00
b812a8eb01 1 2022-11-28 16:51:17 +08:00
lb
4026826869 update small blur box 2022-11-28 15:42:09 +08:00
792496f685 Merge pull request '修改' (#20) from zjl into master
Reviewed-on: #20
2022-11-28 15:40:36 +08:00
6378239090 修改 2022-11-28 15:39:42 +08:00
3cbe02f50a Merge pull request '工单管理' (#19) from zjl into master
Reviewed-on: #19
2022-11-28 15:04:10 +08:00
c113ad3588 工单管理 2022-11-28 15:02:51 +08:00
29dfb47b4b Merge pull request 'lb' (#18) from lb into master
Reviewed-on: #18
2022-11-28 10:47:27 +08:00
lb
6e6a0ce257 update 2022-11-28 09:46:51 +08:00
lb
4cd6f748a9 update 2022-11-28 09:45:49 +08:00
lb
3e10beb7a6 update 2022-11-28 09:34:09 +08:00
lb
3964f8541e update 设备管理scrollbar 2022-11-28 09:15:18 +08:00
86a5d3737c Merge pull request 'lb' (#17) from lb into master
Reviewed-on: #17
2022-11-25 16:46:40 +08:00
lb
8184ee8a6f Merge branch 'master' into lb 2022-11-25 16:14:44 +08:00
lb
70b47b1ec0 update 3d index 2022-11-25 16:12:40 +08:00
lb
fbe6cf41e4 update tooltip for all 2022-11-25 15:43:03 +08:00
lb
ff0bda0dba update 2022-11-25 15:10:35 +08:00
lb
582ac98a52 update 质量tooltip 2022-11-25 14:01:58 +08:00
lb
7f79481a35 update 质量,产线缺陷分析居中一点 2022-11-25 13:13:09 +08:00
lb
7c2aadc19a update 各个tooltip样式 2022-11-25 11:59:54 +08:00
lb
f96854fa29 update 质量tooltip样式 2022-11-25 11:09:24 +08:00
569dd81dd7 Merge pull request 'zjl' (#16) from zjl into master
Reviewed-on: #16
2022-11-25 10:02:21 +08:00
8667da0332 merge master 2022-11-25 10:01:20 +08:00
f06bb38e48 11.24修改 2022-11-25 09:59:38 +08:00
lb
6aa7afb555 update 质量管理数据 2022-11-25 09:25:03 +08:00
lb
0b9dfa27ab update data 2022-11-24 17:01:30 +08:00
lb
2f9f9f90bc update 3d 报警提示 2022-11-24 16:46:18 +08:00
lb
71e6f2eb85 update 3d 设备数据 2022-11-24 16:36:51 +08:00
lb
705da46633 update 3d,实时产量 2022-11-24 16:31:23 +08:00
lb
c943481826 update 质量,产品成品率 2022-11-24 16:11:48 +08:00
lb
df8ffa3676 update 3d 设备数据 2022-11-24 16:08:20 +08:00
lb
e756b39e6c update 生产监控实时数据 2022-11-24 15:33:08 +08:00
lb
123cdd59a5 update 班组交接班记录 2022-11-24 15:30:56 +08:00
lb
be18358b9c update 设备当前状态 2022-11-24 15:19:13 +08:00
lb
eb525fce24 update 设备巡检管理 2022-11-24 15:17:15 +08:00
lb
899b9fa879 update 质量 2022-11-24 15:02:30 +08:00
lb
9e48b2103a update 2022-11-24 13:43:45 +08:00
lb
3db6ac92fe update 产线缺陷 2022-11-24 13:38:53 +08:00
lb
f37dfbb328 update 产品成品率 2022-11-24 11:06:06 +08:00
lb
539235fcfb update 3d 公用工程 2022-11-24 09:45:11 +08:00
935943e33b Merge pull request '11.23修改' (#15) from zjl into master
Reviewed-on: #15
2022-11-24 09:20:58 +08:00
f21ea0bc99 11.23修改 2022-11-24 09:20:27 +08:00
lb
d8592611b6 update 缺陷分析 2022-11-23 17:00:25 +08:00
lb
e9ac894a4a update 产线成品 2022-11-23 16:57:30 +08:00
lb
59b40fefe9 update 实时产量 2022-11-23 16:27:27 +08:00
lb
779a771bb5 update 公用工程消耗 2022-11-23 14:03:56 +08:00
lb
97ee3a9a4c update 3d 完成度颜色 2022-11-23 09:55:29 +08:00
aa1461c298 Merge pull request 'lb' (#14) from lb into master
Reviewed-on: #14
2022-11-23 09:44:39 +08:00
lb
34c8b29348 update 3d homepage 2022-11-23 09:43:14 +08:00
lb
2819cf2efc update 2022-11-23 09:38:50 +08:00
lb
fa2d99d43f update 公用工程消耗 2022-11-23 09:34:01 +08:00
lb
22dc4ff1d7 update 实时产量和能耗 2022-11-23 09:29:47 +08:00
lb
ec3e364117 Merge branch 'master' into lb 2022-11-22 17:00:24 +08:00
lb
7552e09aeb update 2022-11-22 16:58:49 +08:00
lb
890a1be63c update 更新3d缺陷分类分析 2022-11-22 16:44:05 +08:00
lb
cfcfdd35ea update 更新3d产线产品率 2022-11-22 16:31:15 +08:00
lb
01cc292256 update 更新3d小框 2022-11-22 16:04:33 +08:00
lb
5e38ee38d6 update 质量管理设备参数追溯 2022-11-22 15:30:31 +08:00
lb
a699f99156 update 质量管理 techy-analysis-header 2022-11-22 14:29:12 +08:00
lb
5ded44a5de update 质量管理 techy-analysis-header 2022-11-22 14:26:12 +08:00
lb
bf6ecba045 update 质量管理 2022-11-22 13:21:44 +08:00
lb
4055142b3c update 设备管理 2022-11-22 10:19:31 +08:00
lb
76ada17b63 update 2022-11-21 17:05:12 +08:00
lb
d2f875e487 update 2022-11-21 15:47:42 +08:00
lb
4297d5c804 update 质量管理,产品成品率 2022-11-21 15:40:16 +08:00
lb
6df938da04 update 3d techy-bar 2022-11-21 15:22:04 +08:00
lb
41fba93d47 finish TechyBar 2022-11-21 14:55:22 +08:00
lb
a75d632902 update TechyBar 2022-11-21 14:34:03 +08:00
d056f545b6 Merge pull request 'zjl' (#13) from zjl into master
Reviewed-on: #13
2022-11-18 17:10:24 +08:00
14f819795d marge 2022-11-18 17:09:31 +08:00
4c700e05e6 Merge pull request 'lb' (#12) from lb into master
Reviewed-on: #12
2022-11-18 17:04:50 +08:00
lb
9dd1f27481 update 质量缺陷分析的标题+legend 2022-11-18 17:02:11 +08:00
2a2325e901 修改样式 2022-11-18 17:01:42 +08:00
lb
5e78b4b5da update 2022-11-18 15:03:18 +08:00
lb
9b8f796100 update 2022-11-18 14:50:57 +08:00
lb
f09c048cf0 Merge branch 'master' into lb 2022-11-18 13:25:42 +08:00
lb
b072de6cb3 update 2022-11-18 13:24:37 +08:00
lb
ef59b5a358 update 质量管理工序质量分析 2022-11-18 11:35:02 +08:00
lb
df6cdf8f13 update 质量管理,产线缺陷月对比 2022-11-18 10:15:57 +08:00
lb
d89eb46f58 update 质量管理,产线缺陷日对比 2022-11-18 10:05:57 +08:00
lb
3a882ba735 update 设备管理 2022-11-18 09:44:19 +08:00
480a545544 Merge pull request '物料大屏' (#11) from zjl into master
Reviewed-on: #11
2022-11-17 17:00:07 +08:00
722f87df4d 物料大屏 2022-11-17 16:57:36 +08:00
lb
6b031d6e06 update 质量-产品成品率 2022-11-17 16:54:55 +08:00
lb
16a335d71f update 质量-产品成品率 2022-11-17 16:42:24 +08:00
lb
934d308730 update 质量-产线缺陷分析 2022-11-17 16:17:44 +08:00
lb
cb8d705309 update 质量-产线缺陷分析 2022-11-17 15:58:46 +08:00
lb
dcdfcb9f6c update 3d 2022-11-17 15:13:44 +08:00
lb
8428141a30 update 3d公用工程消耗 2022-11-17 14:15:22 +08:00
lb
2d3d0d4a3a update 3d实时监控 2022-11-17 14:03:32 +08:00
lb
00be50ed95 update 3d工序质量分析 2022-11-17 13:49:47 +08:00
lb
97901a0278 update 3d实时产量和能耗 2022-11-17 11:30:11 +08:00
lb
19f673b45f update 3d设备巡检提示 2022-11-17 10:55:51 +08:00
lb
7f2ee35c29 update 3d产线成品率 2022-11-17 10:53:00 +08:00
lb
760342ddbb update 3d缺陷分类分析 2022-11-17 10:26:16 +08:00
lb
81a8f5de47 before adjusting color 2022-11-17 09:50:17 +08:00
lb
e5ed3b092c update 报表管理 2022-11-17 09:31:02 +08:00
a0b70cbd59 Merge pull request '工单&物料' (#10) from zjl into master
Reviewed-on: #10
2022-11-17 08:57:53 +08:00
d39bb981ec 工单&物料 2022-11-17 08:55:51 +08:00
lb
4f4453045a update 设备数据 2022-11-16 17:00:33 +08:00
lb
c309be87eb update data 2022-11-16 15:47:10 +08:00
lb
177cab9b2f update data 2022-11-16 15:31:39 +08:00
lb
d518683750 update testtree 2022-11-16 10:10:08 +08:00
f01052d96f Merge pull request 'lb' (#9) from lb into master
Reviewed-on: #9
2022-11-16 08:54:20 +08:00
lb
a1f0249e76 Merge branch 'master' into lb 2022-11-16 08:47:49 +08:00
lb
86b69caad8 update 3d techybox layout 2022-11-15 16:19:05 +08:00
lb
a767b0a14c update 系统管理ui 2022-11-15 13:53:02 +08:00
lb
59d90eabb3 update 用户管理 2022-11-15 10:09:07 +08:00
add78fef04 Merge pull request 'gtz' (#7) from gtz into master
Reviewed-on: #7
2022-11-11 16:15:11 +08:00
gtz
a363453ead 'del_public.rar' 2022-11-11 16:13:56 +08:00
gtz
3f8e059f53 'align-left' 2022-11-11 16:10:45 +08:00
gtz
bd640ee0dc Merge branch 'master' of git.picaiba.com:mt-fe-group/11-mes-new 2022-11-10 16:47:18 +08:00
gtz
1da845e9b4 '1' 2022-11-10 16:47:04 +08:00
dd24092830 Merge pull request 'lb' (#6) from lb into master
Reviewed-on: #6
2022-11-10 15:52:33 +08:00
76 changed files with 5093 additions and 2703 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

After

Width:  |  Height:  |  Size: 195 KiB

View File

@@ -127,6 +127,14 @@ export function rateFormatter(rateObj) {
}
}
export function rateFormatter2(rateObj) {
if (rateObj) {
return rateObj + '%'
} else {
return '0.00%'
}
}
export function amountFormatter(param) {
if (param) {
return parseFloat(param).toFixed(2)

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>矩形备份 25</title>
<defs>
<rect id="path-1" x="0" y="234" width="6" height="6" rx="3"></rect>
<filter x="-100.0%" y="-100.0%" width="300.0%" height="300.0%" filterUnits="objectBoundingBox" id="filter-2">
<feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
<feOffset dx="0" dy="0" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 1 0 0 0 0 0.301960784 0 0 0 0 0.0666666667 0 0 0 0.5 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
</defs>
<g id="2MES。2-6蓝底-7、8白底" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="2-2工单管理" transform="translate(-1784.000000, -561.000000)">
<g id="编组-16备份-6" transform="translate(1016.000000, 229.000000)">
<g id="编组-19" transform="translate(32.000000, 64.000000)">
<g id="编组-28备份-4" transform="translate(736.000000, 8.000000)">
<g id="矩形备份-25" transform="translate(4.000000, 30.000000)">
<use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
<use fill="#FF4D11" fill-rule="evenodd" xlink:href="#path-1"></use>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -1,7 +1,7 @@
<template>
<div class="navbar" :style="showTitle ? 'background: rgba(8,17,50,0.25)' : ''">
<div v-if="showTitle" class="homeNavIcon" @click="goToRootPage">
<img src="../../assets/img/cnbm.png" alt="" />
<img src="../../assets/img/cnbm.png" alt="">
<span>
{{ 'title' | i18nFilter }}
</span>
@@ -25,9 +25,9 @@
:icon-class="showTitle ? 'home' : 'homeb'"
style="height: calc(24px * var(--beilv)); width: calc(24px * var(--beilv)); vertical-align: calc(-7px * var(--beilv)); margin-right: 2px;"
/>
<span v-if="showhome">
<!-- <span v-if="showhome">
{{ 'navbar.homepage' | i18nFilter }}
</span>
</span> -->
</div>
<el-dropdown
:style="showTitle ? 'color: #fff' : '#000'"
@@ -97,7 +97,7 @@
trigger="click"
>
<div class="avatar-wrapper">
<img :src="require('@/assets/img/head.png')" class="user-avatar" />
<img :src="require('@/assets/img/head.png')" class="user-avatar">
<div class="avatar-username" :title="username">{{ username }}</div>
<div class="avatar-roles" :title="roles.join(',')">{{ roles.length > 0 ? roles[0] : '' }}</div>
<!-- <i class="el-icon-caret-bottom" /> -->
@@ -144,7 +144,7 @@
<el-tooltip class="item" effect="dark" placement="bottom-end">
<div slot="content">
{{ 'copyright.copyright' | i18nFilter }}{{ 'copyright.company' | i18nFilter }}
<br />
<br>
{{ 'copyright.version' | i18nFilter }}3.0
</div>
<svg-icon
@@ -248,7 +248,8 @@ export default {
const password = Cookie.get('password')
if (username && password) {
window.location = `http://192.168.1.103:9527/#/?username=${username}&password=${password}`
window.location = `http://main.cnbmai.picaiba.com/#/?username=${username}&password=${password}`
// window.location = `http://192.168.1.103:9527/#/?username=${username}&password=${password}`
}
},
winBlur() {

View File

@@ -5,73 +5,85 @@
<script>
import echarts from 'echarts'
import resize from '@/views/OperationalOverview/components/mixins/resize'
import { Random } from 'mockjs'
import moment from 'moment'
export default {
name: 'DianLineChart',
mixins: [resize],
/** Fn.1: 保证全屏切换时也刷新图表 应该在每个父组件为flex:1的echarts组件里都加上以确保能正确地伸缩 */
inject: ['resizeStatus'],
/** End Fn.1 */
props: {
id: {
type: String,
default: 'default-dian-id'
},
title: {
type: String,
default: 'default-title'
},
xData: {
type: Array,
default: () => []
},
seriesData: {
type: Array,
default: () => []
}
},
data() {
const colors = ['#E02094', '#F0D63C', '#1A99FF']
class ChartOption {
constructor() {
this.color = ['#E02094', '#F0D63C', '#1A99FF']
// const computeInterval = numArr => Math.floor(numArr.reduce((p, c) => p + c, 0) / numArr.length / 10) * 10
let data = [
// 温度走势
[90, 93, 95, 96, 95, 90, 89, 84, 60, 77, 93, 93.5],
// 电流走势
[60, 72, 69, 77, 72, 70, 71, 69.5, 55, 60, 70.5, 71],
// 电压走势
[45, 50, 55, 60, 65, 78, 63, 66, 54, 62, 72, 73]
]
let wendu = data[0]
let dianliu = data[1]
let dianya = data[2]
return {
chart: null,
option: {
color: colors,
legend: {
top: 4,
this.legend = {
top: 11,
right: 32,
itemWidth: 8,
itemHeight: 8,
textStyle: {
color: '#fff9',
fontSize: 8
fontSize: 10
}
// data: ['ABC三相电压/v', 'ABC三相电流/a', '电缆温度']
},
grid: {
top: 32,
}
this.grid = {
top: 36,
left: 64,
bottom: 28
bottom: 36
}
this.tooltip = {
show: true,
trigger: 'axis',
// position: [200,10],
// position: ['25%', '25%'],
position: pointer => {
return [pointer[1], 0]
},
xAxis: [
{
axisPointer: {
type: 'line',
axis: 'x',
lineStyle: {
color: '#7BFFFB',
type: 'dotted'
}
},
padding: 10,
backgroundColor: 'rgba(13, 29, 53, 0.8)',
extraCssText: 'width: auto !important; height: auto !important;',
formatter: params => {
return `
<div style="display: flex; flex-direction: column; gap: calc(4px * var(--beilv));">
<h2 style="font-size: calc(14px * var(--beilv)); margin: 0 0 4px; font-weight: normal; color: white;">${
params[0].axisValue
}</h2>
<span style="display: flex; align-items: center; gap: 8px;"><span style="width: 10px; height: 10px; border-radius: 5px; background: ${
this.color[0]
}"></span><span>${params[0].seriesName}: ${params[0].value}V</span></span>
<span style="display: flex; align-items: center; gap: 8px;"><span style="width: 10px; height: 10px; border-radius: 5px; background: ${
this.color[1]
}"></span><span>${params[1].seriesName}: ${params[1].value}%</span></span>
<span style="display: flex; align-items: center; gap: 8px;"><span style="width: 10px; height: 10px; border-radius: 5px; background: ${
this.color[2]
}"></span><span>${params[2].seriesName}: ${params[2].value}°C</span></span>
</div>
`
}
}
this.xAxis = {
type: 'category',
data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
// boundaryGap: false,
data: Array(7)
.fill(1)
.map((_, idx) => {
const d = moment()
const day = idx ? d.subtract(idx, 'd') : d
return day.format('M-DD')
})
.reverse(),
axisTick: { show: false },
axisLabel: {
color: '#fff9'
color: '#fff9',
fontSize: 12,
margin: 10
},
axisLine: {
lineStyle: {
@@ -79,16 +91,16 @@ export default {
}
}
}
],
yAxis: [
this.yAxis = [
{
name: '电流/A',
nameTextStyle: { align: 'right', fontSize: 9, color: '#fff9' },
name: '电流/A ',
nameTextStyle: { align: 'right', fontSize: 10, color: '#fff9' },
type: 'value',
splitNumber: 4,
onZero: true,
position: 'left',
offset: 42,
offset: 28,
axisTick: { show: false },
axisLine: {
show: true,
@@ -99,18 +111,20 @@ export default {
},
axisLabel: {
color: '#fff9',
fontSize: 10
fontSize: 10,
formatter: '{value}%'
},
splitLine: {
show: false
// lineStyle: {
// color: '#fff3'
// }
show: false,
lineStyle: {
color: '#fff1',
type: 'dotted'
}
}
},
{
name: '电压/V',
nameTextStyle: { align: 'right', fontSize: 9, color: '#fff9' },
name: ' 电压/V ',
nameTextStyle: { align: 'right', fontSize: 10, color: '#fff9' },
type: 'value',
splitNumber: 4,
axisTick: { show: false },
@@ -129,15 +143,16 @@ export default {
fontSize: 10
},
splitLine: {
show: false
// lineStyle: {
// color: '#fff3'
// }
show: true,
lineStyle: {
color: '#fff3',
type: 'dotted'
}
}
},
{
name: '温度',
nameTextStyle: { align: 'left', color: '#fff9', fontSize: 9 },
name: ' 温度',
nameTextStyle: { align: 'left', color: '#fff9', fontSize: 10 },
axisTick: { show: false },
axisLine: {
show: false,
@@ -146,41 +161,98 @@ export default {
width: 1
}
},
// min: 'dataMin',
min: 20,
max: 50,
type: 'value',
splitNumber: 4,
splitLine: {
show: false,
lineStyle: {
color: '#fff3'
color: '#fff1',
type: 'dotted'
}
},
axisLabel: {
color: '#fff9',
fontSize: 10
fontSize: 10,
formatter: '{value}°C'
}
}
],
series: [
]
this.series = [
{
name: 'ABC三相电压/v',
type: 'line',
yAxisIndex: 0,
// smooth: true,
emphasis: {
focus: 'series'
},
data: dianliu,
symbol: 'none'
},
{
name: 'ABC三相电流/a',
name: '电压',
type: 'line',
yAxisIndex: 1,
// smooth: true,
emphasis: {
focus: 'series'
},
data: dianya,
symbol: 'none'
data: Array(7)
.fill(1)
// .map(_ => Random.integer(30, 100)),
.map(_ => Random.integer(360, 390)),
symbol: 'circle',
symbolSize: 0.2,
showSymbol: false,
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: '#E0209466' // 0% 处的颜色
},
{
offset: 1,
color: 'transparent' // 100% 处的颜色
}
],
global: false // 缺省为 false
}
}
},
{
name: '电流',
type: 'line',
yAxisIndex: 0,
// smooth: true,
emphasis: {
focus: 'series'
},
data: Array(7)
.fill(1)
.map(_ => Random.integer(76, 85)),
// .map(_ => Random.integer(30, 100)),
symbol: 'circle',
symbolSize: 0.2,
showSymbol: false,
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: '#F0D63C66' // 0% 处的颜色
},
{
offset: 1,
color: 'transparent' // 100% 处的颜色
}
],
global: false // 缺省为 false
}
}
},
{
name: '电缆温度',
@@ -190,11 +262,84 @@ export default {
emphasis: {
focus: 'series'
},
data: wendu,
symbol: 'none'
data: Array(7)
.fill(1)
// .map(_ => Random.integer(20, 55)),
.map(_ => Random.integer(36, 45)),
symbol: 'circle',
symbolSize: 0.2,
showSymbol: false,
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: '#1A99FF66' // 0% 处的颜色
},
{
offset: 1,
color: 'transparent' // 100% 处的颜色
}
],
global: false // 缺省为 false
}
}
}
]
}
get option() {
return this
}
optionFilter(option, calcSize = () => {} /** callback */) {
let newOption
if (Array.isArray(option)) {
newOption = []
option.forEach(item => {
newOption.push(this.optionFilter(item, calcSize))
})
return newOption
} else if (typeof option === 'object') {
newOption = {}
for (const key in option) {
if (key === 'colorStops') newOption[key] = option[key]
else if (
typeof option[key] === 'number' /** 过滤不做变化的属性 */ &&
['splitNumber', 'x', 'x2', 'min', 'max', 'y', 'y2', 'yAxisIndex', 'xAxisIndex'].indexOf(key) === -1
) {
newOption[key] = calcSize(option[key])
} else newOption[key] = this.optionFilter(option[key], calcSize)
}
return newOption
} else {
newOption = calcSize(option)
return option
}
}
}
export default {
name: 'DianLineChart',
mixins: [resize],
/** Fn.1: 保证全屏切换时也刷新图表 应该在每个父组件为flex:1的echarts组件里都加上以确保能正确地伸缩 */
inject: ['resizeStatus'],
/** End Fn.1 */
props: {
id: {
type: String,
default: 'default-dian-line-chart'
}
},
data() {
return {
chart: null,
option: null
}
},
computed: {
@@ -212,14 +357,23 @@ export default {
mounted() {
this.$nextTick(() => {
if (!this.chart) this.chart = echarts.init(this.$refs['techy-line-chart'])
this.chart.setOption(this.option)
this.setChartOption()
})
},
beforeDestroy() {
if (this.chart) this.chart.dispose()
this.chart = null
},
methods: {}
methods: {
calcSize(num) {
const beilv = document.documentElement.style.getPropertyValue('--beilv')
return num * beilv
},
setChartOption() {
const cOption = new ChartOption()
this.chart.setOption(cOption.optionFilter(cOption.option, this.calcSize))
}
}
}
</script>
<style scoped>

View File

@@ -1,5 +1,5 @@
<template>
<div :id="id" ref="techy-line-chart" class="techy-chart" />
<div id="techy-line-chart" ref="techy-line-chart" class="techy-chart" />
</template>
<script>
@@ -13,22 +13,7 @@ export default {
inject: ['resizeStatus'],
/** End Fn.1 */
props: {
id: {
type: String,
default: 'default-fadian-id'
},
title: {
type: String,
default: 'default-title'
},
xData: {
type: Array,
default: () => []
},
seriesData: {
type: Array,
default: () => []
}
},
data() {
return {
@@ -46,11 +31,20 @@ export default {
color: ['#E02094', '#F0D63C', '#1A99FF'],
grid: {
top: '30%',
left: 0,
left: '120%',
right: '5%',
bottom: 0,
containLabel: true
},
// tooltip: {
// show: true,
// trigger: 'axis',
// axisPointer: {
// type: 'line',
// axis: 'x'
// },
// extraCssText: 'position: absolute; width: 152px !important; height: 100px !important;'
// },
xAxis: {
type: 'category',
boundaryGap: false,
@@ -62,7 +56,7 @@ export default {
show: false
},
axisLabel: {
fontSize: 8,
fontSize: 10,
color: '#fffa'
},
axisLine: {
@@ -83,14 +77,16 @@ export default {
show: false
},
axisLabel: {
fontSize: 8,
fontSize: 10,
color: '#fffa'
// formatter: '{value} %'
},
axisTick: { show: false },
splitLine: {
show: true,
lineStyle: {
color: '#fff3'
color: '#fff1',
type: 'dotted'
}
}
},

View File

@@ -9,37 +9,6 @@
:table-config="tableProps"
:table-data="tableData"
></TechyTable>
<!-- <el-table
key="LeftContentEquipmentCheck1"
border
:data="tableData"
:header-cell-style="{ background: 'rgba(79,114,136,0.29)' }"
>
<el-table-column label="设备名称" prop="eqName" align="center" />
<el-table-column label="所属产线" prop="pl" align="center" />
<el-table-column label="提示等级" prop="warningLevel" align="center">
<template slot-scope="scope">
<PriorityComponent :injectData="scope.row"></PriorityComponent>
</template>
</el-table-column>
<el-table-column label="巡检内容" prop="checkContent" align="center" />
</el-table>
</div> -->
<!-- <div class="el-table-wrapper">
<el-table
key="LeftContentEquipmentCheck2"
border
:data="tableData2"
:header-cell-style="{ background: 'rgba(79,114,136,0.29)' }"
>
<el-table-column label="设备名称" prop="eqName" />
<el-table-column label="所属产线" prop="pl" />
<el-table-column label="提示等级" prop="warningLevel" />
<el-table-column label="提示等级" prop="checkContent" />
</el-table>
</div> -->
</div>
</div>
</template>
@@ -68,11 +37,6 @@ const PriorityComponent = {
{
style: {
display: 'inline-block',
// borderRadius: '2px',
// padding: '2px 6px',
// color: '#fff',
// opacity: '0.6',
// fontSize: '12px',
borderRadius: 'calc(2px * var(--beilv))',
padding: 'calc(2px * var(--beilv)) calc(6px * var(--beilv))',
color: '#fff',
@@ -89,20 +53,31 @@ const PriorityComponent = {
const tableProps = [
{ prop: 'eqName', label: '设备名称', align: 'center', 'min-width': 120 },
{ prop: 'pl', label: '所属产线', align: 'center', 'min-width': 100 },
{ prop: 'warningLevel', label: '提示等级', align: 'center', 'min-width': 100, subcomponent: PriorityComponent },
// { prop: 'pl', label: '所属产线', align: 'center', 'min-width': 100 },
{ prop: 'warningLevel', label: '提示等级', align: 'center', 'min-width': 70, subcomponent: PriorityComponent },
{ prop: 'checkContent', label: '巡检内容', align: 'center', 'min-width': 120 }
]
const tableData = [
{ eqName: 'A下片机', pl: '产线1', priority: 1, checkContent: '巡检内容' },
{ eqName: 'A下片机', pl: '产线1', priority: 2, checkContent: '巡检内容' },
{ eqName: 'A下片机', pl: '产线1', priority: 3, checkContent: '巡检内容' },
{ eqName: 'A下片机', pl: '产线1', priority: 4, checkContent: '巡检内容' },
{ eqName: 'A下片机', pl: '产线1', priority: 4, checkContent: '巡检内容' },
{ eqName: 'A下片机', pl: '产线1', priority: 3, checkContent: '巡检内容' },
{ eqName: '设备B', pl: '产线1', priority: 2, checkContent: '巡检内容' },
{ eqName: '下片机', pl: '产线3', warningLevel: 3, checkContent: '巡检内容' },
{ eqName: '磨片机', pl: '产线2', warningLevel: 2, checkContent: '巡检内容' }
{ eqName: 'A1钢化', pl: 'A', priority: 1, checkContent: '表面检测光源和相机的卫生' },
// { eqName: '一镀', pl: 'A', priority: 1, checkContent: '辊道下方的碎玻璃清理' },
{ eqName: 'B2钢化', pl: 'B', priority: 3, checkContent: '边角检测设备水平的校正' },
{ eqName: 'B1冷却机', pl: 'B', priority: 2, checkContent: '表面检测光源和相机的卫生' },
// { eqName: '预热', pl: 'A', priority: 1, checkContent: '辊道下方的碎玻璃清理' },
{ eqName: 'B1钢后清洗机', pl: 'B', priority: 3, checkContent: '检查每日不良是否存在误检' },
{ eqName: 'B2磨边', pl: 'B', priority: 3, checkContent: '设备表面的卫生' },
{ eqName: 'B1打孔', pl: 'B', priority: 2, checkContent: '边角检测光源和相机的卫生' },
{ eqName: 'B1磨边后清洗机', pl: 'B', priority: 1, checkContent: '边角检测光源和相机的卫生' },
// { eqName: '冷却', pl: 'B', priority: 1, checkContent: '辊道下方的碎玻璃清理' },
// { eqName: '丝印', pl: 'B', priority: 3, checkContent: '操作台保持整洁' },
// { eqName: '丝印', pl: 'A', priority: 2, checkContent: '检查每日不良是否存在误检' },
{ eqName: 'B1钢化', pl: 'B', priority: 2, checkContent: '检查每日不良是否存在误检' },
// { eqName: '冷却', pl: 'A', priority: 2, checkContent: '辊道下方的碎玻璃清理' },
{ eqName: 'A1下片', pl: 'A', priority: 1, checkContent: '水冷机内水量充足并且清洁' },
{ eqName: 'A2钢化', pl: 'A', priority: 2, checkContent: '操作台保持整洁' },
// { eqName: '预热', pl: 'B', priority: 3, checkContent: '水冷机内水量充足并且清洁' },
{ eqName: 'A3磨边后清洗机', pl: 'A', priority: 2, checkContent: '水冷机内水量充足并且清洁' },
{ eqName: 'B3上片', pl: 'B', priority: 3, checkContent: '边角检测光源和相机的卫生' },
// { eqName: '预热', pl: 'A', priority: 2, checkContent: '表面检测光源和相机的卫生' }
]
export default {
@@ -125,7 +100,7 @@ export default {
}
.left-content-equipment-check {
height: calc(100% - 32px);
height: calc(100% - calc(32px * var(--beilv)));
display: flex;
gap: calc(100vmin / 1920 * 36);
overflow: hidden;
@@ -155,7 +130,7 @@ export default {
color: #fff9;
border: 0;
height: 100%;
overflow-y: auto;
/* overflow-y: auto; */
}
.el-table-wrapper >>> .el-table th.is-leaf,

View File

@@ -25,8 +25,9 @@ export default {
<style scoped>
.left-content-monitoring {
flex: 1;
width: 100%;
height: calc(100% - 32px);
height: calc(100% - calc(32px * var(--beilv)));
display: flex;
gap: calc(100vw / 1920 * 16);
}

View File

@@ -1,58 +1,6 @@
<template>
<div class="left-content-order fix-table">
<techy-table :page="1" :limit="8" :show-index="false" :table-config="tableProps" :table-data="tableData" />
<!--
<el-table
key="LeftContentOrder1"
border
:data="tableData"
:header-cell-style="{ background: 'rgba(79,114,136,0.29)' }"
height="100%"
>
<el-table-column
label="订单编号"
prop="orderCode"
:show-overflow-tooltip="true"
:resizable="true"
align="center"
/>
<el-table-column
label="客户名称"
prop="clientName"
:show-overflow-tooltip="true"
:resizable="true"
align="center"
/>
<el-table-column label="规格" prop="specs" :resizable="true" align="center" :width="100" />
<el-table-column label="完成度" prop="finished" :resizable="true" align="center" :width="100">
<template slot-scope="scope">
<el-progress
class="lb-progress-bar"
type="circle"
:percentage="scope.row.finished"
:width="14"
:stroke-width="2"
color="#47FF27"
/>
</template>
</el-table-column>
</el-table>
</div> -->
<!-- <div class="el-table-wrapper">
<el-table
key="LeftContentOrder2"
border
:data="tableData2"
:header-cell-style="{ background: 'rgba(79,114,136,0.29)' }"
>
<el-table-column label="订单编号" prop="orderCode" :show-overflow-tooltip="true" :resizable="true" />
<el-table-column label="客户名称" prop="clientName" :show-overflow-tooltip="true" :resizable="true" />
<el-table-column label="规格" prop="specs" :resizable="true" />
<el-table-column label="完成度" prop="finished" :resizable="true" />
</el-table>
</div> -->
</div>
</template>
@@ -67,24 +15,16 @@ const ProcessCircle = {
default: () => ({})
}
},
mounted() {
console.log('finished', this.injectData.finished)
},
methods: {},
render: function(h) {
return h('el-progress', {
class: {
'lb-progress-bar': true
},
props: {
type: 'circle',
percentage: this.injectData.finished,
width: 14,
'stroke-width': 2,
color: '#47FF27'
},
style: {
color: 'blue'
color: '#47FF27',
'define-back-color': '#ffffff' // 背景色, 该选项不起作用,可能和 element ui 版本相关
}
})
}
@@ -97,13 +37,26 @@ const tableProps = [
{ prop: 'finished', label: '完成度', align: 'center', 'min-width': 80, subcomponent: ProcessCircle }
]
const tableData = [
{ orderCode: 'DD202200910', clientName: '中建材', specs: '50cm', finished: 80 },
{ orderCode: 'DD202200911', clientName: '蚌埠研究院', specs: '5mm', finished: 40 },
{ orderCode: 'DD202200912', clientName: '中建材', specs: '50cm', finished: 77 },
{ orderCode: 'DD202200913', clientName: '国资委', specs: '50cm', finished: 66 },
{ orderCode: 'DD202200914', clientName: '合肥新能源', specs: '50cm', finished: 55 },
{ orderCode: 'DD202200915', clientName: '中信科技', specs: '50cm', finished: 77 },
{ orderCode: 'DD202200916', clientName: 'H', specs: '50cm', finished: 33 }
{ orderCode: 'ODFG20210724195124', clientName: '阿特斯阳光电力集团', specs: '3.2-1032*1747', finished: 72 },
{ orderCode: 'ODPG20220712231003', clientName: '阳光能源控股有限公司', specs: '2.0-1128*1716', finished: 67 },
{ orderCode: 'ODFG20210819002810', clientName: '浙江正泰新能源开发有限公司', specs: '3.2-1128*1716', finished: 46 },
{ orderCode: 'ODPG20201003193028', clientName: '阿特斯阳光电力集团', specs: '2.0-1128*2251', finished: 89 },
{ orderCode: 'ODPG20200113134639', clientName: '协鑫集成科技股份有限公司', specs: '3.2-1128*1718', finished: 54 },
{ orderCode: 'ODFG20211115145712', clientName: '晶科能源股份有限公司', specs: '3.2-1033*2089', finished: 93 },
{ orderCode: 'ODFG20211102234340', clientName: '浙江正泰新能源开发有限公司', specs: '3.2-1032*1747', finished: 57 },
{ orderCode: 'ODFG20200303145849', clientName: '晶澳太阳能科技股份有限公司', specs: '2.0-1128*2272', finished: 76 },
{ orderCode: 'ODFG20220208030640', clientName: '苏州中来光伏新材股份有限公司', specs: '2.0-1128*2251', finished: 62 },
{ orderCode: 'ODFG20200916123727', clientName: '常州亿晶光电科技有限公司', specs: '3.2-1128*1718', finished: 23 },
{ orderCode: 'ODFG20200117065400', clientName: '晶澳太阳能科技股份有限公司', specs: '3.2-1033*2089', finished: 75 },
{ orderCode: 'ODPG20211020214146', clientName: '英利绿色能源控股有限公司', specs: '3.2-1128*1716', finished: 44 },
{ orderCode: 'ODPG20221015223506', clientName: '阿特斯阳光电力集团', specs: '2.0-1128*2272', finished: 3 },
{ orderCode: 'ODFG20211112131234', clientName: '江苏赛拉弗光伏系统有限公司', specs: '3.2-1128*1716', finished: 90 },
{ orderCode: 'ODPG20200411040019', clientName: '阳光能源控股有限公司', specs: '3.2-1033*2089', finished: 4 },
{ orderCode: 'ODPG20220622002234', clientName: '苏州中来光伏新材股份有限公司', specs: '3.2-1128*1718', finished: 43 },
{ orderCode: 'ODPG20220806035106', clientName: '江苏赛拉弗光伏系统有限公司', specs: '3.2-1128*1716', finished: 60 },
{ orderCode: 'ODPG20220530081525', clientName: '晶科能源股份有限公司', specs: '2.0-1128*2272', finished: 21 },
{ orderCode: 'ODPG20210228222705', clientName: '阿特斯阳光电力集团', specs: '3.2-1128*1718', finished: 75 },
{ orderCode: 'ODPG20210408102029', clientName: '常州亿晶光电科技有限公司', specs: '3.2-1128*1718', finished: 99 }
]
export default {
@@ -138,4 +91,8 @@ export default {
left: calc(-2px * var(--beilv));
color: #ffffffb3 !important;
}
.left-content-order >>> .el-progress-circle__track {
stroke: #283851;
}
</style>

View File

@@ -1,15 +1,15 @@
<template>
<div class="public-consume__inner">
<div>
<div style="min-height: calc(106px * var(--beilv)); flex: 1;">
<TechyBox class="water-consume">
<div class="header-part">
<img src="./assets/consume/s.png" width="32" height="32" alt="water" />
<img src="./assets/consume/s.png" width="32" height="32" alt="water">
<span></span>
</div>
<div class="content-part">
<div class="row">
<span class="name"> &nbsp;&nbsp;&nbsp;</span>
<span class="diy-process-bar color-1" />
<span class="diy-process-bar bar-width-1 color-1" />
<span class="amount">
39m
<sup>3</sup>
@@ -17,91 +17,91 @@
</div>
<div class="row">
<span class="name">循环水</span>
<span class="diy-process-bar color-2" />
<span class="amount">
239m
<sup>3</sup>
</span>
</div>
<div class="row">
<span class="name">自来水</span>
<span class="diy-process-bar color-3" />
<span class="diy-process-bar bar-width-2 color-2" />
<span class="amount">
23m
<sup>3</sup>
</span>
</div>
<div class="row">
<span class="name">自来水</span>
<span class="diy-process-bar bar-width-3 color-3" />
<span class="amount">
239m
<sup>3</sup>
</span>
</div>
</div>
</TechyBox>
</div>
<div>
<div style="min-height: calc(106px * var(--beilv)); flex: 1;">
<TechyBox class="gas-consume">
<div class="header-part ">
<img src="./assets/consume/gas.png" width="32" height="32" alt="qi" />
<img src="./assets/consume/gas.png" width="32" height="32" alt="qi">
<span></span>
</div>
<div class="content-part">
<div class="row">
<span class="name">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="diy-process-bar color-1" />
<span class="diy-process-bar bar-width-4 color-1" />
<span class="amount">
39Pa
0.42MPa
</span>
</div>
<div class="row">
<span class="name">CDA</span>
<span class="diy-process-bar color-2" />
<span class="diy-process-bar bar-width-5 color-2" />
<span class="amount">
239pa
0.61MPa
</span>
</div>
<div class="row">
<span class="name">天然气</span>
<span class="diy-process-bar color-3" />
<span class="diy-process-bar bar-width-6 color-3" />
<span class="amount">
23Pa
0.31MPa
</span>
</div>
</div>
</TechyBox>
</div>
<div style="min-height: calc(110px * var(--beilv)); flex: 1;">
<div style="min-height: calc(168px * var(--beilv)); flex: 1;">
<TechyBox class="dian-consume">
<div class="header-part">
<img src="./assets/consume/d.png" width="32" height="32" alt="dian" />
<img src="./assets/consume/d.png" width="32" height="32" alt="dian">
<span></span>
</div>
<div style="height: 100%; flex: 1;">
<DianChart />
<div style="height: 100%; flex: 1; overflow: hidden">
<DianChart id="dian" key="dian" />
</div>
</TechyBox>
</div>
<div style="min-height: calc(110px * var(--beilv)); flex: 1;">
<!-- <div style="min-height: calc(144px * var(--beilv)); flex: 1;">
<TechyBox class="elec-consume">
<div class="header-part">
<img src="./assets/consume/fad.png" width="32" height="32" alt="fadian" />
<span>发电</span>
</div>
<div style="height: 100%; flex: 1; padding: calc(8px * var(--beilv))">
<FadianChart />
<div style="height: 100%; flex: 1; overflow: hidden">
<DianChart id="fa-dian" key="fa-dian" />
</div>
</TechyBox>
</div>
</div> -->
</div>
</template>
<script>
import TechyBarChart from './TechyBarChart.vue'
import TechyLineChart from './TechyLineChart.vue'
// import TechyBarChart from './TechyBarChart.vue'
// import TechyLineChart from './TechyLineChart.vue'
import TechyBox from './TechyBox.vue'
import FadianChart from './FadianChart.vue'
// import FadianChart from './FadianChart.vue'
import DianChart from './DianChart.vue'
export default {
name: 'LeftContentPublicConsume',
components: { TechyBarChart, TechyBox, FadianChart, DianChart, TechyLineChart },
components: { TechyBox, DianChart },
data() {
return {}
},
@@ -115,7 +115,7 @@ export default {
.public-consume__inner {
overflow: hidden;
overflow-y: auto;
height: calc(100% - 32px);
height: calc(100% - calc(32px * var(--beilv)));
width: 100%;
display: flex;
flex-direction: column;
@@ -152,16 +152,23 @@ export default {
.header-part > span {
color: #fffc;
font-size: calc(12px * var(--beilv));
line-height: calc(12px * var(--beilv));
white-space: nowrap;
}
.content-part {
display: flex;
flex-direction: column;
font-size: calc(12px * var(--beilv));
color: #fff9;
height: 10px;
justify-content: center;
/* height: calc(48px * var(--beilv)); */
flex: 1 1;
gap: calc(4px * var(--beilv));
gap: calc(10px * var(--beilv));
color: #fff9;
}
.content-part span.name {
font-size: calc(12px * var(--beilv));
line-height: calc(14px * var(--beilv));
}
.row {
@@ -179,6 +186,7 @@ export default {
.row > .amount {
text-align: right;
width: 15%;
}
.diy-process-bar {
@@ -199,6 +207,25 @@ export default {
height: 100%;
}
.bar-width-1::after {
width: 60%;
}
.bar-width-2::after {
width: 34%;
}
.bar-width-3::after {
width: 99%;
}
.bar-width-4::after {
width: 42%;
}
.bar-width-5::after {
width: 61%;
}
.bar-width-6::after {
width: 31%;
}
.diy-process-bar.color-1::after {
background: linear-gradient(to right, #178be9, #67b3f2);
}

View File

@@ -9,35 +9,6 @@
:table-config="tableProps"
:table-data="tableData"
></TechyTable>
<!--
<el-table
key="RightContentAlertTable"
border
:data="tableData"
:header-cell-style="{ background: 'rgba(79,114,136,0.29)' }"
>
<el-table-column
label="设备名称"
prop="eqName"
:show-overflow-tooltip="true"
:resizable="true"
align="center"
/>
<el-table-column
label="所属产线"
prop="plName"
:show-overflow-tooltip="true"
:resizable="true"
align="center"
/>
<el-table-column label="故障等级" prop="priority" :resizable="true" align="center">
<template slot-scope="scope">
<PriorityComponent :injectData="scope.row"></PriorityComponent>
</template>
</el-table-column>
<el-table-column label="故障内容" prop="content" :resizable="true" align="center" />
<el-table-column label="累计时间(min)" prop="duration" :resizable="true" align="center" :width="128" />
</el-table> -->
</div>
</div>
</template>
@@ -66,11 +37,6 @@ const PriorityComponent = {
{
style: {
display: 'inline-block',
// borderRadius: '2px',
// padding: '2px 6px',
// color: '#fff',
// opacity: '0.6',
// fontSize: '12px',
borderRadius: 'calc(2px * var(--beilv))',
padding: 'calc(2px * var(--beilv)) calc(6px * var(--beilv))',
color: '#fff',
@@ -86,26 +52,46 @@ const PriorityComponent = {
}
const tableProps = [
{ prop: 'eqName', label: '设备名称', align: 'center', 'min-width': 100 },
{ prop: 'plName', label: '所属产线', align: 'center', 'min-width': 100 },
{ prop: 'priority', label: '提示等级', align: 'center', 'min-width': 100, subcomponent: PriorityComponent },
{ prop: 'content', label: '巡检内容', align: 'center', 'min-width': 120 },
{ prop: 'duration', label: '累计时间(min)', align: 'center', 'min-width': 128 }
{ prop: 'eqName', label: '设备名称', align: 'center', 'min-width': 90 },
// { prop: 'plName', label: '所属产线', align: 'center', 'min-width': 90 },
{ prop: 'priority', label: '提示等级', align: 'center', 'min-width': 70, subcomponent: PriorityComponent },
{ prop: 'content', label: '报警内容', align: 'center', 'min-width': 120 },
{ prop: 'duration', label: '累计时间(min)', align: 'center', 'min-width': 125 }
]
const tableData = [
{ eqName: 'A1下片机', plName: 'A', content: '123456', priority: 3, duration: '10min' },
{ eqName: '磨片机', plName: 'A', content: '123456', priority: 2, duration: '20min' },
{ eqName: 'B2钢化', plName: 'B', content: 'JQKA', priority: 1, duration: '30min' },
{ eqName: '上片机', plName: 'C', content: 'xxx', priority: 3, duration: '2min' },
{ eqName: '清洗机', plName: 'B', content: 'wowowowo', priority: 2, duration: '3min' }
{ eqName: 'B1磨边', plName: 'B', content: '磨轮过载', priority: 1, duration: '30 min' },
{ eqName: 'A2丝印', plName: 'A', content: '网版推出异常', priority: 2, duration: '57 min' },
{ eqName: 'B1打孔后清洗', plName: 'B', content: '毛刷过载', priority: 3, duration: '17 min' },
{ eqName: 'B1固化', plName: 'B', content: '传动变频器故障', priority: 2, duration: '22 min' },
{ eqName: 'A钢化', plName: 'A', content: '加热炉体超温报警', priority: 2, duration: '23 min' },
{ eqName: 'B2磨边', plName: 'B', content: '磨轮过载', priority: 3, duration: '6 min' },
{ eqName: 'B1磨边', plName: 'B', content: '磨轮过载', priority: 2, duration: '23 min' },
{
eqName: 'A2磨边后清洗',
plName: 'A',
content: '进料检测异常',
priority: 2,
duration: '18 min'
},
{ eqName: 'A3打孔后清洗', plName: 'A', content: '进料检测异常', priority: 1, duration: '48 min' },
{ eqName: 'A3磨边', plName: 'A', content: '磨轮过载', priority: 3, duration: '29 min' },
{ eqName: 'A2钢化后清洗', plName: 'A', content: '进料检测异常', priority: 1, duration: '47 min' },
{ eqName: 'A2下片', plName: 'A', content: '磨轮过载', priority: 2, duration: '49 min' },
{
eqName: 'A3钢化后清洗',
plName: 'A',
content: '输送变频报警',
priority: 2,
duration: '33 min'
}
]
export default {
name: 'RightContentAlert',
components: { TechyTable },
data() {
return {tableProps, tableData }
return { tableProps, tableData }
},
created() {},
mounted() {},
@@ -121,7 +107,7 @@ export default {
}
.right-content-alert {
height: calc(100% - 32px);
height: calc(100% - calc(32px * var(--beilv)));
display: flex;
gap: calc(100vw / 1920 * 16);
overflow: hidden;
@@ -151,7 +137,7 @@ export default {
color: #fff9;
border: 0;
height: 100%;
overflow-y: auto;
/* overflow-y: auto; */
}
.el-table-wrapper >>> .el-table th.is-leaf,

View File

@@ -1,6 +1,11 @@
<template>
<div class="right-content-quality-analysis">
<div :id="id" ref="fault-pie-chart" class="fault-pie-chart" />
<div
:id="id"
ref="fault-pie-chart"
class="right-content-quality-analysis"
style="position: absolute; top: 0; left: 0; width: 100%; height: 100%"
>
<!-- <div :id="id" ref="fault-pie-chart" class="fault-pie-chart" /> -->
</div>
</template>
@@ -48,7 +53,7 @@ export default {
},
{
type: 'linear',
x: 1,
x: 0.5,
y: 1,
x2: 0,
y2: 0,
@@ -61,7 +66,7 @@ export default {
},
{
type: 'linear',
x: 1,
x: 0.5,
y: 1,
x2: 0,
y2: 0,
@@ -75,9 +80,9 @@ export default {
{
type: 'linear',
x: 0,
y: 1,
x2: 0,
y2: 0,
y: 0.5,
x2: 1,
y2: 0.5,
colorStops: [
{ color: '#FFFFFF00', offset: 0 },
{ color: '#49FBD600', offset: 0.1 },
@@ -88,11 +93,11 @@ export default {
]
const demoData = [
{ value: 55, name: 'A' },
{ value: 33, name: 'B' },
{ value: 22, name: 'C' },
{ value: 11, name: 'D' },
{ value: 32, name: 'E' }
{ value: 107, name: '破片' },
{ value: 146, name: '崩边' },
{ value: 43, name: '脏污' },
{ value: 83, name: '划擦伤' },
{ value: 20, name: '崩孔' }
]
return {
@@ -101,9 +106,9 @@ export default {
configs: {
title: {
textAlign: 'center',
left: '63%',
top: '35%',
text: '33039',
left: '67%',
top: '50%',
text: demoData.reduce((prev, curr) => prev + curr.value, 0),
textStyle: {
color: '#fff',
fontSize: 16,
@@ -117,13 +122,15 @@ export default {
fontWeight: 'lighter'
}
},
legend: {
selectedMode: false,
top: 0,
bottom: 0,
left: -10,
left: 0,
orient: 'vertical',
icon: 'none',
itemGap: 5,
itemGap: 8,
itemWidth: 10,
formatter: function(name) {
// test data - dynamic
@@ -163,7 +170,6 @@ export default {
borderRadius: 5,
height: 10,
backgroundColor: '#FB418C'
// backgroundColor: '#1A99FF'
},
d: {
// verticalAlign: 'top',
@@ -172,7 +178,6 @@ export default {
borderRadius: 5,
height: 10,
backgroundColor: '#DDB112'
// backgroundColor: '#A691FF'
},
e: {
// verticalAlign: 'top',
@@ -181,7 +186,6 @@ export default {
borderRadius: 5,
height: 10,
backgroundColor: '#1A99FF'
// backgroundColor: '#FB418C'
},
f: {
// verticalAlign: 'top',
@@ -190,7 +194,6 @@ export default {
borderRadius: 5,
height: 10,
backgroundColor: '#A691FF'
// backgroundColor: '#49FBD6'
},
g: {
// verticalAlign: 'top',
@@ -199,7 +202,6 @@ export default {
borderRadius: 5,
height: 10,
backgroundColor: '#49FBD6'
// backgroundColor: '#DDB112'
}
}
}
@@ -207,10 +209,11 @@ export default {
series: [
{
silent: true,
name: 'PieForm',
type: 'pie',
center: ['65%', '50%'],
radius: ['60%', '80%'],
center: ['68%', '61%'],
radius: ['42%', '60%'],
avoidLabelOverlap: true,
label: {
formatter: params => {
@@ -287,24 +290,27 @@ export default {
return beilv * baseSize
},
applyChartOption() {
const fs1 = this.calcFontsize(1 /** px*/)
const fs3 = this.calcFontsize(3 /** px*/)
// const fs1 = this.calcFontsize(1 /** px*/)
// const fs3 = this.calcFontsize(3 /** px*/)
const fs5 = this.calcFontsize(5 /** px*/)
const fs8 = this.calcFontsize(8 /** px*/)
const fs10 = this.calcFontsize(10 /** px*/)
const fs14 = this.calcFontsize(14 /** px*/)
const fs12 = this.calcFontsize(12 /** px*/)
const fs16 = this.calcFontsize(16 /** px*/)
const titleSize = this.calcFontsize(22 /** px*/)
const subtitleSize = this.calcFontsize(14 /** px*/)
this.configs.title.textStyle.fontSize = fs14
this.configs.title.subtextStyle.fontSize = fs10
this.configs.title.textStyle.fontSize = titleSize
this.configs.title.subtextStyle.fontSize = subtitleSize
this.configs.legend.top = '10%'
this.configs.legend.itemGap = 0
this.configs.legend.top = '26%'
this.configs.legend.left = fs8
this.configs.legend.itemGap = fs8
this.configs.legend.itemWidth = fs8
this.configs.legend.textStyle.rich.a.fontSize = fs10
this.configs.legend.textStyle.rich.a.fontSize = fs12
this.configs.legend.textStyle.rich.a.lineHeight = fs16
this.configs.legend.textStyle.rich.b.fontSize = fs10
this.configs.legend.textStyle.rich.b.fontSize = fs12
// this.configs.legend.textStyle.rich.b.lineHeight = fs16
this.configs.legend.textStyle.rich.c.width = fs8
this.configs.legend.textStyle.rich.c.height = fs8
@@ -335,9 +341,9 @@ export default {
</script>
<style scoped>
.right-content-quality-analysis {
/* .right-content-quality-analysis {
height: calc(100% - 32px);
}
} */
.fault-pie-chart {
height: 100%;

View File

@@ -1,67 +1,97 @@
<template>
<div style="height: calc(100% - 36px); width: 100%;">
<div :id="id" ref="techy-line-chart" class="techy-chart" />
</div>
<div ref="techy-line-chart" style="position: absolute; top: 0; left: 0; height: 100%; width: 100%; " />
</template>
<script>
import echarts from 'echarts'
import resize from '@/views/OperationalOverview/components/mixins/resize'
import { Random } from 'mockjs'
import moment from 'moment'
export default {
name: 'ProductRateLineChart',
mixins: [resize],
props: {
id: {
type: String,
default: 'default-id'
},
title: {
type: String,
default: 'default-title'
},
xData: {
type: Array,
default: () => []
},
seriesData: {
type: Array,
default: () => []
}
},
data() {
return {
chart: null,
option: {
color: ['#59CBE8', '#E93CAC', '#FF7345', '#9452FF', '#6A6E87', '#52FFF1'],
grid: {
top: '20%',
left: 0,
right: 12,
bottom: 0,
containLabel: true
},
legend: {
width: '72%',
right: 12,
itemWidth: 12,
itemHeight: 8,
class ChartOption {
constructor() {
// const wenduData = Array(12)
// .fill(1)
// .map(_ => Random.integer(30, 100))
// const dianyaData = Array(12)
// .fill(1)
// .map(_ => Random.integer(30, 100))
// const dianliuData = Array(12)
// .fill(1)
// .map(_ => Random.integer(30, 100))
this.color = ['#1A99FF', '#E02094', '#F0D63C']
this.legend = {
top: 24,
right: 40,
itemWidth: 18,
itemHeight: 12,
textStyle: {
fontSize: 12,
color: '#fffc'
}
}
this.grid = {
top: 72,
left: 26,
right: 24,
bottom: 16,
containLabel: true
}
this.tooltip = {
show: true,
trigger: 'axis',
textStyle: {
fontSize: 12
},
xAxis: {
axisPointer: {
type: 'line',
lineStyle: {
color: '#7BFFFB',
type: 'dotted'
}
},
padding: 10,
backgroundColor: 'rgba(13, 29, 53, 0.8)',
// formatter: '{b}<br/>{a0}: {c}%<br />{a1}: {c1}%',
extraCssText: 'width: calc(100px*var(--beilv)) !important;',
formatter: params => {
return `
<div style="display: flex; flex-direction: column; gap: calc(4px * var(--beilv));">
<h2 style="font-size: calc(14px * var(--beilv)); margin: 0 0 4px; font-weight: normal; color: white;">${
params[0].axisValue
}</h2>
<span style="display: flex; align-items: center; gap: 8px;"><span style="width: 10px; height: 10px; border-radius: 5px; background: ${
this.color[0]
}"></span><span>${params[0].seriesName}: ${params[0].value}</span></span>
<span style="display: flex; align-items: center; gap: 8px;"><span style="width: 10px; height: 10px; border-radius: 5px; background: ${
this.color[1]
}"></span><span>${params[1].seriesName}: ${params[1].value}</span></span>
</div>
`
}
}
this.xAxis = {
type: 'category',
boundaryGap: false,
// boundaryGap: false,
// data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
data: Array(12)
data: Array(7)
.fill(0)
.map((_, idx) => (idx >= 10 ? idx : '0' + idx) + ':00'),
.map((_, idx) => {
const d = moment()
const day = idx ? d.subtract(idx, 'd') : d
return day.format('M-DD')
})
.reverse(),
axisTick: {
show: false
},
axisLabel: {
fontSize: 8,
fontSize: 12,
color: '#fffa'
},
axisLine: {
@@ -69,20 +99,22 @@ export default {
color: '#fff3'
}
}
},
yAxis: {
}
this.yAxis = {
type: 'value',
name: '成品率',
name: '成品率 ',
// min: 'dataMin',
min: 80,
splitNumber: 3,
nameTextStyle: {
color: '#fffc',
align: 'right',
fontSize: 8
color: '#fff9',
fontSize: 12
},
axisLine: {
show: false
},
axisLabel: {
fontSize: 10,
fontSize: 12,
color: '#fffa',
formatter: '{value} %'
},
@@ -92,14 +124,16 @@ export default {
color: '#fff3'
}
}
},
series: [
}
this.series = [
{
name: '产线1',
name: 'A',
type: 'line',
symbol: 'none',
symbol: 'circle',
symbolSize: 1,
showSymbol: false,
areaStyle: {
// color: 'rgba(50,145,152,0.5)'
color: {
type: 'linear',
x: 0,
@@ -119,16 +153,17 @@ export default {
global: false // 缺省为 false
}
},
data: Array(12)
data: Array(7)
.fill(0)
.map(_ => Math.floor(Math.random() * 100))
.map(_ => Random.integer(93, 98))
},
{
name: '产线2',
name: 'B',
type: 'line',
symbol: 'none',
symbol: 'circle',
symbolSize: 1,
showSymbol: false,
areaStyle: {
// color: 'rgba(50,145,152,0.5)'
color: {
type: 'linear',
x: 0,
@@ -148,117 +183,82 @@ export default {
global: false // 缺省为 false
}
},
data: Array(12)
data: Array(7)
.fill(0)
.map(_ => Math.floor(Math.random() * 100))
},
{
name: '产线3',
type: 'line',
symbol: 'none',
areaStyle: {
// color: 'rgba(50,145,152,0.5)'
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: '#FF734566' // 0% 处的颜色
},
{
offset: 1,
color: 'transparent' // 100% 处的颜色
}
],
global: false // 缺省为 false
}
},
data: Array(12)
.fill(0)
.map(_ => Math.floor(Math.random() * 100))
},
{
name: '产线4',
type: 'line',
symbol: 'none',
areaStyle: {
// color: 'rgba(50,145,152,0.5)'
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: '#9452FF66' // 0% 处的颜色
},
{
offset: 1,
color: 'transparent' // 100% 处的颜色
}
],
global: false // 缺省为 false
}
},
data: Array(12)
.fill(0)
.map(_ => Math.floor(Math.random() * 100))
},
{
name: '产线5',
type: 'line',
symbol: 'none',
areaStyle: {
// color: 'rgba(50,145,152,0.5)'
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: '#6A6E8766' // 0% 处的颜色
},
{
offset: 1,
color: 'transparent' // 100% 处的颜色
}
],
global: false // 缺省为 false
}
},
data: Array(12)
.fill(0)
.map(_ => Math.floor(Math.random() * 100))
.map(_ => Random.integer(93, 98))
}
]
}
get option() {
return this
}
optionFilter(option, calcSize = () => {} /** callback */) {
let newOption
if (Array.isArray(option)) {
newOption = []
option.forEach(item => {
newOption.push(this.optionFilter(item, calcSize))
})
return newOption
} else if (typeof option === 'object') {
newOption = {}
for (const key in option) {
if (key === 'colorStops') newOption[key] = option[key]
else if (
typeof option[key] === 'number' /** 过滤不做变化的属性 */ &&
['splitNumber', 'x', 'x2', 'y', 'y2', 'min', 'max', 'yAxisIndex', 'xAxisIndex'].indexOf(key) === -1
) {
newOption[key] = calcSize(option[key])
} else newOption[key] = this.optionFilter(option[key], calcSize)
}
return newOption
} else {
newOption = calcSize(option)
return option
}
}
}
export default {
name: 'ProductRateLineChart',
mixins: [resize],
props: {},
data() {
return {
chart: null,
option: null
}
},
mounted() {
this.$nextTick(() => {
if (!this.chart) this.chart = echarts.init(this.$refs['techy-line-chart'])
this.chart.setOption(this.option)
this.setChartOption()
})
},
beforeDestroy() {
if (this.chart) this.chart.dispose()
this.chart = null
},
methods: {}
methods: {
calcSize(num) {
const beilv = document.documentElement.style.getPropertyValue('--beilv')
return num * beilv
},
setChartOption() {
const chartOption = new ChartOption()
this.chart.setOption(chartOption.optionFilter(chartOption.option, this.calcSize))
}
}
}
</script>
<style scoped>
.techy-chart {
height: 100%;
/* background: #cccc; */
position: absolute;
height: 150%;
width: 100%;
}

View File

@@ -26,16 +26,16 @@ export default {
data() {
return {
datalist: [
{ name: '热端', value: 2332039120, color: '#0b88ff' },
{ name: '原片上片', value: 30, color: '#0bffa6' },
{ name: '片', value: 27, color: '#e3ff0b' },
{ name: '磨边', value: 23, color: '#950bff' },
{ name: '片磨边', value: 30, color: '#0bffa6' },
{ name: '原片', value: 30, color: '#0bffa6' },
{ name: '上片', value: 27, color: '#e3ff0b' },
{ name: '磨边镀膜膜', value: 23, color: '#950bff' },
{ name: '镀膜', value: 10, color: '#ff0bc2' },
{ name: '清晰', value: 66, color: '#ff7d0b' }
{ name: '热端', value: 66, color: '#0b88ff' },
{ name: '丝印', value: 93, color: '#0bffa6' },
{ name: '片', value: 121, color: '#0bffa6' },
{ name: '钢化', value: 2, color: '#e3ff0b' },
{ name: '片磨边', value: 211, color: '#e3ff0b' },
{ name: '下片铺纸', value: 27, color: '#950bff' },
{ name: '镀膜', value: 44, color: '#950bff' },
{ name: '物流仓储', value: 3, color: '#ff7d0b' },
{ name: '清洗', value: 2, color: '#0bffa6' },
{ name: '包装', value: 22, color: '#ff0bc2' }
]
}
},
@@ -47,7 +47,7 @@ export default {
<style scoped>
.right-content-quality-analysis {
height: calc(100% - 32px);
height: calc(100% - calc(32px * var(--beilv)));
overflow: hidden;
overflow-y: auto; /** 右边会有多的padding给滑道 */
display: grid;
@@ -55,6 +55,7 @@ export default {
grid-auto-rows: min-content;
gap: calc(4px * var(--beilv)) calc(6px * var(--beilv));
justify-content: end;
align-content: flex-start;
}
.analysis-item {

View File

@@ -1,143 +1,399 @@
<template>
<techy-box style="width: 100%; height: calc(100% - 36px); padding: calc(100vmin / 1920 * 16)">
<!-- <div :id="id" ref="techy-line-chart" class="techy-chart" /> -->
<new-bar
chart-name="realtime-cost-production"
:name-list="['A', 'B', 'C', 'D', 'E', 'F']"
:data-list="[
<!-- <techy-bar :extra-space-between-zero="16" :datainfo="[
{
topColor: 'rgba(59, 76, 118, 0.2)',
bottomColor: '#49FBD6',
name: '产量',
data: [64, 91, 55, 65, 37, 77]
list: [64, 91, 55, 65, 37, 77]
},
{
topColor: 'rgba(59, 76, 118, 0.2)',
bottomColor: '#31A2FF',
name: '能耗',
data: [32, 65, 65, 54, 37, 77]
list: [32, 65, 65, 54, 37, 77]
}
]"
/>
</techy-box>
]" /> -->
<div ref="realtimeLineChart" class="techy-chart" />
</template>
<script>
import echarts from 'echarts'
import TechyBox from './TechyBox.vue'
import newBar from './newBar.vue'
import resize from '@/views/OperationalOverview/components/mixins/resize'
import { Random } from 'mockjs'
import moment from 'moment'
export default {
name: 'RealtimeProductionHorizontalBarChart',
components: { TechyBox, newBar },
mixins: [resize],
props: {
id: {
type: String,
default: 'default-linechart-id'
class ChartOption {
constructor() {
this.color = ['#1A99FF', '#F0D63C', '#E02094', '#52FFF1']
this.legend = {
top: 28,
right: 40,
itemWidth: 10,
itemHeight: 10,
textStyle: {
color: '#fff9',
fontSize: 10
}
}
this.grid = {
top: 80,
left: 88,
right: 24,
bottom: 32
}
this.tooltip = {
show: true,
trigger: 'axis',
textStyle: {
fontSize: 12
},
title: {
type: String,
default: 'default-title'
},
xData: {
type: Array,
default: () => []
},
seriesData: {
type: Array,
default: () => []
axisPointer: {
type: 'line',
axis: 'x',
lineStyle: {
color: '#7BFFFB',
type: 'dotted'
}
},
data() {
return {
chart: null,
option: {
color: ['#FF7345', '#52FFF1', '#6A6E87', '#9452FFA6'],
grid: {
top: 0,
left: 0,
right: '5%',
bottom: 0,
containLabel: true
},
xAxis: {
type: 'value',
boundaryGap: [0, 0.001],
axisTick: {
show: false
},
padding: 10,
backgroundColor: 'rgba(13, 29, 53, 0.8)',
extraCssText: 'width: calc(100px*var(--beilv)) !important;',
formatter: params => {
return `
<div style="display: flex; flex-direction: column; gap: calc(4px * var(--beilv));">
<h2 style="font-size: calc(14px * var(--beilv)); margin: 0 0 4px; font-weight: normal; color: white;">${
params[0].axisValue
}</h2>
<span style="display: flex; align-items: center; gap: 8px;"><span style="width: 10px; height: 10px; border-radius: 5px; background: ${
this.color[0]
}"></span><span>${params[0].seriesName}: ${params[0].value}</span></span>
<span style="display: flex; align-items: center; gap: 8px;"><span style="width: 10px; height: 10px; border-radius: 5px; background: ${
this.color[1]
}"></span><span>${params[1].seriesName}: ${params[1].value}</span></span>
<span style="display: flex; align-items: center; gap: 8px;"><span style="width: 10px; height: 10px; border-radius: 5px; background: ${
this.color[2]
}"></span><span>${params[2].seriesName}: ${params[2].value}</span></span>
<span style="display: flex; align-items: center; gap: 8px;"><span style="width: 10px; height: 10px; border-radius: 5px; background: ${
this.color[3]
}"></span><span>${params[3].seriesName}: ${params[3].value}</span></span>
</div>
`
}
}
this.xAxis = {
type: 'category',
data: Array(7)
.fill(1)
.map((_, idx) => {
const d = moment()
const day = idx ? d.subtract(idx, 'd') : d
return day.format('M-DD')
})
.reverse(),
axisTick: { show: false },
axisLabel: {
fontSize: 8
// rotate: 10
color: '#fff9',
fontSize: 12
},
axisLine: {
show: false,
lineStyle: {
color: '#fffa'
}
},
splitLine: {
lineStyle: {
color: '#fff3'
}
}
},
yAxis: {
type: 'category',
data: ['产线1', '产线2', '产线3', '产线4', '产线5', '产线6'],
}
this.yAxis = [
{
name: '能耗 ',
nameTextStyle: { align: 'right', fontSize: 10, lineHeight: 14, color: '#fff9' },
type: 'value',
splitNumber: 4,
onZero: true,
position: 'left',
offset: 40,
axisTick: { show: false },
axisLine: {
show: false
show: true,
lineStyle: {
color: '#5982B2',
width: 1
}
},
axisLabel: {
fontSize: 10,
color: '#fffa'
color: '#fff9',
fontSize: 10
},
axisTick: { show: false },
splitLine: {
show: true,
lineStyle: {
color: '#fffa'
color: '#fff1',
type: 'dotted'
}
}
},
series: [
{
name: '2011',
type: 'bar',
barWidth: 5,
data: Array(6)
name: '产量 ',
nameTextStyle: { align: 'right', fontSize: 10, lineHeight: 14, color: '#fff9' },
type: 'value',
splitNumber: 4,
axisTick: { show: false },
onZero: true,
position: 'left',
offset: 0,
axisLine: {
show: true,
lineStyle: {
color: '#5982B2',
width: 1
}
},
axisLabel: {
color: '#fff9',
fontSize: 10
},
splitLine: {
show: true,
lineStyle: {
color: '#fff1',
type: 'dotted'
}
}
}
]
this.series = [
{
name: 'A能耗',
type: 'line',
yAxisIndex: 0,
// symbol: 'none',
symbol: 'circle',
symbolSize: 1,
showSymbol: false,
// smooth: true,
emphasis: {
focus: 'series'
},
data: Array(7)
.fill(0)
.map(value => Math.floor(Math.random() * 1000))
.map(_ => Random.integer(30, 100)),
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: '#1A99FF66' // 0% 处的颜色
},
{
name: '2012',
type: 'bar',
barWidth: 5,
data: Array(6)
offset: 1,
color: 'transparent' // 100% 处的颜色
}
],
global: false // 缺省为 false
}
}
},
{
name: 'A产量',
type: 'line',
yAxisIndex: 1,
// smooth: true,
emphasis: {
focus: 'series'
},
data: Array(7)
.fill(0)
.map(value => Math.floor(Math.random() * 1000))
.map(_ => Random.integer(30, 100)),
// symbol: 'none',
symbol: 'circle',
symbolSize: 1,
showSymbol: false,
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: '#F0D63C66' // 0% 处的颜色
},
{
offset: 1,
color: 'transparent' // 100% 处的颜色
}
],
global: false // 缺省为 false
}
}
},
{
name: 'B能耗',
type: 'line',
yAxisIndex: 0,
// smooth: true,
emphasis: {
focus: 'series'
},
data: Array(7)
.fill(0)
.map(_ => Random.integer(30, 100)),
// symbol: 'none',
symbol: 'circle',
symbolSize: 1,
showSymbol: false,
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: '#E0209466' // 0% 处的颜色
},
{
offset: 1,
color: 'transparent' // 100% 处的颜色
}
],
global: false // 缺省为 false
}
}
},
{
name: 'B产量',
type: 'line',
yAxisIndex: 1,
// smooth: true,
emphasis: {
focus: 'series'
},
data: Array(7)
.fill(0)
.map(_ => Random.integer(30, 100)),
// symbol: 'none',
symbol: 'circle',
symbolSize: 1,
showSymbol: false,
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: '#52FFF166' // 0% 处的颜色
},
{
offset: 1,
color: 'transparent' // 100% 处的颜色
}
],
global: false // 缺省为 false
}
}
}
]
}
get option() {
return this
}
optionFilter(option, calcSize = () => {} /** callback */) {
let newOption
if (Array.isArray(option)) {
newOption = []
option.forEach(item => {
newOption.push(this.optionFilter(item, calcSize))
})
return newOption
} else if (typeof option === 'object') {
newOption = {}
for (const key in option) {
if (key === 'colorStops') newOption[key] = option[key]
else if (
typeof option[key] === 'number' /** 过滤不做变化的属性 */ &&
['splitNumber', 'x', 'x2', 'y', 'y2', 'yAxisIndex', 'xAxisIndex'].indexOf(key) === -1
) {
newOption[key] = calcSize(option[key])
} else newOption[key] = this.optionFilter(option[key], calcSize)
}
return newOption
} else {
newOption = calcSize(option)
return option
}
}
}
export default {
name: 'RealtimeLineChart',
mixins: [resize],
/** Fn.1: 保证全屏切换时也刷新图表 应该在每个父组件为flex:1的echarts组件里都加上以确保能正确地伸缩 */
inject: ['resizeStatus'],
/** End Fn.1 */
props: {},
data() {
return {
chart: null,
option: null
}
},
computed: {
shouldResize() {
return this.resizeStatus()
}
},
watch: {
shouldResize(val, oldVal) {
console.log('fullscreen resize')
setTimeout(() => {
this.chart.resize()
}, 250)
}
},
mounted() {
this.$nextTick(() => {
if (!this.chart) this.chart = echarts.init(this.$refs['techy-line-chart'])
this.chart.setOption(this.option)
if (!this.chart) this.chart = echarts.init(this.$refs['realtimeLineChart'])
this.setChartOption()
})
},
beforeDestroy() {
if (this.chart) this.chart.dispose()
this.chart = null
},
methods: {}
methods: {
calcSize(num) {
const beilv = document.documentElement.style.getPropertyValue('--beilv')
return num * beilv
},
setChartOption() {
const chartOption = new ChartOption()
this.chart.setOption(chartOption.optionFilter(chartOption.option, this.calcSize))
}
}
}
</script>
<style scoped>
.techy-chart {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
}

View File

@@ -12,7 +12,9 @@
<span class="quality-analysis-bar__name">
{{ name }}
</span>
<span class="quality-analysis-bar__amount" :title="'数量:' + amount">{{ amount | amountFilter }}</span>
<span class="quality-analysis-bar__amount" :title="'数量:' + amount">
{{ amount | amountFilter }}
</span>
</div>
</template>
@@ -22,7 +24,7 @@ export default {
filters: {
amountFilter: val => {
const sVal = val.toString()
return sVal.length > 7 ? sVal.slice(0, 6) + '...' : sVal
return sVal.length > 9 ? sVal.slice(0, 8) + '...' : sVal
}
},
props: {
@@ -97,17 +99,17 @@ export default {
}
.block-green-5 {
background: linear-gradient(to left, #35abad, hsla(181, 53%, 44%, 0.65));
background: linear-gradient(to left, #35abad, hsla(181, 53%, 44%, 0.75));
/* margin-left: 4px; */
}
.block-green-4 {
background: linear-gradient(to left, hsla(181, 53%, 44%, 0.65), hsla(181, 53%, 44%, 0.4));
background: linear-gradient(to left, hsla(181, 53%, 44%, 0.75), hsla(181, 53%, 44%, 0.44));
}
.block-green-3 {
background: linear-gradient(to left, hsla(181, 53%, 44%, 0.4), hsla(181, 53%, 44%, 0.2));
background: linear-gradient(to left, hsla(181, 53%, 44%, 0.44), hsla(181, 53%, 44%, 0.15));
}
.block-green-2 {
background: linear-gradient(to left, hsla(181, 53%, 44%, 0.2), hsla(181, 53%, 44%, 0));
background: linear-gradient(to left, hsla(181, 53%, 44%, 0.15), hsla(181, 53%, 44%, 0));
}
.block-green-1 {
/* background: linear-gradient(to left, hsla(181, 53%, 44%, 0.2), hsla(181, 53%, 44%, 0)); */
@@ -187,10 +189,10 @@ export default {
color: rgba(255, 255, 255, 0.725);
display: inline-block;
/* min-width: 35%; */
width: 35%;
width: 45%;
text-align: left;
padding: calc(3px * var(--beilv)) 0;
font-size: calc(14px * var(--beilv));;
line-height: calc(12px * var(--beilv));;
font-size: calc(14px * var(--beilv));
line-height: calc(12px * var(--beilv));
}
</style>

View File

@@ -0,0 +1,286 @@
<template>
<div ref="techyBar" class="techy-bar"></div>
</template>
<script>
import echarts from 'echarts' // echarts theme
import resize from '@/views/OperationalOverview/components/mixins/resize'
import * as BottomPic from './bottom.png'
export default {
name: 'TechyBarFor3DPage',
props: {
datainfo: {
type: Array,
default: () => [
{
name: '产线A',
list: [100, 102, 104, 105, 100, 117]
},
{
name: '产线B',
list: [110, 92, 124, 85, 100, 120]
}
]
},
unitName: {
type: String,
default: ''
},
extraSpaceBetweenZero: {
type: Number,
default: 25
}
},
mixins: [resize],
data() {
const color_gradients = [
/** 蓝 */
{
direction: 'to top',
from: '#49B2FF', // * 0.6 是底部颜色和顶部颜色
to: '#49B2FF00',
topAndBottom: '#49B2FF9F'
},
/** 绿 */
{
direction: 'to top',
from: '#49FBD6', // * 0.6 是底部颜色和顶部颜色
to: '#49FBD600',
topAndBottom: '#49FBD69F'
}
]
let result = []
this.datainfo.map((pl, index) => {
let topCircle = {
__position: 'top',
name: pl.name,
barGap: '10%',
barCategoryGap: '48%',
type: 'pictorialBar',
symbol: 'circle',
symbolPosition: 'end',
symbolOffset: ['25%', '-50%'],
// symbolSize: ['100%', 6],
symbolSize: ['200%', 6],
data: pl.list,
z: 10,
itemStyle: {
// color: color_gradients[index].topAndBottom
color: {
type: 'linear',
x: 0,
y: 1,
x2: 0,
y2: 0,
colorStops: [
{
offset: 0,
color: color_gradients[index].topAndBottom
},
{
offset: 1,
color: color_gradients[index].to
}
],
global: false // 缺省为 false
}
}
}
let bottomCircle = {
__position: 'top',
name: pl.name,
barGap: '10%',
barCategoryGap: '48%',
type: 'pictorialBar',
symbol: 'circle',
symbolOffset: ['-25%', '50%'],
symbolSize: ['200%', 6],
data: pl.list,
z: 10,
itemStyle: {
color: color_gradients[index].from
}
}
let mainBar = {
__position: 'main',
type: 'bar',
name: pl.name,
// barWidth: 20, // 不需要设置 barWidth
barGap: '10%',
barCategoryGap: '48%',
data: pl.list,
z: 0,
itemStyle: {
color: {
type: 'linear',
x: 0,
y: 1,
x2: 0,
y2: 0,
colorStops: [
{
offset: 0,
color: color_gradients[index].from
},
{
offset: 0.15,
color: color_gradients[index].topAndBottom
},
{
offset: 1,
color: color_gradients[index].to
}
],
global: false // 缺省为 false
}
},
label: {
show: true,
position: 'top',
color: '#fff8',
fontSize: 8,
offset: [0, 6]
}
}
result.push(topCircle)
result.push(mainBar)
result.push(bottomCircle)
})
return {
BottomPic,
width: 0,
chart: null,
option: {
legend: {
icon: 'rect',
itemWidth: 8,
itemHeight: 8,
top: '2%',
right: '10%',
textStyle: {
color: '#fff8'
},
data: this.datainfo.map(item => item.name)
},
grid: {
top: 24,
left: '8%',
bottom: 24
},
xAxis: {
type: 'category',
axisTick: {
show: false
},
axisLine: {
onZero: false,
show: false,
lineStyle: {}
},
axisLabel: {
color: '#fff8',
fontSize: 10
},
data: ['产线A', '产线B', '产线C', '产线D', '产线E', '产线F']
},
yAxis: {
type: 'value',
// min: -25,
min: this.extraSpaceBetweenZero * -1,
name: this.unitName,
nameTextStyle: {
color: '#fff8',
fontSize: 8,
verticalAlign: 'top',
align: 'right'
},
axisLine: {
show: true,
lineStyle: {
color: '#31A2FF'
}
},
axisLabel: {
color: '#fff8',
fontSize: 10,
/** y轴不从0开始也可以用 xAxis 向下 offset 的方式模拟 **/
formatter: function(value, index) {
if (value < 0) {
return ''
}
return value
}
},
axisTick: { show: false },
splitLine: {
lineStyle: {
color: '#569acd',
type: 'dotted',
opacity: 0.2
}
}
},
series: result,
graphic: [
{
type: 'image',
left: 0,
bottom: 0,
style: {
image: 'image url',
height: 0,
width: 0
}
}
]
}
}
},
mounted() {
window.addEventListener('resize', this.refreshOption)
if (!this.chart) this.chart = echarts.init(this.$refs.techyBar)
this.$nextTick(() => {
this.updateOption(this.option)
this.chart.setOption(this.option)
})
},
methods: {
updateOption(option) {
// console.log('option', this.BottomPic.default)
let width = this.$refs.techyBar.querySelector('div').clientWidth
let height = this.$refs.techyBar.querySelector('div').clientHeight
option.graphic[0].style.width = width * 0.88
option.graphic[0].style.height = height * 0.3
option.graphic[0].style.image = this.BottomPic.default
option.graphic[0].left = '8%'
option.graphic[0].bottom = 24
},
refreshOption() {
this.updateOption(this.option)
this.chart.setOption(this.option)
}
}
}
</script>
<style scoped>
.techy-bar {
position: relative;
width: 100%;
height: 100%;
}
.techy-bar >>> div {
width: 100% !important;
height: 100% !important;
}
</style>

View File

@@ -78,7 +78,7 @@ export default {
border-image: linear-gradient(90deg, rgba(82, 255, 241, 0.6), rgba(95, 190, 249, 0), rgba(82, 255, 241, 0.6)) 2 2;
display: inline-block;
position: relative;
padding: calc(24px * var(--beilv));
padding: calc(20px * var(--beilv));
width: 100%;
height: 100%;
box-shadow: inset 0px 0px 20px 0px rgba(255, 255, 255, 0.15);

View File

@@ -1,63 +0,0 @@
<template>
<div class="techy-fake-table">
<div class="table-inner">
<section class="table-header" />
<section class="table-body" />
</div>
</div>
</template>
<script>
export default {
name: '',
props: {
tableProps: {
type: Array,
default: () => []
},
tableData: {
type: Array,
default: () => []
}
},
data() {
return {
headMap: {}
}
},
created() {},
mounted() {
this.renderHeadRow().then(() => {
this.renderCommonRow()
})
},
methods: {
renderHeadRow() {
return new Promise((resolve, reject) => {
// do something...
})
},
renderCommonRow() {
return new Promise((resolve, reject) => {
// do something...
})
}
}
}
</script>
<style scoped>
.techy-fake-table {
position: relative;
width: 100%;
height: 100px;
background: #3333;
overflow: hidden;
overflow-x: scroll;
}
.table-inner {
max-width: 10000px;
color: white;
white-space: nowrap;
}
</style>

View File

@@ -1,10 +1,10 @@
<template>
<header class="techy-header">
<img class="logo-img" src="./logo.png" alt="cnbm" />
<img class="logo-img" src="./logo.png" alt="cnbm">
<span class="techy-header__title">{{ headTitle }}</span>
<div class="date">2022.10.14</div>
<div class="time">20:12:24</div>
<div class="date">{{ now.format('yyyy.MM.DD') }}</div>
<div class="time">{{ now.format('HH:mm:ss') }}</div>
<div class="fullscreen-btn">
<span @click="handleClick('home')" v-html="homeSvg" />
@@ -16,6 +16,7 @@
<script>
import Cookie from 'js-cookie'
import moment from 'moment'
// const homeSvg = `<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
const homeSvg = `<svg style="width: 100%; height: 100%" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
@@ -63,7 +64,20 @@ export default {
fullScreenSvg,
homeSvg,
unfullScreenSvg,
isFullScreen: false
isFullScreen: false,
now: moment(),
interval: null
}
},
mounted() {
this.interval = setInterval(() => {
this.now = moment()
}, 1000)
},
beforeDestroy() {
if (this.interval) {
clearInterval(this.interval)
this.interval = null
}
},
methods: {
@@ -76,7 +90,8 @@ export default {
const password = Cookie.get('password')
if (username && password) {
window.location = `http://192.168.1.103:9527/#/?username=${username}&password=${password}`
window.location = `http://main.cnbmai.picaiba.com/#/?username=${username}&password=${password}`
// window.location = `http://192.168.1.103:9527/#/?username=${username}&password=${password}`
} else {
this.$router.push('/')
}

View File

@@ -7,7 +7,7 @@
-->
<template>
<div class="visual-base-table-container">
<el-table class="techy-el-table" v-loading="isLoading" :data="renderData" border height="100%">
<el-table v-loading="isLoading" class="techy-el-table" :data="renderData" border height="100%">
<el-table-column
v-if="page && limit && showIndex"
prop="_pageIndex"
@@ -29,7 +29,7 @@
:inject-data="{ ...scope.row, ...item }"
@emitData="emitData"
/>
<span v-else>{{ scope.row[item.prop] | commonFilter(item.filter) }}</span>
<span v-else :title="scope.row[item.prop]">{{ scope.row[item.prop] | commonFilter(item.filter) }}</span>
</template>
</el-table-column>
<slot name="content" />
@@ -200,11 +200,11 @@ export default {
}
.visual-base-table-container >>> .el-table tbody tr:nth-child(odd) {
background-color: #0e203e90;
background-color: #0e203ecc;
}
.visual-base-table-container >>> .el-table tbody tr:nth-child(even),
.visual-base-table-container >>> .el-table thead {
background-color: #20376090;
background-color: #213961cc;
}
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 256 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 285 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 491 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

View File

@@ -113,6 +113,7 @@ export default {
name: this.dataList[1].name,
type: 'bar',
barWidth: 20,
yAxisIndex: 1,
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: this.dataList[1].topColor },
@@ -124,6 +125,7 @@ export default {
{
// 柱顶
name: this.dataList[1].name,
yAxisIndex: 1,
type: 'pictorialBar',
barWidth: 20,
symbol: 'circle',
@@ -154,6 +156,7 @@ export default {
{
// 柱底
name: this.dataList[1].name,
yAxisIndex: 1,
type: 'pictorialBar',
barWidth: 20,
symbol: 'circle',
@@ -170,7 +173,6 @@ export default {
// 柱体
name: this.dataList[0].name,
type: 'bar',
// barWidth: 26,
barWidth: barWidth,
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
@@ -191,7 +193,6 @@ export default {
// 柱顶
name: this.dataList[0].name,
type: 'pictorialBar',
// barWidth: 26,
barWidth: barWidth,
symbol: 'circle',
symbolPosition: 'end',
@@ -222,7 +223,6 @@ export default {
// 柱底
name: this.dataList[0].name,
type: 'pictorialBar',
// barWidth: 26,
barWidth: barWidth,
symbol: 'circle',
symbolOffset: [0, '50%'],
@@ -249,15 +249,16 @@ export default {
this.chart = echarts.init(this.$refs.chartContainer)
this.chart.setOption({
grid: {
top: '16%',
left: '2%',
right: '2%',
top: '24%',
left: '8%',
right: '5%',
bottom: '3%',
containLabel: true
},
legend: {
itemWidth: 8,
itemHeight: 8,
top: '2%',
right: '2%',
textStyle: {
color: '#fff9'
@@ -281,7 +282,16 @@ export default {
},
data: this.nameList
},
yAxis: {
yAxis: [
{
name: '产量/m²',
nameTextStyle: { align: 'right', fontSize: 9, color: '#fff9' },
type: 'value',
splitNumber: 3,
axisTick: { show: false },
onZero: true,
position: 'left',
offset: 10,
axisLine: {
lineStyle: {
type: 'solid',
@@ -290,9 +300,6 @@ export default {
width: '1' // 坐标线的宽度
}
},
axisTick: {
show: false
},
axisLabel: {
textStyle: {
color: 'rgba(255,255,255,0.5)' // 坐标值得具体的颜色
@@ -306,6 +313,37 @@ export default {
},
type: 'value'
},
{
name: '能耗kw/h',
nameTextStyle: { align: 'right', fontSize: 9, color: '#fff9' },
type: 'value',
splitNumber: 3,
axisTick: { show: false },
onZero: true,
position: 'left',
offset: 48,
axisLine: {
lineStyle: {
type: 'solid',
color: this.dataList[1].bottomColor,
width: '1' // 坐标线的宽度
}
},
axisLabel: {
textStyle: {
color: 'rgba(255,255,255,0.5)' // 坐标值得具体的颜色
}
},
splitLine: {
show: false,
// lineStyle: {
// type: 'dotted',
// color: 'rgba(119, 255, 242, 0.2)'
// }
},
type: 'value'
}
],
series: this.series
})
}
@@ -354,10 +392,12 @@ export default {
left: calc(100vw/1920 * 48); */
/* bottom: calc(10% + 100vh/1920 * 28); */
bottom: 20px;
left: 9%;
left: 6%;
height: 30px;
width: 90%;
background: linear-gradient(to top, #49fbd789, transparent);
border-radius: 3px;
/* border: 1px solid #49fbd7; */
background: linear-gradient(to top, #49fbd789 5%, transparent);
transform: skew(-35deg);
z-index: 0;
}

View File

@@ -1,8 +1,9 @@
<template>
<div id="v3d-outter" ref="v3d-outter">
<!-- <V3DApp @3d-loaded="handle3DLoaded" />
<div v-if="showPage" id="v3d-main-content"> -->
<div v-if="true" id="v3d-main-content">
<div id="V3DData" style="position: fixed; top: 0; left: 0; display: hidden;" rel="" />
<V3DApp @3d-loaded="handle3DLoaded" @click.native="handle3DClick" />
<div v-if="showPage" id="v3d-main-content">
<!-- <div v-if="true" id="v3d-main-content"> -->
<techy-header :head-title="'合肥新能源数字工厂总览'" @toggle-full-screen="toggleFullScreen" />
<section id="techy-body-part">
@@ -18,30 +19,40 @@
<LeftContentPublicConsume />
</techy-container>
</div>
</div>
<div class="techy-body-part__middle">
<div v-if="currentEquipment" class="techy-body-part__middle">
<TechyBox>
<div class="techy-body-part__middle__inner">
<p>
<b>产线名称 :</b>
<span>A产线</span>
<span>{{ currentEquipment.pl }}</span>
</p>
<p>
<b>设备名称 :</b>
<span>清洗机</span>
<span>{{ currentEquipment.name }}</span>
</p>
<p>
<b>累计加工 :</b>
<span>20</span>
<span>{{ currentEquipment.amount }}</span>
</p>
<p>
<b>通信状态 :</b>
<span class="round-dot">运行中</span>
<span class="round-dot">
<span
class="dot-icon"
:class="{
'green-dot': currentEquipment.status === '生产中',
'red-dot': currentEquipment.status === '故障',
'yellow-dot': currentEquipment.status === '调试中'
}"
/>
{{ currentEquipment.status }}
</span>
</p>
</div>
</TechyBox>
</div>
</div>
<div class="techy-body-part__right">
<div class="realtime">
@@ -72,7 +83,7 @@
</techy-container>
</div>
<div class="ft-monitor" style="flex: 1;">
<techy-container title="现场实时监控" icon="安全帽图标">
<techy-container title="现场实时监控" icon="安全帽图标" style="display: flex; flex-direction: column;">
<LeftContentMonitor />
</techy-container>
</div>
@@ -109,6 +120,8 @@ import TechyBox from './components/TechyBox.vue'
import screenfull from 'screenfull'
import eqList from './v3dApp/data'
export default {
name: '',
components: {
@@ -128,6 +141,8 @@ export default {
},
data() {
return {
eqId: null,
currentEquipment: null,
showPage: false,
toggleResize: 'toggle-1' // <=== no need to worry this
}
@@ -152,6 +167,13 @@ export default {
},
handle3DLoaded() {
this.showPage = true
},
handle3DClick() {
this.eqId = document.getElementById('V3DData').rel
// alert(this.eqId)
if (this.eqId) {
this.currentEquipment = eqList.find(item => item.id === this.eqId)
}
}
}
}
@@ -183,6 +205,7 @@ export default {
}
#v3d-outter *::-webkit-scrollbar-button {
display: none;
width: calc(8px * var(--beilv));
height: calc(8px * var(--beilv));
background: #5bc4bf9f;
@@ -218,6 +241,7 @@ export default {
padding: calc(24px * var(--beilv));
padding-bottom: 0;
display: flex;
justify-content: space-between;
gap: calc(16px * var(--beilv));
}
@@ -235,16 +259,19 @@ export default {
/* 实时产量和能耗 */
.realtime {
height: calc(256px * var(--beilv));
height: calc(240px * var(--beilv));
}
/* 工序质量分析 */
.ws-quality {
height: calc(228px * var(--beilv));
/* height: calc(228px * var(--beilv)); */
min-height: calc(136px * var(--beilv));
flex: 1;
}
/* 产线成品率 */
.production {
height: calc(195px * var(--beilv));
height: calc(200px * var(--beilv));
flex: 1 0;
position: relative;
}
.bottom-part {
@@ -260,30 +287,23 @@ export default {
width: calc(472px * var(--beilv));
}
/* 现场实时监控 */
.ft-monitor {
}
/* 缺陷分类分析 */
.fault-analysis {
width: calc(290px * var(--beilv));
}
/* 设备报警提示 */
.eq-alert {
}
.techy-body-part__left,
.techy-body-part__right {
/* height: 100%; */
/* height: calc(512px * var(--beilv));
flex: 1; */
width: calc(472px * var(--beilv));
overflow: hidden;
overflow: unset;
display: flex;
flex-direction: column;
gap: calc(16px * var(--beilv));
position: relative;
}
.techy-body-part__right-col-2 {
@@ -292,25 +312,26 @@ export default {
gap: calc(100vmin / 1920 * 36);
}
.techy-body-part__middle {
/* .techy-body-part__middle {
flex: 1;
position: relative;
}
} */
.techy-body-part__middle .techy-box {
.techy-body-part__middle {
position: absolute;
/* background: #ff3311; */
top: 0;
left: 0;
height: calc(136px * var(--beilv));
width: calc(176px * var(--beilv));
right: calc(-16px * var(--beilv));
transform: translateX(100%);
}
.techy-body-part__middle__inner {
height: 100%;
/* height: 100%; */
padding: calc(16px * var(--beilv));
display: flex;
flex-direction: column;
justify-content: space-between;
/* gap: calc(6px * var(--beilv)); */
}
.techy-body-part__middle__inner p {
@@ -319,25 +340,64 @@ export default {
font-size: calc(12px * var(--beilv));
line-height: 1.5;
color: #fff;
display: flex;
min-width: calc(168px * var(--beilv));
}
.techy-body-part__middle__inner p:not(:last-child) {
margin-bottom: calc(8px * var(--beilv));
}
/* .techy-body-part__middle__inner p > b {
width: calc(90px * var(--beilv));
} */
.techy-body-part__middle__inner p > span {
position: relative;
padding-left: calc(16px * var(--beilv));
}
.techy-body-part__middle__inner p > span.round-dot {
padding-left: calc(28px * var(--beilv));
/* padding-left: calc(28px * var(--beilv)); */
display: flex;
align-items: center;
gap: calc(4px * var(--beilv));
}
.round-dot::before {
content: '';
position: absolute;
.dot-icon {
height: calc(16px * var(--beilv));
width: calc(16px * var(--beilv));
}
.red-dot {
background: url(./components/assets/red.png) 20% center / 100% no-repeat;
}
.green-dot {
background: url(./components/assets/green.png) 20% center / 100% no-repeat;
}
.yellow-dot {
background: url(./components/assets/orange.png) 20% center / 100% no-repeat;
}
.blue-dot {
background: url(./components/assets/blue.png) 20% center / 100% no-repeat;
}
/* .round-dot::before {
content: ''; */
/* position: absolute;
top: calc(4px * var(--beilv));
left: calc(16px * var(--beilv));
width: calc(8px * var(--beilv));
left: calc(16px * var(--beilv)); */
/* width: calc(8px * var(--beilv));
height: calc(8px * var(--beilv));
background-color: rgb(82, 231, 82);
border-radius: calc(4px * var(--beilv));
} */
.danger-dot::before {
background-color: #e71837;
}
.warning-dot::before {
background-color: #d6961f;
}
</style>

View File

@@ -0,0 +1,67 @@
export default [
{ id: 'C123-1', pl: 'A', name: 'A钢化', amount: 32, status: '生产中' },
{ id: 'C456-1', pl: 'B', name: 'B钢化', amount: 32, status: '生产中' },
{ id: 'C1-0', pl: 'A1', name: 'A1上片', amount: 32, status: '生产中' },
{ id: 'C1-1', pl: 'A1', name: 'A1磨边', amount: 32, status: '生产中' },
{ id: 'C1-2', pl: 'A1', name: 'A1磨边后清洗', amount: 32, status: '生产中' },
{ id: 'C1-3', pl: 'A1', name: 'A1打孔', amount: 32, status: '生产中' },
{ id: 'C1-4', pl: 'A1', name: 'A1打孔后清洗', amount: 32, status: '生产中' },
{ id: 'C1-5', pl: 'A1', name: 'A1丝印', amount: 32, status: '生产中' },
{ id: 'C1-6', pl: 'A1', name: 'A1固化', amount: 32, status: '生产中' },
{ id: 'C1-7', pl: 'A1', name: 'A1储片', amount: 32, status: '生产中' },
{ id: 'C1-8', pl: 'A1', name: 'A1钢化后清洗', amount: 32, status: '生产中' },
{ id: 'C1-9', pl: 'A1', name: 'A1下片', amount: 32, status: '生产中' },
{ id: 'C2-0', pl: 'A2', name: 'A2上片', amount: 32, status: '调试中' },
{ id: 'C2-1', pl: 'A2', name: 'A2磨边', amount: 32, status: '生产中' },
{ id: 'C2-2', pl: 'A2', name: 'A2磨边后清洗', amount: 32, status: '调试中' },
{ id: 'C2-3', pl: 'A2', name: 'A2打孔', amount: 32, status: '调试中' },
{ id: 'C2-4', pl: 'A2', name: 'A2打孔后清洗', amount: 32, status: '生产中' },
{ id: 'C2-5', pl: 'A2', name: 'A2丝印', amount: 32, status: '生产中' },
{ id: 'C2-6', pl: 'A2', name: 'A2固化', amount: 32, status: '生产中' },
{ id: 'C2-7', pl: 'A2', name: 'A2储片', amount: 32, status: '生产中' },
{ id: 'C2-8', pl: 'A2', name: 'A2钢化后清洗', amount: 32, status: '生产中' },
{ id: 'C2-9', pl: 'A2', name: 'A2下片', amount: 32, status: '生产中' },
{ id: 'C3-0', pl: 'A3', name: 'A3上片', amount: 32, status: '生产中' },
{ id: 'C3-1', pl: 'A3', name: 'A3磨边', amount: 32, status: '生产中' },
{ id: 'C3-2', pl: 'A3', name: 'A3磨边后清洗', amount: 32, status: '生产中' },
{ id: 'C3-3', pl: 'A3', name: 'A3打孔', amount: 32, status: '生产中' },
{ id: 'C3-4', pl: 'A3', name: 'A3打孔后清洗', amount: 32, status: '故障' },
{ id: 'C3-5', pl: 'A3', name: 'A3丝印', amount: 32, status: '生产中' },
{ id: 'C3-6', pl: 'A3', name: 'A3固化', amount: 32, status: '生产中' },
{ id: 'C3-7', pl: 'A3', name: 'A3储片', amount: 32, status: '生产中' },
{ id: 'C3-8', pl: 'A3', name: 'A3钢化后清洗', amount: 32, status: '生产中' },
{ id: 'C3-9', pl: 'A3', name: 'A3下片', amount: 32, status: '生产中' },
{ id: 'C4-0', pl: 'B1', name: 'B1上片', amount: 32, status: '故障' },
{ id: 'C4-1', pl: 'B1', name: 'B1磨边', amount: 32, status: '生产中' },
{ id: 'C4-2', pl: 'B1', name: 'B1磨边后清洗', amount: 32, status: '故障' },
{ id: 'C4-3', pl: 'B1', name: 'B1打孔', amount: 32, status: '故障' },
{ id: 'C4-4', pl: 'B1', name: 'B1打孔后清洗', amount: 32, status: '生产中' },
{ id: 'C4-5', pl: 'B1', name: 'B1丝印', amount: 32, status: '生产中' },
{ id: 'C4-6', pl: 'B1', name: 'B1固化', amount: 32, status: '生产中' },
{ id: 'C4-7', pl: 'B1', name: 'B1储片', amount: 32, status: '生产中' },
{ id: 'C4-8', pl: 'B1', name: 'B1钢化后清洗', amount: 32, status: '生产中' },
{ id: 'C4-9', pl: 'B1', name: 'B下片', amount: 32, status: '生产中' },
{ id: 'C5-0', pl: 'B2', name: 'B2上片', amount: 32, status: '生产中' },
{ id: 'C5-1', pl: 'B2', name: 'B2磨边', amount: 32, status: '生产中' },
{ id: 'C5-2', pl: 'B2', name: 'B2磨边后清洗', amount: 32, status: '生产中' },
{ id: 'C5-3', pl: 'B2', name: 'B2打孔', amount: 32, status: '生产中' },
{ id: 'C5-4', pl: 'B2', name: 'B2打孔后清洗', amount: 32, status: '生产中' },
{ id: 'C5-5', pl: 'B2', name: 'B2丝印', amount: 32, status: '生产中' },
{ id: 'C5-6', pl: 'B2', name: 'B2固化', amount: 32, status: '生产中' },
{ id: 'C5-7', pl: 'B2', name: 'B2储片', amount: 32, status: '生产中' },
{ id: 'C5-8', pl: 'B2', name: 'B2钢化后清洗', amount: 32, status: '生产中' },
{ id: 'C6-0', pl: 'B3', name: 'B3上片', amount: 32, status: '生产中' },
{ id: 'C6-1', pl: 'B3', name: 'B3磨边', amount: 32, status: '生产中' },
{ id: 'C6-2', pl: 'B3', name: 'B3磨边后清洗', amount: 32, status: '生产中' },
{ id: 'C6-3', pl: 'B3', name: 'B3打孔', amount: 32, status: '生产中' },
{ id: 'C6-4', pl: 'B3', name: 'B3打孔后清洗', amount: 32, status: '生产中' },
{ id: 'C6-5', pl: 'B3', name: 'B3丝印', amount: 32, status: '生产中' },
{ id: 'C6-6', pl: 'B3', name: 'B3固化', amount: 32, status: '故障' },
{ id: 'C6-7', pl: 'B3', name: 'B3储片', amount: 32, status: '故障' }
]

View File

@@ -37,11 +37,27 @@
<div class="row-2">
<!-- 设备分析 -->
<techy-container :title="'设备分析'" icon="趋势搜索">
<select id="productLine" name="productLine" class="product-line-selection">
<!-- <select id="productLine" name="productLine" class="product-line-selection">
<option value="1">产线一</option>
<option value="2">产线二</option>
<option value="3">产线三</option>
</select>
</select> -->
<template v-slot:titleSelect>
<el-select
v-model="plSelect"
size="mini"
:popper-append-to-body="false"
clearable
placeholder="请选择产线"
class="pl-select"
style="width: 140px; height: 100%; margin-left: 12px;"
>
<el-option label="产线A" value="1" />
<el-option label="产线B" value="2" />
</el-select>
</template>
<div class="equipment-analysis__inner">
<div>
<TechyBox class="pl-jdl">
@@ -96,19 +112,19 @@
<div class="techy-container__inner">
<div>
<TechyAnalysisHeader>突发性维护</TechyAnalysisHeader>
<TechyVerticalTable :table-props="rightSideProps" :data-list="rightSideDatalist" />
<TechyVerticalTable key="1" :table-props="suddenMaintainProps" :data-list="rightSideDatalist" />
</div>
<div>
<TechyAnalysisHeader>计划内保养</TechyAnalysisHeader>
<TechyVerticalTable :table-props="rightSideProps" :data-list="rightSideDatalist" />
<TechyVerticalTable key="2" :table-props="inPlanMaintainProps" :data-list="rightSideDatalist2" />
</div>
<div>
<TechyAnalysisHeader>防御性维护</TechyAnalysisHeader>
<TechyVerticalTable :table-props="rightSideProps" :data-list="rightSideDatalist" />
<TechyVerticalTable key="3" :table-props="defenceMaintainProps" :data-list="rightSideDatalist3" />
</div>
<div>
<TechyAnalysisHeader>点检工单</TechyAnalysisHeader>
<TechyVerticalTable :table-props="rightSideProps" :data-list="rightSideDatalist" />
<TechyVerticalTable key="4" :table-props="wwwOrderProps" :data-list="rightSideDatalist4" />
</div>
</div>
</techy-container>
@@ -136,8 +152,14 @@ import {
equipmentAnalysisData,
sparepartsProps,
sparepartsDatalist,
rightSideProps,
rightSideDatalist
suddenMaintainProps,
inPlanMaintainProps,
defenceMaintainProps,
wwwOrderProps,
rightSideDatalist,
rightSideDatalist2,
rightSideDatalist3,
rightSideDatalist4
} from './mockData'
import { mapGetters } from 'vuex'
@@ -163,6 +185,7 @@ export default {
props: {},
data() {
return {
plSelect: null,
equipmentExceptionProps,
equipmentExceptionDatalist,
equipmentAlarmProps,
@@ -171,8 +194,14 @@ export default {
equipmentAnalysisData,
sparepartsProps,
sparepartsDatalist,
rightSideProps,
rightSideDatalist
suddenMaintainProps,
inPlanMaintainProps,
defenceMaintainProps,
wwwOrderProps,
rightSideDatalist,
rightSideDatalist2,
rightSideDatalist3,
rightSideDatalist4
// refreshKey: 0
}
},
@@ -197,23 +226,22 @@ export default {
</script>
<style scoped>
::-webkit-scrollbar {
.visual-container >>> ::-webkit-scrollbar {
width: calc(8px * var(--beilv));
}
::-webkit-scrollbar-track {
.visual-container >>> ::-webkit-scrollbar-track {
background-color: #14243f;
border-radius: 0;
}
::-webkit-scrollbar-button {
width: calc(8px * var(--beilv));
height: calc(8px * var(--beilv));
.visual-container >>> ::-webkit-scrollbar-button {
display: none;
background: #5bc4bf9f;
position: relative;
}
::-webkit-scrollbar-thumb {
.visual-container >>> ::-webkit-scrollbar-thumb {
border-radius: calc(8px * var(--beilv));
background: #5bc4bf9f;
}
@@ -268,13 +296,13 @@ export default {
.techy-container__inner {
display: flex;
flex-direction: column;
gap: calc(8px * var(--beilv));
height: calc(100% - 4vh);
gap: calc(32px * var(--beilv));
height: calc(100% - 3vh);
/* overflow-y: scroll; */
overflow-y: auto;
}
.techy-container__inner > div {
flex: 1 1;
flex: 0;
}
.row-1,
@@ -346,7 +374,7 @@ export default {
.grid-2-3 {
grid-template-columns: repeat(3, 1fr);
grid-template-rows: 1fr 1fr;
gap: calc(8px * var(--beilv)) calc(4px * var(--beilv));
gap: calc(8px * var(--beilv)) calc(8px * var(--beilv));
}
.product-line-selection {
@@ -364,4 +392,12 @@ export default {
top: calc(24px * var(--beilv));
left: calc(140px * var(--beilv));
}
.pl-select >>> input {
/* height: 100%; */
outline: none;
border: none;
background: #31878c45;
color: white;
}
</style>

View File

@@ -14,16 +14,16 @@
<div class="flex items-center gap-8">
<span class="param-name">MTBR</span>
<div class="progress-bar grow">
<ProgreeBar :process="+mtbr * 100" :colors="['#2EC6B4', '#85F6E9']" />
<ProgreeBar :process="+mtbr" :max="30" :colors="['#2EC6B4', '#85F6E9']" />
</div>
<span class="param-value">{{ mtbr | noDecimalFilter }}%</span>
<span class="param-value">{{ mtbr }}min</span>
</div>
<div class="flex items-center gap-8">
<span class="param-name">MTBF</span>
<div class="progress-bar grow">
<ProgreeBar :process="+mtbf * 100" :colors="['#EB46A1', '#FF8BC3']" />
<ProgreeBar :process="+mtbf" :max="99999" :colors="['#EB46A1', '#FF8BC3']" />
</div>
<span class="param-value">{{ mtbf | noDecimalFilter }}%</span>
<span class="param-value">{{ mtbf }}h</span>
</div>
</div>
</TechyBox>
@@ -39,6 +39,10 @@ const ProgreeBar = {
type: Number,
default: 0
},
max: {
type: Number,
default: 100
},
colors: {
type: Array,
default: () => ['#1295FF', '#9DD5FF']
@@ -68,7 +72,7 @@ const ProgreeBar = {
position: 'absolute',
left: 0,
top: 0,
width: this.process + '%',
width: this.process / this.max * 100 + '%',
height: '100%',
borderRadius: 'calc(8px * var(--beilv))',
background: `linear-gradient(to right, ${this.colors[0]}, ${this.colors[1]})`
@@ -141,7 +145,7 @@ export default {
width: 24px; */
font-size: calc(12px * var(--beilv));
line-height: calc(14px * var(--beilv));
width: 15%;
width: 18%;
}
.param-list::before {

View File

@@ -1,17 +1,29 @@
<template>
<div class="techy-analysis-header">
<span v-html="titleLeftSVG" />
<template v-if="type === 'special'">
<div style="background: #cccc; width: 200px; height: 20px;"></div>
</template>
<template v-else>
<span
style="display: inline-block; width: calc(56px * var(--beilv)); height: calc(13px * var(--beilv));"
v-html="titleLeftSVG"
/>
<span class="techy-analysis-header__title">
<slot />
</span>
<span v-html="titleRightSVG" />
<span
style="display: inline-block; width: calc(56px * var(--beilv)); height: calc(13px * var(--beilv));"
v-html="titleRightSVG"
/>
</template>
</div>
</template>
<script>
const titleLeftSVG = `<svg
width="56px"
height="13px"
width="100%"
height="100%"
viewBox="0 0 56 13"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
@@ -59,8 +71,8 @@ const titleLeftSVG = `<svg
</g>
</svg>`
const titleRightSVG = `<svg
width="56px"
height="13px"
width="100%"
height="100%"
viewBox="0 0 56 13"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
@@ -109,6 +121,12 @@ const titleRightSVG = `<svg
export default {
name: 'TechyAnalysisHeader',
props: {
type: {
type: String,
default: 'default-type'
}
},
data() {
return { titleLeftSVG, titleRightSVG }
}

View File

@@ -14,6 +14,8 @@
<div class="container-title-wrapper">
<span class="container-icon" v-html="computeIcon" />
<span class="container-title">{{ title }}</span>
<slot name="titleSelect" />
</div>
<slot />

View File

@@ -29,7 +29,7 @@
:inject-data="{ ...scope.row, ...item }"
@emitData="emitData"
/>
<span v-else>{{ scope.row[item.prop] | commonFilter(item.filter) }}</span>
<span v-else :title="scope.row[item.prop]">{{ scope.row[item.prop] | commonFilter(item.filter) }}</span>
</template>
</el-table-column>
<slot name="content" />
@@ -126,14 +126,15 @@ export default {
}
.visual-base-table-container >>> ::-webkit-scrollbar-button {
width: calc(8px * var(--beilv));;
height: calc(8px * var(--beilv));;
display: none;
/* width: calc(8px * var(--beilv));
height: calc(8px * var(--beilv)); */
background: #5bc4bf9f;
position: relative;
}
.visual-base-table-container >>> ::-webkit-scrollbar-thumb {
border-radius: calc(8px * var(--beilv));;
border-radius: calc(8px * var(--beilv));
background: #5bc4bf9f;
}
@@ -200,12 +201,11 @@ export default {
}
.visual-base-table-container >>> .el-table tbody tr:nth-child(odd) {
background-color: #0e203e;
/* background-color: #0e203e; */
background-color: #0e203ecc;
}
.visual-base-table-container >>> .el-table tbody tr:nth-child(even),
.visual-base-table-container >>> .el-table thead {
background-color: #203760;
background-color: #213961cc;
}
</style>

View File

@@ -2,7 +2,7 @@
<div class="techy-vertical-table">
<div v-for="(row, index) in tableProps" :key="'row' + index" class="trow">
<span class="thead">{{ row.label }}</span>
<span v-for="(item, idx) in dataList" :key="'item_' + index + idx" class="tbody">
<span v-for="(item, idx) in dataList" :key="'item_' + index + idx" class="tbody" :title="item[row.prop]">
<template v-if="!row.subcomponent">
{{ item[row.prop] }}
</template>
@@ -45,22 +45,47 @@ export default {
color: white;
}
.techy-vertical-table >>> ::-webkit-scrollbar {
width: calc(8px * var(--beilv));
}
.techy-vertical-table >>> ::-webkit-scrollbar-track {
background-color: #14243f;
border-radius: 0;
}
.techy-vertical-table >>> ::-webkit-scrollbar-button {
display: none;
/* width: calc(8px * var(--beilv));
height: calc(8px * var(--beilv)); */
background: #5bc4bf9f;
position: relative;
}
.techy-vertical-table >>> ::-webkit-scrollbar-thumb {
border-radius: calc(8px * var(--beilv));
background: #5bc4bf9f;
}
.trow {
width: 100%;
white-space: nowrap;
display: flex;
justify-content: center;
/* justify-content: center; */
justify-content: stretch;
align-items: stretch;
margin-bottom: 1px;
}
.trow:not(:last-of-type) {
border-bottom: 1px solid #0d1728;
}
.thead,
.tbody {
/* min-width: calc(100vw / 1920 * 96); */
background-color: #20376080;
background-color: rgba(33, 57, 97, 0.8);
white-space: nowrap;
overflow: hidden;
margin-right: 1px;
text-align: left;
padding-left: calc(12px * var(--beilv));
padding-right: calc(12px * var(--beilv));
@@ -70,16 +95,20 @@ export default {
}
.thead {
width: 25%;
min-width: 25%;
font-size: calc(14px * var(--beilv));
line-height: 1.8;
/* line-height: 1.8; */
line-height: 2.1;
flex: 0;
}
.tbody {
width: 24%;
color: rgba(255, 255, 255, 0.7);
min-width: 24%;
color: rgba(255, 255, 255, 0.8);
font-size: calc(12px * var(--beilv));
line-height: 2;
/* line-height: 2; */
line-height: 2.3;
flex: 1 0;
}
.tbody:last-child {

View File

@@ -25,10 +25,14 @@ export default {
bottom: 0,
containLabel: true
},
xAxis: [
{
tooltip: {
show: true,
type: 'shadow',
trigger: 'item'
},
xAxis: {
type: 'category',
data: ['A', 'B', 'C', 'D', 'E'],
data: ['A', 'B' ],
axisTick: {
alignWithLabel: true
},
@@ -40,8 +44,7 @@ export default {
axisLabel: {
color: '#fff'
}
}
],
},
yAxis: [
{
type: 'value',
@@ -58,7 +61,7 @@ export default {
axisLabel: {
color: '#ffffff9d'
},
axisTick: { show : false }
axisTick: { show: false }
}
],
series: [
@@ -113,75 +116,75 @@ export default {
}
}
},
{
value: 200,
itemStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: '#85F6E9'
},
{
offset: 1,
color: '#2EC6B4'
}
],
global: false
}
}
},
{
value: 320,
itemStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: '#C79DFF'
},
{
offset: 1,
color: '#A490FF'
}
],
global: false
}
}
},
{
value: 95,
itemStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: '#FFE873'
},
{
offset: 1,
color: '#E7AE2A'
}
],
global: false
}
}
}
// {
// value: 200,
// itemStyle: {
// color: {
// type: 'linear',
// x: 0,
// y: 0,
// x2: 0,
// y2: 1,
// colorStops: [
// {
// offset: 0,
// color: '#85F6E9'
// },
// {
// offset: 1,
// color: '#2EC6B4'
// }
// ],
// global: false
// }
// }
// },
// {
// value: 320,
// itemStyle: {
// color: {
// type: 'linear',
// x: 0,
// y: 0,
// x2: 0,
// y2: 1,
// colorStops: [
// {
// offset: 0,
// color: '#C79DFF'
// },
// {
// offset: 1,
// color: '#A490FF'
// }
// ],
// global: false
// }
// }
// },
// {
// value: 95,
// itemStyle: {
// color: {
// type: 'linear',
// x: 0,
// y: 0,
// x2: 0,
// y2: 1,
// colorStops: [
// {
// offset: 0,
// color: '#FFE873'
// },
// {
// offset: 1,
// color: '#E7AE2A'
// }
// ],
// global: false
// }
// }
// }
]
}
]

View File

@@ -185,7 +185,10 @@ export default {
list({ ...this.listQuery, pdlId, name }).then(response => {
if (response.data.records) {
this.dataList = response.data.records
// this.dataList = response.data.records
// 11-mes 修改模拟数据
this.dataList = response.data.records.map(item => ({...item, error: '无故障'}))
} else {
this.dataList.splice(0)
}

View File

@@ -33,7 +33,10 @@
</div>
<!-- right -->
<div class="right-container">
<top-title :base-title="this.$t('module.equipmentManager.inspectionManage.inspectionItem')" style="font-size: 14px; padding-bottom: 14px;" />
<top-title
:base-title="this.$t('module.equipmentManager.inspectionManage.inspectionItem')"
style="font-size: 14px; padding-bottom: 14px;"
/>
<base-table
:page="1"
:limit="999"
@@ -64,13 +67,22 @@ import BaseTable from '@/components/BaseTable'
import Pagination from '@/components/Pagination'
import MethodBtn from '@/components/BaseTable/subcomponents/MethodBtn'
import { tableHeight } from '@/utils/index'
import { equipmentList, inspectionLog, einspectionLogD, einspectionItList, einspectionItemLogU } from '@/api/equipment/inspectionManager'
import {
equipmentList,
inspectionLog,
einspectionLogD,
einspectionItList,
einspectionItemLogU
} from '@/api/equipment/inspectionManager'
import einspectionitemAdd from './components/einspectionitemAdd.vue'
import einspectionitemlogAdd from './components/einspectionitemlogAdd.vue'
import { timeFormatter } from '@/filters'
import StatusBtn from './components/statusBtn.vue'
import statusTag from './components/statusTag.vue'
// import newBasicData from '@/filters/newBasicData'
import { Random } from 'mockjs'
const topBtnConfig = [
{
type: 'add',
@@ -246,7 +258,8 @@ export default {
cancelButtonText: this.$t('module.basicData.visual.cancelButtonText'),
type: 'warning'
}
).then(() => {
)
.then(() => {
einspectionLogD({
id: raw.data.id
}).then(res => {
@@ -260,7 +273,8 @@ export default {
}
})
})
}).catch(() => { })
})
.catch(() => {})
} else if (raw.type === 'detail') {
this.addNew(raw.data.id, 'detail')
} else if (raw.type === 'edit') {
@@ -274,8 +288,25 @@ export default {
this.listQuery.endTime = this.headFormValue.searchTime ? this.headFormValue.searchTime[1] + 'T23:59:59' : ''
inspectionLog(this.listQuery).then(res => {
if (res.data.records) {
this.list = res.data.records
// this.list = res.data.records
// 11-mes 修改模拟时间
this.list = res.data.records.map(item => {
let startDate = 2022 + '-' + '11-' + Random.integer(1, 29)
let startHour = Random.integer(1, 22)
return {
...item,
inspectionStartTime:
startDate + ' ' + (startHour < 10 ? '0' + startHour : '' + startHour) + Random.datetime(':mm:ss'),
inspectionEndTime:
startDate +
' ' +
(startHour + 1 < 10 ? +'0' + (startHour + 1) : 1 + startHour + '') +
Random.datetime(':mm:ss')
}
})
// console.log('list;', this.list)
this.equipmentInspectionId = this.list[0].id
this.getInspectionItem()
} else {
this.list = []
@@ -299,7 +330,8 @@ export default {
})
}
},
selectRow(val) { // 点击左侧列表
selectRow(val) {
// 点击左侧列表
this.equipmentInspectionId = val.id
this.getInspectionItem()
},
@@ -340,7 +372,7 @@ export default {
})
},
handleClickR(raw) {
if ((raw.type === 'detail') || (raw.type === 'edit')) {
if (raw.type === 'detail' || raw.type === 'edit') {
this.addOrUpdateVisibleR = true
this.$nextTick(() => {
this.$refs.addOrUpdateR.init(raw.data.id, raw.type)
@@ -351,7 +383,7 @@ export default {
}
</script>
<style lang="scss" scoped>
.app-container {
.app-container {
padding-top: 0;
.left-container {
display: inline-block;
@@ -369,5 +401,5 @@ export default {
height: 100%;
padding-top: 23px;
}
}
</style>
}
</style>

View File

@@ -33,30 +33,36 @@ const PriorityComponent = {
}
export const equipmentExceptionProps = [
{ label: '设备名称', prop: 'eqName', align: 'center', 'min-width': 60 },
{ label: '所属产线', prop: 'pl', align: 'center', 'min-width': 60 },
{ label: '设备名称', prop: 'eqName', align: 'center', 'min-width': 55 },
// { label: '所属产线', prop: 'pl', align: 'center', 'min-width': 55 },
{ label: '报修/异常内容', prop: 'content', align: 'center', 'min-width': 80 },
{ label: '报修/发现人', prop: 'creator', align: 'center', width: 110 },
{ label: '报修/发现人', prop: 'creator', align: 'center', 'min-width': 60 },
{ label: '时间', prop: 'time', align: 'center', 'min-width': 80 },
{ label: '优先级', prop: 'priority', align: 'center', subcomponent: PriorityComponent, 'min-width': 60 }
{ label: '优先级', prop: 'priority', align: 'center', subcomponent: PriorityComponent, 'min-width': 55 }
]
export const equipmentExceptionDatalist = [
{ 'eqName': 'A1一次固化机', 'pl': 'E线', 'content': '开化是专品直', 'creator': '郭娜', 'time': '1997-06-08 06:14:37', 'priority': 1 },
{ 'eqName': 'B1一次冷却机', 'pl': 'B线', 'content': '书记因地观同展土军信', 'creator': '薛洋', 'time': '2006-03-15 10:39:30', 'priority': 2 },
{ 'eqName': 'A1预热机', 'pl': 'D线', 'content': '说资把话', 'creator': '曾刚', 'time': '1985-01-29 23:21:53', 'priority': 3 },
{ 'eqName': 'A钢化炉', 'content': '即压连识打', 'creator': '张杰', 'time': '1975-05-12 18:54:07', 'priority': 2 },
{ 'eqName': 'A2一次固化机', 'pl': 'C线', 'content': '向江比把设', 'creator': '夏敏', 'time': '1996-12-22 09:29:57', 'priority': 3 },
{ 'eqName': 'A2一次固化机', 'content': '统山数里们步在', 'creator': '龙洋', 'time': '1989-07-19 05:01:55', 'priority': 3 },
{ 'eqName': 'A钢化炉', 'content': '快制放产口快', 'creator': '金艳', 'time': '1987-02-25 18:45:17', 'priority': 4 },
{ 'eqName': 'A1预热机', 'pl': 'D线', 'content': '说资把话', 'creator': '曾刚', 'time': '1985-01-29 23:21:53', 'priority': 3 },
{ 'eqName': 'A钢化炉', 'content': '即压连识打', 'creator': '张杰', 'time': '1975-05-12 18:54:07', 'priority': 2 },
{ 'eqName': 'A2一次固化机', 'pl': 'C线', 'content': '向江比把设', 'creator': '夏敏', 'time': '1996-12-22 09:29:57', 'priority': 3 },
{ 'eqName': 'A2一次固化机', 'content': '统山数里们步在', 'creator': '龙洋', 'time': '1989-07-19 05:01:55', 'priority': 3 },
{ 'eqName': 'A钢化炉', 'content': '快制放产口快', 'creator': '金艳', 'time': '1987-02-25 18:45:17', 'priority': 4 },
{ 'eqName': 'A1一次固化机', 'content': '住指时化统高线', 'creator': '顾敏', 'time': '1982-05-09 15:28:29', 'priority': 1 },
{ 'eqName': 'B1二次镀膜机', 'pl': 'B线', 'content': '命些种保较会', 'creator': '罗秀英', 'time': '1986-04-02 07:40:03', 'priority': 2 },
{ 'pl': 'B线', 'content': '增元少号安场明去在亲', 'creator': '于丽', 'time': '2004-08-11 11:10:57', 'priority': 4 }]
{ "eqName": "A1丝印", "pl": "A", "content": "网版推出异常", "creator": "马磊", "time": "2022-11-20 22:00:34", "priority": 3 },
{ "eqName": "B1磨边后清洗", "pl": "B", "content": "毛刷过载", "creator": "贺刚", "time": "2022-11-20 06:30:01", "priority": 2 },
{ "eqName": "B1磨边", "pl": "B", "content": "磨轮过载", "creator": "冯丽", "time": "2022-11-20 07:09:16", "priority": 2 },
// { "eqName": "镀膜", "pl": "A", "content": "胶辊变频异常", "creator": "梁秀兰", "time": "2022-11-20 08:21:36", "priority": 3 },
{ "eqName": "B2丝印", "pl": "B", "content": "印刷轴异常", "creator": "卢敏", "time": "2022-11-20 04:45:00", "priority": 2 },
{ "eqName": "A3磨边", "pl": "A", "content": "磨轮过载", "creator": "方勇", "time": "2022-11-20 06:41:06", "priority": 2 },
{ "eqName": "B2打孔后清洗", "pl": "B", "content": "毛刷过载", "creator": "赵静", "time": "2022-11-20 03:36:47", "priority": 2 },
// { "eqName": "镀膜", "pl": "A", "content": "胶辊变频异常", "creator": "姜洋", "time": "2022-11-20 07:56:26", "priority": 3 },
{ "eqName": "A2磨边", "pl": "A", "content": "磨轮过载", "creator": "赖艳", "time": "2022-11-20 12:01:14", "priority": 1 },
{ "eqName": "A2丝印", "pl": "A", "content": "进气压力过低", "creator": "熊静", "time": "2022-11-20 03:24:33", "priority": 1 },
{ "eqName": "B1打孔后清洗", "pl": "B", "content": "进料检测异常", "creator": "龚明", "time": "2022-11-21 16:26:11", "priority": 2 },
{ "eqName": "A钢化", "pl": "A", "content": "传动变频器故障", "creator": "万娟", "time": "2022-11-21 08:44:41", "priority": 2 },
{ "eqName": "B3丝印", "pl": "B", "content": "进气压力过低", "creator": "徐丽", "time": "2022-11-21 21:15:10", "priority": 2 },
// { "eqName": "镀膜", "pl": "A", "content": "固化变频异常", "creator": "叶娜", "time": "2022-11-21 22:45:13", "priority": 1 },
{ "eqName": "A钢化", "pl": "A", "content": "传动变频器故障", "creator": "田磊", "time": "2022-11-21 07:24:59", "priority": 2 },
{ "eqName": "A钢化", "pl": "A", "content": "加热炉体超温报警", "creator": "邱平", "time": "2022-11-21 17:53:18", "priority": 2 },
{ "eqName": "B2磨边后清洗", "pl": "B", "content": "磨轮过载", "creator": "赵艳", "time": "2022-11-21 18:10:32", "priority": 2 },
{ "eqName": "B钢化", "pl": "B", "content": "传动变频器故障", "creator": "江伟", "time": "2022-11-21 17:29:44", "priority": 2 },
{ "eqName": "B3磨边后清洗", "pl": "B", "content": "输送变频报警", "creator": "周洋", "time": "2022-11-21 02:49:09", "priority": 3 },
{ "eqName": "A1磨边", "pl": "A", "content": "磨轮过载", "creator": "邱超", "time": "2022-11-21 20:41:53", "priority": 1 },
]
/** 设备异常报警 */
const LifeRemainComponent = {
@@ -65,54 +71,71 @@ const LifeRemainComponent = {
injectData: Object
},
computed: {
remainLeftPercentage() {
return this.injectData.remain / 300
},
statusColor() {
const colors = [
'rgba(255,84,76,0.6)', // red < 0
'#FFBD43', // yellow < 10
'rgba(142,254,83,0.6)' // green >= 10
'rgba(255,84,76,0.6)', // red < 10%
'#FFBD43', // yellow < 20%
'rgba(142,254,83,0.6)' // green
]
return this.injectData.remain < 0 ? colors[0] : this.injectData.remain < 10 ? colors[1] : colors[2]
return this.remainLeftPercentage < 0.1 ? colors[0] : this.remainLeftPercentage < 0.2 ? colors[1] : colors[2]
}
},
render: function (h) {
return h('span', {
style:
{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, width: '100%', height: '100%', display: 'flex', justifyContent: 'center', alignItems: 'center', opacity: '0.8', backgroundColor: this.statusColor, color: '#fff' }
{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, width: '100%', height: '100%', display: 'flex', justifyContent: 'center', alignItems: 'center' }
// { position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, width: '100%', height: '100%', display: 'flex', justifyContent: 'center', alignItems: 'center', opacity: '0.8', backgroundColor: this.statusColor, color: '#fff' }
},
this.injectData.remain)
[
h('span', { style: { color: this.remainLeftPercentage < 0.1 ? 'rgba(255,84,76,0.6)' : this.remainLeftPercentage < 0.2 ? '#FFBD43' : '#ffffffee' } }, this.injectData.remain),
h('span', { style: { position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, width: this.remainLeftPercentage * 100 + '%', opacity: 0.8, backgroundColor: this.statusColor, } })
])
}
}
export const equipmentAlarmProps = [
{ label: '设备名称', prop: 'eqName', align: 'center', 'min-width': 100 },
{ label: '设备编码', prop: 'eqCode', align: 'center', 'min-width': 100 },
{ label: '所属产线', prop: 'pl', align: 'center' },
// { label: '所属产线', prop: 'pl', align: 'center' },
{ label: '报警级别', prop: 'priority', align: 'center', subcomponent: PriorityComponent, 'min-width': 85 },
{ label: '报警内容', prop: 'content', align: 'center' }
]
export const equipmentAlarmDatalist = [
{ 'eqName': 'A1预热机', 'eqCode': 'SB501464', 'pl': 'C线', 'content': '使决方不相动', 'priority': 3 },
{ 'eqName': 'A1一次固化机', 'eqCode': 'SB373383', 'pl': 'C线', 'content': '规问示况将料组美联', 'priority': 1 },
{ 'eqName': 'B1二次镀膜机', 'eqCode': 'SB788842', 'pl': 'D线', 'content': '了进改京人表无当市手', 'priority': 2 },
{ 'eqName': 'A1预热机', 'eqCode': 'SB743966', 'pl': 'D线', 'content': '经府极元算进', 'priority': 2 },
{ 'eqName': 'B1一次冷却机', 'eqCode': 'SB138810', 'pl': 'E线', 'content': '代利值才之', 'priority': 1 },
{ 'eqName': 'A2一次冷却机', 'eqCode': 'SB861428', 'pl': 'D线', 'content': '还总速活直', 'priority': 3 },
{ 'eqName': 'B1二次镀膜机', 'eqCode': 'SB788842', 'pl': 'D线', 'content': '了进改京人表无当市手', 'priority': 2 },
{ 'eqName': 'A1预热机', 'eqCode': 'SB743966', 'pl': 'D线', 'content': '经府极元算进', 'priority': 2 },
{ 'eqName': 'B1一次冷却机', 'eqCode': 'SB138810', 'pl': 'E线', 'content': '代利值才之', 'priority': 1 },
{ 'eqName': 'A2一次冷却机', 'eqCode': 'SB861428', 'pl': 'D线', 'content': '还总速活直', 'priority': 3 },
{
'eqName': 'B1一次冷却机', 'eqCode': 'SB88566', 'content': '么中相育成他', 'priority': 4
"pl": "B", "eqName": "B1丝印", "eqCode": "B5SP20200109025453", "content": "网版推出异常", "priority": 3
},
{ 'eqName': 'A2一次冷却机', 'eqCode': 'SB861428', 'pl': 'D线', 'content': '还总速活直', 'priority': 3 },
{ "pl": "A", "eqName": "A2磨边后清洗", "eqCode": "A2CAE20210605043851", "content": "输送变频报警", "priority": 2 },
{ "pl": "B", "eqName": "B2磨边", "eqCode": "B4ED20200328154356", "content": "磨轮过载", "priority": 1 },
// { "pl": "B", "eqName": "镀膜", "eqCode": "B5FC20220307070115", "content": "胶辊变频异常", "priority": 2 },
{ "pl": "B", "eqName": "B2丝印", "eqCode": "B7SP20190927110003", "content": "印刷轴异常", "priority": 2 },
{
'eqName': 'B1一次冷却机', 'eqCode': 'SB88566', 'content': '么中相育成他', 'priority': 4
"pl": "A", "eqName": "A1磨边后清洗", "eqCode": "A3CAP20200727075125", "content": "进料检测异常", "priority": 3
},
{ 'eqName': 'A2一次固化机', 'eqCode': 'SB955674', 'pl': 'E线', 'content': '并来水报克见克代', 'priority': 2 },
{ 'eqName': 'A1预热机', 'eqCode': 'SB415026', 'pl': 'C线', 'content': '元动增断量争', 'priority': 1 },
{ 'eqName': 'A钢化炉', 'eqCode': 'SB19064', 'pl': 'D线', 'content': '很这置合它里革民', 'priority': 4 }
{ "pl": "A", "eqName": "A3丝印", "eqCode": "A7SP20200512213432", "content": "进气压力过低", "priority": 3 },
{
"pl": "A", "eqName": "A2磨边", "eqCode": "A4ED20220608145053", "content": "磨轮过载", "priority": 2
},
{ "pl": "B", "eqName": "B钢化", "eqCode": "B4CO20200526045602", "content": "传动变频器故障", "priority": 1 },
{
"pl": "B", "eqName": "B1磨边后清洗", "eqCode": "B6CAP20220326162041", "content": "毛刷过载", "priority": 2
},
{ "pl": "A", "eqName": "A1磨边", "eqCode": "A4ED20200325081934", "content": "磨轮过载", "priority": 2 },
{
"pl": "B", "eqName": "B1丝印", "eqCode": "B1SP20201220183649", "content": "印刷轴异常", "priority": 2
},
// { "pl": "A", "eqName": "镀膜", "eqCode": "A3SC20220414054819", "content": "固化变频异常", "priority": 2 },
{ "pl": "A", "eqName": "A3磨边", "eqCode": "A8ED20200704010549", "content": "磨轮过载", "priority": 2 },
{ "pl": "B", "eqName": "B3磨边后清洗", "eqCode": "B1CAT20200323134700", "content": "进料检测异常", "priority": 3 },
{ "pl": "A", "eqName": "A3丝印", "eqCode": "A1SP20200513020427", "content": "网版推出异常", "priority": 1 },
{ "pl": "A", "eqName": "A钢化", "eqCode": "A7CO20210928172616", "content": "加热炉体超温报警", "priority": 2 },
// { "pl": "A", "eqName": "镀膜", "eqCode": "A5SC20210104132647", "content": "固化变频异常", "priority": 1 },
{ "pl": "A", "eqName": "A钢化", "eqCode": "A4ED20210225140150", "content": "加热炉体超温报警", "priority": 1 },
{ "pl": "B", "eqName": "B2磨边后清洗", "eqCode": "B6CAP20200831083210", "content": "进料检测异常", "priority": 2 },
]
/** 设备分析 */
@@ -126,41 +149,34 @@ export const OEE_PER_LINE = {
}
export const equipmentAnalysisData = [
{ 'name': '冷端下片单元', 'oee': '0.14', 'mtbr': '0.60', 'mtbf': '0.32' },
{ 'name': '磨边单元', 'oee': '0.51', 'mtbr': '0.85', 'mtbf': '0.22' },
{ 'name': '丝印', 'oee': '0.75', 'mtbr': '0.92', 'mtbf': '0.93' },
{ 'name': '上片机器人', 'oee': '0.89', 'mtbr': '0.25', 'mtbf': '0.26' },
{ 'name': '激光打孔', 'oee': '0.05', 'mtbr': '0.59', 'mtbf': '0.15' },
{ 'name': '镀膜', 'oee': '0.55', 'mtbr': '0.85', 'mtbf': '0.65' }
{ 'name': '冷端下片单元', "oee": 0.62, "mtbr": 25, "mtbf": 54875 },
{ 'name': '磨边单元', "oee": 0.789, "mtbr": 25, "mtbf": 61323 },
{ 'name': '丝印', "oee": 0.83, "mtbr": 19, "mtbf": 89653 },
{ 'name': '上片机器人', "oee": 0.66, "mtbr": 30, "mtbf": 71839 },
{ 'name': '激光打孔', "oee": 0.71, "mtbr": 11, "mtbf": 39362 },
{ 'name': '镀膜', "oee": 0.686, "mtbr": 25, "mtbf": 62901 },
]
export const sparepartsProps = [
{ prop: 'name', label: '部件名称', align: 'center' },
{ prop: 'eq', label: '所属设备', align: 'center' },
{ prop: 'pl', label: '所属产线', align: 'center' },
{ prop: 'update_time', label: '更换时间', align: 'center' },
{ prop: 'remain', label: '剩余寿命', align: 'center', subcomponent: LifeRemainComponent },
{ prop: 'stock', label: '备件库存量', align: 'center' },
{ prop: 'location', label: '库位', align: 'center' }
{ prop: 'name', label: '部件名称', align: 'center', 'min-width': 100 },
{ prop: 'eq', label: '所属设备', align: 'center', 'min-width': 60 },
{ prop: 'pl', label: '所属产线', align: 'center', 'min-width': 60 },
{ prop: 'update_time', label: '更换时间', align: 'center', 'min-width': 100 },
{ prop: 'remain', label: '剩余寿命', align: 'center', subcomponent: LifeRemainComponent, 'min-width': 100 },
{ prop: 'stock', label: '备件库存量', align: 'center', 'min-width': 50 },
{ prop: 'location', label: '库位', align: 'center', 'min-width': 100 },
]
export const sparepartsDatalist = [
{ 'name': '激光打孔', 'eq': 'A2一次固化机', 'pl': 'C线', 'update_time': '2007-08-31 09:15:24', 'remain': -32, 'stock': 457, 'location': '库位74' },
{ 'name': '磨边单元', 'eq': 'B1一次冷却机', 'pl': 'C线', 'update_time': '2016-10-02 22:23:09', 'remain': -95, 'stock': 5600, 'location': '库位10' },
{ 'name': '激光打孔', 'eq': 'B1一次冷却机', 'pl': 'C线', 'update_time': '1996-09-17 08:57:52', 'remain': 46, 'stock': 6069, 'location': '库位87' },
{ 'name': '磨边单元', 'eq': 'A2一次固化机', 'pl': 'D线', 'update_time': '2018-07-18 13:15:01', 'remain': 86, 'stock': 2342, 'location': '库位83' },
{ 'name': '上片机器人', 'eq': 'A2一次固化机', 'pl': 'E线', 'update_time': '1998-06-11 09:01:10', 'remain': 84, 'stock': 4359, 'location': '库位12' },
{ 'name': '丝印', 'eq': 'A1一次固化机', 'pl': 'E线', 'update_time': '2016-02-13 16:20:01', 'remain': -23, 'stock': 888, 'location': '库位69' },
{ 'name': '激光打孔', 'eq': 'A1磨边清洗机', 'pl': 'B线', 'update_time': '2002-04-07 19:13:29', 'remain': 62, 'stock': 4366, 'location': '库位99' },
{ 'name': '丝印', 'eq': 'A1一次固化机', 'update_time': '1980-01-17 04:29:56', 'remain': 73, 'stock': 305, 'location': '库位68' },
{ 'name': '激光打孔', 'eq': 'A2一次冷却机', 'pl': 'B线', 'update_time': '2014-02-25 17:19:43', 'remain': 36, 'stock': 199, 'location': '库位86' },
{ 'name': '上片机器人', 'eq': 'A2一次冷却机', 'pl': 'C线', 'update_time': '2017-01-23 17:01:29', 'remain': -3, 'stock': 146, 'location': '库位79' },
{ 'name': '激光打孔', 'eq': 'A1磨边清洗机', 'pl': 'B线', 'update_time': '2002-04-07 19:13:29', 'remain': 62, 'stock': 4366, 'location': '库位99' },
{ 'name': '丝印', 'eq': 'A1一次固化机', 'update_time': '1980-01-17 04:29:56', 'remain': 73, 'stock': 305, 'location': '库位68' },
{ 'name': '激光打孔', 'eq': 'A2一次冷却机', 'pl': 'B线', 'update_time': '2014-02-25 17:19:43', 'remain': 36, 'stock': 199, 'location': '库位86' },
{ 'name': '上片机器人', 'eq': 'A2一次冷却机', 'pl': 'C线', 'update_time': '2017-01-23 17:01:29', 'remain': -3, 'stock': 146, 'location': '库位79' },
{ 'name': '镀膜', 'eq': 'A2一次固化机', 'pl': 'D线', 'update_time': '2013-02-19 01:29:19', 'remain': 37, 'stock': 6977, 'location': '库位85' },
{ 'name': '激光打孔', 'eq': 'A1预热机', 'pl': 'B线', 'update_time': '1972-04-26 06:54:43', 'remain': -82, 'stock': 5039, 'location': '库位38' }
{ "pl": "B", "name": "油墨、刮胶", "eq": "丝印机", "update_time": "2022-09-12 13:05:54", "remain": 104, "stock": 2, "location": "备件库-A-3" },
{ "pl": "A", "name": "镀膜液、异丙醇", "eq": "镀膜机", "update_time": "2022-09-24 08:34:36", "remain": 152, "stock": 10, "location": "备件库-D-1" },
{ "pl": "B", "name": "磨轮", "eq": "磨边机", "update_time": "2022-10-09 09:15:08", "remain": 169, "stock": 9, "location": "备件库-A-3" },
{ "pl": "B", "name": "镀膜辊", "eq": "镀膜机", "update_time": "2022-10-02 12:26:07", "remain": 33, "stock": 12, "location": "备件库-C-3" },
{ "pl": "A", "name": "磨轮", "eq": "磨边机", "update_time": "2022-11-14 04:43:21", "remain": 20, "stock": 11, "location": "备件库-E-9" },
{ "pl": "A", "name": "镀膜辊", "eq": "镀膜机", "update_time": "2022-10-25 15:19:57", "remain": 192, "stock": 8, "location": "备件库-D-9" },
{ "pl": "A", "name": "油墨、刮胶", "eq": "丝印机", "update_time": "2022-10-31 03:21:29", "remain": 96, "stock": 19, "location": "备件库-E-10" },
{ "pl": "B", "name": "网板", "eq": "丝印机", "update_time": "2022-09-01 15:49:08", "remain": 127, "stock": 8, "location": "备件库-E-10" },
{ "pl": "A", "name": "网板", "eq": "丝印机", "update_time": "2022-09-25 04:47:04", "remain": 83, "stock": 8, "location": "备件库-C-6" },
]
import { default as blue } from './blue.png'
@@ -198,24 +214,68 @@ const StatusComponent = {
},
render: function (h) {
return h('span', { style: { display: 'flex', /** justifyContent: 'center', */ alignItems: 'center', color: '#ffffffb3' } }, [
h('span', { style: { width: 'calc(16px * var(--beilv))', height: 'calc(16px * var(--beilv))', background: `url(${this.statusColor}) no-repeat`, backgroundPosition: '20%', backgroundSize: '100%', marginRight: 'calc(8px * var(--beilv))' } }, ''),
h('span', { style: { width: 'calc(16px * var(--beilv))', height: 'calc(16px * var(--beilv))', background: `url(${this.statusColor}) no-repeat`, backgroundPosition: '20%', backgroundSize: '100%', marginRight: 'calc(4px * var(--beilv))' } }, ''),
h('span', this.statusText)
])
}
}
export const rightSideProps = [
// 突发性维护
export const suddenMaintainProps = [
{ prop: 'orderId', label: '工单编号' },
{ prop: 'pl', label: '产线名称' },
{ prop: 'time', label: '时间' },
{ prop: 'eq', label: '设备名称' },
{ prop: 'status', label: '完成情况', subcomponent: StatusComponent },
{ prop: 'charger', label: '执行人' },
{ prop: 'team', label: '班组' },
{ prop: 'duration', label: '时长' }
]
export const rightSideDatalist = [
{ 'orderId': 'OD_3719', 'eq': 'A2一次固化机', 'pl': 'E线', 'status': 1, 'charger': '任洋', 'duration': 5 },
{ 'orderId': 'OD_6564', 'eq': 'B1二次镀膜机', 'pl': 'D线', 'status': 1, 'charger': '廖丽', 'duration': 6 },
{ 'orderId': 'OD_125', 'eq': 'A钢化炉', 'pl': 'E线', 'status': 3, 'charger': '赖秀兰', 'duration': 2 }
// { "orderId": "OD_7103", "pl": "C线", "status": 3, "charger": "邱伟", "duration": 7 },
// 计划内保养
export const inPlanMaintainProps = [
{ prop: 'orderId', label: '工单编号' },
{ prop: 'pl', label: '产线名称' },
{ prop: 'status', label: '完成情况', subcomponent: StatusComponent },
{ prop: 'team', label: '班组' },
{ prop: 'duration', label: '时长' }
]
// 防御性维护
export const defenceMaintainProps = [
{ prop: 'orderId', label: '工单编号' },
{ prop: 'eq', label: '设备名称' },
{ prop: 'status', label: '完成情况', subcomponent: StatusComponent },
{ prop: 'team', label: '班组' },
{ prop: 'duration', label: '时长' }
]
// 点检工单
export const wwwOrderProps = [
{ prop: 'orderId', label: '工单编号' },
{ prop: 'pl', label: '产线名称' },
{ prop: 'status', label: '完成情况', subcomponent: StatusComponent },
{ prop: 'team', label: '班组' },
{ prop: 'time', label: '时间' }
]
export const rightSideDatalist = [
{ "orderId": "WOD20200807030135", "time": "2022-11-12 14:08:04", "eq": "A1磨边", "status": 3, "team": "白班", "duration": "26min" },
{ "orderId": "WOD20210217143647", "time": "2022-11-15 18:48:40", "eq": "A1打孔", "status": 2, "team": "白班", "duration": "27min" },
{ "orderId": "WOD20200413103728", "time": "2022-11-26 20:11:39", "eq": "A1固化", "status": 1, "team": "夜班", "duration": "24min" },
]
export const rightSideDatalist2 = [
{ "orderId": "WOD20220403013343", "pl": "A", "status": 3, "team": "白班", "duration": "24min" },
{ "orderId": "WOD20211026022742", "pl": "A", "status": 2, "team": "夜班", "duration": "28min" },
{ "orderId": "WOD20210902180855", "pl": "A", "status": 2, "team": "夜班", "duration": "23min" },
]
export const rightSideDatalist3 = [
{ "orderId": "WOD20210829073921", "eq": "A3钢化后清洗", "status": 2, "team": "白班", "duration": "29min" },
{ "orderId": "WOD20220429180823", "eq": "A3丝印", "status": 2, "team": "夜班", "duration": "26min" },
{ "orderId": "WOD20220915050149", "eq": "A3磨边后清洗", "status": 3, "team": "白班", "duration": "21min" },
]
export const rightSideDatalist4 = [
{ "orderId": "WOD20210522165229", "pl": "A", "status": 2, "team": "夜班", "time": "2022-12-17 13:31:24" },
{ "orderId": "WOD20210114183705", "pl": "A", "status": 1, "team": "夜班", "time": "2022-11-22 02:59:50" },
{ "orderId": "WOD20211205183921", "pl": "B", "status": 1, "team": "白班", "time": "2022-11-27 10:52:19" },
]

View File

@@ -99,23 +99,19 @@ const tableProps = [
{
prop: 'createTime',
label: i18n.t('module.factory.abnormalAlarm.alarmTime'),
filter: timeFormatter,
align: 'center'
filter: timeFormatter
},
{
prop: 'alarmType',
label: i18n.t('module.factory.abnormalAlarm.alarmType'),
align: 'center'
label: i18n.t('module.factory.abnormalAlarm.alarmType')
},
{
prop: 'alarmGrade',
label: i18n.t('module.factory.abnormalAlarm.alarmLevel'),
align: 'center'
label: i18n.t('module.factory.abnormalAlarm.alarmLevel')
},
{
prop: 'alarmContent',
label: i18n.t('module.factory.abnormalAlarm.alarmReason'),
align: 'center'
label: i18n.t('module.factory.abnormalAlarm.alarmReason')
},
// {
// prop: 'alarmNotify',
@@ -131,7 +127,6 @@ const tableProps = [
{
prop: 'status',
label: i18n.t('module.factory.abnormalAlarm.status'),
align: 'center',
filter: factory('alarmStatus')
}
// {

View File

@@ -88,50 +88,41 @@ const tableProps = [
{
prop: 'createTime',
label: i18n.t('module.factory.abnormalAlarm.alarmStartTime'),
filter: timeFormatter,
align: 'center'
filter: timeFormatter
},
{
prop: 'handleTime',
label: i18n.t('module.factory.abnormalAlarm.alarmEndTime'),
filter: timeFormatter,
align: 'center'
filter: timeFormatter
},
{
prop: 'equipmentName',
label: i18n.t('module.factory.abnormalAlarm.equipmentName'),
align: 'center'
label: i18n.t('module.factory.abnormalAlarm.equipmentName')
},
{
prop: 'alarmGrade',
label: i18n.t('module.basicData.alarmManagement.AlarmLevel'),
align: 'center'
label: i18n.t('module.basicData.alarmManagement.AlarmLevel')
},
{
prop: 'equipmentArea',
label: i18n.t('module.factory.abnormalAlarm.equipmentArea'),
align: 'center'
label: i18n.t('module.factory.abnormalAlarm.equipmentArea')
},
{
prop: 'alarmContent',
label: i18n.t('module.factory.abnormalAlarm.alarmInfo'),
align: 'center'
label: i18n.t('module.factory.abnormalAlarm.alarmInfo')
},
{
prop: 'alarmNotify',
label: i18n.t('module.factory.abnormalAlarm.alarmNotify'),
align: 'center'
label: i18n.t('module.factory.abnormalAlarm.alarmNotify')
},
{
prop: 'status',
label: i18n.t('module.factory.abnormalAlarm.alarmStatus'),
align: 'center',
subcomponent: AlarmStatus
},
{
prop: 'remark',
label: i18n.t('module.basicData.visual.Remarks'),
align: 'center'
label: i18n.t('module.basicData.visual.Remarks')
}
]
export default {

View File

@@ -147,21 +147,22 @@ export default {
fetchList('order').then(response => {
if (response.data) {
this.dataList = response.data
this.dataList.push({
orderName: '22订单',
productName: 'xxx光伏玻璃2.0B',
productSize: '2*1128*2272',
productionLine: 'C线 D线 A线',
det: Array(3).fill({
inputNum: '-259730',
outputNum: '-772443',
passRate: 100,
recordTime: '2022-09-06T14:00:00',
scrapNum: '0',
sumInputNum: '259730',
sumOutputNum: '772443'
})
})
// 11-mes:
// this.dataList.push({
// orderName: '22订单',
// productName: 'xxx光伏玻璃2.0B',
// productSize: '2*1128*2272',
// productionLine: 'C线 D线 A线',
// det: Array(3).fill({
// inputNum: '-259730',
// outputNum: '-772443',
// passRate: 100,
// recordTime: '2022-09-06T14:00:00',
// scrapNum: '0',
// sumInputNum: '259730',
// sumOutputNum: '772443'
// })
// })
this.transformData()
} else {
this.dataList.splice(0)

View File

@@ -107,29 +107,24 @@ const tableProps = [
{
prop: 'planHandoverTime',
label: i18n.t('module.teamManager.shift.onlineTime'),
filter: timeFormatter,
align: 'center'
filter: timeFormatter
},
{
prop: 'planOfflineTime',
label: i18n.t('module.teamManager.shift.offlineTime'),
filter: timeFormatter,
align: 'center'
filter: timeFormatter
},
{
prop: 'className',
label: i18n.t('module.teamManager.shift.teamName'),
align: 'center'
label: i18n.t('module.teamManager.shift.teamName')
},
{
prop: 'classCode',
label: i18n.t('module.teamManager.shift.teamCode'),
align: 'center'
label: i18n.t('module.teamManager.shift.teamCode')
},
{
prop: 'planSection',
label: i18n.t('module.teamManager.shift.lineOrProcess'),
align: 'center',
// subcomponent: shiftManagerLine
subcomponent: {
props: {
@@ -161,18 +156,15 @@ const tableProps = [
},
{
prop: 'planTeamName',
label: i18n.t('module.teamManager.shift.handoverTeam'),
align: 'center'
label: i18n.t('module.teamManager.shift.handoverTeam')
},
{
prop: 'planTeamLeader',
label: i18n.t('module.teamManager.shift.handoverMonitor'),
align: 'center'
label: i18n.t('module.teamManager.shift.handoverMonitor')
},
{
prop: 'handoverStatus',
label: i18n.t('module.teamManager.shift.status'),
align: 'center',
subcomponent: shiftManagerStatus
},
// {

View File

@@ -8,10 +8,7 @@
-->
<template>
<div class="app-container">
<head-form
:form-config="headFormConfig"
@headBtnClick="btnClick"
/>
<head-form :form-config="headFormConfig" @headBtnClick="btnClick" />
<base-table
:top-btn-config="topBtnConfig"
:page="listQuery.current"
@@ -21,12 +18,7 @@
:is-loading="listLoading"
@clickTopBtn="clickTopBtn"
>
<method-btn
slot="handleBtn"
:width="trueWidth"
:method-list="tableBtn"
@clickBtn="handleClick"
/>
<method-btn slot="handleBtn" :width="trueWidth" :method-list="tableBtn" @clickBtn="handleClick" />
</base-table>
<pagination
v-show="total > 0"
@@ -35,11 +27,7 @@
:limit.sync="listQuery.size"
@pagination="getList()"
/>
<team-info-detail
v-if="addOrUpdateVisible"
ref="addOrUpdate"
@refreshDataList="getList"
/>
<team-info-detail v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getList" />
<team-info-add
v-if="addVisible"
ref="addNew"
@@ -61,6 +49,7 @@ import MethodBtn from '@/components/BaseTable/subcomponents/MethodBtn'
import { timeFormatter } from '@/filters'
import i18n from '@/lang'
// import data from '../pdf/content'
import { Random } from 'mockjs'
/**
* 表格表头配置项 TypeScript接口注释
@@ -98,35 +87,29 @@ const tableProps = [
// },
{
prop: 'className',
label: i18n.t('module.teamManager.teamInfo.className'),
align: 'center'
label: i18n.t('module.teamManager.teamInfo.className')
},
{
prop: 'classCode',
label: i18n.t('module.teamManager.teamInfo.classCode'),
align: 'center'
label: i18n.t('module.teamManager.teamInfo.classCode')
},
{
prop: 'planTeamName',
label: i18n.t('module.teamManager.teamInfo.planTeamName'),
align: 'center'
label: i18n.t('module.teamManager.teamInfo.planTeamName')
},
{
prop: 'planPreTeamName',
label: i18n.t('module.teamManager.teamInfo.planPreTeamName'),
align: 'center'
label: i18n.t('module.teamManager.teamInfo.planPreTeamName')
},
{
prop: 'planHandoverTime',
label: i18n.t('module.teamManager.teamInfo.onlineTime'),
filter: timeFormatter,
align: 'center'
filter: timeFormatter
},
{
prop: 'planOfflineTime',
label: i18n.t('module.teamManager.teamInfo.offlineTime'),
filter: timeFormatter,
align: 'center'
filter: timeFormatter
}
// {
// prop: 'workStatus',
@@ -224,9 +207,31 @@ export default {
this.listQuery.planHandoverEndTime = this.headFormValue.timeSlot ? this.headFormValue.timeSlot[1] : ''
this.$nextTick(() => {
this.listLoading = true
list(this.listQuery).then((response) => {
list(this.listQuery).then(response => {
if (response.data.records) {
this.list = response.data.records
// this.list = response.data.records
// 11-mes 数据模拟修改
this.list = response.data.records.map(item => {
let startDate = 2022 + '-' + '11-' + Random.integer(1, 29)
let endDate = startDate.split('-')
endDate[2] = +endDate[2] + Random.integer(0, 3)
let startHour = Random.integer(1, 22)
return {
...item,
planHandoverTime:
startDate + ' ' + (startHour < 10 ? '0' + startHour : '' + startHour) + Random.datetime(':mm:ss'),
planOfflineTime:
endDate.join('-') +
' ' +
(startHour + 1 < 10 ? +'0' + (startHour + 1) : 1 + startHour + '') +
Random.datetime(':mm:ss')
}
})
console.log("list;', ", this.list)
} else {
this.list.splice(0, this.list.length)
}
@@ -269,7 +274,7 @@ export default {
const blob = new Blob([response.data])
const reader = new FileReader()
reader.readAsDataURL(blob)
reader.onload = (e) => {
reader.onload = e => {
const a = document.createElement('a')
a.download = fileName
a.href = e.target.result
@@ -291,7 +296,7 @@ export default {
},
clickTopBtn(val) {
if (val === 'add') {
this.addNewInfo()// 新增
this.addNewInfo() // 新增
}
}
}

View File

@@ -10,6 +10,12 @@ export default {
mounted() {
this.$_resizeHandler = debounce(() => {
if (this.chart) {
if (this.setChartOption) {
this.setChartOption()
this.$nextTick(() => {
this.chart.resize()
})
} else
this.chart.resize()
}
}, 100)

View File

@@ -4,7 +4,7 @@
<section class="techy-body">
<div class="part-1">
<div>
<techy-container :title="'质量异常上报'" icon="质量1">
<techy-container :title="'离线异常上报'" icon="质量1">
<div class="table-wrapper fix-table-exception-report">
<techy-table
:page="1"
@@ -18,7 +18,7 @@
</div>
<div class=" fix-table-exception-alert">
<techy-container :title="'质量异常报警'" icon="质量2">
<techy-container :title="'在线异常上报'" icon="质量2">
<div class="table-wrapper">
<techy-table
:page="1"
@@ -38,82 +38,204 @@
<!-- 第一行 -->
<div class="quality-analysis__body__row-1">
<!-- 第一列 -->
<div class="grow-8 flex gap-16">
<div class="grow">
<techy-box class="" style="padding: calc(16px * var(--beilv));">
<techy-analysis-header>缺陷分类分析</techy-analysis-header>
<new-bar
:xlabel-font-size="10"
:xlabel-rotate="30"
:name-list="[
'擦划伤1',
'擦划伤2',
'擦划伤3',
'擦划伤4',
'擦划伤5',
'擦划伤6',
'擦划伤7',
'擦划伤8',
'擦划伤9',
'擦划伤0',
'擦划伤11',
'擦划伤12'
]"
chart-name="fault-category"
:data-list="[
{
topColor: 'rgba(59, 76, 118, 0.2)',
bottomColor: '#31A2FF',
name: '库存',
data: [32, 65, 65, 54, 40, 60, 64, 91, 55, 65, 37, 77]
}
]"
/>
</techy-box>
</div>
<div class="grow">
<techy-box class="" style="padding: calc(16px * var(--beilv));">
<techy-analysis-header>工序缺陷分析</techy-analysis-header>
<new-bar
chart-name="process-fault"
:name-list="['A', 'B', 'C', 'D', 'E', 'F']"
<div class="flex gap-16" style="flex: 1;">
<div style="width: calc(400px * var(--beilv)); flex: 1;">
<techy-box class="" style="padding: calc(8px * var(--beilv));">
<techy-analysis-header type="special">产线缺陷日对比</techy-analysis-header>
<div
class="absolute top-0 left-0"
style="position: absolute; width: 100%; height: 100%; top: 0; left: 0;"
>
<!-- <new-bar
chart-name="realtime-cost-production"
:name-list="['脏污', '破片', '崩边', '崩孔', '划擦伤', '其他']"
:data-list="[
{
topColor: 'rgba(59, 76, 118, 0.2)',
bottomColor: '#49FBD6',
name: '库存',
data: [64, 91, 55, 65, 37, 77]
name: '产线A',
data: [163, 184, 110, 22, 96, 74]
},
{
topColor: 'rgba(59, 76, 118, 0.2)',
bottomColor: '#31A2FF',
name: '产线B',
data: [162, 172, 122, 15, 82, 74]
}
]"
/> -->
<techy-bar
unit-name="单位/"
:datainfo="[
{
name: '产线A',
list: [163, 184, 110, 22, 96, 74]
},
{
name: '产线B',
list: [162, 172, 122, 15, 82, 74]
}
]"
/>
</div>
</techy-box>
</div>
<div style="width: calc(400px * var(--beilv)); flex: 1;">
<techy-box class="" style="padding: calc(8px * var(--beilv));">
<techy-analysis-header type="special">产线缺陷月对比</techy-analysis-header>
<div
class="absolute top-0 left-0"
style="position: absolute; width: 100%; height: 100%; top: 0; left: 0;"
>
<!-- <new-bar
chart-name="realtime-cost-production"
:name-list="['脏污', '破片', '崩边', '崩孔', '划擦伤', '其他']"
unit-name="单位: 千片"
:data-list="[
{
topColor: 'rgba(59, 76, 118, 0.2)',
bottomColor: '#49FBD6',
name: '产线A',
data: [4.12, 5.21, 3.2, 0.96, 2.61, 2.2]
},
{
topColor: 'rgba(59, 76, 118, 0.2)',
bottomColor: '#31A2FF',
name: '产线B',
data: [4.1, 4.34, 3.4, 0.32, 2.4, 2.14]
}
]"
/> -->
<techy-bar
unit-name="单位/千片"
:extra-space-between-zero="0.8"
:datainfo="[
{
name: '产线A',
list: [4.12, 5.21, 3.2, 0.96, 2.61, 2.2]
},
{
name: '产线B',
list: [4.1, 4.34, 3.4, 0.32, 2.4, 2.14]
}
]"
/>
</div>
</techy-box>
</div>
</div>
<!-- 第二列 -->
<div class="grow-6 flex gap-16">
<div class="width-222">
<div class="flex gap-16" style="flex: 1; width: 1px;">
<div class="" style="width: calc(380px * var(--beilv)); flex: 1;">
<techy-box class="" style="padding: calc(16px * var(--beilv));">
<techy-analysis-header>产线缺陷分析</techy-analysis-header>
<pl-fault-analysis-pie-chart />
<techy-analysis-header :show-top-icon="false">
产线缺陷分析
<template v-slot:dateSelect>
<div class="pl-select">
<span
:class="{ 'pl-select__active': plMode === 'a' }"
@click="
plMode = 'a'
chosenDatalist = getFaultDataList()
"
>
A
</span>
<span
:class="{ 'pl-select__active': plMode === 'b' }"
@click="
plMode = 'b'
chosenDatalist = getFaultDataList()
"
>
B
</span>
</div>
<div class="date-select">
<span :class="{ 'date-select__active': dateMode === 'day' }" @click="dateMode = 'day'"></span>
<span :class="{ 'date-select__active': dateMode === 'month' }" @click="dateMode = 'month'">
<span
:class="{ 'date-select__active': dateMode === 'day' }"
@click="
dateMode = 'day'
chosenDatalist = getFaultDataList()
"
>
</span>
<span
:class="{ 'date-select__active': dateMode === 'month' }"
@click="
dateMode = 'month'
chosenDatalist = getFaultDataList()
"
>
</span>
</div>
</template>
</techy-analysis-header>
<div style="position: absolute; top: 0; left:0; width: 100%; height: 100%;">
<span
style="display: inline-block; font-size: calc(10px * var(--beilv)); color: #fffc; position: absolute; top: calc(48px * var(--beilv)); left: calc(28px * var(--beilv));"
>
<!--单位千片和单位片 -->
{{ unit }}
</span>
<!-- data-period 是指数据是月数据还是日数据 -->
<pl-fault-analysis-pie-chart :data-list="chosenDatalist" :data-period="dateMode" />
</div>
</techy-box>
</div>
<div class="grow">
<div class="" style="width: calc(400px * var(--beilv)); flex: 1;">
<techy-box class="" style="padding: calc(16px * var(--beilv));">
<techy-analysis-header>产品成品率</techy-analysis-header>
<new-line-stack />
<div class="date-select">
<span :class="{ 'date-select__active': dateMode2 === 'day' }" @click="dateMode2 = 'day'"></span>
<span :class="{ 'date-select__active': dateMode2 === 'month' }" @click="dateMode2 = 'month'">
<!-- <productionRateHeader
@update-data="
obj => {
dataUpdateToken = obj.str
dateMode2 = obj.mode
}
"
>
产品成品率
</productionRateHeader> -->
<techy-analysis-header :show-top-icon="false">
产线成品率
<template v-slot:dateSelect>
<div class="pl-select">
<span
:class="{ 'pl-select__active': dateMode2 === 'day' }"
@click="
dateMode2 = 'day'
dataUpdateToken = Math.random() + ''
"
>
</span>
<span
:class="{ 'pl-select__active': dateMode2 === 'month' }"
@click="
dateMode2 = 'month'
dataUpdateToken = Math.random() + ''
"
>
</span>
</div>
<div class="date-select fake-legend">
<span>
<!-- 产线A -->
</span>
<span>
<!-- 产线B -->
</span>
</div>
</template>
</techy-analysis-header>
<div style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;">
<new-line-stack :data-update-token="dataUpdateToken" :mode="dateMode2" />
</div>
</techy-box>
</div>
</div>
@@ -123,19 +245,7 @@
<!-- 第二行 -->
<div class="quality-analysis__body__row-2">
<techy-box style="padding: calc(16px * var(--beilv));" class="flex flex-col">
<techy-analysis-header>产线A工序质量分析(数量)</techy-analysis-header>
<div class="grow grid gap-16-8 column-2 row-5">
<techy-analysis-bar
v-for="(item, index) in qualityAnalysisDatalist"
:key="index"
:name="item.name"
:amount="item.amount"
color="green"
/>
</div>
</techy-box>
<techy-box style="padding: calc(16px * var(--beilv));" class="flex flex-col">
<techy-analysis-header>产线B工序质量分析(数量)</techy-analysis-header>
<techy-analysis-header>产线A工序质量分析(日)</techy-analysis-header>
<div class="grow grid gap-16-8 column-2 row-5">
<techy-analysis-bar
v-for="(item, index) in qualityAnalysisDatalist"
@@ -147,10 +257,22 @@
</div>
</techy-box>
<techy-box style="padding: calc(16px * var(--beilv));" class="flex flex-col">
<techy-analysis-header>产线C工序质量分析(数量)</techy-analysis-header>
<techy-analysis-header>产线A工序质量分析(月)</techy-analysis-header>
<div class="grow grid gap-16-8 column-2 row-5">
<techy-analysis-bar
v-for="(item, index) in qualityAnalysisDatalist"
v-for="(item, index) in qualityAnalysisDatalistMonth"
:key="index"
:name="item.name"
:amount="item.amount"
color="blue"
/>
</div>
</techy-box>
<techy-box style="padding: calc(16px * var(--beilv));" class="flex flex-col">
<techy-analysis-header>产线B工序质量分析(日)</techy-analysis-header>
<div class="grow grid gap-16-8 column-2 row-5">
<techy-analysis-bar
v-for="(item, index) in qualityAnalysisDatalistB"
:key="index"
:name="item.name"
:amount="item.amount"
@@ -159,14 +281,14 @@
</div>
</techy-box>
<techy-box style="padding: calc(16px * var(--beilv));" class="flex flex-col">
<techy-analysis-header>产线D工序质量分析(数量)</techy-analysis-header>
<techy-analysis-header>产线B工序质量分析(月)</techy-analysis-header>
<div class="grow grid gap-16-8 column-2 row-5">
<techy-analysis-bar
v-for="(item, index) in qualityAnalysisDatalist"
v-for="(item, index) in qualityAnalysisDatalistMonthB"
:key="index"
:name="item.name"
:amount="item.amount"
color="pink"
color="orange"
/>
</div>
</techy-box>
@@ -185,11 +307,13 @@ import TechyBox from './components/TechyBox.vue'
import TechyTable from './components/TechyTable.vue'
import TechyAnalysisBar from './components/TechyAnalysisBar.vue'
import TechyAnalysisHeader from './components/TechyAnalysisHeader.vue'
// import productionRateHeader from './components/productionRateHeader.vue'
// import FaultCategoryChart from './components/charts/FaultCategoryChart.vue'
import PlFaultAnalysisPieChart from './components/charts/PlFaultAnalysisPieChart.vue'
import { mapGetters } from 'vuex'
import screenfull from 'screenfull'
import NewBar from './components/charts/newBar.vue'
import TechyBar from './components/charts/TechyBar.vue'
import NewLineStack from './components/charts/newLineStack.vue'
import { qualityDatalist, qualityTableProps, qualityExceptionDatalist, qualityExceptionTableProps } from './mockData'
@@ -205,33 +329,116 @@ export default {
TechyTable,
// FaultCategoryChart,
PlFaultAnalysisPieChart,
NewBar,
TechyBar,
NewLineStack
// productionRateHeader
},
data() {
const quexianDatalist = [
[
// 月a
{ value: 5.21, name: '破片' },
{ value: 3.2, name: '崩边' },
{ value: 4.12, name: '脏污' },
{ value: 2.61, name: '划擦伤' },
{ value: 0.96, name: '崩孔' },
{ value: 2.2, name: '其他' }
],
[
// 月b
{ value: 4.34, name: '破片' },
{ value: 3.4, name: '崩边' },
{ value: 4.1, name: '脏污' },
{ value: 2.4, name: '划擦伤' },
{ value: 0.32, name: '崩孔' },
{ value: 2.14, name: '其他' }
],
[
// 日a
{ value: 184, name: '破片' },
{ value: 110, name: '崩边' },
{ value: 163, name: '脏污' },
{ value: 96, name: '划擦伤' },
{ value: 22, name: '崩孔' },
{ value: 74, name: '其他' }
],
[
// 日b
{ value: 172, name: '破片' },
{ value: 122, name: '崩边' },
{ value: 162, name: '脏污' },
{ value: 82, name: '划擦伤' },
{ value: 15, name: '崩孔' },
{ value: 74, name: '其他' }
]
]
return {
dataUpdateToken: 'xx-token',
plMode: 'a',
dateMode: 'month',
dateMode2: 'month',
dateMode2: 'day',
qualityTableProps,
qualityDatalist,
qualityExceptionDatalist,
qualityExceptionTableProps,
qualityAnalysisDatalist: [
{ name: '热端', amount: 20233 },
{ name: '丝印', amount: 20233328 },
{ name: '原片', amount: 20 },
{ name: '钢化', amount: 2000 },
{ name: '上片磨边', amount: 20 },
{ name: '下片铺纸', amount: 202423 },
{ name: '镀膜', amount: 20 },
{ name: '包装', amount: 20 },
{ name: '清晰', amount: 20 },
{ name: '物流仓储', amount: 233920 }
]
{ name: '上片', amount: 22 },
{ name: '钢化', amount: 2 },
{ name: '磨边', amount: 221 },
{ name: '下片', amount: 27 },
{ name: '丝印', amount: 93 },
{ name: '包装', amount: 3 },
{ name: '打孔', amount: 31 },
{ name: '清洗', amount: 2 },
{ name: '镀膜', amount: 95 },
{ name: '其他', amount: 171 }
],
qualityAnalysisDatalistMonth: [
{ name: '上片', amount: 665 },
{ name: '钢化', amount: 56 },
{ name: '磨边', amount: 6541 },
{ name: '下片', amount: 820 },
{ name: '丝印', amount: 2790 },
{ name: '包装', amount: 83 },
{ name: '打孔', amount: 964 },
{ name: '清洗', amount: 61 },
{ name: '镀膜', amount: 2470 },
{ name: '其他', amount: 4959 }
],
qualityAnalysisDatalistB: [
{ name: '上片', amount: 16 },
{ name: '钢化', amount: 4 },
{ name: '磨边', amount: 201 },
{ name: '下片', amount: 21 },
{ name: '丝印', amount: 100 },
{ name: '包装', amount: 1 },
{ name: '打孔', amount: 27 },
{ name: '清洗', amount: 2 },
{ name: '镀膜', amount: 93 },
{ name: '其他', amount: 163 }
],
qualityAnalysisDatalistMonthB: [
{ name: '上片', amount: 698 },
{ name: '钢化', amount: 49 },
{ name: '磨边', amount: 6321 },
{ name: '下片', amount: 799 },
{ name: '丝印', amount: 2782 },
{ name: '包装', amount: 72 },
{ name: '打孔', amount: 992 },
{ name: '清洗', amount: 63 },
{ name: '镀膜', amount: 2510 },
{ name: '其他', amount: 4920 }
],
quexianDatalist,
chosenDatalist: quexianDatalist[0]
}
},
computed: {
...mapGetters(['sidebar'])
...mapGetters(['sidebar']),
unit() {
return this.dateMode === 'month' ? '单位: 千片' : '单位: 片'
}
},
methods: {
changeFullScreen() {
@@ -243,29 +450,39 @@ export default {
return false
}
screenfull.toggle(this.$refs['cockpit-container-quality'])
},
getFaultDataList() {
const { dateMode, plMode, quexianDatalist } = this
if (dateMode === 'month' && plMode === 'a') return quexianDatalist[0]
else if (dateMode === 'month' && plMode === 'b') return quexianDatalist[1]
else if (dateMode === 'day' && plMode === 'a') return quexianDatalist[2]
else if (dateMode === 'day' && plMode === 'b') return quexianDatalist[3]
}
}
}
</script>
<style scoped>
::-webkit-scrollbar {
.visual-container >>> ::-webkit-scrollbar {
width: calc(8px * var(--beilv));
}
::-webkit-scrollbar-track {
.visual-container >>> ::-webkit-scrollbar-track {
background-color: #14243f;
border-radius: 0;
}
::-webkit-scrollbar-button {
width: calc(8px * var(--beilv));
height: calc(8px * var(--beilv));
.visual-container >>> ::-webkit-scrollbar-button {
/* width: calc(8px * var(--beilv));
height: calc(8px * var(--beilv)); */
display: none;
width: 0;
height: 0;
background: #5bc4bf9f;
position: relative;
}
::-webkit-scrollbar-thumb {
.visual-container >>> ::-webkit-scrollbar-thumb {
border-radius: calc(8px * var(--beilv));
background: #5bc4bf9f;
}
@@ -349,7 +566,8 @@ export default {
.quality-analysis__body__row-1 {
height: calc(216px * var(--beilv));
overflow: hidden;
/* overflow: hidden; */
overflow: initial;
display: flex;
gap: calc(16px * var(--beilv));
}
@@ -409,16 +627,28 @@ export default {
gap: calc(16px * var(--beilv));
}
.pl-select,
.date-select {
position: absolute;
top: calc(16px * var(--beilv));
right: calc(10px * var(--beilv));
top: 0;
right: 0;
/* top: calc(16px * var(--beilv)); */
/* right: calc(22px * var(--beilv)); */
border-radius: calc(2px * var(--beilv));
overflow: hidden;
display: flex;
align-items: center;
height: 100%;
cursor: pointer;
}
.pl-select {
right: unset;
left: 0;
/* left: calc(10px * var(--beilv)); */
}
.pl-select span,
.date-select span {
display: inline-block;
width: calc(40px * var(--beilv));
@@ -429,6 +659,7 @@ export default {
background-color: #31878c94;
}
.pl-select span.pl-select__active,
.date-select span.date-select__active {
background-color: #42bbb7;
}
@@ -436,4 +667,14 @@ export default {
.width-222 {
width: calc(375px * var(--beilv));
}
.fake-legend {
cursor: unset;
}
.fake-legend span {
background: none;
cursor: none;
color: #dff1fe;
}
</style>

View File

@@ -1,5 +1,11 @@
<template>
<div class="techy-analysis-header">
<template v-if="type === 'special'">
<div class="special-wrapper">
<div class="special-wrapper__left"></div>
<div class="special-wrapper__middle">
<div class="special-wrapper__middle--inner">
<div style="transform: translateX(12%)">
<span class="top-icon">
<svg
width="100%"
@@ -19,7 +25,10 @@
id="编组-2备份"
transform="translate(28.000000, 8.500000) scale(1, -1) translate(-28.000000, -8.500000) translate(0.000000, 2.000000)"
>
<polygon id="路径-11" points="47.1645736 7.79376563e-14 43 0 52.2664792 13 56 13"></polygon>
<polygon
id="路径-11"
points="47.1645736 7.79376563e-14 43 0 52.2664792 13 56 13"
></polygon>
<polygon
id="路径-11备份"
opacity="0.8"
@@ -70,7 +79,10 @@
id="编组-2备份-2"
transform="translate(262.000000, 8.500000) scale(-1, -1) translate(-262.000000, -8.500000) translate(234.000000, 2.000000)"
>
<polygon id="路径-11" points="47.1645736 7.79376563e-14 43 0 52.2664792 13 56 13"></polygon>
<polygon
id="路径-11"
points="47.1645736 7.79376563e-14 43 0 52.2664792 13 56 13"
></polygon>
<polygon
id="路径-11备份"
opacity="0.8"
@@ -100,11 +112,137 @@
</svg>
</span>
</div>
</div>
</div>
<div class="special-wrapper__right">
<div class="special-wrapper__right--inner">
<div class="pla" style="margin-right: calc(2px * var(--beilv));">产线A</div>
<div class="plb">产线B</div>
</div>
</div>
</div>
</template>
<template v-else>
<span v-if="showTopIcon" class="top-icon">
<svg
width="100%"
height="100%"
viewBox="0 0 56 13"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<title>left</title>
<g id="2MES。2-6蓝底-7、8白底" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="2-5质量管理" transform="translate(-419.000000, -808.000000)" fill="#31A6AE">
<g id="编组-16备份-7" transform="translate(360.000000, 513.000000)">
<g id="编组-20备份" transform="translate(24.000000, 277.000000)">
<g id="编组-13备份" transform="translate(35.000000, 16.000000)">
<g
id="编组-2备份"
transform="translate(28.000000, 8.500000) scale(1, -1) translate(-28.000000, -8.500000) translate(0.000000, 2.000000)"
>
<polygon id="路径-11" points="47.1645736 7.79376563e-14 43 0 52.2664792 13 56 13"></polygon>
<polygon
id="路径-11备份"
opacity="0.8"
points="36.1645736 7.79376563e-14 32 0 41.2664792 13 45 13"
></polygon>
<polygon
id="路径-11备份-3"
opacity="0.4"
points="14.1645736 7.79376563e-14 10 0 19.2664792 13 23 13"
></polygon>
<polygon
id="路径-11备份-2"
opacity="0.601434"
points="25.1645736 7.79376563e-14 21 0 30.2664792 13 34 13"
></polygon>
<polygon
id="路径-11备份-4"
opacity="0.201434"
points="4.16457365 7.79376563e-14 5.06480115e-16 0 9.26647921 13 13 13"
></polygon>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>
</span>
<span class="techy-analysis-header__title">
<slot />
</span>
<span v-if="showTopIcon" class="top-icon">
<svg
width="100%"
height="100%"
viewBox="0 0 56 13"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<title>right</title>
<g id="2MES。2-6蓝底-7、8白底" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="2-5质量管理" transform="translate(-653.000000, -808.000000)" fill="#31A6AE">
<g id="编组-16备份-7" transform="translate(360.000000, 513.000000)">
<g id="编组-20备份" transform="translate(24.000000, 277.000000)">
<g id="编组-13备份" transform="translate(35.000000, 16.000000)">
<g
id="编组-2备份-2"
transform="translate(262.000000, 8.500000) scale(-1, -1) translate(-262.000000, -8.500000) translate(234.000000, 2.000000)"
>
<polygon id="路径-11" points="47.1645736 7.79376563e-14 43 0 52.2664792 13 56 13"></polygon>
<polygon
id="路径-11备份"
opacity="0.8"
points="36.1645736 7.79376563e-14 32 0 41.2664792 13 45 13"
></polygon>
<polygon
id="路径-11备份-3"
opacity="0.4"
points="14.1645736 7.79376563e-14 10 0 19.2664792 13 23 13"
></polygon>
<polygon
id="路径-11备份-2"
opacity="0.601434"
points="25.1645736 7.79376563e-14 21 0 30.2664792 13 34 13"
></polygon>
<polygon
id="路径-11备份-4"
opacity="0.201434"
points="4.16457365 7.79376563e-14 5.06480115e-16 0 9.26647921 13 13 13"
></polygon>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>
</span>
</template>
<slot name="dateSelect" />
</div>
</template>
<script>
export default {
name: 'TechyAnalysisHeader',
props: {
type: {
type: String,
default: 'dafault-type'
},
showTopIcon: {
type: Boolean,
default: true
}
},
data() {
return {}
}
@@ -115,6 +253,9 @@ export default {
.techy-analysis-header {
text-align: center;
margin-bottom: calc(16px * var(--beilv));
position: relative;
white-space: nowrap;
z-index: 1;
}
.techy-analysis-header__title {
@@ -126,6 +267,92 @@ export default {
.top-icon {
display: inline-block;
width: calc(56px * var(--beilv));
height: calc(13px * var(--beilv));
height: calc(12px * var(--beilv));
margin-bottom: calc(2px * var(--beilv));
}
.legend-right {
display: flex;
gap: calc(8px * var(--beilv));
white-space: nowrap;
overflow: hidden;
}
.legend-item {
font-size: calc(10px * var(--beilv));
line-height: 1.5;
color: #dff1fe;
display: flex;
align-items: center;
}
.legend-item::before {
content: '';
display: inline-block;
width: calc(8px * var(--beilv));
height: calc(8px * var(--beilv));
background: #fffc;
margin-right: calc(4px * var(--beilv));
}
.special-wrapper {
position: absolute;
top: 0;
left: 0;
transform: skewX(35deg);
background: #fff0;
width: 100%;
height: calc(22px * var(--beilv));
display: flex;
justify-content: center;
align-items: center;
}
.special-wrapper__left {
width: 1px;
flex: 1;
}
.special-wrapper__middle {
overflow: hidden;
}
.special-wrapper__middle--inner {
transform: skewX(-35deg);
white-space: nowrap;
display: flex;
height: 100%;
align-items: center;
}
.special-wrapper__right {
padding-left: calc(8px * var(--beilv));
padding-right: calc(8px * var(--beilv));
}
.special-wrapper__right--inner {
transform: skewX(-35deg);
display: flex;
align-items: center;
gap: calc(4px * var(--beilv));
height: 100%;
width: calc(100px * var(--beilv));
padding-left: calc(6px * var(--beilv));
font-size: calc(12px * var(--beilv));
color: #fff9;
}
.special-wrapper__right--inner > div::before {
content: '';
display: inline-block;
margin-right: calc(2px * var(--beilv));
width: calc(8px * var(--beilv));
height: calc(8px * var(--beilv));
}
.plb::before {
background: linear-gradient(to top, #49fbd6, transparent);
}
.pla::before {
background: linear-gradient(to top, #49b2ff, transparent);
}
</style>

View File

@@ -126,8 +126,9 @@ export default {
}
.visual-base-table-container >>> ::-webkit-scrollbar-button {
width: calc(8px * var(--beilv));
height: calc(8px * var(--beilv));
/* width: calc(8px * var(--beilv));
height: calc(8px * var(--beilv)); */
display: none;
background: #5bc4bf9f;
position: relative;
}
@@ -137,15 +138,10 @@ export default {
background: #5bc4bf9f;
}
/* .visual-base-table-container {
min-width: 30vw;
} */
.visual-base-table-container {
height: 100%;
}
/* .visual-base-table-container >>> .el-table {
min-width: 120%;
} */
/* 清除默认样式 */
.visual-base-table-container >>> th.gutter {
display: none;
@@ -200,13 +196,13 @@ export default {
}
.visual-base-table-container >>> .el-table tbody tr:nth-child(odd) {
background-color: #0e203e;
/* background-color: #0e203e90; */
/* background-color: #0e203e; */
background-color: #0e203ecc;
}
.visual-base-table-container >>> .el-table tbody tr:nth-child(even),
.visual-base-table-container >>> .el-table thead {
background-color: #203760;
/* background-color: #20376090; */
/* background-color: #203760; */
background-color: #213961cc;
}
</style>

View File

@@ -13,6 +13,14 @@ export default {
id: {
type: String,
default: 'default-fault-analysis-id'
},
dataList: {
type: Array,
required: true
},
dataPeriod: {
type: String,
default: 'month'
}
},
data() {
@@ -37,10 +45,23 @@ export default {
y: 0,
x2: 1,
y2: 1,
colorStops: [
{ color: '#DDB112', offset: 0 }, // 黄
{ color: '#DDB112b0', offset: 0.2 },
{ color: '#FFFFFF00', offset: 1 }
],
global: false
},
{
type: 'linear',
x: 1,
y: 1,
x2: 0,
y2: 0,
colorStops: [
{ color: '#FFFFFF00', offset: 0 },
{ color: '#DDB11200', offset: 0.1 },
{ color: '#DDB112', offset: 1 } //
{ color: '#49FBD600', offset: 0.1 },
{ color: '#74DC85', offset: 1 } // 浅绿
],
global: false
},
@@ -59,9 +80,9 @@ export default {
},
{
type: 'linear',
x: 1,
y: 1,
x2: 0,
x: 0,
y: 0.5,
x2: 1,
y2: 0,
colorStops: [
{ color: '#FFFFFF00', offset: 0 },
@@ -73,8 +94,8 @@ export default {
{
type: 'linear',
x: 0,
y: 1,
x2: 0,
y: 0.5,
x2: 1,
y2: 0,
colorStops: [
{ color: '#FFFFFF00', offset: 0 },
@@ -85,47 +106,40 @@ export default {
}
]
const demoData = [
{ value: 55, name: 'A' },
{ value: 33, name: 'B' },
{ value: 22, name: 'C' },
{ value: 11, name: 'D' },
{ value: 32, name: 'E' }
]
return {
chart: null,
// default configs
configs: {
title: {
textAlign: 'center',
left: '63%',
top: '35%',
text: '33039',
textVerticalAlign: 'middle',
left: '65%',
top: '46%',
text: '',
textStyle: {
color: '#fff',
fontSize: 16,
fontWeight: 'normal'
},
itemGap: 2,
subtext: '总数',
itemGap: 5,
subtext: '总数/片',
subtextStyle: {
color: '#fff',
fontSize: 12,
fontWeight: 'lighter'
fontSize: 12
}
},
legend: {
top: 0,
selectedMode: false,
top: '12%',
bottom: 0,
left: -10,
left: 0,
orient: 'vertical',
icon: 'none',
itemGap: 5,
itemGap: 8,
itemWidth: 10,
formatter: function(name) {
// test data - dynamic
const testData = demoData
// 在下面动态设置
formatter: name => {
const testData = this.dataList
let pieLegendVale = {}
testData.filter((item, index) => {
@@ -133,7 +147,7 @@ export default {
pieLegendVale = item
}
})
const color = ['c', 'd', 'e', 'f', 'g']
const color = ['c', 'd', 'h', 'e', 'f', 'g']
const arr = [
'{' + color[testData.findIndex(item => item.name === name)] + '|}',
'{b|' + pieLegendVale.name + '}',
@@ -146,58 +160,51 @@ export default {
a: {
fontSize: 10,
color: 'rgba(255, 255, 255, 0.7)',
lineHeight: 16
lineHeight: 16,
width: 48,
align: 'left'
},
b: {
// verticalAlign: 'top',
// align: 'center',
width: 40,
align: 'left',
fontSize: 10,
color: 'rgba(255, 255, 255)'
},
c: {
// verticalAlign: 'top',
// align: 'center',
width: 10,
borderRadius: 5,
height: 10,
backgroundColor: '#FB418C'
// backgroundColor: '#1A99FF'
},
d: {
// verticalAlign: 'top',
// align: 'center',
width: 10,
borderRadius: 5,
height: 10,
backgroundColor: '#DDB112'
// backgroundColor: '#A691FF'
},
h: {
width: 10,
borderRadius: 5,
height: 10,
backgroundColor: '#74DC85'
},
e: {
// verticalAlign: 'top',
// align: 'center',
width: 10,
borderRadius: 5,
height: 10,
backgroundColor: '#1A99FF'
// backgroundColor: '#FB418C'
},
f: {
// verticalAlign: 'top',
// align: 'center',
width: 10,
borderRadius: 5,
height: 10,
backgroundColor: '#A691FF'
// backgroundColor: '#49FBD6'
},
g: {
// verticalAlign: 'top',
// align: 'center',
width: 10,
borderRadius: 5,
height: 10,
backgroundColor: '#49FBD6'
// backgroundColor: '#DDB112'
}
}
}
@@ -207,12 +214,13 @@ export default {
{
name: 'PieForm',
type: 'pie',
center: ['65%', '48%'],
radius: ['60%', '85%'],
silent: true,
center: ['66%', '56%'],
radius: ['45%', '65%'],
avoidLabelOverlap: true,
label: {
formatter: params => {
const colorMap = ['first', 'second', 'third', 'fourth', 'fifth']
const colorMap = ['first', 'second', 'sixth', 'third', 'fourth', 'fifth']
return `{${colorMap[params.dataIndex]}|${params.percent} %}`
},
rich: {
@@ -220,7 +228,8 @@ export default {
second: { color: '#DDB112', fontSize: 8 },
third: { color: '#1A99FF', fontSize: 8 },
fourth: { color: '#A691FF', fontSize: 8 },
fifth: { color: '#49FBD6', fontSize: 8 }
fifth: { color: '#49FBD6', fontSize: 8 },
sixth: { color: '#74DC85', fontSize: 8 }
}
},
labelLine: {
@@ -240,7 +249,7 @@ export default {
colorGradient.y = 0
colorGradient.x2 = 1
colorGradient.y2 = 1
} else if (totalRate + percent >= 50 && dataIndex == 1) {
} else if (totalRate + percent >= 50 && dataIndex === 1) {
colorGradient.x = 1
colorGradient.y = 1
colorGradient.x2 = 0
@@ -254,12 +263,21 @@ export default {
return colorGradient
}
},
data: demoData
data: this.dataList
}
]
}
}
},
watch: {
dataList: function(val) {
if (val && Array.isArray(val) && val.length) {
this.applyChartOption(val)
}
}
},
mounted() {
window.addEventListener('resize', () => {
if (this.chart) {
@@ -284,55 +302,64 @@ export default {
const beilv = document.documentElement.style.getPropertyValue('--beilv')
return beilv * baseSize
},
// calcRate(baseRate) {
// const beilv = document.documentElement.style.getPropertyValue('--beilv')
// return baseRate * beilv
// },
applyChartOption() {
const fs1 = this.calcFontsize(1 /** px*/)
const fs3 = this.calcFontsize(3 /** px*/)
applyChartOption(datalist) {
const fs5 = this.calcFontsize(5 /** px*/)
const fs8 = this.calcFontsize(8 /** px*/)
const fs10 = this.calcFontsize(10 /** px*/)
const fs14 = this.calcFontsize(14 /** px*/)
const fs16 = this.calcFontsize(16 /** px*/)
const rate10 = this.calcFontsize(10 /** % */)
const rate3 = this.calcFontsize(3 /** % */)
// const fs10 = this.calcFontsize(10 /** px*/)
const fs12 = this.calcFontsize(12 /** px*/)
const fs13 = this.calcFontsize(13 /** px*/)
// const fs18 = this.calcFontsize(18 /** px*/)
const fs20 = this.calcFontsize(20 /** px*/)
const legendTextFixWidth = this.calcFontsize(48 /** px*/)
const legnedTop = this.calcFontsize(72 /** px*/)
// const legendTopRate = this.calcFontsize(30 /** % */)
this.configs.title.textStyle.fontSize = fs14
this.configs.title.subtextStyle.fontSize = fs10
this.configs.title.text =
this.dataPeriod === 'month'
? this.dataList.reduce((prev, curr) => prev + curr.value * 1000, 0) // 如果是月数据,单位为 千片
: this.dataList.reduce((prev, curr) => prev + curr.value, 0) // 如果是日数据,单位为 片
this.configs.title.textStyle.fontSize = fs20
this.configs.title.subtextStyle.fontSize = fs13
this.configs.legend.top = rate10 + '%'
this.configs.legend.left = rate3 + '%'
this.configs.legend.itemGap = fs5
this.configs.legend.itemWidth = fs10
// this.configs.legend.top = legendTopRate + '%'
this.configs.legend.top = legnedTop
this.configs.legend.left = 3 + '%'
this.configs.legend.itemGap = fs8
this.configs.legend.itemWidth = fs8
this.configs.legend.textStyle.rich.a.fontSize = fs10
this.configs.legend.textStyle.rich.a.lineHeight = fs10
this.configs.legend.textStyle.rich.b.fontSize = fs10
this.configs.legend.textStyle.rich.a.fontSize = fs12
this.configs.legend.textStyle.rich.a.lineHeight = fs12
this.configs.legend.textStyle.rich.a.width = legendTextFixWidth
this.configs.legend.textStyle.rich.b.fontSize = fs12
this.configs.legend.textStyle.rich.b.width = legendTextFixWidth
// this.configs.legend.textStyle.rich.b.lineHeight = fs16
this.configs.legend.textStyle.rich.c.width = fs10
this.configs.legend.textStyle.rich.c.height = fs10
this.configs.legend.textStyle.rich.c.width = fs8
this.configs.legend.textStyle.rich.c.height = fs8
this.configs.legend.textStyle.rich.c.borderRadius = fs5
this.configs.legend.textStyle.rich.d.width = fs10
this.configs.legend.textStyle.rich.d.height = fs10
this.configs.legend.textStyle.rich.d.width = fs8
this.configs.legend.textStyle.rich.d.height = fs8
this.configs.legend.textStyle.rich.d.borderRadius = fs5
this.configs.legend.textStyle.rich.e.width = fs10
this.configs.legend.textStyle.rich.e.height = fs10
this.configs.legend.textStyle.rich.e.width = fs8
this.configs.legend.textStyle.rich.e.height = fs8
this.configs.legend.textStyle.rich.e.borderRadius = fs5
this.configs.legend.textStyle.rich.f.width = fs10
this.configs.legend.textStyle.rich.f.height = fs10
this.configs.legend.textStyle.rich.f.width = fs8
this.configs.legend.textStyle.rich.f.height = fs8
this.configs.legend.textStyle.rich.f.borderRadius = fs5
this.configs.legend.textStyle.rich.g.width = fs10
this.configs.legend.textStyle.rich.g.height = fs10
this.configs.legend.textStyle.rich.g.width = fs8
this.configs.legend.textStyle.rich.g.height = fs8
this.configs.legend.textStyle.rich.g.borderRadius = fs5
this.configs.legend.textStyle.rich.h.width = fs8
this.configs.legend.textStyle.rich.h.height = fs8
this.configs.legend.textStyle.rich.h.borderRadius = fs5
this.configs.series[0].label.rich.first.fontSize = fs10
this.configs.series[0].label.rich.second.fontSize = fs10
this.configs.series[0].label.rich.third.fontSize = fs10
this.configs.series[0].label.rich.fourth.fontSize = fs10
this.configs.series[0].label.rich.fifth.fontSize = fs10
this.configs.series[0].label.rich.first.fontSize = fs12
this.configs.series[0].label.rich.second.fontSize = fs12
this.configs.series[0].label.rich.third.fontSize = fs12
this.configs.series[0].label.rich.fourth.fontSize = fs12
this.configs.series[0].label.rich.fifth.fontSize = fs12
this.configs.series[0].label.rich.sixth.fontSize = fs12
if (datalist) this.configs.series[0].data = datalist
this.chart.setOption(this.configs)
}
}
@@ -341,9 +368,13 @@ export default {
<style scoped>
.chartContainer {
height: calc(100% - (36px * var(--beilv)));
position: relative;
/* height: calc(100% - (36px * var(--beilv))); */
/* position: relative; */
/* position: absolute;
top: 0;
left: 0; */
width: 100%;
height: 100%;
}
.chartContainer > div {

View File

@@ -0,0 +1,323 @@
<template>
<div ref="techyBar" class="techy-bar"></div>
</template>
<script>
import echarts from 'echarts' // echarts theme
import resize from '@/views/OperationalOverview/components/mixins/resize'
import * as BottomPic from './bottom.png'
export default {
name: 'TechyBar',
props: {
datainfo: {
type: Array,
default: () => [
{
name: '产线A',
list: [100, 102, 104, 105, 100, 117]
},
{
name: '产线B',
list: [110, 92, 124, 85, 100, 120]
}
]
},
unitName: {
type: String,
default: ''
},
extraSpaceBetweenZero: {
type: Number,
default: 25
}
},
mixins: [resize],
data() {
const color_gradients = [
/** 蓝 */
{
direction: 'to top',
from: '#49B2FF', // * 0.6 是底部颜色和顶部颜色
to: '#49B2FF00',
topAndBottom: '#49B2FF9F'
},
/** 绿 */
{
direction: 'to top',
from: '#49FBD6', // * 0.6 是底部颜色和顶部颜色
to: '#49FBD600',
topAndBottom: '#49FBD69F'
}
]
let result = []
this.datainfo.map((pl, index) => {
let topCircle = {
__position: 'top',
name: pl.name,
barGap: '10%',
barCategoryGap: '48%',
type: 'pictorialBar',
symbol: 'circle',
symbolPosition: 'end',
symbolOffset: ['25%', '-50%'],
// symbolSize: ['100%', 6],
symbolSize: ['200%', 6],
data: pl.list,
z: 10,
itemStyle: {
// color: color_gradients[index].topAndBottom
color: {
type: 'linear',
x: 0,
y: 1,
x2: 0,
y2: 0,
colorStops: [
{
offset: 0,
color: color_gradients[index].topAndBottom
},
{
offset: 1,
color: color_gradients[index].to
}
],
global: false // 缺省为 false
}
}
}
let bottomCircle = {
__position: 'top',
name: pl.name,
barGap: '10%',
barCategoryGap: '48%',
type: 'pictorialBar',
symbol: 'circle',
symbolOffset: ['-25%', '50%'],
symbolSize: ['200%', 6],
data: pl.list,
z: 10,
itemStyle: {
color: color_gradients[index].from
}
}
let mainBar = {
__position: 'main',
type: 'bar',
name: pl.name,
// barWidth: 20, // 不需要设置 barWidth
barGap: '10%',
barCategoryGap: '48%',
data: pl.list,
z: 0,
itemStyle: {
color: {
type: 'linear',
x: 0,
y: 1,
x2: 0,
y2: 0,
colorStops: [
{
offset: 0,
color: color_gradients[index].from
},
{
offset: 0.15,
color: color_gradients[index].topAndBottom
},
{
offset: 1,
color: color_gradients[index].to
}
],
global: false // 缺省为 false
}
},
label: {
show: true,
position: 'top',
color: '#fff8',
fontSize: 10,
offset: [0, 6]
}
}
result.push(topCircle)
result.push(mainBar)
result.push(bottomCircle)
})
return {
BottomPic,
width: 0,
chart: null,
option: {
grid: {
left: '10%',
top: 72,
bottom: 28
},
tooltip: {
show: true,
trigger: 'axis',
axisPointer: {
type: 'shadow',
shadowStyle: {
color: 'rgba(255,255,255,0.1)'
}
},
padding: 10,
backgroundColor: 'rgba(13, 29, 53, 0.8)',
extraCssText: 'width: 128px !important; height: auto !important;',
formatter: params => {
const [, a, , , b] = params
return `<div style="display: flex; flex-direction: column; gap: 2px; align-items: flex-start; ">
<h2 style="font-size: calc(14px * var(--beilv)); margin: 0 0 4px; font-weight: normal; color: white;">${
a.name
}</h2>
<div style="display: flex; align-items: center; gap: 8px;">
<span style="width: 12px; height: 12px; background: linear-gradient(to top, ${
a.color.colorStops[0].color
}, transparent);"></span>
<span style="font-size: calc(10px * var(--beilv));">${a.seriesName}: ${a.data}</span>
</div>
<div style="display: flex; align-items: center; gap: 8px;">
<span style="width: 12px; height: 12px; background: linear-gradient(to top, ${
b.color.colorStops[0].color
}, transparent);"></span>
<span style="font-size: calc(10px * var(--beilv));">${b.seriesName}: ${b.data}</span>
</div>
</div>`
}
},
xAxis: {
type: 'category',
axisTick: {
show: false
},
axisLine: {
onZero: false,
show: false,
lineStyle: {}
},
axisLabel: {
color: '#fff8',
fontSize: 12
},
data: ['脏污', '破片', '崩边', '崩孔', '划擦伤', '其他']
// axisPointer: {
// show: true,
// type: 'shadow',
// label: {
// show: true,
// formatter: params => {
// let info_arr = params.seriesData.filter(item => item.seriesType === 'bar')
// let v = [`<${info_arr[0].name}>详细数据: \n`]
// info_arr.map(item => { v.push(`${item.seriesName}: ${item.data}`) })
// return v.join('\n')
// }
// }
// }
},
yAxis: {
type: 'value',
// min: -25,
min: this.extraSpaceBetweenZero * -1,
name: this.unitName + ' ',
nameTextStyle: {
color: '#fff8',
fontSize: 12,
verticalAlign: 'top',
align: 'right'
},
nameGap: 20,
axisLine: {
show: true,
lineStyle: {
color: '#31A2FF'
}
},
axisLabel: {
color: '#fff8',
fontSize: 12,
/** y轴不从0开始也可以用 xAxis 向下 offset 的方式模拟 **/
formatter: function(value, index) {
if (value < 0) {
return ''
}
return value
}
},
axisTick: { show: false },
splitLine: {
lineStyle: {
color: '#569acd',
type: 'dotted',
opacity: 0.2
}
}
},
series: result,
graphic: [
{
type: 'image',
left: 0,
bottom: 0,
scaleX: 0.8,
style: {
image: 'image url',
height: 0,
width: 0
}
}
]
}
}
},
mounted() {
window.addEventListener('resize', this.refreshOption)
if (!this.chart) this.chart = echarts.init(this.$refs.techyBar)
this.$nextTick(() => {
this.updateOption(this.option)
this.chart.setOption(this.option)
})
},
methods: {
updateOption(option) {
// console.log('option', this.BottomPic.default)
let width = this.$refs.techyBar.querySelector('div').clientWidth
let height = this.$refs.techyBar.querySelector('div').clientHeight
option.graphic[0].style.width = width * 0.85
option.graphic[0].style.height = height * 0.25
option.graphic[0].style.image = this.BottomPic.default
option.graphic[0].left = '10%'
option.graphic[0].bottom = 28
},
refreshOption() {
this.updateOption(this.option)
this.chart.setOption(this.option)
}
}
}
</script>
<style scoped>
.techy-bar {
position: relative;
width: 100%;
height: 100%;
}
.techy-bar >>> div {
width: 100% !important;
height: 100% !important;
}
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

View File

@@ -1,303 +0,0 @@
<template>
<div
ref="chartContainer"
class="chartContainer"
:class="bindClass"
style="position: relative; width: 100%; height: calc(100% - 36px)"
/>
</template>
<script>
import echarts from 'echarts' // echarts theme
import resize from '@/views/OperationalOverview/components/mixins/resize'
export default {
name: 'OverviewBar',
mixins: [resize],
props: {
chartName: {
type: String,
default: ''
},
xlabelFontSize: {
type: Number,
default: 12
},
xlabelRotate: {
type: Number,
default: 0
},
nameList: {
type: Array,
default: () => []
},
dataList: {
type: Array,
default: () => []
}
},
data() {
return {
chart: null,
series: []
}
},
computed: {
bindClass() {
return {
'fault-category-chart': this.chartName === 'fault-category',
'process-fault-chart': this.chartName === 'process-fault'
}
}
},
mounted() {
if (this.dataList.length > 1) {
const barWidth = 400 / 2 / this.dataList[0].data.length
this.series = [
{
// 柱体
name: this.dataList[0].name,
type: 'bar',
barWidth,
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: this.dataList[0].topColor },
{ offset: 1, color: this.dataList[0].bottomColor }
])
},
data: this.dataList[0].data
},
{
// 柱顶
name: this.dataList[0].name,
type: 'pictorialBar',
barWidth,
symbol: 'diamond',
symbolPosition: 'end',
symbolOffset: [0, '-50%'],
symbolSize: [30, 12],
zlevel: 2,
itemStyle: { color: this.dataList[0].topColor },
data: this.dataList[0].data
},
{
// 柱底
name: this.dataList[0].name,
type: 'pictorialBar',
barWidth,
symbol: 'diamond',
symbolOffset: [0, '50%'],
symbolSize: [30, 15],
itemStyle: { color: this.dataList[0].bottomColor },
data: this.dataList[0].data
},
{
// 柱体
name: this.dataList[1].name,
type: 'bar',
barWidth,
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: this.dataList[1].topColor },
{ offset: 1, color: this.dataList[1].bottomColor }
])
},
data: this.dataList[1].data
},
{
// 柱顶
name: this.dataList[1].name,
type: 'pictorialBar',
barWidth,
symbol: 'diamond',
symbolPosition: 'end',
symbolOffset: [0, '-50%'],
symbolSize: [30, 12],
zlevel: 2,
itemStyle: { color: this.dataList[1].topColor },
data: this.dataList[1].data
},
{
// 柱底
name: this.dataList[1].name,
type: 'pictorialBar',
barWidth,
symbol: 'diamond',
symbolOffset: [0, '50%'],
symbolSize: [30, 15],
itemStyle: { color: this.dataList[1].topColor },
data: this.dataList[1].data
}
]
} else {
const barWidth = 320 / 2 / this.dataList[0].data.length
this.series = [
{
// 柱体
name: this.dataList[0].name,
type: 'bar',
// barWidth: 26,
barWidth: barWidth,
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: this.dataList[0].topColor },
{ offset: 1, color: this.dataList[0].bottomColor }
])
// borderWidth: 1,
// borderColor: this.dataList[0].bottomColor + '66' // 边框颜色+透明度
},
data: this.dataList[0].data
// backgroundStyle: {
// // borderColor: this.dataList[0].bottomColor,
// borderColor: '#ff0000',
// borderWidth: 1
// }
},
{
// 柱顶
name: this.dataList[0].name,
type: 'pictorialBar',
// barWidth: 26,
barWidth: barWidth,
symbol: 'circle',
symbolPosition: 'end',
symbolOffset: [0, '-50%'],
symbolSize: [barWidth, 6],
zlevel: 2,
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: 'rgba(59, 76, 118, 0)' },
{ offset: 1, color: this.dataList[0].bottomColor }
])
},
label: {
color: this.chartName === 'process-fault' ? 'rgba(119, 255, 242, 1)' : '#31a2ff',
show: true,
offset: [0, 10],
position: 'top',
vertialAlign: 'bottom'
},
data: this.dataList[0].data
},
{
// 柱底
name: this.dataList[0].name,
type: 'pictorialBar',
// barWidth: 26,
barWidth: barWidth,
symbol: 'circle',
symbolOffset: [0, '50%'],
symbolSize: [barWidth, 6],
itemStyle: { color: this.dataList[0].bottomColor + '9f' },
data: this.dataList[0].data
}
]
}
this.$nextTick(() => {
console.log('on Mounted(): ')
this.initChart()
})
},
beforeDestroy() {
if (!this.chart) {
return
}
this.chart.dispose()
this.chart = null
},
methods: {
initChart() {
this.chart = echarts.init(this.$refs.chartContainer)
this.chart.setOption({
grid: {
top: 10,
left: '2%',
right: '2%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'category',
axisLine: {
show: false
},
axisTick: {
show: false
},
axisLabel: {
textStyle: {
fontSize: this.xlabelFontSize,
color: 'rgba(255,255,255,0.5)' // 坐标值得具体的颜色
},
margin: 20,
rotate: this.xlabelRotate
},
data: this.nameList
},
yAxis: {
axisLine: {
lineStyle: {
type: 'solid',
color: this.dataList[0].bottomColor,
// color: 'rgba(119, 255, 242, 0.6)', // 左边线的颜色
width: '1' // 坐标线的宽度
}
},
axisTick: {
show: false
},
axisLabel: {
textStyle: {
color: 'rgba(255,255,255,0.5)' // 坐标值得具体的颜色
}
},
splitLine: {
lineStyle: {
type: 'dotted',
color: 'rgba(119, 255, 242, 0.2)'
}
},
type: 'value'
},
series: this.series
})
}
}
}
</script>
<style scoped>
.chartContainer >>> div {
width: 100% !important;
height: 100% !important;
/* position: relative !important; */
}
.fault-category-chart >>> div::before {
/* .fault-category-chart::before { */
content: '';
position: absolute;
bottom: calc(36px * var(--beilv));
/* top: 63%; */
left: 9%;
height: calc(32px * var(--beilv));
width: 90%;
background: linear-gradient(to top, #31a2ff6d, transparent);
transform: skew(-35deg);
z-index: 0;
}
.process-fault-chart >>> div::before {
/* .process-fault-chart::before { */
content: '';
position: absolute;
top: 65%;
left: 8%;
height: calc(32px * var(--beilv));
/* bottom: calc(20px * var(--beilv));
left: calc(36px * var(--beilv));
height: calc(32px * var(--beilv)); */
width: 90%;
background: linear-gradient(to top, #49fbd789, transparent);
transform: skew(-35deg);
z-index: 0;
}
</style>

View File

@@ -1,66 +1,99 @@
<template>
<div ref="chartContainer" class="chartContainer" style="position: relative; width: 100%; height: calc(100% - 36px)" />
<div ref="chartContainer" class="chartContainer" style="position: relative; width: 100%; height: 100%;" />
</template>
<script>
import echarts from 'echarts'
import resize from '@/views/OperationalOverview/components/mixins/resize'
import { Random } from 'mockjs'
export default {
name: 'PlFaultAnalysisPieChart',
mixins: [resize],
props: {},
data() {
return {
chart: null,
configs: {
color: ['#FB418C', '#DDB112', '#1A99FF', '#A691FF', '#49FBD6'],
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross',
label: {
backgroundColor: '#6a7985'
class ChartOption {
constructor() {
this.color = ['#DDB112', '#1A99FF', '#FB418C', '#A691FF', '#49FBD6']
this.legend = {
top: 14,
right: 22,
itemWidth: 6,
itemHeight: 8,
textStyle: {
color: '#DFF1FECC',
fontSize: 12
}
}
},
// legend: {
// data: ['Email', 'Union Ads', 'Video Ads', 'Direct', 'Search Engine']
// },
grid: {
top: '15%',
left: '2%',
right: '2%',
bottom: '2%',
this.grid = {
top: 72,
left: 12,
right: 28,
bottom: 20,
containLabel: true
}
this.tooltip = {
trigger: 'axis',
padding: 10,
backgroundColor: 'rgba(13, 29, 53, 0.8)',
extraCssText: 'width: 180px !important; ',
axisPointer: {
type: 'line',
lineStyle: {
type: 'dotted',
color: '#7BFFFB'
}
},
xAxis: [
{
formatter: params => {
return `
<div style="display: flex; flex-direction: column; gap: calc(4px * var(--beilv));">
<h2 style="font-size: calc(14px * var(--beilv)); margin: 0 0 4px; font-weight: normal; color: white;">${params[0].axisValue}</h2>
<span style="display: flex; align-items: center; gap: 8px;"><span style="width: 10px; height: 10px; border-radius: 5px; background: ${
this.color[0]
}"></span><span>${params[0].seriesName}: ${params[0].value}</span></span>
<span style="display: flex; align-items: center; gap: 8px;"><span style="width: 10px; height: 10px; border-radius: 5px; background: ${
this.color[1]
}"></span><span>${params[1].seriesName}: ${params[1].value}</span></span>
</div>
`
}
}
let today = new Date()
this.xAxis = {
type: 'category',
boundaryGap: false,
axisLine: {
lineStyle: {
color: '#ffffff66'
color: '#fff3'
}
},
axisTick: { show: false },
axisLabel: {
textStyle: {
color: 'rgba(255,255,255,1)' //
fontSize: 12,
color: '#fff8' //
},
margin: 20
margin: 12
},
data: ['A', 'B', 'C', 'D', 'E', 'F', 'G']
data:
this.mode === 'month'
? Array(new Date(today.getFullYear(), today.getMonth() + 1, 0).getDate())
.fill(1)
.map((_, idx) => idx + 1)
: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
}
],
yAxis: [
this.yAxis = [
{
name: '成品率',
name: '成品率 ',
type: 'value',
min: '80',
splitNumber: 4,
nameGap: 16,
nameTextStyle: {
color: 'rgba(255,255,255,0.7)',
fontSize: 10,
align: 'right'
fontSize: 12,
align: 'left',
verticalAlign: 'bottom'
},
axisLine: {
lineStyle: {
@@ -73,7 +106,9 @@ export default {
show: false
},
axisLabel: {
formatter: '{value} %',
textStyle: {
fontSize: 12,
color: 'rgba(255,255,255,0.5)' // 坐标值得具体的颜色
}
},
@@ -84,43 +119,17 @@ export default {
}
}
}
],
series: [
]
this.series = [
{
name: 'A1下片机',
type: 'line',
symbol: 'none',
areaStyle: {
// color: 'rgba(50,145,152,0.5)'
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: '#FB418C66' // 0% 处的颜色
},
{
offset: 1,
color: 'transparent' // 100% 处的颜色
}
],
global: false // 缺省为 false
}
},
emphasis: {
focus: 'series'
},
data: [11, 199, 140, 63, 185, 5, 78]
},
{
name: '磨边机',
type: 'line',
symbol: 'none',
// symbol: 'none',
symbol: 'circle',
symbolSize: 1,
showSymbol: false,
// smooth: true,
areaStyle: {
// color: 'rgba(50,145,152,0.5)'
color: {
@@ -143,15 +152,26 @@ export default {
}
},
emphasis: {
focus: 'series'
focus: 'series',
scale: 1.2
},
data: [151, 57, 31, 7, 77, 88, 119]
data:
this.mode === 'month'
? Array(30)
.fill(1)
.map(_ => Random.integer(94, 99))
: Array(7)
.fill(1)
.map(_ => Random.integer(94, 99))
},
{
name: '镀膜机',
name: '磨边机',
type: 'line',
symbol: 'none',
// symbol: 'none',
symbol: 'circle',
symbolSize: 1,
showSymbol: false,
// smooth: true,
areaStyle: {
// color: 'rgba(50,145,152,0.5)'
color: {
@@ -163,7 +183,7 @@ export default {
colorStops: [
{
offset: 0,
color: '#1A99FF66' // 0% 处的颜色
color: '#1A99FFCC' // 0% 处的颜色
},
{
offset: 1,
@@ -176,94 +196,180 @@ export default {
emphasis: {
focus: 'series'
},
data: [58, 3, 67, 100, 42, 96, 124]
},
{
name: '包装纸',
type: 'line',
symbol: 'none',
areaStyle: {
// color: 'rgba(50,145,152,0.5)'
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: '#A691FF66' // 0% 处的颜色
},
{
offset: 1,
color: 'transparent' // 100% 处的颜色
}
],
global: false // 缺省为 false
}
},
emphasis: {
focus: 'series'
},
data: [92, 88, 122, 169, 108, 130, 147]
},
{
name: '丝印',
type: 'line',
symbol: 'none',
label: {
show: true,
position: 'top'
},
areaStyle: {
// color: 'rgba(50,145,152,0.5)'
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: '#49FBD666' // 0% 处的颜色
},
{
offset: 1,
color: 'transparent' // 100% 处的颜色
}
],
global: false // 缺省为 false
}
},
emphasis: {
focus: 'series'
},
data: [44, 40, 118, 197, 123, 95, 96]
data:
this.mode === 'month'
? Array(30)
.fill(1)
.map(_ => Random.integer(94, 99))
: Array(7)
.fill(1)
.map(_ => Random.integer(94, 99))
}
]
}
get option() {
return this
}
optionFilter(option, calcSize = () => {} /** callback */) {
let newOption
if (Array.isArray(option)) {
newOption = []
option.forEach(item => {
newOption.push(this.optionFilter(item, calcSize))
})
return newOption
} else if (typeof option === 'object') {
newOption = {}
for (const key in option) {
if (key === 'colorStops') newOption[key] = option[key]
else if (
typeof option[key] === 'number' /** 过滤不做变化的属性 */ &&
['splitNumber', 'x', 'x2', 'y', 'y2', 'yAxisIndex', 'xAxisIndex'].indexOf(key) === -1
) {
newOption[key] = calcSize(option[key])
} else newOption[key] = this.optionFilter(option[key], calcSize)
}
return newOption
} else {
newOption = calcSize(option)
return option
}
}
}
export default {
name: 'PlFaultAnalysisPieChart',
mixins: [resize],
props: {
mode: {
type: String,
default: '',
validator: val => ['month', 'day'].indexOf(val) !== -1
},
dataUpdateToken: {
type: String,
default: 'default-token'
}
},
data() {
return {
chart: null,
configs: null
}
},
watch: {
dataUpdateToken(val) {
this.refreshData()
}
},
mounted() {
window.addEventListener('resize', function() {
if (this.chart) {
this.chart.resize()
}
})
this.$nextTick(() => {
// if (!this.chart) this.chart = echarts.init(this.$refs.chartContainer, { width: '100%', height: '100%' })
if (!this.chart) this.chart = echarts.init(this.$refs.chartContainer)
this.chart.setOption(this.configs)
this.chart.resize()
this.setChartOption()
})
},
methods: {}
methods: {
refreshData() {
// update xaxis
let today = new Date()
this.configs.xAxis.data =
this.mode === 'month'
? Array(new Date(today.getFullYear(), today.getMonth() + 1, 0).getDate())
.fill(1)
.map((_, idx) => idx + 1)
: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
// update tooltip
if (this.mode === 'month') {
this.configs.tooltip = {
trigger: 'axis',
padding: 10,
backgroundColor: 'rgba(13, 29, 53, 0.8)',
extraCssText: 'width: 180px !important; ',
axisPointer: {
type: 'line',
lineStyle: {
type: 'dotted',
color: '#7BFFFB'
}
},
formatter: params => {
const currentMonth = new Date().getMonth() + 1
return `
<div style="display: flex; flex-direction: column; gap: calc(4px * var(--beilv));">
<h2 style="font-size: calc(14px * var(--beilv)); margin: 0 0 4px; font-weight: normal; color: white;">${currentMonth}-${
params[0].axisValue
}</h2>
<span style="display: flex; align-items: center; gap: 8px;"><span style="width: 10px; height: 10px; border-radius: 5px; background: ${
this.configs.color[0]
}"></span><span>${params[0].seriesName}: ${params[0].value}</span></span>
<span style="display: flex; align-items: center; gap: 8px;"><span style="width: 10px; height: 10px; border-radius: 5px; background: ${
this.configs.color[1]
}"></span><span>${params[1].seriesName}: ${params[1].value}</span></span>
</div>
`
}
}
} else if (this.mode === 'day') {
this.configs.tooltip = null
this.configs.tooltip = {
trigger: 'axis',
padding: 10,
backgroundColor: 'rgba(13, 29, 53, 0.8)',
extraCssText: 'width: 180px !important; ',
axisPointer: {
type: 'line',
lineStyle: {
type: 'dotted',
color: '#7BFFFB'
}
},
formatter: params => {
return `
<div style="display: flex; flex-direction: column; gap: calc(4px * var(--beilv));">
<h2 style="font-size: calc(14px * var(--beilv)); margin: 0 0 4px; font-weight: normal; color: white;">${
params[0].axisValue
}</h2>
<span style="display: flex; align-items: center; gap: 8px;"><span style="width: 10px; height: 10px; border-radius: 5px; background: ${
this.configs.color[0]
}"></span><span>${params[0].seriesName}: ${params[0].value}</span></span>
<span style="display: flex; align-items: center; gap: 8px;"><span style="width: 10px; height: 10px; border-radius: 5px; background: ${
this.configs.color[1]
}"></span><span>${params[1].seriesName}: ${params[1].value}</span></span>
</div>
`
}
}
}
// update series
this.configs.series.forEach(item => {
item.data =
this.mode === 'month'
? Array(30)
.fill(1)
.map(_ => Random.integer(94, 99))
: Array(7)
.fill(1)
.map(_ => Random.integer(94, 99))
})
if (this.chart) this.chart.setOption(this.configs)
},
calcSize(num) {
const beilv = document.documentElement.style.getPropertyValue('--beilv')
return num * beilv
},
setChartOption() {
let chartOption = new ChartOption()
this.configs = chartOption.optionFilter(chartOption.option, this.calcSize)
this.chart.setOption(this.configs)
}
}
}
</script>
@@ -271,4 +377,8 @@ export default {
.chartContainer >>> div {
width: 100% !important;
}
.diy-linestack-tooltip {
color: red;
}
</style>

View File

@@ -0,0 +1,243 @@
<template>
<div class="techy-analysis-header">
<div class="special-wrapper">
<div class="special-wrapper__left"></div>
<div class="special-wrapper__middle">
<div class="special-wrapper__middle--inner">
<div style="transform: translateX(4%)">
<span class="top-icon">
<svg
width="100%"
height="100%"
viewBox="0 0 56 13"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<title>left</title>
<g id="2MES。2-6蓝底-7、8白底" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="2-5质量管理" transform="translate(-419.000000, -808.000000)" fill="#31A6AE">
<g id="编组-16备份-7" transform="translate(360.000000, 513.000000)">
<g id="编组-20备份" transform="translate(24.000000, 277.000000)">
<g id="编组-13备份" transform="translate(35.000000, 16.000000)">
<g
id="编组-2备份"
transform="translate(28.000000, 8.500000) scale(1, -1) translate(-28.000000, -8.500000) translate(0.000000, 2.000000)"
>
<polygon id="路径-11" points="47.1645736 7.79376563e-14 43 0 52.2664792 13 56 13"></polygon>
<polygon
id="路径-11备份"
opacity="0.8"
points="36.1645736 7.79376563e-14 32 0 41.2664792 13 45 13"
></polygon>
<polygon
id="路径-11备份-3"
opacity="0.4"
points="14.1645736 7.79376563e-14 10 0 19.2664792 13 23 13"
></polygon>
<polygon
id="路径-11备份-2"
opacity="0.601434"
points="25.1645736 7.79376563e-14 21 0 30.2664792 13 34 13"
></polygon>
<polygon
id="路径-11备份-4"
opacity="0.201434"
points="4.16457365 7.79376563e-14 5.06480115e-16 0 9.26647921 13 13 13"
></polygon>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>
</span>
<span class="techy-analysis-header__title">
<slot />
</span>
<span class="top-icon">
<svg
width="100%"
height="100%"
viewBox="0 0 56 13"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<title>right</title>
<g id="2MES。2-6蓝底-7、8白底" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="2-5质量管理" transform="translate(-653.000000, -808.000000)" fill="#31A6AE">
<g id="编组-16备份-7" transform="translate(360.000000, 513.000000)">
<g id="编组-20备份" transform="translate(24.000000, 277.000000)">
<g id="编组-13备份" transform="translate(35.000000, 16.000000)">
<g
id="编组-2备份-2"
transform="translate(262.000000, 8.500000) scale(-1, -1) translate(-262.000000, -8.500000) translate(234.000000, 2.000000)"
>
<polygon id="路径-11" points="47.1645736 7.79376563e-14 43 0 52.2664792 13 56 13"></polygon>
<polygon
id="路径-11备份"
opacity="0.8"
points="36.1645736 7.79376563e-14 32 0 41.2664792 13 45 13"
></polygon>
<polygon
id="路径-11备份-3"
opacity="0.4"
points="14.1645736 7.79376563e-14 10 0 19.2664792 13 23 13"
></polygon>
<polygon
id="路径-11备份-2"
opacity="0.601434"
points="25.1645736 7.79376563e-14 21 0 30.2664792 13 34 13"
></polygon>
<polygon
id="路径-11备份-4"
opacity="0.201434"
points="4.16457365 7.79376563e-14 5.06480115e-16 0 9.26647921 13 13 13"
></polygon>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>
</span>
</div>
</div>
</div>
<div class="special-wrapper__right">
<div class="special-wrapper__right--inner">
<span
:class="{ 'date-select__active': dateMode === 'day' }"
@click="
dateMode = 'day'
$emit('update-data', { str: '' + Math.random(), mode: dateMode })
"
>
</span>
<span
:class="{ 'date-select__active': dateMode === 'month' }"
@click="
dateMode = 'month'
$emit('update-data', { str: '' + Math.random(), mode: dateMode })
"
>
</span>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'TechyAnalysisHeader',
props: {
type: {
type: String,
default: 'dafault-type'
},
showTopIcon: {
type: Boolean,
default: true
}
},
data() {
return {
dateMode: 'day'
}
}
}
</script>
<style scoped>
.techy-analysis-header {
text-align: center;
margin-bottom: calc(16px * var(--beilv));
position: relative;
white-space: nowrap;
z-index: 1;
}
.techy-analysis-header__title {
color: #01cfcc;
font-size: calc(15px * var(--beilv));
line-height: calc(18px * var(--beilv));
}
.top-icon {
display: inline-block;
width: calc(56px * var(--beilv));
height: calc(12px * var(--beilv));
margin-bottom: calc(2px * var(--beilv));
}
.special-wrapper {
position: absolute;
top: calc(12px * var(--beilv));
left: 0;
transform: skewX(35deg);
background: #fff0;
width: 100%;
height: calc(22px * var(--beilv));
display: flex;
justify-content: center;
align-items: center;
}
.special-wrapper__left {
flex: 1;
min-width: calc(56px * var(--beilv));
}
.special-wrapper__middle {
overflow: hidden;
}
.special-wrapper__middle--inner {
transform: skewX(-35deg);
white-space: nowrap;
display: flex;
height: 100%;
align-items: center;
}
.special-wrapper__right {
width: calc(100px * var(--beilv));
padding-left: calc(8px * var(--beilv));
padding-right: calc(8px * var(--beilv));
display: flex;
align-items: center;
justify-content: flex-end;
}
.special-wrapper__right--inner {
transform: skewX(-35deg);
border-radius: calc(2px * var(--beilv));
overflow: hidden;
display: flex;
align-items: center;
height: 100%;
cursor: pointer;
}
.special-wrapper__right--inner > span {
display: inline-block;
width: calc(40px * var(--beilv));
text-align: center;
font-size: calc(12px * var(--beilv));
line-height: calc(18px * var(--beilv));
color: white;
background-color: #31878c94;
}
.special-wrapper__right--inner span.pl-select__active,
.special-wrapper__right--inner span.date-select__active {
background-color: #42bbb7;
}
</style>

View File

@@ -27,7 +27,7 @@ const PriorityComponent = {
}
},
mounted() {
console.log(this.injectData.priority)
// console.log(this.injectData.priority)
},
methods: {},
render: function (h) {
@@ -35,37 +35,38 @@ const PriorityComponent = {
}
}
console.log('is component?', PriorityComponent)
// console.log('is component?', PriorityComponent)
export const qualityTableProps = [
{ label: '工序名称', width: 130, prop: 'wsName', align: 'center' },
{ label: '所属产线', width: 130, prop: 'pl', align: 'center' },
{ label: '异常内容', align: 'center', prop: 'content' },
{ label: '报告人', width: 120, prop: 'creator', align: 'center' },
{ label: '工序名称', prop: 'wsName', align: 'center', 'min-width': 55 },
{ label: '所属产线', prop: 'pl', align: 'center', 'min-width': 50 },
{ label: '异常内容', align: 'center', prop: 'content', 'min-width': 50 },
{ label: '班组', prop: 'team', align: 'center', 'min-width': 45 },
{ label: '时间', prop: 'time', align: 'center' },
{ label: '优先级', width: 100, prop: 'priority', align: 'center', subcomponent: PriorityComponent }
{ label: '优先级', prop: 'priority', align: 'center', subcomponent: PriorityComponent, 'min-width': 50 }
]
export const qualityDatalist = [
{ 'wsName': '工序0', 'pl': '产线1', 'content': '争近才百子', 'creator': '毛刚', 'time': '1995-03-10 22:06:23', 'priority': 3 },
{ 'wsName': '工序1', 'pl': '产线10', 'content': '确规面这又间级', 'creator': '毛勇', 'time': '1997-11-26 16:27:32', 'priority': 1 },
{ 'wsName': '工序2', 'pl': '产线8', 'content': '成思体高原法厂清', 'creator': '林平', 'time': '1990-09-18 03:16:44', 'priority': 2 },
{ 'wsName': '工序3', 'pl': '产线6', 'content': '社色增设长放统展', 'creator': '叶静', 'time': '1970-12-02 09:44:01', 'priority': 4 },
{ 'wsName': '工序4', 'pl': '产线10', 'content': '今西', 'creator': '罗磊', 'time': '2017-10-21 00:00:27', 'priority': 2 },
{ 'wsName': '工序5', 'pl': '产线4', 'content': '却称老节再始', 'creator': '郝秀兰', 'time': '2018-06-04 20:34:53', 'priority': 1 },
{ 'wsName': '工序6', 'pl': '产线4', 'content': '志矿正算片大料水断特', 'creator': '熊磊', 'time': '1999-07-20 19:13:32', 'priority': 3 },
{ 'wsName': '工序7', 'pl': '产线3', 'content': '目式却属采精国', 'creator': '马磊', 'time': '2001-07-16 03:50:54', 'priority': 4 },
{ 'wsName': '工序8', 'pl': '产线7', 'content': '做较代你', 'creator': '曾敏', 'time': '1986-01-07 03:20:21', 'priority': 3 },
{ 'wsName': '工序9', 'pl': '产线3', 'content': '与子专前求农说', 'creator': '谭艳', 'time': '1978-07-29 22:49:11', 'priority': 2 },
{ 'wsName': '工序11', 'pl': '产线3', 'content': '与子专前求农说', 'creator': '谭艳', 'time': '1978-07-29 22:49:11', 'priority': 3 },
{ 'wsName': '工序11', 'pl': '产线3', 'content': '与子专前求农说', 'creator': '谭艳', 'time': '1978-07-29 22:49:11', 'priority': 4 },
{ 'wsName': '工序11', 'pl': '产线3', 'content': '与子专前求农说', 'creator': '谭艳', 'time': '1978-07-29 22:49:11', 'priority': 2 },
{ 'wsName': '工序11', 'pl': '产线3', 'content': '与子专前求农说', 'creator': '谭艳', 'time': '1978-07-29 22:49:11', 'priority': 1 },
{ 'wsName': '工序11', 'pl': '产线3', 'content': '与子专前求农说', 'creator': '谭艳', 'time': '1978-07-29 22:49:11', 'priority': 1 },
{ 'wsName': '工序11', 'pl': '产线3', 'content': '与子专前求农说', 'creator': '谭艳', 'time': '1978-07-29 22:49:11', 'priority': 1 },
{ 'wsName': '工序11', 'pl': '产线3', 'content': '与子专前求农说', 'creator': '谭艳', 'time': '1978-07-29 22:49:11', 'priority': 3 },
{ 'wsName': '工序11', 'pl': '产线3', 'content': '与子专前求农说', 'creator': '谭艳', 'time': '1978-07-29 22:49:11', 'priority': 2 }
]
{ 'wsName': '原片', 'pl': 'B', 'content': '透光率', 'team': '白班', 'time': '2022-11-18 13:36:26', 'priority': 3 },
{ 'wsName': '下片铺纸', 'pl': 'B', 'content': '抗压抗冲击测试', 'team': '白班', 'time': '2022-11-18 11:35:02', 'priority': 2 },
{ 'wsName': '镀膜', 'pl': 'A', 'content': '抗压抗冲击测试', 'team': '夜班', 'time': '2022-11-18 13:10:02', 'priority': 1 },
{ 'wsName': '丝印', 'pl': 'A', 'content': '透光率', 'team': '白班', 'time': '2022-11-18 02:16:20', 'priority': 2 },
{ 'wsName': '上片磨边', 'pl': 'A', 'content': '透光率', 'team': '夜班', 'time': '2022-11-18 00:03:54', 'priority': 3 },
{ 'wsName': '丝印', 'pl': 'B', 'content': '抗压抗冲击测试', 'team': '夜班', 'time': '2022-11-18 09:25:49', 'priority': 1 },
{ 'wsName': '上片磨边', 'pl': 'A', 'content': '抗压抗冲击测试', 'team': '夜班', 'time': '2022-11-18 13:54:45', 'priority': 3 },
{ 'wsName': '包装', 'pl': 'B', 'content': '抗压抗冲击测试', 'team': '白班', 'time': '2022-11-18 03:47:23', 'priority': 1 },
{ 'wsName': '包装', 'pl': 'B', 'content': '透光率', 'team': '夜班', 'time': '2022-11-18 02:46:21', 'priority': 1 },
{ 'wsName': '上片磨边', 'pl': 'B', 'content': '抗压抗冲击测试', 'team': '夜班', 'time': '2022-11-18 06:31:10', 'priority': 1 },
{ 'wsName': '下片铺纸', 'pl': 'A', 'content': '抗压抗冲击测试', 'team': '白班', 'time': '2022-11-18 10:22:55', 'priority': 3 },
{ 'wsName': '原片', 'pl': 'A', 'content': '抗压抗冲击测试', 'team': '白班', 'time': '2022-11-18 03:29:08', 'priority': 2 },
{ 'wsName': '丝印', 'pl': 'B', 'content': '透光率', 'team': '白班', 'time': '2022-11-18 09:47:06', 'priority': 1 },
{ 'wsName': '包装', 'pl': 'B', 'content': '抗压抗冲击测试', 'team': '夜班', 'time': '2022-11-18 06:17:27', 'priority': 1 },
{ 'wsName': '原片', 'pl': 'A', 'content': '抗压抗冲击测试', 'team': '夜班', 'time': '2022-11-18 00:29:26', 'priority': 2 },
{ 'wsName': '清洗', 'pl': 'B', 'content': '抗压抗冲击测试', 'team': '白班', 'time': '2022-11-18 10:14:27', 'priority': 2 },
{ 'wsName': '包装', 'pl': 'A', 'content': '透光率', 'team': '白班', 'time': '2022-11-18 13:50:39', 'priority': 3 },
{ 'wsName': ' 物流仓储', 'pl': 'A', 'content': '抗压抗冲击测试', 'team': '夜班', 'time': '2022-11-18 09:37:44', 'priority': 2 },
{ 'wsName': '清洗', 'pl': 'A', 'content': '透光率', 'team': '白班', 'time': '2022-11-18 03:53:47', 'priority': 2 },
{ 'wsName': '原片', 'pl': 'A', 'content': '透光率', 'team': '白班', 'time': '2022-11-18 08:01:02', 'priority': 3 }]
/** 质量异常报警 */
@@ -104,32 +105,32 @@ const StatusComponent = {
}
export const qualityExceptionTableProps = [
{ label: '工序名称', prop: 'wsName', align: 'center', width: 120 },
{ label: '所属产线', prop: 'pl', align: 'center', width: 120 },
{ label: '异常内容', prop: 'content', align: 'center' },
{ label: '发现人', prop: 'creator', align: 'center', width: 100 },
{ label: '时间', prop: 'time', align: 'center' },
{ label: '优先级', prop: 'priority', align: 'center', subcomponent: PriorityComponent, width: 100 },
// { label: '处理人', prop: 'charger', align: 'center', width: 100 },
// { label: '完成情况', prop: 'status', align: 'center', subcomponent: StatusComponent, width: 150 }
{ label: '工序名称', prop: 'wsName', align: 'center', 'min-width': 55 },
{ label: '所属产线', prop: 'pl', align: 'center', 'min-width': 50 },
{ label: '异常内容', prop: 'content', align: 'center', 'min-width': 50 },
{ label: '设备', prop: 'eq', align: 'center', 'min-width': 55 },
{ label: '时间', prop: 'time', align: 'center', 'min-width': 80 },
{ label: '优先级', prop: 'priority', align: 'center', subcomponent: PriorityComponent, 'min-width': 55 },
]
export const qualityExceptionDatalist = [
{ 'wsName': '工序0', 'pl': '产线1', 'content': '说红要称或各眼华家书', 'creator': '罗霞', 'time': '2013-04-08 15:23:55', 'priority': 1, 'charger': '冯敏', 'status': 4 },
{ 'wsName': '工序1', 'pl': '产线9', 'content': '积已反老支人后条办', 'creator': '龚芳', 'time': '1984-06-22 09:44:24', 'priority': 2, 'charger': '万静', 'status': 2 },
{ 'wsName': '工序2', 'pl': '产线10', 'content': '铁收王', 'creator': '黎艳', 'time': '2006-10-25 19:20:41', 'priority': 2, 'charger': '徐秀兰', 'status': 1 },
{ 'wsName': '工序3', 'pl': '产线10', 'content': '过又条政理质系', 'creator': '郝强', 'time': '2020-03-06 12:11:52', 'priority': 3, 'charger': '白秀兰', 'status': 2 },
{ 'wsName': '工序4', 'pl': '产线3', 'content': '特适院', 'creator': '魏超', 'time': '1982-12-26 16:19:57', 'priority': 1, 'charger': '姚静', 'status': 3 },
{ 'wsName': '工序5', 'pl': '产线1', 'content': '快准很问无', 'creator': '于桂英', 'time': '1976-09-26 21:53:11', 'priority': 4, 'charger': '白刚', 'status': 2 },
{ 'wsName': '工序6', 'pl': '产线7', 'content': '研开', 'creator': '何桂英', 'time': '1977-04-23 05:34:45', 'priority': 3, 'charger': '秦涛', 'status': 4 },
{ 'wsName': '工序7', 'pl': '产线2', 'content': '四取各广水儿强想华', 'creator': '唐军', 'time': '1988-03-11 22:40:42', 'priority': 2, 'charger': '龙艳', 'status': 1 },
{ 'wsName': '工序8', 'pl': '产线7', 'content': '样无商口', 'creator': '高娟', 'time': '2012-03-14 06:40:16', 'priority': 3, 'charger': '沈涛', 'status': 1 },
{ 'wsName': '工序9', 'pl': '产线4', 'content': '克质问般集却片土', 'creator': '谭敏', 'time': '2016-04-14 00:41:46', 'priority': 4, 'charger': '侯磊', 'status': 4 },
{ 'wsName': '工序10', 'pl': '产线4', 'content': '克质问般集却片土', 'creator': '谭敏', 'time': '2016-04-14 00:41:46', 'priority': 2, 'charger': '侯磊', 'status': 3 },
{ 'wsName': '工序10', 'pl': '产线4', 'content': '克质问般集却片土', 'creator': '谭敏', 'time': '2016-04-14 00:41:46', 'priority': 1, 'charger': '侯磊', 'status': 1 },
{ 'wsName': '工序10', 'pl': '产线4', 'content': '克质问般集却片土', 'creator': '谭敏', 'time': '2016-04-14 00:41:46', 'priority': 1, 'charger': '侯磊', 'status': 2 },
{ 'wsName': '工序10', 'pl': '产线4', 'content': '克质问般集却片土', 'creator': '谭敏', 'time': '2016-04-14 00:41:46', 'priority': 2, 'charger': '侯磊', 'status': 3 },
{ 'wsName': '工序10', 'pl': '产线4', 'content': '克质问般集却片土', 'creator': '谭敏', 'time': '2016-04-14 00:41:46', 'priority': 3, 'charger': '侯磊', 'status': 2 },
{ 'wsName': '工序10', 'pl': '产线4', 'content': '克质问般集却片土', 'creator': '谭敏', 'time': '2016-04-14 00:41:46', 'priority': 3, 'charger': '侯磊', 'status': 1 },
{ 'wsName': '工序10', 'pl': '产线4', 'content': '克质问般集却片土', 'creator': '谭敏', 'time': '2016-04-14 00:41:46', 'priority': 4, 'charger': '侯磊', 'status': 4 }
]
{ 'pl': 'A', 'eq': '打孔', 'wsName': '打孔', 'content': '完整性', 'time': '2022-11-18 11:30:01', 'priority': 3 },
{ 'pl': 'B', 'eq': '固化', 'wsName': '固化', 'content': '透光率', 'time': '2022-11-18 07:20:35', 'priority': 1 },
{ 'pl': 'B', 'eq': '钢后清洗机', 'wsName': '钢后清洗机', 'content': '透光率', 'time': '2022-11-18 09:16:21', 'priority': 2 },
{ 'pl': 'A', 'eq': '一镀', 'wsName': '一镀', 'content': '透光率', 'time': '2022-11-18 04:57:10', 'priority': 3 },
{ 'pl': 'B', 'eq': '固化', 'wsName': '固化', 'content': '完整性', 'time': '2022-11-18 08:26:43', 'priority': 2 },
{ 'pl': 'B', 'eq': '磨边后清洗机', 'wsName': '磨边后清洗机', 'content': '完整性', 'time': '2022-11-18 04:09:39', 'priority': 2 },
{ 'pl': 'B', 'eq': '下片', 'wsName': '下片', 'content': '透光率', 'time': '2022-11-18 01:06:05', 'priority': 2 },
{ 'pl': 'A', 'eq': '一镀', 'wsName': '一镀', 'content': '透光率', 'time': '2022-11-18 05:06:36', 'priority': 1 },
{ 'pl': 'B', 'eq': '冷却', 'wsName': '冷却', 'content': '完整性', 'time': '2022-11-18 07:11:45', 'priority': 3 },
{ 'pl': 'A', 'eq': '磨边后清洗机', 'wsName': '磨边后清洗机', 'content': '完整性', 'time': '2022-11-18 11:40:37', 'priority': 3 },
{ 'pl': 'A', 'eq': '冷却', 'wsName': '冷却', 'content': '完整性', 'time': '2022-11-18 10:41:54', 'priority': 1 },
{ 'pl': 'B', 'eq': '预热', 'wsName': '预热', 'content': '透光率', 'time': '2022-11-18 04:10:00', 'priority': 1 },
{ 'pl': 'B', 'eq': '钢化', 'wsName': '钢化', 'content': '完整性', 'time': '2022-11-18 09:23:40', 'priority': 1 },
{ 'pl': 'A', 'eq': '冷却', 'wsName': '冷却', 'content': '透光率', 'time': '2022-11-18 05:28:05', 'priority': 2 },
{ 'pl': 'B', 'eq': '上片', 'wsName': '上片', 'content': '完整性', 'time': '2022-11-18 06:24:57', 'priority': 3 },
{ 'pl': 'B', 'eq': '固化', 'wsName': '固化', 'content': '完整性', 'time': '2022-11-18 02:48:28', 'priority': 3 },
{ 'pl': 'B', 'eq': '磨边后清洗机', 'wsName': '磨边后清洗机', 'content': '完整性', 'time': '2022-11-18 13:06:35', 'priority': 1 },
{ 'pl': 'B', 'eq': '打孔', 'wsName': '打孔', 'content': '透光率', 'time': '2022-11-18 11:49:59', 'priority': 1 },
{ 'pl': 'B', 'eq': '一镀', 'wsName': '一镀', 'content': '透光率', 'time': '2022-11-18 12:32:20', 'priority': 2 },
{ 'pl': 'B', 'eq': '丝印', 'wsName': '丝印', 'content': '完整性', 'time': '2022-11-18 12:45:49', 'priority': 3 }]

View File

@@ -1,19 +1,47 @@
<template>
<div class="custom-container">
<el-row :gutter="20" style="height: calc(100vh - 150px)">
<el-row :gutter="8" style="height: calc(100vh - 150px)">
<el-col :span="4">
<aside class="custom-container__common left-side-container">
<section class="left-side-container__title">
<!-- <section class="left-side-container__title">
<span v-if="logoUrl" class="logo">
<img :src="logoUrl" alt="side container logo">
</span>
<span class="text-content">
{{ factoryName }}
</span>
</section> -->
<section class="title-area">
<span class="title-icon">
<svg
width="100%"
height="100%"
viewBox="0 0 24 24"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<title>工厂</title>
<g id="系统管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="质量追溯_设备参数追溯" transform="translate(-376.000000, -152.000000)" fill-rule="nonzero">
<g id="工厂" transform="translate(376.000000, 152.000000)">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="24" height="24" />
<path
id="形状"
d="M12.25,6.75 L12.25,10.25 L20.75,10.25 L20.75,21.25 L3.25000001,21.25 L3.25000001,6.75 L12.25,6.75 L12.25,6.75 Z M10.75,8.25 L4.75000001,8.25 L4.75000001,19.75 L19.25,19.75 L19.25,11.75 L10.75,11.75 L10.75,8.25 Z M17.5,16.5 L17.5,18 L16,18 L16,16.5 L17.5,16.5 Z M14,16.5 L14,18 L12.5,18 L12.5,16.5 L14,16.5 Z M17.5,13.5 L17.5,15 L16,15 L16,13.5 L17.5,13.5 Z M14,13.5 L14,15 L12.5,15 L12.5,13.5 L14,13.5 Z M8.99999999,10.256 L8.99999999,11.756 L6.49999999,11.756 L6.49999999,10.256 L8.99999999,10.256 Z M9.4755,2.82499999 C10.4715,2.63649998 11.0695,2.739 12.1845,3.291 L12.581,3.49000001 L12.7945,3.58999999 C13.2545,3.79899998 13.532,3.85899998 13.887,3.82849999 L13.9855,3.81850001 L14.1545,3.79249999 L14.2455,3.77650001 C14.8380746,3.66404309 15.3698683,3.34077505 15.7425,2.8665 L15.8205,2.763 L17.0405,3.636 L16.9485,3.76000001 C16.3504031,4.53742507 15.4872916,5.06774928 14.5235,5.25 C13.5275,5.43799999 12.9285,5.3355 11.814,4.7835 L11.4175,4.58500001 C10.781,4.27450001 10.4765,4.20100001 10.024,4.25599999 L9.9315,4.26850001 L9.7545,4.299 C9.16166181,4.41148918 8.62956287,4.73472685 8.25649999,5.20900001 L8.17849999,5.31199999 L6.95899999,4.43800001 L7.0515,4.31449999 C7.64947141,3.53774907 8.51191259,3.00768671 9.47500001,2.82499999 L9.4755,2.82499999 Z"
fill="#0B58FF"
/>
</g>
</g>
</g>
</svg>
</span>
<span class="title-content">合肥新能源工厂</span>
</section>
<section class="left-side-container__content">
<!-- 导航栏 -->
<!-- <section class="left-side-container__content">
<el-tree
class="custom-tree"
:icon-class="'el-icon-document-copy'"
@@ -21,6 +49,15 @@
:props="defaultProps"
@node-click="handleNodeClick"
/>
</section> -->
<section class="routes-area" v-if="showList">
<el-menu @select="handleSelect">
<!-- 此处假设了只有一个根节点 -->
<template v-for="(menuItem, index) in treeData">
<TestMenuItem :level="1" :key="index" :menuItem="menuItem" />
</template>
</el-menu>
</section>
</aside>
</el-col>
@@ -53,12 +90,15 @@ import HeadForm from '@/components/basicData/HeadForm'
import testData from './parameter.test.data.js'
import moment from 'moment'
import writeXlsxFile from 'write-excel-file'
import TestMenuItem from './parameter/components/TestMenuItem.vue'
export default {
name: 'EquipmentRetrospectParameter',
components: { BaseTable, HeadForm },
components: { BaseTable, HeadForm, TestMenuItem },
data() {
return {
showList: false,
menuListTrue: [],
factoryName: 'xxx工厂',
logoUrl: require('../../../../assets/img/cnbm.png'),
treeData: null,
@@ -117,26 +157,45 @@ export default {
}
},
created() {
this.showList = false
this.init()
this.fetchList('eq-tree').then(res => {
if (res.data) {
const eqTree = res.data[0] // 只会返回一条工厂数据
this.factoryName = eqTree.name
// 构造tree展示的结构
eqTree.pdlList.forEach(item => {
this.treeData = this.preHandleList(eqTree)
this.showList = true
}
})
this.fetchList('work-order').then(res => {
if (res.data.records) {
this.headFormConfig[0].selectOptions = res.data.records.map(item => ({ id: item.id, name: item.name }))
}
})
},
methods: {
preHandleList(list) {
let result = []
list.pdlList.forEach(item => {
const treeItem = {}
treeItem.label = item.name
treeItem.name = item.name
// 整理产线
if (item.wsList.length) {
treeItem.children = []
item.wsList.forEach(workSection => {
const wsItem = {}
wsItem.label = workSection.name
wsItem.name = workSection.name
// 整理设备
if (workSection.eqList.length) {
wsItem.children = []
workSection.eqList.forEach(eq => {
const eqItem = {}
eqItem.label = eq.eqName
eqItem.name = eq.eqName
eqItem.id = eq.eqId
wsItem.children.push(eqItem)
})
@@ -144,19 +203,13 @@ export default {
treeItem.children.push(wsItem)
})
}
// 产线
this.productLineList.push(treeItem)
})
this.treeData = this.productLineList
}
})
this.fetchList('work-order').then(res => {
if (res.data.records) {
this.headFormConfig[0].selectOptions = res.data.records.map(item => ({ id: item.id, name: item.name }))
}
result.push(treeItem)
})
return result
},
methods: {
init() {
this.productLineList.splice(0)
this.headFormConfig[0].selectOptions.splice(0)
@@ -281,6 +334,10 @@ export default {
if (data.id) {
this.selectedEquipmentId = data.id
}
},
handleSelect(index, indexPath) {
const [id, name] = index.split('$--$')
this.selectedEquipmentId = id
}
}
}
@@ -295,14 +352,13 @@ export default {
.custom-container__common {
background-color: #fff;
padding: 0;
border-radius: 4px;
box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.2);
border-radius: 8px;
}
.left-side-container {
height: calc(100vh - 147px);
padding: 0;
background: #fafafa;
// background: #fafafa;
display: flex;
flex-direction: column;
@@ -320,7 +376,7 @@ export default {
.left-side-container__content {
flex: 1 1;
overflow-y: scroll;
overflow-y: auto;
}
}
@@ -356,4 +412,25 @@ export default {
.custom-tree >>> .is-current .el-tree-node__content {
background: #fafafa;
}
.title-area {
height: 72px;
display: flex;
align-items: center;
gap: 8px;
padding: 0 24px;
}
.routes-area {
flex: 1;
height: 1px;
background-color: #fff;
overflow: hidden;
overflow-y: auto;
}
.title-icon {
height: 24px;
width: 24px;
}
</style>

View File

@@ -0,0 +1,135 @@
<template>
<el-submenu v-if="menuItem.children" :index="constructIndex(menuItem)">
<!-- 标题 -->
<template slot="title">
<!-- <i class="el-icon-menu"></i> -->
<i style="line-height: 1;">
<svg
width="16px"
height="16px"
viewBox="0 0 16 16"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<title>菜单</title>
<g id="系统管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="质量追溯_设备参数追溯" transform="translate(-376.000000, -202.000000)" fill-rule="nonzero">
<g id="编组-7" transform="translate(376.000000, 200.000000)">
<g id="菜单" transform="translate(0.000000, 2.000000)">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="16" height="16"></rect>
<path
d="M3.00057813,4.49926562 L13.0025156,4.49926562 C13.2786563,4.49926562 13.5025156,4.27540625 13.5025156,3.99926563 C13.5025156,3.723125 13.2786563,3.49926563 13.0025156,3.49926563 L3.00057813,3.49926563 C2.7244375,3.49926563 2.50057813,3.723125 2.50057813,3.99926563 C2.50057813,4.27540625 2.7244375,4.49926562 3.00057813,4.49926562 Z M3.0004375,8.48703125 L12.9786875,8.48703125 C13.2548281,8.48703125 13.4786875,8.26317187 13.4786875,7.98703125 C13.4786875,7.71089062 13.2548281,7.48703125 12.9786875,7.48703125 L3.0004375,7.48703125 C2.72429687,7.48703125 2.5004375,7.71089062 2.5004375,7.98703125 C2.5004375,8.26317187 2.72429687,8.48703125 3.0004375,8.48703125 Z M13.0025156,11.4969063 L3.00057813,11.4969063 C2.7244375,11.4969063 2.50057813,11.7207656 2.50057813,11.9969063 C2.50057813,12.2730469 2.7244375,12.4969063 3.00057813,12.4969063 L13.0025156,12.4969063 C13.2786563,12.4969063 13.5025156,12.2730469 13.5025156,11.9969063 C13.5025156,11.7207656 13.2786563,11.4969063 13.0025156,11.4969063 L13.0025156,11.4969063 Z"
id="形状"
fill="currentColor"
></path>
</g>
</g>
</g>
</g>
</svg>
</i>
<span>{{ menuItem.name }}</span>
</template>
<!-- 主体 -->
<template v-for="(submenuItem, idx) in menuItem.children">
<TestMenuItem :menuItem="submenuItem" :level="level + 1" />
</template>
</el-submenu>
<!-- 一级菜单 -->
<el-menu-item v-else :index="constructIndex(menuItem)">
<!-- <i v-if="level !== 1" class="el-icon-aim"></i>
<i v-else class="el-icon-menu"></i> -->
<i style="line-height: 1px" v-if="level !== 1">
<svg
width="8px"
height="8px"
viewBox="0 0 8 8"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<title>椭圆形</title>
<g id="系统管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g
id="质量追溯_设备参数追溯"
transform="translate(-396.000000, -246.000000)"
fill="currentColor"
fill-rule="nonzero"
>
<g id="编组-3" transform="translate(396.000000, 240.000000)">
<path
d="M4,6 C6.209139,6 8,7.790861 8,10 C8,12.209139 6.209139,14 4,14 C1.790861,14 0,12.209139 0,10 C0,7.790861 1.790861,6 4,6 Z M4,7 C2.34314575,7 1,8.34314575 1,10 C1,11.6568542 2.34314575,13 4,13 C5.65685425,13 7,11.6568542 7,10 C7,8.34314575 5.65685425,7 4,7 Z"
id="椭圆形"
></path>
</g>
</g>
</g>
</svg>
</i>
<i style="line-height: 1;" v-else>
<svg
width="16px"
height="16px"
viewBox="0 0 16 16"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<title>菜单</title>
<g id="系统管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="质量追溯_设备参数追溯" transform="translate(-376.000000, -202.000000)" fill-rule="nonzero">
<g id="编组-7" transform="translate(376.000000, 200.000000)">
<g id="菜单" transform="translate(0.000000, 2.000000)">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="16" height="16"></rect>
<path
d="M3.00057813,4.49926562 L13.0025156,4.49926562 C13.2786563,4.49926562 13.5025156,4.27540625 13.5025156,3.99926563 C13.5025156,3.723125 13.2786563,3.49926563 13.0025156,3.49926563 L3.00057813,3.49926563 C2.7244375,3.49926563 2.50057813,3.723125 2.50057813,3.99926563 C2.50057813,4.27540625 2.7244375,4.49926562 3.00057813,4.49926562 Z M3.0004375,8.48703125 L12.9786875,8.48703125 C13.2548281,8.48703125 13.4786875,8.26317187 13.4786875,7.98703125 C13.4786875,7.71089062 13.2548281,7.48703125 12.9786875,7.48703125 L3.0004375,7.48703125 C2.72429687,7.48703125 2.5004375,7.71089062 2.5004375,7.98703125 C2.5004375,8.26317187 2.72429687,8.48703125 3.0004375,8.48703125 Z M13.0025156,11.4969063 L3.00057813,11.4969063 C2.7244375,11.4969063 2.50057813,11.7207656 2.50057813,11.9969063 C2.50057813,12.2730469 2.7244375,12.4969063 3.00057813,12.4969063 L13.0025156,12.4969063 C13.2786563,12.4969063 13.5025156,12.2730469 13.5025156,11.9969063 C13.5025156,11.7207656 13.2786563,11.4969063 13.0025156,11.4969063 L13.0025156,11.4969063 Z"
id="形状"
fill="currentColor"
></path>
</g>
</g>
</g>
</g>
</svg>
</i>
<span slot="title">{{ menuItem.name }}</span>
</el-menu-item>
</template>
<script>
export default {
name: 'TestMenuItem',
props: {
level: {
type: Number,
default: 1
},
index: {
type: String,
default: ''
},
menuItem: {
default: () => ({})
},
defaultActive: {
type: Number,
default: 0
}
},
data() {
return {}
},
created() {},
mounted() {},
methods: {
constructIndex(menuItem) {
return menuItem.id + '$--$' + menuItem.name
}
}
}
</script>
<style scoped></style>

14
src/views/UserPage/=.svg Normal file
View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>菜单</title>
<g id="系统管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="质量追溯_设备参数追溯" transform="translate(-376.000000, -202.000000)" fill-rule="nonzero">
<g id="编组-7" transform="translate(376.000000, 200.000000)">
<g id="菜单" transform="translate(0.000000, 2.000000)">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="16" height="16"></rect>
<path d="M3.00057813,4.49926562 L13.0025156,4.49926562 C13.2786563,4.49926562 13.5025156,4.27540625 13.5025156,3.99926563 C13.5025156,3.723125 13.2786563,3.49926563 13.0025156,3.49926563 L3.00057813,3.49926563 C2.7244375,3.49926563 2.50057813,3.723125 2.50057813,3.99926563 C2.50057813,4.27540625 2.7244375,4.49926562 3.00057813,4.49926562 Z M3.0004375,8.48703125 L12.9786875,8.48703125 C13.2548281,8.48703125 13.4786875,8.26317187 13.4786875,7.98703125 C13.4786875,7.71089062 13.2548281,7.48703125 12.9786875,7.48703125 L3.0004375,7.48703125 C2.72429687,7.48703125 2.5004375,7.71089062 2.5004375,7.98703125 C2.5004375,8.26317187 2.72429687,8.48703125 3.0004375,8.48703125 Z M13.0025156,11.4969063 L3.00057813,11.4969063 C2.7244375,11.4969063 2.50057813,11.7207656 2.50057813,11.9969063 C2.50057813,12.2730469 2.7244375,12.4969063 3.00057813,12.4969063 L13.0025156,12.4969063 C13.2786563,12.4969063 13.5025156,12.2730469 13.5025156,11.9969063 C13.5025156,11.7207656 13.2786563,11.4969063 13.0025156,11.4969063 L13.0025156,11.4969063 Z" id="形状" fill="#373738"></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,135 @@
<template>
<el-submenu v-if="menuItem.children" :index="constructIndex(menuItem)">
<!-- 标题 -->
<template slot="title">
<!-- <i class="el-icon-menu"></i> -->
<i style="line-height: 1;">
<svg
width="16px"
height="16px"
viewBox="0 0 16 16"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<title>菜单</title>
<g id="系统管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="质量追溯_设备参数追溯" transform="translate(-376.000000, -202.000000)" fill-rule="nonzero">
<g id="编组-7" transform="translate(376.000000, 200.000000)">
<g id="菜单" transform="translate(0.000000, 2.000000)">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="16" height="16"></rect>
<path
d="M3.00057813,4.49926562 L13.0025156,4.49926562 C13.2786563,4.49926562 13.5025156,4.27540625 13.5025156,3.99926563 C13.5025156,3.723125 13.2786563,3.49926563 13.0025156,3.49926563 L3.00057813,3.49926563 C2.7244375,3.49926563 2.50057813,3.723125 2.50057813,3.99926563 C2.50057813,4.27540625 2.7244375,4.49926562 3.00057813,4.49926562 Z M3.0004375,8.48703125 L12.9786875,8.48703125 C13.2548281,8.48703125 13.4786875,8.26317187 13.4786875,7.98703125 C13.4786875,7.71089062 13.2548281,7.48703125 12.9786875,7.48703125 L3.0004375,7.48703125 C2.72429687,7.48703125 2.5004375,7.71089062 2.5004375,7.98703125 C2.5004375,8.26317187 2.72429687,8.48703125 3.0004375,8.48703125 Z M13.0025156,11.4969063 L3.00057813,11.4969063 C2.7244375,11.4969063 2.50057813,11.7207656 2.50057813,11.9969063 C2.50057813,12.2730469 2.7244375,12.4969063 3.00057813,12.4969063 L13.0025156,12.4969063 C13.2786563,12.4969063 13.5025156,12.2730469 13.5025156,11.9969063 C13.5025156,11.7207656 13.2786563,11.4969063 13.0025156,11.4969063 L13.0025156,11.4969063 Z"
id="形状"
fill="currentColor"
></path>
</g>
</g>
</g>
</g>
</svg>
</i>
<span>{{ menuItem.name }}</span>
</template>
<!-- 主体 -->
<template v-for="(submenuItem, idx) in menuItem.children">
<TestMenuItem :menuItem="submenuItem" :level="level + 1" />
</template>
</el-submenu>
<!-- 一级菜单 -->
<el-menu-item v-else :index="constructIndex(menuItem)">
<!-- <i v-if="level !== 1" class="el-icon-aim"></i>
<i v-else class="el-icon-menu"></i> -->
<i style="line-height: 1px" v-if="level !== 1">
<svg
width="8px"
height="8px"
viewBox="0 0 8 8"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<title>椭圆形</title>
<g id="系统管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g
id="质量追溯_设备参数追溯"
transform="translate(-396.000000, -246.000000)"
fill="currentColor"
fill-rule="nonzero"
>
<g id="编组-3" transform="translate(396.000000, 240.000000)">
<path
d="M4,6 C6.209139,6 8,7.790861 8,10 C8,12.209139 6.209139,14 4,14 C1.790861,14 0,12.209139 0,10 C0,7.790861 1.790861,6 4,6 Z M4,7 C2.34314575,7 1,8.34314575 1,10 C1,11.6568542 2.34314575,13 4,13 C5.65685425,13 7,11.6568542 7,10 C7,8.34314575 5.65685425,7 4,7 Z"
id="椭圆形"
></path>
</g>
</g>
</g>
</svg>
</i>
<i style="line-height: 1;" v-else>
<svg
width="16px"
height="16px"
viewBox="0 0 16 16"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<title>菜单</title>
<g id="系统管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="质量追溯_设备参数追溯" transform="translate(-376.000000, -202.000000)" fill-rule="nonzero">
<g id="编组-7" transform="translate(376.000000, 200.000000)">
<g id="菜单" transform="translate(0.000000, 2.000000)">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="16" height="16"></rect>
<path
d="M3.00057813,4.49926562 L13.0025156,4.49926562 C13.2786563,4.49926562 13.5025156,4.27540625 13.5025156,3.99926563 C13.5025156,3.723125 13.2786563,3.49926563 13.0025156,3.49926563 L3.00057813,3.49926563 C2.7244375,3.49926563 2.50057813,3.723125 2.50057813,3.99926563 C2.50057813,4.27540625 2.7244375,4.49926562 3.00057813,4.49926562 Z M3.0004375,8.48703125 L12.9786875,8.48703125 C13.2548281,8.48703125 13.4786875,8.26317187 13.4786875,7.98703125 C13.4786875,7.71089062 13.2548281,7.48703125 12.9786875,7.48703125 L3.0004375,7.48703125 C2.72429687,7.48703125 2.5004375,7.71089062 2.5004375,7.98703125 C2.5004375,8.26317187 2.72429687,8.48703125 3.0004375,8.48703125 Z M13.0025156,11.4969063 L3.00057813,11.4969063 C2.7244375,11.4969063 2.50057813,11.7207656 2.50057813,11.9969063 C2.50057813,12.2730469 2.7244375,12.4969063 3.00057813,12.4969063 L13.0025156,12.4969063 C13.2786563,12.4969063 13.5025156,12.2730469 13.5025156,11.9969063 C13.5025156,11.7207656 13.2786563,11.4969063 13.0025156,11.4969063 L13.0025156,11.4969063 Z"
id="形状"
fill="currentColor"
></path>
</g>
</g>
</g>
</g>
</svg>
</i>
<span slot="title">{{ menuItem.name }}</span>
</el-menu-item>
</template>
<script>
export default {
name: 'TestMenuItem',
props: {
level: {
type: Number,
default: 1
},
index: {
type: String,
default: ''
},
menuItem: {
default: () => ({})
},
defaultActive: {
type: Number,
default: 0
}
},
data() {
return {}
},
created() {},
mounted() {},
methods: {
constructIndex(menuItem) {
return menuItem.id + '$--$' + menuItem.name
}
}
}
</script>
<style scoped></style>

View File

@@ -27,80 +27,89 @@
</span>
<span class="title-content">合肥新能源工厂</span>
</section>
<section class="routes-area">
<ul class="root-routes">
<li class="parent-route">
<div class="route-title">
<div>
<span class="menu-icon">
<span class="line" />
<span class="line" />
<span class="line" />
</span>
<span>制造部</span>
</div>
<span class="arrow-icon rotate-down">
<span class="arrow-line1" />
<span class="arrow-line2" />
</span>
</div>
<ul class="children-routes">
<li class="parent-route">
<div class="route-title" style="padding-left: 16px;">
<div>
<span class="menu-icon">
<!-- level - 2 -->
<span class="circle" />
</span>
<span>人力资源</span>
</div>
<span class="arrow-icon">
<span class="arrow-line1" />
<span class="arrow-line2" />
</span>
</div>
<ul class="children-routes">
<li class="leaf-route" style="padding-left: 32px;">小组1</li>
<li class="leaf-route" style="padding-left: 32px;">小组2</li>
</ul>
</li>
<li class="leaf-route" style="padding-left: 16px;">小组2</li>
</ul>
</li>
<li class="leaf-route">财政部</li>
</ul>
<section class="routes-area" v-if="showList">
<el-menu @select="handleSelect">
<!-- 此处假设了只有一个根节点 -->
<template v-for="(menuItem, index) in menuListTrue[0].children" >
<TestMenuItem :level="1" :key="index" :menuItem="menuItem" />
</template>
</el-menu>
</section>
<section class="footer-area" />
</div>
</template>
<script>
import TestMenuItem from './TestMenuItem.vue'
export default {
name: 'TestTree',
props: {},
data() {
return {}
props: {
menuList: {
type: Array,
default: () => []
}
},
created() {},
mounted() {},
methods: {}
components: { TestMenuItem },
data() {
return {
menuListTrue: [],
showList: false
}
},
mounted() {
this.$nextTick(() => {
this.reconstructMenuList()
})
},
methods: {
reconstructMenuList() {
this.showList = false
this.menuListTrue.splice(0)
if (this.menuList) {
this.menuList.forEach(item => {
if (item.parentId === '-1') {
this.menuListTrue.push(item)
} else {
this.constructMenuList(item)
}
})
}
this.showList = true
},
constructMenuList(child) {
this.menuList.forEach(item => {
if (child.parentId === item.id) {
if (!('children' in item)) {
this.$set(item, 'children', [])
}
item.children.push(child)
}
})
},
handleSelect(index, indexPath) {
const [id, name] = index.split('$--$')
this.$emit('getOrganization', { id, name })
}
}
}
</script>
<style scoped>
.test-tree {
background: lightblue;
height: 100%;
padding: 24px;
padding: 24px 0 0;
display: flex;
flex-direction: column;
gap: 24px;
gap: 16px;
}
.title-area {
display: flex;
align-items: center;
gap: 8px;
padding: 0 24px;
}
.routes-area {
@@ -121,112 +130,20 @@ export default {
line-height: 1;
}
ul,
li {
margin: 0;
padding: 0;
list-style: none;
.routes-area >>> .el-submenu__title,
.routes-area >>> .el-menu-item {
font-size: 14px;
line-height: 40px;
height: 40px;
letter-spacing: 0.88px;
}
.parent-route div {
display: flex;
align-items: center;
/*
.routes-area >>> .el-submenu__title span,
.routes-area >>> .el-menu-item span {
}
*/
.route-title {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 8px;
}
span.menu-icon {
height: 14px;
width: 14px;
margin-right: 6px;
display: flex;
flex-direction: column;
justify-content: space-around;
}
.line {
width: 100%;
height: 2px;
border-radius: 2px;
background-color: rgba(0, 0, 0, 0.508);
}
.arrow-icon {
position: relative;
width: 16px;
height: 16px;
}
.arrow-line1,
.arrow-line2 {
position: absolute;
display: inline-block;
width: 1px;
height: 8px;
border-radius: 1px;
background-color: #000a;
transform-origin: top 50% left 0;
}
.arrow-line1 {
top: 1px;
left: 0;
transform: rotateZ(-45deg);
}
.arrow-line2 {
left: 0;
bottom: 1px;
transform: rotateZ(45deg);
}
.rotate-down {
/* transform-origin: top 50%; */
transform: rotateZ(90deg);
}
.circle {
width: 70%;
height: 70%;
background-color: #000c;
border-radius: 50%;
position: relative;
}
.circle::after {
content: '';
position: absolute;
width: 70%;
height: 70%;
border-radius: 50%;
top: 15%;
left: 15%;
background-color: #fff;
}
/* span.arrow-icon {
background: url('./right.png') 100% 100% / contain no-repeat;
width: 12px;
height: 12px;
} */
li.parent-route {
display: flex;
flex-direction: column;
/* background: lightpink; */
}
li.leaf-route::before {
content: '\25E6';
padding-right: 8px;
}
li.parent-route div.route-title:hover,
li.parent-route div.route-title:hover .circle::after,
li.leaf-route:hover {
background: #ccc;
#app .hideSidebar .routes-area >>> .el-submenu>.el-submenu__title {
padding: 0 20px !important;
}
</style>

11
src/views/UserPage/o.svg Normal file
View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="8px" height="8px" viewBox="0 0 8 8" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>椭圆形</title>
<g id="系统管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="质量追溯_设备参数追溯" transform="translate(-396.000000, -246.000000)" fill="#373738" fill-rule="nonzero">
<g id="编组-3" transform="translate(396.000000, 240.000000)">
<path d="M4,6 C6.209139,6 8,7.790861 8,10 C8,12.209139 6.209139,14 4,14 C1.790861,14 0,12.209139 0,10 C0,7.790861 1.790861,6 4,6 Z M4,7 C2.34314575,7 1,8.34314575 1,10 C1,11.6568542 2.34314575,13 4,13 C5.65685425,13 7,11.6568542 7,10 C7,8.34314575 5.65685425,7 4,7 Z" id="椭圆形"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 858 B

View File

@@ -9,21 +9,21 @@
<div class="app-container system-manage-landpage">
<el-container>
<el-aside>
<side-tree v-if="menuList.length > 0" :menu-list="menuList" @getOrganization="getOrganization" />
<TestTree v-if="menuList.length > 0" :menu-list="menuList" @getOrganization="getOrganization" />
<!-- <side-tree v-if="menuList.length > 0" :menu-list="menuList" @getOrganization="getOrganization" /> -->
</el-aside>
<el-main>
<el-form
ref="dataForm"
:model="dataForm"
:inline="true"
size="medium"
label-width="100px"
label-position="left"
>
<el-form-item label-width="60px" :label="$t('userManage.orgName') + ''">
<span style="margin: 0 5px;color:#1890FF">{{ dataForm.orgName }}</span>
<el-form ref="dataForm" :model="dataForm" :inline="true" size="mini" label-position="left">
<el-row>
<el-col style="margin: 0 0 28px;">
<!-- <el-form-item class="has-icon" label-width="100px" :label="$t('userManage.orgName')"> -->
<el-form-item class="has-icon">
<span v-if="dataForm.orgName">{{ dataForm.orgName }}</span>
<span v-else>用户管理</span>
</el-form-item>
<el-form-item :label="$t('userManage.userName') + ''" prop="name">
</el-col>
<el-col>
<el-form-item :label="$t('userManage.userName')" prop="name">
<el-input
v-model="dataForm.name"
:placeholder="['placeholder.input', $t('userManage.userName')] | i18nFilterForm"
@@ -34,6 +34,8 @@
<el-form-item>
<el-button type="primary" @click="getList()">{{ 'btn.search' | i18nFilter }}</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<base-table
:top-btn-config="topBtnConfig"
@@ -69,6 +71,7 @@
</template>
<script>
import TestTree from './TestTree.vue'
import sideTree from '../system-manage/sideTree'
import { getOrgList } from '@/api/org'
import AddUserForm from './AddUserForm'
@@ -157,7 +160,7 @@ const tableProps = [
}
]
export default {
components: { sideTree, Pagination, BaseTable, MethodBtn, AddUserForm, EditUserForm, AssignRole },
components: { TestTree, sideTree, Pagination, BaseTable, MethodBtn, AddUserForm, EditUserForm, AssignRole },
data() {
return {
topBtnConfig,
@@ -223,6 +226,7 @@ export default {
const res1 = await getOrgList(params)
if (res1.code === 0) {
this.menuList = res1.data.records
console.log('menulist===>', this.menuList)
}
},
getOrganization(data) {
@@ -237,7 +241,7 @@ export default {
confirmButtonText: i18n.t('btn.confirm'),
cancelButtonText: i18n.t('btn.cancel'),
type: 'warning'
}).then(async() => {
}).then(async () => {
// 走接口
const result = await delUser({
id: raw.data.id
@@ -294,11 +298,13 @@ export default {
border-radius: 8px;
background-color: #fff;
width: 256px !important;
padding-top: 20px;
margin: 0;
padding-left: 0;
padding-right: 0;
}
aside {
padding: 0;
}
.el-container >>> .el-main {
border-radius: 8px;
background-color: #fff;
@@ -349,4 +355,49 @@ export default {
letter-spacing: 0.88px;
color: #161616;
}
.has-icon {
position: relative;
width: 100%;
display: flex;
align-items: center;
}
.has-icon::before {
content: '';
width: 4px;
border-radius: 2px;
height: 55%;
position: absolute;
/* top: 13%; */
left: 0;
background: #0b58ff;
}
:not(.has-icon) >>> .el-form-item__label {
font-size: 14px;
}
.has-icon >>> .el-form-item__label {
position: relative;
left: 12px;
font-size: 16px;
}
.has-icon >>> .el-form-item__content {
font-size: 16px;
margin-left: 12px;
}
.el-button--mini {
padding: 6px 12px;
border-radius: 4px;
}
/* .has-icon >>> .el-form-item__content {
position: absolute;
left: 24px;
} */
.el-form-item {
margin: 0;
}
</style>

View File

@@ -7,7 +7,7 @@
* @FilePath: \mt-bus-fe\src\views\OperationalOverview\components\baseContainer\index.vue
-->
<template>
<div class="base-container" :style="{height: height * beilv + 'px', fontSize: 12 * beilv + 'px'}">
<div class="base-container" :style="{fontSize: 12 * beilv + 'px'}">
<div class="line" />
<div class="line line-vertical" />
<div class="line line-right" />
@@ -75,6 +75,7 @@ export default {
.base-container {
color: #fff;
width: 100%;
height: 100%;
background-color: rgba($color: #061027, $alpha: 0.15);
position: relative;
border: 2px solid;
@@ -138,8 +139,11 @@ export default {
font-size: 1.5em;
padding: .67em;
}
// .bar-content{
// padding: 1em;
// }
.bar-item {
height: 100%;
}
.bar-content{
height: calc(100% - 4em);
}
}
</style>

View File

@@ -7,26 +7,29 @@
-->
<template>
<div class="visual-base-table-container">
<el-table
v-loading="isLoading"
:header-cell-style="{background:'rgba(32, 55, 96, 0.8)',color:'#fff',height: 28 * beilv + 'px',lineHeight: 28 * beilv + 'px',padding: 0,fontSize: 12 * beilv + 'px'}"
:row-style="setRowStyle"
:data="renderData"
border
style="width: 100%; background: transparent"
>
<el-table-column v-if="page && limit && showIndex" prop="_pageIndex" :label="'tableHeader.index' | i18nFilter" :width="70 * beilv" align="center" />
<el-table v-loading="isLoading" class="techy-el-table" :data="renderData" border height="100%">
<el-table-column
v-for="item in renderTableHeadList"
v-if="page && limit && showIndex"
prop="_pageIndex"
:label="'tableHeader.index' | i18nFilter"
:width="70 * beilv"
align="center"
/>
<el-table-column
v-for="(item, index) in renderTableHeadList"
:key="item.prop"
:show-overflow-tooltip="showOverflow"
v-bind="item"
>
<template slot-scope="scope">
<component :is="item.subcomponent" v-if="item.subcomponent" :inject-data="{...scope.row, ...item}" @emitData="emitData" />
<component
:is="item.subcomponent"
v-if="item.subcomponent"
:key="index"
:inject-data="{ ...scope.row, ...item }"
@emitData="emitData"
/>
<span v-else>{{ scope.row[item.prop] | commonFilter(item.filter) }}</span>
</template>
</el-table-column>
<slot name="content" />
@@ -36,7 +39,7 @@
<script>
import { isObject, isString } from 'lodash'
export default {
name: 'BaseTable',
name: 'TechyTable',
filters: {
commonFilter: (source, filterType = a => a) => {
return filterType(source)
@@ -107,70 +110,103 @@ export default {
methods: {
emitData(val) {
this.$emit('emitFun', val)
},
setRowStyle(v) {
if (v.rowIndex % 2 === 0) {
return {
background: 'rgba(14, 32, 62, 0.8)',
color: 'rgba(255,255,255,0.5)',
height: 26 * this.beilv + 'px',
lineHeight: 26 * this.beilv + 'px',
padding: 0,
fontSize: 12 * this.beilv + 'px'
}
} else {
return {
background: 'rgba(32, 55, 96, 0.8)',
color: 'rgba(255,255,255,0.5)',
height: 26 * this.beilv + 'px',
lineHeight: 26 * this.beilv + 'px',
padding: 0,
fontSize: 12 * this.beilv + 'px'
}
}
},
setCellStyle(v) {
return {
lineHeight: 23 * this.beilv + 'px'
}
}
}
}
</script>
<style lang="scss">
@import "~@/styles/index.scss";
<style scoped>
.visual-base-table-container >>> ::-webkit-scrollbar {
width: calc(8px * var(--beilv));
}
.visual-base-table-container >>> ::-webkit-scrollbar-track {
background-color: #14243f;
border-radius: 0;
}
.visual-base-table-container >>> ::-webkit-scrollbar-button {
width: calc(8px * var(--beilv));
height: calc(8px * var(--beilv));
background: #5bc4bf9f;
position: relative;
}
.visual-base-table-container >>> ::-webkit-scrollbar-thumb {
border-radius: calc(8px * var(--beilv));
background: #5bc4bf9f;
}
/* .visual-base-table-container {
min-width: 30vw;
} */
.visual-base-table-container {
.el-table {
border: 0;
}
.el-table::before,.el-table--border::after {
background-color: transparent;
}
.el-table th,td{
border-color: #0D1728 !important;
padding: 0;
}
.el-table tr {
height: 100%;
}
/* .visual-base-table-container >>> .el-table {
min-width: 120%;
} */
/* 清除默认样式 */
.visual-base-table-container >>> th.gutter {
display: none;
}
.visual-base-table-container >>> table {
background: transparent;
}
.el-table__row:hover > td {
background-color: rgba(79,114,136,0.29) !important;
}
.el-table__row--striped:hover > td {
background-color: rgba(79,114,136,0.29) !important;
}
}
.setting {
text-align: right;
padding: 15px;
.setting-box {
width: 100px;
}
i {
color: #aaa;
@extend .pointer;
}
}
.visual-base-table-container >>> .el-table,
.visual-base-table-container >>> th,
.visual-base-table-container >>> tr {
background: unset;
}
/* 设置设计稿样式 */
.visual-base-table-container >>> .el-table::before,
.visual-base-table-container >>> .el-table--group::after,
.visual-base-table-container >>> .el-table--border::after,
.visual-base-table-container >>> .el-table--border::after {
background: unset;
}
.visual-base-table-container >>> table * {
border-color: #0d1728;
border-width: calc(1px * var(--beilv));
}
.visual-base-table-container >>> td {
padding: calc(5px * var(--beilv));
}
.visual-base-table-container >>> td span {
color: #ffffffb3;
font-size: calc(12px * var(--beilv));
line-height: calc(14px * var(--beilv));
}
.visual-base-table-container >>> thead th {
padding: 0;
}
.visual-base-table-container >>> thead th .cell {
color: #fff;
font-size: calc(14px * var(--beilv));
line-height: calc(14px * var(--beilv));
padding: calc(6px * var(--beilv));
white-space: nowrap;
}
.visual-base-table-container >>> .el-table__body tr:hover > td {
background-color: #42537130;
}
.visual-base-table-container >>> .el-table tbody tr:nth-child(odd) {
background-color: #0e203e;
/* background-color: #0e203e90; */
}
.visual-base-table-container >>> .el-table tbody tr:nth-child(even),
.visual-base-table-container >>> .el-table thead {
background-color: #203760;
/* background-color: #20376090; */
}
</style>

View File

@@ -1,11 +1,9 @@
<template>
<div :style="{ padding: 8 * beilv + 'px ' + 24 * beilv + 'px '+ 24 * beilv + 'px' }" class="box">
<div :style="{ padding: 8 * beilv + 'px ' + 24 * beilv + 'px 0'}" class="box">
<div v-for="(item, i) in bomMsg" :key="i" class="bom-box" :style="{ marginBottom: 11 * beilv + 'px'}">
<img src="./../../../../assets/img/cockpit/bom.png" alt="" :width="355 * beilv + 'px'" :height="280 * beilv + 'px'">
<p class="bom-name" :style="{ bottom: 10 * beilv + 'px', fontSize: 16 * beilv + 'px'}">
<span class="leftTriangle" />
<img src="./../../../../assets/img/cockpit/bom.png" alt="" width="100%" height="97%"/>
<p class="bom-name" :style="{ fontSize: 16 * beilv + 'px'}">
<span>{{ item.name }}</span>
<span class="rightTriangle" />
</p>
</div>
</div>
@@ -28,29 +26,19 @@ export default {
<style lang="scss" scoped>
.box {
display: flex;
flex: 1;
height: 100%;
width: 100%;
flex-flow: row wrap;
justify-content: space-between;
.bom-box {
position: relative;
width: 48%;
.bom-name {
position: absolute;
width: 100%;
text-align: center;
.leftTriangle,
.rightTriangle {
display: inline-block;
width: 0px;
height: 0px;
border: 5px solid transparent;
}
.leftTriangle {
border-right-color: #fff;
margin-right: 10px;
}
.rightTriangle {
border-left-color: #fff;
margin-left: 10px;
}
bottom: 6%;
}
}
}

View File

@@ -29,32 +29,15 @@
<bom-list :beilv="beilv" :bom-msg="bomMsg" />
</base-container>
</el-col>
<el-col :span="14">
<el-col :span="14" :style="{ margin: 16 * beilv + 'px' + ' 0' }">
<!-- 右上 -->
<el-row>
<el-col :style="{ marginTop: 16 * beilv + 'px' }">
<base-container :beilv="beilv" :height="470" :title="'在途原片'" :title-icon="'cockpit_2_2'">
<div class="box-padding specil-table1">
<base-table
:page="1"
:limit="14"
:show-index="false"
:beilv="beilv"
:table-config="originalFilm"
:table-data="originalFilmList"
/>
</div>
</base-container>
</el-col>
</el-row>
<!-- 右下 -->
<el-row>
<el-col :style="{ margin: 16 * beilv + 'px' + ' 0' }">
<div class="right-box">
<div class="right-top">
<base-container :beilv="beilv" :height="470" :title="'在途辅料'" :title-icon="'cockpit_2_3'">
<div class="box-padding specil-table1">
<base-table
:page="1"
:limit="14"
:limit="15"
:show-index="false"
:beilv="beilv"
:table-config="material"
@@ -62,8 +45,22 @@
/>
</div>
</base-container>
</el-col>
</el-row>
</div>
<div class="right-bottom">
<base-container :beilv="beilv" :height="470" :title="'深加工再制品'" :title-icon="'cockpit_2_2'">
<div class="box-padding specil-table1">
<base-table
:page="1"
:limit="15"
:show-index="false"
:beilv="beilv"
:table-config="originalFilm"
:table-data="originalFilmList"
/>
</div>
</base-container>
</div>
</div>
</el-col>
</el-row>
</div>
@@ -114,7 +111,7 @@ const material = [
},
{
prop: 'spec',
label: '辅料规格',
label: '辅料名称',
minWidth: 32.4
},
{
@@ -178,37 +175,54 @@ export default {
getMsg() {
const arr = []
const temp = []
const productList = ['2.0-1128*1716', '2.0-1128*2251', '2.0-1128*2272', '3.2-1128*1716', '3.2-1128*1718','3.2-1032*1747', '3.2-1033*2089']
let cnum = 1
for (let i = 0; i < 20; i++) {
const obj = {}
const sj = parseInt(Math.random() * 200)
obj.time = moment().add(sj, 'days').add(sj, 'hours').add(sj, 'minute').add(sj, 'second').format('YYYY-MM-DD HH:mm:ss')
obj.productLine = '产线A'
obj.spec = '光伏玻璃2.0'
obj.batch = moment().subtract(sj, 'days').format('YYYYMMDD') + '0000' + parseInt(Math.random() * 89 + 10)
obj.num = parseInt(Math.random() * 800 + 100)
const sj = parseInt(Math.random() * 3 + 1)
cnum += sj
obj.time = moment('20221101 081002').add(cnum, 'days').add(cnum, 'hours').add(cnum, 'minute').add(cnum, 'second').format('YYYY-MM-DD HH:mm:ss')
obj.productLine = sj % 2 ? 'A' : 'B'
obj.spec = productList[parseInt(Math.random() * (productList.length))]
obj.batch = moment('20221101 081002').add(cnum, 'days').add(cnum, 'hours').add(cnum, 'minute').add(cnum, 'second').format('YYYYMMDDHH')
obj.num = parseInt(Math.random() * 800 + 100) + ' (片)'
arr.push(obj)
}
arr.sort(function (a, b) {
return new Date(a.time) - new Date(b.time)
})
this.originalFilmList = arr
const eqList = ['清洗机', 'A1一次冷却机', 'A1下片机', 'A1一次固化机', 'A1一次镀膜机', 'A1二次固化机', 'A1二次镀膜机', 'A1磨边机', 'A1磨边清洗机', 'A1预热机', 'A2一次冷却机', 'A2一次固化机', 'A2一次镀膜机', 'A2下片机', 'A2二次固化机', 'A2磨边机', 'A2磨边清洗机', 'A储片机206']
const spcList = ['200*231*0.5', '100*120*0.2', '70*80', '100*100']
const eqList = [
{name: '磨边机', fc: ''},
{name: '丝印机', fc: ['油墨', '刮胶']},
{name: '镀膜机', fc: ['镀膜液', '异丙醇']},
{name: '包装机', fc: ['隔离纸', '包装辅材']}
]
let cnum2 = 1
for (let i = 0; i < 20; i++) {
const obj = {}
const sj = parseInt(Math.random() * 200)
obj.time = moment().add(sj, 'days').add(sj, 'hours').add(sj, 'minute').add(sj, 'second').format('YYYY-MM-DD HH:mm:ss')
obj.eqName = eqList[parseInt(Math.random() * eqList.length)]
obj.spec = spcList[parseInt(Math.random() * spcList.length)]
obj.batch = moment().subtract(sj, 'days').format('YYYYMMDD') + '0000' + parseInt(Math.random() * 89 + 10)
const sj = parseInt(Math.random() * 3 + 1)
const sj2 = parseInt(Math.random() * eqList.length)
const sj3 = sj % 2 ? 1 : 0
cnum2 += sj
obj.time = moment('20221015 110314').add(cnum2, 'days').add(cnum2, 'hours').add(cnum2, 'minute').add(cnum2, 'second').format('YYYY-MM-DD HH:mm:ss')
obj.eqName = eqList[sj2].name
obj.spec = eqList[sj2].fc ? (eqList[sj2].fc[sj3]) : ''
obj.batch = moment('20221015 110314').add(cnum2, 'days').add(cnum2, 'hours').add(cnum2, 'minute').add(cnum2, 'second').format('YYYYMMDD')
obj.num = parseInt(Math.random() * 800 + 100)
temp.push(obj)
}
temp.sort(function (a, b) {
return new Date(a.time) - new Date(b.time)
})
this.materialList = temp
this.bomMsg = [
{ name: '隔离纸' },
{ name: '异丙醇' },
{ name: '镀膜液' },
{ name: '磨轮' },
{ name: '包装辅材' },
{ name: '网板' }
{ name: '2.0-1128*1716' },
{ name: '2.0-1128*2251' },
{ name: '2.0-1128*2272' },
{ name: '3.2-1128*1716' },
{ name: '3.2-1128*1718' },
{ name: '3.2-1032*1747' }
]
},
change() {
@@ -256,12 +270,32 @@ export default {
}
}
.box-padding {
padding: 0 16px;
padding: 0 16px 16px;
height: 100%;
opacity: 0.8;
}
}
</style>
<style lang="scss">
.material-cockpit {
.container-main {
height: calc(100vh - 100px * var(--beilv));
display: flex;
flex: 1;
}
.right-box {
height: 100%;
display: flex;
// flex: 1;
flex-direction: column-reverse;
justify-content: space-between;
}
.right-top {
height: 49.4%;
}
.right-bottom {
height: 49.4%;
}
.specil-table1 {
.el-table .cell {
padding-left: 40px;

View File

@@ -24,7 +24,7 @@
</el-row>
<el-row class="container-main">
<!-- -->
<el-row :style="{ padding: '0 ' + 9 * beilv + 'px' }" :gutter="16 * beilv">
<el-row :style="{ padding: '0 ' + 9 * beilv + 'px' }" :gutter="16 * beilv" class="top-container">
<el-col :span="10">
<base-container :beilv="beilv" :height="412" :title="'工单一览表'" :title-icon="'cockpit_1_1'">
<work-order :beilv="beilv" :order-msg="orderList" />
@@ -46,13 +46,13 @@
</el-col>
</el-row>
<!-- -->
<el-row :style="{ padding: '0 ' + 9 * beilv + 'px' }">
<el-row :style="{ padding: '0 ' + 9 * beilv + 'px' }" class="bottom-container">
<el-col :style="{ margin: 16 * beilv + 'px' + ' 0' }" :span="24">
<base-container :beilv="beilv" :height="520" :title="'在途/完成订单监控'" :title-icon="'cockpit_1_3'">
<div class="box-padding specil-table2">
<base-table
:page="1"
:limit="16"
:limit="17"
:show-index="false"
:beilv="beilv"
:table-config="orderMonitiring"
@@ -72,21 +72,22 @@ import screenfull from 'screenfull'
import BaseTable from './components/baseTable.vue'
import moment from 'moment'
import orderStatus from './components/orderStatus.vue'
import { rateFormatter2 } from '@/filters/index'
const orderPool = [
{
prop: 'customerName',
label: '客户名称',
minWidth: 35.2
minWidth: 38
},
{
prop: 'orderCode',
label: '订单编号',
minWidth: 32
minWidth: 36
},
{
prop: 'productName',
label: '产品名称',
minWidth: 32
minWidth: 30
},
{
prop: 'planNum',
@@ -96,35 +97,36 @@ const orderPool = [
{
prop: 'planDelivery',
label: '计划交货期',
minWidth: 28.8
minWidth: 25
},
{
prop: 'status',
label: '订单状态',
subcomponent: orderStatus,
minWidth: 19
minWidth: 21
}
]
const orderMonitiring = [
{
prop: 'customerName',
label: '客户名称',
minWidth: 35.2
minWidth: 40
},
{
prop: 'orderCode',
label: '订单编号',
minWidth: 33.2
minWidth: 38
},
{
prop: 'status',
label: '订单状态',
subcomponent: orderStatus,
minWidth: 27
minWidth: 28
},
{
prop: 'completion',
label: '完成率',
filter: rateFormatter2,
minWidth: 24.8
},
{
@@ -206,42 +208,60 @@ export default {
},
methods: {
getMsg() {
this.orderList = [
{ code: 'ZGD20221024000110', state: '激活', name: '光伏玻璃2.0', line: 'A', workCode: '20221024000110', percentage: '100%' },
{ code: 'ZGD20221028000157', state: '激活', name: '光伏玻璃2.0', line: 'A', workCode: '20221028000157', percentage: '85%' },
{ code: 'ZGD20221030000142', state: '激活', name: '光伏玻璃2.0', line: 'A', workCode: '20221030000142', percentage: '72%' },
{ code: 'ZGD20221030000098', state: '激活', name: '光伏玻璃2.0', line: 'A', workCode: '20221030000098', percentage: '46%' }
]
const compList = ['SHABO沙玻', 'KIBING旗滨', '金晶玻璃', '济南金昊', '东莞佳美特', '汇中矿产', '文盛新材料', '西点化学', '开源塑胶', '奥驰商贸', '竹中科技', '程龙玻璃']
const arr = []
const compList = ['隆基绿能科技股份有限公司', '天合光能股份有限公司', '晶澳太阳能科技股份有限公司', '晶科能源股份有限公司', '阿特斯阳光电力集团', '东方日升新能源股份有限公司', '尚德集团', '浙江正泰新能源开发有限公司', '环晟光伏(江苏)有限公司', '江苏赛拉弗光伏系统有限公司', '唐山海泰新能科技股份有限公司', '阳光能源控股有限公司', '横店集团东磁股份有限公司', '常州亿晶光电科技有限公司', '协鑫集成科技股份有限公司', '苏州中来光伏新材股份有限公司', '中节能太阳能科技(镇江)有限公司', '苏州腾晖光伏技术有限公司', '英利绿色能源控股有限公司', '湖南红太阳新能源科技有限公司']
const productList = ['2.0-1128*1716', '2.0-1128*2251', '2.0-1128*2272', '3.2-1128*1716', '3.2-1128*1718','3.2-1032*1747', '3.2-1033*2089']
const daping = [{name: '3.2-1032*1747', percentage: '72%'},{name: '2.0-1128*1716', percentage: '67%'},{name: '3.2-1128*1716', percentage: '46%'},{name: '2.0-1128*2251', percentage: '89%'}]
const arr1 = []
const arr2 = []
const temp = []
for (let i = 0; i < 20; i++) {
const obj = {}
for(let i = 0; i < 4; i++) {
const sj = parseInt(Math.random() * 200)
obj.customerName = compList[parseInt(Math.random() * (compList.length))]
obj.orderCode = moment().subtract(sj, 'days').format('YYYYMMDD') + '0000' + parseInt(Math.random() * 89 + 10)
obj.productName = '光伏玻璃2.0'
obj.planNum = parseInt(Math.random() * 800 + 100)
obj.planDelivery = moment().add(sj, 'days').format('YYYY-MM-DD')
obj.status = parseInt(Math.random() * 3 + 1)
arr.push(obj)
const obj = {}
obj.code = 'WOD' + moment().subtract(sj, 'days').subtract(sj, 'hours').subtract(sj, 'minute').subtract(sj, 'second').format('YYYYMMDDHHmmss')
obj.state = '激活'
obj.name = daping[i].name
obj.line = sj % 2 ? 'A' : 'B'
obj.workCode = 'ODFG' + moment().subtract(sj, 'days').subtract(sj, 'hours').subtract(sj, 'minute').subtract(sj, 'second').format('YYYYMMDDHHmmss')
obj.percentage = daping[i].percentage
arr1.push(obj)
}
this.orderPoolList = arr
this.orderList = arr1
const timeArr = ["2022-10-01", "2022-10-03", "2022-10-04", "2022-10-07","2022-10-11", "2022-10-12", "2022-10-15", "2022-10-18", "2022-10-19", "2022-10-21", "2022-10-23", "2022-10-26", "2022-10-27"]
for (let i = 0; i < 20; i++) {
const obj = {}
const sj = parseInt(Math.random() * 200)
obj.customerName = compList[parseInt(Math.random() * (compList.length))]
obj.orderCode = moment().subtract(sj, 'days').format('YYYYMMDD') + '0000' + parseInt(Math.random() * 89 + 10)
obj.orderCode = 'ODFG' + moment().subtract(sj, 'days').subtract(sj, 'hours').subtract(sj, 'minute').subtract(sj, 'second').format('YYYYMMDDHHmmss')
obj.productName = productList[parseInt(Math.random() * (productList.length))]
obj.planNum = parseInt(Math.random() * 800 + 100) + '(m²)'
obj.planDelivery = timeArr[i]
obj.status = 4
arr2.push(obj)
}
this.orderPoolList = arr2
for (let i = 0; i < 20; i++) {
const obj = {}
const sj = parseInt(Math.random() * 200)
obj.customerName = compList[parseInt(Math.random() * (compList.length))]
obj.orderCode = 'ODFG' + moment().subtract(sj, 'days').subtract(sj, 'hours').subtract(sj, 'minute').subtract(sj, 'second').format('YYYYMMDDHHmmss')
obj.status = parseInt(Math.random() * 3 + 1)
obj.completion = obj.status === 1 ? '0.00%' : (obj.status === 3 ? '100%' : parseInt(Math.random() * 100) + '%')
obj.yield = parseInt(Math.random() * 50 + 50) + '%'
obj.shiftCosts = obj.status === 1 ? parseInt(0).toFixed(2) : parseInt(Math.random() * 800 + 100).toFixed(2)
obj.energyCosts = obj.status === 1 ? parseInt(0).toFixed(2) : parseInt(Math.random() * 800 + 100).toFixed(2)
obj.equipmentCost = obj.status === 1 ? parseInt(0).toFixed(2) : parseInt(Math.random() * 800 + 100).toFixed(2)
obj.materialCost = obj.status === 1 ? parseInt(0).toFixed(2) : parseInt(Math.random() * 800 + 100).toFixed(2)
obj.totalCost = parseInt(obj.shiftCosts + obj.energyCosts + obj.equipmentCost + obj.materialCost).toFixed(2)
obj.completion = obj.status === 1 ? 0.00 : (obj.status === 3 ? 100 : parseInt(Math.random() * 100))
obj.yield = parseInt(Math.random() * 10 + 90) + '%'
// obj.shiftCosts = obj.status === 1 ? parseInt(0).toFixed(2) : parseInt(Math.random() * 800 + 100).toFixed(2)
// obj.energyCosts = obj.status === 1 ? parseInt(0).toFixed(2) : parseInt(Math.random() * 800 + 100).toFixed(2)
// obj.equipmentCost = obj.status === 1 ? parseInt(0).toFixed(2) : parseInt(Math.random() * 800 + 100).toFixed(2)
// obj.materialCost = obj.status === 1 ? parseInt(0).toFixed(2) : parseInt(Math.random() * 800 + 100).toFixed(2)
// obj.totalCost = parseInt(obj.shiftCosts + obj.energyCosts + obj.equipmentCost + obj.materialCost).toFixed(2)
obj.shiftCosts = '0'
obj.energyCosts = '0'
obj.equipmentCost = '0'
obj.materialCost = '0'
obj.totalCost = '0'
temp.push(obj)
}
temp.sort(function (a, b) {
return new Date(a.completion) - new Date(b.completion)
})
this.orderMonitiringList = temp
},
change() {
@@ -290,9 +310,21 @@ export default {
}
.container-main {
padding: 16px 8px;
.top-container {
height: calc((100vh - 100px * var(--beilv)) * 0.42);
display: flex;
flex: 1;
}
.bottom-container {
height: calc((100vh - 100px * var(--beilv)) * 0.56);
display: flex;
flex: 1;
}
}
.box-padding {
padding: 0 16px;
height: 100%;
opacity: 0.8;
}
}
</style>
@@ -310,11 +342,11 @@ export default {
}
.specil-table2 {
.el-table .cell {
padding-left: 50px;
padding-left: 25px;
}
.el-table--border th:first-child .cell,
.el-table--border td:first-child .cell {
padding-left: 50px;
padding-left: 25px;
}
}
}

View File

@@ -7,7 +7,7 @@
* @FilePath: \mt-bus-fe\src\views\OperationalOverview\components\baseContainer\index.vue
-->
<template>
<div class="base-container" :style="{height: height * beilv + 'px', fontSize: 12 * beilv + 'px'}">
<div class="base-container" :style="{fontSize: 12 * beilv + 'px'}">
<div class="line" />
<div class="line line-vertical" />
<div class="line line-right" />
@@ -75,6 +75,7 @@ export default {
.base-container {
color: #fff;
width: 100%;
height: 100%;
background-color: rgba($color: #061027, $alpha: 0.15);
position: relative;
border: 2px solid;
@@ -138,8 +139,11 @@ export default {
font-size: 1.5em;
padding: .67em;
}
// .bar-content{
// padding: 1em;
// }
.bar-item {
height: 100%;
}
.bar-content{
height: calc(100% - 6em);
}
}
</style>

View File

@@ -7,26 +7,29 @@
-->
<template>
<div class="visual-base-table-container">
<el-table
v-loading="isLoading"
:header-cell-style="{background:'rgba(32, 55, 96, 0.8)',color:'#fff',height: 28 * beilv + 'px',lineHeight: 28 * beilv + 'px',padding: 0,fontSize: 12 * beilv + 'px'}"
:row-style="setRowStyle"
:data="renderData"
border
style="width: 100%; background: transparent"
>
<el-table-column v-if="page && limit && showIndex" prop="_pageIndex" :label="'tableHeader.index' | i18nFilter" :width="70 * beilv" align="center" />
<el-table v-loading="isLoading" class="techy-el-table" :data="renderData" border height="100%">
<el-table-column
v-for="item in renderTableHeadList"
v-if="page && limit && showIndex"
prop="_pageIndex"
:label="'tableHeader.index' | i18nFilter"
:width="70 * beilv"
align="center"
/>
<el-table-column
v-for="(item, index) in renderTableHeadList"
:key="item.prop"
:show-overflow-tooltip="showOverflow"
v-bind="item"
>
<template slot-scope="scope">
<component :is="item.subcomponent" v-if="item.subcomponent" :inject-data="{...scope.row, ...item}" @emitData="emitData" />
<component
:is="item.subcomponent"
v-if="item.subcomponent"
:key="index"
:inject-data="{ ...scope.row, ...item }"
@emitData="emitData"
/>
<span v-else>{{ scope.row[item.prop] | commonFilter(item.filter) }}</span>
</template>
</el-table-column>
<slot name="content" />
@@ -36,7 +39,7 @@
<script>
import { isObject, isString } from 'lodash'
export default {
name: 'BaseTable',
name: 'TechyTable',
filters: {
commonFilter: (source, filterType = a => a) => {
return filterType(source)
@@ -107,70 +110,103 @@ export default {
methods: {
emitData(val) {
this.$emit('emitFun', val)
},
setRowStyle(v) {
if (v.rowIndex % 2 === 0) {
return {
background: 'rgba(14, 32, 62, 0.8)',
color: 'rgba(255,255,255,0.5)',
height: 26 * this.beilv + 'px',
lineHeight: 26 * this.beilv + 'px',
padding: 0,
fontSize: 12 * this.beilv + 'px'
}
} else {
return {
background: 'rgba(32, 55, 96, 0.8)',
color: 'rgba(255,255,255,0.5)',
height: 26 * this.beilv + 'px',
lineHeight: 26 * this.beilv + 'px',
padding: 0,
fontSize: 12 * this.beilv + 'px'
}
}
},
setCellStyle(v) {
return {
lineHeight: 23 * this.beilv + 'px'
}
}
}
}
</script>
<style lang="scss">
@import "~@/styles/index.scss";
<style scoped>
.visual-base-table-container >>> ::-webkit-scrollbar {
width: calc(8px * var(--beilv));
}
.visual-base-table-container >>> ::-webkit-scrollbar-track {
background-color: #14243f;
border-radius: 0;
}
.visual-base-table-container >>> ::-webkit-scrollbar-button {
width: calc(8px * var(--beilv));
height: calc(8px * var(--beilv));
background: #5bc4bf9f;
position: relative;
}
.visual-base-table-container >>> ::-webkit-scrollbar-thumb {
border-radius: calc(8px * var(--beilv));
background: #5bc4bf9f;
}
/* .visual-base-table-container {
min-width: 30vw;
} */
.visual-base-table-container {
.el-table {
border: 0;
}
.el-table::before,.el-table--border::after {
background-color: transparent;
}
.el-table th,td{
border-color: #0D1728 !important;
padding: 0;
}
.el-table tr {
height: 100%;
}
/* .visual-base-table-container >>> .el-table {
min-width: 120%;
} */
/* 清除默认样式 */
.visual-base-table-container >>> th.gutter {
display: none;
}
.visual-base-table-container >>> table {
background: transparent;
}
.el-table__row:hover > td {
background-color: rgba(79,114,136,0.29) !important;
}
.el-table__row--striped:hover > td {
background-color: rgba(79,114,136,0.29) !important;
}
}
.setting {
text-align: right;
padding: 15px;
.setting-box {
width: 100px;
}
i {
color: #aaa;
@extend .pointer;
}
}
.visual-base-table-container >>> .el-table,
.visual-base-table-container >>> th,
.visual-base-table-container >>> tr {
background: unset;
}
/* 设置设计稿样式 */
.visual-base-table-container >>> .el-table::before,
.visual-base-table-container >>> .el-table--group::after,
.visual-base-table-container >>> .el-table--border::after,
.visual-base-table-container >>> .el-table--border::after {
background: unset;
}
.visual-base-table-container >>> table * {
border-color: #0d1728;
border-width: calc(1px * var(--beilv));
}
.visual-base-table-container >>> td {
padding: calc(5px * var(--beilv));
}
.visual-base-table-container >>> td span {
color: #ffffffb3;
font-size: calc(12px * var(--beilv));
line-height: calc(14px * var(--beilv));
}
.visual-base-table-container >>> thead th {
padding: 0;
}
.visual-base-table-container >>> thead th .cell {
color: #fff;
font-size: calc(14px * var(--beilv));
line-height: calc(14px * var(--beilv));
padding: calc(6px * var(--beilv));
white-space: nowrap;
}
.visual-base-table-container >>> .el-table__body tr:hover > td {
background-color: #42537130;
}
.visual-base-table-container >>> .el-table tbody tr:nth-child(odd) {
background-color: #0e203e;
/* background-color: #0e203e90; */
}
.visual-base-table-container >>> .el-table tbody tr:nth-child(even),
.visual-base-table-container >>> .el-table thead {
background-color: #203760;
/* background-color: #20376090; */
}
</style>

View File

@@ -1,17 +1,21 @@
<template>
<div :style="{ height: 15 * beilv + 'px' }">
<span v-if="this.injectData.status === 3">
<svg-icon icon-class="green_dot" style="font-size: 14px; position: relative; top: .08em" />
已完成
</span>
<div class="state-box">
<span v-if="this.injectData.status === 1">
<svg-icon icon-class="yellow_dot" style="font-size: 14px; position: relative; top: .08em" />
<svg-icon icon-class="yellow_dot" class="tip"/>
在途
</span>
<span v-if="this.injectData.status === 2">
<svg-icon icon-class="blue_dot" style="font-size: 14px; position: relative; top: .08em" />
<svg-icon icon-class="blue_dot" class="tip"/>
已下发
</span>
<span v-if="this.injectData.status === 3">
<svg-icon icon-class="green_dot" class="tip" />
已完成
</span>
<span v-if="this.injectData.status === 4">
<svg-icon icon-class="orange_dot" class="tip" />
待下发
</span>
</div>
</template>
<script>
@@ -40,3 +44,11 @@ export default {
}
}
</script>
<style lang="scss" scoped>
.state-box {
.tip {
font-size: calc(14px * var(--beilv));
vertical-align: middle;
}
}
</style>

View File

@@ -5,7 +5,7 @@
v-for="(item,index) in orderMsg"
:key="index"
:style="{ padding: 10 * beilv + 'px ' + 20 * beilv + 'px ' + 16 * beilv + 'px ' + 16 * beilv
+ 'px', height: 168 * beilv + 'px'}"
+ 'px'}"
class="box"
>
<p class="line1">
@@ -15,17 +15,17 @@
<span class="state">{{ item.state }}</span>
</span>
</p>
<p :style="{ paddingLeft: 15 * beilv + 'px'}">
<p style="paddingLeft: 15px">
<span>产品名称<span class="light-color">{{ item.name }}</span></span>
<span class="fr">
产线
<span class="light-color" :style="{marginRight: 25 * beilv + 'px'}">{{ item.line }}</span>
</span>
</p>
<p :style="{ paddingLeft: 15 * beilv + 'px'}">
<p style="paddingLeft: 15px">
<span>所属订单编号<span class="light-color">{{ item.workCode }}</span></span>
</p>
<div :style="{ paddingLeft: 15 * beilv + 'px'}">
<div style="paddingLeft: 15px">
<span v-if="item.percentage === '100%'" class="blue-color"> 订单进度</span>
<span v-else class="light-color">订单进度</span>
<span class="light-color fr">{{ item.percentage }}</span>
@@ -57,10 +57,13 @@ export default {
<style lang='scss' scoped>
.order-box {
display: flex;
flex: 1;
height: 100%;
flex-flow: row wrap;
justify-content: space-between;
.box {
width: 49.5%;
height: 49.5%;
margin-bottom: 8px;
background-image: url('../../../../assets/img/cockpit/module-back.png');
background-repeat: no-repeat;
@@ -76,10 +79,10 @@ export default {
display: inline-block;
content: "";
width: 4px;
height: 14px;
height: calc(14px * var(--beilv));
border-radius: 2px;
margin-right: 8px;
vertical-align: middle;
vertical-align: top;
background-color: #4BFFC8;
}
.state {
@@ -90,6 +93,26 @@ export default {
background: #366F5D;
}
}
::-webkit-scrollbar {
width: calc(8px * var(--beilv));
}
::-webkit-scrollbar-track {
background-color: #14243f;
border-radius: 0;
}
::-webkit-scrollbar-button {
width: calc(8px * var(--beilv));
height: calc(8px * var(--beilv));
background: #5bc4bf9f;
position: relative;
}
::-webkit-scrollbar-thumb {
border-radius: calc(8px * var(--beilv));
background: #5bc4bf9f;
}
}
.progress-box {
border-radius: 5px;

View File

@@ -7,7 +7,6 @@
-->
<template>
<div class="app-container">
<top-title />
<head-form
:form-config="headFormConfig"
@headBtnClick="btnClick"
@@ -45,11 +44,16 @@ const tableBtn = [{
btnName: 'btn.delete'
}]
const tableProps = [{
prop: '',
label: '',
width: 700
}, {
prop: 'name',
label: i18n.t('module.formManage.formSort.name'),
align: 'center'
label: i18n.t('module.formManage.formSort.name')
}]
import TopTitle from '@/components/TopTitle'
let resizeEventListener = null
import HeadForm from '@/components/basicData/HeadForm'
import AddForm from './AddForm'
import EditForm from './EditForm'
@@ -61,7 +65,7 @@ import MethodBtn from '@/components/BaseTable/subcomponents/MethodBtn'
import i18n from '@/lang'
export default {
name: 'OrgManager',
components: { TopTitle, HeadForm, Pagination, BaseTable, MethodBtn, AddForm, EditForm },
components: { HeadForm, Pagination, BaseTable, MethodBtn, AddForm, EditForm },
props: {},
data() {
return {
@@ -100,7 +104,15 @@ export default {
this.getList()
// this.listLoading = false
},
mounted() {},
mounted() {
this.$set(this.tableProps[0], 'width', 700 * (document.body.offsetWidth / 1920))
addEventListener('resize', resizeEventListener = () => {
this.$set(this.tableProps[0], 'width', 700 * (document.body.offsetWidth / 1920))
})
},
destroyed() {
removeEventListener('resize', resizeEventListener)
},
methods: {
handleClick(raw) {
console.log(raw)

View File

@@ -27,14 +27,18 @@
<ul class="report-item__list">
<li v-if="!item.quantity">
<span class="icon icon-no-reports" />
<span>暂无报表</span>
<span style="color: #909090;">暂无报表</span>
</li>
<template v-else>
<li v-for="n in item.quantity" :key="n">
<li v-for="n in item.reportNames" :key="n">
<span class="icon" />
<span>{{ n }}</span>
</li>
<!-- <li v-for="n in item.quantity" :key="n">
<span class="icon" />
<span>报表{{ n }}</span>
</li>
</li> -->
</template>
</ul>
</div>
@@ -212,7 +216,24 @@ export default {
init() {
list({}).then(res => {
this.allNum = 0
this.sortList = res.data
this.sortList = res.data.map(item => {
if (item.name === '能源') {
return { ...item, reportNames: ['产线电量日能耗统计'] }
} else if (item.name === '订单') {
return { ...item, reportNames: ['订单历史记录', '在线订单进度'] }
} else if (item.name === '设备') {
return { ...item, reportNames: ['设备报警', '设备加工数量统计', '设备OEE'] }
} else if (item.name === '人员') {
return { ...item, reportNames: ['班组加工数量统计'] }
} else if (item.name === '产线') {
return { ...item, reportNames: ['产线日产量统计', '产线历史产量记录'] }
} else if (item.name === '质量') {
return { ...item, quantity: 1, reportNames: ['质量缺陷分析'] }
} else {
// mock
return item
}
})
res.data.forEach(item => {
this.allNum += item.quantity
})