Compare commits

..

9 Commits

Author SHA1 Message Date
helloDy
c77130603e merge 2024-06-04 08:56:52 +08:00
helloDy
7cb8abd618 滚动条 2024-06-04 08:55:45 +08:00
acb87e86a1 Merge pull request 'projects/mescc/zhp' (#29) from projects/mescc/zhp into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #29
2024-06-03 16:44:17 +08:00
‘937886381’
1e3ba8c9d0 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-03 16:43:16 +08:00
‘937886381’
9d11f8b943 修改 2024-06-03 16:42:28 +08:00
1cc4c8f8a3 Merge pull request 'projects/mescc/zhp' (#28) from projects/mescc/zhp into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #28
2024-06-03 10:05:37 +08:00
‘937886381’
38b278530c Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-03 08:57:56 +08:00
‘937886381’
7a9549bc8f 修改bug 2024-06-03 08:57:04 +08:00
5f2c85e4d7 Merge pull request 'projects/mescc/dy' (#27) from projects/mescc/dy into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #27
2024-06-03 08:53:37 +08:00
20 changed files with 290 additions and 252 deletions

View File

@ -1,7 +1,7 @@
### ###
# @Author: zhp # @Author: zhp
# @Date: 2024-04-28 13:42:51 # @Date: 2024-04-28 13:42:51
# @LastEditTime: 2024-06-03 08:50:41 # @LastEditTime: 2024-06-04 08:56:35
# @LastEditors: DY # @LastEditors: DY
# @Description: # @Description:
### ###
@ -13,11 +13,11 @@ VUE_APP_TITLE = 芋道管理系统
# 芋道管理系统/开发环境 # 芋道管理系统/开发环境
# VUE_APP_BASE_API = 'http://192.168.1.70:30307' # VUE_APP_BASE_API = 'http://192.168.1.70:30307'
# VUE_APP_BASE_API = 'http://glass.kszny.picaiba.com' VUE_APP_BASE_API = 'http://glass.kszny.picaiba.com'
# sara # sara
# VUE_APP_BASE_API = 'http://192.168.1.63:48080' # VUE_APP_BASE_API = 'http://192.168.1.63:48080'
# 张一丁 # 张一丁
VUE_APP_BASE_API = 'http://192.168.4.139:48080' # VUE_APP_BASE_API = 'http://192.168.4.139:48080'
# 路由懒加载 # 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true VUE_CLI_BABEL_TRANSPILE_MODULES = true

View File

@ -1,7 +1,7 @@
/* /*
* @Author: zhp * @Author: zhp
* @Date: 2024-05-07 08:54:59 * @Date: 2024-05-07 08:54:59
* @LastEditTime: 2024-05-31 15:08:27 * @LastEditTime: 2024-06-03 14:25:02
* @LastEditors: DY * @LastEditors: DY
* @Description: * @Description:
*/ */
@ -50,3 +50,11 @@ export function exportExcel(data) {
responseType: 'blob' responseType: 'blob'
}) })
} }
// 获得工单数据概览
export function getOverView(){
return request({
url: '/ip/prod-work-order/getOverView',
method: 'get'
})
}

View File

