Compare commits

...

30 Commits

Author SHA1 Message Date
helloDy
087af452de Merge branch 'projects/mesxc-test' into projects/mesxc-dy 2024-04-11 16:54:02 +08:00
b1cdf083dd Merge pull request 'projects/mesxc-zjl' () from projects/mesxc-zjl into projects/mesxc-test
Reviewed-on: 
2024-04-11 15:37:55 +08:00
673ddcb996 Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-11 15:36:54 +08:00
a9e60dbe82 Merge pull request 'projects/mesxc-zhp' () from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: 
2024-04-11 15:28:36 +08:00
‘937886381’
92d197a513 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-11 15:27:11 +08:00
‘937886381’
e7f440a142 修改bug 2024-04-11 15:26:51 +08:00
5d3622bf62 权限 2024-04-11 15:22:09 +08:00
5ccb9297e1 4.11 2024-04-11 11:18:08 +08:00
ce528f18b6 Merge pull request 'projects/mesxc-zhp' () from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: 
2024-04-11 11:16:10 +08:00
‘937886381’
024060182e Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-11 11:04:14 +08:00
‘937886381’
4f111a95d6 修改看板 2024-04-11 11:03:48 +08:00
8fc6b73179 Merge pull request 'projects/mesxc-zjl' () from projects/mesxc-zjl into projects/mesxc-test
Reviewed-on: 
2024-04-10 17:39:29 +08:00
7f504e5cdd Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-10 17:37:50 +08:00
7c5d8bde0b 能源权限 2024-04-10 17:36:37 +08:00
‘937886381’
0b1761e83c Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-10 16:52:56 +08:00
‘937886381’
cafa156d72 更改需求 2024-04-10 16:52:18 +08:00
ed46ed7d09 Merge pull request 'projects/mesxc-zhp' () from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: 
2024-04-10 16:26:37 +08:00
‘937886381’
f89c6dfe14 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-10 16:12:23 +08:00
‘937886381’
a3b2eae33f 深加工新需求 2024-04-10 16:11:29 +08:00
e70ff40554 Merge pull request '修改成本新的权限字段' () from projects/mesxc-zwq into projects/mesxc-test
Reviewed-on: 
2024-04-10 14:49:44 +08:00
zwq
d3d93acd0f 修改成本新的权限字段 2024-04-10 14:48:37 +08:00
93236f9828 移除部分监听 2024-04-10 14:17:30 +08:00
‘937886381’
fef8824844 修改bug 2024-04-09 16:05:28 +08:00
a4fceeb981 Merge pull request 'projects/mesxc-zjl' () from projects/mesxc-zjl into projects/mesxc-test
Reviewed-on: 
2024-04-09 13:09:55 +08:00
84468cc883 Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-09 13:06:21 +08:00
ea04d55fc1 驾驶舱 2024-04-09 13:04:40 +08:00
ef1078360a Merge pull request '更新成本' () from projects/mesxc-zwq into projects/mesxc-test
Reviewed-on: 
2024-04-09 11:06:14 +08:00
zwq
60f6c3a8fe 更新成本 2024-04-09 11:05:37 +08:00
a4b340ac5d Merge pull request 'projects/mesxc-dy' () from projects/mesxc-dy into projects/mesxc-test
Reviewed-on: 
2024-04-09 08:18:01 +08:00
abcec3bcdc Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-08 16:38:59 +08:00
74 changed files with 2754 additions and 2063 deletions
.env.dev
src
api
views
OperationalOverview
base/packagingPrintLog
choicePart
cost
energyCost
energyCostHis
rawMaterialConfig
rawMaterialCost
rawMaterialCostHis
databoard
energy
analysis
contrastAnalysis
trendAnalysis
base
energyPlc
energyPlcConnect
energyQuantityManual
energyQuantityRealtime
tableNameConfig
monitoring
extend
processEquMaterialBom
processEquValueBom
group
base
groupTeam
groupTeamScheduling
monitoring
groupTeamView
teamProduction
order
base
orderGroup
orderManage
monitoring
components
orderCompletionMonitoring
quality
base
basicData
qualityInspectionBoxBtn
qualityInspectionBoxPermissions
qualityHotMaterial
qualityInspectionDet
qualityInspectionType
qualityScrapDet
qualityScrapLog
qualityScrapType
monitoring
equipmentTraceability
materielDateFrom
qualityInspectionRecord
safetyEnvironmental/environmental
voc
vocDetectionHistory
vocDetectionIndication
wasteGas
wasteGasDetectionHistory
wasteGasDetectionIndication
wasteWater
wasteWaterDetectionHistory
wasteWaterDetectionIndication
system/menu

View File

@ -1,8 +1,8 @@
###
# @Author: Do not edit
# @Date: 2023-08-29 09:40:39
# @LastEditTime: 2024-04-08 16:46:49
# @LastEditors: DY
# @LastEditTime: 2024-04-10 16:58:06
# @LastEditors: zhp
# @Description:
###
# 开发环境配置
@ -20,13 +20,16 @@ VUE_APP_TITLE = MES系统
# VUE_APP_BASE_API = 'http://192.168.1.8:48082'
# VUE_APP_BASE_API = 'http://192.168.4.173:9001'
# VUE_APP_BASE_API = 'http://192.168.1.104:48082'
VUE_APP_BASE_API = 'http://192.168.0.33:48082'
# VUE_APP_BASE_API = 'http://192.168.0.33:48082'
# VUE_APP_BASE_API = 'http://192.168.1.62:48082'
# VUE_APP_BASE_API = 'http://192.168.1.78:48082'
# VUE_APP_BASE_API = 'http://192.168.1.47:48082'
VUE_APP_BASE_API = 'http://192.168.1.78:48082'
# socket地址
VUE_APP_Socket_API = 'ws://10.70.2.2:8080'
VUE_APP_Socket_Dcs_API = 'ws://10.70.180.10:8081'
# VUE_APP_Socket_API = 'ws://10.70.2.2:8080'
# VUE_APP_Socket_Dcs_API = 'ws://10.70.180.10:8081'
VUE_APP_Socket_API = 'ws://192.168.0.33:48082'
VUE_APP_Socket_Dcs_API = 'ws://192.168.0.33:8080'
# 积木报表指向地址
VUE_APP_JIMU_API = 'http://10.70.2.22:8080'

View File