@ -4,16 +4,16 @@ function __resizeHandler(entries) {
console.log(entries) console.log(entries)
for (const entry of entries) { for (const entry of entries) {
if (entry.contentBoxSize) { if (entry.contentBoxSize) {
// const contentBoxSize = Array.isArray(entry.contentBoxSize) const contentBoxSize = Array.isArray(entry.contentBoxSize)
// ? entry.contentBoxSize[0] ? entry.contentBoxSize[0]
// : entry.contentBoxSize; : entry.contentBoxSize;
// this.chart_mixin_chartInstance.resize({ this.chart_mixin_chartInstance.resize({
// width: width:
// contentBoxSize.inlineSize < this.MIN_WIDTH contentBoxSize.inlineSize < this.MIN_WIDTH
// ? this.MIN_WIDTH ? this.MIN_WIDTH
// : contentBoxSize.inlineSize, : contentBoxSize.inlineSize,
// height: contentBoxSize.blockSize, height: contentBoxSize.blockSize,
// }); });
} else { } else {
// manipulate contentRect // manipulate contentRect
this.chart_mixin_chartInstance.resize({ this.chart_mixin_chartInstance.resize({

View File

@ -1,14 +1,14 @@
<!-- <!--
* @Author: zhp * @Author: zhp
* @Date: 2024-05-07 10:25:10 * @Date: 2024-05-07 10:25:10
* @LastEditTime: 2024-05-31 16:38:29 * @LastEditTime: 2024-06-03 16:40:45
* @LastEditors: zhp * @LastEditors: zhp
* @Description: * @Description:
--> -->
<template> <template>
<!-- <div class="order"> --> <!-- <div class="order"> -->
<div class="std-rate" style="width: 100%; overflow: hidden scroll; height: 400px"> <div class="std-rate" style="width: 100%">
<!-- <div class="span-2"> <!-- <div class="span-2">
<StdRateItem :period="period" :city="cities[5]" /> <StdRateItem :period="period" :city="cities[5]" />
</div> --> </div> -->
@ -106,12 +106,12 @@ export default {
<style scoped lang="scss"> <style scoped lang="scss">
.std-rate { .std-rate {
display: flex; display: flex;
// gap: 1px; gap: 16px;
// flex: 1 1 auto; // flex: 1 1 auto;
flex-direction: column;
// display: -webkit-box; // display: -webkit-box;
flex-wrap: wrap; // flex-wrap: wrap;
align-items: center; // align-items: center;
// grid-template-columns: repeat(2, 1fr); // grid-template-columns: repeat(2, 1fr);
// grid-template-rows: repeat(4, 1fr); // grid-template-rows: repeat(4, 1fr);
} }
@ -120,10 +120,10 @@ export default {
} }
.flex-item{ .flex-item{
// flex: 1 1 auto; // flex: 1 1 auto;
width: 50%; // width: 50%;
} }
.span-2 { .span-2 {
// flex: 1 1 auto; flex: 1 1 auto;
flex-basis: 100%; // flex-basis: 100%;
} }
</style> </style>

View File

@ -1,7 +1,7 @@
<!-- <!--
* @Author: zhp * @Author: zhp
* @Date: 2024-05-07 13:22:43 * @Date: 2024-05-07 13:22:43
* @LastEditTime: 2024-05-31 15:55:00 * @LastEditTime: 2024-06-03 16:13:52
* @LastEditors: zhp * @LastEditors: zhp
* @Description: * @Description:
--> -->
@ -11,7 +11,7 @@
<span v-for="(item,index) in legend" :key="index" class="legend-item" <span v-for="(item,index) in legend" :key="index" class="legend-item"
:style="{ fontSize: isFullscreen ? '0.58vw' : '0.54vw' }">{{ item.label }}</span> :style="{ fontSize: isFullscreen ? '0.58vw' : '0.54vw' }">{{ item.label }}</span>
</div> </div>
<div ref="oeeChart" style="height:100%;width:100%"></div> <div ref="oeeChart" style="height:94%;width:100%"></div>
</chart-container> </chart-container>
</template> </template>
@ -22,7 +22,7 @@ import ChartContainer from "../../../../components/ChartContainer.vue";
import { debounce } from "@/utils/debounce"; import { debounce } from "@/utils/debounce";
import * as echarts from "echarts"; import * as echarts from "echarts";
export default { export default {
name: "BarChartBase", name: "barChartBaseoee",
components: { components: {
ChartContainer, ChartContainer,
}, },
@ -220,30 +220,30 @@ export default {
this.canvasReset() this.canvasReset()
}, },
/** 全屏状态切换时,对柱子粗细和字体大小进行相应调整 */ /** 全屏状态切换时,对柱子粗细和字体大小进行相应调整 */
// isFullscreen(val) { isFullscreen(val) {
// this.actualOptions.series.map((item) => { // this.actualOptions.series.map((item) => {
// item.barWidth = val ? 18 : 12; // item.barWidth = val ? 18 : 12;
// }); // });
// this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 12; // this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 12;
// this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 12; // this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 12;
// this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 12; // this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 12;
// // if (val === false && this.isOpen === true) { // if (val === false && this.isOpen === true) {
// // console.log(val) // console.log(val)
// // this.width = 97 + '%' // this.width = 97 + '%'
// // this.canvasReset()
// // } else if (val === false && this.isOpen === false) {
// // this.width = 100 + '%'
// // this.canvasReset()
// // }
// // this.actualOptions.series.map((item) => {
// // item.barWidth = val ? 18 : 12;
// // });
// // this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 12;
// // this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 12;
// // this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 12;
// this.initChart(this.actualOptions)
// this.canvasReset() // this.canvasReset()
// }, // } else if (val === false && this.isOpen === false) {
// this.width = 100 + '%'
// this.canvasReset()
// }
// this.actualOptions.series.map((item) => {
// item.barWidth = val ? 18 : 12;
// });
// this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 12;
// this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 12;
// this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 12;
this.initChart(this.actualOptions)
this.canvasReset()
},
series(val) { series(val) {
if (!val) { if (!val) {
this.initChart(this.options); this.initChart(this.options);
@ -268,11 +268,11 @@ export default {
// this.isFullscreen = screenfull.isFullscreen; // this.isFullscreen = screenfull.isFullscreen;
// }); // });
// } // }
// if (screenfull.isEnabled) { if (screenfull.isEnabled) {
// screenfull.on("change", () => { screenfull.on("change", () => {
// this.isFullscreen = screenfull.isFullscreen; this.isFullscreen = screenfull.isFullscreen;
// }); });
// } }
this.actualOptions = this.options this.actualOptions = this.options
this.canvasReset(); this.canvasReset();
window.addEventListener("resize", this.canvasReset); window.addEventListener("resize", this.canvasReset);

View File

@ -1,7 +1,7 @@
<!-- <!--
* @Author: zhp * @Author: zhp
* @Date: 2024-05-23 15:50:44 * @Date: 2024-05-23 15:50:44
* @LastEditTime: 2024-05-31 15:54:41 * @LastEditTime: 2024-06-03 16:14:03
* @LastEditors: zhp * @LastEditors: zhp
* @Description: * @Description:
--> -->
@ -11,7 +11,7 @@
<span v-for="(item,index) in legend" :key="index" class="legend-item" <span v-for="(item,index) in legend" :key="index" class="legend-item"
:style="{ fontSize: isFullscreen ? '0.58vw' : '0.54vw' }">{{ item.label }}</span> :style="{ fontSize: isFullscreen ? '0.58vw' : '0.54vw' }">{{ item.label }}</span>
</div> </div>
<div ref="oeeChart" style="height:100%;width:100%"></div> <div ref="oeeChart" style="height:94%;width:100%"></div>
</chart-container> </chart-container>
</template> </template>
@ -22,7 +22,7 @@ import ChartContainer from "../../../../components/ChartContainer.vue";
import { debounce } from "@/utils/debounce"; import { debounce } from "@/utils/debounce";
import * as echarts from "echarts"; import * as echarts from "echarts";
export default { export default {
name: "BarChartBase", name: "barChartBaseoee",
components: { components: {
ChartContainer, ChartContainer,
}, },
@ -221,12 +221,12 @@ export default {
}, },
/** 全屏状态切换时,对柱子粗细和字体大小进行相应调整 */ /** 全屏状态切换时,对柱子粗细和字体大小进行相应调整 */
isFullscreen(val) { isFullscreen(val) {
this.actualOptions.series.map((item) => { // this.actualOptions.series.map((item) => {
item.barWidth = val ? 18 : 12; // item.barWidth = val ? 18 : 12;
}); // });
this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 12; // this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 12;
this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 12; // this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 12;
this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 12; // this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 12;
// if (val === false && this.isOpen === true) { // if (val === false && this.isOpen === true) {
// console.log(val) // console.log(val)
// this.width = 97 + '%' // this.width = 97 + '%'
@ -241,8 +241,8 @@ export default {
// this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 12; // this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 12;
// this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 12; // this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 12;
// this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 12; // this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 12;
// this.initChart(this.actualOptions) this.initChart(this.actualOptions)
// this.canvasReset() this.canvasReset()
}, },
series(val) { series(val) {
if (!val) { if (!val) {
@ -267,11 +267,11 @@ export default {
// this.isFullscreen = screenfull.isFullscreen; // this.isFullscreen = screenfull.isFullscreen;
// }); // });
// } // }
// if (screenfull.isEnabled) { if (screenfull.isEnabled) {
// screenfull.on("change", () => { screenfull.on("change", () => {
// this.isFullscreen = screenfull.isFullscreen; this.isFullscreen = screenfull.isFullscreen;
// }); });
// } }
this.actualOptions = this.options this.actualOptions = this.options
this.canvasReset(); this.canvasReset();
window.addEventListener("resize", this.canvasReset); window.addEventListener("resize", this.canvasReset);

View File

@ -270,7 +270,7 @@ export default {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
justify-content: center; // justify-content: center;
gap: 3px; gap: 3px;
backdrop-filter: blur(24px); backdrop-filter: blur(24px);
.cities { .cities {
@ -283,6 +283,7 @@ export default {
flex: 1 1 auto; flex: 1 1 auto;
padding: 0 15%; padding: 0 15%;
/* margin: 10%; */ /* margin: 10%; */
height: 16vh;
/* min-width: 300px; */ /* min-width: 300px; */
align-self: stretch; align-self: stretch;
} }

View File

@ -1,25 +1,31 @@
<!-- <!--
* @Author: zhp * @Author: zhp
* @Date: 2024-05-07 10:04:53 * @Date: 2024-05-07 10:04:53
* @LastEditTime: 2024-05-31 13:19:34 * @LastEditTime: 2024-06-03 16:08:27
* @LastEditors: zhp * @LastEditors: zhp
* @Description: * @Description:
--> -->
<template> <template>
<div class="efficiency-copilot"> <div class="efficiency-copilot">
<section class="top flex">
<Container title="芯片良率" icon="chip2"> <Container title="芯片良率" icon="chip2">
<ChipRate :period="period" :than="than" /> <ChipRate :period="period" :than="than" />
</Container> </Container>
<Container title="标准组件良率" icon="std"> <Container title="标准组件良率" icon="std">
<StdRate :period="period" :than="than" /> <StdRate :period="period" :than="than" />
</Container> </Container>
</section>
<section class="bottom flex">
<Container title="芯片OEE" icon="chip"> <Container title="芯片OEE" icon="chip">
<ChipOee :chipOeeRate="chipOeeRate" :period="period" :than="than" /> <ChipOee :chipOeeRate="chipOeeRate" :period="period" :than="than" />
</Container> </Container>
<Container title="转化效率" icon="cube"> <Container title="转化效率" icon="cube">
<TransformRate :transformRate="transformRate" :period="period" :than="than" /> <TransformRate :transformRate="transformRate" :period="period" :than="than" />
</Container> </Container>
</section>
</div> </div>
</template> </template>
@ -31,7 +37,7 @@ import StdRateVue from "./components/StdRate.vue";
import TransformRateVue from "./components/TransformRate.vue"; import TransformRateVue from "./components/TransformRate.vue";
export default { export default {
name: "EfficiencyCopilot", name: "efficiencyCopilot",
components: { components: {
Container, Container,
ChipOee: ChipOeeVue, ChipOee: ChipOeeVue,
@ -88,7 +94,30 @@ export default {
}; };
</script> </script>
<style scoped> <style scoped>
.efficiency-copilot {
flex: 1;
display: flex;
flex-direction: column;
gap: 16px;
}
.flex {
display: flex;
gap: 16px;
flex: 1;
}
.top > div,
.bottom > div {
height: 100%;
}
</style>
<!-- <style scoped>
.efficiency-copilot { .efficiency-copilot {
flex: 1; flex: 1;
display: grid; display: grid;
@ -100,4 +129,4 @@ export default {
.efficiency-copilot > div { .efficiency-copilot > div {
height: 100%; height: 100%;
} }
</style> </style> -->

View File

@ -22,7 +22,7 @@ export default ({
textAlign: "center", textAlign: "center",
textStyle: { textStyle: {
fontWeight: 600, fontWeight: 600,
fontSize: 32, fontSize: 26,
color: "#fffd", color: "#fffd",
}, },
subtext: `\u2002${subtitle}\u2002`, subtext: `\u2002${subtitle}\u2002`,

View File

@ -1,7 +1,7 @@
<!-- <!--
* @Author: zhp * @Author: zhp
* @Date: 2024-05-20 16:04:18 * @Date: 2024-05-20 16:04:18
* @LastEditTime: 2024-05-31 13:16:26 * @LastEditTime: 2024-06-03 15:45:58
* @LastEditors: zhp * @LastEditors: zhp
* @Description: * @Description:
--> -->
@ -95,13 +95,14 @@ export default {
</script> </script>
<style> <style>
.copilot-layout { .copilot-layout {
padding: 16px; padding: 16px;
background: url(../../assets/images/copilot-bg.png) 0 0 / 100% 100% no-repeat; background: url(../../assets/images/copilot-bg.png) 0 0 / 100% 100% no-repeat;
position: absolute; position: absolute;
left: -16px; left: -16px;
/* top: -8px; */ /* top: -8px; */
height: calc(100% + 240px); height: calc(100% + 30px);
width: calc(100% + 30px); width: calc(100% + 30px);
z-index: 1001; z-index: 1001;
color: #fff; color: #fff;
@ -110,12 +111,12 @@ export default {
gap: 8px; gap: 8px;
} }
.produce{ /* .produce{
height: calc(100% + 38px); height: calc(100% + 38px);
} } */
.other { /* .other { */
/* height: calc(100% + 240px); */ /* height: calc(100% + 240px); */
} /* } */
.copilot-footer { .copilot-footer {
/** position: absolute; /** position: absolute;
bottom: 10px; **/ bottom: 10px; **/

View File

@ -1,7 +1,7 @@
<!-- <!--
* @Author: zhp * @Author: zhp
* @Date: 2024-05-20 13:32:59 * @Date: 2024-05-20 13:32:59
* @LastEditTime: 2024-05-31 15:05:20 * @LastEditTime: 2024-06-03 16:26:24
* @LastEditors: zhp * @LastEditors: zhp
* @Description: * @Description:
--> -->
@ -151,7 +151,7 @@ export default {
]; ];
} }
let titleValue = let titleValue =
vt[1] != null && vt[2] !== 0 vt[1] != null && (vt[2] !== 0 && vt[2] !== undefined)
? this.formatNumber((vt[1] / vt[2] * 100)) + '%' ? this.formatNumber((vt[1] / vt[2] * 100)) + '%'
: (vt[1] != 0 && vt[1] != null) && vt[2] == 0 : (vt[1] != 0 && vt[1] != null) && vt[2] == 0
? "100%" : '0%', ? "100%" : '0%',

View File

@ -1,17 +1,10 @@
<!-- <!--
* @Author: zhp * @Author: zhp
* @Date: 2024-05-30 16:00:50 * @Date: 2024-05-30 16:00:50
* @LastEditTime: 2024-05-31 16:15:51 * @LastEditTime: 2024-06-03 16:26:03
* @LastEditors: zhp * @LastEditors: zhp
* @Description: * @Description:
--> -->
<!--
filename: DoubleRingWrapper.vue
author: liubin
date: 2024-04-17 09:55:12
description:
-->
<template> <template>
<div class="double-ring-wrapper"> <div class="double-ring-wrapper">
<template> <template>

View File

@ -22,7 +22,7 @@ export default ({
textAlign: "center", textAlign: "center",
textStyle: { textStyle: {
fontWeight: 600, fontWeight: 600,
fontSize: 32, fontSize: 20,
color: "#fffd", color: "#fffd",
}, },
subtext: `\u2002${subtitle}\u2002`, subtext: `\u2002${subtitle}\u2002`,
@ -38,7 +38,7 @@ export default ({
{ {
type: "pie", type: "pie",
name: "当前目标", name: "当前目标",
radius: ["70%", "85%"], radius: ["80%", "90%"],
center: ["45%", "52%"], center: ["45%", "52%"],
emptyCircleStyle: { emptyCircleStyle: {
color: "#042c5f33", color: "#042c5f33",
@ -47,7 +47,7 @@ export default ({
// 数据 series // 数据 series
{ {
type: "pie", type: "pie",
radius: ["70%", "85%"], radius: ["80%", "90%"],
center: ["45%", "52%"], center: ["45%", "52%"],
avoidLabelOvervlap: false, avoidLabelOvervlap: false,
label: { label: {
@ -92,7 +92,7 @@ export default ({
// 数据 series2 - 2023累计 // 数据 series2 - 2023累计
{ {
type: "pie", type: "pie",
radius: ["55%", "70%"], radius: ["70%", "80%"],
center: ["45%", "52%"], center: ["45%", "52%"],
avoidLabelOvervlap: false, avoidLabelOvervlap: false,
label: { label: {

View File

@ -1,16 +1,10 @@
<!-- <!--
* @Author: zhp * @Author: zhp
* @Date: 2024-04-28 13:42:51 * @Date: 2024-04-28 13:42:51
* @LastEditTime: 2024-05-31 16:14:09 * @LastEditTime: 2024-06-03 08:55:42
* @LastEditors: zhp * @LastEditors: zhp
* @Description: * @Description:
--> -->
<!--
filename: Bipv.vue
author: liubin
date: 2024-04-10 15:39:54
description:
-->
<template> <template>
<right-chart-base <right-chart-base
@ -31,7 +25,7 @@ export default {
data() { data() {
const year = new Date().getFullYear(); const year = new Date().getFullYear();
// //
const cities = ["瑞昌", "邯郸", const cities = [ "邯郸",
// "", "", "", "", "" // "", "", "", "", ""
]; ];
@ -80,15 +74,15 @@ export default {
return [ return [
{ {
name: `${new Date().getFullYear()}年目标值`, name: `${new Date().getFullYear()}年目标值`,
data: bipvOutput.target, data: bipvOutput.target.splice(0, 1),
}, },
{ {
name: `${new Date().getFullYear() - 1}`, name: `${new Date().getFullYear() - 1}`,
data: bipvOutput.previous, data: bipvOutput.previous.splice(0, 1)
}, },
{ {
name: `${new Date().getFullYear()}`, name: `${new Date().getFullYear()}`,
data: bipvOutput.current, data: bipvOutput.current.splice(0, 1),
}, },
]; ];
}, },

View File

@ -111,9 +111,6 @@ export default {
name: '', // this.series[0].name, name: '', // this.series[0].name,
type: "bar", type: "bar",
barWidth: 12, barWidth: 12,
itemStyle: {
borderRadius: [10, 10, 0, 0],
normal: {
label: { label: {
show: true, // show: true, //
position: 'top', // position: 'top', //
@ -121,8 +118,9 @@ export default {
color: '#DFF1FE', color: '#DFF1FE',
fontSize: 16 fontSize: 16
} }
}
}, },
itemStyle: {
borderRadius: [10, 10, 0, 0],
color: { color: {
type: "linear", type: "linear",
x: 0, x: 0,
@ -156,8 +154,19 @@ export default {
name: '', // this.series[1].name, name: '', // this.series[1].name,
type: "bar", type: "bar",
barWidth: 12, barWidth: 12,
label: {
show: true, //
position: 'top', //
textStyle: { //
color: '#DFF1FE',
fontSize: 16
}
},
itemStyle: { itemStyle: {
borderRadius: [10, 10, 0, 0], borderRadius: [10, 10, 0, 0],
// normal: {
// },
color: { color: {
type: "linear", type: "linear",
x: 0, x: 0,

View File

@ -3,8 +3,8 @@
<div id="map-container"> <div id="map-container">
<!-- <div v-if="visible" class="cdLine"></div> --> <!-- <div v-if="visible" class="cdLine"></div> -->
<!-- <div v-if="visible" class="zzLine"></div> --> <!-- <div v-if="visible" class="zzLine"></div> -->
<div v-if="visible" class="rcLine"></div> <!-- <div v-if="visible" class="rcLine"></div> -->
<div v-if="visible" class="rcLineTwo"></div> <!-- <div v-if="visible" class="rcLineTwo"></div> -->
<div v-if="visible" class="hdLine"></div> <div v-if="visible" class="hdLine"></div>
<div v-if="visible" class="hdLineTwo"></div> <div v-if="visible" class="hdLineTwo"></div>
<!-- <div v-if="visible" class="ksLine"></div> --> <!-- <div v-if="visible" class="ksLine"></div> -->
@ -39,12 +39,12 @@
</div> </div>
</div> </div>
<company-info v-if="visible" :info="info" :position="rcHintPosition" /> <company-info v-if="visible" :info="info" :position="rcHintPosition" />
<ks-company-info v-if="visible" :info="ksInfo" :position="ksHintPosition" /> <!-- <ks-company-info v-if="visible" :info="ksInfo" :position="ksHintPosition" /> -->
<jms-company-info v-if="visible" :info="jmsInfo" :position="jmsHintPosition" /> <!-- <jms-company-info v-if="visible" :info="jmsInfo" :position="jmsHintPosition" /> -->
<hd-company-info v-if="visible" :info="hdInfo" :position="hdHintPosition" /> <hd-company-info v-if="visible" :info="hdInfo" :position="hdHintPosition" />
<bb-company-info v-if="visible" :info="bbInfo" :position="bbHintPosition" /> <!-- <bb-company-info v-if="visible" :info="bbInfo" :position="bbHintPosition" /> -->
<cd-company-info v-if="visible" :info="cdInfo" :position="cdHintPosition" /> <!-- <cd-company-info v-if="visible" :info="cdInfo" :position="cdHintPosition" /> -->
<zz-company-info v-if="visible" :info="zzInfo" :position="zzHintPosition" /> <!-- <zz-company-info v-if="visible" :info="zzInfo" :position="zzHintPosition" /> -->
</div> </div>
</template> </template>
@ -69,13 +69,17 @@ const LOCATIONS = [
// 2 // 2
// { x: 61, y: 53, tx: 39, ty: 68, path: 'factoryData/ksIndex' }, // { x: 61, y: 53, tx: 39, ty: 68, path: 'factoryData/ksIndex' },
// 西 // 西
{ x: 60, y: 58, tx: 68, ty: 52, path: 'factoryData/factory-data' }, { x: 60, y: 58, tx: 68, ty: 52,lx:61,ly:61.5,ltx:68.8,lty:52, path: 'factoryData/factory-data' },
// //
// { x: 56, y: 60, tx: 60, ty: 95, path: 'factoryData/zzIndex' }, // { x: 56, y: 60, tx: 60, ty: 95, path: 'factoryData/zzIndex' },
// //
{ x: 58, y: 45, tx: 47, ty: 34, path: 'factoryData/hdIndex' }, { x: 58, y: 45, tx: 47, ty: 34, lx: 58.7, ly: 34, ltx: 53, lty: 34, path: 'factoryData/hdIndex' },
]; ];
// rcLine.style.left = `66.8%`;
// rcLine.style.top = `52%`;
// rcLineTwo.className = "rcLineTwo";
// rcLineTwo.style.left = `58.7%`;
// rcLineTwo.style.top = `34%`;
export default { export default {
name: "Index", name: "Index",
components: { components: {
@ -248,6 +252,16 @@ export default {
// this.ksInfo = templateInfo; // this.ksInfo = templateInfo;
// } // }
(position === LOCATIONS[0]) { (position === LOCATIONS[0]) {
const rcLine = document.createElement("div");
const rcLineTwo = document.createElement("div");
rcLine.className = "rcLine";
rcLine.style.left = `${position.lx}%`;
rcLine.style.top = `${position.ly}%`;
rcLineTwo.className = "rcLineTwo";
rcLineTwo.style.left = `${position.ltx}%`;
rcLineTwo.style.top = `${position.lty}%`;
document.getElementById("map-container").appendChild(rcLine);
document.getElementById("map-container").appendChild(rcLineTwo);
this.rcHintPosition = position; this.rcHintPosition = position;
templateInfo.companyName = "瑞昌中建材"; templateInfo.companyName = "瑞昌中建材";
templateInfo.items[0].value = this.homeStore.ftoInvest?.current[0]; templateInfo.items[0].value = this.homeStore.ftoInvest?.current[0];
@ -264,6 +278,16 @@ export default {
// templateInfo.items[3].value = this.homeStore.stdOutput.current[2]; // templateInfo.items[3].value = this.homeStore.stdOutput.current[2];
// this.zzInfo = templateInfo; // this.zzInfo = templateInfo;
} else if (position === LOCATIONS[1]) { } else if (position === LOCATIONS[1]) {
const hdLine = document.createElement("div");
const hdLineTwo = document.createElement("div");
hdLine.className = "hdLine";
hdLine.style.left = `${position.lx}%`;
hdLine.style.top = `${position.ly}%`;
hdLineTwo.className = "hdLineTwo";
hdLineTwo.style.left = `${position.ltx}%`;
hdLineTwo.style.top = `${position.lty}%`;
document.getElementById("map-container").appendChild(hdLine);
document.getElementById("map-container").appendChild(hdLineTwo);
this.hdHintPosition = position; this.hdHintPosition = position;
templateInfo.companyName = "邯郸中建材"; templateInfo.companyName = "邯郸中建材";
templateInfo.items[0].value = this.homeStore.ftoInvest?.current[1]; templateInfo.items[0].value = this.homeStore.ftoInvest?.current[1];
@ -350,9 +374,9 @@ export default {
.rcLine { .rcLine {
display: inline-block; display: inline-block;
position: absolute; position: absolute;
left: 61%; /* left: 61%; */
width: 100px; width: 7.9vw;
top: 61.5%; /* top: 61.5%; */
/* x: 60, y: 58, */ /* x: 60, y: 58, */
height: 1px; height: 1px;
border: 2px dashed #FFCF00; border: 2px dashed #FFCF00;
@ -360,12 +384,12 @@ export default {
.rcLineTwo { .rcLineTwo {
position: absolute; position: absolute;
left: 66.8%; /* left: 66.8%; */
width: 1px; width: 1px;
top: 52%; /* top: 52%; */
display: inline-block; display: inline-block;
/* // x: 60, y: 58, */ /* // x: 60, y: 58, */
height: 90px; height: 5vw;
border: 2px dashed #FFCF00; border: 2px dashed #FFCF00;
} }
@ -376,13 +400,13 @@ export default {
top: 34%; top: 34%;
display: inline-block; display: inline-block;
/* // x: 60, y: 58, */ /* // x: 60, y: 58, */
height: 100px; height: 6vw;
border: 2px dashed #FFCF00; border: 2px dashed #FFCF00;
} }
.hdLineTwo { .hdLineTwo {
position: absolute; position: absolute;
left: 53%; left: 53%;
width: 90px; width: 5vw;
top: 34%; top: 34%;
display: inline-block; display: inline-block;
/* // x: 60, y: 58, */ /* // x: 60, y: 58, */

View File

@ -1,7 +1,7 @@
<!-- <!--
* @Author: zhp * @Author: zhp
* @Date: 2023-11-06 15:15:30 * @Date: 2023-11-06 15:15:30
* @LastEditTime: 2024-05-22 15:29:18 * @LastEditTime: 2024-06-03 15:42:47
* @LastEditors: DY * @LastEditors: DY
* @Description: * @Description:
--> -->
@ -18,11 +18,11 @@
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<p class="title">时间维度</p> <p class="title">时间维度</p>
<p class="text">{{ dataForm.targetType === 0 ? '月' : '年' }}</p> <p class="text">{{ ['日', '周', '月', '年'][dataForm.targetType] }}</p>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<p class="title">时间</p> <p class="title">时间</p>
<p class="text">{{ dataForm.targetType === 1 ? dataForm.targetYear + '年' : dataForm.targetYear + '年' + dataForm.targetMonth + '月'}}</p> <p class="text">{{ dataForm.targetTime}}</p>
</el-col> </el-col>
</el-row> </el-row>
<el-divider></el-divider> <el-divider></el-divider>
@ -371,5 +371,8 @@ export default {
color: rgba(102,102,102,0.75); color: rgba(102,102,102,0.75);
padding-bottom: 20px; padding-bottom: 20px;
} }
.detailBox {
width: 98%;
}
</style> </style>

View File

@ -1,15 +1,15 @@
<!-- <!--
* @Author: zhp * @Author: zhp
* @Date: 2024-04-15 10:49:13 * @Date: 2024-04-15 10:49:13
* @LastEditTime: 2024-05-31 16:41:12 * @LastEditTime: 2024-06-03 16:02:56
* @LastEditors: DY * @LastEditors: DY
* @Description: * @Description:
--> -->
<template> <template>
<div style="display: flex; flex-direction: column; min-height: calc(100vh - 96px - 31px)"> <div style="display: flex; flex-direction: column; min-height: calc(100vh - 96px - 32px)">
<ButtonNav v-show="false" :menus="['碲化镉工厂', '铜铟镓硒工厂']" :button-mode="true" @change="changeFactory" style="margin-top: -10px"> <ButtonNav v-show="false" :menus="['碲化镉工厂', '铜铟镓硒工厂']" :button-mode="true" @change="changeFactory" style="margin-top: -10px">
</ButtonNav> </ButtonNav>
<div class="app-container" style="padding: 16px 24px 0;height: auto; flex-grow: 1;"> <div class="app-container" style="height: auto; flex-grow: 1;">
<el-form :model="listQuery" :inline="true" ref="dataForm" class="blueTip"> <el-form :model="listQuery" :inline="true" ref="dataForm" class="blueTip">
<el-form-item v-if="facType === 0" label="工厂名称" prop="factorys"> <el-form-item v-if="facType === 0" label="工厂名称" prop="factorys">
<el-select size="small" v-model="listQuery.factorys" placeholder="请选择工厂名称" multiple clearable> <el-select size="small" v-model="listQuery.factorys" placeholder="请选择工厂名称" multiple clearable>
@ -42,9 +42,9 @@
<el-date-picker size="small" clearable v-model="end" type="week" format="yyyy 第 WW 周" placeholder="选择周" <el-date-picker size="small" clearable v-model="end" type="week" format="yyyy 第 WW 周" placeholder="选择周"
style="width: 180px" @change="onValueChange"> style="width: 180px" @change="onValueChange">
</el-date-picker> </el-date-picker>
<span v-if="start && end" style="margin-left: 10px"> <!-- <span v-if="start && end" style="margin-left: 10px">
{{ date1 }} {{ date2 }} {{ weekNum }} {{ date1 }} {{ date2 }} {{ weekNum }}
</span> </span> -->
</el-form-item> </el-form-item>
<el-form-item v-show="listQuery.date === 3" label="时间值" prop="reportTime"> <el-form-item v-show="listQuery.date === 3" label="时间值" prop="reportTime">
<el-date-picker size="small" v-model="listQuery.reportTime" type="monthrange" value-format="yyyyMM" range-separator="" start-placeholder="开始月份" <el-date-picker size="small" v-model="listQuery.reportTime" type="monthrange" value-format="yyyyMM" range-separator="" start-placeholder="开始月份"
@ -173,7 +173,7 @@ export default {
current: 1, current: 1,
factorys: null, factorys: null,
total: 0, total: 0,
date: 1, date: 3,
beginTime: undefined, beginTime: undefined,
endTime: undefined, endTime: undefined,
reportTime: [] reportTime: []
@ -450,13 +450,12 @@ export default {
}) })
this.upload.url = process.env.VUE_APP_BASE_API + '/admin-api/ip/prod-target/to-target-import-excel' this.upload.url = process.env.VUE_APP_BASE_API + '/admin-api/ip/prod-target/to-target-import-excel'
} }
console.log(112, this.tableProps)
} }
}, },
mounted() { created() {
// this.getDict() const currentMonth = new Date()
// this.getCurrentYearFirst() this.listQuery.reportTime = [moment(currentMonth).format('yyyyMM'), moment(currentMonth).format('yyyyMM')]
this.getDataList() this.changeTime()
}, },
methods: { methods: {
handleImport() { handleImport() {
@ -469,42 +468,6 @@ export default {
this.upload.isUploading = true; this.upload.isUploading = true;
}, },
// //
// handleFileSuccess(param, type) {
// console.log('', param.file)
// const formData = new FormData()
// formData.append('multipartFile', param.file)
// console.log('', param)
// importDiTarget(formData).then(res => {
// console.log(res)
// if (res.code !== 0) {
// this.$modal.msgError(response.msg)
// return;
// }
// this.upload.open = false;
// this.upload.isUploading = false;
// this.$refs.upload.clearFiles();
// }).catch(() => {
// this.upload.open = false
// this.upload.isUploading = false
// })
// //
// // let data = response.data;
// // let text = '' + data.createUsernames.length;
// // for (const username of data.createUsernames) {
// // text += '<br />&nbsp;&nbsp;&nbsp;&nbsp;' + username;
// // }
// // text += '<br />' + data.updateUsernames.length;
// // for (const username of data.updateUsernames) {
// // text += '<br />&nbsp;&nbsp;&nbsp;&nbsp;' + username;
// // }
// // text += '<br />' + Object.keys(data.failureUsernames).length;
// // for (const username in data.failureUsernames) {
// // text += '<br />&nbsp;&nbsp;&nbsp;&nbsp;' + username + '' + data.failureUsernames[username];
// // }
// this.$message.success('');
// this.getDataList();
// },
//
handleFileSuccess(response, file, fileList) { handleFileSuccess(response, file, fileList) {
if (response.code !== 0) { if (response.code !== 0) {
this.$modal.msgError(response.msg) this.$modal.msgError(response.msg)
@ -529,11 +492,6 @@ export default {
changeFactory($event) { changeFactory($event) {
this.currentMenu = $event this.currentMenu = $event
this.facType = this.currentMenu === '碲化镉工厂' ? 0 : 1 this.facType = this.currentMenu === '碲化镉工厂' ? 0 : 1
// if (this.facType === 0) {
// this.upload.url = process.env.VUE_APP_BASE_API + '/admin-api/ip/prod-target/di-target-import-excel'
// } else {
// this.upload.url = process.env.VUE_APP_BASE_API + '/admin-api/ip/prod-target/to-target-import-excel'
// }
this.getDataList() this.getDataList()
}, },
handleClick(val) { handleClick(val) {
@ -544,7 +502,6 @@ export default {
this.$refs.addOrUpdate.init(val.data.id); this.$refs.addOrUpdate.init(val.data.id);
}); });
} else if (val.type === "delete") { } else if (val.type === "delete") {
console.log('啊啊', val)
this.deleteHandle(val.data.id, val.data.factory, val.data._pageIndex) this.deleteHandle(val.data.id, val.data.factory, val.data._pageIndex)
} else { } else {
this.otherMethods(val) this.otherMethods(val)
@ -600,6 +557,10 @@ export default {
this.listQuery.endTime = Number(this.end) this.listQuery.endTime = Number(this.end)
} }
} }
if (!this.start && !this.end) {
this.listQuery.beginTime = undefined
this.listQuery.endTime = undefined
}
// console.log(e); // console.log(e);
}, },
changeTime() { changeTime() {
@ -615,6 +576,9 @@ export default {
this.listQuery.beginTime = Number(this.listQuery.reportTime[0]) this.listQuery.beginTime = Number(this.listQuery.reportTime[0])
this.listQuery.endTime = Number(this.listQuery.reportTime[1]) this.listQuery.endTime = Number(this.listQuery.reportTime[1])
} }
} else {
this.listQuery.beginTime = undefined
this.listQuery.endTime = undefined
} }
}, },
onValueChange(picker, k) { // k onValueChange(picker, k) { // k
@ -633,6 +597,10 @@ export default {
this.listQuery.endTime = Number(moment(this.end.getTime()).format('YYYYWW')) this.listQuery.endTime = Number(moment(this.end.getTime()).format('YYYYWW'))
} }
} }
if (!this.start && !this.end) {
this.listQuery.beginTime = undefined
this.listQuery.endTime = undefined
}
}, },
changeDayTime() { changeDayTime() {
if (this.listQuery.reportTime) { if (this.listQuery.reportTime) {
@ -647,44 +615,12 @@ export default {
this.listQuery.beginTime = Number(this.listQuery.reportTime[0]) this.listQuery.beginTime = Number(this.listQuery.reportTime[0])
this.listQuery.endTime = Number(this.listQuery.reportTime[1]) this.listQuery.endTime = Number(this.listQuery.reportTime[1])
} }
} else {
this.listQuery.beginTime = undefined
this.listQuery.endTime = undefined
} }
}, },
//
multipliedByHundred(str) {
console.log(str);
// console.log(str)
if ( str != 0) {
let floatVal = parseFloat(str);
if (isNaN(floatVal)) {
return 0;
}
floatVal = Math.round(str * 10000) / 100;
let strVal = floatVal.toString();
let searchVal = strVal.indexOf('.');
if (searchVal < 0) {
searchVal = strVal.length;
strVal += '.';
}
while (strVal.length <= searchVal + 2) {
strVal += '0';
}
return parseFloat(strVal);
}
},
async getDataList() { async getDataList() {
// if (this.listQuery.date === 3) {
// if (this.listQuery.reportTime?.length > 0) {
// this.listQuery.beginTime = this.listQuery.reportTime[0] ? Number(this.listQuery.reportTime[0]) : undefined
// this.listQuery.endTime = this.listQuery.reportTime[1] ? this.listQuery.reportTime[1] : undefined
// }
// }
// if (this.listQuery.date === 4) {
// if (this.listQuery.reportTime?.length > 0) {
// this.listQuery.beginTime = this.start ? this.start : undefined
// this.listQuery.endTime = this.end ? this.end : undefined
// }
// }
if (this.currentMenu === '碲化镉工厂') { if (this.currentMenu === '碲化镉工厂') {
await prodTargetDiPage(this.listQuery).then(res => { await prodTargetDiPage(this.listQuery).then(res => {
if (res.code === 0) { if (res.code === 0) {

View File

@ -1,7 +1,7 @@
<!-- <!--
* @Author: zhp * @Author: zhp
* @Date: 2023-11-06 15:15:30 * @Date: 2023-11-06 15:15:30
* @LastEditTime: 2024-05-31 16:13:22 * @LastEditTime: 2024-06-03 10:17:33
* @LastEditors: DY * @LastEditors: DY
* @Description: * @Description:
--> -->
@ -134,14 +134,29 @@ export default {
exportDetail() { exportDetail() {
// //
const pdf = new jsPDF('l', 'pt', 'a4'); const pdf = new jsPDF('l', 'pt', 'a4');
const options = {
scale: 2 const canvas = document.createElement('canvas')
};
const element = this.$refs['detail']; const element = this.$refs['detail'];
const width = pdf.internal.pageSize.getWidth()
const height = pdf.internal.pageSize.getHeight()
canvas.width = width * 2
canvas.height = height * 2
canvas.style.width = width + 'px'
canvas.style.height = height + 'px'
const options = {
// scale: 2,
dpi: 300,
canvas: canvas,
useCORS: true
};
html2canvas(element, options).then((canvas) => { html2canvas(element, options).then((canvas) => {
const imgData = canvas.toDataURL('image/png'); const imgData = canvas.toDataURL('image/png', 1.0);
pdf.addImage(imgData, 'PNG', 0, 0, pdf.internal.pageSize.getWidth(), pdf.internal.pageSize.getHeight()); pdf.addImage(imgData, 'PNG', 0, 0, width, height);
pdf.save(this.dataForm.workOrderNumber + '详情.pdf'); pdf.save(this.dataForm.workOrderNumber + '详情.pdf');
}); });
}, },

View File

@ -1,16 +1,25 @@
<!-- <!--
* @Author: zhp * @Author: zhp
* @Date: 2024-04-15 10:49:13 * @Date: 2024-04-15 10:49:13
* @LastEditTime: 2024-05-31 17:13:56 * @LastEditTime: 2024-06-03 15:15:18
* @LastEditors: DY * @LastEditors: DY
* @Description: * @Description:
--> -->
<template> <template>
<div style="display: flex; flex-direction: column; min-height: calc(100vh - 96px - 31px)"> <div style="display: flex; flex-direction: column; min-height: calc(100vh - 96px - 35px)">
<div class="app-container" style="margin-top: 8px;padding: 16px; height: auto;"> <div class="app-container" style="margin-top: 8px; padding: 0 16px; height: auto; font-size: 20px; text-align: center;">
<p style="margin-bottom: 0">数据概览</p>
<div class="view">
<div v-for="(item, index) in data" :key="index">
<p style="color: rgb(194,128,255)">{{ item }}</p>
<p>{{ index }}</p>
</div>
</div>
</div>
<div class="app-container" style="margin-top: 8px; height: auto;">
<search-bar :formConfigs="formConfig" ref="searchBarForm" @headBtnClick="buttonClick" /> <search-bar :formConfigs="formConfig" ref="searchBarForm" @headBtnClick="buttonClick" />
</div> </div>
<div class="app-container" style="margin-top: 8px;flex-grow: 1; height: auto; padding: 16px;"> <div class="app-container" style="margin-top: 8px;flex-grow: 1; height: auto;">
<search-bar :formConfigs="formConfig2" ref="searchBarForm" style="margin-bottom: 0" /> <search-bar :formConfigs="formConfig2" ref="searchBarForm" style="margin-bottom: 0" />
<base-table :table-props="tableProps" :page="listQuery.pageNo" :limit="listQuery.pageSize" <base-table :table-props="tableProps" :page="listQuery.pageNo" :limit="listQuery.pageSize"
:table-data="tableData"> :table-data="tableData">
@ -30,7 +39,7 @@
<script> <script>
// import { parseTime } from '../../core/mixins/code-filter'; // import { parseTime } from '../../core/mixins/code-filter';
import { getWorkOrderPage, exportExcel } from '@/api/produceData/order'; import { getWorkOrderPage, exportExcel, getOverView } from '@/api/produceData/order';
// import inputTable from './inputTable.vue'; // import inputTable from './inputTable.vue';
import lineChart from './lineChart'; import lineChart from './lineChart';
import moment from 'moment' import moment from 'moment'
@ -217,7 +226,8 @@ export default {
], ],
tableData: [], tableData: [],
xAxis: [], xAxis: [],
lineData: {} lineData: {},
data: {}
// proLineList: [], // proLineList: [],
// all: {} // all: {}
}; };
@ -228,7 +238,16 @@ export default {
this.listQuery.time = [moment(sevenDaysAgo).format('yyyy-MM-DD'), moment(today).format('yyyy-MM-DD')] this.listQuery.time = [moment(sevenDaysAgo).format('yyyy-MM-DD'), moment(today).format('yyyy-MM-DD')]
this.formConfig[2].defaultSelect = this.listQuery.time this.formConfig[2].defaultSelect = this.listQuery.time
}, },
mounted() {
this.getOverView()
},
methods: { methods: {
getOverView() {
getOverView().then(res => {
this.data = res.data
console.log('aa', res.data)
})
},
otherMethods(val) { otherMethods(val) {
this.detailOrUpdateVisible = true; this.detailOrUpdateVisible = true;
// this.addOrEditTitle = ""; // this.addOrEditTitle = "";
@ -299,6 +318,12 @@ export default {
/* padding-bottom: 10px; */ /* padding-bottom: 10px; */
/* } */ /* } */
/* .blueTi */ /* .blueTi */
.view {
display: flex;
justify-content: space-around;
align-items: center;
flex: 1;
}
.blueTip::before{ .blueTip::before{
display: inline-block; display: inline-block;
content: ''; content: '';