@ -2,7 +2,7 @@
/*
* @Author: zhp
* @Date: 2023-11-06 15:38:12
* @LastEditTime: 2023-12-15 15:29:16
* @LastEditTime: 2024-04-11 14:57:02
* @LastEditors: zhp
* @Description:
*/
@ -94,7 +94,7 @@ export function getWorkerList(query) {
export function getMaterialCheckList(query) {
return request({
url: '/base/core-hot-material-check/listByMaterial',
url: 'base/quality-hot-material-det/filterList',
method: 'get',
params: query
})
@ -102,7 +102,7 @@ export function getMaterialCheckList(query) {
export function createQualityHotMaterialDet(query){
return request({
url: '/base/quality-hot-material-det/create',
url: 'base/quality-hot-material-det/createBatch',
method: 'post',
data: query
})
@ -110,7 +110,7 @@ export function createQualityHotMaterialDet(query){
export function updateQualityHotMaterialDet(query){
return request({
url: '/base/quality-hot-material-det/listbyfilter',
url: 'base/quality-hot-material-det/updateBatch',
method: 'put',
data: query
})
@ -118,7 +118,7 @@ export function updateQualityHotMaterialDet(query){
export function getQualityHotMaterialDetList(query){
return request({
url: '/base/quality-hot-material-det/listbyfilter',
url: '/base/quality-hot-material-det/filterList',
method: 'get',
params: query
})

View File

@ -1,7 +1,7 @@
/*
* @Author: zhp
* @Date: 2023-11-07 15:02:37
* @LastEditTime: 2023-11-07 18:32:07
* @LastEditTime: 2024-04-09 15:14:42
* @LastEditors: zhp
* @Description:
*/

View File

@ -1,7 +1,7 @@
/*
* @Author: zhp
* @Date: 2023-11-07 14:10:18
* @LastEditTime: 2023-11-16 17:49:52
* @LastEditTime: 2024-04-09 09:17:02
* @LastEditors: zhp
* @Description:
*/
@ -18,14 +18,14 @@ export function getStatisticalDataPage(query) {
export function getWorkOrderList(query) {
return request({
url: '/base/core-work-order/listbyfilter',
url: 'base/quality-inspection-record/listbyfilter',
method: 'get',
params: query,
})
}
export function getProductList(query) {
return request({
url: '/base/core-product/listAll',
url: 'base/statistical-data/listAll',
method: 'get',
params: query,
})

View File

@ -1,7 +1,7 @@
<!--
* @Author: zhp
* @Date: 2024-01-29 16:50:26
* @LastEditTime: 2024-04-07 16:05:59
* @LastEditTime: 2024-04-11 09:55:04
* @LastEditors: zhp
* @Description:
-->

View File

@ -1,7 +1,7 @@
<!--
* @Author: zhp
* @Date: 2024-01-29 13:45:56
* @LastEditTime: 2024-03-13 08:58:01
* @LastEditTime: 2024-04-11 11:02:53
* @LastEditors: zhp
* @Description:
-->
@ -26,7 +26,7 @@ export default {
return {
chart: null,
// notMsg:true,
colors:['#2760ff', '#518eec', '#0ee8e4', '#ddb523'],
colors: ['#2760ff', '#518eec', '#49FBD6', '#ddb523'],
chartData: []
};
},
@ -45,7 +45,32 @@ export default {
this.$emit('emitFun')
}
}
},
},
mounted() {
this.chartData = [
{
name: '细长泡',
num: 1112,
yield: 0.97,
},
{
name: '长泡',
num: 1112,
yield: 0.97,
},
{
name: '开口泡',
num: 1112,
yield: 0.97,
},
{
name: '结石',
num: 1112,
yield: 0.97,
}
]
this.updateChart()
},
methods: {
updateChart() {
console.log('update')
@ -71,7 +96,7 @@ export default {
color:this.colors,
title:{
text: num,
subtext: '总数',
subtext: '总数/片',
top: '32%',
left: '49%',
textAlign: 'center',
@ -89,7 +114,7 @@ export default {
left: 'center',
itemWidth: 12,
itemHeight:12,
icon: 'rect',
icon: 'roundRect',
textStyle: {
color: '#fff'
},
@ -107,21 +132,36 @@ export default {
radius: ['45%', '70%'],
avoidLabelOverlap: true,
label: {
show: false
show: true,
normal: {
//
// params: data,
formatter: function (params) {
console.log(params);
return params.value + " | " + params.percent.toFixed(0) + "%" + "\n\n" + params.name;
},
textStyle: { //
// color: '#595959',
fontSize: 24.48
}
}
},
labelLine: {
show: true,
},
data: this.chartData && this.chartData.length > 0 && this.chartData.map((item, index) => ({
name:item.name,
value: item.num,
value: item.num,
label: {
color: this.colors[index % 4]
},
itemStyle:{
color:{
type: 'linear',
x: 1,
y: 1,
x: 0,
y: 0,
x2: 0,
y2: 0,
y2: 1,
global: false,
colorStops:[
{offset: 0,color: this.colors[index%4]},

View File

@ -2,7 +2,7 @@
<!--
* @Author: zhp
* @Date: 2023-09-21 09:06:28
* @LastEditTime: 2024-04-03 16:28:40
* @LastEditTime: 2024-04-09 15:24:39
* @LastEditors: zhp
* @Description:
-->
@ -225,6 +225,9 @@ export default {
scale: true,
type: 'value',
name: '良品率/%',
max: 100,//
min: 0,//
interval: 20,//
nameTextStyle: {// y
color: 'rgba(255,255,255,0.5)', //
align: "left",

View File

@ -1,7 +1,7 @@
<!--
* @Author: zhp
* @Date: 2023-09-21 09:06:28
* @LastEditTime: 2024-04-03 17:09:12
* @LastEditTime: 2024-04-09 15:24:28
* @LastEditors: zhp
* @Description:
-->
@ -224,6 +224,9 @@ export default {
scale: true,
type: 'value',
name: '良品率/%',
max: 100,//
min: 0,//
interval: 20,//
nameTextStyle: {// y
color: 'rgba(255,255,255,0.5)', //
align: "left",

View File

@ -2,16 +2,16 @@
* @Author: zwq
* @Date: 2021-07-19 15:18:30
* @LastEditors: zhp
* @LastEditTime: 2024-04-03 17:14:03
* @LastEditTime: 2024-04-10 16:10:11
* @Description:
-->
<template>
<div id="container" ref="container" class="visual-container" :style="styles">
<el-row class="container-title" :style="{
height: 88 + 'px',
lineHeight: 88 + 'px',
fontSize: 31 + 'px',
}">
height: 88 + 'px',
lineHeight: 88 + 'px',
fontSize: 31 + 'px',
}">
<img src="../../assets/img/logo.png" style="width: 1.1em; position: relative; top: 0.22em" alt="" />
许昌安彩深加工看板
<h3 class="unit">单位河南汇融数字科技有限公司</h3>
@ -39,10 +39,23 @@
<el-col :style="{ margin: 8 + 'px' + ' 0' }" :span="8" height="100%">
<base-container :height="318" :size="'small'" :title="'工单监控'" :title-icon="'eqMonitoring'">
<div class="order" style="width: 100%; overflow: hidden scroll; height: 350px">
<el-row v-for="op in orderList" :key="op.id" style="margin-bottom: .5em">
<el-row v-for="op in orderList" :key="op.id" style="margin-bottom: .5em;overflow: hidden;">
<!-- <el-col :span="12"> -->
<p class="now-secondary-title" style="font-size: 14px;opacity: calc(.6);">{{ op.name }}</p>
<!-- <div style="height: 34px;"> -->
<span class="now-secondary-title" style="font-size: 14px;opacity: calc(.6);">{{ op.name }}</span>
<el-divider class="split" v-if="op.specifications" direction="vertical"></el-divider>
<!-- <span v-if="op.size" class="split"></span> -->
<span v-if="op.specifications" class="orderSize" style="font-size: 14px;opacity: calc(.6);">{{
op.specifications }}</span>
<el-divider class="split" v-if="op.planQuantity" direction="vertical"></el-divider>
<span v-if="op.planQuantity" class="orderPlan" style="font-size: 14px;opacity: calc(.6);">{{
op.planQuantity }}</span>
<span v-if="op.actualQuantity" class="orderFinish"
style="font-size: 14px;opacity: calc(.6);margin-left: 130px;">{{
op.actualQuantity
}}</span>
<el-divider class="split" v-if="op.actualQuantity" direction="vertical"></el-divider>
<!-- </div> -->
<el-progress style="width: 620px;" text-color="rgba(255, 255, 255, .6)" :stroke-width="10"
define-back-color="rgba(32, 57, 96, 1)" :percentage="op.progressRate" class="custom-progress-bar" />
</el-row>
@ -67,7 +80,7 @@
<el-col :style="{ margin: 8 + 'px' + ' 0' }" :span="12">
<base-container :show-time="true" :no-content-padding="true" :height="318 + 338 + 16" :size="'eqStatus'"
:title="'产线产量及良品率'" :title-icon="'productLine'">
<div class="myLegend">
<div class="myLegend">
<div class=" barCircleLegend"></div>
<div class=" barCircle"></div>
<h4 class="barText">产线良品率</h4>
@ -364,42 +377,66 @@ export default {
{
id: '1',
name: '测试工单',
progressRate: 0.933333,
progressRate: 0.933333,
specifications: '1100*5554*22',
plan: 11111,
finish:111,
},
{
id: '2',
name: '测试工单2',
progressRate: 0.932323,
progressRate: 0.932323,
size: '1100*5554*22',
plan: 11111,
finish: 111,
},
{
id: '3',
name: '测试工单3',
progressRate: 0.23232,
progressRate: 0.23232,
size: '1100*5554*22',
plan: 11111,
finish: 111,
},
{
id: '4',
name: '测试工单4',
progressRate: 0.32323,
progressRate: 0.32323,
size: '1100*5554*22',
plan: 11111,
finish: 111,
},
{
id: '4',
id: '5',
name: '测试工单4',
progressRate: 0.32323,
size: '1100*5554*22',
plan: 11111,
finish: 111,
},
{
id: '4',
id: '6',
name: '测试工单4',
size: '1100*5554*22',
progressRate: 0.32323,
plan: 11111,
finish: 111,
},
{
id: '4',
id: '7',
name: '测试工单4',
size: '1100*5554*22',
progressRate: 0.32323,
plan: 11111,
finish: 111,
},
{
id: '4',
id: '8',
name: '测试工单4',
progressRate: 0.32323,
size: '1100*5554*22',
plan: 11111,
finish: 111,
},
// {
// id: '5',
@ -416,7 +453,10 @@ export default {
return {
id: ele.id,
name: ele.name,
progressRate: parseFloat((ele.progressRate * 100).toFixed(0)),
progressRate: parseFloat((ele.progressRate * 100).toFixed(0)),
specifications: ele.specifications ? '规格' + ele.specifications :null,
planQuantity: ele.plan ? '计划' + ele.plan + '片' : null,
finish: ele.finish + '片',
};
}
});
@ -440,8 +480,8 @@ export default {
<span style="color:rgba(255,255,255,0.5)" >${item.name || ''}
</span>`,
`<span style="color:rgba(255,255,255,0.5)">${item.code || ''}</span>`,
`<span style="color:rgba(255,255,255,0.5)">${item.status || ''}</span>`,
`<span style="color:rgba(255,255,255,0.5)">${item.error || ''}</span>`,
`<span style="color:rgba(255,255,255,0.5)"><div style="${item.status == '运行' ? 'box-shadow: 0px 0px 2px 1px #2760FF;width:6px;height:6px;border-radius: 50%;background-color: #2760FF;float:left;margin:13px 10px 0 0 ' : 'box-shadow: 0px 0px 2px 1px #FFBD02;width:6px;height:6px;border-radius: 50%; background-color: #FFBD02;float:left;margin:13px 10px 0 0 '}"></div> ${item.status || ''}</span>`,
`<span style="color:rgba(255,255,255,0.5)"><div style="${item.error == '是' ? 'box-shadow: 0px 0px 2px 1px #2760FF;width:6px;height:6px;border-radius: 50%;background-color: #2760FF;float:left;margin:13px 10px 0 0 ' : 'box-shadow: 0px 0px 2px 1px #FFBD02;width:6px;height:6px;border-radius: 50%; background-color: #FFBD02;float:left;margin:13px 10px 0 0 '}"></div> ${item.error || ''}</span>`,
]);
this.eqConfig.data = eqArr;
let data = [
@ -690,7 +730,10 @@ export default {
return {
id: ele.id,
name: ele.name,
progressRate: parseFloat((ele.progressRate * 100).toFixed(0)),
progressRate: parseFloat((ele.progressRate * 100).toFixed(0)),
specifications: ele.specifications ? '规格' + ele.specifications :null,
planQuantity: ele.planQuantity ? '计划' + ele.planQuantity + '片' : null,
actualQuantity: ele.actualQuantity ? ele.actualQuantity + '片' : null,
};
}
});
@ -704,12 +747,8 @@ export default {
`<span style="color:rgba(255,255,255,0.5)">${
item.code || ''
}</span>`,
`<span style="color:rgba(255,255,255,0.5)"><span style="color:rgba(255,255,255,0.5)"></span> ${
item.status || ''
}</span>`,
`<span style="color:rgba(255,255,255,0.5)">${
item.error || ''
}</span>`,
`<span style="color:rgba(255,255,255,0.5)"><div style="${item.status == '运行' ? 'box-shadow: 0px 0px 2px 1px #2760FF;width:6px;height:6px;border-radius: 50%;background-color: #2760FF;float:left;margin:10px 10px 0 0 ' : 'box-shadow: 0px 0px 2px 1px #FFBD02;width:6px;height:6px;border-radius: 50%; background-color: #FFBD02;float:left;margin:10px 10px 0 0 '}"></div> ${item.status || ''}</span>`,
`<span style="color:rgba(255,255,255,0.5)"><div style="${item.error == '是' ? 'box-shadow: 0px 0px 2px 1px #2760FF;width:6px;height:6px;border-radius: 50%;background-color: #2760FF;float:left;margin:10px 10px 0 0 ' : 'box-shadow: 0px 0px 2px 1px #FFBD02;width:6px;height:6px;border-radius: 50%; background-color: #FFBD02;float:left;margin:10px 10px 0 0 '}"></div> ${item.error || ''}</span>`,
]);
this.eqConfig.data = eqArr;
// this.$nextTick(() => {
@ -802,6 +841,18 @@ export default {
</script>
<style lang="scss" scoped>
.split{
width: 1px;
// display: inline-block;
height: 14px;
// margin-top: 2px;
// line-height: 0;
margin-left: 8px;
opacity:calc(.6);
margin-right: 8px;
background-color: #C8CDD7;
// border: 1px solid #C8CDD7;
}
.myLegend {
position: absolute;
top: -28px;
@ -902,12 +953,39 @@ export default {
}
.now-secondary-title {
display: inline-block;
width: 70px;
margin: 0;
font-size: 1em;
font-size: 14px;
line-height: 2em;
color: #fff;
}
.orderSize {
display: inline-block;
width: 120px;
margin: 0;
font-size: 14px;
line-height: 2em;
color: #fff;
}
.orderFinish {
display: inline-block;
width: 60px;
margin: 0;
font-size: 14px;
line-height: 2em;
text-align: right;
color: #fff;
}
.orderPlan {
display: inline-block;
width: 100px;
margin: 0;
font-size: 14px;
line-height: 2em;
color: #fff;
text-align: left;
}
.now-team-content {
font-size: 3em;
line-height: 1em;

View File

@ -2,7 +2,7 @@
* @Author: zwq
* @Date: 2023-08-01 14:55:51
* @LastEditors: zhp
* @LastEditTime: 2024-04-08 11:49:33
* @LastEditTime: 2024-04-10 16:34:40
* @Description:
-->
<template>
@ -141,8 +141,8 @@ export default {
// btnName: '',
// name: 'reset',
// },
{
type: 'separate',
{
type: this.$auth.hasPermi('base:packaging-print-log:create') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:packaging-print-log:create') ? 'button' : '',

View File

@ -1,348 +1,368 @@
<template>
<div class="choicepart-container">
<navbar />
<div class="choicepart-wrapper">
<div class="choicepart-box" id="choicepartBox" :style="'transform:scale('+scale+');width:1710px;height:538px;'" v-show="showItem">
<div class="choicepart-line1">
<div
v-for="(item, index) in menuArr1"
:key="index"
class="choicepart-item"
@click="handelClick(item, item.choicepart)"
:style="{opacity: item.visible?1:0.4, pointerEvents:item.visible?'auto':'none'}"
>
<div>
<img :src="require(`../../assets/images/choicepart/${item.name}.png`)" alt="">
</div>
<div class="choicepart-item-title">{{item.meta.title}}</div>
</div>
</div>
<div class="choicepart-line2">
<div
v-for="(item, index) in menuArr2"
:key="index"
class="choicepart-item"
@click="handelClick(item, item.choicepart)"
:style="{opacity: item.visible?1:0.4, pointerEvents:item.visible?'auto':'none'}"
>
<div>
<img :src="require(`../../assets/images/choicepart/${item.name}.png`)" alt="">
</div>
<div class="choicepart-item-title">{{item.meta.title}}</div>
</div>
</div>
</div>
</div>
<div class="choicepart-footer">&copy; 中建材智能自动化研究院有限公司</div>
</div>
<div class="choicepart-container">
<navbar />
<div class="choicepart-wrapper">
<div
class="choicepart-box"
id="choicepartBox"
:style="'transform:scale(' + scale + ')'"
style="width: 1710px; height: 538px"
v-show="showItem">
<div class="choicepart-line1">
<div
v-for="(item, index) in menuArr1"
:key="index"
class="choicepart-item"
@click="handelClick(item, item.choicepart)"
:style="{
opacity: item.visible ? 1 : 0.4,
pointerEvents: item.visible ? 'auto' : 'none',
}">
<div>
<img
:src="
require(`../../assets/images/choicepart/${item.name}.png`)
"
alt="" />
</div>
<div class="choicepart-item-title">{{ item.meta.title }}</div>
</div>
</div>
<div class="choicepart-line2">
<div
v-for="(item, index) in menuArr2"
:key="index"
class="choicepart-item"
@click="handelClick(item, item.choicepart)"
:style="{
opacity: item.visible ? 1 : 0.4,
pointerEvents: item.visible ? 'auto' : 'none',
}">
<div>
<img
:src="
require(`../../assets/images/choicepart/${item.name}.png`)
"
alt="" />
</div>
<div class="choicepart-item-title">{{ item.meta.title }}</div>
</div>
</div>
</div>
</div>
<div class="choicepart-footer">&copy; 中建材智能自动化研究院有限公司</div>
</div>
</template>
<script>
import Navbar from './components/Navbar'
import { debounce } from '@/utils/debounce'
import Navbar from './components/Navbar';
import { debounce } from '@/utils/debounce';
export default {
components: { Navbar },
name: 'choicePart',
data() {
return {
boxReset: '',
scale: 1,
menuArr1: [
{
name: 'Core',
title: '基础核心',
visible: false,
meta: {
title: ''
}
},
{
name: 'Order',
title: '订单管理',
visible: false,
meta: {
title: ''
}
},
{
name: 'Equipment',
title: '设备管理',
visible: false,
meta: {
title: ''
}
},
{
name: 'Group',
title: '班组管理',
visible: false,
meta: {
title: ''
}
},
{
name: 'Quality',
title: '质量管理',
visible: false,
meta: {
title: ''
}
},
{
name: 'Warehouse',
title: '仓库管理',
visible: false,
meta: {
title: ''
}
},
{
name: 'Energy',
title: '能源管理',
visible: false,
meta: {
title: ''
}
},
{
name: 'Packaging',
title: '包装管理',
visible: false,
meta: {
title: ''
}
}
],
menuArr2: [
{
name: 'Material',
title: '物料管理',
visible: false,
meta: {
title: ''
}
},
{
name: 'Extend',
title: '工艺管理',
visible: false,
meta: {
title: ''
}
},
// {
// name: 'Delivery',
// title: '',
// visible: false,
// meta: {
// title: ''
// }
// },
{
name: 'Report',
title: '报表管理',
visible: false,
meta: {
title: ''
}
},
{
name: 'Cost',
title: '成本管理',
visible: false,
meta: {
title: ''
}
},
{
name: 'SafetyEnvironmental',
title: '安环管理',
visible: false,
meta: {
title: ''
}
},
{
name: 'Databoard',
title: '数据驾驶舱',
visible: false,
meta: {
title: ''
}
},
{
name: 'System',
title: '系统管理',
visible: false,
meta: {
title: ''
}
}
],
showItem: false
}
},
// computed:{
// ...mapGetters(['sidebarRouters'])
// },
mounted() {
this.getMsg()
this.boxReset = debounce(() => {
this.resetSize()
}, 300)
this.boxReset()
window.addEventListener('resize', () => {
this.boxReset()
})
},
methods: {
getMsg() {
let menuList = this.$store.state.permission.sidebarRouters
console.log(menuList)
if (menuList.length > 0) {
for (let i = 0; i < menuList.length; i ++) {
for (let k = 0; k < 8; k++) {
if (menuList[i].name === this.menuArr1[k].name) {
this.menuArr1[k].visible = true
this.menuArr1[k].id = menuList[i].id
this.menuArr1[k].choicepart = i
this.menuArr1[k].children = menuList[i].children
this.menuArr1[k].meta = menuList[i].meta
}
}
for (let j = 0; j < 7; j++) {
if (menuList[i].name === this.menuArr2[j].name) {
this.menuArr2[j].visible = true
this.menuArr2[j].id = menuList[i].id
this.menuArr2[j].choicepart = i
this.menuArr2[j].children = menuList[i].children
this.menuArr2[j].meta = menuList[i].meta
}
}
}
}
console.log(this.menuArr1)
console.log(this.menuArr2)
},
handelClick(item, index) {
// this.$router.push({name: 'SystemUser'})
this.$store.dispatch('app/setChoicepart', index)
this.toRouter(item)
// if (item.meta.unuse) {
// this.$message.warning(this.$t(''))
// } else {
// this.toRouter(item)
// }
},
toRouter(item) {
console.log(item)
if (item.children) {
this.toRouter(item.children[0])
} else {
this.$router.push({ name: item.name })
}
},
resetSize() {
let _this = this
_this.showItem = false
_this.loading = true
let choicepartBox = document.querySelector('#choicepartBox')
let rw = parseFloat(window.innerWidth)
let rh = parseFloat(window.innerHeight)
let bw = parseFloat(choicepartBox.style.width)
let bh = parseFloat(choicepartBox.style.height)
let wx = 0.82/(bw / rw)
let hx = 0.56/(bh / rh)
_this.scale = wx > hx ? hx : wx
setTimeout(_this.showItemFun, 700)
},
showItemFun() {
this.loading = false
this.showItem = true
}
},
beforeDestroy() {
this.showItem = false
}
}
components: { Navbar },
name: 'choicePart',
data() {
return {
scale: 1,
menuArr1: [
{
name: 'Core',
title: '基础核心',
visible: false,
meta: {
title: '',
},
},
{
name: 'Order',
title: '订单管理',
visible: false,
meta: {
title: '',
},
},
{
name: 'Equipment',
title: '设备管理',
visible: false,
meta: {
title: '',
},
},
{
name: 'Group',
title: '班组管理',
visible: false,
meta: {
title: '',
},
},
{
name: 'Quality',
title: '质量管理',
visible: false,
meta: {
title: '',
},
},
{
name: 'Warehouse',
title: '仓库管理',
visible: false,
meta: {
title: '',
},
},
{
name: 'Energy',
title: '能源管理',
visible: false,
meta: {
title: '',
},
},
{
name: 'Packaging',
title: '包装管理',
visible: false,
meta: {
title: '',
},
},
],
menuArr2: [
{
name: 'Material',
title: '物料管理',
visible: false,
meta: {
title: '',
},
},
{
name: 'Extend',
title: '工艺管理',
visible: false,
meta: {
title: '',
},
},
// {
// name: 'Delivery',
// title: '',
// visible: false,
// meta: {
// title: ''
// }
// },
{
name: 'Report',
title: '报表管理',
visible: false,
meta: {
title: '',
},
},
{
name: 'Cost',
title: '成本管理',
visible: false,
meta: {
title: '',
},
},
{
name: 'SafetyEnvironmental',
title: '安环管理',
visible: false,
meta: {
title: '',
},
},
{
name: 'Databoard',
title: '数据驾驶舱',
visible: false,
meta: {
title: '',
},
},
{
name: 'System',
title: '系统管理',
visible: false,
meta: {
title: '',
},
},
],
showItem: false,
};
},
// computed:{
// ...mapGetters(['sidebarRouters'])
// },
mounted() {
this.getMsg();
this.boxReset();
window.addEventListener('resize', this.boxReset);
},
destroyed() {
window.removeEventListener('resize', this.boxReset);
},
methods: {
boxReset() {
debounce(() => {
this.resetSize();
}, 300)();
},
getMsg() {
let menuList = this.$store.state.permission.sidebarRouters;
console.log(menuList);
if (menuList.length > 0) {
for (let i = 0; i < menuList.length; i++) {
for (let k = 0; k < 8; k++) {
if (menuList[i].name === this.menuArr1[k].name) {
this.menuArr1[k].visible = true;
this.menuArr1[k].id = menuList[i].id;
this.menuArr1[k].choicepart = i;
this.menuArr1[k].children = menuList[i].children;
this.menuArr1[k].meta = menuList[i].meta;
}
}
for (let j = 0; j < 7; j++) {
if (menuList[i].name === this.menuArr2[j].name) {
this.menuArr2[j].visible = true;
this.menuArr2[j].id = menuList[i].id;
this.menuArr2[j].choicepart = i;
this.menuArr2[j].children = menuList[i].children;
this.menuArr2[j].meta = menuList[i].meta;
}
}
}
}
console.log(this.menuArr1);
console.log(this.menuArr2);
},
handelClick(item, index) {
// this.$router.push({name: 'SystemUser'})
this.$store.dispatch('app/setChoicepart', index);
this.toRouter(item);
// if (item.meta.unuse) {
// this.$message.warning(this.$t(''))
// } else {
// this.toRouter(item)
// }
},
toRouter(item) {
console.log(item);
if (item.children) {
this.toRouter(item.children[0]);
} else {
this.$router.push({ name: item.name });
}
},
resetSize() {
let _this = this;
_this.showItem = false;
_this.loading = true;
let choicepartBox = document.querySelector('#choicepartBox');
let rw = parseFloat(window.innerWidth);
let rh = parseFloat(window.innerHeight);
let bw = parseFloat(choicepartBox.style.width);
let bh = parseFloat(choicepartBox.style.height);
let wx = 0.82 / (bw / rw);
let hx = 0.56 / (bh / rh);
_this.scale = wx > hx ? hx : wx;
setTimeout(_this.showItemFun, 700);
},
showItemFun() {
this.loading = false;
this.showItem = true;
},
},
beforeDestroy() {
this.showItem = false;
},
};
</script>
<style lang='scss' scoped>
.choicepart-container {
position: relative;
width: 100%;
height: 100%;
background: url('../../assets/images/choicepart/choicepart-back.png') repeat;
background-size: 100% 100%;
.choicepart-wrapper {
width: 100vw;
height: calc(100vh - 94px);
display: flex;
justify-content: center;
align-items: center;
}
.choicepart-box {
// transition: all 0.3s linear;
.choicepart-line1 {
width: 100%;
margin-bottom: 80px;
display: flex;
flex-flow: row nowrap;
}
.choicepart-line2 {
width: 100%;
display: flex;
flex-flow: row nowrap;
justify-content: center;
}
.choicepart-item {
width: 184px;
height: 224px;
background: url('../../assets/images/choicepart/choice-item-back.png') no-repeat;
background-size: 100% 100%;
border-radius: 5px;
overflow: hidden;
cursor: pointer;
position: relative;
margin: 0 20px;
img {
width: 184px;
height: 224px;
}
.choicepart-item-title {
overflow: hidden;
padding: 0 10px;
text-overflow: ellipsis;
white-space: nowrap;
position: absolute;
bottom: 0;
left: 2px;
right: 2px;
text-align: center;
color: #fff;
font-size: 16px;
line-height: 40px;
height: 40px;
letter-spacing: 2px;
background-color: rgba($color: #0b58ff, $alpha: 0.45);
}
}
.choicepart-item:hover {
.choicepart-item-title {
background-color: rgba($color: #0b58ff, $alpha: 1);
}
}
}
.choicepart-footer {
position: absolute;
width: 100%;
color: #C7C7C7;
user-select: none;
font-size: 12px;
letter-spacing: 1px;
height: 30px;
display: grid;
place-content: center;
bottom: 0;
opacity: 0.5;
}
position: relative;
width: 100%;
height: 100%;
background: url('../../assets/images/choicepart/choicepart-back.png') repeat;
background-size: 100% 100%;
.choicepart-wrapper {
width: 100vw;
height: calc(100vh - 94px);
display: flex;
justify-content: center;
align-items: center;
}
.choicepart-box {
// transition: all 0.3s linear;
.choicepart-line1 {
width: 100%;
margin-bottom: 80px;
display: flex;
flex-flow: row nowrap;
}
.choicepart-line2 {
width: 100%;
display: flex;
flex-flow: row nowrap;
justify-content: center;
}
.choicepart-item {
width: 184px;
height: 224px;
background: url('../../assets/images/choicepart/choice-item-back.png')
no-repeat;
background-size: 100% 100%;
border-radius: 5px;
overflow: hidden;
cursor: pointer;
position: relative;
margin: 0 20px;
img {
width: 184px;
height: 224px;
}
.choicepart-item-title {
overflow: hidden;
padding: 0 10px;
text-overflow: ellipsis;
white-space: nowrap;
position: absolute;
bottom: 0;
left: 2px;
right: 2px;
text-align: center;
color: #fff;
font-size: 16px;
line-height: 40px;
height: 40px;
letter-spacing: 2px;
background-color: rgba($color: #0b58ff, $alpha: 0.45);
}
}
.choicepart-item:hover {
.choicepart-item-title {
background-color: rgba($color: #0b58ff, $alpha: 1);
}
}
}
.choicepart-footer {
position: absolute;
width: 100%;
color: #c7c7c7;
user-select: none;
font-size: 12px;
letter-spacing: 1px;
height: 30px;
display: grid;
place-content: center;
bottom: 0;
opacity: 0.5;
}
}
</style>

View File

@ -32,6 +32,7 @@ import {
import { getEnergyTypeListAll } from '@/api/base/energyType';
import { publicFormatter } from '@/utils/dict';
import moment from 'moment';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
@ -61,7 +62,7 @@ const tableProps = [
];
export default {
mixins: [basicPage],
mixins: [basicPage,tableHeightMixin],
data() {
return {
urlOptions: {
@ -70,7 +71,6 @@ export default {
},
tableData: [],
tableProps,
tableH: this.tableHeight(260),
drawerVisible: false,
formConfig: [
{
@ -92,7 +92,7 @@ export default {
param: 'searchTime',
},
{
type: this.$auth.hasPermi('cost:energyCost:query')
type: this.$auth.hasPermi('extend:cost-energy-search:query')
? 'button'
: '',
btnName: '查询',
@ -100,7 +100,7 @@ export default {
color: 'primary',
},
{
type: this.$auth.hasPermi('cost:energyCost:export')
type: this.$auth.hasPermi('extend:cost-energy-search:export')
? 'button'
: '',
btnName: '导出',
@ -113,9 +113,6 @@ export default {
},
components: {},
created() {
window.addEventListener('resize', () => {
this.tableH = this.tableHeight(260)
})
getEnergyTypeListAll().then((response) => {
this.formConfig[0].selectOptions = response.data;
});

View File

@ -32,6 +32,7 @@ import {
import { getEnergyTypeListAll } from '@/api/base/energyType';
import { publicFormatter } from '@/utils/dict';
import moment from 'moment';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
@ -71,7 +72,7 @@ const tableProps = [
];
export default {
mixins: [basicPage],
mixins: [basicPage,tableHeightMixin],
data() {
return {
urlOptions: {
@ -80,7 +81,6 @@ export default {
},
tableData: [],
tableProps,
tableH: this.tableHeight(260),
drawerVisible: false,
formConfig: [
{
@ -116,7 +116,7 @@ export default {
defaultSelect: [],
},
{
type: this.$auth.hasPermi('cost:energyCostHis:query')
type: this.$auth.hasPermi('extend:cost-enery-auto-report:query')
? 'button'
: '',
btnName: '查询',
@ -124,7 +124,7 @@ export default {
color: 'primary',
},
{
type: this.$auth.hasPermi('cost:energyCostHis:export')
type: this.$auth.hasPermi('extend:cost-enery-auto-report:export')
? 'button'
: '',
btnName: '导出',
@ -137,9 +137,6 @@ export default {
},
components: {},
created() {
window.addEventListener('resize', () => {
this.tableH = this.tableHeight(260)
})
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);

View File

@ -12,7 +12,7 @@
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:max-height="tableH"
:max-height="tableH"
:table-data="tableData">
<method-btn
v-if="tableBtn.length"
@ -53,6 +53,7 @@ import {
} from '@/api/cost/costMaterialSet';
import { getHotMaterialList } from '@/api/base/coreHotMaterial';
import { publicFormatter } from '@/utils/dict';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
@ -91,7 +92,7 @@ const tableProps = [
];
export default {
mixins: [basicPage],
mixins: [basicPage,tableHeightMixin],
data() {
return {
urlOptions: {
@ -99,15 +100,14 @@ export default {
deleteURL: deleteCostMaterialSet,
},
tableProps,
tableH: this.tableHeight(260),
tableBtn: [
this.$auth.hasPermi(`cost:rawMaterialConfig:update`)
this.$auth.hasPermi(`extend:cost-material-set:update`)
? {
type: 'edit',
btnName: '编辑',
}
: undefined,
this.$auth.hasPermi(`cost:rawMaterialConfig:delete`)
this.$auth.hasPermi(`extend:cost-material-set:delete`)
? {
type: 'delete',
btnName: '删除',
@ -124,7 +124,7 @@ export default {
filterable: true,
},
{
type: this.$auth.hasPermi('cost:rawMaterialConfig:query')
type: this.$auth.hasPermi('extend:cost-material-set:query')
? 'button'
: '',
btnName: '查询',
@ -132,10 +132,14 @@ export default {
color: 'primary',
},
{
type: 'separate',
type:
this.$auth.hasPermi('extend:cost-material-set:create') &&
this.$auth.hasPermi('extend:cost-material-set:query')
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('cost:rawMaterialConfig:create')
type: this.$auth.hasPermi('extend:cost-material-set:create')
? 'button'
: '',
btnName: '新增',
@ -150,9 +154,6 @@ export default {
AddOrUpdate,
},
created() {
window.addEventListener('resize', () => {
this.tableH = this.tableHeight(260)
})
getHotMaterialList().then((response) => {
this.formConfig[0].selectOptions = response.data;
});

View File

@ -32,6 +32,7 @@ import {
import { getHotMaterialList } from '@/api/base/coreHotMaterial';
import { publicFormatter } from '@/utils/dict';
import moment from 'moment';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
@ -66,7 +67,7 @@ const tableProps = [
];
export default {
mixins: [basicPage],
mixins: [basicPage,tableHeightMixin],
data() {
return {
urlOptions: {
@ -75,7 +76,6 @@ export default {
},
tableData: [],
tableProps,
tableH: this.tableHeight(260),
drawerVisible: false,
formConfig: [
{
@ -97,7 +97,7 @@ export default {
param: 'searchTime',
},
{
type: this.$auth.hasPermi('cost:rawMaterialCost:query')
type: this.$auth.hasPermi('extend:cost-material-search:query')
? 'button'
: '',
btnName: '查询',
@ -105,7 +105,7 @@ export default {
color: 'primary',
},
{
type: this.$auth.hasPermi('cost:rawMaterialCost:export')
type: this.$auth.hasPermi('extend:cost-material-search:export')
? 'button'
: '',
btnName: '导出',
@ -118,9 +118,6 @@ export default {
},
components: {},
created() {
window.addEventListener('resize', () => {
this.tableH = this.tableHeight(260)
})
getHotMaterialList().then((response) => {
this.formConfig[0].selectOptions = response.data;
});

View File

@ -32,6 +32,7 @@ import {
import { getHotMaterialList } from '@/api/base/coreHotMaterial';
import { publicFormatter } from '@/utils/dict';
import moment from 'moment';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
@ -70,7 +71,7 @@ const tableProps = [
];
export default {
mixins: [basicPage],
mixins: [basicPage,tableHeightMixin],
data() {
return {
urlOptions: {
@ -79,7 +80,6 @@ export default {
},
tableData: [],
tableProps,
tableH: this.tableHeight(260),
drawerVisible: false,
formConfig: [
{
@ -115,7 +115,7 @@ export default {
defaultSelect: [],
},
{
type: this.$auth.hasPermi('cost:rawMaterialCostHis:query')
type: this.$auth.hasPermi('extend:cost-material-auto-report:query')
? 'button'
: '',
btnName: '查询',
@ -123,7 +123,7 @@ export default {
color: 'primary',
},
{
type: this.$auth.hasPermi('cost:rawMaterialCostHis:export')
type: this.$auth.hasPermi('extend:cost-material-auto-report:export')
? 'button'
: '',
btnName: '导出',
@ -136,9 +136,6 @@ export default {
},
components: {},
created() {
window.addEventListener('resize', () => {
this.tableH = this.tableHeight(260)
})
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);

View File

@ -1,8 +1,11 @@
<template>
<div id='deepProcessingContainerB' ref='deepProcessingContainerB' style="width: 100%;height: 100%;">
<div
id="deepProcessingContainerB"
ref="deepProcessingContainerB"
style="width: 100%; height: 100%">
<div
id='deepProcessingContainer'
ref='deepProcessingContainer'
id="deepProcessingContainer"
ref="deepProcessingContainer"
class="deepProcessingBoard"
style="
position: absolute;
@ -16,15 +19,14 @@
flex-direction: column;
gap: 24px;
"
:style="{transform:'scale('+scaleNum+')'}">
<KHeader :isFullScreen='isFullScreen' @screenfullChange='screenfullChange' topTitle='深加工生产运行驾驶舱'/>
:style="{ transform: 'scale(' + scaleNum + ')' }">
<KHeader
:isFullScreen="isFullScreen"
@screenfullChange="screenfullChange"
topTitle="深加工生产运行驾驶舱" />
<div
class="main-body"
style="
display: grid;
gap: 16px;
grid-template-rows: 462px 462px;
">
style="display: grid; gap: 16px; grid-template-rows: 462px 462px">
<TopThree />
<BottomTwo />
</div>
@ -47,16 +49,16 @@
import KHeader from '../components/Header';
import TopThree from './TopThree';
import BottomTwo from './BottomTwo';
import screenfull from 'screenfull'
import { debounce } from '@/utils/debounce'
import { getDcsMsg, getMesMsg } from './../utils/wsInterface'
import screenfull from 'screenfull';
import { debounce } from '@/utils/debounce';
import { getDcsMsg, getMesMsg } from './../utils/wsInterface';
export default {
name: 'deepProcessingBoard',
components: {
KHeader,
TopThree,
BottomTwo
BottomTwo,
},
// provide() {
// return {
@ -66,83 +68,90 @@ export default {
data() {
return {
isFullScreen: false,
scaleNum: 0.8
scaleNum: 0.8,
};
},
created() {
this.init()
this.init();
},
destroy() {
this.destroy()
this.destroy();
},
mounted() {
this.boxReset = debounce(() => {
this.resetSize()
}, 300)
this.boxReset()
window.addEventListener('resize', () => {
this.boxReset()
})
this.resetSize();
}, 300);
this.boxReset();
window.addEventListener('resize', () => {
this.boxReset();
});
// closeWebsocket()
// getDcsMsg()
// getMesMsg()
console.log('mounted...........')
},
mounted() {
this.boxReset();
window.addEventListener('resize', this.boxReset);
},
destroyed() {
console.log('destroyed...........')
window.removeEventListener('resize', this.boxReset);
this.destroy();
},
methods: {
boxReset() {
debounce(() => {
this.resetSize();
}, 300)();
},
change() {
this.isFullScreen = screenfull.isFullscreen
},
init() {
if (screenfull.isEnabled) {
screenfull.on('change', this.change)
}
},
destroy() {
if (screenfull.isEnabled) {
screenfull.off('change', this.change)
}
},
this.isFullScreen = screenfull.isFullscreen;
},
init() {
if (screenfull.isEnabled) {
screenfull.on('change', this.change);
}
},
destroy() {
if (screenfull.isEnabled) {
screenfull.off('change', this.change);
}
},
//
screenfullChange() {
if (!screenfull.isEnabled) {
this.$message({
message: 'you browser can not work',
type: 'warning'
})
return false
}
screenfull.toggle(this.$refs.deepProcessingContainerB)
},
if (!screenfull.isEnabled) {
this.$message({
message: 'you browser can not work',
type: 'warning',
});
return false;
}
screenfull.toggle(this.$refs.deepProcessingContainerB);
},
resetSize() {
let deepProcessingContainer = document.getElementById('deepProcessingContainer')
let rw = parseFloat(window.innerWidth)
let rh = parseFloat(window.innerHeight)
let bw = parseFloat(deepProcessingContainer.style.width)
let bh = parseFloat(deepProcessingContainer.style.height)
let wx = 0
let hx = 0
let deepProcessingContainer = document.getElementById(
'deepProcessingContainer'
);
let rw = parseFloat(window.innerWidth);
let rh = parseFloat(window.innerHeight);
let bw = parseFloat(deepProcessingContainer.style.width);
let bh = parseFloat(deepProcessingContainer.style.height);
let wx = 0;
let hx = 0;
if (screenfull.isFullscreen) {
console.log('全屏')
wx = rw / bw
hx = rh / bh
console.log(this.scaleNum)
}else{
console.log('非全屏')
console.log(this.$store.state.app.sidebar.opened)
wx = rw / bw;
hx = rh / bh;
} else {
if (this.$store.state.app.sidebar.opened) {
wx = (rw-280) / bw
hx = (rh-116) / bh
}else{
wx = (rw-85) / bw
hx = (rh-116) / bh
wx = (rw - 280) / bw;
hx = (rh - 116) / bh;
} else {
wx = (rw - 85) / bw;
hx = (rh - 116) / bh;
}
}
this.scaleNum = wx
}
}
this.scaleNum = wx;
},
},
};
</script>

View File

@ -1,24 +1,23 @@
<!--
filename: MaterialCost.vue
author: liubin
date: 2023-12-06 09:09:27
description:
-->
<template>
<Container name="原料用量统计" size="middle" style="">
<div style="flex: 1; display: flex; gap: 8px;flex-direction: column;">
<Container
name="原料用量统计"
size="middle"
style="">
<div style="flex: 1; display: flex; gap: 8px; flex-direction: column">
<div
class="absolute"
style="
flex:3;
flex: 2;
padding: 12px 12px 0 12px;
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-columns: repeat(2, 1fr);
grid-auto-rows: repeat(4, 1fr);
gap: 8px;
">
<ShadowRect v-for="(item, index) in materialMsg1" :key="index" :rounded="false">
<ShadowRect
v-for="(item, index) in materialMsg"
:key="index"
:rounded="false">
<div
class="material"
style="
@ -30,43 +29,24 @@
align-items: center;
justify-content: center;
">
<span style="color: #0ee8e4; font-weight: 500; font-size: 32px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">
{{item.materialUsed}}
<span
style="
color: #0ee8e4;
font-weight: 500;
font-size: 32px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
">
{{ item.materialUsed }}
</span>
<span style="color: #fff; font-size: 16px; letter-spacing: 1px">
- {{item.materialName}}/kg-
</span>
</div>
</ShadowRect>
</div>
<div style="flex:1;
padding: 0 12px 12px 12px;
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 8px;">
<ShadowRect v-for="(item, index) in materialMsg2" :key="index" :rounded="false">
<div
class="material"
style="
flex: 1;
padding-bottom: 3px;
display: flex;
flex-direction: column;
gap: 4px;
align-items: center;
justify-content: center;
">
<span style="color: #0ee8e4; font-weight: 500; font-size: 32px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">
{{item.materialUsed}}
</span>
<span style="color: #fff; font-size: 16px; letter-spacing: 1px">
- {{item.materialName}}/kg-
- {{ item.materialName }}/kg-
</span>
</div>
</ShadowRect>
</div>
</div>
</Container>
</template>
@ -81,12 +61,9 @@ export default {
return {};
},
computed: {
materialMsg1() {
return this.$store.state.websocket.material.slice(0,9)
materialMsg() {
return this.$store.state.websocket.material;
},
materialMsg2() {
return this.$store.state.websocket.material.slice(9)
}
},
methods: {},
};

View File

@ -1,8 +1,11 @@
<template>
<div id='kilnContainerB' ref='kilnContainerB' style="width: 100%;height: 100%;">
<div
id="kilnContainerB"
ref="kilnContainerB"
style="width: 100%; height: 100%">
<div
id='kilnContainer'
ref='kilnContainer'
id="kilnContainer"
ref="kilnContainer"
class="KilnDataBoard"
style="
position: absolute;
@ -16,15 +19,22 @@
flex-direction: column;
gap: 24px;
"
:style="{transform:'scale('+scaleNum+')'}">
<KHeader :isFullScreen='isFullScreen' @screenfullChange='screenfullChange' topTitle='窑炉生产运行驾驶舱'/>
:style="{ transform: 'scale(' + scaleNum + ')' }">
<KHeader
:isFullScreen="isFullScreen"
@screenfullChange="screenfullChange"
topTitle="窑炉生产运行驾驶舱" />
<div
class="main-body"
style="flex: 1; display: flex; gap: 20px; padding: 0px 16px">
<div class="left-side" style="flex: 2">
<div
class="left-side"
style="flex: 2">
<LeftFour />
</div>
<div class="right-side" style="flex: 1">
<div
class="right-side"
style="flex: 1">
<RightTwo />
</div>
</div>
@ -36,8 +46,8 @@
import KHeader from '../components/Header';
import LeftFour from './LeftFour';
import RightTwo from './RightTwo.vue';
import screenfull from 'screenfull'
import { debounce } from '@/utils/debounce'
import screenfull from 'screenfull';
import { debounce } from '@/utils/debounce';
export default {
name: 'Kiln',
@ -46,10 +56,10 @@ export default {
LeftFour,
RightTwo,
},
computed:{
computed: {
sidebarStatus() {
return this.$store.state.app.sidebar.opened;
}
},
},
// provide() {
// return {
@ -59,84 +69,80 @@ export default {
data() {
return {
isFullScreen: false,
scaleNum: 0.8
scaleNum: 0.8,
};
},
watch: {
sidebarStatus() {
this.boxReset()
this.boxReset();
},
},
created() {
this.init()
},
destroy() {
this.destroy()
this.init();
},
mounted() {
this.boxReset = debounce(() => {
this.resetSize()
}, 300)
this.boxReset()
window.addEventListener('resize', () => {
this.boxReset()
})
this.boxReset();
window.addEventListener('resize', this.boxReset);
},
destroyed() {
window.removeEventListener('resize', this.boxReset);
this.destroy();
},
methods: {
boxReset() {
debounce(() => {
this.resetSize();
}, 300)();
},
change() {
this.isFullScreen = screenfull.isFullscreen
},
this.isFullScreen = screenfull.isFullscreen;
},
init() {
if (screenfull.isEnabled) {
screenfull.on('change', this.change)
}
},
init() {
if (screenfull.isEnabled) {
screenfull.on('change', this.change);
}
},
destroy() {
if (screenfull.isEnabled) {
screenfull.off('change', this.change)
}
},
destroy() {
if (screenfull.isEnabled) {
screenfull.off('change', this.change);
}
},
//
screenfullChange() {
if (!screenfull.isEnabled) {
this.$message({
message: 'you browser can not work',
type: 'warning'
})
return false
}
screenfull.toggle(this.$refs.kilnContainerB)
},
if (!screenfull.isEnabled) {
this.$message({
message: 'you browser can not work',
type: 'warning',
});
return false;
}
screenfull.toggle(this.$refs.kilnContainerB);
},
resetSize() {
let kilnContainerBox = document.getElementById('kilnContainer')
console.log(kilnContainerBox)
let rw = parseFloat(window.innerWidth)
let rh = parseFloat(window.innerHeight)
let bw = parseFloat(kilnContainerBox.style.width)
let bh = parseFloat(kilnContainerBox.style.height)
let wx = 0
let hx = 0
let kilnContainerBox = document.getElementById('kilnContainer');
let rw = parseFloat(window.innerWidth);
let rh = parseFloat(window.innerHeight);
let bw = parseFloat(kilnContainerBox.style.width);
let bh = parseFloat(kilnContainerBox.style.height);
let wx = 0;
let hx = 0;
if (screenfull.isFullscreen) {
console.log('全屏')
wx = rw / bw
hx = rh / bh
console.log(this.scaleNum)
}else{
console.log('非全屏')
console.log(this.$store.state.app.sidebar.opened)
wx = rw / bw;
hx = rh / bh;
} else {
if (this.$store.state.app.sidebar.opened) {
wx = (rw-280) / bw
hx = (rh-116) / bh
}else{
wx = (rw-85) / bw
hx = (rh-116) / bh
wx = (rw - 280) / bw;
hx = (rh - 116) / bh;
} else {
wx = (rw - 85) / bw;
hx = (rh - 116) / bh;
}
}
this.scaleNum = wx
}
}
this.scaleNum = wx;
},
},
};
</script>

View File

@ -1,8 +1,11 @@
<template>
<div id='wholePlantContainerB' ref='wholePlantContainerB' style="width: 100%;height: 100%;">
<div
id="wholePlantContainerB"
ref="wholePlantContainerB"
style="width: 100%; height: 100%">
<div
id='wholePlantContainer'
ref='wholePlantContainer'
id="wholePlantContainer"
ref="wholePlantContainer"
class="wholePlantBoard"
style="
position: absolute;
@ -16,18 +19,27 @@
flex-direction: column;
gap: 24px;
"
:style="{transform:'scale('+scaleNum+')'}">
<KHeader :isFullScreen='isFullScreen' @screenfullChange='screenfullChange' topTitle='全厂总览驾驶舱'/>
:style="{ transform: 'scale(' + scaleNum + ')' }">
<KHeader
:isFullScreen="isFullScreen"
@screenfullChange="screenfullChange"
topTitle="全厂总览驾驶舱" />
<div
class="main-body"
style="flex: 1; display: flex; gap: 20px; padding: 0px 16px">
<div class="left-side" style="flex: 1">
<div
class="left-side"
style="flex: 1">
<LeftTwo />
</div>
<div class="middle-side" style="flex: 1">
<div
class="middle-side"
style="flex: 1">
<MiddleTwo />
</div>
<div class="right-side" style="flex: 1">
<div
class="right-side"
style="flex: 1">
<RightTwo />
</div>
</div>
@ -40,8 +52,8 @@ import KHeader from '../components/Header';
import LeftTwo from './LeftTwo';
import MiddleTwo from './MiddleTwo';
import RightTwo from './RightTwo';
import screenfull from 'screenfull'
import { debounce } from '@/utils/debounce'
import screenfull from 'screenfull';
import { debounce } from '@/utils/debounce';
export default {
name: 'wholePlantBoard',
@ -49,7 +61,7 @@ export default {
KHeader,
LeftTwo,
MiddleTwo,
RightTwo
RightTwo,
},
// provide() {
// return {
@ -59,80 +71,77 @@ export default {
data() {
return {
isFullScreen: false,
scaleNum: 0.8
scaleNum: 0.8,
};
},
created() {
this.init()
this.init();
},
destroy() {
this.destroy()
this.destroy();
},
mounted() {
this.boxReset = debounce(() => {
this.resetSize()
}, 300)
this.boxReset()
window.addEventListener('resize', () => {
this.boxReset()
})
console.log('mounted...........')
this.boxReset();
window.addEventListener('resize', this.boxReset);
},
destroyed() {
console.log('destroyed...........')
window.removeEventListener('resize', this.boxReset);
},
methods: {
boxReset() {
debounce(() => {
this.resetSize();
}, 300)();
},
change() {
this.isFullScreen = screenfull.isFullscreen
},
init() {
if (screenfull.isEnabled) {
screenfull.on('change', this.change)
}
},
destroy() {
if (screenfull.isEnabled) {
screenfull.off('change', this.change)
}
},
this.isFullScreen = screenfull.isFullscreen;
},
init() {
if (screenfull.isEnabled) {
screenfull.on('change', this.change);
}
},
destroy() {
if (screenfull.isEnabled) {
screenfull.off('change', this.change);
}
},
//
screenfullChange() {
if (!screenfull.isEnabled) {
this.$message({
message: 'you browser can not work',
type: 'warning'
})
return false
}
screenfull.toggle(this.$refs.wholePlantContainerB)
},
if (!screenfull.isEnabled) {
this.$message({
message: 'you browser can not work',
type: 'warning',
});
return false;
}
screenfull.toggle(this.$refs.wholePlantContainerB);
},
resetSize() {
let wholePlantContainerBox = document.getElementById('wholePlantContainer')
let rw = parseFloat(window.innerWidth)
let rh = parseFloat(window.innerHeight)
let bw = parseFloat(wholePlantContainerBox.style.width)
let bh = parseFloat(wholePlantContainerBox.style.height)
let wx = 0
let hx = 0
let wholePlantContainerBox = document.getElementById(
'wholePlantContainer'
);
let rw = parseFloat(window.innerWidth);
let rh = parseFloat(window.innerHeight);
let bw = parseFloat(wholePlantContainerBox.style.width);
let bh = parseFloat(wholePlantContainerBox.style.height);
let wx = 0;
let hx = 0;
if (screenfull.isFullscreen) {
console.log('全屏')
wx = rw / bw
hx = rh / bh
console.log(this.scaleNum)
}else{
console.log('非全屏')
console.log(this.$store.state.app.sidebar.opened)
wx = rw / bw;
hx = rh / bh;
} else {
if (this.$store.state.app.sidebar.opened) {
wx = (rw-280) / bw
hx = (rh-116) / bh
}else{
wx = (rw-85) / bw
hx = (rh-116) / bh
wx = (rw - 280) / bw;
hx = (rh - 116) / bh;
} else {
wx = (rw - 85) / bw;
hx = (rh - 116) / bh;
}
}
this.scaleNum = wx
}
}
this.scaleNum = wx;
},
},
};
</script>

View File

@ -76,10 +76,6 @@ export default {
name: this.chartData[i].objName + this.chartData[i].objCode,
type: 'bar',
barMaxWidth: 20,
label: {
show: true,
position: 'top',
},
data: [],
};
legendData.push(this.chartData[i].objName + this.chartData[i].objCode);

View File

@ -1,8 +1,7 @@
<template>
<div
class="searchBarBox divHeight"
ref="searchBarRef"
:style="{ paddingRight: isFold ? '55px' : '0px' }">
ref="searchBarRef">
<el-form
:inline="true"
class="demo-form-inline">
@ -200,13 +199,6 @@
</el-button>
</el-form-item>
</el-form>
<span
v-if="isFold"
class="foldClass"
@click="switchMode">
{{ isExpand ? '收起' : '展开' }}
<svg-icon :icon-class="isExpand ? 'upward' : 'downward'" />
</span>
</div>
</template>
<script>
@ -217,16 +209,8 @@ import { getFactoryList } from '@/api/core/base/factory';
import moment from 'moment';
export default {
name: 'searchArea',
props: {
isFold: {
//
type: Boolean,
default: false,
},
},
data() {
return {
isExpand: false, //
//
queryParams: {
energyTypeId: null,
@ -525,16 +509,6 @@ export default {
let value = new Date(newData).getTime();
return value;
},
switchMode() {
//
this.isExpand = !this.isExpand;
const element = this.$refs.searchBarRef;
if (this.isExpand) {
element.classList.remove('divHeight');
} else {
element.classList.add('divHeight');
}
},
},
};
</script>
@ -573,21 +547,6 @@ export default {
margin-bottom: 4px;
}
}
.searchBarBox .foldClass {
position: absolute;
top: 14px;
right: 0;
cursor: pointer;
font-size: 12px;
color: #0b58ff;
}
.searchBarBox .foldClass .iconfont {
font-size: 14px;
}
.divHeight {
height: 45px;
overflow: hidden;
}
.separateStyle {
display: inline-block;
width: 1px;

View File

@ -4,7 +4,6 @@
id="contrastAnalysisBox">
<!-- 搜索工作栏 -->
<search-area
:isFold="isFold"
@submit="getList"
@export="exportExl" />
<div v-show="chartData.length">
@ -38,7 +37,6 @@ export default {
mixins: [tableHeightMixin],
data() {
return {
isFold: false,
chartData: [],
timeDim: '',
tableProps: [],
@ -46,13 +44,6 @@ export default {
tableH: this.tableHeight(250) / 2,
};
},
mounted() {
window.addEventListener('resize', () => {
this.isFold = this.searchBarWidth('contrastAnalysisBox', 1437);
// console.log(document.getElementById("contrastAnalysisBox").offsetWidth)
});
this.isFold = this.searchBarWidth('contrastAnalysisBox', 1437);
},
methods: {
_setTableHeight() {
this.tableH = this.tableHeight(250) / 2;

View File

@ -68,9 +68,9 @@ export default {
var option = {
color: ['#288AFF'],
// tooltip: {
// trigger: 'axis'
// },
tooltip: {
trigger: 'axis',
},
grid: {
left: '4%',
right: '1%',

View File

@ -1,8 +1,7 @@
<template>
<div
class="searchBarBox divHeight"
ref="searchBarRef"
:style="{ paddingRight: isFold ? '55px' : '0px' }">
class="searchBarBox"
ref="searchBarRef">
<el-form
:inline="true"
class="demo-form-inline">
@ -172,9 +171,9 @@
</el-button>
<span
class="separateStyle"
v-hasPermi="['analysis:trend-analysis:export']"></span>
v-hasPermi="['analysis:energy-analysis:query']"></span>
<el-button
v-hasPermi="['analysis:trend-analysis:export']"
v-hasPermi="['analysis:energy-analysis:query']"
type="primary"
size="small"
plain
@ -183,13 +182,6 @@
</el-button>
</el-form-item>
</el-form>
<span
v-if="isFold"
class="foldClass"
@click="switchMode">
{{ isExpand ? '收起' : '展开' }}
<svg-icon :icon-class="isExpand ? 'upward' : 'downward'" />
</span>
</div>
</template>
<script>
@ -198,16 +190,8 @@ import { getEnergyTypeListAll } from '@/api/base/energyType';
import moment from 'moment';
export default {
name: 'searchArea',
props: {
isFold: {
//
type: Boolean,
default: false,
},
},
data() {
return {
isExpand: false, //
//
queryParams: {
energyTypeId: null,
@ -509,16 +493,6 @@ export default {
let value = new Date(newData).getTime();
return value;
},
switchMode() {
//
this.isExpand = !this.isExpand;
const element = this.$refs.searchBarRef;
if (this.isExpand) {
element.classList.remove('divHeight');
} else {
element.classList.add('divHeight');
}
},
},
};
</script>
@ -557,21 +531,6 @@ export default {
margin-bottom: 4px;
}
}
.searchBarBox .foldClass {
position: absolute;
top: 14px;
right: 0;
cursor: pointer;
font-size: 12px;
color: #0b58ff;
}
.searchBarBox .foldClass .iconfont {
font-size: 14px;
}
.divHeight {
height: 45px;
overflow: hidden;
}
.separateStyle {
display: inline-block;
width: 1px;

View File

@ -4,7 +4,6 @@
id="trendAnalysisBox">
<!-- 搜索工作栏 -->
<search-area
:isFold="isFold"
@submit="getList"
@export="exportExl" />
<div v-show="chartData.length">
@ -33,20 +32,12 @@ export default {
components: { SearchArea, LineChart },
data() {
return {
isFold: false,
chartData: [],
timeDim: '',
tableProps: [],
list: [],
};
},
mounted() {
window.addEventListener('resize', () => {
this.tableH = this.tableHeight(260);
this.isFold = this.searchBarWidth('trendAnalysisBox', 1480);
});
this.isFold = this.searchBarWidth('trendAnalysisBox', 1480);
},
methods: {
getList(params) {
this.timeDim = params.timeDim;
@ -66,8 +57,10 @@ export default {
let listObj = { useNum: '消耗量' }; //
for (let i = 0; i < arr.length; i++) {
let obj = {};
let fName = arr[i].time.slice(0, 4);
let lName = arr[i].time.slice(4, 6);
obj.prop = arr[i].time;
obj.label = arr[i].time;
obj.label = fName + ' 第 ' + lName + ' 周';
obj.minWidth = 100;
tempX.push(obj);
listObj[arr[i].time] = arr[i].useNum || null;

View File

@ -89,13 +89,13 @@ export default {
param: 'name',
},
{
type: 'button',
type: this.$auth.hasPermi('base:energy-plc:query') ? 'button' : '',
btnName: '查询',
name: 'search',
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermi('base:energy-plc:create') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:energy-plc:create') ? 'button' : '',

View File

@ -22,7 +22,9 @@
readonly
style="width: 250px"></el-input>
</el-form-item>
<el-form-item v-if="showBtn">
<el-form-item
v-if="showBtn"
v-hasPermi="['base:energy-plc-param:create']">
<el-button
type="success"
size="small"
@ -160,15 +162,19 @@ export default {
this.drawerTitle = '参数绑定';
this.showBtn = true;
this.tableBtn = [
{
type: 'edit',
btnName: '编辑',
},
{
type: 'delete',
btnName: '删除',
},
];
this.$auth.hasPermi('base:energy-plc-param:update')
? {
type: 'edit',
btnName: '编辑',
}
: undefined,
this.$auth.hasPermi('base:energy-plc-param:delete')
? {
type: 'delete',
btnName: '删除',
}
: undefined,
].filter((v) => v);
}
},
getList() {

View File

@ -107,13 +107,17 @@ export default {
param: 'cnName',
},
{
type: 'button',
type: this.$auth.hasPermi('base:energy-plc-connect:query')
? 'button'
: '',
btnName: '查询',
name: 'search',
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermi('base:energy-plc-connect:create')
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('base:energy-plc-connect:create')
@ -127,17 +131,25 @@ export default {
],
tableProps,
tableBtn: [
this.$auth.hasPermi('base:energy-plc-connect:bind')
this.$auth.hasPermiAnd([
'base:energy-plc-param:query',
'base:energy-type:query',
])
? {
type: 'connect',
btnName: '绑定',
}
: undefined,
{
type: 'detail',
btnName: '详情',
},
this.$auth.hasPermi('base:energy-plc-connect:update')
this.$auth.hasPermi('base:energy-plc-param:query')
? {
type: 'detail',
btnName: '详情',
}
: undefined,
this.$auth.hasPermiAnd([
'base:energy-plc-connect:update',
'base:energy-plc-connect:query',
])
? {
type: 'edit',
btnName: '编辑',

View File

@ -45,6 +45,7 @@
</el-table-column>
</el-table>
<el-button
v-show="!isEdit"
class="addButton"
icon="el-icon-plus"
@click="emitButtonClick">
@ -70,6 +71,13 @@ export default {
return [];
},
},
isEdit: {
type: Boolean,
required: true,
default: () => {
return false;
},
},
},
data() {
return {};

View File

@ -42,6 +42,7 @@
<add-table
:table-data="tableData"
:table-name-list="tableNameList"
:isEdit="isEdit"
@emitFun="inputChange"
@emitButtonClick="emitButtonClick" />
</el-col>

View File

@ -114,13 +114,20 @@ export default {
defaultSelect: [],
},
{
type: 'button',
type: this.$auth.hasPermi('base:energy-quantity-manual:query')
? 'button'
: '',
btnName: '查询',
name: 'search',
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermiOr([
'base:energy-quantity-manual:export',
'base:energy-quantity-manual:create',
])
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('base:energy-quantity-manual:export')
@ -147,13 +154,19 @@ export default {
//
list: [],
tableBtn: [
this.$auth.hasPermi('base:energy-quantity-manual:create')
this.$auth.hasPermiAnd([
'base:energy-quantity-manual:query',
'base:energy-quantity-manual:create',
])
? {
type: 'meterReading',
btnName: '抄表',
}
: undefined,
this.$auth.hasPermi('base:energy-quantity-manual:update')
this.$auth.hasPermiAnd([
'base:energy-quantity-manual:update',
'base:energy-quantity-manual:query',
])
? {
type: 'edit',
btnName: '编辑',

View File

@ -90,7 +90,9 @@ export default {
width: 350,
},
{
type: 'button',
type: this.$auth.hasPermi('base:energy-quantity-realtime:query')
? 'button'
: '',
btnName: '查询',
name: 'search',
color: 'primary',

View File

@ -52,7 +52,10 @@ export default {
return {
tableProps,
tableBtn: [
this.$auth.hasPermi('base:table-name-config:edit')
this.$auth.hasPermiAnd([
'base:energy-table:query',
'base:energy-table:update',
])
? {
type: 'edit',
btnName: '编辑',

View File

@ -66,7 +66,7 @@
placeholder="请选择"
style="width: 100%">
<el-option
v-for="item in getDictDatas(DICT_TYPE.TABLE_NAME)"
v-for="item in tableNameList"
:key="item.value"
:label="item.label"
:value="item.value"></el-option>
@ -154,6 +154,7 @@ import {
createEnergyLimit,
getEnergyParamList,
} from '@/api/monitoring/energyLimit';
import { energyTableGet } from '@/api/base/energyQuantityManual';
export default {
name: 'energyLimitAdd',
props: {
@ -203,6 +204,7 @@ export default {
{ required: true, message: '指标类型不能为空', trigger: 'change' },
],
},
tableNameList: [],
detailList: [],
};
},
@ -267,11 +269,22 @@ export default {
}
},
toggleType() {
if (this.form.energyTypeId && this.form.type) {
this.getDetailList();
this.form.plcParamId = '';
if (this.form.energyTypeId && this.form.method == 2) {
this.form.tableName = '';
this.getTableNameList(this.form.energyTypeId);
}
},
// list
getTableNameList(id) {
energyTableGet({ energyTypeId: id }).then((res) => {
this.tableNameList = res.data.tableObjs || [];
if (this.tableNameList.length === 0) {
this.$modal.msgWarning(
'当前能源类型暂无配置表名,请先到《表名配置》页面配置'
);
}
});
},
//
changeDetSelect(key, treeData) {
let arr = []; //

View File

@ -125,13 +125,17 @@ export default {
param: 'limitType',
},
{
type: 'button',
type: this.$auth.hasPermi('monitoring:energy-limit:query')
? 'button'
: '',
btnName: '查询',
name: 'search',
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermi('monitoring:energy-limit:create')
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('monitoring:energy-limit:create')

View File

@ -113,7 +113,9 @@ export default {
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermi('monitoring:energy-report:export')
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('monitoring:energy-report:export')

View File

@ -22,6 +22,7 @@
</el-form-item>
<el-form-item>
<el-button
v-hasPermi="['monitoring:energy-statistics-det:query']"
type="success"
size="small"
v-if="showBtn"
@ -30,6 +31,7 @@
新增
</el-button>
<el-button
v-hasPermi="['monitoring:energy-statistics-det:delete']"
type="danger"
size="small"
v-if="showBtn"
@ -161,11 +163,13 @@ export default {
this.drawerTitle = '参数绑定';
this.showBtn = true;
this.tableBtn = [
{
type: 'delete',
btnName: '删除',
},
];
this.$auth.hasPermi('monitoring:energy-statistics-det:delete')
? {
type: 'delete',
btnName: '删除',
}
: undefined,
].filter((v) => v);
}
},
getList() {

View File

@ -88,7 +88,9 @@ export default {
type: 'separate',
},
{
type: 'button',
type: this.$auth.hasPermi('monitoring:energy-statistics-det:create')
? 'button'
: '',
btnName: '关联',
name: 'add',
color: 'primary',

View File

@ -104,7 +104,9 @@ export default {
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermi('monitoring:energy-statistics:create')
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('monitoring:energy-statistics:create')
@ -118,17 +120,22 @@ export default {
],
tableProps,
tableBtn: [
this.$auth.hasPermi('monitoring:energy-statistics:bind')
this.$auth.hasPermi('monitoring:energy-statistics-det:query')
? {
type: 'connect',
btnName: '绑定',
}
: undefined,
{
type: 'detail',
btnName: '详情',
},
this.$auth.hasPermi('monitoring:energy-statistics:update')
this.$auth.hasPermi('monitoring:energy-statistics:query')
? {
type: 'detail',
btnName: '详情',
}
: undefined,
this.$auth.hasPermiAnd([
'monitoring:energy-statistics:update',
'monitoring:energy-statistics:query',
])
? {
type: 'edit',
btnName: '编辑',

View File

@ -2,7 +2,7 @@
* @Author: zwq
* @Date: 2021-11-18 14:16:25
* @LastEditors: zhp
* @LastEditTime: 2024-03-22 17:11:55
* @LastEditTime: 2024-04-11 13:35:46
* @Description:
-->
<template>
@ -62,7 +62,8 @@
<div v-if="!isdetail" class="action_btn">
<template>
<span style="display: inline-block;">
<el-button type="text" @click="addNew()" icon="el-icon-plus">新增</el-button>
<el-button v-if="this.$auth.hasPermi('extend:process-equ-material-bom-det:add')" type="text"
@click="addNew()" icon="el-icon-plus">新增</el-button>
</span>
</template>
</div>
@ -101,11 +102,15 @@ import attrAdd from './attr-add';
import { publicFormatter } from '@/utils/dict';
const tableBtn = [
{
type: 'edit',
type: this.$auth.hasPermi('extend:process-equ-material-bom-det:update')
? 'edit'
: '',
btnName: '编辑',
},
{
type: 'delete',
type: this.$auth.hasPermi('extend:process-equ-material-bom-det:delete')
? 'delete'
: '',
btnName: '删除',
},
];
@ -237,9 +242,6 @@ export default {
// console.log(response);
this.equipmentList = res.data
})
getMaterialCode().then(res => {
this.dataForm.code = res.data
})
},
handleClick(raw) {
if (raw.type === 'delete') {
@ -292,7 +294,10 @@ export default {
if (id) {
this.idAttrShow = true
} else {
this.idAttrShow = false
this.idAttrShow = false
getMaterialCode().then(res => {
this.dataForm.code = res.data
})
}
this.$nextTick(() => {

View File

@ -118,7 +118,8 @@ export default {
color: 'primary',
},
{
type: 'separate',
// type: 'separate',
type: this.$auth.hasPermi('extend:process-equ-material-bom:create') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('extend:process-equ-material-bom:create') ? 'button' : '',

View File

@ -2,7 +2,7 @@
* @Author: zwq
* @Date: 2021-11-18 14:16:25
* @LastEditors: zhp
* @LastEditTime: 2024-03-25 14:07:31
* @LastEditTime: 2024-04-11 13:35:42
* @Description:
-->
<template>
@ -72,7 +72,8 @@
<div v-if="!isdetail" class="action_btn">
<template>
<span style="display: inline-block;">
<el-button type="text" @click="addNew()" icon="el-icon-plus">新增</el-button>
<el-button v-if="this.$auth.hasPermi('extend:process-equ-value-bom-det:add')" type="text"
@click="addNew()" icon="el-icon-plus">新增</el-button>
</span>
</template>
</div>
@ -111,11 +112,15 @@ import attrAdd from './attr-add';
const tableBtn = [
{
type: 'edit',
type: this.$auth.hasPermi('extend:process-equ-value-bom-det:update')
? 'edit'
: '',
btnName: '编辑',
},
{
type: 'delete',
type: this.$auth.hasPermi('extend:process-equ-value-bom-det:delete')
? 'delete'
: '',
btnName: '删除',
},
];
@ -156,7 +161,9 @@ const tableProps = [
const topBtnConfig = [
{
type: 'add',
type: this.$auth.hasPermi('extend:process-equ-value-bom-det:add')
? 'add'
: '',
btnName: 'btn.add'
}
]
@ -246,9 +253,7 @@ export default {
// console.log(response);
this.equipmentList = res.data
})
getValueCode().then(res => {
this.dataForm.code = res.data
})
},
handleClick(raw) {
if (raw.type === 'delete') {
@ -325,7 +330,10 @@ export default {
if (id) {
this.idAttrShow = true
} else {
this.idAttrShow = false
this.idAttrShow = false
getValueCode().then(res => {
this.dataForm.code = res.data
})
}
this.$nextTick(() => {

View File

@ -119,7 +119,8 @@ export default {
color: 'primary',
},
{
type: 'separate',
// type: 'separate',
type: this.$auth.hasPermi('extend:process-equ-value-bom:create') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('extend:process-equ-value-bom:create') ? 'button' : '',

View File

@ -1,46 +1,52 @@
<template>
<el-switch v-model="state" type="text" size="small" :disabled="readonly" @change="changeHandler" />
<el-switch
v-hasPermi="['base:group-team:edit-worker']"
v-model="state"
type="text"
size="small"
:disabled="readonly"
@change="changeHandler" />
</template>
<script>
export default {
props: {
injectData: {
type: Object,
default: () => ({})
}
},
data() {
return {
state: false
}
},
computed: {
readonly() {
return !!this.injectData.readonly
}
},
mounted() {
this.mapToState()
},
methods: {
mapToState() {
if (this.injectData.prop === 'enabled') {
this.state = this.injectData.enabled === 1 ? true : false
}
},
changeHandler() {
let params = {}
let payload = {}
params.name = 'state'
payload.id = this.injectData.id
payload.enabled = this.state ? '1' : '0'
payload.code = this.injectData.code
payload.name = this.injectData.name
payload.leaderId = this.injectData.leaderId
params.payload = payload
this.$emit('emitData', params)
}
}
}
props: {
injectData: {
type: Object,
default: () => ({}),
},
},
data() {
return {
state: false,
};
},
computed: {
readonly() {
return !!this.injectData.readonly;
},
},
mounted() {
this.mapToState();
},
methods: {
mapToState() {
if (this.injectData.prop === 'enabled') {
this.state = this.injectData.enabled === 1 ? true : false;
}
},
changeHandler() {
let params = {};
let payload = {};
params.name = 'state';
payload.id = this.injectData.id;
payload.enabled = this.state ? '1' : '0';
payload.code = this.injectData.code;
payload.name = this.injectData.name;
payload.leaderId = this.injectData.leaderId;
params.payload = payload;
this.$emit('emitData', params);
},
},
};
</script>

View File

@ -1,41 +1,51 @@
<template>
<div class="workerOperate">
<div class="operateBtn">
<span class="view" v-if="this.$auth.hasPermi('base:group-team:view-worker')" @click="emitParams('view')">查看</span>
<span class="edit" v-if="this.$auth.hasPermi('base:group-team:edit-worker')" @click="emitParams('edit')">编辑</span>
</div>
</div>
<div class="workerOperate">
<div class="operateBtn">
<span
class="view"
v-hasPermi="['base:group-team:view-worker']"
@click="emitParams('view')">
查看
</span>
<span
class="edit"
v-hasPermi="['base:group-team:edit-worker']"
@click="emitParams('edit')">
编辑
</span>
</div>
</div>
</template>
<script>
export default {
name: 'WorkerOperate',
props: {
injectData: {
type: Object,
default: () => ({})
}
},
methods: {
emitParams(data) {
let params = {}
params.name = data
params.payload = this.injectData
this.$emit('emitData', params)
}
}
}
name: 'WorkerOperate',
props: {
injectData: {
type: Object,
default: () => ({}),
},
},
methods: {
emitParams(data) {
let params = {};
params.name = data;
params.payload = this.injectData;
this.$emit('emitData', params);
},
},
};
</script>
<style lang='scss' scoped>
.workerOperate {
.operateBtn{
color: #0B58FF;
.view {
margin-right: 10px;
cursor: pointer;
}
.edit {
cursor: pointer;
}
}
.operateBtn {
color: #0b58ff;
.view {
margin-right: 10px;
cursor: pointer;
}
.edit {
cursor: pointer;
}
}
}
</style>

View File

@ -125,7 +125,7 @@ export default {
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermi('base:group-team:create') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:group-team:create') ? 'button' : '',

File diff suppressed because it is too large Load Diff

View File

@ -88,7 +88,7 @@ export default {
workOrderList: [],
workOrderName: '',
tableBtn: [
this.$auth.hasPermi('base:group-team-view:detail')
this.$auth.hasPermi('monitoring:group-team-scheduling:query')
? {
type: 'detail',
btnName: '详情',

View File

@ -97,7 +97,7 @@ export default {
},
tableProps,
tableBtn: [
this.$auth.hasPermi('base:team-production:detail')
this.$auth.hasPermi('monitoring:group-team-scheduling:query')
? {
type: 'productionDetail',
btnName: '查看',

View File

@ -173,12 +173,24 @@ export default {
color: 'primary',
},
{
type: this.$auth.hasPermi('base:order-group:create')
type: this.$auth.hasPermiAnd([
'base:order-group:create',
'base:core-product:query',
'base:core-customer:query',
'base:order:query',
])
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('base:order-group:create') ? 'button' : '',
type: this.$auth.hasPermiAnd([
'base:order-group:create',
'base:core-product:query',
'base:core-customer:query',
'base:order:query',
])
? 'button'
: '',
btnName: '新增',
name: 'add',
color: 'success',
@ -197,7 +209,10 @@ export default {
tableProps,
list: [],
tableBtn: [
this.$auth.hasPermi('base:order-group:bind')
this.$auth.hasPermiAnd([
'base:order:query',
'base:order-con-group-order:create',
])
? {
type: 'bind',
btnName: '绑定',
@ -214,7 +229,7 @@ export default {
},
}
: undefined,
this.$auth.hasPermi('base:order-group:complete')
this.$auth.hasPermi('base:order-group:update')
? {
type: 'complete',
btnName: '完成',
@ -231,7 +246,7 @@ export default {
},
}
: undefined,
this.$auth.hasPermi('base:order-group:termination')
this.$auth.hasPermi('base:order-group:update')
? {
type: 'termination',
btnName: '终止',
@ -248,7 +263,7 @@ export default {
},
}
: undefined,
this.$auth.hasPermi('base:order-group:cancel')
this.$auth.hasPermi('base:order-group:update')
? {
type: 'cancel',
btnName: '作废',
@ -265,11 +280,17 @@ export default {
},
}
: undefined,
{
type: 'detail',
btnName: '详情',
},
this.$auth.hasPermi('base:order-group:edit')
this.$auth.hasPermi('base:order-group:update')
? {
type: 'detail',
btnName: '详情',
}
: undefined,
this.$auth.hasPermiAnd([
'base:order-group:update',
'base:core-product:query',
'base:core-customer:query',
])
? {
type: 'edit',
btnName: '编辑',

View File

@ -15,7 +15,7 @@
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="290"
:width="250"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick" />
@ -169,12 +169,22 @@ export default {
color: 'primary',
},
{
type: this.$auth.hasPermi('base:order-manage:create')
type: this.$auth.hasPermiAnd([
'base:order:query',
'base:core-product:query',
'base:order:create',
])
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('base:order-manage:create') ? 'button' : '',
type: this.$auth.hasPermiAnd([
'base:order:query',
'base:core-product:query',
'base:order:create',
])
? 'button'
: '',
btnName: '新增',
name: 'add',
color: 'success',
@ -210,7 +220,14 @@ export default {
},
}
: undefined,
this.$auth.hasPermi('base:order-manage:bindWorkOrder')
this.$auth.hasPermiAnd([
'base:order:update',
'base:core-product:query',
'base:production-line:query',
'extend:process-flow:query',
'base:core-work-order:query',
'base:order:query',
])
? {
type: 'bind',
btnName: '绑定',
@ -227,7 +244,7 @@ export default {
},
}
: undefined,
this.$auth.hasPermi('base:order-manage:complete')
this.$auth.hasPermi('base:order:update')
? {
type: 'complete',
btnName: '完成',
@ -244,7 +261,7 @@ export default {
},
}
: undefined,
this.$auth.hasPermi('base:order-manage:termination')
this.$auth.hasPermi('base:order:update')
? {
type: 'termination',
btnName: '终止',
@ -261,7 +278,7 @@ export default {
},
}
: undefined,
this.$auth.hasPermi('base:order-manage:cancel')
this.$auth.hasPermi('base:order:update')
? {
type: 'cancel',
btnName: '作废',
@ -278,13 +295,20 @@ export default {
},
}
: undefined,
this.$auth.hasPermi('base:order-manage:detail')
this.$auth.hasPermiAnd([
'base:order:query',
'extend:process-flow:query',
])
? {
type: 'detail',
btnName: '详情',
}
: undefined,
this.$auth.hasPermi('base:order-manage:edit')
this.$auth.hasPermiAnd([
'base:order:query',
'base:core-product:query',
'base:order:update',
])
? {
type: 'edit',
btnName: '编辑',

View File

@ -1,168 +1,223 @@
<template>
<div>
<div class="boxTitle">
<span class="blueTitle"></span>
<span>各集团订单环形图</span>
</div>
<div class="chartBox" id='orderChartBox' v-show='chartList.length'>
<div class="chartItem" v-for="(item, index) in chartList" :key='index' :style="{width: 388*beilv+'px',height: 286*beilv+'px',padding:14*beilv+'px',marginRight:9*beilv+'px',marginBottom:9*beilv+'px'}">
<div class="topTitle" :style="{fontSize: 14 * beilv + 'px'}">
<svg-icon icon-class="order-monitoring" :style="{fontSize: 16*beilv+'px'}"/>
<span class="orderName" :style="{paddingRight:8*beilv+'px',marginRight:8*beilv+'px'}">{{item.orderGroupName}}</span>
<span>订单计划数量{{item.num}}</span>
</div>
<div
:id="item.id"
:style="{width: 166*beilv+'px',height: 166*beilv+'px',margin: 'auto'}"
></div>
<div class="legend" :style="{height: 54 * beilv + 'px', marginTop: 10*beilv+'px'}">
<div class="legendItem" v-for="(subItem, i) in item.order" :key='i' :style="{paddingRight:9*beilv+'px',marginRight:9*beilv+'px'}">
<span class="itemNum" :style="{fontSize: 18 * beilv + 'px'}">{{subItem.value}}</span>
<div>
<span class="itemName" :style="{fontSize: 14 * beilv + 'px'}">
<span class="smallBlock" :style="{backgroundColor:subItem.color,width:8*beilv+'px',height:8*beilv+'px'}"></span>
{{subItem.name}}
</span>
</div>
</div>
</div>
</div>
</div>
<!-- 空图 -->
<div class="no-data-bg" v-show='!chartList.length'></div>
</div>
<div>
<div class="boxTitle">
<span class="blueTitle"></span>
<span>各集团订单环形图</span>
</div>
<div
class="chartBox"
id="orderChartBox"
v-show="chartList.length">
<div
class="chartItem"
v-for="(item, index) in chartList"
:key="index"
:style="{
width: 388 * beilv + 'px',
height: 286 * beilv + 'px',
padding: 14 * beilv + 'px',
marginRight: 9 * beilv + 'px',
marginBottom: 9 * beilv + 'px',
}">
<div
class="topTitle"
:style="{ fontSize: 14 * beilv + 'px' }">
<svg-icon
icon-class="order-monitoring"
:style="{ fontSize: 16 * beilv + 'px' }" />
<span
class="orderName"
:style="{
paddingRight: 8 * beilv + 'px',
marginRight: 8 * beilv + 'px',
}">
{{ item.orderGroupName }}
</span>
<span>订单计划数量{{ item.num }}</span>
</div>
<div
:id="item.id"
:style="{
width: 166 * beilv + 'px',
height: 166 * beilv + 'px',
margin: 'auto',
}"></div>
<div
class="legend"
:style="{ height: 54 * beilv + 'px', marginTop: 10 * beilv + 'px' }">
<div
class="legendItem"
v-for="(subItem, i) in item.order"
:key="i"
:style="{
paddingRight: 9 * beilv + 'px',
marginRight: 9 * beilv + 'px',
}">
<span
class="itemNum"
:style="{ fontSize: 18 * beilv + 'px' }">
{{ subItem.value }}
</span>
<div>
<span
class="itemName"
:style="{ fontSize: 14 * beilv + 'px' }">
<span
class="smallBlock"
:style="{
backgroundColor: subItem.color,
width: 8 * beilv + 'px',
height: 8 * beilv + 'px',
}"></span>
{{ subItem.name }}
</span>
</div>
</div>
</div>
</div>
</div>
<!-- 空图 -->
<div
class="no-data-bg"
v-show="!chartList.length"></div>
</div>
</template>
<script>
import * as echarts from 'echarts'
import { debounce } from '@/utils/debounce'
import * as echarts from 'echarts';
import { debounce } from '@/utils/debounce';
export default {
name: 'MonitoringRingCharts',
props: {
chartList: {
type: Array,
default: () => {
return []
}
}
},
data() {
return {
myChart: [],
beilv: 1,
canvasReset: ''
}
},
mounted() {
this.beilv = document.getElementById('orderChartBox').offsetWidth / 1610
this.canvasReset = debounce(() => {
this.initChart()
}, 500)
window.addEventListener('resize', () => {
this.beilv = document.getElementById('orderChartBox').offsetWidth / 1610
this.canvasReset()
})
},
methods: {
//
initChart() {
if (this.chartList.length <= 0) {
return false
}
//
for (let j = 0;j < this.chartList.length; j++) {
if (this.myChart[j]) {
this.myChart[j].dispose() // Dom
}
}
for (let i = 0; i < this.chartList.length; i++) {
var chartDom = document.getElementById(this.chartList[i].id);
this.myChart[i] = echarts.init(chartDom);
let colorList = []
this.chartList[i].order.map(item => {
colorList.push(item.color)
})
let percentage = (this.chartList[i].sunNum/this.chartList[i].num*100).toFixed(0)
var option = {
color: colorList,
series: [
{
name: 'Access From',
type: 'pie',
radius: ['75%', '95%'],
avoidLabelOverlap: false,
itemStyle: {
borderRadius: 5,
borderColor: '#fff',
borderWidth: 2
},
label: {
show: true,
position: 'center',
color: '#000',
formatter: [
'{a|'+percentage+'%}',
'{b|生产'+this.chartList[i].sunNum+'}'
].join('\n\n'),
rich: {
a: {
fontSize: this.beilv*24 +'px'
},
b: {
fontSize: this.beilv*12 +'px'
}
}
},
emphasis: {
disabled: true
},
labelLine: {
show: false
},
data: this.chartList[i].order
}
]
};
option && this.myChart[i].setOption(option)
}
}
}
}
name: 'MonitoringRingCharts',
props: {
chartList: {
type: Array,
default: () => {
return [];
},
},
},
data() {
return {
myChart: [],
beilv: 1,
};
},
mounted() {
this.canvasReset();
window.addEventListener('resize', this.canvasReset);
},
destroyed() {
window.removeEventListener('resize', this.canvasReset);
},
methods: {
canvasReset() {
debounce(() => {
this.initChart();
}, 500)();
this.beilv = document.getElementById('orderChartBox').offsetWidth / 1610;
},
//
initChart() {
if (this.chartList.length <= 0) {
return false;
}
//
for (let j = 0; j < this.chartList.length; j++) {
if (this.myChart[j]) {
this.myChart[j].dispose(); // Dom
}
}
for (let i = 0; i < this.chartList.length; i++) {
var chartDom = document.getElementById(this.chartList[i].id);
this.myChart[i] = echarts.init(chartDom);
let colorList = [];
this.chartList[i].order.map((item) => {
colorList.push(item.color);
});
let percentage = (
(this.chartList[i].sunNum / this.chartList[i].num) *
100
).toFixed(0);
var option = {
color: colorList,
series: [
{
name: 'Access From',
type: 'pie',
radius: ['75%', '95%'],
avoidLabelOverlap: false,
itemStyle: {
borderRadius: 5,
borderColor: '#fff',
borderWidth: 2,
},
label: {
show: true,
position: 'center',
color: '#000',
formatter: [
'{a|' + percentage + '%}',
'{b|生产' + this.chartList[i].sunNum + '}',
].join('\n\n'),
rich: {
a: {
fontSize: this.beilv * 24 + 'px',
},
b: {
fontSize: this.beilv * 12 + 'px',
},
},
},
emphasis: {
disabled: true,
},
labelLine: {
show: false,
},
data: this.chartList[i].order,
},
],
};
option && this.myChart[i].setOption(option);
}
},
},
};
</script>
<style lang='scss' scoped>
.chartBox {
width: 100%;
padding-right: 6px;
height: calc(100vh - 356px);
display: flex;
flex-flow: row wrap;
overflow: auto;
align-content: flex-start;
.chartItem {
border-radius: 8px;
border: 1px solid #CACACA;
.topTitle {
margin-bottom: 10px;
.orderName {
border-right: 1px solid #CACACA;
}
}
.legend {
text-align: center;
white-space: nowrap;
overflow: auto;
.legendItem {
display: inline-block;
border-right: 1px solid #E8E8E8;
.itemName {
.smallBlock {
display: inline-block;
}
}
}
.legendItem:last-child {
border: none;
}
}
}
width: 100%;
padding-right: 6px;
height: calc(100vh - 356px);
display: flex;
flex-flow: row wrap;
overflow: auto;
align-content: flex-start;
.chartItem {
border-radius: 8px;
border: 1px solid #cacaca;
.topTitle {
margin-bottom: 10px;
.orderName {
border-right: 1px solid #cacaca;
}
}
.legend {
text-align: center;
white-space: nowrap;
overflow: auto;
.legendItem {
display: inline-block;
border-right: 1px solid #e8e8e8;
.itemName {
.smallBlock {
display: inline-block;
}
}
}
.legendItem:last-child {
border: none;
}
}
}
}
</style>

View File

@ -181,7 +181,10 @@ export default {
list: [],
total: 0,
tableBtn: [
this.$auth.hasPermi('base:order-completion-monitoring:orderDet')
this.$auth.hasPermiAnd([
'base:order:query',
'extend:process-flow:query',
])
? {
type: 'orderDetail',
btnName: '详情',
@ -198,7 +201,11 @@ export default {
},
}
: undefined,
this.$auth.hasPermi('base:order-completion-monitoring:qualityDet')
this.$auth.hasPermiAnd([
'base:quality-inspection-record:query',
'base:core-product:query',
'base:core-work-order:query',
])
? {
type: 'qualityDetail',
btnName: '质量',

View File

@ -62,7 +62,9 @@ export default {
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermi('base:quality-inspection-box-btn:create')
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('base:quality-inspection-box-btn:create')

View File

@ -66,7 +66,7 @@ export default {
param: 'nickName',
},
{
type: this.$auth.hasPermi('base:quality-inspection-box-permissions:query')
type: this.$auth.hasPermi('base:quality-inspection-box-btn-auth:query')
? 'button'
: '',
btnName: '查询',
@ -74,10 +74,12 @@ export default {
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermi('base:quality-inspection-box-btn-auth:create')
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('base:quality-inspection-box-permissions:create')
type: this.$auth.hasPermi('base:quality-inspection-box-btn-auth:create')
? 'button'
: '',
btnName: '新增',
@ -87,13 +89,13 @@ export default {
},
],
tableBtn: [
this.$auth.hasPermi('base:quality-inspection-box-permissions:update')
this.$auth.hasPermi('base:quality-inspection-box-btn-auth:update')
? {
type: 'edit',
btnName: '修改',
}
: undefined,
this.$auth.hasPermi('base:quality-inspection-box-permissions:delete')
this.$auth.hasPermi('base:quality-inspection-box-btn-auth:delete')
? {
type: 'delete',
btnName: '删除',

View File

@ -1,7 +1,7 @@
<!--
* @Author: zhp
* @Date: 2023-12-08 13:46:17
* @LastEditTime: 2024-03-25 08:50:25
* @LastEditTime: 2024-04-11 15:25:51
* @LastEditors: zhp
* @Description:
-->
@ -73,31 +73,45 @@
</el-form-item>
</el-row>
<el-row :gutter="24" v-for="(item,index) in ingredientList" :key="item.id">
<el-col :span="6">
<el-col :span="4">
<el-form-item label="成分">
{{ item.name }}
{{ item.checkName }}
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item :prop="'checkValueList.' + index + '.checkValue'" label="成分含量"
<el-form-item :prop="'checkValueList.' + index + '.minCheckValue'" label="最小检测值"
:rules="[{ required: true, message: '成分含量不能为空', trigger: 'blur' }]">
<el-input oninput="value=value.replace(/[^\d]/g,'')" :disabled="isdetail"
style="width: 90%;margin-right: 10px;" :max="item.maxValue" :min='item.minValue'
v-model.number="dataForm.checkValueList[index].checkValue"
@change="judgeValue(arguments[0],item.minValue,item.maxValue,index)"></el-input>
v-model.number="dataForm.checkValueList[index].minCheckValue"
@change="judgeMinValue(arguments[0],item.minValue,item.maxValue,index)"></el-input>
<span v-if="dataForm.checkValueList[index].showIcon">
<!-- <i class="el-icon-success"></i> -->
<svg-icon v-if="dataForm.checkValueList[index].isStandard" icon-class="standards" />
<svg-icon v-if="dataForm.checkValueList[index].isMinStandard" icon-class="standards" />
<svg-icon v-else icon-class="noStandards" />
</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item :prop="'checkValueList.' + index + '.maxCheckValue'" label="最大检测值"
:rules="[{ required: true, message: '成分含量不能为空', trigger: 'blur' }]">
<el-input oninput="value=value.replace(/[^\d]/g,'')" :disabled="isdetail"
style="width: 90%;margin-right: 10px;" :max="item.maxValue" :min='item.minValue'
v-model.number="dataForm.checkValueList[index].maxCheckValue"
@change="judgeMaxValue(arguments[0],item.minValue,item.maxValue,index)"></el-input>
<span v-if="dataForm.checkValueList[index].showIcon">
<!-- <i class="el-icon-success"></i> -->
<svg-icon v-if="dataForm.checkValueList[index].isMaxStandard" icon-class="standards" />
<svg-icon v-else icon-class="noStandards" />
</span>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item :prop="'checkValueList.' + index + '.minValue'" label="最小值">
<el-input disabled style="width: 90%;margin-right: 10px;" v-model="item.minValue"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-col :span="4">
<el-form-item :prop="'checkValueList.' + index + '.minValue'" label="最大值">
<el-input disabled style="width: 90%;margin-right: 10px;" v-model="item.maxValue"></el-input>
</el-form-item>
@ -260,14 +274,25 @@ export default {
onInput() {
this.$forceUpdate();
},
judgeValue(val, minValue, maxValue, index) {
judgeMinValue(val, minValue, maxValue, index) {
// console.log(cal);
if (val >= minValue && val <= maxValue) {
console.log(val)
this.dataForm.checkValueList[index].showIcon = true
this.dataForm.checkValueList[index].isStandard = true
this.dataForm.checkValueList[index].isMinStandard = true
} else {
this.dataForm.checkValueList[index].showIcon = true
this.dataForm.checkValueList[index].isStandard = false
this.dataForm.checkValueList[index].isMinStandard = false
}
},
judgeMaxValue(val, minValue, maxValue, index) {
if (val >= minValue && val <= maxValue) {
console.log(val)
this.dataForm.checkValueList[index].showIcon = true
this.dataForm.checkValueList[index].isMaxStandard = true
} else {
this.dataForm.checkValueList[index].showIcon = true
this.dataForm.checkValueList[index].isMaxStandard = false
}
},
handleClose() {
@ -290,7 +315,7 @@ export default {
checkerId: this.dataForm.checkerId,
checkTime: this.dataForm.checkTime,
appearance: this.dataForm.appearance,
checkResult: this.dataForm.checkResult,
// checkResult: this.dataForm.checkResult,
materialGrade: this.dataForm.materialGrade,
// checkValueList: [],
checkResult: this.dataForm.checkResult,
@ -304,7 +329,9 @@ export default {
mainId: this.dataForm.id,
id:ele.id,
checkDetId: ele.checkDetId,
checkValue: ele.checkValue
minCheckValue: ele.minCheckValue,
maxCheckValue: ele.maxCheckValue
}))
})
Promise.all(array).then(res => {
@ -333,7 +360,7 @@ export default {
checkResult: this.dataForm.checkResult,
materialGrade: this.dataForm.materialGrade,
// checkValueList: [],
checkResult: this.dataForm.checkResult,
// checkResult: this.dataForm.checkResult,
materialGrade: this.dataForm.materialGrade,
remark:this.dataForm.remark
}
@ -341,11 +368,15 @@ export default {
// this.idAttrShow = true;
let array = []
this.dataForm.checkValueList.forEach(ele => {
array.push(this.createDet({
mainId: response.data,
checkDetId: ele.checkDetId,
checkValue: ele.checkValue
}))
array.push(this.createDet([
{
mainId: response.data,
checkDetId: ele.checkDetId,
minCheckValue: ele.minCheckValue,
maxCheckValue: ele.maxCheckValue
}
]))
})
Promise.all(array).then(res => {
this.$modal.msgSuccess("新增成功");
@ -376,14 +407,17 @@ export default {
getMaterialCheckList({
materialId:val
}).then((res) => {
console.log('aaaaaaaa', res.data);
this.ingredientList = res.data
this.ingredientFlag = true
this.dataForm.checkValueList = res.data.map((ele) => {
return {
mainId: null,
checkDetId: ele.id,
checkValue: null,
isStandard: true,
checkDetId: ele.checkDetId,
minCheckValue:undefined,
maxCheckValue: undefined,
isMinStandard: true,
isMaxStandard: true,
showIcon:false,
}
})
@ -477,28 +511,31 @@ export default {
this.urlOptions.infoURL(id).then(response => {
this.dataForm = response.data
getMaterialCheckList({
materialId: response.data.materialId
materialId: response.data.materialId,
mainId:id,
}).then((res) => {
console.log(res.data);
let arr = res.data
valueList = arr.map((ele) => {
// console.log(ele)
return {
checkDetId:ele.id,
checkDetId: ele.checkDetId,
maxValue: ele.maxValue,
minValue: ele.minValue
}
})
console.log(valueList);
getQualityHotMaterialDetList({
mainId: response.data.id
mainId: response.data.id,
materialId: response.data.materialId,
}).then((result) => {
this.ingredientList = result.data.map((ele) => {
return {
name: ele.checkName,
checkName: ele.checkName,
id: ele.id,
checkDetId: ele.checkDetId,
checkValue: ele.checkValue,
minCheckValue: ele.minCheckValue,
maxCheckValue: ele.maxCheckValue,
maxValue:null,
minValue: null
}
@ -509,8 +546,10 @@ export default {
mainId: ele.mainId,
id: ele.id,
checkDetId: ele.checkDetId,
checkValue: ele.checkValue,
isStandard: true,
minCheckValue: ele.minCheckValue,
maxCheckValue: ele.maxCheckValue,
isMinStandard: true,
isMaxStandard: true,
showIcon: false,
}
})
@ -524,13 +563,21 @@ export default {
})
valueList.forEach((ele, index) => {
this.dataForm.checkValueList.forEach((item, i) => {
if (ele.checkDetId == item.checkDetId && item.checkValue >= ele.minValue && item.checkValue <= ele.maxValue) {
if (ele.checkDetId == item.checkDetId && item.minCheckValue >= ele.minValue && item.minCheckValue <= ele.maxValue) {
console.log(1111)
item.showIcon = true
item.isStandard = true
item.isMinStandard = true
} else {
item.showIcon = true
item.isStandard = false
item.isMinStandard = false
}
if (ele.checkDetId == item.checkDetId && item.maxCheckValue >= ele.minValue && item.maxCheckValue <= ele.maxValue) {
console.log(1111)
item.showIcon = true
item.isMaxStandard = true
} else {
item.showIcon = true
item.isMaxStandard = false
}
})
})

View File

@ -140,8 +140,9 @@ export default {
name: 'search',
color: 'primary',
},
{
type: 'separate',
{
type: this.$auth.hasPermi('base:quality-hot-material:create') ? 'separate' : '',
// type: 'separate',
},
{
type: this.$auth.hasPermi('base:quality-hot-material:create') ? 'button' : '',

View File

@ -105,7 +105,10 @@ export default {
// name: 'reset',
// },
{
type: 'separate',
// type: 'separate',
type: this.$auth.hasPermi('base:quality-inspection-det:create')
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('base:quality-inspection-det:create')

View File

@ -146,8 +146,11 @@ export default {
// btnName: '',
// name: 'reset',
// },
{
type: 'separate',
{
type: this.$auth.hasPermi('base:quality-inspection-type:create')
? 'separate'
: '',
// type: 'separate',
},
{
type: this.$auth.hasPermi('base:quality-inspection-type:create')

View File

@ -97,8 +97,9 @@ export default {
name: 'search',
color: 'primary',
},
{
type: 'separate',
{
type: this.$auth.hasPermi('base:quality-scrap-det:create') ? 'separate' : '',
// type: 'separate',
},
{
type: this.$auth.hasPermi('base:quality-scrap-det:create') ? 'button' : '',

View File

@ -1,7 +1,7 @@
<!--
* @Author: zhp
* @Date: 2023-11-06 15:15:30
* @LastEditTime: 2024-03-22 17:13:16
* @LastEditTime: 2024-04-09 15:14:08
* @LastEditors: zhp
* @Description:
-->

View File

@ -26,7 +26,7 @@ import {
getQualityScrapLogPage,
deleteQualityScrapLog,
getWorkOrderList,
getTeamList
// getTeamList
} from '@/api/base/qualityScrapLog';
const tableProps = [
@ -124,8 +124,9 @@ export default {
name: 'search',
color: 'primary',
},
{
type: 'separate',
{
type: this.$auth.hasPermi('base:quality-scrap-det:create') ? 'separate' : '',
// type: 'separate',
},
{
type: this.$auth.hasPermi('base:quality-scrap-det:create') ? 'button' : '',
@ -189,18 +190,18 @@ export default {
// console.log(this.formConfig[0].selectOptions);
// this.listQuery.total = response.data.total;
})
getTeamList().then((res) => {
console.log(res);
// console.log(response);
this.formConfig[1].selectOptions = res.data.map((item) => {
return {
name: item.name,
id: item.id
}
})
// console.log(this.formConfig[0].selectOptions);
// this.listQuery.total = response.data.total;
})
// getTeamList().then((res) => {
// console.log(res);
// // console.log(response);
// this.formConfig[1].selectOptions = res.data.map((item) => {
// return {
// name: item.name,
// id: item.id
// }
// })
// // console.log(this.formConfig[0].selectOptions);
// // this.listQuery.total = response.data.total;
// })
},
getDataList() {
this.dataListLoading = true;

View File

@ -87,8 +87,9 @@ export default {
name: 'search',
color: 'primary',
},
{
type: 'separate',
{
type: this.$auth.hasPermi('base:quality-scrap-type:create') ? 'separate' : '',
// type: 'separate',
},
{
type: this.$auth.hasPermi('base:quality-scrap-type:create') ? 'button' : '',

View File

@ -269,6 +269,13 @@ export default {
name: 'search',
color: 'primary',
},
{
type: this.$auth.hasPermi(
'monitoring:equipment-traceability:export'
)
? 'separate'
: '',
},
{
type: this.$auth.hasPermi(
'monitoring:equipment-traceability:export'

View File

@ -2,7 +2,7 @@
* @Author: zwq
* @Date: 2023-08-01 14:55:51
* @LastEditors: zhp
* @LastEditTime: 2024-04-07 16:19:18
* @LastEditTime: 2024-04-10 16:31:48
* @Description:
-->
<template>
@ -161,6 +161,13 @@ export default {
// type: 'separate',
// type: this.$auth.hasPermi('base:product:create') ? 'separate' : '',
// },
{
type: this.$auth.hasPermi(
'monitoring:materiel-date-from:export'
)
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('monitoring:materiel-date-from:export') ? 'button' : '',
btnName: '导出',

View File

@ -168,8 +168,13 @@ export default {
name: 'search',
color: 'primary',
},
{
type: 'separate',
{
type: this.$auth.hasPermi(
'base:quality-inspection-record:create'
)
? 'separate'
: '',
// type: 'separate',
},
{
type: this.$auth.hasPermi(

View File

@ -99,10 +99,14 @@ export default {
color: 'primary',
},
{
type: this.$auth.hasPermi('base:voc:export') ? 'separate' : '',
type: this.$auth.hasPermi('base:environmental-check-record:export')
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('base:voc:export') ? 'button' : '',
type: this.$auth.hasPermi('base:environmental-check-record:export')
? 'button'
: '',
btnName: '导出',
name: 'export',
color: 'primary',

View File

@ -103,10 +103,14 @@ export default {
color: 'primary',
},
{
type: this.$auth.hasPermi('base:voc:create') ? 'separate' : '',
type: this.$auth.hasPermi('base:environmental-check:create')
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('base:voc:create') ? 'button' : '',
type: this.$auth.hasPermi('base:environmental-check:create')
? 'button'
: '',
btnName: '新增',
name: 'add',
color: 'success',
@ -124,13 +128,16 @@ export default {
tableProps,
list: [],
tableBtn: [
this.$auth.hasPermi('base:voc:update')
this.$auth.hasPermiAnd([
'base:environmental-check:update',
'base:environmental-check:query',
])
? {
type: 'edit',
btnName: '编辑',
}
: undefined,
this.$auth.hasPermi('base:voc:delete')
this.$auth.hasPermi('base:environmental-check:delete')
? {
type: 'delete',
btnName: '删除',

View File

@ -99,10 +99,14 @@ export default {
color: 'primary',
},
{
type: this.$auth.hasPermi('base:waste-gas:export') ? 'separate' : '',
type: this.$auth.hasPermi('base:environmental-check-record:export')
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('base:waste-gas:export') ? 'button' : '',
type: this.$auth.hasPermi('base:environmental-check-record:export')
? 'button'
: '',
btnName: '导出',
name: 'export',
color: 'primary',

View File

@ -103,10 +103,14 @@ export default {
color: 'primary',
},
{
type: this.$auth.hasPermi('base:waste-gas:create') ? 'separate' : '',
type: this.$auth.hasPermi('base:environmental-check:create')
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('base:waste-gas:create') ? 'button' : '',
type: this.$auth.hasPermi('base:environmental-check:create')
? 'button'
: '',
btnName: '新增',
name: 'add',
color: 'success',
@ -124,13 +128,16 @@ export default {
tableProps,
list: [],
tableBtn: [
this.$auth.hasPermi('base:waste-gas:update')
this.$auth.hasPermiAnd([
'base:environmental-check:update',
'base:environmental-check:query',
])
? {
type: 'edit',
btnName: '编辑',
}
: undefined,
this.$auth.hasPermi('base:waste-gas:delete')
this.$auth.hasPermi('base:environmental-check:delete')
? {
type: 'delete',
btnName: '删除',

View File

@ -99,12 +99,14 @@ export default {
color: 'primary',
},
{
type: this.$auth.hasPermi('base:waste-water:export')
type: this.$auth.hasPermi('base:environmental-check-record:export')
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('base:waste-water:export') ? 'button' : '',
type: this.$auth.hasPermi('base:environmental-check-record:export')
? 'button'
: '',
btnName: '导出',
name: 'export',
color: 'primary',

View File

@ -103,12 +103,14 @@ export default {
color: 'primary',
},
{
type: this.$auth.hasPermi('base:waste-water:create')
type: this.$auth.hasPermi('base:environmental-check:create')
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('base:waste-water:create') ? 'button' : '',
type: this.$auth.hasPermi('base:environmental-check:create')
? 'button'
: '',
btnName: '新增',
name: 'add',
color: 'success',
@ -126,13 +128,13 @@ export default {
tableProps,
list: [],
tableBtn: [
this.$auth.hasPermi('base:waste-water:update')
this.$auth.hasPermi('base:environmental-check:update')
? {
type: 'edit',
btnName: '编辑',
}
: undefined,
this.$auth.hasPermi('base:waste-water:delete')
this.$auth.hasPermi('base:environmental-check:delete')
? {
type: 'delete',
btnName: '删除',

View File

@ -1,82 +1,194 @@
<template>
<div class="app-container">
<!-- <doc-alert title="功能权限" url="https://doc.iocoder.cn/resource-permission" />
<div class="app-container">
<!-- <doc-alert title="功能权限" url="https://doc.iocoder.cn/resource-permission" />
<doc-alert title="菜单路由" url="https://doc.iocoder.cn/vue2/route/" /> -->
<!-- 搜索工作栏 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
<el-form-item label="菜单名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入菜单名称" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="菜单状态" clearable>
<el-option v-for="dict in statusDictDatas" :key="parseInt(dict.value)" :label="dict.label" :value="parseInt(dict.value)"/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 搜索工作栏 -->
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch">
<el-form-item
label="菜单名称"
prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入菜单名称"
clearable
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item
label="状态"
prop="status">
<el-select
v-model="queryParams.status"
placeholder="菜单状态"
clearable>
<el-option
v-for="dict in statusDictDatas"
:key="parseInt(dict.value)"
:label="dict.label"
:value="parseInt(dict.value)" />
</el-select>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="el-icon-search"
@click="handleQuery">
搜索
</el-button>
<el-button
icon="el-icon-refresh"
@click="resetQuery">
重置
</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
v-hasPermi="['system:menu:create']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="info" plain icon="el-icon-sort" size="mini" @click="toggleExpandAll">展开/折叠</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-row
:gutter="10"
class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:menu:create']">
新增
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="info"
plain
icon="el-icon-sort"
size="mini"
@click="toggleExpandAll">
展开/折叠
</el-button>
</el-col>
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"></right-toolbar>
</el-row>
<el-table v-if="refreshTable" v-loading="loading" :data="menuList" row-key="id" :default-expand-all="isExpandAll"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}">
<el-table-column prop="name" label="菜单名称" :show-overflow-tooltip="true" width="250"></el-table-column>
<!-- <el-table-column prop="icon" label="图标" align="center" width="100">
<el-table
v-if="refreshTable"
v-loading="loading"
:data="menuList"
row-key="id"
:default-expand-all="isExpandAll"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
<el-table-column
prop="name"
label="菜单名称"
:show-overflow-tooltip="true"
width="250"></el-table-column>
<!-- <el-table-column prop="icon" label="图标" align="center" width="100">
<template v-slot="scope">
<svg-icon :icon-class="scope.row.icon" />
</template>
</el-table-column> -->
<el-table-column prop="sort" label="排序" width="60"></el-table-column>
<el-table-column prop="permission" label="权限标识" :show-overflow-tooltip="true" />
<el-table-column prop="component" label="组件路径" :show-overflow-tooltip="true" />
<el-table-column prop="componentName" label="组件名称" :show-overflow-tooltip="true" />
<el-table-column prop="status" label="状态" width="80">
<template v-slot="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status"/>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template v-slot="scope">
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
v-hasPermi="['system:menu:update']">修改</el-button>
<el-button size="mini" type="text" icon="el-icon-plus" @click="handleAdd(scope.row)"
v-hasPermi="['system:menu:create']">新增</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
v-hasPermi="['system:menu:delete']">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-table-column
prop="sort"
label="排序"
width="60"></el-table-column>
<el-table-column
prop="permission"
label="权限标识"
:show-overflow-tooltip="true" />
<el-table-column
prop="component"
label="组件路径"
:show-overflow-tooltip="true" />
<el-table-column
prop="componentName"
label="组件名称"
:show-overflow-tooltip="true" />
<el-table-column
prop="status"
label="状态"
width="80">
<template v-slot="scope">
<dict-tag
:type="DICT_TYPE.COMMON_STATUS"
:value="scope.row.status" />
</template>
</el-table-column>
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width">
<template v-slot="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:menu:update']">
修改
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-plus"
@click="handleAdd(scope.row)"
v-hasPermi="['system:menu:create']">
新增
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:menu:delete']">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 添加或修改菜单对话框 -->
<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-row>
<el-col :span="24">
<el-form-item label="上级菜单">
<treeselect v-model="form.parentId" :options="menuOptions" :normalizer="normalizer" :show-count="true"
placeholder="选择上级菜单"/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="菜单类型" prop="type">
<el-radio-group v-model="form.type">
<el-radio v-for="dict in menuTypeDictDatas" :key="parseInt(dict.value)" :label="parseInt(dict.value)">
{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<!-- <el-col :span="24">
<!-- 添加或修改菜单对话框 -->
<el-dialog
:title="title"
:visible.sync="open"
width="800px"
append-to-body>
<el-form
ref="form"
:model="form"
:rules="rules"
label-width="100px">
<el-row>
<el-col :span="24">
<el-form-item label="上级菜单">
<treeselect
v-model="form.parentId"
:options="menuOptions"
:normalizer="normalizer"
:show-count="true"
placeholder="选择上级菜单" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item
label="菜单类型"
prop="type">
<el-radio-group v-model="form.type">
<el-radio
v-for="dict in menuTypeDictDatas"
:key="parseInt(dict.value)"
:label="parseInt(dict.value)">
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<!-- <el-col :span="24">
<el-form-item v-if="form.type !== 3" label="菜单图标">
<el-popover placement="bottom-start" width="460" trigger="click" @show="$refs['iconSelect'].reset()">
<IconSelect ref="iconSelect" @selected="selected" />
@ -88,319 +200,414 @@
</el-popover>
</el-form-item>
</el-col> -->
<el-col :span="12">
<el-form-item label="菜单名称" prop="name">
<el-input v-model="form.name" placeholder="请输入菜单名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="显示排序" prop="sort">
<el-input-number v-model="form.sort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="form.type !== 3" label="路由地址" prop="path">
<span slot="label">
<el-tooltip content="访问的路由地址,如:`user`。如需外网地址时,则以 `http(s)://` 开头" placement="top">
<i class="el-icon-question" />
</el-tooltip>
路由地址
</span>
<el-input v-model="form.path" placeholder="请输入路由地址" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="form.type !== 1" label="权限标识">
<span slot="label">
<el-tooltip content="Controller 方法上的权限字符,如:@PreAuthorize(`@ss.hasPermission('system:user:list')`)" placement="top">
<i class="el-icon-question" />
</el-tooltip>
权限字符
</span>
<el-input v-model="form.permission" placeholder="请权限标识" maxlength="50" />
<el-form-item
label="菜单名称"
prop="name">
<el-input
v-model="form.name"
placeholder="请输入菜单名称" />
</el-form-item>
</el-col>
<el-col :span="12" v-if="form.type === 2">
<el-form-item label="组件路径" prop="component">
<el-input v-model="form.component" placeholder="例如说system/user/index" />
</el-form-item>
</el-col>
<el-col :span="12" v-if="form.type === 2">
<el-form-item label="组件名称" prop="componentName">
<el-input v-model="form.componentName" placeholder="例如说SystemUser" />
<el-col :span="12">
<el-form-item
label="显示排序"
prop="sort">
<el-input-number
v-model="form.sort"
controls-position="right"
:min="0" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="菜单状态" prop="status">
<span slot="label">
<el-tooltip content="选择停用时,路由将不会出现在侧边栏,也不能被访问" placement="top">
<i class="el-icon-question" />
</el-tooltip>
菜单状态
</span>
<el-radio-group v-model="form.status">
<el-radio v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)"
:key="dict.value" :label="parseInt(dict.value)">{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="form.type !== 3" label="显示状态">
<span slot="label">
<el-tooltip content="选择隐藏时,路由将不会出现在侧边栏,但仍然可以访问" placement="top">
<i class="el-icon-question" />
</el-tooltip>
是否显示
</span>
<el-radio-group v-model="form.visible">
<el-radio :key="true" :label="true">显示</el-radio>
<el-radio :key="false" :label="false">隐藏</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="form.type !== 3" label="总是显示">
<span slot="label">
<el-tooltip content="选择不是时,当该菜单只有一个子菜单时,不展示自己,直接展示子菜单" placement="top">
<i class="el-icon-question" />
</el-tooltip>
总是显示
</span>
<el-radio-group v-model="form.alwaysShow">
<el-radio :key="true" :label="true">总是</el-radio>
<el-radio :key="false" :label="false">不是</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="form.type === 2" label="是否缓存">
<span slot="label">
<el-tooltip content="选择缓存时,则会被 `keep-alive` 缓存,必须填写「组件名称」字段" placement="top">
<i class="el-icon-question" />
</el-tooltip>
是否缓存
</span>
<el-radio-group v-model="form.keepAlive">
<el-radio :key="true" :label="true">缓存</el-radio>
<el-radio :key="false" :label="false">不缓存</el-radio>
<el-form-item
v-if="form.type !== 3"
label="路由地址"
prop="path">
<span slot="label">
<el-tooltip
content="访问的路由地址,如:`user`。如需外网地址时,则以 `http(s)://` 开头"
placement="top">
<i class="el-icon-question" />
</el-tooltip>
路由地址
</span>
<el-input
v-model="form.path"
placeholder="请输入路由地址" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
v-if="form.type !== 1"
label="权限标识">
<span slot="label">
<el-tooltip
content="Controller 方法上的权限字符,如:@PreAuthorize(`@ss.hasPermission('system:user:list')`)"
placement="top">
<i class="el-icon-question" />
</el-tooltip>
权限字符
</span>
<el-input
v-model="form.permission"
placeholder="请权限标识"
maxlength="200" />
</el-form-item>
</el-col>
<el-col
:span="12"
v-if="form.type === 2">
<el-form-item
label="组件路径"
prop="component">
<el-input
v-model="form.component"
placeholder="例如说system/user/index" />
</el-form-item>
</el-col>
<el-col
:span="12"
v-if="form.type === 2">
<el-form-item
label="组件名称"
prop="componentName">
<el-input
v-model="form.componentName"
placeholder="例如说SystemUser" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="菜单状态"
prop="status">
<span slot="label">
<el-tooltip
content="选择停用时,路由将不会出现在侧边栏,也不能被访问"
placement="top">
<i class="el-icon-question" />
</el-tooltip>
菜单状态
</span>
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
:label="parseInt(dict.value)">
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
<el-col :span="12">
<el-form-item
v-if="form.type !== 3"
label="显示状态">
<span slot="label">
<el-tooltip
content="选择隐藏时,路由将不会出现在侧边栏,但仍然可以访问"
placement="top">
<i class="el-icon-question" />
</el-tooltip>
是否显示
</span>
<el-radio-group v-model="form.visible">
<el-radio
:key="true"
:label="true">
显示
</el-radio>
<el-radio
:key="false"
:label="false">
隐藏
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
v-if="form.type !== 3"
label="总是显示">
<span slot="label">
<el-tooltip
content="选择不是时,当该菜单只有一个子菜单时,不展示自己,直接展示子菜单"
placement="top">
<i class="el-icon-question" />
</el-tooltip>
总是显示
</span>
<el-radio-group v-model="form.alwaysShow">
<el-radio
:key="true"
:label="true">
总是
</el-radio>
<el-radio
:key="false"
:label="false">
不是
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
v-if="form.type === 2"
label="是否缓存">
<span slot="label">
<el-tooltip
content="选择缓存时,则会被 `keep-alive` 缓存,必须填写「组件名称」字段"
placement="top">
<i class="el-icon-question" />
</el-tooltip>
是否缓存
</span>
<el-radio-group v-model="form.keepAlive">
<el-radio
:key="true"
:label="true">
缓存
</el-radio>
<el-radio
:key="false"
:label="false">
不缓存
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div
slot="footer"
class="dialog-footer">
<el-button
type="primary"
@click="submitForm">
</el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listMenu, getMenu, delMenu, addMenu, updateMenu } from "@/api/system/menu";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import IconSelect from "@/components/IconSelect";
import {
listMenu,
getMenu,
delMenu,
addMenu,
updateMenu,
} from '@/api/system/menu';
import Treeselect from '@riophae/vue-treeselect';
import '@riophae/vue-treeselect/dist/vue-treeselect.css';
import IconSelect from '@/components/IconSelect';
import { SystemMenuTypeEnum, CommonStatusEnum } from '@/utils/constants'
import { getDictDatas, DICT_TYPE } from '@/utils/dict'
import {isExternal} from "@/utils/validate";
import { SystemMenuTypeEnum, CommonStatusEnum } from '@/utils/constants';
import { getDictDatas, DICT_TYPE } from '@/utils/dict';
import { isExternal } from '@/utils/validate';
export default {
name: "SystemMenu",
components: { Treeselect, IconSelect },
data() {
return {
//
loading: true,
//
showSearch: true,
//
menuList: [],
//
menuOptions: [],
//
title: "",
//
open: false,
//
isExpandAll: false,
//
refreshTable: true,
//
queryParams: {
name: undefined,
visible: undefined
},
//
form: {},
//
rules: {
name: [
{ required: true, message: "菜单名称不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "菜单顺序不能为空", trigger: "blur" }
],
path: [
{ required: true, message: "路由地址不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "blur" }
]
},
name: 'SystemMenu',
components: { Treeselect, IconSelect },
data() {
return {
//
loading: true,
//
showSearch: true,
//
menuList: [],
//
menuOptions: [],
//
title: '',
//
open: false,
//
isExpandAll: false,
//
refreshTable: true,
//
queryParams: {
name: undefined,
visible: undefined,
},
//
form: {},
//
rules: {
name: [
{ required: true, message: '菜单名称不能为空', trigger: 'blur' },
],
sort: [
{ required: true, message: '菜单顺序不能为空', trigger: 'blur' },
],
path: [
{ required: true, message: '路由地址不能为空', trigger: 'blur' },
],
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }],
},
//
MenuTypeEnum: SystemMenuTypeEnum,
CommonStatusEnum: CommonStatusEnum,
//
menuTypeDictDatas: getDictDatas(DICT_TYPE.SYSTEM_MENU_TYPE),
statusDictDatas: getDictDatas(DICT_TYPE.COMMON_STATUS)
};
},
created() {
this.getList();
},
methods: {
//
// selected(name) {
// this.form.icon = name;
// },
/** 查询菜单列表 */
getList() {
this.loading = true;
listMenu(this.queryParams).then(response => {
this.menuList = this.handleTree(response.data, "id");
this.loading = false;
});
},
/** 转换菜单数据结构 */
normalizer(node) {
if (node.children && !node.children.length) {
delete node.children;
}
return {
id: node.id,
label: node.name,
children: node.children
};
},
/** 查询菜单下拉树结构 */
getTreeselect() {
listMenu().then(response => {
this.menuOptions = [];
const menu = { id: 0, name: '主类目', children: [] };
menu.children = this.handleTree(response.data, "id");
this.menuOptions.push(menu);
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: undefined,
parentId: 0,
name: undefined,
// icon: undefined,
type: SystemMenuTypeEnum.DIR,
sort: undefined,
status: CommonStatusEnum.ENABLE,
visible: true,
keepAlive: true,
alwaysShow: true,
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
/** 展开/折叠操作 */
toggleExpandAll() {
this.refreshTable = false;
this.isExpandAll = !this.isExpandAll;
this.$nextTick(() => {
this.refreshTable = true;
});
},
/** 新增按钮操作 */
handleAdd(row) {
this.reset();
this.getTreeselect();
if (row != null && row.id) {
this.form.parentId = row.id;
} else {
this.form.parentId = 0;
}
this.open = true;
this.title = "添加菜单";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
this.getTreeselect();
getMenu(row.id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改菜单";
});
},
/** 提交按钮 */
submitForm: function() {
this.$refs["form"].validate(valid => {
if (valid) {
// path
if (this.form.type === SystemMenuTypeEnum.DIR
|| this.form.type === SystemMenuTypeEnum.MENU) {
//
const path = this.form.path
if (!isExternal(path)) {
// path /
if (this.form.parentId === 0 && path.charAt(0) !== '/') {
this.$modal.msgSuccess('前端必须以 / 开头')
return
} else if (this.form.parentId !== 0 && path.charAt(0) === '/') {
this.$modal.msgSuccess('前端不能以 / 开头')
return
}
}
}
//
MenuTypeEnum: SystemMenuTypeEnum,
CommonStatusEnum: CommonStatusEnum,
//
menuTypeDictDatas: getDictDatas(DICT_TYPE.SYSTEM_MENU_TYPE),
statusDictDatas: getDictDatas(DICT_TYPE.COMMON_STATUS),
};
},
created() {
this.getList();
},
methods: {
//
// selected(name) {
// this.form.icon = name;
// },
/** 查询菜单列表 */
getList() {
this.loading = true;
listMenu(this.queryParams).then((response) => {
this.menuList = this.handleTree(response.data, 'id');
this.loading = false;
});
},
/** 转换菜单数据结构 */
normalizer(node) {
if (node.children && !node.children.length) {
delete node.children;
}
return {
id: node.id,
label: node.name,
children: node.children,
};
},
/** 查询菜单下拉树结构 */
getTreeselect() {
listMenu().then((response) => {
this.menuOptions = [];
const menu = { id: 0, name: '主类目', children: [] };
menu.children = this.handleTree(response.data, 'id');
this.menuOptions.push(menu);
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: undefined,
parentId: 0,
name: undefined,
// icon: undefined,
type: SystemMenuTypeEnum.DIR,
sort: undefined,
status: CommonStatusEnum.ENABLE,
visible: true,
keepAlive: true,
alwaysShow: true,
};
this.resetForm('form');
},
/** 搜索按钮操作 */
handleQuery() {
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm('queryForm');
this.handleQuery();
},
/** 展开/折叠操作 */
toggleExpandAll() {
this.refreshTable = false;
this.isExpandAll = !this.isExpandAll;
this.$nextTick(() => {
this.refreshTable = true;
});
},
/** 新增按钮操作 */
handleAdd(row) {
this.reset();
this.getTreeselect();
if (row != null && row.id) {
this.form.parentId = row.id;
} else {
this.form.parentId = 0;
}
this.open = true;
this.title = '添加菜单';
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
this.getTreeselect();
getMenu(row.id).then((response) => {
this.form = response.data;
this.open = true;
this.title = '修改菜单';
});
},
/** 提交按钮 */
submitForm: function () {
this.$refs['form'].validate((valid) => {
if (valid) {
// path
if (
this.form.type === SystemMenuTypeEnum.DIR ||
this.form.type === SystemMenuTypeEnum.MENU
) {
//
const path = this.form.path;
if (!isExternal(path)) {
// path /
if (this.form.parentId === 0 && path.charAt(0) !== '/') {
this.$modal.msgSuccess('前端必须以 / 开头');
return;
} else if (this.form.parentId !== 0 && path.charAt(0) === '/') {
this.$modal.msgSuccess('前端不能以 / 开头');
return;
}
}
}
//
if (this.form.id !== undefined) {
updateMenu(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addMenu(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
this.$modal.confirm('是否确认删除名称为"' + row.name + '"的数据项?').then(function() {
return delMenu(row.id);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
}
}
//
if (this.form.id !== undefined) {
updateMenu(this.form).then((response) => {
this.$modal.msgSuccess('修改成功');
this.open = false;
this.getList();
});
} else {
addMenu(this.form).then((response) => {
this.$modal.msgSuccess('新增成功');
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
this.$modal
.confirm('是否确认删除名称为"' + row.name + '"的数据项?')
.then(function () {
return delMenu(row.id);
})
.then(() => {
this.getList();
this.$modal.msgSuccess('删除成功');
})
.catch(() => {});
},
},
};
</script>