Compare commits
20 Commits
projects/z
...
projects/q
| Author | SHA1 | Date | |
|---|---|---|---|
| 33fce6cb7b | |||
| c30bc48259 | |||
| 92b0b78c9d | |||
| 9fec50eccb | |||
|
|
a7406e7867 | ||
|
|
f3d88638f5 | ||
| acff3b68be | |||
| f24b769305 | |||
| 446fa9a0d1 | |||
| 8d741b8d8a | |||
| 2c1e1845f4 | |||
| bbd9972761 | |||
| 8e9b2f6444 | |||
| c83a7afadb | |||
| b43876fe67 | |||
| f143c5e2d9 | |||
| 0b03e6d44b | |||
| 19dbe38458 | |||
| 43ba33062b | |||
| ca390fd764 |
9
.env.dev
@@ -1,7 +1,7 @@
|
|||||||
###
|
###
|
||||||
# @Author: Do not edit
|
# @Author: Do not edit
|
||||||
# @Date: 2023-08-29 09:40:39
|
# @Date: 2023-08-29 09:40:39
|
||||||
# @LastEditTime: 2024-09-10 14:43:39
|
# @LastEditTime: 2024-11-25 14:31:39
|
||||||
# @LastEditors: zwq
|
# @LastEditors: zwq
|
||||||
# @Description:
|
# @Description:
|
||||||
###
|
###
|
||||||
@@ -9,13 +9,10 @@
|
|||||||
ENV = 'development'
|
ENV = 'development'
|
||||||
|
|
||||||
# 页面标题
|
# 页面标题
|
||||||
VUE_APP_TITLE = 成本管理系统
|
VUE_APP_TITLE = 智能监控分析系统
|
||||||
|
|
||||||
# 芋道管理系统/开发环境
|
# 芋道管理系统/开发环境
|
||||||
# VUE_APP_BASE_API = 'http://192.168.1.49:48080'
|
VUE_APP_BASE_API = 'http://172.16.32.79:48080'
|
||||||
VUE_APP_BASE_API = 'http://line.kszny.picaiba.com'
|
|
||||||
# VUE_APP_BASE_API = 'http://192.168.1.40:48080'
|
|
||||||
# VUE_APP_BASE_API = 'http://192.168.1.188:48080'
|
|
||||||
|
|
||||||
# 路由懒加载
|
# 路由懒加载
|
||||||
VUE_CLI_BABEL_TRANSPILE_MODULES = true
|
VUE_CLI_BABEL_TRANSPILE_MODULES = true
|
||||||
|
|||||||
@@ -2,14 +2,14 @@
|
|||||||
# @Author: zwq
|
# @Author: zwq
|
||||||
# @Date: 2024-03-27 15:49:55
|
# @Date: 2024-03-27 15:49:55
|
||||||
# @LastEditors: zwq
|
# @LastEditors: zwq
|
||||||
# @LastEditTime: 2024-09-10 15:19:19
|
# @LastEditTime: 2024-10-30 11:08:47
|
||||||
# @Description:
|
# @Description:
|
||||||
###
|
###
|
||||||
# 生产环境配置
|
# 生产环境配置
|
||||||
ENV = 'production'
|
ENV = 'production'
|
||||||
|
|
||||||
# 页面标题
|
# 页面标题
|
||||||
VUE_APP_TITLE = 成本管理系统
|
VUE_APP_TITLE = 智能监控分析系统
|
||||||
|
|
||||||
# 芋道管理系统/生产环境
|
# 芋道管理系统/生产环境
|
||||||
# VUE_APP_BASE_API = '/prod-api'
|
# VUE_APP_BASE_API = '/prod-api'
|
||||||
|
|||||||
@@ -52,6 +52,7 @@
|
|||||||
"crypto-js": "^4.0.0",
|
"crypto-js": "^4.0.0",
|
||||||
"diagram-js": "^12.3.0",
|
"diagram-js": "^12.3.0",
|
||||||
"echarts": "5.4.0",
|
"echarts": "5.4.0",
|
||||||
|
"el-tree-transfer": "^2.4.7",
|
||||||
"element-ui": "2.15.12",
|
"element-ui": "2.15.12",
|
||||||
"file-saver": "^2.0.5",
|
"file-saver": "^2.0.5",
|
||||||
"fuse.js": "6.6.2",
|
"fuse.js": "6.6.2",
|
||||||
|
|||||||
BIN
public/static/videos/01.webm
Normal file
@@ -1,3 +1,10 @@
|
|||||||
|
/*
|
||||||
|
* @Author: zwq
|
||||||
|
* @Date: 2024-10-29 09:47:40
|
||||||
|
* @LastEditors: zwq
|
||||||
|
* @LastEditTime: 2025-02-26 16:27:48
|
||||||
|
* @Description:
|
||||||
|
*/
|
||||||
import request from '@/utils/request'
|
import request from '@/utils/request'
|
||||||
|
|
||||||
// 创建实时数据采集配置
|
// 创建实时数据采集配置
|
||||||
@@ -52,3 +59,11 @@ export function exportEquipmentPlcExcel(query) {
|
|||||||
responseType: 'blob'
|
responseType: 'blob'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获得code
|
||||||
|
export function getCode() {
|
||||||
|
return request({
|
||||||
|
url: '/base/equipment-group/getCode',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,3 +1,10 @@
|
|||||||
|
/*
|
||||||
|
* @Author: zwq
|
||||||
|
* @Date: 2024-10-29 09:47:40
|
||||||
|
* @LastEditors: zwq
|
||||||
|
* @LastEditTime: 2025-02-12 09:25:11
|
||||||
|
* @Description:
|
||||||
|
*/
|
||||||
import request from '@/utils/request'
|
import request from '@/utils/request'
|
||||||
// 获得工厂产线工段设备树形结构
|
// 获得工厂产线工段设备树形结构
|
||||||
export function getTree() {
|
export function getTree() {
|
||||||
|
|||||||
@@ -51,6 +51,13 @@ export function getCode() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获得可用的班次列表
|
||||||
|
export function listClassesEnabled() {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-classes/listEnable',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
// 导出班次基础信息 Excel
|
// 导出班次基础信息 Excel
|
||||||
export function exportGroupClassesExcel(query) {
|
export function exportGroupClassesExcel(query) {
|
||||||
return request({
|
return request({
|
||||||
|
|||||||
125
src/api/base/groupSchedulingPlan.js
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 创建排班计划配置基础信息
|
||||||
|
export function createGroupPlan(data) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-plan/create',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新排班计划配置基础信息
|
||||||
|
export function updateGroupPlan(data) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-plan/update',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除排班计划配置基础信息
|
||||||
|
export function deleteGroupPlan(id) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-plan/delete?id=' + id,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获得排班计划配置基础信息
|
||||||
|
export function getGroupPlan(id) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-plan/get?id=' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获得排班计划配置基础信息分页
|
||||||
|
export function getGroupPlanPage(query) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-plan/page',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获得所有排班计划列表
|
||||||
|
export function groupPlanList() {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-plan/listAll',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 获得排班计划相关班组列表
|
||||||
|
export function groupPlanTeamList(id) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-plan-team/teamListByPlanId?planId=' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 获得排班计划相关班次列表
|
||||||
|
export function groupPlanClassesList(id) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-plan-classes/classesListByPlanId?planId=' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 获取code
|
||||||
|
export function getCode() {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-plan/getCode',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 导出排班计划配置基础信息 Excel
|
||||||
|
export function exportGroupPlanExcel(query) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-plan/export-excel',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
responseType: 'blob'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获得产线工段树形结构
|
||||||
|
export function getGroupPlanTree() {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-plan/getLineSectionTree',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建排班计划产线工段
|
||||||
|
export function createGroupPlanLine(data) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-plan-line-section/createPlanLineSection',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新排班计划产线工段
|
||||||
|
export function updateGroupPlanLine(data) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-plan-line-section/updatePlanLineSection',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获得排班计划配置基础信息
|
||||||
|
export function getGroupPlanLine(id) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-plan-line-section/getLineSectionByPlanId?planId=' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获得当前登录用户所在部门id
|
||||||
|
export function getLoginUserDeptId() {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-plan-line-section/getLoginUserDeptId',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
60
src/api/base/groupSchedulingRule.js
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 创建排班规则基础信息
|
||||||
|
export function createGroupRule(data) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-rule/create',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 作废排班规则
|
||||||
|
export function disableGroupRule(id) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-rule/disable?id=' + id,
|
||||||
|
method: 'post',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 更新排班规则基础信息
|
||||||
|
export function updateGroupRule(data) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-rule/update',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除排班规则基础信息
|
||||||
|
export function deleteGroupRule(id) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-rule/delete?id=' + id,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获得排班规则基础信息
|
||||||
|
export function getGroupRule(id) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-rule/get?id=' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获得排班规则基础信息分页
|
||||||
|
export function getGroupRulePage(query) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-rule/page',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 导出排班规则基础信息 Excel
|
||||||
|
export function exportGroupRuleExcel(query) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-scheduling-rule/export-excel',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
responseType: 'blob'
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -58,3 +58,49 @@ export function listEnabled() {
|
|||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获得班组组员信息分页
|
||||||
|
export function groupTeamPage(query) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-team-det/page',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获得班组组员信息
|
||||||
|
export function groupTeamDet(query) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-team-det/get',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 创建班组组员信息
|
||||||
|
export function teamDetCreate(data) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-team-det/create',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新班组组员信息
|
||||||
|
export function teamDetUpdate(data) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-team-det/update',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除班组组员信息
|
||||||
|
export function teamDetDelete(query) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-team-det/delete',
|
||||||
|
method: 'delete',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,7 +8,14 @@ export function getPreset(query) {
|
|||||||
params: query
|
params: query
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
// 获取某月预排班
|
||||||
|
export function getScheduling(query) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-team-scheduling/getScheduling',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
// 批量创建-更新排班信息
|
// 批量创建-更新排班信息
|
||||||
export function createOrUpdateList(data) {
|
export function createOrUpdateList(data) {
|
||||||
return request({
|
return request({
|
||||||
@@ -26,3 +33,22 @@ export function autoSet(query) {
|
|||||||
params: query
|
params: query
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获得排班信息分页
|
||||||
|
export function schedulingPage(query) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-team-scheduling/page',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 导出Excel
|
||||||
|
export function exportSchedulingExcel(query) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-team-scheduling/export-excel',
|
||||||
|
method: 'get',
|
||||||
|
params: query,
|
||||||
|
responseType: 'blob'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
26
src/api/base/worker.js
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
// 获得所有员工列表
|
||||||
|
export function getWorkerList() {
|
||||||
|
return request({
|
||||||
|
url: '/base/core-worker/listAll',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获得员工
|
||||||
|
export function getWorker(query) {
|
||||||
|
return request({
|
||||||
|
url: '/base/core-worker/get',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获得该班组其他可选组员列表(除去现有组员)
|
||||||
|
export function otherWorkerList(query) {
|
||||||
|
return request({
|
||||||
|
url: '/base/group-team-det/otherWorkerList',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* @Author: zhp
|
* @Author: zhp
|
||||||
* @Date: 2023-09-12 14:07:04
|
* @Date: 2023-09-12 14:07:04
|
||||||
* @LastEditTime: 2023-09-13 09:53:45
|
* @LastEditTime: 2025-01-08 15:47:17
|
||||||
* @LastEditors: zhp
|
* @LastEditors: zwq
|
||||||
* @Description:
|
* @Description:
|
||||||
*/
|
*/
|
||||||
import request from '@/utils/request'
|
import request from '@/utils/request'
|
||||||
@@ -22,3 +22,26 @@ export function getCT(data) {
|
|||||||
data: data
|
data: data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
// 获取产线平衡分析数据(new)
|
||||||
|
export function getNewCTNow(data) {
|
||||||
|
return request({
|
||||||
|
url: '/analysis/production-analysis/getNewCTNow',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 获取产线平衡分析数据趋势图(new)
|
||||||
|
export function getNewCTCharts(data) {
|
||||||
|
return request({
|
||||||
|
url: '/analysis/production-analysis/getNewCTCharts',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 获取产线平衡分析数据设备list(new)
|
||||||
|
export function getNewCTDet(id) {
|
||||||
|
return request({
|
||||||
|
url: '/analysis/production-analysis/getNewCTDet?lineId='+id,
|
||||||
|
method: 'get',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@@ -58,3 +58,12 @@ export function exportFactoryExcel(query) {
|
|||||||
responseType: 'blob'
|
responseType: 'blob'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
// 获取产线设备状态
|
||||||
|
export function getLineEqStatus(data) {
|
||||||
|
return request({
|
||||||
|
url: '/monitoring/equipment-monitor/getLineEqStatus',
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
28
src/api/core/base/lineBindProcess.js
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
|
||||||
|
// 切换工艺
|
||||||
|
export function switchLineBindProcess(data) {
|
||||||
|
return request({
|
||||||
|
url: '/base/line-bind-process/switch',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 获得产线工艺目前生产工艺
|
||||||
|
export function getLineBindProcessPage(query) {
|
||||||
|
return request({
|
||||||
|
url: '/base/line-bind-process/nowList',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获得产线工艺log分页
|
||||||
|
export function getLineBindProcessLogPage(query) {
|
||||||
|
return request({
|
||||||
|
url: '/base/line-bind-process/logPage',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -16,6 +16,14 @@ export function switchLineBindProduct(data) {
|
|||||||
data: data
|
data: data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
// 切换产线是否可以自动
|
||||||
|
export function switchAutoProduct(data) {
|
||||||
|
return request({
|
||||||
|
url: '/base/line-bind-product/switchAuto',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
// 更新产线目前生产产品表 主要为更新
|
// 更新产线目前生产产品表 主要为更新
|
||||||
export function updateLineBindProduct(data) {
|
export function updateLineBindProduct(data) {
|
||||||
return request({
|
return request({
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* @Author: Do not edit
|
* @Author: Do not edit
|
||||||
* @Date: 2023-09-12 09:44:53
|
* @Date: 2023-09-12 09:44:53
|
||||||
* @LastEditTime: 2023-09-13 16:11:41
|
* @LastEditTime: 2025-01-07 09:57:36
|
||||||
* @LastEditors: DY
|
* @LastEditors: zwq
|
||||||
* @Description:
|
* @Description:
|
||||||
*/
|
*/
|
||||||
import request from '@/utils/request'
|
import request from '@/utils/request'
|
||||||
@@ -17,9 +17,43 @@ export function getPdlAutoReport(data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 获得所有工厂产线列表
|
// 获得所有工厂产线列表
|
||||||
export function getPdList() {
|
export function getPdList(id) {
|
||||||
return request({
|
return request({
|
||||||
url: '/base/production-line/listAll',
|
url: '/base/production-line/listAll' + (id ? '?id=' + id : ''),
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
// 获得产线自动报表
|
||||||
|
export function getLineAuto(data) {
|
||||||
|
return request({
|
||||||
|
url: '/monitoring/production-monitor/getPdlAutoReportNew',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获得产品自动报表
|
||||||
|
export function getProductAuto(data) {
|
||||||
|
return request({
|
||||||
|
url: '/monitoring/production-monitor/getProcessAutoReportNew',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 班组自动报表分页
|
||||||
|
export function getTeamReportPage(data) {
|
||||||
|
return request({
|
||||||
|
url: '/monitoring/team-auto-report/page',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 班组自动报表分页详细
|
||||||
|
export function getTeamReportPageDet(id) {
|
||||||
|
return request({
|
||||||
|
url: '/monitoring/team-auto-report/pageDet?id=' + id,
|
||||||
|
method: 'get',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* @Author: Do not edit
|
* @Author: Do not edit
|
||||||
* @Date: 2023-09-12 09:44:53
|
* @Date: 2023-09-12 09:44:53
|
||||||
* @LastEditTime: 2023-09-14 10:25:46
|
* @LastEditTime: 2025-03-03 10:43:34
|
||||||
* @LastEditors: DY
|
* @LastEditors: zwq
|
||||||
* @Description:
|
* @Description:
|
||||||
*/
|
*/
|
||||||
import request from '@/utils/request'
|
import request from '@/utils/request'
|
||||||
@@ -23,3 +23,21 @@ export function getPdList() {
|
|||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
// 产线统计数据查询-历史
|
||||||
|
export function getPdlAutoReportNewSearch(data) {
|
||||||
|
return request({
|
||||||
|
url: '/monitoring/production-monitor/getPdlAutoReportNewSearch',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 产线统计数据查询-当前
|
||||||
|
export function getPdlAutoReportNewSearchNow(data) {
|
||||||
|
return request({
|
||||||
|
url: '/monitoring/production-monitor/getPdlAutoReportNewSearchNow',
|
||||||
|
method: 'post',
|
||||||
|
data: data,
|
||||||
|
timeout: 60000,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
20
src/assets/icons/svg/dataBoard1.svg
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<title>编组备份</title>
|
||||||
|
<g id="秦皇岛/北方压延" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g id="现场看板tc—整体产线" transform="translate(-38.175000, -126.808988)">
|
||||||
|
<g id="编组备份" transform="translate(38.175000, 126.808988)">
|
||||||
|
<polygon id="Fill-1" fill="#CAE5DD" opacity="0" points="0 32 32 32 32 0 0 0"></polygon>
|
||||||
|
<path d="M24.1201333,5.07973333 L22.1468,5.07973333 L22.1468,6.3064 L24.1201333,6.3064 C24.7308,6.3064 25.2268,6.8024 25.2268,7.41306667 L25.2268,25.4530667 C25.2268,26.0650667 24.7308,26.5597333 24.1201333,26.5597333 L7.93346667,26.5597333 C7.32146667,26.5597333 6.8268,26.0650667 6.8268,25.4530667 L6.8268,7.41306667 C6.8268,6.8024 7.32146667,6.3064 7.93346667,6.3064 L10.2001333,6.3064 L10.2001333,5.07973333 L7.93346667,5.07973333 C6.64813333,5.08773333 5.6068,6.12773333 5.60013333,7.41306667 L5.60013333,25.4530667 C5.6068,26.7384 6.64813333,27.7797333 7.93346667,27.7864 L24.1334667,27.7864 C25.4188,27.7797333 26.4588,26.7384 26.4668,25.4530667 L26.4668,7.41306667 C26.4588,6.1224 25.4108,5.07973333 24.1201333,5.07973333" id="Fill-3" fill="#6EF9DE"></path>
|
||||||
|
<path d="M7.93333333,5.56026667 C6.90933333,5.56026667 6.08,6.3896 6.08,7.4136 L6.08,25.4536 C6.08,26.4776 6.90933333,27.3069333 7.93333333,27.3069333 L24.1333333,27.3069333 C25.156,27.3069333 25.9866667,26.4776 25.9866667,25.4536 L25.9866667,7.4136 C25.9866667,6.3896 25.156,5.56026667 24.1333333,5.56026667 L22.6,5.56026667 L22.6,5.78693333 L24.0933333,5.78693333 C24.9613333,5.78693333 25.6666667,6.49093333 25.6666667,7.36026667 L25.6666667,25.4002667 C25.6666667,26.2682667 24.9613333,26.9736 24.0933333,26.9736 L7.93333333,26.9736 C7.064,26.9736 6.36,26.2682667 6.36,25.4002667 L6.36,7.4136 C6.33066667,6.54426667 7.01066667,5.81626667 7.87866667,5.78693333 C7.89733333,5.78693333 7.91466667,5.78693333 7.93333333,5.78693333 L9.73333333,5.78693333 L9.73333333,5.50693333 L7.93333333,5.56026667 Z M24.8266667,28.2536 L7.21333333,28.2536 C6.05733333,28.2536 5.12,27.3162667 5.12,26.1602667 L5.12,6.70693333 C5.12,5.55093333 6.05733333,4.6136 7.21333333,4.6136 L10.6666667,4.6136 L10.6666667,6.78693333 L8.81333333,6.78693333 C7.97333333,6.78693333 7.29333333,7.46693333 7.29333333,8.30693333 L7.29333333,24.5602667 C7.29333333,25.3989333 7.97333333,26.0802667 8.81333333,26.0802667 L23.2266667,26.0802667 C24.0666667,26.0802667 24.7466667,25.3989333 24.7466667,24.5602667 L24.7466667,8.30693333 C24.7466667,7.46693333 24.0666667,6.78693333 23.2266667,6.78693333 L21.68,6.78693333 L21.68,4.6136 L24.8266667,4.6136 C25.9826667,4.6136 26.92,5.55093333 26.92,6.70693333 L26.92,26.1602667 C26.92,27.3162667 25.9826667,28.2536 24.8266667,28.2536 L24.8266667,28.2536 Z" id="Fill-5" fill="#6EF9DE"></path>
|
||||||
|
<path d="M11.3468,3.3864 L20.9068,3.3864 C21.7534667,3.3864 22.4401333,4.07306667 22.4401333,4.91973333 L22.4401333,6.1864 C22.4401333,7.03306667 21.7534667,7.71973333 20.9068,7.71973333 L11.3468,7.71973333 C10.5001333,7.71973333 9.81346667,7.03306667 9.81346667,6.1864 L9.81346667,4.91973333 C9.81346667,4.07306667 10.5001333,3.3864 11.3468,3.3864" id="Fill-7" fill="#6EF9DE"></path>
|
||||||
|
<path d="M21.7732,11.3864 C21.7732,12.0530667 21.5065333,12.3864 20.9598667,12.3864 L13.1065333,12.3864 C12.5732,12.3864 12.2932,12.0530667 12.2932,11.3864 C12.2932,10.7197333 12.5732,10.3997333 13.1065333,10.3997333 L20.9598667,10.3997333 C21.5065333,10.3997333 21.7732,10.7330667 21.7732,11.3864" id="Fill-9" fill="#6EF9E1"></path>
|
||||||
|
<path d="M10.2666667,10.4130667 L10.28,10.4130667 C10.824,10.4130667 11.2666667,10.8557333 11.2666667,11.3997333 L11.2666667,11.4130667 C11.2666667,11.9584 10.824,12.3997333 10.28,12.3997333 L10.2666667,12.3997333 C9.72133333,12.3997333 9.28,11.9584 9.28,11.4130667 L9.28,11.3997333 C9.28,10.8557333 9.72133333,10.4130667 10.2666667,10.4130667" id="Fill-11" fill="#6DF8E1"></path>
|
||||||
|
<path d="M21.7732,16.3597333 C21.7732,17.0264 21.3998667,17.3597333 20.6398667,17.3597333 L13.4398667,17.3597333 C12.6798667,17.3597333 12.2932,17.0264 12.2932,16.3597333 C12.2932,15.6930667 12.6798667,15.3597333 13.4398667,15.3597333 L20.6398667,15.3597333 C21.3998667,15.3597333 21.7732,15.6930667 21.7732,16.3597333" id="Fill-13" fill="#6EF9E1"></path>
|
||||||
|
<path d="M10.2666667,15.4130667 L10.28,15.4130667 C10.824,15.4130667 11.2666667,15.8557333 11.2666667,16.3997333 L11.2666667,16.4130667 C11.2666667,16.9584 10.824,17.3997333 10.28,17.3997333 L10.2666667,17.3997333 C9.72133333,17.3997333 9.28,16.9584 9.28,16.4130667 L9.28,16.3997333 C9.28,15.8557333 9.72133333,15.4130667 10.2666667,15.4130667" id="Fill-15" fill="#6DF8E1"></path>
|
||||||
|
<path d="M21.7732,21.3597333 C21.7732,22.0264 21.5065333,22.3597333 20.9598667,22.3597333 L13.1065333,22.3597333 C12.5732,22.3597333 12.2932,22.0264 12.2932,21.3597333 C12.2932,20.6930667 12.5732,20.3597333 13.1065333,20.3597333 L20.9598667,20.3597333 C21.5065333,20.3597333 21.7732,20.6930667 21.7732,21.3597333" id="Fill-17" fill="#6EF9E1"></path>
|
||||||
|
<path d="M10.2666667,20.3864 L10.28,20.3864 C10.824,20.3864 11.2666667,20.8290667 11.2666667,21.3730667 L11.2666667,21.3864 C11.2666667,21.9317333 10.824,22.3730667 10.28,22.3730667 L10.2666667,22.3730667 C9.72133333,22.3730667 9.28,21.9317333 9.28,21.3864 L9.28,21.3730667 C9.28,20.8290667 9.72133333,20.3864 10.2666667,20.3864" id="Fill-19" fill="#6DF8E1"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 5.6 KiB |
18
src/assets/icons/svg/dataBoard2.svg
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<title>切片</title>
|
||||||
|
<defs>
|
||||||
|
<linearGradient x1="100%" y1="81.9999999%" x2="20.318998%" y2="18.0000001%" id="linearGradient-1">
|
||||||
|
<stop stop-color="#4BFFC8" offset="0%"></stop>
|
||||||
|
<stop stop-color="#45F2EC" offset="100%"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g id="秦皇岛/北方压延" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g id="现场看板tc—整体产线" transform="translate(-35.000000, -741.000000)" fill-rule="nonzero">
|
||||||
|
<g id="icon/可视化/柱状图" transform="translate(35.000000, 741.000000)">
|
||||||
|
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="32" height="32"></rect>
|
||||||
|
<path d="M6.07816026,6.07816026 L6.07816026,23.4413798 L28.4022997,23.4413798 L28.4022997,25.9218397 L3.5977003,25.9218397 L3.5977003,6.07816026 L6.07816026,6.07816026 Z M13.5195401,6.07816026 L13.5195401,22.2011498 L8.55862018,22.2011498 L8.55862018,6.07816026 L13.5195401,6.07816026 Z M20.9609199,11.0390801 L20.9609199,22.2011498 L16,22.2011498 L16,11.0390801 L20.9609199,11.0390801 Z M28.4022997,16 L28.4022997,22.2011498 L23.4413798,22.2011498 L23.4413798,16 L28.4022997,16 Z" id="形状" fill="url(#linearGradient-1)"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
18
src/assets/icons/svg/dataBoard3.svg
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="27px" height="32px" viewBox="0 0 27 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<title>产线备份 3</title>
|
||||||
|
<defs>
|
||||||
|
<linearGradient x1="100%" y1="84.4142661%" x2="20.318998%" y2="15.5857339%" id="linearGradient-1">
|
||||||
|
<stop stop-color="#4BFFC8" offset="0%"></stop>
|
||||||
|
<stop stop-color="#45F2EC" offset="100%"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g id="秦皇岛/北方压延" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g id="现场看板tc—整体产线" transform="translate(-456.000000, -740.000000)" fill-rule="nonzero">
|
||||||
|
<g id="产线备份-3" transform="translate(456.000000, 740.000000)">
|
||||||
|
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="27" height="32"></rect>
|
||||||
|
<path d="M5.9634842,21.3256682 C5.8209113,21.3358884 5.67787363,21.3358884 5.53530073,21.3256682 L5.53152795,21.3256682 C4.70985419,21.2655042 3.9028068,20.8665317 3.27496659,20.1284294 C1.90834447,18.5219016 1.90834447,15.9172034 3.27496659,14.3106756 C3.5291373,14.011848 3.81269745,13.7686207 4.11471142,13.5809616 L4.11389125,13.5765264 L4.1789034,13.5420735 C4.26583759,13.4907514 4.35456706,13.4437443 4.44485723,13.4011765 L16.0336968,7.2612301 L16.0353372,7.27016472 C18.3137697,6.10911436 21.061777,6.62333696 22.9243013,8.8128968 C25.3585662,11.6745456 25.3585662,16.314119 22.9243013,19.1757678 C21.7290674,20.580881 20.1691859,21.2960361 18.6027704,21.3212973 L18.6035632,21.3256682 L5.9634842,21.3256682 Z M5.625,20 C6.86761875,20 7.875,18.8061 7.875,17.3333333 C7.875,15.8605667 6.86761875,14.6666667 5.625,14.6666667 C4.382325,14.6666667 3.375,15.8605667 3.375,17.3333333 C3.375,18.8061 4.382325,20 5.625,20 Z M18.5625,18.6666667 C20.737088,18.6666667 22.5,16.5773202 22.5,14 C22.5,11.4226798 20.737088,9.33333333 18.5625,9.33333333 C16.3878602,9.33333333 14.625,11.4226798 14.625,14 C14.625,16.5773202 16.3878602,18.6666667 18.5625,18.6666667 Z M4.92857143,22.6666667 L22.5,22.6666667 L22.5,24.8888889 C22.5,25.1343611 22.3081339,25.3333333 22.0714286,25.3333333 L4.5,25.3333333 L4.5,23.1111111 C4.5,22.8656389 4.69186607,22.6666667 4.92857143,22.6666667 Z" id="形状" fill="url(#linearGradient-1)"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.3 KiB |
18
src/assets/icons/svg/dataBoard4.svg
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<title>切片</title>
|
||||||
|
<defs>
|
||||||
|
<linearGradient x1="99.4683184%" y1="100%" x2="20.6346149%" y2="7.84095011e-14%" id="linearGradient-1">
|
||||||
|
<stop stop-color="#4BFFC8" offset="0%"></stop>
|
||||||
|
<stop stop-color="#45F2EC" offset="100%"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g id="秦皇岛/北方压延" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g id="现场看板tc—整体产线" transform="translate(-1514.000000, -127.000000)" fill-rule="nonzero">
|
||||||
|
<g id="icon/可视化/模块" transform="translate(1514.000000, 127.000000)">
|
||||||
|
<rect id="矩形" fill="#000000" opacity="0" x="0" y="7.10542736e-14" width="32" height="32"></rect>
|
||||||
|
<path d="M25.7527221,14.1816202 L24.188579,14.1816202 L24.188579,9.49373791 C24.1860753,8.90287145 23.7063759,8.4252046 23.1155041,8.42520991 L17.3681876,8.42520991 L17.3681876,6.56551655 C17.370851,5.66122185 17.0084214,4.79412914 16.363022,4.1607133 C15.7176226,3.52729745 14.8438903,3.18118084 13.9398043,3.20079015 C12.066652,3.28658042 10.6006443,4.84522051 10.629641,6.72011209 L10.629641,8.42520991 L4.88232453,8.42520991 C4.29145277,8.4252046 3.81175331,8.90287145 3.80921104,9.49373791 L3.80921104,13.0994515 C3.80682438,13.385621 3.9188086,13.6609038 4.12031265,13.8641155 C4.32181669,14.0673272 4.59614473,14.1816305 4.88232453,14.1816202 L5.48251897,14.1816202 C7.35572581,14.1525356 8.91367406,15.6158797 9.00184091,17.4872366 C9.01900932,18.3913465 8.67055578,19.2641187 8.03543236,19.9078018 C7.40030895,20.5514848 6.53227944,20.9115903 5.62802066,20.9065261 L4.88232453,20.9065261 C4.28968163,20.9065261 3.80921104,21.3869581 3.80921104,21.979601 L3.80921104,27.7269175 C3.80921104,28.3195604 4.28968163,28.8000021 4.88232453,28.8000021 L9.55656609,28.8000021 C9.84153405,28.8012076 10.1151815,28.6885421 10.3166861,28.4870375 C10.5181907,28.2855329 10.6308562,28.0118854 10.629641,27.7269175 L10.629641,27.1949269 C10.6006443,25.3200353 12.066652,23.7613953 13.9398043,23.675605 C14.8438903,23.6559957 15.7176226,24.0021123 16.363022,24.6355281 C17.0084214,25.268944 17.370851,26.1360367 17.3681876,27.0403314 L17.3681876,27.7269175 C17.3669784,28.0110957 17.479021,28.2840495 17.6795401,28.4854219 C17.8800592,28.6867943 18.1525348,28.8000021 18.4367156,28.8000021 L23.1155041,28.8000021 C23.708147,28.8000021 24.188579,28.3195604 24.188579,27.7269175 L24.188579,20.9065261 L25.9027707,20.9065261 C26.8070472,20.910389 27.6746078,20.5491212 28.3088772,19.9045802 C28.9431467,19.2600392 29.290432,18.3867874 29.272044,17.4826896 C29.1815049,15.6131286 27.6242468,14.1524446 25.7527221,14.1816202 Z" id="路径" fill="url(#linearGradient-1)"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.9 KiB |
11
src/assets/icons/svg/fullScreenView.svg
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="22px" height="22px" viewBox="0 0 22 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<g id="驾驶舱" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g id="运营总览_生产线监控驾驶舱" transform="translate(-1866.000000, -36.000000)">
|
||||||
|
<g id="编组-54" transform="translate(1866.000000, 36.000000)">
|
||||||
|
<rect id="矩形" stroke="#979797" fill="#D8D8D8" opacity="0" x="0.5" y="0.5" width="21" height="21"></rect>
|
||||||
|
<path d="M18.4001211,1 L18.574731,1.00571398 C18.8641421,1.02474925 19.1451559,1.09128771 19.4122178,1.20447947 C19.7221027,1.33395436 19.9991094,1.52058631 20.2392616,1.76073844 C20.4776764,1.99915325 20.6652172,2.27804627 20.7953442,2.58736464 C20.9313506,2.90825642 21,3.24882158 21,3.59987893 L21,3.59987893 L21,18.4001211 L20.994286,18.574731 C20.9752507,18.8641421 20.9087123,19.1451559 20.7955205,19.4122178 C20.6660456,19.7221027 20.4794137,19.9991094 20.2392616,20.2392616 C20.0008468,20.4776764 19.7219537,20.6652172 19.4126354,20.7953442 C19.0917436,20.9313506 18.7511784,21 18.4001211,21 L18.4001211,21 L3.59987893,21 L3.42526905,20.994286 C3.13585794,20.9752507 2.85484405,20.9087123 2.58778224,20.7955205 C2.2778973,20.6660456 2.00089057,20.4794137 1.76073844,20.2392616 C1.52232363,20.0008468 1.33478285,19.7219537 1.20465581,19.4126354 C1.06864936,19.0917436 1,18.7511784 1,18.4001211 L1,18.4001211 L1,3.59987893 L1.00571398,3.42526905 C1.02474925,3.13585794 1.09128771,2.85484405 1.20447947,2.58778224 C1.33395436,2.2778973 1.52058631,2.00089057 1.76073844,1.76073844 C1.99915325,1.52232363 2.27804627,1.33478285 2.58736464,1.20465581 C2.90825642,1.06864936 3.24882158,1 3.59987893,1 L3.59987893,1 L18.4001211,1 Z M18.4001211,2.29539952 L3.59987893,2.29539952 L3.49797651,2.2993263 C2.82542992,2.35136056 2.29539952,2.9140495 2.29539952,3.59987893 L2.29539952,3.59987893 L2.29539952,18.4001211 L2.2993263,18.5020235 C2.35136056,19.1745701 2.9140495,19.7046005 3.59987893,19.7046005 L3.59987893,19.7046005 L18.4001211,19.7046005 L18.5020235,19.7006737 C19.1745701,19.6486394 19.7046005,19.0859505 19.7046005,18.4001211 L19.7046005,18.4001211 L19.7046005,3.59987893 L19.7006737,3.49797651 C19.6486394,2.82542992 19.0859505,2.29539952 18.4001211,2.29539952 L18.4001211,2.29539952 Z M4.56580299,11.8731508 L4.63987359,11.8789244 C4.95620444,11.9219442 5.20096852,12.1943435 5.20096852,12.5208838 L5.20096852,12.5208838 L5.20096852,15.8606113 L8.39814764,12.6634321 L8.45892035,12.6098356 C8.71226443,12.4133149 9.08161636,12.4311804 9.3138681,12.6634321 C9.56547415,12.9150382 9.56547415,13.3275466 9.3138681,13.5791526 L9.3138681,13.5791526 L6.09149511,16.7990315 L9.4155569,16.7990315 L9.49368756,16.8035151 C9.82695229,16.8420028 10.0864105,17.123441 10.081435,17.4601165 C10.0742517,17.8119637 9.78624591,18.094431 9.43371671,18.094431 L9.43371671,18.094431 L4.5691586,18.094431 L4.49163938,18.0899766 C4.16113157,18.051728 3.90556901,17.7718105 3.90556901,17.4308414 L3.90556901,17.4308414 L3.90556901,12.5367736 L3.91007171,12.4587841 C3.94871707,12.1260764 4.23118526,11.8665247 4.56580299,11.8731508 L4.56580299,11.8731508 Z M17.4353814,3.90556901 L17.512257,3.91000958 C17.8400885,3.94813523 18.094431,4.22707005 18.094431,4.56461864 L18.094431,4.56461864 L18.094431,9.46095642 L18.0899283,9.53894589 C18.0512829,9.87165361 17.7688147,10.1312053 17.434197,10.1245792 C17.0828999,10.1173731 16.7990315,9.82850504 16.7990315,9.47684625 L16.7990315,9.47684625 L16.7990315,6.13938874 L13.6018524,9.33656786 L13.5410796,9.39016441 C13.2877356,9.58668512 12.9183836,9.5688196 12.6861319,9.33656786 C12.4345258,9.08496181 12.4345258,8.67245345 12.6861319,8.4208474 L12.6861319,8.4208474 L15.9060108,5.20096852 L12.5821731,5.20096852 L12.5040246,5.19648608 C12.170734,5.1580095 11.9119308,4.876675 11.9185506,4.54071802 C11.9257483,4.18803625 12.2137541,3.90556901 12.5662833,3.90556901 L12.5662833,3.90556901 L17.4353814,3.90556901 Z" id="形状结合" fill="#52FFF1" fill-rule="nonzero" opacity="0.79078311"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.1 KiB |
9
src/assets/icons/svg/unFullScreenView.svg
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="22px" height="22px" viewBox="0 0 22 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<g id="驾驶舱" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g id="编组-54备份">
|
||||||
|
<rect id="矩形" stroke="#979797" fill="#D8D8D8" opacity="0" x="0.5" y="0.5" width="21" height="21"></rect>
|
||||||
|
<path d="M18.4001211,1 L18.574731,1.00571398 C18.8641421,1.02474925 19.1451559,1.09128771 19.4122178,1.20447947 C19.7221027,1.33395436 19.9991094,1.52058631 20.2392616,1.76073844 C20.4776764,1.99915325 20.6652172,2.27804627 20.7953442,2.58736464 C20.9313506,2.90825642 21,3.24882158 21,3.59987893 L21,3.59987893 L21,18.4001211 L20.994286,18.574731 C20.9752507,18.8641421 20.9087123,19.1451559 20.7955205,19.4122178 C20.6660456,19.7221027 20.4794137,19.9991094 20.2392616,20.2392616 C20.0008468,20.4776764 19.7219537,20.6652172 19.4126354,20.7953442 C19.0917436,20.9313506 18.7511784,21 18.4001211,21 L18.4001211,21 L3.59987893,21 L3.42526905,20.994286 C3.13585794,20.9752507 2.85484405,20.9087123 2.58778224,20.7955205 C2.2778973,20.6660456 2.00089057,20.4794137 1.76073844,20.2392616 C1.52232363,20.0008468 1.33478285,19.7219537 1.20465581,19.4126354 C1.06864936,19.0917436 1,18.7511784 1,18.4001211 L1,18.4001211 L1,3.59987893 L1.00571398,3.42526905 C1.02474925,3.13585794 1.09128771,2.85484405 1.20447947,2.58778224 C1.33395436,2.2778973 1.52058631,2.00089057 1.76073844,1.76073844 C1.99915325,1.52232363 2.27804627,1.33478285 2.58736464,1.20465581 C2.90825642,1.06864936 3.24882158,1 3.59987893,1 L3.59987893,1 L18.4001211,1 Z M18.4001211,2.29539952 L3.59987893,2.29539952 L3.49797651,2.2993263 C2.82542992,2.35136056 2.29539952,2.9140495 2.29539952,3.59987893 L2.29539952,3.59987893 L2.29539952,18.4001211 L2.2993263,18.5020235 C2.35136056,19.1745701 2.9140495,19.7046005 3.59987893,19.7046005 L3.59987893,19.7046005 L18.4001211,19.7046005 L18.5020235,19.7006737 C19.1745701,19.6486394 19.7046005,19.0859505 19.7046005,18.4001211 L19.7046005,18.4001211 L19.7046005,3.59987893 L19.7006737,3.49797651 C19.6486394,2.82542992 19.0859505,2.29539952 18.4001211,2.29539952 L18.4001211,2.29539952 Z M9.43538136,11.905569 L9.512257,11.9100096 C9.84008849,11.9481352 10.094431,12.2270701 10.094431,12.5646186 L10.094431,12.5646186 L10.094431,17.4609564 L10.0899283,17.5389459 C10.0512829,17.8716536 9.76881474,18.1312053 9.43419701,18.1245792 C9.08289988,18.1173731 8.79903148,17.828505 8.79903148,17.4768462 L8.79903148,17.4768462 L8.79903148,14.1393887 L5.60185236,17.3365679 L5.54107965,17.3901644 C5.28773557,17.5866851 4.91838364,17.5688196 4.6861319,17.3365679 C4.43452585,17.0849618 4.43452585,16.6724534 4.6861319,16.4208474 L4.6861319,16.4208474 L7.90601077,13.2009685 L4.58217312,13.2009685 L4.50402457,13.1964861 C4.17073404,13.1580095 3.9119308,12.876675 3.91855064,12.540718 C3.92574827,12.1880363 4.21375409,11.905569 4.56628329,11.905569 L4.56628329,11.905569 L9.43538136,11.905569 Z M12.565803,3.8731508 L12.6398736,3.87892442 C12.9562044,3.92194416 13.2009685,4.19434347 13.2009685,4.52088378 L13.2009685,4.52088378 L13.2009685,7.86061126 L16.3981476,4.66343214 L16.4589204,4.60983559 C16.7122644,4.41331488 17.0816164,4.4311804 17.3138681,4.66343214 C17.5654742,4.91503819 17.5654742,5.32754655 17.3138681,5.5791526 L17.3138681,5.5791526 L14.0914951,8.79903148 L17.4155569,8.79903148 L17.4936876,8.80351509 C17.8269523,8.84200281 18.0864105,9.12344101 18.081435,9.46011654 C18.0742517,9.81196375 17.7862459,10.094431 17.4337167,10.094431 L17.4337167,10.094431 L12.5691586,10.094431 L12.4916394,10.0899766 C12.1611316,10.051728 11.905569,9.77181051 11.905569,9.4308414 L11.905569,9.4308414 L11.905569,4.53677361 L11.9100717,4.45878413 C11.9487171,4.12607641 12.2311853,3.86652471 12.565803,3.8731508 L12.565803,3.8731508 Z" id="形状结合" fill="#52FFF1" fill-rule="nonzero" opacity="0.79078311"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.9 KiB |
BIN
src/assets/images/dataBoard/arrDown.png
Normal file
|
After Width: | Height: | Size: 595 B |
BIN
src/assets/images/dataBoard/arrUp.png
Normal file
|
After Width: | Height: | Size: 550 B |
BIN
src/assets/images/dataBoard/background.png
Normal file
|
After Width: | Height: | Size: 8.9 MiB |
BIN
src/assets/images/dataBoard/center-bottom.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
src/assets/images/dataBoard/center-top.png
Normal file
|
After Width: | Height: | Size: 92 KiB |
BIN
src/assets/images/dataBoard/centerNumB.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
src/assets/images/dataBoard/centerNumY.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
src/assets/images/dataBoard/data-board-title.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
src/assets/images/dataBoard/defectNum.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
src/assets/images/dataBoard/dotG.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
src/assets/images/dataBoard/dotR.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
src/assets/images/dataBoard/dotY.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
src/assets/images/dataBoard/eq-tip.png
Normal file
|
After Width: | Height: | Size: 91 KiB |
BIN
src/assets/images/dataBoard/head.png
Normal file
|
After Width: | Height: | Size: 107 KiB |
BIN
src/assets/images/dataBoard/left-bottom.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
src/assets/images/dataBoard/left-top.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
BIN
src/assets/images/dataBoard/leftTopDataBox.png
Normal file
|
After Width: | Height: | Size: 113 KiB |
BIN
src/assets/images/dataBoard/leftTopIcon1.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
src/assets/images/dataBoard/leftTopIcon2.png
Normal file
|
After Width: | Height: | Size: 5.9 KiB |
BIN
src/assets/images/dataBoard/leftbar.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
src/assets/images/dataBoard/numberBox.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
src/assets/images/dataBoard/ranking1.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
src/assets/images/dataBoard/ranking2.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
src/assets/images/dataBoard/ranking3.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
src/assets/images/dataBoard/rankingBg1.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
src/assets/images/dataBoard/rankingBg2.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
src/assets/images/dataBoard/right-bottom.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
src/assets/images/dataBoard/rightbar.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
src/assets/images/dataBoard/time-choose.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
@@ -92,13 +92,13 @@
|
|||||||
{{ col.uploadTips || '只能上传jpg/png文件, 大小不超过2MB' }}
|
{{ col.uploadTips || '只能上传jpg/png文件, 大小不超过2MB' }}
|
||||||
</div>
|
</div>
|
||||||
</el-upload>
|
</el-upload>
|
||||||
|
|
||||||
<uploadedFile
|
<uploadedFile
|
||||||
class="file"
|
class="file"
|
||||||
v-for="file in form[col.prop] || []"
|
v-for="file in form[col.prop] || []"
|
||||||
:file="file"
|
:file="file"
|
||||||
:key="file.fileUrl"
|
:key="file.fileUrl"
|
||||||
@delete="handleDeleteFile(file)" />
|
@delete="handleDeleteFile(file)"
|
||||||
|
@Preview="handlePreview(file)" />
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -138,6 +138,9 @@ const uploadedFile = {
|
|||||||
handleDelete() {
|
handleDelete() {
|
||||||
this.$emit('delete', this.file);
|
this.$emit('delete', this.file);
|
||||||
},
|
},
|
||||||
|
handlePreview() {
|
||||||
|
this.$emit('Preview', this.file);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
mounted() {},
|
mounted() {},
|
||||||
render: function (h) {
|
render: function (h) {
|
||||||
@@ -156,7 +159,7 @@ const uploadedFile = {
|
|||||||
cursor: 'pointer',
|
cursor: 'pointer',
|
||||||
display: 'inline-block',
|
display: 'inline-block',
|
||||||
}}>
|
}}>
|
||||||
{this.file.fileName}
|
<el-button onClick={this.handlePreview}>{this.file.fileName}</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
type="text"
|
type="text"
|
||||||
icon="el-icon-close"
|
icon="el-icon-close"
|
||||||
@@ -256,6 +259,20 @@ export default {
|
|||||||
resetFields(args) {
|
resetFields(args) {
|
||||||
return this.$refs.form.resetFields(args);
|
return this.$refs.form.resetFields(args);
|
||||||
},
|
},
|
||||||
|
async handlePreview(file) {
|
||||||
|
const data = await this.$axios({
|
||||||
|
url: file.fileUrl,
|
||||||
|
method: 'get',
|
||||||
|
responseType: 'blob',
|
||||||
|
});
|
||||||
|
const link = document.createElement('a');
|
||||||
|
link.href = window.URL.createObjectURL(new Blob([data]));
|
||||||
|
link.download = file.fileName;
|
||||||
|
document.body.appendChild(link);
|
||||||
|
link.click();
|
||||||
|
document.body.removeChild(link);
|
||||||
|
window.URL.revokeObjectURL(link.href);
|
||||||
|
},
|
||||||
// getCode
|
// getCode
|
||||||
async getCode(url) {
|
async getCode(url) {
|
||||||
const response = await this.$axios(url);
|
const response = await this.$axios(url);
|
||||||
@@ -355,7 +372,9 @@ export default {
|
|||||||
if (!promiseList.length) this.formLoading = false;
|
if (!promiseList.length) this.formLoading = false;
|
||||||
},
|
},
|
||||||
// 上传成功的特殊处理
|
// 上传成功的特殊处理
|
||||||
beforeUpload() {},
|
beforeUpload(file) {
|
||||||
|
console.log(file)
|
||||||
|
},
|
||||||
// 上传前的验证规则可通过 bind 属性传入
|
// 上传前的验证规则可通过 bind 属性传入
|
||||||
handleUploadSuccess(response, file, fileList) {
|
handleUploadSuccess(response, file, fileList) {
|
||||||
this.form.files.push({
|
this.form.files.push({
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import {
|
|||||||
handleTree,
|
handleTree,
|
||||||
addBeginAndEndTime,
|
addBeginAndEndTime,
|
||||||
divide,
|
divide,
|
||||||
|
formatThousands
|
||||||
} from '@/utils/ruoyi';
|
} from '@/utils/ruoyi';
|
||||||
import Pagination from '@/components/Pagination';
|
import Pagination from '@/components/Pagination';
|
||||||
// 自定义表格工具扩展
|
// 自定义表格工具扩展
|
||||||
@@ -45,6 +46,7 @@ Vue.prototype.resetForm = resetForm;
|
|||||||
Vue.prototype.getDictDatas = getDictDatas;
|
Vue.prototype.getDictDatas = getDictDatas;
|
||||||
Vue.prototype.getDictDatas2 = getDictDatas2;
|
Vue.prototype.getDictDatas2 = getDictDatas2;
|
||||||
Vue.prototype.getDictDataLabel = getDictDataLabel;
|
Vue.prototype.getDictDataLabel = getDictDataLabel;
|
||||||
|
Vue.prototype.formatThousands = formatThousands;
|
||||||
Vue.prototype.DICT_TYPE = DICT_TYPE;
|
Vue.prototype.DICT_TYPE = DICT_TYPE;
|
||||||
Vue.prototype.handleTree = handleTree;
|
Vue.prototype.handleTree = handleTree;
|
||||||
Vue.prototype.addBeginAndEndTime = addBeginAndEndTime;
|
Vue.prototype.addBeginAndEndTime = addBeginAndEndTime;
|
||||||
|
|||||||
20
src/mixins/tableHeightMixin.js
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
tableH: this.tableHeight(260),
|
||||||
|
};
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.tableH = this?.heightNum ? this.tableHeight(this.heightNum) : this.tableHeight(260);
|
||||||
|
window.addEventListener('resize', this._setTableHeight);
|
||||||
|
},
|
||||||
|
destroyed() {
|
||||||
|
window.removeEventListener('resize', this._setTableHeight);
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
_setTableHeight() {
|
||||||
|
this.tableH = this?.heightNum ? this.tableHeight(this.heightNum) : this.tableHeight(260);
|
||||||
|
// this.tableH = this.tableHeight(260);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -76,7 +76,7 @@ export const constantRoutes = [
|
|||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: "index",
|
path: "index",
|
||||||
component: (resolve) => require(["@/views/cost/raw/costMaterial/index"], resolve),
|
component: (resolve) => require(["@/views/core/base/factory/index"], resolve),
|
||||||
name: "首页",
|
name: "首页",
|
||||||
meta: { title: "首页", icon: "dashboard", affix: true },
|
meta: { title: "首页", icon: "dashboard", affix: true },
|
||||||
hidden: true
|
hidden: true
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ export const DICT_TYPE = {
|
|||||||
// ============== PRODUCT - 产品模块 =============
|
// ============== PRODUCT - 产品模块 =============
|
||||||
UNIT_DICT: 'unit_dict',
|
UNIT_DICT: 'unit_dict',
|
||||||
PRODUCT_TYPE: 'product_type',
|
PRODUCT_TYPE: 'product_type',
|
||||||
|
PROCESS_TYPE: 'process_type',
|
||||||
|
|
||||||
// ============== ENERGY - 能源模块 =============
|
// ============== ENERGY - 能源模块 =============
|
||||||
ENERGY_UNIT: 'energy_unit',
|
ENERGY_UNIT: 'energy_unit',
|
||||||
|
|||||||
@@ -295,3 +295,15 @@ export function getPath(path) {
|
|||||||
}
|
}
|
||||||
return Math.floor(divisor/dividend*100)/100;
|
return Math.floor(divisor/dividend*100)/100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 通用千分位格式化函数
|
||||||
|
export function formatThousands(value) {
|
||||||
|
if (value === null || value === undefined) return '0'
|
||||||
|
|
||||||
|
// 清理已有逗号并转为数字
|
||||||
|
const numValue = Number(String(value).replace(/,/g, ''))
|
||||||
|
if (isNaN(numValue)) return '0'
|
||||||
|
|
||||||
|
// 支持小数处理
|
||||||
|
return numValue.toLocaleString('en-US')
|
||||||
|
}
|
||||||
116
src/views/base/dataBoard/components/CenterBottomL.vue
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
<template>
|
||||||
|
<div class='centerBottomL'>
|
||||||
|
<div class='title'>
|
||||||
|
<svg-icon icon-class="dataBoard3" class='icon'/>
|
||||||
|
<span>本月数据</span>
|
||||||
|
</div>
|
||||||
|
<div class='dataBox' style='top:50px'>
|
||||||
|
<p>
|
||||||
|
<span class='text'>总投入片数</span>
|
||||||
|
<span class='precent' :class='{precentR:monthData?.inputNumChange>=0,precentG:monthData?.inputNumChange<0}'>{{monthData?.inputNumChange || '-'}}%</span>
|
||||||
|
<img v-show='monthData?.inputNumChange<0' src="../../../../assets/images/dataBoard/arrDown.png" alt="" width='5' height='15'>
|
||||||
|
<img v-show='monthData?.inputNumChange>=0' src="../../../../assets/images/dataBoard/arrUp.png" alt="" width='5' height='15'>
|
||||||
|
</p>
|
||||||
|
<p class='num'>{{monthData?.inputNum ? formatThousands(monthData.inputNum) : '-'}}</p>
|
||||||
|
</div>
|
||||||
|
<div class='dataBox'style='top:180px'>
|
||||||
|
<p>
|
||||||
|
<span class='text'>总生产片数</span>
|
||||||
|
<span class='precent' :class='{precentR:monthData?.outputNumChange>=0,precentG:monthData?.outputNumChange<0}'>{{monthData?.outputNumChange || '-'}}%</span>
|
||||||
|
<img v-show='monthData?.outputNumChange<0' src="../../../../assets/images/dataBoard/arrDown.png" alt="" width='5' height='15'>
|
||||||
|
<img v-show='monthData?.outputNumChange>=0' src="../../../../assets/images/dataBoard/arrUp.png" alt="" width='5' height='15'>
|
||||||
|
</p>
|
||||||
|
<p class='num'>{{monthData?.outputNum ? formatThousands(monthData.outputNum) : '-'}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'CenterBottomL',
|
||||||
|
props: {
|
||||||
|
dataObj: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
dataObj(val) {
|
||||||
|
val.monthAndLastMonth && val.monthAndLastMonth.forEach(item => {
|
||||||
|
if (item.dataType === "本月") {
|
||||||
|
this.monthData = item
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
monthData:{}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.centerBottomL {
|
||||||
|
width: 337px;
|
||||||
|
height: 332px;
|
||||||
|
background: url('../../../../assets/images/dataBoard/center-bottom.png') no-repeat;
|
||||||
|
background-size: 100%;
|
||||||
|
position: absolute;
|
||||||
|
left: 440px;
|
||||||
|
bottom:23px;
|
||||||
|
.title {
|
||||||
|
margin: 7px 0 0 15px;
|
||||||
|
.icon {
|
||||||
|
width: 33px;
|
||||||
|
height: 33px;
|
||||||
|
margin-right: 5px;
|
||||||
|
vertical-align:middle;
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
span {
|
||||||
|
font-size: 24px;
|
||||||
|
color: #52FFF1;
|
||||||
|
line-height: 24px;
|
||||||
|
vertical-align:middle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.dataBox {
|
||||||
|
width: 290px;
|
||||||
|
height: 135px;
|
||||||
|
background: url('../../../../assets/images/dataBoard/numberBox.png') no-repeat;
|
||||||
|
background-size: 100%;
|
||||||
|
position: absolute;
|
||||||
|
padding:22px 0 0 16px;
|
||||||
|
left: 24px;
|
||||||
|
p{
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.text {
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 20px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
||||||
|
.precent {
|
||||||
|
font-size: 18px;
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
.precentR {
|
||||||
|
color: #FF271D;
|
||||||
|
}
|
||||||
|
.precentG {
|
||||||
|
color: #34F716;
|
||||||
|
}
|
||||||
|
.num {
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 38px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
100
src/views/base/dataBoard/components/CenterBottomR.vue
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
<template>
|
||||||
|
<div class='centerBottomR'>
|
||||||
|
<div class='title'>
|
||||||
|
<svg-icon icon-class="dataBoard3" class='icon'/>
|
||||||
|
<span>上月数据</span>
|
||||||
|
</div>
|
||||||
|
<div class='dataBox' style='top:50px'>
|
||||||
|
<p>
|
||||||
|
<span class='text'>总投入片数</span>
|
||||||
|
</p>
|
||||||
|
<p class='num'>{{lastMonthData?.inputNum ? formatThousands(lastMonthData.inputNum) : '-'}}</p>
|
||||||
|
</div>
|
||||||
|
<div class='dataBox'style='top:180px'>
|
||||||
|
<p>
|
||||||
|
<span class='text'>总生产片数</span>
|
||||||
|
</p>
|
||||||
|
<p class='num'>{{lastMonthData?.outputNum ? formatThousands(lastMonthData.outputNum) : '-'}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'CenterBottomR',
|
||||||
|
props: {
|
||||||
|
dataObj: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
dataObj(val) {
|
||||||
|
val.monthAndLastMonth && val.monthAndLastMonth.forEach(item => {
|
||||||
|
if (item.dataType === "上月") {
|
||||||
|
this.lastMonthData = item
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
lastMonthData:{}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.centerBottomR {
|
||||||
|
width: 337px;
|
||||||
|
height: 332px;
|
||||||
|
background: url('../../../../assets/images/dataBoard/center-bottom.png') no-repeat;
|
||||||
|
background-size: 100%;
|
||||||
|
position: absolute;
|
||||||
|
left: 791px;
|
||||||
|
bottom:23px;
|
||||||
|
.title {
|
||||||
|
margin: 7px 0 0 15px;
|
||||||
|
.icon {
|
||||||
|
width: 33px;
|
||||||
|
height: 33px;
|
||||||
|
margin-right: 5px;
|
||||||
|
vertical-align:middle;
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
span {
|
||||||
|
font-size: 24px;
|
||||||
|
color: #52FFF1;
|
||||||
|
line-height: 24px;
|
||||||
|
vertical-align:middle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.dataBox {
|
||||||
|
width: 290px;
|
||||||
|
height: 135px;
|
||||||
|
background: url('../../../../assets/images/dataBoard/numberBox.png') no-repeat;
|
||||||
|
background-size: 100%;
|
||||||
|
position: absolute;
|
||||||
|
padding:22px 0 0 16px;
|
||||||
|
left: 24px;
|
||||||
|
p{
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.text {
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 20px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
||||||
|
.num {
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 38px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
352
src/views/base/dataBoard/components/CenterTop.vue
Normal file
@@ -0,0 +1,352 @@
|
|||||||
|
<template>
|
||||||
|
<div ref="centerTopBox" class='centerTopBox'>
|
||||||
|
<div>
|
||||||
|
<video src="/static/videos/01.webm" muted autoplay loop class='videoStyle'></video>
|
||||||
|
<div
|
||||||
|
class='eqTipBox'
|
||||||
|
v-show='showTooltip'
|
||||||
|
:style="'left:'+tooltipStyle.left+'px;top:'+tooltipStyle.top+'px;'"
|
||||||
|
>
|
||||||
|
<p><span class='eqTipTitle'>设备名称:</span><span class='eqTipNum'>{{eqTipMsg.name}}</span></p>
|
||||||
|
<p><span class='eqTipTitle'>进口数量:</span><span class='eqTipNum'>{{eqTipMsg.input}}</span></p>
|
||||||
|
<p><span class='eqTipTitle'>出口数量:</span><span class='eqTipNum'>{{eqTipMsg.output}}</span></p>
|
||||||
|
<p><span class='eqTipTitle'>报警状态:</span>
|
||||||
|
<span class='eqTipNum'>
|
||||||
|
<img v-show='eqTipMsg.alarm' :src='dotY' width='16'/>
|
||||||
|
<img v-show='!eqTipMsg.alarm' :src='dotG' width='16'/>
|
||||||
|
{{eqTipMsg.alarm?'报警':'未报警'}}
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
<p><span class='eqTipTitle'>在线状态:</span>
|
||||||
|
<span class='eqTipNum'>
|
||||||
|
<img v-show='eqTipMsg.status' :src='dotG' width='16'/>
|
||||||
|
<img v-show='!eqTipMsg.status' :src='dotR' width='16'/>
|
||||||
|
{{eqTipMsg.status?'在线':'离线'}}
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<!-- 设备 -->
|
||||||
|
<div class='eqBox'>
|
||||||
|
<!-- line-从上到下-从右往左 -->
|
||||||
|
<span
|
||||||
|
v-for='(item,index) in eqList'
|
||||||
|
:key='index'
|
||||||
|
:style="'width:'+item.w+'px;height:'+item.h+'px;left:'+item.l+'px;top:'+item.t+'px'"
|
||||||
|
@mouseenter="handleMouseEnter(item, $event)"
|
||||||
|
@mouseleave="handleMouseLeave"
|
||||||
|
></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class='centerTopTopBox'>
|
||||||
|
<div style='display: inline-block;'>
|
||||||
|
<img src="../../../../assets/images/dataBoard/centerNumB.png" alt="" width='203'>
|
||||||
|
<p class='num'>{{dataObj?.productRate || '-'}}%</p>
|
||||||
|
<p class='title'>成品率</p>
|
||||||
|
</div>
|
||||||
|
<div style='display: inline-block;'>
|
||||||
|
<img src="../../../../assets/images/dataBoard/centerNumY.png" alt="" width='261'>
|
||||||
|
<p class='num' style='width: 260px;padding-left: 20px;'>{{dataObj?.todayProduct ? formatThousands(dataObj.todayProduct) : '-'}}</p>
|
||||||
|
<p class='title' style='color:#FFB625'>今日产量</p>
|
||||||
|
</div>
|
||||||
|
<div style='display: inline-block;'>
|
||||||
|
<img src="../../../../assets/images/dataBoard/centerNumY.png" alt="" width='261'>
|
||||||
|
<p class='num' style='width: 260px;padding-left: 20px;'>{{dataObj?.monthProduct ? formatThousands(dataObj.monthProduct) : '-'}}</p>
|
||||||
|
<p class='title' style='color:#FFB625'>本月产量</p>
|
||||||
|
</div>
|
||||||
|
<div style='display: inline-block;'>
|
||||||
|
<img src="../../../../assets/images/dataBoard/centerNumB.png" alt="" width='203'>
|
||||||
|
<p class='num'>{{dataObj?.alarmNum ? formatThousands(dataObj.alarmNum) : '-'}}</p>
|
||||||
|
<p class='title'>设备报警数</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'CenterTop',
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
showTooltip:false,
|
||||||
|
tooltipStyle: {
|
||||||
|
left: 0,
|
||||||
|
top: 0
|
||||||
|
},
|
||||||
|
dotY:require('../../../../assets/images/dataBoard/dotY.png'),
|
||||||
|
dotR:require('../../../../assets/images/dataBoard/dotR.png'),
|
||||||
|
dotG:require('../../../../assets/images/dataBoard/dotG.png'),
|
||||||
|
eqList:[
|
||||||
|
{name:'A1-磨边机-1',id:100301,w:70,h:18,l:830,t:160},
|
||||||
|
{name:'A1-磨边机-2',id:100302,w:70,h:18,l:830,t:183},
|
||||||
|
{name:'A1-磨边机-3',id:100303,w:70,h:18,l:832,t:206},
|
||||||
|
{name:'A1-磨边后清洗机-1',id:100401,w:30,h:15,l:798,t:160},
|
||||||
|
{name:'A1-磨边后清洗机-2',id:100402,w:30,h:15,l:798,t:183},
|
||||||
|
{name:'A1-磨边后清洗机-3',id:100403,w:30,h:15,l:800,t:206},
|
||||||
|
{name:'A1-打孔机-1',id:100501,w:13,h:12,l:730,t:163},
|
||||||
|
{name:'A1-打孔机-2',id:100502,w:13,h:12,l:730,t:187},
|
||||||
|
{name:'A1-打孔机-3',id:100503,w:13,h:12,l:730,t:210},
|
||||||
|
{name:'A1-打孔后清洗机-1',id:100601,w:32,h:15,l:665,t:160},
|
||||||
|
{name:'A1-打孔后清洗机-2',id:100602,w:32,h:15,l:665,t:183},
|
||||||
|
{name:'A1-打孔后清洗机-3',id:100603,w:32,h:15,l:665,t:206},
|
||||||
|
{name:'A1-丝印机-1',id:100701,w:30,h:12,l:605,t:163},
|
||||||
|
{name:'A1-丝印机-2',id:100702,w:30,h:12,l:605,t:187},
|
||||||
|
{name:'A1-丝印机-3',id:100703,w:30,h:12,l:605,t:210},
|
||||||
|
{name:'A1-丝印后固化机-1',id:101301,w:37,h:12,l:558,t:163},
|
||||||
|
{name:'A1-丝印后固化机-2',id:101302,w:37,h:12,l:558,t:187},
|
||||||
|
{name:'A1-丝印后固化机-3',id:101303,w:37,h:12,l:558,t:210},
|
||||||
|
{name:'A1-钢化炉',id:101401,w:75,h:15,l:382,t:209},
|
||||||
|
{name:'A1-包装清洗机-1',id:101501,w:30,h:15,l:228,t:173},
|
||||||
|
{name:'A1-包装清洗机-2',id:101502,w:30,h:15,l:228,t:206},
|
||||||
|
{name:'A1-铺纸机-1',id:101601,w:18,h:15,l:188,t:175},
|
||||||
|
{name:'A1-铺纸机-2',id:101602,w:18,h:15,l:188,t:206},
|
||||||
|
|
||||||
|
{name:'A2-磨边机-1',id:200301,w:70,h:18,l:832,t:233},
|
||||||
|
{name:'A2-磨边机-2',id:200302,w:70,h:18,l:833,t:257},
|
||||||
|
{name:'A2-磨边机-3',id:200303,w:70,h:18,l:834,t:281},
|
||||||
|
{name:'A2-磨边后清洗机-1',id:200401,w:30,h:15,l:800,t:233},
|
||||||
|
{name:'A2-磨边后清洗机-2',id:200402,w:30,h:15,l:801,t:257},
|
||||||
|
{name:'A2-磨边后清洗机-3',id:200403,w:30,h:15,l:802,t:281},
|
||||||
|
{name:'A2-打孔机-1',id:200501,w:13,h:12,l:731,t:240},
|
||||||
|
{name:'A2-打孔机-2',id:200502,w:13,h:12,l:731,t:262},
|
||||||
|
{name:'A2-打孔机-3',id:200503,w:13,h:12,l:731,t:285},
|
||||||
|
{name:'A2-打孔后清洗机-1',id:200601,w:32,h:15,l:666,t:234},
|
||||||
|
{name:'A2-打孔后清洗机-2',id:200602,w:32,h:15,l:666,t:258},
|
||||||
|
{name:'A2-打孔后清洗机-3',id:200603,w:32,h:15,l:666,t:282},
|
||||||
|
{name:'A2-丝印机-1',id:200701,w:30,h:12,l:605,t:238},
|
||||||
|
{name:'A2-丝印机-2',id:200702,w:30,h:12,l:605,t:262},
|
||||||
|
{name:'A2-丝印机-3',id:200703,w:30,h:12,l:605,t:286},
|
||||||
|
{name:'A2-丝印后固化机-1',id:201301,w:37,h:12,l:558,t:238},
|
||||||
|
{name:'A2-丝印后固化机-2',id:201302,w:37,h:12,l:558,t:262},
|
||||||
|
{name:'A2-丝印后固化机-3',id:201303,w:37,h:12,l:558,t:286},
|
||||||
|
{name:'A2-钢化炉',id:201401,w:75,h:15,l:382,t:238},
|
||||||
|
{name:'A2-包装清洗机-1',id:201501,w:30,h:15,l:228,t:234},
|
||||||
|
{name:'A2-包装清洗机-2',id:201502,w:30,h:15,l:228,t:267},
|
||||||
|
{name:'A2-铺纸机-1',id:201601,w:18,h:15,l:187,t:234},
|
||||||
|
{name:'A2-铺纸机-2',id:201602,w:18,h:15,l:186,t:267},
|
||||||
|
|
||||||
|
{name:'A3-磨边机-1',id:300301,w:70,h:18,l:834,t:318},
|
||||||
|
{name:'A3-磨边机-2',id:300302,w:70,h:18,l:834,t:342},
|
||||||
|
{name:'A3-磨边后清洗机-1',id:300401,w:30,h:15,l:802,t:319},
|
||||||
|
{name:'A3-磨边后清洗机-2',id:300402,w:30,h:15,l:802,t:342},
|
||||||
|
{name:'A3-打孔机-1',id:300501,w:13,h:12,l:731,t:324},
|
||||||
|
{name:'A3-打孔机-2',id:300502,w:13,h:12,l:731,t:348},
|
||||||
|
{name:'A3-打孔后清洗机-1',id:300601,w:32,h:15,l:666,t:320},
|
||||||
|
{name:'A3-打孔后清洗机-2',id:300602,w:32,h:15,l:666,t:342},
|
||||||
|
{name:'A3-丝印机-1',id:300701,w:30,h:12,l:605,t:324},
|
||||||
|
{name:'A3-丝印机-2',id:300702,w:30,h:12,l:605,t:348},
|
||||||
|
{name:'A3-一次镀膜机-1',id:300801,w:20,h:15,l:553,t:322},
|
||||||
|
{name:'A3-一次镀膜机-2',id:300802,w:20,h:15,l:553,t:346},
|
||||||
|
{name:'A3-丝印后固化机-1',id:301301,w:37,h:12,l:506,t:324},
|
||||||
|
{name:'A3-丝印后固化机-2',id:301302,w:37,h:12,l:506,t:347},
|
||||||
|
{name:'A3-钢化炉',id:301401,w:75,h:15,l:340,t:346},
|
||||||
|
{name:'A3-包装清洗机-1',id:301501,w:30,h:15,l:240,t:343},
|
||||||
|
{name:'A3-铺纸机-1',id:301601,w:18,h:15,l:200,t:343},
|
||||||
|
{name:'A3-铺纸机-2',id:301602,w:18,h:15,l:170,t:343},
|
||||||
|
|
||||||
|
{name:'A4-磨边机-1',id:400301,w:70,h:18,l:838,t:380},
|
||||||
|
{name:'A4-磨边机-2',id:400302,w:70,h:18,l:838,t:405},
|
||||||
|
{name:'A4-磨边机-3',id:400303,w:70,h:18,l:839,t:428},
|
||||||
|
{name:'A4-磨边后清洗机-1',id:400401,w:30,h:15,l:804,t:380},
|
||||||
|
{name:'A4-磨边后清洗机-2',id:400402,w:30,h:15,l:805,t:405},
|
||||||
|
{name:'A4-磨边后清洗机-3',id:400403,w:30,h:15,l:806,t:427},
|
||||||
|
{name:'A4-一次镀膜机-1',id:400801,w:20,h:15,l:707,t:381},
|
||||||
|
{name:'A4-一次镀膜机-2',id:400802,w:20,h:15,l:707,t:407},
|
||||||
|
{name:'A4-一次镀膜机-3',id:400803,w:20,h:15,l:707,t:429},
|
||||||
|
{name:'A4-一次固化机-1',id:401001,w:37,h:12,l:660,t:383},
|
||||||
|
{name:'A4-一次固化机-2',id:401002,w:37,h:12,l:660,t:409},
|
||||||
|
{name:'A4-一次固化机-3',id:401003,w:37,h:12,l:660,t:431},
|
||||||
|
{name:'A4-二次镀膜机-1',id:401101,w:20,h:15,l:605,t:382},
|
||||||
|
{name:'A4-二次镀膜机-2',id:401102,w:20,h:15,l:605,t:408},
|
||||||
|
{name:'A4-二次镀膜机-3',id:401103,w:20,h:15,l:605,t:430},
|
||||||
|
{name:'A4-二次固化机-1',id:401201,w:37,h:12,l:557,t:383},
|
||||||
|
{name:'A4-二次固化机-2',id:401202,w:37,h:12,l:557,t:409},
|
||||||
|
{name:'A4-二次固化机-3',id:401203,w:37,h:12,l:557,t:431},
|
||||||
|
{name:'A4-钢化炉',id:401401,w:75,h:15,l:379,t:381},
|
||||||
|
{name:'A4-包装清洗机-1',id:401501,w:30,h:15,l:220,t:379},
|
||||||
|
{name:'A4-包装清洗机-2',id:401502,w:30,h:18,l:220,t:410},
|
||||||
|
{name:'A4-铺纸机-1',id:401601,w:18,h:15,l:180,t:381},
|
||||||
|
{name:'A4-铺纸机-2',id:401602,w:18,h:15,l:180,t:414},
|
||||||
|
|
||||||
|
{name:'A5-磨边机-1',id:500301,w:70,h:18,l:817,t:465},
|
||||||
|
{name:'A5-磨边机-2',id:500302,w:70,h:18,l:817,t:488},
|
||||||
|
{name:'A5-磨边机-3',id:500303,w:70,h:18,l:819,t:512},
|
||||||
|
{name:'A5-磨边后清洗机-1',id:500401,w:30,h:15,l:784,t:462},
|
||||||
|
{name:'A5-磨边后清洗机-2',id:500402,w:30,h:15,l:784,t:488},
|
||||||
|
{name:'A5-磨边后清洗机-3',id:500403,w:30,h:15,l:785,t:512},
|
||||||
|
{name:'A5-一次镀膜机-1',id:500801,w:20,h:15,l:685,t:466},
|
||||||
|
{name:'A5-一次镀膜机-2',id:500802,w:20,h:15,l:685,t:490},
|
||||||
|
{name:'A5-一次镀膜机-3',id:500803,w:20,h:15,l:685,t:513},
|
||||||
|
{name:'A5-一次固化机-1',id:501001,w:37,h:12,l:638,t:468},
|
||||||
|
{name:'A5-一次固化机-2',id:501002,w:37,h:12,l:638,t:491},
|
||||||
|
{name:'A5-一次固化机-3',id:501003,w:37,h:12,l:638,t:514},
|
||||||
|
{name:'A5-二次镀膜机-1',id:501101,w:20,h:15,l:584,t:468},
|
||||||
|
{name:'A5-二次镀膜机-2',id:501102,w:20,h:15,l:584,t:490},
|
||||||
|
{name:'A5-二次镀膜机-3',id:501103,w:20,h:15,l:584,t:513},
|
||||||
|
{name:'A5-二次固化机-1',id:501201,w:37,h:12,l:535,t:468},
|
||||||
|
{name:'A5-二次固化机-2',id:501202,w:37,h:12,l:535,t:492},
|
||||||
|
{name:'A5-二次固化机-3',id:501203,w:37,h:12,l:535,t:514},
|
||||||
|
{name:'A5-钢化炉',id:501401,w:75,h:15,l:344,t:513},
|
||||||
|
{name:'A5-包装清洗机-1',id:501501,w:30,h:18,l:185,t:473},
|
||||||
|
{name:'A5-包装清洗机-2',id:501502,w:30,h:18,l:185,t:511},
|
||||||
|
{name:'A5-铺纸机-1',id:501601,w:18,h:15,l:144,t:475},
|
||||||
|
{name:'A5-铺纸机-2',id:501602,w:18,h:15,l:144,t:511}
|
||||||
|
],
|
||||||
|
eqTipMsg:{
|
||||||
|
name:'',
|
||||||
|
input:null,
|
||||||
|
output:null,
|
||||||
|
alarm:'未报警',
|
||||||
|
status:'在线'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
scaleNum: {
|
||||||
|
type: Number,
|
||||||
|
default: 1
|
||||||
|
},
|
||||||
|
dataObj: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
scaleNum(val) {
|
||||||
|
this.scaleNum = val
|
||||||
|
},
|
||||||
|
dataObj(val) {
|
||||||
|
val.equipmentDets && val.equipmentDets.forEach(item => {
|
||||||
|
this.eqList.forEach(eq => {
|
||||||
|
if (eq.id == item.id) {
|
||||||
|
eq.name = item.name
|
||||||
|
eq.input = item.input
|
||||||
|
eq.output = item.output
|
||||||
|
eq.alarm = item.isError
|
||||||
|
eq.status = item.isRun
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {},
|
||||||
|
methods: {
|
||||||
|
// 鼠标hover事件
|
||||||
|
handleMouseEnter(item, event) {
|
||||||
|
this.showTooltip = true;
|
||||||
|
this.eqTipMsg.name = item.name;
|
||||||
|
this.eqTipMsg.input = item.input;
|
||||||
|
this.eqTipMsg.output = item.output;
|
||||||
|
this.eqTipMsg.alarm = item.alarm;
|
||||||
|
this.eqTipMsg.status = item.status;
|
||||||
|
this.updateTooltipPosition(event);
|
||||||
|
},
|
||||||
|
handleMouseLeave() {
|
||||||
|
this.showTooltip = false;
|
||||||
|
},
|
||||||
|
updateTooltipPosition(event) {
|
||||||
|
const rect = this.$refs.centerTopBox.getBoundingClientRect()
|
||||||
|
const offset = 15;
|
||||||
|
const tooltipWidth = 315*this.scaleNum;
|
||||||
|
const tooltipHeight = 170*this.scaleNum;
|
||||||
|
const startX = rect.left;
|
||||||
|
const startY = rect.top;
|
||||||
|
const endX = rect.width;
|
||||||
|
const endY = rect.height;
|
||||||
|
let posX = event.clientX-startX + offset;
|
||||||
|
let posY = event.clientY-startY + offset;
|
||||||
|
if (posX + tooltipWidth > endX) {
|
||||||
|
posX = event.clientX-startX - tooltipWidth - offset;
|
||||||
|
}
|
||||||
|
if (posY + tooltipHeight > endY) {
|
||||||
|
posY = event.clientY -startY - tooltipHeight - offset;
|
||||||
|
}
|
||||||
|
this.tooltipStyle.left = posX/this.scaleNum;
|
||||||
|
this.tooltipStyle.top = posY/this.scaleNum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
p{
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.centerTopBox {
|
||||||
|
width: 1041px;
|
||||||
|
height: 600px;
|
||||||
|
background: url('../../../../assets/images/dataBoard/center-top.png') no-repeat;
|
||||||
|
background-size: 100%;
|
||||||
|
position: absolute;
|
||||||
|
left: 440px;
|
||||||
|
top:113px;
|
||||||
|
overflow: hidden;
|
||||||
|
.videoStyle {
|
||||||
|
width: 1920px;
|
||||||
|
height: 1080px;
|
||||||
|
position: absolute;
|
||||||
|
left:-440px;
|
||||||
|
top:-113px;
|
||||||
|
}
|
||||||
|
.eqTipBox {
|
||||||
|
width: 315px;
|
||||||
|
height: 170px;
|
||||||
|
background: url('../../../../assets/images/dataBoard/eq-tip.png') no-repeat;
|
||||||
|
background-size: 100%;
|
||||||
|
position: absolute;
|
||||||
|
padding-top: 10px;
|
||||||
|
z-index: 1;
|
||||||
|
span{
|
||||||
|
display: inline-block;
|
||||||
|
font-size: 20px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.eqTipTitle {
|
||||||
|
width: 112px;
|
||||||
|
height: 30px;
|
||||||
|
padding-left: 15px;
|
||||||
|
}
|
||||||
|
.eqTipNum {
|
||||||
|
width: 190px;
|
||||||
|
height: 30px;
|
||||||
|
line-height: 30px;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.eqBox {
|
||||||
|
span{
|
||||||
|
display: inline-block;
|
||||||
|
// border: 1px solid red;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.centerTopTopBox {
|
||||||
|
padding-left: 48px;
|
||||||
|
position: absolute;
|
||||||
|
top:30px;
|
||||||
|
.num {
|
||||||
|
width: 203px;
|
||||||
|
height: 65px;
|
||||||
|
line-height: 65px;
|
||||||
|
padding-left: 10px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 38px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
text-shadow: 0px 5px 2px rgba(0,0,0,0.62);
|
||||||
|
text-align: center;
|
||||||
|
position: absolute;
|
||||||
|
top:0px;
|
||||||
|
}
|
||||||
|
.title {
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 20px;
|
||||||
|
color: #00C8F7;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
text-shadow: 0px 5px 2px rgba(0,0,0,0.62);
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
108
src/views/base/dataBoard/components/Header.vue
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
<template>
|
||||||
|
<header class="dataBoardHeader">
|
||||||
|
<div class='topTitle'></div>
|
||||||
|
<!-- <div class='time-chsoose'>
|
||||||
|
<span class='title'>时间选择</span>
|
||||||
|
<span class='time-show'>{{time}}</span>
|
||||||
|
<el-date-picker
|
||||||
|
v-model="time"
|
||||||
|
type="date"
|
||||||
|
value-format='yyyy-MM-dd'
|
||||||
|
:clearable='false'
|
||||||
|
style='position: absolute;right: 0px;width: 119px;top:-2px;opacity: 0;'
|
||||||
|
>
|
||||||
|
</el-date-picker>
|
||||||
|
</div> -->
|
||||||
|
<div
|
||||||
|
type="text"
|
||||||
|
class="screen-btn"
|
||||||
|
:title="isFullScreen?'退出全屏':'全屏'"
|
||||||
|
@click="changeFullScreen"
|
||||||
|
>
|
||||||
|
<svg-icon v-if="isFullScreen" icon-class="unFullScreenView" />
|
||||||
|
<svg-icon v-else icon-class="fullScreenView" />
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// import moment from 'moment'
|
||||||
|
export default {
|
||||||
|
name: 'DataBoardHeader',
|
||||||
|
props: {
|
||||||
|
isFullScreen: {
|
||||||
|
type: Boolean,
|
||||||
|
default: () => {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// time: moment().format('YYYY-MM-DD')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {},
|
||||||
|
methods: {
|
||||||
|
changeFullScreen() {
|
||||||
|
this.$emit('screenfullChange')
|
||||||
|
},
|
||||||
|
exportPDF() {
|
||||||
|
this.$emit('exportPDF')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.dataBoardHeader {
|
||||||
|
background: url('../../../../assets/images/dataBoard/head.png') no-repeat;
|
||||||
|
height: 99px;
|
||||||
|
background-size: 100%;
|
||||||
|
background-position: 0 0;
|
||||||
|
position: relative;
|
||||||
|
.topTitle{
|
||||||
|
width: 465px;
|
||||||
|
height: 77px;
|
||||||
|
background: url('../../../../assets/images/dataBoard/data-board-title.png') no-repeat;
|
||||||
|
background-size: 100%;
|
||||||
|
position: absolute;
|
||||||
|
left: 731px;
|
||||||
|
top:19px;
|
||||||
|
}
|
||||||
|
.time-chsoose {
|
||||||
|
width: 212px;
|
||||||
|
height: 33px;
|
||||||
|
background: url('../../../../assets/images/dataBoard/time-choose.png') no-repeat;
|
||||||
|
background-size: 100%;
|
||||||
|
position: absolute;
|
||||||
|
right: 63px;
|
||||||
|
top:49px;
|
||||||
|
.title {
|
||||||
|
font-size: 18px;
|
||||||
|
color: #082049;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
position: relative;
|
||||||
|
top: 4px;
|
||||||
|
left: 8px
|
||||||
|
}
|
||||||
|
.time-show {
|
||||||
|
font-size: 18px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
line-height: 18px;
|
||||||
|
position: relative;
|
||||||
|
top: 4px;
|
||||||
|
left: 28px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.screen-btn{
|
||||||
|
color: #00fff0;
|
||||||
|
height: 32px;
|
||||||
|
line-height: 32px;
|
||||||
|
font-size: 32px;
|
||||||
|
position: absolute;
|
||||||
|
right: 22px;
|
||||||
|
top:47px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
284
src/views/base/dataBoard/components/LeftBottom.vue
Normal file
@@ -0,0 +1,284 @@
|
|||||||
|
<template>
|
||||||
|
<div class='leftBottomBox'>
|
||||||
|
<div class='title'>
|
||||||
|
<svg-icon icon-class="dataBoard2" class='icon'/>
|
||||||
|
<span>投入产出及良品率</span>
|
||||||
|
</div>
|
||||||
|
<div v-if='xData.length === 0' class='noData'>暂无数据</div>
|
||||||
|
<div v-else>
|
||||||
|
<div class="top_legend">
|
||||||
|
<span class="chart_legend_icon1">投入</span>
|
||||||
|
<span class="chart_legend_icon2">产出</span>
|
||||||
|
<span><span class="chart_legend_icon3"></span>良品率</span>
|
||||||
|
</div>
|
||||||
|
<div id='inOutputChart' style='width: 400px;height: 290px;'></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
export default {
|
||||||
|
name: 'LeftBottom',
|
||||||
|
props: {
|
||||||
|
dataObj: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
dataObj(val) {
|
||||||
|
this.xData = []
|
||||||
|
this.inputData = []
|
||||||
|
this.outputData = []
|
||||||
|
this.goodRateData = []
|
||||||
|
val.monthBar && val.monthBar.forEach(item => {
|
||||||
|
this.xData.push(item.dataType)
|
||||||
|
this.inputData.push(item.inputNum)
|
||||||
|
this.outputData.push(item.outputNum)
|
||||||
|
this.goodRateData.push(item.goodRate)
|
||||||
|
})
|
||||||
|
this.initChart();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
chartDom: '',
|
||||||
|
chart: '',
|
||||||
|
xData:[],
|
||||||
|
inputData:[],
|
||||||
|
outputData:[],
|
||||||
|
goodRateData:[],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {},
|
||||||
|
methods: {
|
||||||
|
initChart() {
|
||||||
|
if (
|
||||||
|
this.chart !== null &&
|
||||||
|
this.chart !== '' &&
|
||||||
|
this.chart !== undefined
|
||||||
|
) {
|
||||||
|
this.chart.dispose() // 页面多次刷新会出现警告,Dom已经初始化了一个实例,这是销毁实例
|
||||||
|
}
|
||||||
|
this.chartDom = document.getElementById('inOutputChart')
|
||||||
|
this.chart = echarts.init(this.chartDom)
|
||||||
|
var option;
|
||||||
|
option = {
|
||||||
|
grid: { top: 40, right: 10, bottom: 5, left: 10, containLabel: true },
|
||||||
|
legend: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
type: "category",
|
||||||
|
data: this.xData,
|
||||||
|
axisLabel: {
|
||||||
|
color: "#fff",
|
||||||
|
fontSize: 10,
|
||||||
|
interval: 0,
|
||||||
|
rotate:30
|
||||||
|
},
|
||||||
|
axisTick: { show: false },
|
||||||
|
axisLine: {
|
||||||
|
lineStyle: {
|
||||||
|
width: 2,
|
||||||
|
color: "#5982B2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
yAxis: [{
|
||||||
|
name: "单位/片",
|
||||||
|
nameTextStyle: {
|
||||||
|
color: "#DFF1FE",
|
||||||
|
fontSize: 12,
|
||||||
|
},
|
||||||
|
type: "value",
|
||||||
|
axisLabel: {
|
||||||
|
color: "#DFF1FE",
|
||||||
|
fontSize: 12,
|
||||||
|
formatter: "{value}",
|
||||||
|
},
|
||||||
|
axisLine: {
|
||||||
|
show: true,
|
||||||
|
lineStyle: {
|
||||||
|
width: 2,
|
||||||
|
color: "#5982B2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
splitLine: {
|
||||||
|
lineStyle: {
|
||||||
|
width: 2,
|
||||||
|
color: "#5982B2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},{
|
||||||
|
name: "良品率/%",
|
||||||
|
nameTextStyle: {
|
||||||
|
color: "#DFF1FE",
|
||||||
|
fontSize: 12,
|
||||||
|
},
|
||||||
|
type: "value",
|
||||||
|
axisLabel: {
|
||||||
|
color: "#DFF1FE",
|
||||||
|
fontSize: 12,
|
||||||
|
formatter: "{value}",
|
||||||
|
},
|
||||||
|
axisLine: {
|
||||||
|
show: true,
|
||||||
|
lineStyle: {
|
||||||
|
width: 2,
|
||||||
|
color: "#5982B2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
splitLine: {
|
||||||
|
lineStyle: {
|
||||||
|
width: 2,
|
||||||
|
color: "#5982B2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}],
|
||||||
|
tooltip: {
|
||||||
|
trigger: "axis",
|
||||||
|
axisPointer: {
|
||||||
|
type: "shadow",
|
||||||
|
},
|
||||||
|
className: "qhd-chart-tooltip",
|
||||||
|
show: true,
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
data: this.inputData,
|
||||||
|
type: "bar",
|
||||||
|
barWidth: 10,
|
||||||
|
barGap:0,
|
||||||
|
itemStyle: {
|
||||||
|
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||||
|
{ offset: 0, color: 'rgba(157, 234, 245, 1)' },
|
||||||
|
{ offset: 1, color: 'rgba(110, 249, 222, 1)' },
|
||||||
|
]),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data:this.outputData,
|
||||||
|
type: "bar",
|
||||||
|
barWidth: 10,
|
||||||
|
itemStyle: {
|
||||||
|
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||||
|
{ offset: 0, color: 'rgba(92, 183, 255, 1)' },
|
||||||
|
{ offset: 1, color: 'rgba(54, 75, 254, 1)' },
|
||||||
|
]),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data:this.goodRateData,
|
||||||
|
type: "line",
|
||||||
|
yAxisIndex: 1,
|
||||||
|
symbol:'circle',
|
||||||
|
symbolSize: 7,
|
||||||
|
color:'rgba(18, 255, 245, 1)',
|
||||||
|
areaStyle: {
|
||||||
|
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||||
|
{ offset: 0, color: 'rgba(18, 255, 245, 0.8)' },
|
||||||
|
{ offset: 0.2, color: 'rgba(18, 255, 245, 0.2)' },
|
||||||
|
{ offset: 0.4, color: 'rgba(18, 255, 245, 0)' },
|
||||||
|
]),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
}
|
||||||
|
option && this.chart.setOption(option);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang='scss' scoped>
|
||||||
|
.leftBottomBox {
|
||||||
|
width: 402px;
|
||||||
|
height: 332px;
|
||||||
|
background: url('../../../../assets/images/dataBoard/left-bottom.png') no-repeat;
|
||||||
|
background-size: 100%;
|
||||||
|
position: absolute;
|
||||||
|
left: 23px;
|
||||||
|
bottom:23px;
|
||||||
|
.title {
|
||||||
|
margin: 7px 0 0 15px;
|
||||||
|
.icon {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
margin-right: 5px;
|
||||||
|
vertical-align:middle;
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
span {
|
||||||
|
font-size: 24px;
|
||||||
|
color: #52FFF1;
|
||||||
|
line-height: 24px;
|
||||||
|
vertical-align:middle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.top_legend {
|
||||||
|
color: #fff;
|
||||||
|
font-size: 14px;
|
||||||
|
position: absolute;
|
||||||
|
left:120px;
|
||||||
|
top:50px;
|
||||||
|
.chart_legend_icon1{
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
.chart_legend_icon2{
|
||||||
|
margin-right: 14px;
|
||||||
|
}
|
||||||
|
.chart_legend_icon1:before {
|
||||||
|
display: inline-block;
|
||||||
|
content: "";
|
||||||
|
width: 10px;
|
||||||
|
height: 10px;
|
||||||
|
margin-right: 5px;
|
||||||
|
border-radius: 2px;
|
||||||
|
background: #73F8E0;
|
||||||
|
}
|
||||||
|
.chart_legend_icon2:before {
|
||||||
|
display: inline-block;
|
||||||
|
content: "";
|
||||||
|
width: 10px;
|
||||||
|
height: 10px;
|
||||||
|
margin-right: 5px;
|
||||||
|
border-radius: 2px;
|
||||||
|
background: #497EFF;
|
||||||
|
}
|
||||||
|
.chart_legend_icon3 {
|
||||||
|
display: inline-block;
|
||||||
|
width: 8px;
|
||||||
|
height: 8px;
|
||||||
|
margin-right: 8px;
|
||||||
|
border-radius: 4px;
|
||||||
|
background: #73F8E0;
|
||||||
|
position:relative;
|
||||||
|
}
|
||||||
|
.chart_legend_icon3:before {
|
||||||
|
display: inline-block;
|
||||||
|
content: "";
|
||||||
|
width: 16px;
|
||||||
|
height:2px;
|
||||||
|
background: #73F8E0;
|
||||||
|
position:absolute;
|
||||||
|
top:3px;
|
||||||
|
left:-4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.noData {
|
||||||
|
font-size: 24px;
|
||||||
|
text-align: center;
|
||||||
|
padding-top: 100px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<style>
|
||||||
|
.qhd-chart-tooltip {
|
||||||
|
background: #0a2b4f77 !important;
|
||||||
|
border: none !important;
|
||||||
|
backdrop-filter: blur(12px);
|
||||||
|
}
|
||||||
|
.qhd-chart-tooltip * {
|
||||||
|
color: #fff !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
162
src/views/base/dataBoard/components/LeftTop.vue
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
<template>
|
||||||
|
<div class='leftTopBox'>
|
||||||
|
<div class='title'>
|
||||||
|
<svg-icon icon-class="dataBoard1" class='icon'/>
|
||||||
|
<span>近期数据对比</span>
|
||||||
|
</div>
|
||||||
|
<div class='title-split'>
|
||||||
|
<img src="../../../../assets//images/dataBoard/leftbar.png" alt="">
|
||||||
|
<span class='text'>本日</span>
|
||||||
|
<img src="../../../../assets//images/dataBoard/rightbar.png" alt="">
|
||||||
|
</div>
|
||||||
|
<div class='data-box'>
|
||||||
|
<div class='left-icon' style="top:19px;">
|
||||||
|
<img src="../../../../assets//images/dataBoard/leftTopIcon1.png" alt="" width='54'>
|
||||||
|
<div>总投入</div>
|
||||||
|
</div>
|
||||||
|
<div class='left-icon' style="top:139px;">
|
||||||
|
<img src="../../../../assets//images/dataBoard/leftTopIcon2.png" alt="" width='48'>
|
||||||
|
<div>总生产</div>
|
||||||
|
</div>
|
||||||
|
<div class='right-data' style="top:15px;">
|
||||||
|
<p><span class='num'>{{todayData?.inputNum ? formatThousands(todayData.inputNum) : '-'}}</span><span class='text'>片数</span></p>
|
||||||
|
<p><span class='num'>{{todayData?.inputArea ? formatThousands(todayData.inputArea) : '-'}}</span><span class='text'>面积/㎡</span></p>
|
||||||
|
</div>
|
||||||
|
<div class='right-data' style="top:132px;">
|
||||||
|
<p><span class='num'>{{todayData?.outputNum ? formatThousands(todayData.outputNum) : '-'}}</span><span class='text'>片数</span></p>
|
||||||
|
<p><span class='num'>{{todayData?.outputArea ? formatThousands(todayData.outputArea) : '-'}}</span><span class='text'>面积/㎡</span></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class='title-split'>
|
||||||
|
<img src="../../../../assets//images/dataBoard/leftbar.png" alt="">
|
||||||
|
<span class='text'>昨日</span>
|
||||||
|
<img src="../../../../assets//images/dataBoard/rightbar.png" alt="">
|
||||||
|
</div>
|
||||||
|
<div class='data-box'>
|
||||||
|
<div class='left-icon' style="top:19px;">
|
||||||
|
<img src="../../../../assets//images/dataBoard/leftTopIcon1.png" alt="" width='54'>
|
||||||
|
<div>总投入</div>
|
||||||
|
</div>
|
||||||
|
<div class='left-icon' style="top:139px;">
|
||||||
|
<img src="../../../../assets//images/dataBoard/leftTopIcon2.png" alt="" width='48'>
|
||||||
|
<div>总生产</div>
|
||||||
|
</div>
|
||||||
|
<div class='right-data' style="top:15px;">
|
||||||
|
<p><span class='num'>{{yesterdayData?.inputNum ? formatThousands(yesterdayData.inputNum) : '-'}}</span><span class='text'>片数</span></p>
|
||||||
|
<p><span class='num'>{{yesterdayData?.inputArea ? formatThousands(yesterdayData.inputArea) : '-'}}</span><span class='text'>面积/㎡</span></p>
|
||||||
|
</div>
|
||||||
|
<div class='right-data' style="top:132px;">
|
||||||
|
<p><span class='num'>{{yesterdayData?.outputNum ? formatThousands(yesterdayData.outputNum) : '-'}}</span><span class='text'>片数</span></p>
|
||||||
|
<p><span class='num'>{{yesterdayData?.outputArea ? formatThousands(yesterdayData.outputArea) : '-'}}</span><span class='text'>面积/㎡</span></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'LeftTop',
|
||||||
|
props: {
|
||||||
|
dataObj: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
dataObj(val) {
|
||||||
|
val.todayAndYesterday && val.todayAndYesterday.forEach(item => {
|
||||||
|
if (item.dataType === "今日") {
|
||||||
|
this.todayData = item
|
||||||
|
} else {
|
||||||
|
this.yesterdayData = item
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
todayData:{},
|
||||||
|
yesterdayData:{}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang='scss' scoped>
|
||||||
|
.leftTopBox {
|
||||||
|
width: 402px;
|
||||||
|
height: 600px;
|
||||||
|
background: url('../../../../assets/images/dataBoard/left-top.png') no-repeat;
|
||||||
|
background-size: 100%;
|
||||||
|
position: absolute;
|
||||||
|
left: 23px;
|
||||||
|
top:113px;
|
||||||
|
.title {
|
||||||
|
margin: 10px 0 0 15px;
|
||||||
|
.icon {
|
||||||
|
width: 33px;
|
||||||
|
height: 33px;
|
||||||
|
margin-right: 5px;
|
||||||
|
vertical-align:middle;
|
||||||
|
}
|
||||||
|
span {
|
||||||
|
font-size: 24px;
|
||||||
|
color: #52FFF1;
|
||||||
|
line-height: 24px;
|
||||||
|
vertical-align:middle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.title-split {
|
||||||
|
margin-left: 95px;
|
||||||
|
margin-top: 10px;
|
||||||
|
.text{
|
||||||
|
display: inline-block;
|
||||||
|
width: 100px;
|
||||||
|
font-size: 22px;
|
||||||
|
color: #01CFCC;
|
||||||
|
line-height: 24px;
|
||||||
|
letter-spacing: 7px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.data-box {
|
||||||
|
width: 358px;
|
||||||
|
height: 230px;
|
||||||
|
background: url('../../../../assets/images/dataBoard/leftTopDataBox.png') no-repeat;
|
||||||
|
background-size: 100%;
|
||||||
|
margin-top: 8px;
|
||||||
|
position: relative;
|
||||||
|
left: 24px;
|
||||||
|
.left-icon {
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 16px;
|
||||||
|
color: #9DEAF5;
|
||||||
|
line-height: 22px;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
text-shadow: 0px 4px 2px rgba(0,0,0,0.62);
|
||||||
|
position: absolute;
|
||||||
|
left: 30px;
|
||||||
|
}
|
||||||
|
.right-data {
|
||||||
|
position: absolute;
|
||||||
|
left: 100px;
|
||||||
|
p{
|
||||||
|
margin: 0;
|
||||||
|
};
|
||||||
|
.num {
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 32px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
text-shadow: 0px 4px 2px rgba(0,0,0,0.62);
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
.text {
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 16px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
text-shadow: 0px 4px 2px rgba(0,0,0,0.62);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
198
src/views/base/dataBoard/components/RightBottom.vue
Normal file
@@ -0,0 +1,198 @@
|
|||||||
|
<template>
|
||||||
|
<div class='rightBottomBox'>
|
||||||
|
<div class='title'>
|
||||||
|
<svg-icon icon-class="dataBoard3" class='icon'/>
|
||||||
|
<span>本月<span class='dotted'></span>班组生产排名</span>
|
||||||
|
</div>
|
||||||
|
<div class='rankingLeft'>
|
||||||
|
<div class='rankingLeftTitle'>产量</div>
|
||||||
|
<div class='rankingTypeBox'>
|
||||||
|
<div style='margin-bottom: 10px;' v-for='(item,index) in teamProductionRank' :key='index'>
|
||||||
|
<img :src="require(`../../../../assets/images/dataBoard/ranking${index+1}.png`)" alt="" width="50">
|
||||||
|
<div class='rankingTextBox'>
|
||||||
|
<p class='text1'>{{item.name}}/片</p>
|
||||||
|
<p class='text2'>{{item?.value ? formatThousands(item.value) : '-'}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class='rankingRight'>
|
||||||
|
<div class='rankingRightTitle'>
|
||||||
|
成品率
|
||||||
|
</div>
|
||||||
|
<div class='rankingTypeBox' style='left: 120px;'>
|
||||||
|
<div style='margin-bottom: 10px;' v-for='(item,index) in teamRateRank' :key='index'>
|
||||||
|
<img :src="require(`../../../../assets/images/dataBoard/ranking${index+1}.png`)" alt="" width="50">
|
||||||
|
<div class='rankingTextBox'>
|
||||||
|
<p class='text1'>{{item.name}}</p>
|
||||||
|
<p class='text2'>{{Math.trunc(item.value)}}<span style='font-size: 20px;'>.{{item.value1}}%</span></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- <div>
|
||||||
|
<img src="../../../../assets//images//dataBoard/ranking2.png" alt="" width='50'>
|
||||||
|
<div class='rankingTextBox'>
|
||||||
|
<p class='text1'>班组1</p>
|
||||||
|
<p class='text2'>94<span style='font-size: 20px;'>.13%</span></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<img src="../../../../assets//images//dataBoard/ranking3.png" alt="" width='50'>
|
||||||
|
<div class='rankingTextBox'>
|
||||||
|
<p class='text1'>班组1</p>
|
||||||
|
<p class='text2'>90<span style='font-size: 20px;'>.42%</span></p>
|
||||||
|
</div>
|
||||||
|
</div> -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'RightBottom',
|
||||||
|
props: {
|
||||||
|
dataObj: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
dataObj(val) {
|
||||||
|
this.teamProductionRank = []
|
||||||
|
this.teamRateRank = []
|
||||||
|
val.teamProductionRank && val.teamProductionRank.forEach(item => {
|
||||||
|
let obj = {
|
||||||
|
name: item.name,
|
||||||
|
value: item.value,
|
||||||
|
rank: item.rank,
|
||||||
|
}
|
||||||
|
this.teamProductionRank.push(obj)
|
||||||
|
})
|
||||||
|
val.teamRateRank && val.teamRateRank.forEach(item => {
|
||||||
|
let obj = {
|
||||||
|
name: item.name,
|
||||||
|
value: item.value,
|
||||||
|
rank: item.rank,
|
||||||
|
value1: this.getPositiveDecimal(item.value)
|
||||||
|
}
|
||||||
|
this.teamRateRank.push(obj)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
teamProductionRank:[],
|
||||||
|
teamRateRank:[]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {},
|
||||||
|
methods: {
|
||||||
|
getPositiveDecimal(num) {
|
||||||
|
const str = Math.abs(num).toString();
|
||||||
|
const [, decimal] = str.split('.');
|
||||||
|
return decimal || '00';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang='scss' scoped>
|
||||||
|
p{
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.rightBottomBox {
|
||||||
|
width: 755px;
|
||||||
|
height: 332px;
|
||||||
|
background: url('../../../../assets/images/dataBoard/right-bottom.png') no-repeat;
|
||||||
|
background-size: 100%;
|
||||||
|
position: absolute;
|
||||||
|
right: 23px;
|
||||||
|
bottom:23px;
|
||||||
|
.title {
|
||||||
|
margin: 10px 0 0 15px;
|
||||||
|
.icon {
|
||||||
|
width: 33px;
|
||||||
|
height: 33px;
|
||||||
|
margin-right: 5px;
|
||||||
|
vertical-align:middle;
|
||||||
|
}
|
||||||
|
span {
|
||||||
|
font-size: 24px;
|
||||||
|
color: #52FFF1;
|
||||||
|
line-height: 24px;
|
||||||
|
vertical-align:middle;
|
||||||
|
.dotted {
|
||||||
|
display: inline-block;
|
||||||
|
width: 4px;
|
||||||
|
height: 4px;
|
||||||
|
border-radius: 2px;
|
||||||
|
background-color: #52FFF1;
|
||||||
|
margin: 0 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.rankingLeft {
|
||||||
|
width: 405px;
|
||||||
|
height: 265px;
|
||||||
|
background: url('../../../../assets/images/dataBoard/rankingBg1.png') no-repeat;
|
||||||
|
background-size: 100%;
|
||||||
|
position: absolute;
|
||||||
|
left: 12px;
|
||||||
|
top: 48px;
|
||||||
|
.rankingLeftTitle {
|
||||||
|
width: 24px;
|
||||||
|
height: 73px;
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 24px;
|
||||||
|
color: #52FFF1;
|
||||||
|
line-height: 55px;
|
||||||
|
position: relative;
|
||||||
|
left: 37px;
|
||||||
|
top: 63px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.rankingRight {
|
||||||
|
width: 338px;
|
||||||
|
height: 265px;
|
||||||
|
background: url('../../../../assets/images/dataBoard/rankingBg2.png') no-repeat;
|
||||||
|
background-size: 100%;
|
||||||
|
position: absolute;
|
||||||
|
right: 12px;
|
||||||
|
top: 48px;
|
||||||
|
.rankingRightTitle {
|
||||||
|
width: 24px;
|
||||||
|
height: 132px;
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 24px;
|
||||||
|
color: #52FFF1;
|
||||||
|
line-height: 55px;
|
||||||
|
position: relative;
|
||||||
|
left: 37px;
|
||||||
|
top: 43px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.rankingTypeBox {
|
||||||
|
position: absolute;
|
||||||
|
left: 100px;
|
||||||
|
top:13px;
|
||||||
|
.rankingTextBox {
|
||||||
|
display: inline-block;
|
||||||
|
margin-left: 16px;
|
||||||
|
vertical-align: top;
|
||||||
|
.text1 {
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 17px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
line-height: 22px;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
padding-top: 5px;
|
||||||
|
}
|
||||||
|
.text2 {
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 32px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
line-height: 22px;
|
||||||
|
margin-top: 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
352
src/views/base/dataBoard/components/RightTop.vue
Normal file
@@ -0,0 +1,352 @@
|
|||||||
|
<template>
|
||||||
|
<div class='rightTopBox'>
|
||||||
|
<div class='title'>
|
||||||
|
<svg-icon icon-class="dataBoard4" class='icon'/>
|
||||||
|
<span>缺陷情况</span>
|
||||||
|
</div>
|
||||||
|
<div class='title-split'>
|
||||||
|
<img src="../../../../assets//images/dataBoard/leftbar.png" alt="">
|
||||||
|
<span class='text'>总数</span>
|
||||||
|
<img src="../../../../assets//images/dataBoard/rightbar.png" alt="">
|
||||||
|
</div>
|
||||||
|
<div class='dataBox'>
|
||||||
|
<div class='row'>
|
||||||
|
<div class='box' style='width: 105px;'>
|
||||||
|
<p class='name'>
|
||||||
|
<span style='margin-right: 3px;'>当日</span>
|
||||||
|
<img v-show='nokSumDet.today >= nokSumDet.yesterday' src="../../../../assets/images/dataBoard/arrUp.png" alt="" width='5' height='15'>
|
||||||
|
<img v-show='nokSumDet.today < nokSumDet.yesterday' src="../../../../assets/images/dataBoard/arrDown.png" alt="" width='5' height='15'>
|
||||||
|
</p>
|
||||||
|
<p class='num'>{{nokSumDet?.today ? formatThousands(nokSumDet.today) : '-'}}</p>
|
||||||
|
</div>
|
||||||
|
<div class='box' style='width: 115px;'>
|
||||||
|
<p class='name'>
|
||||||
|
<span style='margin-right: 3px;'>本月</span>
|
||||||
|
<img v-show='nokSumDet.month >= nokSumDet.lastMonth' src="../../../../assets/images/dataBoard/arrUp.png" alt="" width='5' height='15'>
|
||||||
|
<img v-show='nokSumDet.month < nokSumDet.lastMonth' src="../../../../assets/images/dataBoard/arrDown.png" alt="" width='5' height='15'>
|
||||||
|
</p>
|
||||||
|
<p class='num'>{{nokSumDet?.month ? formatThousands(nokSumDet.month) : '-'}}</p>
|
||||||
|
</div>
|
||||||
|
<div class='box' style='width: 110px;'>
|
||||||
|
<p class='name'>
|
||||||
|
<span style='margin-right: 3px;'>本年</span>
|
||||||
|
<img v-show='nokSumDet.year >= nokSumDet.lastYear' src="../../../../assets/images/dataBoard/arrUp.png" alt="" width='5' height='15'>
|
||||||
|
<img v-show='nokSumDet.year < nokSumDet.lastYear' src="../../../../assets/images/dataBoard/arrDown.png" alt="" width='5' height='15'>
|
||||||
|
</p>
|
||||||
|
<p class='num'>{{nokSumDet?.year ? formatThousands(nokSumDet.year) : '-'}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class='row' style='padding-top: 5px;'>
|
||||||
|
<div class='box' style='width: 105px;'>
|
||||||
|
<p class='name'>
|
||||||
|
<span>昨日</span>
|
||||||
|
</p>
|
||||||
|
<p class='num'>{{nokSumDet?.yesterday ? formatThousands(nokSumDet.yesterday) : '-'}}</p>
|
||||||
|
</div>
|
||||||
|
<div class='box' style='width: 115px;'>
|
||||||
|
<p class='name'>
|
||||||
|
<span>上月</span>
|
||||||
|
</p>
|
||||||
|
<p class='num'>{{nokSumDet?.lastMonth ? formatThousands(nokSumDet.lastMonth) : '-'}}</p>
|
||||||
|
</div>
|
||||||
|
<div class='box' style='width: 110px;'>
|
||||||
|
<p class='name'>
|
||||||
|
<span>上年</span>
|
||||||
|
</p>
|
||||||
|
<p class='num'>{{nokSumDet?.lastYear ? formatThousands(nokSumDet.lastYear) : '-'}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class='title-split2'>
|
||||||
|
<img src="../../../../assets//images/dataBoard/leftbar.png" alt="">
|
||||||
|
<span class='text'>全厂缺陷汇总</span>
|
||||||
|
<img src="../../../../assets//images/dataBoard/rightbar.png" alt="">
|
||||||
|
</div>
|
||||||
|
<div id='defectSumChart' style='width: 400px;height: 315px;'></div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
const colors = [
|
||||||
|
"rgb(39, 96, 255)",
|
||||||
|
"rgb(91, 155, 255)",
|
||||||
|
"rgb(153, 214, 108)",
|
||||||
|
"rgb(18, 255, 245)",
|
||||||
|
"rgb(221, 177, 18)",
|
||||||
|
];
|
||||||
|
export default {
|
||||||
|
name: 'RightTop',
|
||||||
|
props: {
|
||||||
|
dataObj: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
dataObj(val) {
|
||||||
|
this.nokSumDet = val.nokSumDet
|
||||||
|
this.dataProps = []
|
||||||
|
val.nokPieDet && val.nokPieDet.forEach(item => {
|
||||||
|
let obj = {
|
||||||
|
value: item.num,
|
||||||
|
name: item.type
|
||||||
|
}
|
||||||
|
this.dataProps.push(obj)
|
||||||
|
})
|
||||||
|
this.initChart()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
nokSumDet:{},
|
||||||
|
chartDom: '',
|
||||||
|
chart: '',
|
||||||
|
dataProps:[],
|
||||||
|
rangArrValue:[],
|
||||||
|
dataList:[],
|
||||||
|
totalValue:0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {},
|
||||||
|
methods: {
|
||||||
|
initChart() {
|
||||||
|
if (
|
||||||
|
this.chart !== null &&
|
||||||
|
this.chart !== '' &&
|
||||||
|
this.chart !== undefined
|
||||||
|
) {
|
||||||
|
this.chart.dispose() // 页面多次刷新会出现警告,Dom已经初始化了一个实例,这是销毁实例
|
||||||
|
}
|
||||||
|
this.chartDom = document.getElementById('defectSumChart')
|
||||||
|
this.chart = echarts.init(this.chartDom)
|
||||||
|
var option;
|
||||||
|
this.getPersonnelList(this.dataProps)
|
||||||
|
option = {
|
||||||
|
color: colors,
|
||||||
|
graphic: [
|
||||||
|
{
|
||||||
|
type: "text",
|
||||||
|
left: "center",
|
||||||
|
top: "44%",
|
||||||
|
style: {
|
||||||
|
text: this.totalValue,
|
||||||
|
fill: "#fff",
|
||||||
|
width: 150,
|
||||||
|
height: 44,
|
||||||
|
fontSize: 31,
|
||||||
|
fontWeight: 400,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "text",
|
||||||
|
left: "center",
|
||||||
|
top: "55%",
|
||||||
|
style: {
|
||||||
|
text: "总数/件",
|
||||||
|
fill: "rgba(255, 255, 255, 0.70)",
|
||||||
|
width: 32,
|
||||||
|
height: 16,
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: 400,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: "产线缺陷分类",
|
||||||
|
type: "pie",
|
||||||
|
radius: ["45%", "60%"],
|
||||||
|
center: ["50%", "50%"],
|
||||||
|
label:{
|
||||||
|
formatter:function(params){
|
||||||
|
return `{color${params.dataIndex}|${params.percent}%}\n{style2|${params.name}}`
|
||||||
|
},
|
||||||
|
rich:{
|
||||||
|
color0:{color:'rgb(39, 96, 255)',fontSize:22},
|
||||||
|
color1:{color:'rgb(91, 155, 255)',fontSize:22},
|
||||||
|
color2:{color:'rgb(153, 214, 108)',fontSize:22},
|
||||||
|
color3:{color:'rgb(18, 255, 245)',fontSize:22},
|
||||||
|
color4:{color:'rgb(221, 177, 18)',fontSize:22},
|
||||||
|
color5:{color:'rgb(39, 96, 255)',fontSize:22},
|
||||||
|
color6:{color:'rgb(91, 155, 255)',fontSize:22},
|
||||||
|
color7:{color:'rgb(153, 214, 108)',fontSize:22},
|
||||||
|
color8:{color:'rgb(18, 255, 245)',fontSize:22},
|
||||||
|
color9:{color:'rgb(221, 177, 18)',fontSize:22},
|
||||||
|
style2:{
|
||||||
|
color:'#fff',
|
||||||
|
fontSize:14
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data: this.dataList,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
option && this.chart.setOption(option);
|
||||||
|
},
|
||||||
|
getCoordinates(startArc, endArc) {
|
||||||
|
const posi = [
|
||||||
|
Math.sin(startArc),
|
||||||
|
-Math.cos(startArc),
|
||||||
|
Math.sin(endArc),
|
||||||
|
-Math.cos(endArc),
|
||||||
|
];
|
||||||
|
const dx = posi[2] - posi[0];
|
||||||
|
const dy = posi[3] - posi[1];
|
||||||
|
|
||||||
|
return this.getLocation(dx, dy);
|
||||||
|
},
|
||||||
|
getLocation(dx,dy) {
|
||||||
|
const tanV = dx / dy;
|
||||||
|
const directSign = Math.abs(tanV) < 1;
|
||||||
|
const t = directSign ? tanV : 1 / tanV;
|
||||||
|
|
||||||
|
const sign1 = t > 0 ? 1 : -1;
|
||||||
|
const sign2 = dx > 0 ? 1 : -1;
|
||||||
|
const sign = directSign ? sign1 * sign2 : sign2;
|
||||||
|
|
||||||
|
const group1 = [0.5 - (sign * t) / 2, 0.5 + (sign * t) / 2];
|
||||||
|
const group2 = sign > 0 ? [0, 1] : [1, 0];
|
||||||
|
const group = [...group1, ...group2];
|
||||||
|
const keys = directSign ? ["x", "x2", "y", "y2"] : ["y", "y2", "x", "x2"];
|
||||||
|
|
||||||
|
let res = {};
|
||||||
|
keys.forEach((k, idx) => {
|
||||||
|
res[k] = group[idx];
|
||||||
|
});
|
||||||
|
return res;
|
||||||
|
},
|
||||||
|
async getPersonnelList(dataProps){
|
||||||
|
this.rangArrValue = [];
|
||||||
|
this.totalValue = 0;
|
||||||
|
this.dataList = [];
|
||||||
|
this.totalValue = dataProps.reduce(
|
||||||
|
(total, value) => total + value.value,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
let cacheNum = 0;
|
||||||
|
for (let i = 0; i < dataProps.length; i++) {
|
||||||
|
const endNum = cacheNum + dataProps[i].value;
|
||||||
|
this.rangArrValue.push([cacheNum, endNum]);
|
||||||
|
cacheNum = endNum;
|
||||||
|
}
|
||||||
|
const angleArr = this.rangArrValue.map((arr) =>
|
||||||
|
arr.map((num) => (num / this.totalValue) * Math.PI * 2)
|
||||||
|
);
|
||||||
|
this.dataList = dataProps.map((item, index) => {
|
||||||
|
const range = this.getCoordinates(angleArr[index][0], angleArr[index][1]);
|
||||||
|
const startColor = colors[index%5];
|
||||||
|
const color = {
|
||||||
|
type: "linear",
|
||||||
|
x: range.x,
|
||||||
|
x2: range.x2,
|
||||||
|
y: range.y,
|
||||||
|
y2: range.y2,
|
||||||
|
colorStops: [
|
||||||
|
{
|
||||||
|
offset: 0,
|
||||||
|
color: startColor, // 起始颜色
|
||||||
|
},
|
||||||
|
{
|
||||||
|
offset: 1,
|
||||||
|
color: `${startColor.substring(0, startColor.length - 1)}, 0.2)`, // 终点颜色
|
||||||
|
},
|
||||||
|
],
|
||||||
|
global: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
name: item.name,
|
||||||
|
value: item.value,
|
||||||
|
itemStyle: {
|
||||||
|
color: color,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang='scss' scoped>
|
||||||
|
p{
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.rightTopBox {
|
||||||
|
width: 402px;
|
||||||
|
height: 600px;
|
||||||
|
background: url('../../../../assets/images/dataBoard/left-top.png') no-repeat;
|
||||||
|
background-size: 100%;
|
||||||
|
position: absolute;
|
||||||
|
right: 23px;
|
||||||
|
top:113px;
|
||||||
|
.title {
|
||||||
|
margin: 10px 0 0 15px;
|
||||||
|
.icon {
|
||||||
|
width: 33px;
|
||||||
|
height: 33px;
|
||||||
|
margin-right: 5px;
|
||||||
|
vertical-align:middle;
|
||||||
|
}
|
||||||
|
span {
|
||||||
|
font-size: 24px;
|
||||||
|
color: #52FFF1;
|
||||||
|
line-height: 24px;
|
||||||
|
vertical-align:middle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.title-split {
|
||||||
|
margin-left: 95px;
|
||||||
|
margin-top: 10px;
|
||||||
|
.text{
|
||||||
|
display: inline-block;
|
||||||
|
width: 100px;
|
||||||
|
font-size: 22px;
|
||||||
|
color: #01CFCC;
|
||||||
|
line-height: 24px;
|
||||||
|
letter-spacing: 7px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.title-split2 {
|
||||||
|
margin-left: 66px;
|
||||||
|
margin-top: 20px;
|
||||||
|
.text{
|
||||||
|
display: inline-block;
|
||||||
|
width: 160px;
|
||||||
|
font-size: 22px;
|
||||||
|
color: #01CFCC;
|
||||||
|
line-height: 24px;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.dataBox {
|
||||||
|
width: 358px;
|
||||||
|
height: 160px;
|
||||||
|
background: url('../../../../assets/images/dataBoard/defectNum.png') no-repeat;
|
||||||
|
background-size: 100%;
|
||||||
|
position: relative;
|
||||||
|
left: 21px;
|
||||||
|
top:8px;
|
||||||
|
padding-left: 24px;
|
||||||
|
.row {
|
||||||
|
.box{
|
||||||
|
display: inline-block;
|
||||||
|
padding-top: 10px;
|
||||||
|
.name {
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 20px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
}
|
||||||
|
.num {
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 28px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
text-shadow: 0px 5px 2px rgba(0,0,0,0.62);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -1,100 +1,234 @@
|
|||||||
<!--
|
|
||||||
filename: index.vue
|
|
||||||
author: liubin
|
|
||||||
date: 2023-10-11 09:32:04
|
|
||||||
description: 设备看板
|
|
||||||
-->
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div ref="dataBoard" class="data-board">
|
<div ref='dataBoardBoxB' class='dataBoardBoxB'>
|
||||||
<el-button type="text" @click="goback" class="go-back--btn">返回</el-button>
|
<div id="dataBoardBox" class='dataBoardBox' style="width: 1920px;height: 1080px;" :style="{ transform: 'scale(' + scaleNum + ')' }">
|
||||||
|
<DataBoardHeader
|
||||||
|
:is-full-screen="isFullScreen"
|
||||||
|
@screenfullChange="screenfullChange"
|
||||||
|
/>
|
||||||
|
<LeftTop :dataObj='dataObj'/>
|
||||||
|
<LeftBottom :dataObj='dataObj'/>
|
||||||
|
<CenterTop :scaleNum='scaleNum' :dataObj='dataObj'/>
|
||||||
|
<CenterBottomL :dataObj='dataObj'/>
|
||||||
|
<CenterBottomR :dataObj='dataObj'/>
|
||||||
|
<RightTop :dataObj='dataObj'/>
|
||||||
|
<RightBottom :dataObj='dataObj'/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import DataBoardHeader from './components/Header.vue';
|
||||||
|
import LeftTop from './components/LeftTop.vue';
|
||||||
|
import LeftBottom from './components/LeftBottom.vue';
|
||||||
|
import CenterTop from './components/CenterTop.vue';
|
||||||
|
import CenterBottomL from './components/CenterBottomL.vue';
|
||||||
|
import CenterBottomR from './components/CenterBottomR.vue';
|
||||||
|
import RightTop from './components/RightTop.vue';
|
||||||
|
import RightBottom from './components/RightBottom.vue';
|
||||||
|
import { debounce } from '@/utils/debounce';
|
||||||
|
import screenfull from 'screenfull';
|
||||||
|
import { getAccessToken } from '@/utils/auth';
|
||||||
|
import store from "@/store";
|
||||||
export default {
|
export default {
|
||||||
name: 'DataBoard',
|
name: 'DataBoard',
|
||||||
components: {},
|
components: { DataBoardHeader,LeftTop,LeftBottom,CenterTop,CenterBottomL,CenterBottomR,RightTop,RightBottom },
|
||||||
props: {},
|
props: {},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
appMain: null, // dom
|
isFullScreen: false,
|
||||||
parentStyle: {
|
scaleNum: 0.8,
|
||||||
margin: '8px 14px 0px 16px',
|
dataObj:{},
|
||||||
minHeight: 'calc(100vh - 120px - 8px)',
|
sseReader: null, // 保存流读取器
|
||||||
}, // object
|
abortController: null, // 用于中止 fetch 请求
|
||||||
mainFooter: null, // dom
|
retryCount: 0, // 当前重试次数
|
||||||
|
isDestroyed: false // 标记组件是否已销毁
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
// mounted() {
|
created() {
|
||||||
// this.$nextTick(() => {
|
this.init()
|
||||||
// this.modify();
|
},
|
||||||
// });
|
mounted() {
|
||||||
// },
|
this.boxReset = debounce(() => {
|
||||||
// activated() {
|
this.resetSize()
|
||||||
// this.modify();
|
}, 300)
|
||||||
// },
|
this.boxReset()
|
||||||
// deactivated() {
|
window.addEventListener('resize', () => {
|
||||||
// this.recover();
|
this.boxReset()
|
||||||
// },
|
})
|
||||||
// beforeDestroy() {
|
this.getData()
|
||||||
// this.recover();
|
},
|
||||||
// },
|
beforeDestroy() {
|
||||||
methods: {
|
this.closeSSE();
|
||||||
// modify() {
|
},
|
||||||
// // 在这个页面临时修改下父类的margin,结束时需还原
|
computed: {
|
||||||
// this.appMain = document.querySelector('.app-main');
|
sidebarOpened() {
|
||||||
// // this.appMain.style.minHeight = 'calc(100vh - 90px)';
|
return this.$store.state.app.sidebar.opened
|
||||||
// this.appMain.style.margin = 0;
|
|
||||||
// // 在这个页面临时删除 main-footer 元素,结束时需还原
|
|
||||||
// // this.mainFooter = document.querySelector('.main-footer').cloneNode(true);
|
|
||||||
// // document.querySelector('.main-footer').remove();
|
|
||||||
// this.$refs.dataBoard.classList.add('data-board');
|
|
||||||
// },
|
|
||||||
// recover() {
|
|
||||||
// this.$refs.dataBoard.classList.remove('data-board');
|
|
||||||
// this.$nextTick(() => {
|
|
||||||
// this.appMain.style.margin = this.parentStyle.margin;
|
|
||||||
// // this.appMain.style.minHeight = this.parentStyle.minHeight;
|
|
||||||
// // this.appMain.insertAdjacentElement('afterend', this.mainFooter);
|
|
||||||
// });
|
|
||||||
// },
|
|
||||||
goback() {
|
|
||||||
this.$router.go(-1);
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
watch: {
|
||||||
|
sidebarOpened(newVal, oldVal) {
|
||||||
|
this.boxReset()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async getData() {
|
||||||
|
let _this = this;
|
||||||
|
if (_this.isDestroyed) return;
|
||||||
|
const url = process.env.VUE_APP_BASE_API+'/admin-api/monitoring/message/subscribe/'+store.getters.userId+'-'+Date.now();
|
||||||
|
const token = getAccessToken()
|
||||||
|
const headers = new Headers({
|
||||||
|
'Authorization': `Bearer ${token}`,
|
||||||
|
'Content-Type': 'text/event-stream'
|
||||||
|
});
|
||||||
|
try {
|
||||||
|
// 创建中止控制器
|
||||||
|
this.abortController = new AbortController();
|
||||||
|
// 发起 fetch 请求(替换为你的接口地址)
|
||||||
|
const response = await fetch(url, {
|
||||||
|
method: 'GET',
|
||||||
|
headers: headers,
|
||||||
|
signal: _this.abortController.signal // 绑定中止信号
|
||||||
|
});
|
||||||
|
|
||||||
|
// 获取流读取器
|
||||||
|
_this.sseReader = response.body.getReader();
|
||||||
|
const decoder = new TextDecoder();
|
||||||
|
|
||||||
|
// 持续读取流数据
|
||||||
|
while (true) {
|
||||||
|
const { done, value } = await _this.sseReader.read();
|
||||||
|
if (done) {
|
||||||
|
console.log('SSE 连接正常关闭');
|
||||||
|
_this.handleReconnect(); // 触发重连
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// 处理 SSE 事件数据
|
||||||
|
const data = decoder.decode(value);
|
||||||
|
console.log('收到消息:', data);
|
||||||
|
if (_this.isValidData(data)){
|
||||||
|
_this.upDateMsg(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
// 主动中止的请求不报错
|
||||||
|
if (error.name === 'AbortError') return;
|
||||||
|
console.error('SSE 连接异常:', error);
|
||||||
|
_this.handleReconnect(); // 触发重连
|
||||||
|
}
|
||||||
|
},
|
||||||
|
closeSSE() {
|
||||||
|
this.isDestroyed = true; // 标记销毁
|
||||||
|
if (this.abortController) {
|
||||||
|
this.abortController.abort(); // 中止 fetch 请求
|
||||||
|
}
|
||||||
|
if (this.sseReader) {
|
||||||
|
this.sseReader.cancel(); // 关闭流读取器
|
||||||
|
this.sseReader = null;
|
||||||
|
}
|
||||||
|
console.log('SSE 连接已强制关闭');
|
||||||
|
},
|
||||||
|
handleReconnect() {
|
||||||
|
if (this.isDestroyed) return;
|
||||||
|
// 指数退避策略(最大重试 5 次)
|
||||||
|
const maxRetries = 5;
|
||||||
|
if (this.retryCount < maxRetries) {
|
||||||
|
const delay = Math.pow(2, this.retryCount) * 1000;
|
||||||
|
setTimeout(() => {
|
||||||
|
this.retryCount++;
|
||||||
|
this.initSSE();
|
||||||
|
}, delay);
|
||||||
|
} else {
|
||||||
|
console.error('SSE 重连次数已达上限');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
isValidData (data) {
|
||||||
|
return data.trim().startsWith('data:{') && !data.includes('heartbeat');
|
||||||
|
},
|
||||||
|
upDateMsg(data) {
|
||||||
|
const jsonStr = data.replace(/^data:/, '').trim();
|
||||||
|
try {
|
||||||
|
const dataObj = JSON.parse(jsonStr);
|
||||||
|
this.dataObj = dataObj
|
||||||
|
console.log('dataObj',this.dataObj)
|
||||||
|
} catch (e) {
|
||||||
|
console.error('JSON 解析失败:', e);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
change() {
|
||||||
|
this.isFullScreen = screenfull.isFullscreen
|
||||||
|
},
|
||||||
|
init() {
|
||||||
|
if (!screenfull.isEnabled) {
|
||||||
|
this.$message({
|
||||||
|
message: 'you browser can not work',
|
||||||
|
type: 'warning'
|
||||||
|
})
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
screenfull.on('change', this.change)
|
||||||
|
},
|
||||||
|
destroy() {
|
||||||
|
if (!screenfull.isEnabled) {
|
||||||
|
this.$message({
|
||||||
|
message: 'you browser can not work',
|
||||||
|
type: 'warning'
|
||||||
|
})
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
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.dataBoardBoxB)
|
||||||
|
},
|
||||||
|
resetSize() {
|
||||||
|
const dataBoardBox = document.getElementById('dataBoardBox')
|
||||||
|
const rw = parseFloat(window.innerWidth)
|
||||||
|
const rh = parseFloat(window.innerHeight)
|
||||||
|
const bw = parseFloat(dataBoardBox.style.width)
|
||||||
|
const bh = parseFloat(dataBoardBox.style.height)
|
||||||
|
let wx = 0
|
||||||
|
let hy = 0
|
||||||
|
if (screenfull.isFullscreen) {
|
||||||
|
wx = rw / bw
|
||||||
|
hy = rh / bh
|
||||||
|
} else {
|
||||||
|
if (this.$store.state.app.sidebar.opened) {
|
||||||
|
wx = (rw - 283) / bw
|
||||||
|
} else {
|
||||||
|
wx = (rw - 88) / bw
|
||||||
|
}
|
||||||
|
hy = (rh - 150) / bh
|
||||||
|
}
|
||||||
|
this.scaleNum = wx < hy ? wx : hy
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.data-board {
|
.dataBoardBoxB {
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: calc(100vh - 150px);
|
||||||
background: url('../../../assets/images/DataBoard.png') 100% 100% / contain
|
position: relative;
|
||||||
no-repeat;
|
overflow: auto;
|
||||||
}
|
.dataBoardBox {
|
||||||
|
|
||||||
.go-back--btn {
|
|
||||||
position: fixed;
|
|
||||||
top: 28px;
|
|
||||||
left: 24px;
|
|
||||||
color: #fff;
|
|
||||||
font-size: 18px;
|
|
||||||
letter-spacing: 6px;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
&::after {
|
|
||||||
content: "\2BAA";
|
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 6px;
|
transform-origin: 16px 8px;
|
||||||
right: -26px;
|
font-size: 16px;
|
||||||
font-size: 24px;
|
top: 0px;
|
||||||
|
left: 0px;
|
||||||
|
background: url('../../../assets/images/dataBoard/background.png') no-repeat;
|
||||||
|
background-size: cover;
|
||||||
|
background-position: 0 0;
|
||||||
|
overflow: auto;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -71,14 +71,14 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
|
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="工段排序" prop="sort">
|
<el-form-item label="工段设备排序" prop="sort">
|
||||||
<el-input-number
|
<el-input-number
|
||||||
v-model="dataForm.sort"
|
v-model="dataForm.sort"
|
||||||
filterable
|
filterable
|
||||||
min="0"
|
min="0"
|
||||||
max="100"
|
max="100"
|
||||||
@change="$emit('update', dataForm)"
|
@change="$emit('update', dataForm)"
|
||||||
placeholder="请输入工段排序" />
|
placeholder="请输入工段设备排序" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
@@ -112,6 +112,7 @@
|
|||||||
{ label: '无类型', value: 0 },
|
{ label: '无类型', value: 0 },
|
||||||
{ label: '进口统计', value: 1 },
|
{ label: '进口统计', value: 1 },
|
||||||
{ label: '出口统计', value: 2 },
|
{ label: '出口统计', value: 2 },
|
||||||
|
{ label: '进出口计数', value: 3 },
|
||||||
]"
|
]"
|
||||||
:key="opt.value"
|
:key="opt.value"
|
||||||
:label="opt.label"
|
:label="opt.label"
|
||||||
|
|||||||
@@ -4,7 +4,8 @@
|
|||||||
<SearchBar
|
<SearchBar
|
||||||
:formConfigs="searchBarFormConfig"
|
:formConfigs="searchBarFormConfig"
|
||||||
ref="search-bar"
|
ref="search-bar"
|
||||||
@headBtnClick="handleSearchBarBtnClick" />
|
@select-changed="handleSearchBarChanged"
|
||||||
|
@headBtnClick="buttonClick" />
|
||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<base-table
|
<base-table
|
||||||
@@ -52,6 +53,8 @@ import {
|
|||||||
getEquipmentBindSectionPage,
|
getEquipmentBindSectionPage,
|
||||||
exportEquipmentBindSectionExcel,
|
exportEquipmentBindSectionExcel,
|
||||||
} from '@/api/base/equipmentBindSection';
|
} from '@/api/base/equipmentBindSection';
|
||||||
|
import { getPdList } from '@/api/core/monitoring/auto';
|
||||||
|
import { getFactoryPage } from '@/api/core/base/factory';
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
import basicPageMixin from '@/mixins/lb/basicPageMixin';
|
import basicPageMixin from '@/mixins/lb/basicPageMixin';
|
||||||
import DialogForm from './dialogForm.vue';
|
import DialogForm from './dialogForm.vue';
|
||||||
@@ -61,7 +64,7 @@ export default {
|
|||||||
mixins: [basicPageMixin],
|
mixins: [basicPageMixin],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
searchBarKeys: ['workshopSectionId', 'equipmentName'],
|
searchBarKeys: ['factoryId','productionLineId','workshopSectionId', 'equipmentName'],
|
||||||
tableBtn: [
|
tableBtn: [
|
||||||
this.$auth.hasPermi('base:equipment-bind-section:update')
|
this.$auth.hasPermi('base:equipment-bind-section:update')
|
||||||
? {
|
? {
|
||||||
@@ -84,8 +87,9 @@ export default {
|
|||||||
width: 180,
|
width: 180,
|
||||||
filter: (val) => moment(val).format('yyyy-MM-DD HH:mm:ss'),
|
filter: (val) => moment(val).format('yyyy-MM-DD HH:mm:ss'),
|
||||||
},
|
},
|
||||||
{ prop: 'productionLine', label: '产线名称' },
|
{ prop: 'factoryName', label: '工厂' },
|
||||||
{ prop: 'workshopSection', label: '工段名称' },
|
{ prop: 'productionLine', label: '产线' },
|
||||||
|
{ prop: 'workshopSection', label: '工段' },
|
||||||
{ prop: 'equipment', label: '设备名称' },
|
{ prop: 'equipment', label: '设备名称' },
|
||||||
{ prop: 'sort', label: '工段中排序' },
|
{ prop: 'sort', label: '工段中排序' },
|
||||||
{
|
{
|
||||||
@@ -98,7 +102,7 @@ export default {
|
|||||||
prop: 'sectionDataType',
|
prop: 'sectionDataType',
|
||||||
label: '工段数据类型',
|
label: '工段数据类型',
|
||||||
filter: (val) =>
|
filter: (val) =>
|
||||||
val != null ? ['无类型', '进口计数', '出口计数'][val] : '-',
|
val != null ? ['无类型', '进口计数', '出口计数', '进出口计数'][val] : '-',
|
||||||
},
|
},
|
||||||
// {
|
// {
|
||||||
// action: 'show-alert',
|
// action: 'show-alert',
|
||||||
@@ -129,6 +133,20 @@ export default {
|
|||||||
// },
|
// },
|
||||||
],
|
],
|
||||||
searchBarFormConfig: [
|
searchBarFormConfig: [
|
||||||
|
{
|
||||||
|
type: 'select',
|
||||||
|
label: '工厂',
|
||||||
|
selectOptions: [],
|
||||||
|
param: 'factoryId',
|
||||||
|
onchange: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'select',
|
||||||
|
label: '产线',
|
||||||
|
selectOptions: [],
|
||||||
|
param: 'productionLineId',
|
||||||
|
multiple: true,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
type: 'select',
|
type: 'select',
|
||||||
label: '工段',
|
label: '工段',
|
||||||
@@ -209,8 +227,8 @@ export default {
|
|||||||
label: '产线数据类型',
|
label: '产线数据类型',
|
||||||
options: [
|
options: [
|
||||||
{ label: '无类型', value: 0 },
|
{ label: '无类型', value: 0 },
|
||||||
{ label: '进口统计', value: 1 },
|
{ label: '进口计数', value: 1 },
|
||||||
{ label: '出口统计', value: 2 },
|
{ label: '出口计数', value: 2 },
|
||||||
],
|
],
|
||||||
prop: 'lineDataType',
|
prop: 'lineDataType',
|
||||||
},
|
},
|
||||||
@@ -219,8 +237,9 @@ export default {
|
|||||||
label: '工段数据类型',
|
label: '工段数据类型',
|
||||||
options: [
|
options: [
|
||||||
{ label: '无类型', value: 0 },
|
{ label: '无类型', value: 0 },
|
||||||
{ label: '进口统计', value: 1 },
|
{ label: '进口计数', value: 1 },
|
||||||
{ label: '出口统计', value: 2 },
|
{ label: '出口计数', value: 2 },
|
||||||
|
{ label: '进出口计数', value: 3 },
|
||||||
],
|
],
|
||||||
prop: 'sectionDataType',
|
prop: 'sectionDataType',
|
||||||
},
|
},
|
||||||
@@ -234,6 +253,9 @@ export default {
|
|||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
workshopSectionId: null,
|
workshopSectionId: null,
|
||||||
equipmentId: null,
|
equipmentId: null,
|
||||||
|
equipmentName: null,
|
||||||
|
factoryId: null,
|
||||||
|
productionLineId: [],
|
||||||
},
|
},
|
||||||
// 表单参数
|
// 表单参数
|
||||||
form: {},
|
form: {},
|
||||||
@@ -242,6 +264,7 @@ export default {
|
|||||||
created() {
|
created() {
|
||||||
this.getList();
|
this.getList();
|
||||||
this.initWorksection();
|
this.initWorksection();
|
||||||
|
this.getPdLineList();
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
/** 准备工段数据 */
|
/** 准备工段数据 */
|
||||||
@@ -251,7 +274,7 @@ export default {
|
|||||||
method: 'get',
|
method: 'get',
|
||||||
});
|
});
|
||||||
if (code == 0) {
|
if (code == 0) {
|
||||||
this.searchBarFormConfig[0].selectOptions = data.map((item) => {
|
this.searchBarFormConfig[2].selectOptions = data.map((item) => {
|
||||||
return {
|
return {
|
||||||
name: item.name,
|
name: item.name,
|
||||||
id: item.id,
|
id: item.id,
|
||||||
@@ -259,6 +282,51 @@ export default {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
getPdLineList() {
|
||||||
|
getPdList().then((res) => {
|
||||||
|
this.searchBarFormConfig[1].selectOptions = res.data || [];
|
||||||
|
});
|
||||||
|
const params = {
|
||||||
|
pageSize: 100,
|
||||||
|
pageNo: 1,
|
||||||
|
};
|
||||||
|
getFactoryPage(params).then((res) => {
|
||||||
|
this.searchBarFormConfig[0].selectOptions = res.data.list || [];
|
||||||
|
});
|
||||||
|
},
|
||||||
|
handleSearchBarChanged({ param, value }) {
|
||||||
|
this.queryParams.productionLineId = [];
|
||||||
|
this.$refs['search-bar'].formInline.productionLineId = undefined;
|
||||||
|
getPdList(value).then((res) => {
|
||||||
|
this.searchBarFormConfig[1].selectOptions = res.data || [];
|
||||||
|
});
|
||||||
|
},
|
||||||
|
buttonClick(val) {
|
||||||
|
switch (val.btnName) {
|
||||||
|
case 'search':
|
||||||
|
this.queryParams.pageNo = 1;
|
||||||
|
this.queryParams.pageSize = 10;
|
||||||
|
this.queryParams.name = val.name;
|
||||||
|
this.queryParams.workshopSectionId = val.workshopSectionId || undefined;
|
||||||
|
this.queryParams.equipmentName = val.equipmentName || undefined;
|
||||||
|
this.queryParams.factoryId = val.factoryId || undefined;
|
||||||
|
this.queryParams.productionLineId = val.productionLineId || [];
|
||||||
|
this.handleQuery();
|
||||||
|
break;
|
||||||
|
case 'add':
|
||||||
|
this.handleAdd();
|
||||||
|
break;
|
||||||
|
case 'export':
|
||||||
|
this.handleExport();
|
||||||
|
break;
|
||||||
|
case 'reset':
|
||||||
|
this.$refs['search-bar'].resetForm();
|
||||||
|
this.resetQuery();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
console.log(val);
|
||||||
|
}
|
||||||
|
},
|
||||||
/** 查询列表 */
|
/** 查询列表 */
|
||||||
getList() {
|
getList() {
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
|
|||||||
109
src/views/base/equipmentPlc/add-or-updata.vue
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
<!--
|
||||||
|
* @Author: zwq
|
||||||
|
* @Date: 2021-11-18 14:16:25
|
||||||
|
* @LastEditors: zwq
|
||||||
|
* @LastEditTime: 2025-02-26 16:37:29
|
||||||
|
* @Description:
|
||||||
|
-->
|
||||||
|
<template>
|
||||||
|
<el-row :gutter="20">
|
||||||
|
<el-form
|
||||||
|
:model="dataForm"
|
||||||
|
:rules="dataRule"
|
||||||
|
ref="dataForm"
|
||||||
|
@keyup.enter.native="dataFormSubmit()"
|
||||||
|
label-width="80px">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="关联表名" prop="plcTableName">
|
||||||
|
<el-input
|
||||||
|
v-model="dataForm.plcTableName"
|
||||||
|
clearable
|
||||||
|
placeholder="请输入关联表名" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="编码" prop="code">
|
||||||
|
<el-input
|
||||||
|
v-model="dataForm.code"
|
||||||
|
clearable
|
||||||
|
placeholder="请输入编码" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="标识" prop="name">
|
||||||
|
<el-input
|
||||||
|
v-model="dataForm.name"
|
||||||
|
clearable
|
||||||
|
placeholder="请输入标识" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="英文名" prop="enName">
|
||||||
|
<el-input
|
||||||
|
v-model="dataForm.enName"
|
||||||
|
clearable
|
||||||
|
placeholder="请输入英文名" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="是否采集" prop="collection">
|
||||||
|
<el-switch
|
||||||
|
v-model="dataForm.collection"
|
||||||
|
:active-value="1"
|
||||||
|
:inactive-value="0"></el-switch>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="描述" prop="description">
|
||||||
|
<el-input
|
||||||
|
v-model="dataForm.description"
|
||||||
|
clearable
|
||||||
|
placeholder="请输入描述" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-form>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import basicAdd from '@/mixins/basic-add';
|
||||||
|
|
||||||
|
import {
|
||||||
|
createEquipmentPlc,
|
||||||
|
updateEquipmentPlc,
|
||||||
|
getEquipmentPlc,
|
||||||
|
getCode,
|
||||||
|
} from '@/api/base/equipmentPlc';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
mixins: [basicAdd],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
urlOptions: {
|
||||||
|
isGetCode: true,
|
||||||
|
codeURL: getCode,
|
||||||
|
createURL: createEquipmentPlc,
|
||||||
|
updateURL: updateEquipmentPlc,
|
||||||
|
infoURL: getEquipmentPlc,
|
||||||
|
},
|
||||||
|
dataForm: {
|
||||||
|
id: undefined,
|
||||||
|
plcTableName: undefined,
|
||||||
|
code: undefined,
|
||||||
|
name: undefined,
|
||||||
|
enName: undefined,
|
||||||
|
collection: 1,
|
||||||
|
description: undefined,
|
||||||
|
},
|
||||||
|
dataRule: {
|
||||||
|
plcTableName: [
|
||||||
|
{ required: true, message: '关联表名不能为空', trigger: 'blur' },
|
||||||
|
],
|
||||||
|
code: [{ required: true, message: '编码不能为空', trigger: 'blur' }],
|
||||||
|
name: [{ required: true, message: '标识不能为空', trigger: 'blur' }],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
@@ -1,59 +1,53 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<!-- 搜索工作栏 -->
|
<search-bar
|
||||||
<SearchBar
|
:formConfigs="formConfig"
|
||||||
:formConfigs="searchBarFormConfig"
|
ref="searchBarForm"
|
||||||
ref="search-bar"
|
@headBtnClick="buttonClick" />
|
||||||
@headBtnClick="handleSearchBarBtnClick" />
|
|
||||||
|
|
||||||
<!-- 列表 -->
|
|
||||||
<base-table
|
<base-table
|
||||||
|
v-loading="dataListLoading"
|
||||||
:table-props="tableProps"
|
:table-props="tableProps"
|
||||||
:page="queryParams.pageNo"
|
:page="listQuery.pageNo"
|
||||||
:limit="queryParams.pageSize"
|
:limit="listQuery.pageSize"
|
||||||
:table-data="list"
|
:table-data="tableData"
|
||||||
ref="pageTable"
|
|
||||||
@emitFun="handleEmitFun">
|
@emitFun="handleEmitFun">
|
||||||
<method-btn
|
<method-btn
|
||||||
v-if="tableBtn.length"
|
v-if="tableBtn.length"
|
||||||
slot="handleBtn"
|
slot="handleBtn"
|
||||||
|
:width="120"
|
||||||
label="操作"
|
label="操作"
|
||||||
:method-list="tableBtn"
|
:method-list="tableBtn"
|
||||||
@clickBtn="handleTableBtnClick" />
|
@clickBtn="handleClick" />
|
||||||
</base-table>
|
</base-table>
|
||||||
|
|
||||||
<!-- 分页组件 -->
|
|
||||||
<pagination
|
<pagination
|
||||||
v-show="total > 0"
|
:limit.sync="listQuery.pageSize"
|
||||||
:total="total"
|
:page.sync="listQuery.pageNo"
|
||||||
:page.sync="queryParams.pageNo"
|
:total="listQuery.total"
|
||||||
:limit.sync="queryParams.pageSize"
|
@pagination="getDataList" />
|
||||||
@pagination="getList" />
|
|
||||||
|
|
||||||
<!-- 对话框(添加 / 修改) -->
|
|
||||||
<base-dialog
|
<base-dialog
|
||||||
:dialogTitle="title"
|
:dialogTitle="addOrEditTitle"
|
||||||
:dialogVisible="open"
|
:dialogVisible="addOrUpdateVisible"
|
||||||
width="700px"
|
@cancel="handleCancel"
|
||||||
@close="cancel"
|
@confirm="handleConfirm"
|
||||||
@cancel="cancel"
|
:before-close="handleCancel"
|
||||||
@confirm="submitForm">
|
width="50%">
|
||||||
<DialogForm v-if="open" ref="form" v-model="form" :rows="rows" />
|
<add-or-update
|
||||||
|
ref="addOrUpdate"
|
||||||
|
@refreshDataList="successSubmit"></add-or-update>
|
||||||
</base-dialog>
|
</base-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import AddOrUpdate from './add-or-updata';
|
||||||
|
import basicPage from '@/mixins/basic-page';
|
||||||
|
import { parseTime } from '@/filter/code-filter';
|
||||||
import {
|
import {
|
||||||
createEquipmentPlc,
|
|
||||||
updateEquipmentPlc,
|
|
||||||
deleteEquipmentPlc,
|
deleteEquipmentPlc,
|
||||||
getEquipmentPlc,
|
|
||||||
getEquipmentPlcPage,
|
getEquipmentPlcPage,
|
||||||
exportEquipmentPlcExcel,
|
exportEquipmentPlcExcel,
|
||||||
|
updateEquipmentPlc,
|
||||||
} from '@/api/base/equipmentPlc';
|
} from '@/api/base/equipmentPlc';
|
||||||
import moment from 'moment';
|
|
||||||
import basicPageMixin from '@/mixins/lb/basicPageMixin';
|
|
||||||
|
|
||||||
const switchBtn = {
|
const switchBtn = {
|
||||||
name: 'SwitchBtn',
|
name: 'SwitchBtn',
|
||||||
@@ -90,38 +84,8 @@ const switchBtn = {
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
const tableProps = [
|
||||||
export default {
|
{ prop: 'code', label: '编码', width: 220 },
|
||||||
name: 'EquipmentPlc',
|
|
||||||
mixins: [basicPageMixin],
|
|
||||||
components: {},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
tableKey: Math.random(),
|
|
||||||
searchBarKeys: ['name', 'plcTableName'],
|
|
||||||
tableBtn: [
|
|
||||||
this.$auth.hasPermi('base:equipment-plc:update')
|
|
||||||
? {
|
|
||||||
type: 'edit',
|
|
||||||
btnName: '修改',
|
|
||||||
}
|
|
||||||
: undefined,
|
|
||||||
this.$auth.hasPermi('base:equipment-plc:delete')
|
|
||||||
? {
|
|
||||||
type: 'delete',
|
|
||||||
btnName: '删除',
|
|
||||||
}
|
|
||||||
: undefined,
|
|
||||||
].filter((v) => v),
|
|
||||||
tableProps: [
|
|
||||||
// {
|
|
||||||
// prop: 'createTime',
|
|
||||||
// label: '添加时间',
|
|
||||||
// fixed: true,
|
|
||||||
// width: 180,
|
|
||||||
// filter: (val) => moment(val).format('yyyy-MM-DD HH:mm:ss'),
|
|
||||||
// },
|
|
||||||
{ prop: 'code', label: '编码' },
|
|
||||||
{ prop: 'plcTableName', label: '关联表名' },
|
{ prop: 'plcTableName', label: '关联表名' },
|
||||||
{ prop: 'name', label: '标识名称' },
|
{ prop: 'name', label: '标识名称' },
|
||||||
{ prop: 'enName', label: '英文名称' },
|
{ prop: 'enName', label: '英文名称' },
|
||||||
@@ -131,8 +95,34 @@ export default {
|
|||||||
subcomponent: switchBtn,
|
subcomponent: switchBtn,
|
||||||
},
|
},
|
||||||
{ prop: 'description', label: '描述' },
|
{ prop: 'description', label: '描述' },
|
||||||
],
|
];
|
||||||
searchBarFormConfig: [
|
|
||||||
|
export default {
|
||||||
|
mixins: [basicPage],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
urlOptions: {
|
||||||
|
getDataListURL: getEquipmentPlcPage,
|
||||||
|
deleteURL: deleteEquipmentPlc,
|
||||||
|
exportURL: exportEquipmentPlcExcel,
|
||||||
|
},
|
||||||
|
tableProps,
|
||||||
|
tableBtn: [
|
||||||
|
this.$auth.hasPermi(`base:equipment-plc:update`)
|
||||||
|
? {
|
||||||
|
type: 'edit',
|
||||||
|
btnName: '编辑',
|
||||||
|
}
|
||||||
|
: undefined,
|
||||||
|
this.$auth.hasPermi(`base:equipment-plc:delete`)
|
||||||
|
? {
|
||||||
|
type: 'delete',
|
||||||
|
btnName: '删除',
|
||||||
|
}
|
||||||
|
: undefined,
|
||||||
|
].filter((v) => v),
|
||||||
|
tableData: [],
|
||||||
|
formConfig: [
|
||||||
{
|
{
|
||||||
type: 'input',
|
type: 'input',
|
||||||
label: '表名',
|
label: '表名',
|
||||||
@@ -147,231 +137,86 @@ export default {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'button',
|
type: 'button',
|
||||||
btnName: '查询',
|
btnName: '搜索',
|
||||||
name: 'search',
|
name: 'search',
|
||||||
color: 'primary',
|
color: 'primary',
|
||||||
},
|
},
|
||||||
|
// {
|
||||||
|
// type: 'separate',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// type: 'button',
|
||||||
|
// btnName: '重置',
|
||||||
|
// name: 'reset',
|
||||||
|
// },
|
||||||
{
|
{
|
||||||
type: 'separate',
|
type: 'separate',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// type: this.$auth.hasPermi('base:equipment-plc:create')
|
type: this.$auth.hasPermi('base:factory:create') ? 'button' : '',
|
||||||
// ? 'button'
|
|
||||||
// : '',
|
|
||||||
type: 'button',
|
|
||||||
btnName: '新增',
|
btnName: '新增',
|
||||||
name: 'add',
|
name: 'add',
|
||||||
plain: true,
|
|
||||||
color: 'success',
|
color: 'success',
|
||||||
|
plain: true,
|
||||||
},
|
},
|
||||||
// {
|
// {
|
||||||
// type: this.$auth.hasPermi('base:equipment-plc:export') ? 'button' : '',
|
// type: this.$auth.hasPermi('base:factory:create') ? 'separate' : '',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// type: this.$auth.hasPermi('base:factory:export') ? 'button' : '',
|
||||||
// btnName: '导出',
|
// btnName: '导出',
|
||||||
// name: 'export',
|
// name: 'export',
|
||||||
// color: 'warning',
|
// color: 'warning',
|
||||||
// },
|
// },
|
||||||
],
|
],
|
||||||
rows: [
|
|
||||||
[
|
|
||||||
{
|
|
||||||
input: true,
|
|
||||||
label: '关联表名',
|
|
||||||
prop: 'plcTableName',
|
|
||||||
rules: [{ required: true, message: '不能为空', trigger: 'blur' }],
|
|
||||||
// bind: {
|
|
||||||
// disabled: true, // some condition, like detail mode...
|
|
||||||
// }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
input: true,
|
|
||||||
label: '编码',
|
|
||||||
prop: 'code',
|
|
||||||
url: '/base/equipment-group/getCode',
|
|
||||||
rules: [{ required: true, message: '不能为空', trigger: 'blur' }],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[
|
|
||||||
{
|
|
||||||
input: true,
|
|
||||||
label: '标识',
|
|
||||||
prop: 'name',
|
|
||||||
rules: [{ required: true, message: '不能为空', trigger: 'blur' }],
|
|
||||||
// bind: {
|
|
||||||
// disabled: true, // some condition, like detail mode...
|
|
||||||
// }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
input: true,
|
|
||||||
label: '英文名',
|
|
||||||
prop: 'enName',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[
|
|
||||||
{
|
|
||||||
switch: true,
|
|
||||||
label: '是否采集', // 是否采集 0 代表不采集, 1 代表采集
|
|
||||||
prop: 'collection',
|
|
||||||
value: 1,
|
|
||||||
bind: {
|
|
||||||
'active-value': 1,
|
|
||||||
'inactive-value': 0,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[
|
|
||||||
{
|
|
||||||
textarea: true,
|
|
||||||
label: '描述',
|
|
||||||
prop: 'description',
|
|
||||||
bind: {
|
|
||||||
placeholder: '请输入备注',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
],
|
|
||||||
// 是否显示弹出
|
|
||||||
open: false,
|
|
||||||
// 查询参数
|
|
||||||
queryParams: {
|
|
||||||
pageNo: 1,
|
|
||||||
pageSize: 10,
|
|
||||||
plcTableName: null,
|
|
||||||
name: null,
|
|
||||||
},
|
|
||||||
// 表单参数
|
|
||||||
form: {},
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
created() {
|
components: {
|
||||||
this.getList();
|
AddOrUpdate,
|
||||||
},
|
},
|
||||||
|
created() {},
|
||||||
methods: {
|
methods: {
|
||||||
/** 覆盖 handleEmitFun 的默认实现 */
|
/** 覆盖 handleEmitFun 的默认实现 */
|
||||||
handleEmitFun({ action, payload }) {
|
handleEmitFun({ action, payload }) {
|
||||||
|
console.log(payload)
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case 'update-collect':
|
case 'update-collect':
|
||||||
this.reset();
|
updateEquipmentPlc(payload).then((response) => {
|
||||||
const tempForm = {};
|
|
||||||
Object.keys(this.form).forEach((key) => {
|
|
||||||
tempForm[key] = payload[key];
|
|
||||||
});
|
|
||||||
updateEquipmentPlc(tempForm).then((response) => {
|
|
||||||
this.$modal.msgSuccess('修改成功');
|
this.$modal.msgSuccess('修改成功');
|
||||||
this.open = false;
|
this.getDataList();
|
||||||
this.getList();
|
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
/** 查询列表 */
|
buttonClick(val) {
|
||||||
getList() {
|
switch (val.btnName) {
|
||||||
this.loading = true;
|
case 'search':
|
||||||
// 执行查询
|
this.listQuery.pageNo = 1;
|
||||||
getEquipmentPlcPage(this.queryParams).then((response) => {
|
this.listQuery.pageSize = 10;
|
||||||
this.list = response.data.list;
|
this.listQuery.name = val.name;
|
||||||
this.total = response.data.total;
|
this.listQuery.plcTableName = val.plcTableName;
|
||||||
this.loading = false;
|
this.getDataList();
|
||||||
// this.tableKey = Math.random(); // method 1
|
break;
|
||||||
});
|
case 'reset':
|
||||||
},
|
this.$refs.searchBarForm.resetForm();
|
||||||
/** 取消按钮 */
|
this.listQuery = {
|
||||||
cancel() {
|
pageSize: 10,
|
||||||
this.open = false;
|
pageNo: 1,
|
||||||
this.reset();
|
total: 1,
|
||||||
},
|
|
||||||
/** 表单重置 */
|
|
||||||
reset() {
|
|
||||||
this.form = {
|
|
||||||
id: undefined,
|
|
||||||
plcTableName: undefined,
|
|
||||||
code: undefined,
|
|
||||||
name: undefined,
|
|
||||||
enName: undefined,
|
|
||||||
description: undefined,
|
|
||||||
collection: undefined,
|
|
||||||
};
|
};
|
||||||
this.resetForm('form');
|
this.getDataList();
|
||||||
},
|
break;
|
||||||
/** 搜索按钮操作 */
|
case 'add':
|
||||||
handleQuery() {
|
this.addOrEditTitle = '新增';
|
||||||
this.queryParams.pageNo = 1;
|
this.addOrUpdateVisible = true;
|
||||||
this.getList();
|
this.addOrUpdateHandle();
|
||||||
},
|
break;
|
||||||
/** 重置按钮操作 */
|
case 'export':
|
||||||
resetQuery() {
|
this.handleExport();
|
||||||
this.resetForm('queryForm');
|
break;
|
||||||
this.handleQuery();
|
default:
|
||||||
},
|
console.log(val);
|
||||||
/** 新增按钮操作 */
|
|
||||||
handleAdd() {
|
|
||||||
this.reset();
|
|
||||||
this.open = true;
|
|
||||||
this.title = '添加实时数据采集配置';
|
|
||||||
},
|
|
||||||
/** 修改按钮操作 */
|
|
||||||
handleUpdate(row) {
|
|
||||||
this.reset();
|
|
||||||
const id = row.id;
|
|
||||||
getEquipmentPlc(id).then((response) => {
|
|
||||||
this.form = response.data;
|
|
||||||
this.open = true;
|
|
||||||
this.title = '修改实时数据采集配置';
|
|
||||||
});
|
|
||||||
},
|
|
||||||
/** 提交按钮 */
|
|
||||||
submitForm() {
|
|
||||||
this.$refs['form'].validate((valid) => {
|
|
||||||
if (!valid) {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
// 修改的提交
|
|
||||||
if (this.form.id != null) {
|
|
||||||
updateEquipmentPlc(this.form).then((response) => {
|
|
||||||
this.$modal.msgSuccess('修改成功');
|
|
||||||
this.open = false;
|
|
||||||
this.getList();
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// 添加的提交
|
|
||||||
createEquipmentPlc(this.form).then((response) => {
|
|
||||||
this.$modal.msgSuccess('新增成功');
|
|
||||||
this.open = false;
|
|
||||||
this.getList();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
/** 删除按钮操作 */
|
|
||||||
handleDelete(row) {
|
|
||||||
const id = row.id;
|
|
||||||
this.$modal
|
|
||||||
.confirm('是否确认删除实时数据采集配置编号为"' + id + '"的数据项?')
|
|
||||||
.then(function () {
|
|
||||||
return deleteEquipmentPlc(id);
|
|
||||||
})
|
|
||||||
.then(() => {
|
|
||||||
this.getList();
|
|
||||||
this.$modal.msgSuccess('删除成功');
|
|
||||||
})
|
|
||||||
.catch(() => {});
|
|
||||||
},
|
|
||||||
/** 导出按钮操作 */
|
|
||||||
handleExport() {
|
|
||||||
// 处理查询参数
|
|
||||||
let params = { ...this.queryParams };
|
|
||||||
params.pageNo = undefined;
|
|
||||||
params.pageSize = undefined;
|
|
||||||
this.$modal
|
|
||||||
.confirm('是否确认导出所有实时数据采集配置数据项?')
|
|
||||||
.then(() => {
|
|
||||||
this.exportLoading = true;
|
|
||||||
return exportEquipmentPlcExcel(params);
|
|
||||||
})
|
|
||||||
.then((response) => {
|
|
||||||
this.$download.excel(response, '实时数据采集配置.xls');
|
|
||||||
this.exportLoading = false;
|
|
||||||
})
|
|
||||||
.catch(() => {});
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
* @Author: zwq
|
* @Author: zwq
|
||||||
* @Date: 2021-11-18 14:16:25
|
* @Date: 2021-11-18 14:16:25
|
||||||
* @LastEditors: zwq
|
* @LastEditors: zwq
|
||||||
* @LastEditTime: 2024-04-30 10:01:41
|
* @LastEditTime: 2025-02-25 16:11:14
|
||||||
* @Description:
|
* @Description:
|
||||||
-->
|
-->
|
||||||
<template>
|
<template>
|
||||||
|
|||||||
197
src/views/core/analysis/balanceAnalysis/BarChart.vue
Normal file
@@ -0,0 +1,197 @@
|
|||||||
|
<template>
|
||||||
|
<div
|
||||||
|
ref="lineChart"
|
||||||
|
:id="id"
|
||||||
|
:class="className"
|
||||||
|
:style="{ height: height, width: width, marginLeft: '10px' }" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
require('echarts/theme/macarons'); // echarts theme
|
||||||
|
import resize from '@/utils/chartMixins/resize';
|
||||||
|
import { parseTime } from '../../mixins/code-filter';
|
||||||
|
|
||||||
|
const animationDuration = 1000;
|
||||||
|
export default {
|
||||||
|
name: 'lineChart',
|
||||||
|
mixins: [resize],
|
||||||
|
props: {
|
||||||
|
id: {
|
||||||
|
type: String,
|
||||||
|
default: 'chart',
|
||||||
|
},
|
||||||
|
className: {
|
||||||
|
type: String,
|
||||||
|
default: 'chart',
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
width: {
|
||||||
|
type: String,
|
||||||
|
default: '100%',
|
||||||
|
},
|
||||||
|
height: {
|
||||||
|
type: String,
|
||||||
|
default: '300px',
|
||||||
|
},
|
||||||
|
barData: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
chart: null,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
if (!this.chart) {
|
||||||
|
this.chart = echarts.init(this.$refs.lineChart);
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.initChart();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
if (!this.chart) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.chart.dispose();
|
||||||
|
this.chart = null;
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
barData: {
|
||||||
|
handler() {
|
||||||
|
if (this.chart) {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.initChart();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.chart = echarts.init(this.$refs.lineChart);
|
||||||
|
this.initChart();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
deep: true,
|
||||||
|
immediate: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
initChart() {
|
||||||
|
const _this = this;
|
||||||
|
this.chart.setOption({
|
||||||
|
title: {
|
||||||
|
text: this.title
|
||||||
|
? '{space|}{tip|}{space|}{value|' + this.title + '}'
|
||||||
|
: '',
|
||||||
|
textStyle: {
|
||||||
|
rich: {
|
||||||
|
tip: {
|
||||||
|
width: 6,
|
||||||
|
height: 6,
|
||||||
|
borderRadius: 50,
|
||||||
|
backgroundColor: '#288AFF',
|
||||||
|
},
|
||||||
|
space: {
|
||||||
|
width: 8,
|
||||||
|
},
|
||||||
|
value: {
|
||||||
|
fontSize: 14,
|
||||||
|
color: 'black',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
color: ['#288AFF', '#8EF0AB', '#FFDC94'],
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
|
type: 'cross',
|
||||||
|
crossStyle: {
|
||||||
|
color: '#999',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: ['磨边节拍', '钢化节拍', '下片节拍'],
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
containLabel: true,
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
type: 'category',
|
||||||
|
data: this.barData.edgeCt.map((item) => {
|
||||||
|
return parseTime(item.recordTime, '{m}-{d} {h}:{i}');
|
||||||
|
}),
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
type: 'value',
|
||||||
|
name: '节拍 pcs/min',
|
||||||
|
min: 0,
|
||||||
|
axisLabel: {
|
||||||
|
formatter: '{value}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
dataZoom: [
|
||||||
|
{
|
||||||
|
type: 'inside',
|
||||||
|
start: 0,
|
||||||
|
end: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
start: 0,
|
||||||
|
end: 100,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: '磨边节拍',
|
||||||
|
type: 'line',
|
||||||
|
tooltip: {
|
||||||
|
valueFormatter: function (value) {
|
||||||
|
return value + 'pcs/min';
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data: this.barData.edgeCt.map((item) => {
|
||||||
|
return item.ct;
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '钢化节拍',
|
||||||
|
type: 'line',
|
||||||
|
tooltip: {
|
||||||
|
valueFormatter: function (value) {
|
||||||
|
return value + 'pcs/min';
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data: this.barData.temperCt.map((item) => {
|
||||||
|
return item.ct;
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '下片节拍',
|
||||||
|
type: 'line',
|
||||||
|
tooltip: {
|
||||||
|
valueFormatter: function (value) {
|
||||||
|
return value + 'pcs/min';
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data: this.barData.downCt.map((item) => {
|
||||||
|
return item.ct;
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
273
src/views/core/analysis/balanceAnalysis/eq-detail.vue
Normal file
@@ -0,0 +1,273 @@
|
|||||||
|
<!--
|
||||||
|
* @Author: zwq
|
||||||
|
* @Date: 2023-08-24 14:47:58
|
||||||
|
* @LastEditors: zwq
|
||||||
|
* @LastEditTime: 2025-01-09 10:04:17
|
||||||
|
* @Description:
|
||||||
|
-->
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<base-table
|
||||||
|
:page="1"
|
||||||
|
:limit="999"
|
||||||
|
v-loading="dataListLoading"
|
||||||
|
:table-props="tableProps"
|
||||||
|
max-height="400"
|
||||||
|
:table-data="tableData">
|
||||||
|
<method-btn
|
||||||
|
v-if="tableData.length"
|
||||||
|
slot="handleBtn"
|
||||||
|
:width="80"
|
||||||
|
label="操作"
|
||||||
|
:method-list="tableBtn"
|
||||||
|
@clickBtn="handleClick" />
|
||||||
|
</base-table>
|
||||||
|
<div v-if="eqChartData.length > 0" style="margin-top: 10px">
|
||||||
|
<search-bar
|
||||||
|
:formConfigs="formConfig"
|
||||||
|
ref="searchBarForm1"
|
||||||
|
@headBtnClick="buttonClick" />
|
||||||
|
<div
|
||||||
|
ref="lineChart"
|
||||||
|
id="chart"
|
||||||
|
:style="{ height: '400px', width: '100%', marginLeft: '10px' }" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { getNewCTDet, getNewCTCharts } from '@/api/core/analysis/index';
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
require('echarts/theme/macarons'); // echarts theme
|
||||||
|
import resize from '@/utils/chartMixins/resize';
|
||||||
|
import { parseTime } from '../../mixins/code-filter';
|
||||||
|
|
||||||
|
const tableProps = [
|
||||||
|
{
|
||||||
|
prop: 'equipmentName',
|
||||||
|
label: '设备',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'size',
|
||||||
|
label: '规格',
|
||||||
|
showOverflowtooltip: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'process',
|
||||||
|
label: '产品工艺',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'standardCt',
|
||||||
|
label: '标准节拍pcs/min',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'ct',
|
||||||
|
label: '当前节拍pcs/min',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
export default {
|
||||||
|
mixins: [resize],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
tableProps,
|
||||||
|
tableData: [],
|
||||||
|
tableBtn: [
|
||||||
|
{
|
||||||
|
type: 'eqChart',
|
||||||
|
btnName: '趋势图',
|
||||||
|
},
|
||||||
|
].filter((v) => v),
|
||||||
|
dataListLoading: false,
|
||||||
|
time: {},
|
||||||
|
eqChartData: [],
|
||||||
|
eqName: null,
|
||||||
|
equipmentId: null,
|
||||||
|
chart: null,
|
||||||
|
formConfig: [
|
||||||
|
{
|
||||||
|
type: 'datePicker',
|
||||||
|
label: '时间范围',
|
||||||
|
dateType: 'datetimerange',
|
||||||
|
format: 'yyyy-MM-dd HH:mm:ss',
|
||||||
|
valueFormat: 'timestamp',
|
||||||
|
rangeSeparator: '-',
|
||||||
|
startPlaceholder: '开始时间',
|
||||||
|
endPlaceholder: '结束时间',
|
||||||
|
defaultTime: ['00:00:00', '23:59:59'],
|
||||||
|
param: 'timeVal',
|
||||||
|
width: 350,
|
||||||
|
clearable: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'button',
|
||||||
|
btnName: '查询',
|
||||||
|
name: 'search',
|
||||||
|
color: 'primary',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
components: {},
|
||||||
|
created() {},
|
||||||
|
mounted() {},
|
||||||
|
beforeDestroy() {
|
||||||
|
if (!this.chart) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.chart.dispose();
|
||||||
|
this.chart = null;
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// 获取数据列表
|
||||||
|
init(lineId, startTime, endTime) {
|
||||||
|
this.eqChartData = [];
|
||||||
|
this.time.startTime = startTime;
|
||||||
|
this.time.endTime = endTime;
|
||||||
|
this.dataListLoading = true;
|
||||||
|
getNewCTDet(lineId).then((response) => {
|
||||||
|
this.tableData = response.data;
|
||||||
|
this.dataListLoading = false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
handleClick(val) {
|
||||||
|
const data = {
|
||||||
|
...this.time,
|
||||||
|
equipmentId: val.data.equipmentId,
|
||||||
|
};
|
||||||
|
this.eqName = val.data.equipmentName;
|
||||||
|
this.equipmentId = val.data.equipmentId;
|
||||||
|
getNewCTCharts(data).then((response) => {
|
||||||
|
this.eqChartData = response.data;
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs.searchBarForm1.formInline.timeVal = [
|
||||||
|
this.time.startTime,
|
||||||
|
this.time.endTime,
|
||||||
|
];
|
||||||
|
this.initChart();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
buttonClick(val) {
|
||||||
|
switch (val.btnName) {
|
||||||
|
case 'search':
|
||||||
|
this.time.startTime = val.timeVal ? val.timeVal[0] : undefined;
|
||||||
|
this.time.endTime = val.timeVal ? val.timeVal[1] : undefined;
|
||||||
|
const data = {
|
||||||
|
...this.time,
|
||||||
|
equipmentId: this.equipmentId,
|
||||||
|
};
|
||||||
|
getNewCTCharts(data).then((response) => {
|
||||||
|
this.eqChartData = response.data;
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.initChart();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
console.log(val);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
initChart() {
|
||||||
|
this.chart = echarts.init(this.$refs.lineChart);
|
||||||
|
const _this = this;
|
||||||
|
this.chart.setOption({
|
||||||
|
title: {
|
||||||
|
text: this.eqName
|
||||||
|
? '{space|}{tip|}{space|}{value|' + this.eqName + ' 节拍趋势图' + '}'
|
||||||
|
: '',
|
||||||
|
textStyle: {
|
||||||
|
rich: {
|
||||||
|
tip: {
|
||||||
|
width: 6,
|
||||||
|
height: 6,
|
||||||
|
borderRadius: 50,
|
||||||
|
backgroundColor: '#288AFF',
|
||||||
|
},
|
||||||
|
space: {
|
||||||
|
width: 8,
|
||||||
|
},
|
||||||
|
value: {
|
||||||
|
fontSize: 14,
|
||||||
|
color: 'black',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
color: ['#288AFF', '#8EF0AB', '#FFDC94'],
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
|
type: 'cross',
|
||||||
|
crossStyle: {
|
||||||
|
color: '#999',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: ['当前节拍', '标准节拍'],
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
containLabel: true,
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
type: 'category',
|
||||||
|
data: this.eqChartData[0].ct.map((item) => {
|
||||||
|
return parseTime(item.recordTime, '{m}-{d} {h}:{i}');
|
||||||
|
}),
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
type: 'value',
|
||||||
|
name: '节拍',
|
||||||
|
min: 0,
|
||||||
|
interval: 20,
|
||||||
|
axisLabel: {
|
||||||
|
formatter: '{value} pcs/min',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
dataZoom: [
|
||||||
|
{
|
||||||
|
type: 'inside',
|
||||||
|
start: 0,
|
||||||
|
end: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
start: 0,
|
||||||
|
end: 100,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: '标准节拍',
|
||||||
|
type: 'line',
|
||||||
|
tooltip: {
|
||||||
|
valueFormatter: function (value) {
|
||||||
|
return value + 'pcs/min';
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data: this.eqChartData[0].ct.map((item) => {
|
||||||
|
return item.standardCt;
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '当前节拍',
|
||||||
|
type: 'line',
|
||||||
|
tooltip: {
|
||||||
|
valueFormatter: function (value) {
|
||||||
|
return value + 'pcs/min';
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data: this.eqChartData[0].ct.map((item) => {
|
||||||
|
return item.ct;
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
296
src/views/core/analysis/balanceAnalysis/index-old.vue
Normal file
@@ -0,0 +1,296 @@
|
|||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
<search-bar
|
||||||
|
:formConfigs="formConfig"
|
||||||
|
ref="searchBarForm"
|
||||||
|
@headBtnClick="buttonClick" />
|
||||||
|
<div v-if="tableData.length">
|
||||||
|
<base-table
|
||||||
|
v-loading="dataListLoading"
|
||||||
|
:span-method="mergeColumnHandler"
|
||||||
|
:max-height="tableH"
|
||||||
|
:table-props="tableProps"
|
||||||
|
:table-data="tableData" />
|
||||||
|
<SearchBar :formConfigs="[{ label: '产线平衡分析图', type: 'title' }]" />
|
||||||
|
<balance-chart ref="lineChart" />
|
||||||
|
</div>
|
||||||
|
<div v-else class="no-data-bg"></div>
|
||||||
|
<!-- <pagination
|
||||||
|
:limit.sync="listQuery.pageSize"
|
||||||
|
:page.sync="listQuery.pageNo"
|
||||||
|
:total="listQuery.total"
|
||||||
|
@pagination="getDataList" /> -->
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// import basicPage from '../../mixins/basic-page';
|
||||||
|
import { parseTime } from '../../mixins/code-filter';
|
||||||
|
import { getCT } from '@/api/core/analysis/index';
|
||||||
|
import { getProductionLinePage } from '@/api/core/base/productionLine';
|
||||||
|
import BalanceChart from '../balanceChart';
|
||||||
|
import { time } from 'echarts';
|
||||||
|
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
|
||||||
|
// import { getWorkshopSectionPage } from '@/api/core/base/workshopSection';
|
||||||
|
|
||||||
|
// const tableProps = [
|
||||||
|
// // {
|
||||||
|
// // prop: 'lineName',
|
||||||
|
// // label: '产线',
|
||||||
|
// // align: 'center',
|
||||||
|
// // },
|
||||||
|
// // {
|
||||||
|
// // prop: 'sum',
|
||||||
|
// // label: '合计',
|
||||||
|
// // align: 'center',
|
||||||
|
// // },
|
||||||
|
// // {
|
||||||
|
// // prop: 'dynamicValue',
|
||||||
|
// // label: 'dynamicName',
|
||||||
|
// // align: 'center',
|
||||||
|
// // children:[
|
||||||
|
|
||||||
|
// // ]
|
||||||
|
// // }
|
||||||
|
// ];
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
BalanceChart,
|
||||||
|
},
|
||||||
|
mixins: [tableHeightMixin],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
urlOptions: {
|
||||||
|
getDataListURL: getCT,
|
||||||
|
},
|
||||||
|
tableProps: [],
|
||||||
|
dataListLoading: false,
|
||||||
|
tableData: [],
|
||||||
|
listQuery: {
|
||||||
|
// time: ''
|
||||||
|
endTime: undefined,
|
||||||
|
lineId: undefined,
|
||||||
|
startTime: undefined,
|
||||||
|
},
|
||||||
|
timeList: [],
|
||||||
|
spanArr: [],
|
||||||
|
xData: [],
|
||||||
|
yData: [],
|
||||||
|
optionArrUrl: [getProductionLinePage],
|
||||||
|
formConfig: [
|
||||||
|
{
|
||||||
|
type: 'select',
|
||||||
|
label: '产线',
|
||||||
|
selectOptions: [],
|
||||||
|
param: 'lineIds',
|
||||||
|
defaultSelect: '',
|
||||||
|
multiple: false,
|
||||||
|
filterable: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'datePicker',
|
||||||
|
label: '时间',
|
||||||
|
dateType: 'datetimerange',
|
||||||
|
format: 'yyyy-MM-dd',
|
||||||
|
valueFormat: 'yyyy-MM-dd HH:mm:ss',
|
||||||
|
rangeSeparator: '-',
|
||||||
|
startPlaceholder: '开始时间',
|
||||||
|
endPlaceholder: '结束时间',
|
||||||
|
width: 350,
|
||||||
|
param: 'time',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'button',
|
||||||
|
btnName: '查询',
|
||||||
|
name: 'search',
|
||||||
|
color: 'primary',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.getArr();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
getArr() {
|
||||||
|
const params = {
|
||||||
|
page: 1,
|
||||||
|
limit: 500,
|
||||||
|
};
|
||||||
|
this.optionArrUrl.forEach((item, index) => {
|
||||||
|
item(params).then((response) => {
|
||||||
|
this.formConfig[index].selectOptions = response.data.list;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
setRowSpan(arr) {
|
||||||
|
let count = 0;
|
||||||
|
arr.forEach((item, index) => {
|
||||||
|
if (index === 0) {
|
||||||
|
this.spanArr.push(1);
|
||||||
|
} else {
|
||||||
|
if (item === arr[index - 1]) {
|
||||||
|
this.spanArr[count] += 1;
|
||||||
|
this.spanArr.push(0);
|
||||||
|
} else {
|
||||||
|
count = index;
|
||||||
|
this.spanArr.push(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/** 合并table列的规则 */
|
||||||
|
mergeColumnHandler({ row, column, rowIndex, columnIndex }) {
|
||||||
|
if (columnIndex == 0) {
|
||||||
|
if (this.spanArr[rowIndex]) {
|
||||||
|
return [
|
||||||
|
this.spanArr[rowIndex], // row span
|
||||||
|
1, // col span
|
||||||
|
];
|
||||||
|
} else {
|
||||||
|
return [0, 0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getData() {
|
||||||
|
// this.listQuery.lineId = '1672847052717821953'
|
||||||
|
// this.listQuery.startTime = '1693497600000';
|
||||||
|
// this.listQuery.endTime = '1693843200000';
|
||||||
|
this.urlOptions.getDataListURL(this.listQuery).then((res) => {
|
||||||
|
console.log(res);
|
||||||
|
let arr = [
|
||||||
|
{
|
||||||
|
prop: 'sectionName',
|
||||||
|
label: '工段',
|
||||||
|
align: 'center',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'equName',
|
||||||
|
label: '设备',
|
||||||
|
align: 'center',
|
||||||
|
width: 150
|
||||||
|
},
|
||||||
|
];
|
||||||
|
let sectionArr = [];
|
||||||
|
res.data.data.forEach((ele, index) => {
|
||||||
|
let tempData = [];
|
||||||
|
let ggData = [];
|
||||||
|
let sbluData = [];
|
||||||
|
let sbsjData = [];
|
||||||
|
let cxluData = [];
|
||||||
|
let cxsjData = [];
|
||||||
|
ele.data.forEach((item, index) => {
|
||||||
|
item.children.forEach((params) => {
|
||||||
|
if (params.dynamicName === '生产规格') {
|
||||||
|
tempData[item.dynamicName + '_gg'] = params.dynamicValue;
|
||||||
|
ggData[index] = params.dynamicValue;
|
||||||
|
} else if (params.dynamicName === '设备理论速度') {
|
||||||
|
tempData[item.dynamicName + '_sblu'] = params.dynamicValue;
|
||||||
|
sbluData[index] = params.dynamicValue;
|
||||||
|
} else if (params.dynamicName === '设备实际速度') {
|
||||||
|
tempData[item.dynamicName + '_sbsj'] = params.dynamicValue;
|
||||||
|
sbsjData[index] = params.dynamicValue;
|
||||||
|
} else if (params.dynamicName === '产线理论速度') {
|
||||||
|
tempData[item.dynamicName + '_cxlu'] = params.dynamicValue;
|
||||||
|
cxluData[index] = params.dynamicValue;
|
||||||
|
} else if(params.dynamicName === '产线实际速度') {
|
||||||
|
tempData[item.dynamicName + '_cxsj'] = params.dynamicValue;
|
||||||
|
cxsjData[index] = params.dynamicValue;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
const equipment = {
|
||||||
|
name: ele.equName,
|
||||||
|
ggData: ggData,
|
||||||
|
sbluData: sbluData,
|
||||||
|
sbsjData: sbsjData,
|
||||||
|
cxluData: cxluData,
|
||||||
|
cxsjData: cxsjData,
|
||||||
|
};
|
||||||
|
tempData['equName'] = ele.equName;
|
||||||
|
tempData['sectionName'] = ele.sectionName;
|
||||||
|
this.tableData.push(tempData);
|
||||||
|
const { sectionName } = tempData;
|
||||||
|
sectionArr.push(sectionName);
|
||||||
|
this.yData.push(equipment);
|
||||||
|
});
|
||||||
|
this.setRowSpan(sectionArr);
|
||||||
|
res.data.nameData.forEach((item) => {
|
||||||
|
this.timeList.push(item.name);
|
||||||
|
});
|
||||||
|
const timeArray = Array.from(new Set(this.timeList));
|
||||||
|
console.log(timeArray)
|
||||||
|
for (const times of timeArray) {
|
||||||
|
if (times !== '生产规格' && times !== '设备理论速度' && times !== '设备实际速度'
|
||||||
|
&& times !== '产线理论速度' && times !== '产线实际速度'
|
||||||
|
) {
|
||||||
|
const subprop = {
|
||||||
|
label: times,
|
||||||
|
align: 'center',
|
||||||
|
children: [
|
||||||
|
{ prop: times + '_gg', label: '生产规格', align: 'center' },
|
||||||
|
{ prop: times + '_sblu', label: '设备理论速度[片/min]', align: 'center' },
|
||||||
|
{ prop: times + '_sbsj', label: '设备实际速度[片/min]', align: 'center' },
|
||||||
|
{ prop: times + '_cxlu', label: '产线理论速度[片/min]', align: 'center' },
|
||||||
|
{ prop: times + '_cxsj', label: '产线实际速度[片/min]', align: 'center' },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
arr.push(subprop);
|
||||||
|
this.xData.push(times);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.tableProps = arr;
|
||||||
|
|
||||||
|
console.log(this.$refs)
|
||||||
|
this.$nextTick(()=>{
|
||||||
|
this.$refs.lineChart.initChart(this.xData, this.yData);
|
||||||
|
})
|
||||||
|
// this.total = response.data.total;
|
||||||
|
// this.dataListLoading = false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
buttonClick(val) {
|
||||||
|
// console.log(val)
|
||||||
|
switch (val.btnName) {
|
||||||
|
case 'search':
|
||||||
|
// this.listQuery.pageNo = 1;
|
||||||
|
// this.listQuery.pageSize = 10;
|
||||||
|
this.listQuery.lineId = val.lineIds;
|
||||||
|
this.listQuery.startTime = val.time
|
||||||
|
? String(new Date(val.time[0]).getTime())
|
||||||
|
: undefined;
|
||||||
|
this.listQuery.endTime = val.time
|
||||||
|
? String(new Date(val.time[1]).getTime())
|
||||||
|
: undefined;
|
||||||
|
if (val.time && val.lineIds) {
|
||||||
|
this.tableData = [];
|
||||||
|
this.xData = [];
|
||||||
|
this.yData = [];
|
||||||
|
this.tableProps = [];
|
||||||
|
this.spanArr = [];
|
||||||
|
this.timeList = [];
|
||||||
|
this.getData();
|
||||||
|
} else {
|
||||||
|
this.$message({
|
||||||
|
message: '请选择产线和时间',
|
||||||
|
type: 'warning',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'reset':
|
||||||
|
this.$refs.searchBarForm.resetForm();
|
||||||
|
this.listQuery = {
|
||||||
|
pageSize: 10,
|
||||||
|
pageNo: 1,
|
||||||
|
total: 1,
|
||||||
|
};
|
||||||
|
this.getDataList();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
console.log(val);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
@@ -1,260 +1,302 @@
|
|||||||
|
<!--
|
||||||
|
* @Author: Do not edit
|
||||||
|
* @Date: 2023-08-29 14:59:29
|
||||||
|
* @LastEditTime: 2025-01-09 10:27:53
|
||||||
|
* @LastEditors: zwq
|
||||||
|
* @Description:
|
||||||
|
-->
|
||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<search-bar :formConfigs="formConfig" ref="searchBarForm" @headBtnClick="buttonClick" />
|
<search-bar
|
||||||
<div v-if="tableData.length">
|
:formConfigs="formConfig"
|
||||||
<base-table v-loading="dataListLoading" :span-method="mergeColumnHandler" :table-props="tableProps" :table-data="tableData" />
|
ref="searchBarForm"
|
||||||
<SearchBar :formConfigs="[{ label: '产线平衡分析图', type: 'title' }]" />
|
@select-changed="handleSearchBarChanged"
|
||||||
<balance-chart ref="lineChart" />
|
@headBtnClick="buttonClick" />
|
||||||
|
<div v-if="showData.length">
|
||||||
|
<base-table
|
||||||
|
class="right-aside"
|
||||||
|
v-loading="dataListLoading"
|
||||||
|
:table-props="tableProps"
|
||||||
|
:page="1"
|
||||||
|
:limit="999"
|
||||||
|
:table-data="showData">
|
||||||
|
<method-btn
|
||||||
|
v-if="showData.length"
|
||||||
|
slot="handleBtn"
|
||||||
|
:width="80"
|
||||||
|
label="操作"
|
||||||
|
:method-list="tableBtn"
|
||||||
|
@clickBtn="handleClick" />
|
||||||
|
</base-table>
|
||||||
|
<barChart
|
||||||
|
v-for="item in chartData"
|
||||||
|
:key="item.name + 'echart'"
|
||||||
|
style="margin-top: 50px"
|
||||||
|
height="600px"
|
||||||
|
:id="item.name + 'echart'"
|
||||||
|
:title="item.name + ' 节拍趋势图'"
|
||||||
|
:bar-data="item" />
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="no-data-bg"></div>
|
<div v-else class="no-data-bg"></div>
|
||||||
<!-- <pagination
|
<base-dialog
|
||||||
:limit.sync="listQuery.pageSize"
|
:dialogTitle="addOrEditTitle"
|
||||||
:page.sync="listQuery.pageNo"
|
:dialogVisible="addOrUpdateVisible"
|
||||||
:total="listQuery.total"
|
@cancel="handleCancel"
|
||||||
@pagination="getDataList" /> -->
|
@confirm="handleConfirm"
|
||||||
|
:before-close="handleCancel"
|
||||||
|
close-on-click-modal
|
||||||
|
top="0"
|
||||||
|
width="50%">
|
||||||
|
<eq-detail ref="eqDetail" />
|
||||||
|
<slot name="footer">
|
||||||
|
<el-row slot="footer" type="flex" justify="end">
|
||||||
|
<el-col :span="24">
|
||||||
|
<el-button size="small" class="btnTextStyle" @click="handleCancel">
|
||||||
|
取消
|
||||||
|
</el-button>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</slot>
|
||||||
|
</base-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// import basicPage from '../../mixins/basic-page';
|
import eqDetail from './eq-detail';
|
||||||
import { parseTime } from '../../mixins/code-filter';
|
import { parseTime } from '../../mixins/code-filter';
|
||||||
import { getCT } from '@/api/core/analysis/index';
|
import { getPdList } from '@/api/core/monitoring/auto';
|
||||||
import { getProductionLinePage } from '@/api/core/base/productionLine';
|
import { getNewCTNow, getNewCTCharts } from '@/api/core/analysis/index';
|
||||||
import BalanceChart from '../balanceChart'
|
import { getFactoryPage } from '@/api/core/base/factory';
|
||||||
import { time } from 'echarts';
|
// import codeFilter from '../../mixins/code-filter'
|
||||||
// import { getWorkshopSectionPage } from '@/api/core/base/workshopSection';
|
import * as XLSX from 'xlsx';
|
||||||
|
import FileSaver from 'file-saver';
|
||||||
|
import barChart from './BarChart.vue';
|
||||||
|
|
||||||
// const tableProps = [
|
const tableProps = [
|
||||||
// // {
|
{
|
||||||
// // prop: 'lineName',
|
prop: 'factoryName',
|
||||||
// // label: '产线',
|
label: '工厂',
|
||||||
// // align: 'center',
|
},
|
||||||
// // },
|
{
|
||||||
// // {
|
prop: 'lineName',
|
||||||
// // prop: 'sum',
|
label: '产线',
|
||||||
// // label: '合计',
|
},
|
||||||
// // align: 'center',
|
{
|
||||||
// // },
|
prop: 'size',
|
||||||
// // {
|
label: '规格',
|
||||||
// // prop: 'dynamicValue',
|
showOverflowtooltip: true,
|
||||||
// // label: 'dynamicName',
|
},
|
||||||
// // align: 'center',
|
{
|
||||||
// // children:[
|
prop: 'process',
|
||||||
|
label: '产品工艺',
|
||||||
// // ]
|
},
|
||||||
// // }
|
{
|
||||||
// ];
|
prop: 'edgeCt',
|
||||||
|
label: '磨边当前节拍pcs/min',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'temperCt',
|
||||||
|
label: '钢化当前节拍pcs/min',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'downCt',
|
||||||
|
label: '下片当前节拍pcs/min',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
BalanceChart
|
barChart,
|
||||||
|
eqDetail,
|
||||||
},
|
},
|
||||||
// mixins: [basicPage],
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
urlOptions: {
|
urlOptions: {
|
||||||
getDataListURL: getCT,
|
getDataListURL: getNewCTNow,
|
||||||
},
|
},
|
||||||
tableProps: [],
|
|
||||||
dataListLoading: false,
|
|
||||||
tableData: [],
|
|
||||||
listQuery: {
|
listQuery: {
|
||||||
// time: ''
|
lineId: [],
|
||||||
endTime: undefined,
|
|
||||||
lineId:undefined,
|
|
||||||
startTime:undefined
|
|
||||||
},
|
},
|
||||||
timeList: [],
|
fileName: '',
|
||||||
spanArr: [],
|
dataListLoading: false,
|
||||||
xData: [],
|
tableProps,
|
||||||
yData: [],
|
tableBtn: [
|
||||||
optionArrUrl: [getProductionLinePage],
|
{
|
||||||
|
type: 'eq',
|
||||||
|
btnName: '详情',
|
||||||
|
},
|
||||||
|
].filter((v) => v),
|
||||||
|
showData: [],
|
||||||
|
tableData: [],
|
||||||
|
chartData: [],
|
||||||
formConfig: [
|
formConfig: [
|
||||||
|
{
|
||||||
|
type: 'select',
|
||||||
|
label: '工厂',
|
||||||
|
selectOptions: [],
|
||||||
|
param: 'factoryId',
|
||||||
|
onchange: true,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
type: 'select',
|
type: 'select',
|
||||||
label: '产线',
|
label: '产线',
|
||||||
selectOptions: [],
|
selectOptions: [],
|
||||||
param: 'lineIds',
|
param: 'lineId',
|
||||||
defaultSelect: '',
|
multiple: true,
|
||||||
multiple: false,
|
|
||||||
filterable: true,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'datePicker',
|
type: 'datePicker',
|
||||||
label: '时间',
|
label: '时间范围',
|
||||||
dateType: 'datetimerange',
|
dateType: 'datetimerange',
|
||||||
format: 'yyyy-MM-dd',
|
format: 'yyyy-MM-dd HH:mm:ss',
|
||||||
valueFormat: 'yyyy-MM-dd HH:mm:ss',
|
valueFormat: 'timestamp',
|
||||||
rangeSeparator: '-',
|
rangeSeparator: '-',
|
||||||
startPlaceholder: '开始时间',
|
startPlaceholder: '开始时间',
|
||||||
endPlaceholder: '结束时间',
|
endPlaceholder: '结束时间',
|
||||||
|
defaultTime: ['00:00:00', '23:59:59'],
|
||||||
|
param: 'timeVal',
|
||||||
width: 350,
|
width: 350,
|
||||||
param: 'time',
|
clearable: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'button',
|
type: 'button',
|
||||||
btnName: '查询',
|
btnName: '查询',
|
||||||
name: 'search',
|
name: 'search',
|
||||||
color: 'primary',
|
color: 'primary',
|
||||||
}
|
},
|
||||||
|
// {
|
||||||
|
// type: 'separate',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// // type: this.$auth.hasPermi('base:factory:export') ? 'button' : '',
|
||||||
|
// type: 'button',
|
||||||
|
// btnName: '导出',
|
||||||
|
// name: 'export',
|
||||||
|
// color: 'warning',
|
||||||
|
// },
|
||||||
],
|
],
|
||||||
|
addOrEditTitle: '',
|
||||||
|
addOrUpdateVisible: false,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.getArr();
|
// 获取当前时间
|
||||||
|
const now = new Date();
|
||||||
|
// 获取前一天的同一时间
|
||||||
|
const yesterday = new Date(now.getTime() - 24 * 60 * 60 * 1000);
|
||||||
|
// 设置为00:00:00
|
||||||
|
yesterday.setHours(0, 0, 0, 0);
|
||||||
|
// 设置为23:59:59
|
||||||
|
const end = new Date(yesterday.getTime());
|
||||||
|
end.setHours(23, 59, 59, 59);
|
||||||
|
this.listQuery.startTime = yesterday.getTime();
|
||||||
|
this.listQuery.endTime = end.getTime();
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs.searchBarForm.formInline.timeVal = [
|
||||||
|
yesterday.getTime(),
|
||||||
|
end.getTime(),
|
||||||
|
];
|
||||||
|
});
|
||||||
|
this.getDataList();
|
||||||
|
this.getPdLineList();
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
getArr() {
|
handleExport() {
|
||||||
const params = {
|
let tables = document.querySelector('.el-table').cloneNode(true);
|
||||||
page: 1,
|
const fix = tables.querySelector('.el-table__fixed');
|
||||||
limit: 500
|
const fixRight = tables.querySelector('.el-table__fixed-right');
|
||||||
|
if (fix) {
|
||||||
|
tables.removeChild(tables.querySelector('.el-table__fixed'));
|
||||||
}
|
}
|
||||||
this.optionArrUrl.forEach((item, index) => {
|
if (fixRight) {
|
||||||
item(params).then((response) => {
|
tables.removeChild(tables.querySelector('.el-table__fixed-right'));
|
||||||
this.formConfig[index].selectOptions = response.data.list
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
setRowSpan(arr) {
|
|
||||||
let count = 0
|
|
||||||
arr.forEach((item, index) => {
|
|
||||||
if(index === 0) {
|
|
||||||
this.spanArr.push(1)
|
|
||||||
} else {
|
|
||||||
if (item === arr[index - 1]) {
|
|
||||||
this.spanArr[count] += 1
|
|
||||||
this.spanArr.push(0)
|
|
||||||
} else {
|
|
||||||
count = index
|
|
||||||
this.spanArr.push(1)
|
|
||||||
}
|
}
|
||||||
}
|
let exportTable = XLSX.utils.table_to_book(tables);
|
||||||
})
|
|
||||||
},
|
|
||||||
/** 合并table列的规则 */
|
|
||||||
mergeColumnHandler({ row, column, rowIndex, columnIndex }) {
|
|
||||||
if (columnIndex == 0) {
|
|
||||||
if (this.spanArr[rowIndex]) {
|
|
||||||
return [
|
|
||||||
this.spanArr[rowIndex], // row span
|
|
||||||
1, // col span
|
|
||||||
];
|
|
||||||
} else {
|
|
||||||
return [0, 0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getData() {
|
|
||||||
// this.listQuery.lineId = '1672847052717821953'
|
|
||||||
// this.listQuery.startTime = '1693497600000';
|
|
||||||
// this.listQuery.endTime = '1693843200000';
|
|
||||||
this.urlOptions.getDataListURL(this.listQuery).then(res => {
|
|
||||||
console.log(res)
|
|
||||||
let arr = [
|
|
||||||
{
|
|
||||||
prop: 'sectionName',
|
|
||||||
label: '工段',
|
|
||||||
align: 'center',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'equName',
|
|
||||||
label: '设备',
|
|
||||||
align: 'center',
|
|
||||||
}
|
|
||||||
]
|
|
||||||
let sectionArr= []
|
|
||||||
res.data.data.forEach((ele, index) => {
|
|
||||||
let tempData = []
|
|
||||||
let eqData = []
|
|
||||||
let plData = []
|
|
||||||
ele.data.forEach((item, index) => {
|
|
||||||
item.children.forEach(params => {
|
|
||||||
if (params.dynamicName === '设备CT') {
|
|
||||||
tempData[item.dynamicName + '_eq'] = params.dynamicValue
|
|
||||||
eqData[index] = params.dynamicValue
|
|
||||||
} else {
|
|
||||||
tempData[item.dynamicName + '_pl'] = params.dynamicValue
|
|
||||||
plData[index] = params.dynamicValue
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
const equipment = {
|
|
||||||
name: ele.equName,
|
|
||||||
eqData: eqData,
|
|
||||||
plData: plData
|
|
||||||
}
|
|
||||||
tempData['equName'] = ele.equName
|
|
||||||
tempData['sectionName'] = ele.sectionName
|
|
||||||
this.tableData.push(tempData)
|
|
||||||
const { sectionName } = tempData
|
|
||||||
sectionArr.push(sectionName)
|
|
||||||
this.yData.push(equipment)
|
|
||||||
console.log('看看equ', this.yData)
|
|
||||||
})
|
|
||||||
this.setRowSpan(sectionArr)
|
|
||||||
res.data.nameData.forEach(item => {
|
|
||||||
this.timeList.push(item.name)
|
|
||||||
})
|
|
||||||
const timeArray = Array.from(new Set(this.timeList))
|
|
||||||
for (const times of timeArray) {
|
|
||||||
if (times !== '设备CT' && times !== '产线CT') {
|
|
||||||
const subprop = {
|
|
||||||
label: times,
|
|
||||||
align: 'center',
|
|
||||||
children: [
|
|
||||||
{ prop: times + '_eq', label: '设备CT', align: 'center' },
|
|
||||||
{ prop: times + '_pl', label: '产线CT', align: 'center' }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
arr.push(subprop)
|
|
||||||
this.xData.push(times)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.tableProps = arr
|
|
||||||
|
|
||||||
console.log('表格横坐标', this.xData)
|
var exportTableOut = XLSX.write(exportTable, {
|
||||||
this.$refs.lineChart.initChart(this.xData, this.yData)
|
bookType: 'xlsx',
|
||||||
// this.total = response.data.total;
|
bookSST: true,
|
||||||
// this.dataListLoading = false;
|
type: 'array',
|
||||||
|
});
|
||||||
|
// sheetjs.xlsx为导出表格的标题名称
|
||||||
|
try {
|
||||||
|
FileSaver.saveAs(
|
||||||
|
new Blob([exportTableOut], {
|
||||||
|
type: 'application/octet-stream',
|
||||||
|
}),
|
||||||
|
this.fileName + '产线自动报表.xlsx'
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
if (typeof console !== 'undefined') console.log(e, exportTableOut);
|
||||||
|
}
|
||||||
|
return exportTableOut;
|
||||||
|
},
|
||||||
|
getPdLineList() {
|
||||||
|
getPdList().then((res) => {
|
||||||
|
this.formConfig[1].selectOptions = res.data || [];
|
||||||
|
});
|
||||||
|
const params = {
|
||||||
|
pageSize: 100,
|
||||||
|
pageNo: 1,
|
||||||
|
};
|
||||||
|
getFactoryPage(params).then((res) => {
|
||||||
|
this.formConfig[0].selectOptions = res.data.list || [];
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
buttonClick(val) {
|
buttonClick(val) {
|
||||||
// console.log(val)
|
|
||||||
switch (val.btnName) {
|
switch (val.btnName) {
|
||||||
case 'search':
|
case 'search':
|
||||||
// this.listQuery.pageNo = 1;
|
this.listQuery.factoryId = val.factoryId || undefined;
|
||||||
// this.listQuery.pageSize = 10;
|
this.listQuery.lineId = val.lineId ? val.lineId : [];
|
||||||
this.listQuery.lineId = val.lineIds
|
this.listQuery.startTime = val.timeVal ? val.timeVal[0] : undefined;
|
||||||
this.listQuery.startTime = val.time ? String(new Date(val.time[0]).getTime()) : undefined;
|
this.listQuery.endTime = val.timeVal ? val.timeVal[1] : undefined;
|
||||||
this.listQuery.endTime = val.time ? String(new Date(val.time[1]).getTime()) : undefined;
|
|
||||||
if (val.time && val.lineIds) {
|
|
||||||
this.tableData = []
|
|
||||||
this.xData = []
|
|
||||||
this.yData = []
|
|
||||||
this.tableProps = []
|
|
||||||
this.spanArr = []
|
|
||||||
this.timeList = []
|
|
||||||
this.getData()
|
|
||||||
} else {
|
|
||||||
this.$message({
|
|
||||||
message: '请选择产线和时间',
|
|
||||||
type: 'warning'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'reset':
|
|
||||||
this.$refs.searchBarForm.resetForm();
|
|
||||||
this.listQuery = {
|
|
||||||
pageSize: 10,
|
|
||||||
pageNo: 1,
|
|
||||||
total: 1,
|
|
||||||
};
|
|
||||||
this.getDataList();
|
this.getDataList();
|
||||||
break;
|
break;
|
||||||
|
case 'export':
|
||||||
|
this.handleExport();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
console.log(val);
|
console.log(val);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
// 获取数据列表
|
||||||
|
getDataList() {
|
||||||
|
this.dataListLoading = true;
|
||||||
|
this.urlOptions.getDataListURL(this.listQuery).then((response) => {
|
||||||
|
this.tableData = response.data;
|
||||||
|
this.dataListLoading = false;
|
||||||
|
this.showData = this.tableData;
|
||||||
|
});
|
||||||
|
getNewCTCharts(this.listQuery).then((response) => {
|
||||||
|
this.chartData = response.data;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
handleSearchBarChanged({ param, value }) {
|
||||||
|
this.listQuery.lineId = [];
|
||||||
|
this.$refs.searchBarForm.formInline.lineId = undefined;
|
||||||
|
getPdList(value).then((res) => {
|
||||||
|
this.formConfig[1].selectOptions = res.data || [];
|
||||||
|
});
|
||||||
|
},
|
||||||
|
handleClick(val) {
|
||||||
|
this.addOrUpdateVisible = true;
|
||||||
|
this.addOrEditTitle =
|
||||||
|
val.data?.factoryName + '-' + val.data?.lineName + ' 详情';
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs.eqDetail.init(
|
||||||
|
val.data.lineId,
|
||||||
|
this.listQuery.startTime,
|
||||||
|
this.listQuery.endTime
|
||||||
|
);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
handleCancel() {
|
||||||
|
this.addOrUpdateVisible = false;
|
||||||
|
this.addOrEditTitle = '';
|
||||||
|
},
|
||||||
|
handleConfirm() {
|
||||||
|
this.handleCancel();
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<!--
|
<!--
|
||||||
* @Author: zhp
|
* @Author: zhp
|
||||||
* @Date: 2023-09-13 09:02:25
|
* @Date: 2023-09-13 09:02:25
|
||||||
* @LastEditTime: 2023-10-08 16:36:37
|
* @LastEditTime: 2024-11-26 15:52:29
|
||||||
* @LastEditors: DY
|
* @LastEditors: zwq
|
||||||
* @Description:
|
* @Description:
|
||||||
-->
|
-->
|
||||||
<template>
|
<template>
|
||||||
@@ -108,13 +108,28 @@ export default {
|
|||||||
},
|
},
|
||||||
series: [
|
series: [
|
||||||
{
|
{
|
||||||
name: '设备CT',
|
name: '生产规格',
|
||||||
data: dataList.eqData,
|
data: dataList.ggData,
|
||||||
type: 'line',
|
type: 'line',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '产线CT',
|
name: '设备理论速度',
|
||||||
data: dataList.plData,
|
data: dataList.sbluData,
|
||||||
|
type: 'line',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '设备实际速度',
|
||||||
|
data: dataList.sbsjData,
|
||||||
|
type: 'line',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '产线理论速度',
|
||||||
|
data: dataList.cxluData,
|
||||||
|
type: 'line',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '产线实际速度',
|
||||||
|
data: dataList.cxsjData,
|
||||||
type: 'line',
|
type: 'line',
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,8 +1,15 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<search-bar :formConfigs="formConfig" ref="searchBarForm" @headBtnClick="buttonClick" />
|
<search-bar
|
||||||
|
:formConfigs="formConfig"
|
||||||
|
ref="searchBarForm"
|
||||||
|
@headBtnClick="buttonClick" />
|
||||||
<div v-if="tableData.length">
|
<div v-if="tableData.length">
|
||||||
<base-table v-loading="dataListLoading" :table-props="tableProps" :table-data="tableData" />
|
<base-table
|
||||||
|
v-loading="dataListLoading"
|
||||||
|
:table-props="tableProps"
|
||||||
|
:max-height="tableH"
|
||||||
|
:table-data="tableData" />
|
||||||
<SearchBar :formConfigs="[{ label: '产品产量对比图', type: 'title' }]" />
|
<SearchBar :formConfigs="[{ label: '产品产量对比图', type: 'title' }]" />
|
||||||
<line-chart ref="lineChart" />
|
<line-chart ref="lineChart" />
|
||||||
</div>
|
</div>
|
||||||
@@ -20,7 +27,8 @@
|
|||||||
import { parseTime } from '../../mixins/code-filter';
|
import { parseTime } from '../../mixins/code-filter';
|
||||||
import { getYieldAnalysisPageData } from '@/api/core/analysis/index';
|
import { getYieldAnalysisPageData } from '@/api/core/analysis/index';
|
||||||
import { getProductionLinePage } from '@/api/core/base/productionLine';
|
import { getProductionLinePage } from '@/api/core/base/productionLine';
|
||||||
import lineChart from '../LineChart'
|
import lineChart from '../LineChart';
|
||||||
|
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
|
||||||
// import { getWorkshopSectionPage } from '@/api/core/base/workshopSection';
|
// import { getWorkshopSectionPage } from '@/api/core/base/workshopSection';
|
||||||
|
|
||||||
// const tableProps = [
|
// const tableProps = [
|
||||||
@@ -48,7 +56,7 @@ export default {
|
|||||||
components: {
|
components: {
|
||||||
lineChart,
|
lineChart,
|
||||||
},
|
},
|
||||||
// mixins: [basicPage],
|
mixins: [tableHeightMixin],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
urlOptions: {
|
urlOptions: {
|
||||||
@@ -59,7 +67,7 @@ export default {
|
|||||||
tableData: [],
|
tableData: [],
|
||||||
listQuery: {
|
listQuery: {
|
||||||
lineIds: [],
|
lineIds: [],
|
||||||
time: ''
|
time: '',
|
||||||
},
|
},
|
||||||
dateLabelList: [],
|
dateLabelList: [],
|
||||||
optionArrUrl: [getProductionLinePage],
|
optionArrUrl: [getProductionLinePage],
|
||||||
@@ -69,15 +77,16 @@ export default {
|
|||||||
label: '产线',
|
label: '产线',
|
||||||
selectOptions: [],
|
selectOptions: [],
|
||||||
param: 'lineIds',
|
param: 'lineIds',
|
||||||
defaultSelect: '',
|
defaultSelect: [],
|
||||||
multiple: true,
|
multiple: true,
|
||||||
filterable: true,
|
filterable: true,
|
||||||
|
width: 400,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'datePicker',
|
type: 'datePicker',
|
||||||
label: '时间',
|
label: '时间',
|
||||||
dateType: 'month',
|
dateType: 'month',
|
||||||
format: 'yyyy-MM-dd',
|
format: 'yyyy-MM',
|
||||||
valueFormat: 'yyyy-MM-dd HH:mm:ss',
|
valueFormat: 'yyyy-MM-dd HH:mm:ss',
|
||||||
rangeSeparator: '-',
|
rangeSeparator: '-',
|
||||||
startPlaceholder: '开始时间',
|
startPlaceholder: '开始时间',
|
||||||
@@ -89,7 +98,7 @@ export default {
|
|||||||
btnName: '查询',
|
btnName: '查询',
|
||||||
name: 'search',
|
name: 'search',
|
||||||
color: 'primary',
|
color: 'primary',
|
||||||
}
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
@@ -104,9 +113,9 @@ export default {
|
|||||||
};
|
};
|
||||||
this.optionArrUrl.forEach((item, index) => {
|
this.optionArrUrl.forEach((item, index) => {
|
||||||
item(params).then((response) => {
|
item(params).then((response) => {
|
||||||
this.formConfig[index].selectOptions = response.data.list
|
this.formConfig[index].selectOptions = response.data.list;
|
||||||
// this.formConfig[0].defaultSelect = response.data.list[0].id
|
// this.formConfig[0].defaultSelect = response.data.list[0].id
|
||||||
this.$set(this.formConfig[0], 'defaultSelect', response.data.list[0].id)
|
// this.$set(this.formConfig[0], 'defaultSelect', response.data.list[0].id)
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@@ -114,51 +123,49 @@ export default {
|
|||||||
// this.listQuery.lineIds = ['1672847052717821953']
|
// this.listQuery.lineIds = ['1672847052717821953']
|
||||||
// this.listQuery.productId = val.productId;
|
// this.listQuery.productId = val.productId;
|
||||||
// this.listQuery.time = '1694486098000';
|
// this.listQuery.time = '1694486098000';
|
||||||
this.urlOptions.getDataListURL(this.listQuery).then(res => {
|
this.urlOptions.getDataListURL(this.listQuery).then((res) => {
|
||||||
let arr = [
|
let arr = [
|
||||||
{
|
{
|
||||||
prop: 'lineName',
|
prop: 'lineName',
|
||||||
label: '产线',
|
label: '产线',
|
||||||
fixed: 'left'
|
fixed: 'left',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'sum',
|
prop: 'sum',
|
||||||
label: '合计',
|
label: '合计[片]',
|
||||||
fixed: 'left'
|
fixed: 'left',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: res.data ? res.data.nameData[0].name : undefined,
|
prop: res.data ? res.data.nameData[0].name : undefined,
|
||||||
label: res.data ? res.data.nameData[0].name : undefined,
|
label: res.data ? res.data.nameData[0].name : undefined,
|
||||||
align: 'center',
|
align: 'center',
|
||||||
children:[
|
children: [],
|
||||||
|
},
|
||||||
]
|
];
|
||||||
}
|
|
||||||
]
|
|
||||||
// console.log(res.data.nameData.slice(1))
|
// console.log(res.data.nameData.slice(1))
|
||||||
let xData = []
|
let xData = [];
|
||||||
let yAllData = []
|
let yAllData = [];
|
||||||
let lineName = []
|
let lineName = [];
|
||||||
if (res.data) {
|
if (res.data) {
|
||||||
let tempDateList = []
|
let tempDateList = [];
|
||||||
res.data.nameData.forEach(date => {
|
res.data.nameData.forEach((date) => {
|
||||||
tempDateList.push(date.name)
|
tempDateList.push(date.name);
|
||||||
})
|
});
|
||||||
this.dateLabelList = Array.from(new Set(tempDateList))
|
this.dateLabelList = Array.from(new Set(tempDateList));
|
||||||
|
|
||||||
this.dateLabelList.forEach(item => {
|
this.dateLabelList.forEach((item) => {
|
||||||
if (item.indexOf('年') === -1) {
|
if (item.indexOf('年') === -1) {
|
||||||
// 构造表头
|
// 构造表头
|
||||||
const props = {
|
const props = {
|
||||||
'prop': item,
|
prop: item,
|
||||||
'label': item
|
label: item,
|
||||||
}
|
};
|
||||||
arr[2].children.push(props)
|
arr[2].children.push(props);
|
||||||
|
|
||||||
// 构造echarts横坐标
|
// 构造echarts横坐标
|
||||||
xData.push(item)
|
xData.push(item);
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
// res.data.nameData.slice(1).forEach(item => {
|
// res.data.nameData.slice(1).forEach(item => {
|
||||||
// const props = {
|
// const props = {
|
||||||
// 'prop': item.name,
|
// 'prop': item.name,
|
||||||
@@ -167,23 +174,23 @@ export default {
|
|||||||
// }
|
// }
|
||||||
// arr[2].children.push(props)
|
// arr[2].children.push(props)
|
||||||
// })
|
// })
|
||||||
let tableDataArr =[]
|
let tableDataArr = [];
|
||||||
res.data.data.forEach(item => {
|
res.data.data.forEach((item) => {
|
||||||
let obj = {}
|
let obj = {};
|
||||||
obj.lineName= item.lineName,
|
(obj.lineName = item.lineName),
|
||||||
obj.sum= item.sum,
|
(obj.sum = item.sum),
|
||||||
item.data.forEach((ele, index) => {
|
item.data.forEach((ele, index) => {
|
||||||
// console.log(ele)
|
// console.log(ele)
|
||||||
ele.children.forEach((e) => {
|
ele.children.forEach((e) => {
|
||||||
console.log(e.dynamicName)
|
console.log(e.dynamicName);
|
||||||
obj['' + e.dynamicName + ''] = e.dynamicValue
|
obj['' + e.dynamicName + ''] = e.dynamicValue;
|
||||||
console.log(obj['' + e.dynamicName + '']);
|
console.log(obj['' + e.dynamicName + '']);
|
||||||
})
|
|
||||||
})
|
|
||||||
tableDataArr.push(obj)
|
|
||||||
});
|
});
|
||||||
this.tableData = tableDataArr
|
});
|
||||||
this.tableProps = arr
|
tableDataArr.push(obj);
|
||||||
|
});
|
||||||
|
this.tableData = tableDataArr;
|
||||||
|
this.tableProps = arr;
|
||||||
|
|
||||||
// let tempList = []
|
// let tempList = []
|
||||||
// res.data.nameData.slice(1).forEach(item => {
|
// res.data.nameData.slice(1).forEach(item => {
|
||||||
@@ -192,9 +199,9 @@ export default {
|
|||||||
// })
|
// })
|
||||||
// xData = Array.from(new Set(tempList))
|
// xData = Array.from(new Set(tempList))
|
||||||
|
|
||||||
res.data.data.forEach(item => {
|
res.data.data.forEach((item) => {
|
||||||
let yData = []
|
let yData = [];
|
||||||
lineName.push(item.lineName)
|
lineName.push(item.lineName);
|
||||||
// let obj = {}
|
// let obj = {}
|
||||||
// obj.lineName = item.lineName,
|
// obj.lineName = item.lineName,
|
||||||
// obj.sum = item.sum,
|
// obj.sum = item.sum,
|
||||||
@@ -202,18 +209,18 @@ export default {
|
|||||||
// console.log(ele)
|
// console.log(ele)
|
||||||
ele.children.forEach((e) => {
|
ele.children.forEach((e) => {
|
||||||
// let yData = []
|
// let yData = []
|
||||||
yData.push(e.dynamicValue)
|
yData.push(e.dynamicValue);
|
||||||
})
|
|
||||||
})
|
|
||||||
yAllData.push(yData)
|
|
||||||
});
|
});
|
||||||
console.log(lineName)
|
});
|
||||||
|
yAllData.push(yData);
|
||||||
|
});
|
||||||
|
console.log(lineName);
|
||||||
} else {
|
} else {
|
||||||
this.tableProps = arr
|
this.tableProps = arr;
|
||||||
this.tableData = []
|
this.tableData = [];
|
||||||
xData = []
|
xData = [];
|
||||||
yAllData = []
|
yAllData = [];
|
||||||
lineName = []
|
lineName = [];
|
||||||
}
|
}
|
||||||
// res.data.data[0].data[0].children.forEach((item, index) => {
|
// res.data.data[0].data[0].children.forEach((item, index) => {
|
||||||
// // console.log(item)
|
// // console.log(item)
|
||||||
@@ -222,7 +229,9 @@ export default {
|
|||||||
// // obj['' + item.dynamicName + ''] = item.dynamicValue
|
// // obj['' + item.dynamicName + ''] = item.dynamicValue
|
||||||
// })
|
// })
|
||||||
// console.log(this.yData)
|
// console.log(this.yData)
|
||||||
this.$refs.lineChart.initChart(xData, yAllData, lineName)
|
this.$nextTick(() => {
|
||||||
|
this.$refs.lineChart.initChart(xData, yAllData, lineName);
|
||||||
|
});
|
||||||
// this.total = response.data.total;
|
// this.total = response.data.total;
|
||||||
// this.dataListLoading = false;
|
// this.dataListLoading = false;
|
||||||
});
|
});
|
||||||
@@ -230,17 +239,19 @@ export default {
|
|||||||
buttonClick(val) {
|
buttonClick(val) {
|
||||||
switch (val.btnName) {
|
switch (val.btnName) {
|
||||||
case 'search':
|
case 'search':
|
||||||
this.listQuery.lineIds = val.lineIds ? val.lineIds :undefined
|
this.listQuery.lineIds = val.lineIds ? val.lineIds : undefined;
|
||||||
// this.listQuery.productId = val.productId;
|
// this.listQuery.productId = val.productId;
|
||||||
this.listQuery.time = val.time ? new Date(val.time).getTime() : undefined
|
this.listQuery.time = val.time
|
||||||
|
? new Date(val.time).getTime()
|
||||||
|
: undefined;
|
||||||
// this.listQuery.pageNo = 1;
|
// this.listQuery.pageNo = 1;
|
||||||
// this.listQuery.pageSize = 10;
|
// this.listQuery.pageSize = 10;
|
||||||
if (val.time) {
|
if (val.time) {
|
||||||
this.getData()
|
this.getData();
|
||||||
} else {
|
} else {
|
||||||
this.$message({
|
this.$message({
|
||||||
message: '请选择时间',
|
message: '请选择时间',
|
||||||
type: 'warning'
|
type: 'warning',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -59,9 +59,12 @@
|
|||||||
<i class="el-icon-delete"></i>
|
<i class="el-icon-delete"></i>
|
||||||
</div> -->
|
</div> -->
|
||||||
<div
|
<div
|
||||||
class="file-list__item"
|
|
||||||
v-for="(file, index) in files"
|
v-for="(file, index) in files"
|
||||||
:key="file.fileName"
|
:key="file.fileName"
|
||||||
|
style="width: 100%">
|
||||||
|
<div
|
||||||
|
class="file-list__item"
|
||||||
|
v-if="!isPicMode"
|
||||||
:style="{
|
:style="{
|
||||||
background: isPicMode
|
background: isPicMode
|
||||||
? `url(${file.fileUrl}) no-repeat`
|
? `url(${file.fileUrl}) no-repeat`
|
||||||
@@ -69,6 +72,7 @@
|
|||||||
backgroundSize: isPicMode ? '100% 100%' : '64px',
|
backgroundSize: isPicMode ? '100% 100%' : '64px',
|
||||||
backgroundPosition: isPicMode ? '0% 0%' : 'center',
|
backgroundPosition: isPicMode ? '0% 0%' : 'center',
|
||||||
}"
|
}"
|
||||||
|
@click="handleDownload(file)"
|
||||||
:data-name="file.fileName">
|
:data-name="file.fileName">
|
||||||
<el-button
|
<el-button
|
||||||
v-if="!disabled"
|
v-if="!disabled"
|
||||||
@@ -77,6 +81,14 @@
|
|||||||
style="padding: 0"
|
style="padding: 0"
|
||||||
@click="(e) => handleDelete(file)" />
|
@click="(e) => handleDelete(file)" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<el-image
|
||||||
|
v-else
|
||||||
|
class="file-list__item"
|
||||||
|
style="width: 100%"
|
||||||
|
:src="file.fileUrl"
|
||||||
|
:preview-src-list="files.map((item) => item.fileUrl)"></el-image>
|
||||||
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -277,6 +289,32 @@ export default {
|
|||||||
// Array
|
// Array
|
||||||
this.$emit('update-filelist', this.appendFilelist);
|
this.$emit('update-filelist', this.appendFilelist);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
async handleDownload(file) {
|
||||||
|
if (this.isPicMode) {
|
||||||
|
// this.$emit('preview', file);
|
||||||
|
const link = document.createElement('a');
|
||||||
|
link.href = file.fileUrl;
|
||||||
|
link.target = '_blank';
|
||||||
|
document.body.appendChild(link);
|
||||||
|
link.click();
|
||||||
|
document.body.removeChild(link);
|
||||||
|
} else {
|
||||||
|
// this.$emit('download', file);
|
||||||
|
const data = await this.$axios({
|
||||||
|
url: file.fileUrl,
|
||||||
|
method: 'get',
|
||||||
|
responseType: 'blob',
|
||||||
|
});
|
||||||
|
const link = document.createElement('a');
|
||||||
|
link.href = window.URL.createObjectURL(new Blob([data]));
|
||||||
|
link.download = file.fileName;
|
||||||
|
document.body.appendChild(link);
|
||||||
|
link.click();
|
||||||
|
document.body.removeChild(link);
|
||||||
|
window.URL.revokeObjectURL(link.href);
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-if="col.datetime"
|
v-if="col.datetime"
|
||||||
v-model="form[col.prop]"
|
v-model="form[col.prop]"
|
||||||
type="datetime"
|
type="date"
|
||||||
:placeholder="`请选择${col.label}`"
|
:placeholder="`请选择${col.label}`"
|
||||||
value-format="timestamp"
|
value-format="timestamp"
|
||||||
v-bind="col.bind"></el-date-picker>
|
v-bind="col.bind"></el-date-picker>
|
||||||
|
|||||||
@@ -308,6 +308,7 @@ export default {
|
|||||||
});
|
});
|
||||||
if (code == 0) {
|
if (code == 0) {
|
||||||
this.$modal.msgSuccess('更新成功');
|
this.$modal.msgSuccess('更新成功');
|
||||||
|
this.$emit('refreshDataList');
|
||||||
}
|
}
|
||||||
|
|
||||||
this.btnLoading = false;
|
this.btnLoading = false;
|
||||||
|
|||||||
@@ -57,6 +57,7 @@
|
|||||||
v-model="form.equipmentTypeId"
|
v-model="form.equipmentTypeId"
|
||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
filterable
|
filterable
|
||||||
|
clearable
|
||||||
placeholder="请选择设备类型">
|
placeholder="请选择设备类型">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="eqType in eqTypeList"
|
v-for="eqType in eqTypeList"
|
||||||
@@ -79,9 +80,9 @@
|
|||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item label="生产日期" prop="productionTime" :rules="[]">
|
<el-form-item label="生产日期" prop="productionTime" :rules="[]">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="form.enterTime"
|
v-model="form.productionTime"
|
||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
type="datetime"
|
type="date"
|
||||||
placeholder="请选择生产日期"
|
placeholder="请选择生产日期"
|
||||||
value-format="timestamp"></el-date-picker>
|
value-format="timestamp"></el-date-picker>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -91,14 +92,14 @@
|
|||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="form.enterTime"
|
v-model="form.enterTime"
|
||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
type="datetime"
|
type="date"
|
||||||
placeholder="请选择进场日期"
|
placeholder="请选择进场日期"
|
||||||
value-format="timestamp"></el-date-picker>
|
value-format="timestamp"></el-date-picker>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item
|
<el-form-item
|
||||||
label="设备TT值"
|
label="设备理论生产能效(片/min)"
|
||||||
prop="tvalue"
|
prop="tvalue"
|
||||||
:rules="[
|
:rules="[
|
||||||
{ required: true, message: '不能为空', trigger: 'blur' },
|
{ required: true, message: '不能为空', trigger: 'blur' },
|
||||||
@@ -112,7 +113,7 @@
|
|||||||
<el-input
|
<el-input
|
||||||
v-model="form.tvalue"
|
v-model="form.tvalue"
|
||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
placeholder="请输入设备TT值"></el-input>
|
placeholder="请输入"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
@@ -316,7 +317,7 @@ export default {
|
|||||||
this.form
|
this.form
|
||||||
);
|
);
|
||||||
// 保存原始文件名
|
// 保存原始文件名
|
||||||
if ('fileNames' in this.form) this.form.fileNames.push(file.name);
|
if ('fileNames' in this.form) this.form.fileNames.push(file.name+Date.now());
|
||||||
// 保存完整地址
|
// 保存完整地址
|
||||||
if ('fileUrls' in this.form) this.form.fileUrls.push(response.data);
|
if ('fileUrls' in this.form) this.form.fileUrls.push(response.data);
|
||||||
this.$modal.msgSuccess('上传成功');
|
this.$modal.msgSuccess('上传成功');
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
@cancel="cancel"
|
@cancel="cancel"
|
||||||
width="60%"
|
width="60%"
|
||||||
@confirm="submitForm">
|
@confirm="submitForm">
|
||||||
<DialogForm
|
<DialogForm1
|
||||||
v-if="open"
|
v-if="open"
|
||||||
key="index-dialog-form"
|
key="index-dialog-form"
|
||||||
ref="form"
|
ref="form"
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
queryParams: {
|
queryParams: {
|
||||||
equipmentId: form.id,
|
equipmentId: form.id,
|
||||||
pageNo: 1,
|
pageNo: 1,
|
||||||
pageSize: 10,
|
pageSize: 20,
|
||||||
},
|
},
|
||||||
tableBtn: [
|
tableBtn: [
|
||||||
this.$auth.hasPermi('base:equipment-attr:update')
|
this.$auth.hasPermi('base:equipment-attr:update')
|
||||||
@@ -107,6 +107,7 @@
|
|||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
import basicPageMixin from '@/mixins/lb/basicPageMixin';
|
import basicPageMixin from '@/mixins/lb/basicPageMixin';
|
||||||
import EquipmentDrawer from './components/EquipmentDrawer';
|
import EquipmentDrawer from './components/EquipmentDrawer';
|
||||||
|
import DialogForm1 from './components/DialogForm';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
createEquipment,
|
createEquipment,
|
||||||
@@ -124,6 +125,7 @@ export default {
|
|||||||
components: {
|
components: {
|
||||||
Editor,
|
Editor,
|
||||||
EquipmentDrawer,
|
EquipmentDrawer,
|
||||||
|
DialogForm1,
|
||||||
},
|
},
|
||||||
mixins: [basicPageMixin],
|
mixins: [basicPageMixin],
|
||||||
data() {
|
data() {
|
||||||
@@ -157,7 +159,12 @@ export default {
|
|||||||
width: 180,
|
width: 180,
|
||||||
filter: (val) => moment(val).format('yyyy-MM-DD HH:mm:ss'),
|
filter: (val) => moment(val).format('yyyy-MM-DD HH:mm:ss'),
|
||||||
},
|
},
|
||||||
{ prop: 'name', label: '设备名称' },
|
{
|
||||||
|
width: 200,
|
||||||
|
showOverflowtooltip: true,
|
||||||
|
prop: 'name',
|
||||||
|
label: '设备名称',
|
||||||
|
},
|
||||||
{ width: 256, prop: 'code', label: '设备编码' },
|
{ width: 256, prop: 'code', label: '设备编码' },
|
||||||
{ prop: 'equipmentType', label: '设备类型' },
|
{ prop: 'equipmentType', label: '设备类型' },
|
||||||
{ prop: 'enName', label: '英文名称' },
|
{ prop: 'enName', label: '英文名称' },
|
||||||
@@ -270,6 +277,7 @@ export default {
|
|||||||
url: '/base/equipment-type/page?pageNo=1&pageSize=100',
|
url: '/base/equipment-type/page?pageNo=1&pageSize=100',
|
||||||
bind: {
|
bind: {
|
||||||
filterable: true,
|
filterable: true,
|
||||||
|
clearable: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
// {
|
// {
|
||||||
@@ -294,7 +302,7 @@ export default {
|
|||||||
{
|
{
|
||||||
input: true,
|
input: true,
|
||||||
prop: 'tvalue',
|
prop: 'tvalue',
|
||||||
label: '设备TT值',
|
label: '设备理论生产能效(片/min)',
|
||||||
rules: [
|
rules: [
|
||||||
{ required: true, message: '不能为空', trigger: 'blur' },
|
{ required: true, message: '不能为空', trigger: 'blur' },
|
||||||
{
|
{
|
||||||
@@ -435,7 +443,7 @@ export default {
|
|||||||
// 查询参数
|
// 查询参数
|
||||||
queryParams: {
|
queryParams: {
|
||||||
pageNo: 1,
|
pageNo: 1,
|
||||||
pageSize: 10,
|
pageSize: 20,
|
||||||
code: '',
|
code: '',
|
||||||
name: '',
|
name: '',
|
||||||
},
|
},
|
||||||
@@ -561,6 +569,7 @@ export default {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 添加的提交
|
// 添加的提交
|
||||||
|
this.form.files = [];
|
||||||
createEquipment(this.form).then((response) => {
|
createEquipment(this.form).then((response) => {
|
||||||
this.$modal.msgSuccess('新增成功');
|
this.$modal.msgSuccess('新增成功');
|
||||||
this.open = false;
|
this.open = false;
|
||||||
|
|||||||
@@ -153,6 +153,9 @@ export default {
|
|||||||
label: '父类',
|
label: '父类',
|
||||||
prop: 'parentId',
|
prop: 'parentId',
|
||||||
url: '/base/equipment-type/page?pageNo=1&pageSize=100',
|
url: '/base/equipment-type/page?pageNo=1&pageSize=100',
|
||||||
|
bind: {
|
||||||
|
clearable: true, // some condition, like detail mode...
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{},
|
{},
|
||||||
],
|
],
|
||||||
@@ -237,25 +240,6 @@ export default {
|
|||||||
const id = row.id;
|
const id = row.id;
|
||||||
getEquipmentType(id).then((response) => {
|
getEquipmentType(id).then((response) => {
|
||||||
this.form = response.data;
|
this.form = response.data;
|
||||||
// this.form = {
|
|
||||||
// code: 'SBLX20230925184444000041',
|
|
||||||
// name: '测试131',
|
|
||||||
// remark: '测试可删除',
|
|
||||||
// id: '1706258479729336322',
|
|
||||||
// files: [
|
|
||||||
// { fileName: '1.png', fileUrl: '', fileType: 2 },
|
|
||||||
// { fileName: '1.asdfaslkjfkasdf.png', fileUrl: '', fileType: 2 },
|
|
||||||
// { fileName: '2.txt', fileUrl: '', fileType: 2 },
|
|
||||||
// { fileName: '1.rar', fileUrl: '', fileType: 2 },
|
|
||||||
// { fileName: '1.kkk', fileUrl: '', fileType: 2 },
|
|
||||||
// { fileName: 'test.file', fileUrl: '', fileType: 2 },
|
|
||||||
// { fileName: '222', fileUrl: '', fileType: 2 },
|
|
||||||
// { fileName: 'g', fileUrl: '', fileType: 2 },
|
|
||||||
// ],
|
|
||||||
// createTime: 1695638697000,
|
|
||||||
// parentId: '1701869972319584257',
|
|
||||||
// };
|
|
||||||
// debugger;
|
|
||||||
this.open = true;
|
this.open = true;
|
||||||
this.title = '修改设备类型';
|
this.title = '修改设备类型';
|
||||||
});
|
});
|
||||||
|
|||||||
99
src/views/core/base/lineBindProcess/index.vue
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
<!--
|
||||||
|
* @Author: zwq
|
||||||
|
* @Date: 2023-08-02 15:12:42
|
||||||
|
* @LastEditors: zwq
|
||||||
|
* @LastEditTime: 2024-11-29 13:25:51
|
||||||
|
* @Description:
|
||||||
|
-->
|
||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
<search-bar
|
||||||
|
:formConfigs="[{ label: '产线在制工艺', type: 'title' }]"
|
||||||
|
ref="searchBarForm" />
|
||||||
|
<base-table
|
||||||
|
v-loading="dataListLoading"
|
||||||
|
:table-props="tableProps"
|
||||||
|
:page="listQuery.pageNo"
|
||||||
|
:limit="listQuery.pageSize"
|
||||||
|
:table-data="tableData"
|
||||||
|
@emitFun="inputChange" />
|
||||||
|
<pagination
|
||||||
|
:limit.sync="listQuery.pageSize"
|
||||||
|
:page.sync="listQuery.pageNo"
|
||||||
|
:total="listQuery.total"
|
||||||
|
@pagination="getDataList" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import basicPage from '../../mixins/basic-page';
|
||||||
|
import { parseTime } from '../../mixins/code-filter';
|
||||||
|
import { getLineBindProcessPage } from '@/api/core/base/lineBindProcess';
|
||||||
|
import selectProduct from './selectProduct';
|
||||||
|
|
||||||
|
const tableProps = [
|
||||||
|
{
|
||||||
|
prop: 'lineName',
|
||||||
|
label: '产线'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'processDictName',
|
||||||
|
label: '在制工艺',
|
||||||
|
list: [],
|
||||||
|
subcomponent: selectProduct,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'recordTime',
|
||||||
|
label: '开始时间',
|
||||||
|
filter: parseTime,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export default {
|
||||||
|
mixins: [basicPage, selectProduct],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
urlOptions: {
|
||||||
|
getDataListURL: getLineBindProcessPage,
|
||||||
|
},
|
||||||
|
tableProps,
|
||||||
|
tableData: [],
|
||||||
|
// formConfig: [
|
||||||
|
// {
|
||||||
|
// type: 'button',
|
||||||
|
// btnName: '同步',
|
||||||
|
// name: 'search',
|
||||||
|
// color: 'primary',
|
||||||
|
// },
|
||||||
|
// ],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
components: {},
|
||||||
|
created() {
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// 获取数据列表
|
||||||
|
getDataList() {
|
||||||
|
this.dataListLoading = true;
|
||||||
|
this.urlOptions.getDataListURL(this.listQuery).then(response => {
|
||||||
|
this.tableData = response.data;
|
||||||
|
this.dataListLoading = false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
buttonClick(val) {
|
||||||
|
switch (val.btnName) {
|
||||||
|
case 'search':
|
||||||
|
this.listQuery.pageNo = 1;
|
||||||
|
this.listQuery.pageSize = 10;
|
||||||
|
this.getDataList();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
console.log(val);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
inputChange() {
|
||||||
|
this.getDataList();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
83
src/views/core/base/lineBindProcess/selectProduct.vue
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
<!--
|
||||||
|
* @Author: zwq
|
||||||
|
* @Date: 2023-08-03 14:09:18
|
||||||
|
* @LastEditors: zwq
|
||||||
|
* @LastEditTime: 2025-02-24 15:21:07
|
||||||
|
* @Description:
|
||||||
|
-->
|
||||||
|
<template>
|
||||||
|
<div class="tableInner">
|
||||||
|
<el-popover
|
||||||
|
placement="top"
|
||||||
|
title="切换在制工艺"
|
||||||
|
width="160"
|
||||||
|
v-model="visible">
|
||||||
|
<el-select v-model="list.processDict" style="margin: 5px" filterable>
|
||||||
|
<el-option
|
||||||
|
v-for="opt in getDictDatas(DICT_TYPE.PROCESS_TYPE)"
|
||||||
|
:key="opt.value"
|
||||||
|
:label="opt.label"
|
||||||
|
:value="opt.value"></el-option>
|
||||||
|
</el-select>
|
||||||
|
<div style="text-align: right; margin: 0">
|
||||||
|
<el-button size="mini" type="text" @click="visible = false">
|
||||||
|
取消
|
||||||
|
</el-button>
|
||||||
|
<el-button type="primary" size="mini" @click="changeInput">
|
||||||
|
确定
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
<el-button type="text" slot="reference">
|
||||||
|
<svg-icon icon-class="changelogo" />
|
||||||
|
</el-button>
|
||||||
|
</el-popover>
|
||||||
|
<el-input
|
||||||
|
readonly
|
||||||
|
v-model="list.processDictName"
|
||||||
|
style="width: 50%; margin-left: 5px"></el-input>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import { switchLineBindProcess } from '@/api/core/base/lineBindProcess';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
injectData: {
|
||||||
|
type: Object,
|
||||||
|
default: () => ({}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
list: this.injectData,
|
||||||
|
visible: false,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
changeInput() {
|
||||||
|
const processDictName = this.getDictDatas(this.DICT_TYPE.PROCESS_TYPE).find(item=>
|
||||||
|
item.value == this.list.processDict
|
||||||
|
)
|
||||||
|
const data = {
|
||||||
|
id: this.list.id,
|
||||||
|
processDict: this.list.processDict,
|
||||||
|
processDictName: processDictName.label,
|
||||||
|
};
|
||||||
|
switchLineBindProcess(data).then((response) => {
|
||||||
|
this.$modal.msgSuccess('修改成功');
|
||||||
|
this.visible = false;
|
||||||
|
this.$emit('emitData');
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<style scoped>
|
||||||
|
.tableInner .el-input__inner {
|
||||||
|
border: none;
|
||||||
|
padding: 0;
|
||||||
|
height: 33px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
164
src/views/core/base/lineBindProcessLog/index.vue
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
<search-bar
|
||||||
|
:formConfigs="formConfig"
|
||||||
|
ref="searchBarForm"
|
||||||
|
@select-changed="handleSearchBarChanged"
|
||||||
|
@headBtnClick="buttonClick" />
|
||||||
|
<base-table
|
||||||
|
v-loading="dataListLoading"
|
||||||
|
:table-props="tableProps"
|
||||||
|
:page="listQuery.pageNo"
|
||||||
|
:limit="listQuery.pageSize"
|
||||||
|
:table-data="tableData" />
|
||||||
|
<pagination
|
||||||
|
:limit.sync="listQuery.pageSize"
|
||||||
|
:page.sync="listQuery.pageNo"
|
||||||
|
:total="listQuery.total"
|
||||||
|
@pagination="getDataList" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import basicPage from '../../mixins/basic-page';
|
||||||
|
import { parseTime } from '../../mixins/code-filter';
|
||||||
|
import { getLineBindProcessLogPage } from '@/api/core/base/lineBindProcess';
|
||||||
|
import { getProductionLinePage } from '@/api/core/base/productionLine';
|
||||||
|
import { getPdList } from '@/api/core/monitoring/auto';
|
||||||
|
import { getFactoryPage } from '@/api/core/base/factory';
|
||||||
|
|
||||||
|
const tableProps = [
|
||||||
|
{
|
||||||
|
prop: 'factoryName',
|
||||||
|
label: '工厂'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'lineName',
|
||||||
|
label: '产线',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'processDictName',
|
||||||
|
label: '在制工艺',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'recordTime',
|
||||||
|
label: '开始时间',
|
||||||
|
filter: parseTime,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export default {
|
||||||
|
mixins: [basicPage],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
urlOptions: {
|
||||||
|
getDataListURL: getLineBindProcessLogPage,
|
||||||
|
},
|
||||||
|
tableProps,
|
||||||
|
tableData: [],
|
||||||
|
optionArrUrl: [getFactoryPage,getProductionLinePage],
|
||||||
|
listQuery: {
|
||||||
|
productionLineId: [],
|
||||||
|
},
|
||||||
|
formConfig: [
|
||||||
|
{
|
||||||
|
type: 'select',
|
||||||
|
label: '工厂',
|
||||||
|
selectOptions: [],
|
||||||
|
param: 'factoryId',
|
||||||
|
onchange: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'select',
|
||||||
|
label: '产线',
|
||||||
|
selectOptions: [],
|
||||||
|
param: 'productionLineId',
|
||||||
|
multiple: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'select',
|
||||||
|
label: '在制工艺',
|
||||||
|
selectOptions: this.getDictDatas(this.DICT_TYPE.PROCESS_TYPE),
|
||||||
|
labelField: 'label',
|
||||||
|
valueField: 'value',
|
||||||
|
param: 'processDict',
|
||||||
|
defaultSelect: '',
|
||||||
|
filterable: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'datePicker',
|
||||||
|
label: '时间',
|
||||||
|
dateType: 'daterange',
|
||||||
|
format: 'yyyy-MM-dd',
|
||||||
|
valueFormat: 'yyyy-MM-dd HH:mm:ss',
|
||||||
|
rangeSeparator: '-',
|
||||||
|
startPlaceholder: '开始时间',
|
||||||
|
endPlaceholder: '结束时间',
|
||||||
|
param: 'startTime',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'button',
|
||||||
|
btnName: '搜索',
|
||||||
|
name: 'search',
|
||||||
|
color: 'primary',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'button',
|
||||||
|
btnName: '重置',
|
||||||
|
name: 'reset',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
components: {},
|
||||||
|
created() {
|
||||||
|
this.getArr();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
handleSearchBarChanged({ param, value }) {
|
||||||
|
this.listQuery.productionLineId = [];
|
||||||
|
this.$refs.searchBarForm.formInline.productionLineId = undefined;
|
||||||
|
getPdList(value).then((res) => {
|
||||||
|
this.formConfig[1].selectOptions = res.data || [];
|
||||||
|
});
|
||||||
|
},
|
||||||
|
getArr() {
|
||||||
|
const params = {
|
||||||
|
page: 1,
|
||||||
|
limit: 500,
|
||||||
|
};
|
||||||
|
this.optionArrUrl.forEach((item, index) => {
|
||||||
|
item(params).then((response) => {
|
||||||
|
this.formConfig[index].selectOptions = response.data.list;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
buttonClick(val) {
|
||||||
|
switch (val.btnName) {
|
||||||
|
case 'search':
|
||||||
|
this.listQuery.pageNo = 1;
|
||||||
|
this.listQuery.pageSize = 10;
|
||||||
|
this.listQuery.factoryId = val.factoryId || undefined;
|
||||||
|
this.listQuery.productionLineId = val.productionLineId || [];
|
||||||
|
this.listQuery.processDict = val.processDict;
|
||||||
|
this.listQuery.recordTime = val.startTime
|
||||||
|
? [val.startTime[0], val.startTime[1].substr(0, 10) + ' 23:59:59']
|
||||||
|
: null;
|
||||||
|
this.getDataList();
|
||||||
|
break;
|
||||||
|
case 'reset':
|
||||||
|
this.$refs.searchBarForm.resetForm();
|
||||||
|
this.listQuery = {
|
||||||
|
pageSize: 10,
|
||||||
|
pageNo: 1,
|
||||||
|
total: 1,
|
||||||
|
};
|
||||||
|
this.getDataList();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
console.log(val);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
53
src/views/core/base/lineBindProduct/changeStatus.vue
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
<!--
|
||||||
|
* @Author: zhp
|
||||||
|
* @Date: 2023-01-31 14:12:10
|
||||||
|
* @LastEditTime: 2024-11-29 10:49:37
|
||||||
|
* @LastEditors: zwq
|
||||||
|
* @Description:
|
||||||
|
-->
|
||||||
|
<template>
|
||||||
|
<span>
|
||||||
|
<el-switch
|
||||||
|
@change="changeStatus"
|
||||||
|
v-model="injectData.allowAuto"
|
||||||
|
:active-value="true"
|
||||||
|
:inactive-value="false"></el-switch>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { switchAutoProduct } from '@/api/core/base/lineBindProduct';
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
injectData: {
|
||||||
|
type: Object,
|
||||||
|
default: () => ({}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
urlOptions: {
|
||||||
|
submitURL: switchAutoProduct,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// 子级
|
||||||
|
changeStatus() {
|
||||||
|
// 路由参数
|
||||||
|
let obj = {
|
||||||
|
allowAuto: this.injectData.allowAuto,
|
||||||
|
id: this.injectData.id,
|
||||||
|
};
|
||||||
|
this.urlOptions.submitURL(obj).then((res) => {
|
||||||
|
console.log(res)
|
||||||
|
if (res.code !== 0) {
|
||||||
|
return this.$message.error(res.msg);
|
||||||
|
}
|
||||||
|
this.$modal.msgSuccess('切换状态成功');
|
||||||
|
this.$emit('emitData');
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
<!--
|
<!--
|
||||||
* @Author: zwq
|
* @Author: zwq
|
||||||
* @Date: 2023-08-02 15:12:42
|
* @Date: 2023-08-02 15:12:42
|
||||||
* @LastEditors: DY
|
* @LastEditors: zwq
|
||||||
* @LastEditTime: 2023-10-13 16:35:03
|
* @LastEditTime: 2024-11-29 10:47:46
|
||||||
* @Description:
|
* @Description:
|
||||||
-->
|
-->
|
||||||
<template>
|
<template>
|
||||||
@@ -30,6 +30,7 @@ import basicPage from '../../mixins/basic-page';
|
|||||||
import { parseTime } from '../../mixins/code-filter';
|
import { parseTime } from '../../mixins/code-filter';
|
||||||
import { getLineBindProductPage } from '@/api/core/base/lineBindProduct';
|
import { getLineBindProductPage } from '@/api/core/base/lineBindProduct';
|
||||||
import selectProduct from './selectProduct';
|
import selectProduct from './selectProduct';
|
||||||
|
import changeStatus from './changeStatus';
|
||||||
import { getProductPage } from '@/api/core/base/product';
|
import { getProductPage } from '@/api/core/base/product';
|
||||||
|
|
||||||
const tableProps = [
|
const tableProps = [
|
||||||
@@ -43,6 +44,11 @@ const tableProps = [
|
|||||||
list: [],
|
list: [],
|
||||||
subcomponent: selectProduct,
|
subcomponent: selectProduct,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
prop: 'allowAuto',
|
||||||
|
label: '允许自动',
|
||||||
|
subcomponent: changeStatus,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
prop: 'recordTime',
|
prop: 'recordTime',
|
||||||
label: '开始时间',
|
label: '开始时间',
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
<search-bar
|
<search-bar
|
||||||
:formConfigs="formConfig"
|
:formConfigs="formConfig"
|
||||||
ref="searchBarForm"
|
ref="searchBarForm"
|
||||||
|
@select-changed="handleSearchBarChanged"
|
||||||
@headBtnClick="buttonClick" />
|
@headBtnClick="buttonClick" />
|
||||||
<base-table
|
<base-table
|
||||||
v-loading="dataListLoading"
|
v-loading="dataListLoading"
|
||||||
@@ -24,15 +25,21 @@ import { parseTime } from '../../mixins/code-filter';
|
|||||||
import { getLineBindProductLogPage } from '@/api/core/base/lineBindProductLog';
|
import { getLineBindProductLogPage } from '@/api/core/base/lineBindProductLog';
|
||||||
import { getProductionLinePage } from '@/api/core/base/productionLine';
|
import { getProductionLinePage } from '@/api/core/base/productionLine';
|
||||||
import { getProductPage } from '@/api/core/base/product';
|
import { getProductPage } from '@/api/core/base/product';
|
||||||
|
import { getFactoryPage } from '@/api/core/base/factory';
|
||||||
|
import { getPdList } from '@/api/core/monitoring/auto';
|
||||||
|
|
||||||
const tableProps = [
|
const tableProps = [
|
||||||
|
{
|
||||||
|
prop: 'factoryName',
|
||||||
|
label: '工厂'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
prop: 'productionLineName',
|
prop: 'productionLineName',
|
||||||
label: '产线'
|
label: '产线',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'productName',
|
prop: 'productName',
|
||||||
label: '在制产品'
|
label: '在制产品',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'startTime',
|
prop: 'startTime',
|
||||||
@@ -55,15 +62,24 @@ export default {
|
|||||||
},
|
},
|
||||||
tableProps,
|
tableProps,
|
||||||
tableData: [],
|
tableData: [],
|
||||||
optionArrUrl: [getProductionLinePage, getProductPage],
|
listQuery: {
|
||||||
|
productionLineId: [],
|
||||||
|
},
|
||||||
|
optionArrUrl: [getFactoryPage,getProductionLinePage, getProductPage],
|
||||||
formConfig: [
|
formConfig: [
|
||||||
|
{
|
||||||
|
type: 'select',
|
||||||
|
label: '工厂',
|
||||||
|
selectOptions: [],
|
||||||
|
param: 'factoryId',
|
||||||
|
onchange: true,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
type: 'select',
|
type: 'select',
|
||||||
label: '产线',
|
label: '产线',
|
||||||
selectOptions: [],
|
selectOptions: [],
|
||||||
param: 'productionLineId',
|
param: 'productionLineId',
|
||||||
defaultSelect: '',
|
multiple: true,
|
||||||
filterable: true,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'select',
|
type: 'select',
|
||||||
@@ -83,7 +99,7 @@ export default {
|
|||||||
startPlaceholder: '开始时间',
|
startPlaceholder: '开始时间',
|
||||||
endPlaceholder: '结束时间',
|
endPlaceholder: '结束时间',
|
||||||
param: 'startTime',
|
param: 'startTime',
|
||||||
valueFormat: 'timestamp'
|
valueFormat: 'timestamp',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'button',
|
type: 'button',
|
||||||
@@ -99,12 +115,18 @@ export default {
|
|||||||
],
|
],
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
components: {
|
components: {},
|
||||||
},
|
|
||||||
created() {
|
created() {
|
||||||
this.getArr();
|
this.getArr();
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
handleSearchBarChanged({ param, value }) {
|
||||||
|
this.listQuery.productionLineId = [];
|
||||||
|
this.$refs.searchBarForm.formInline.productionLineId = undefined;
|
||||||
|
getPdList(value).then((res) => {
|
||||||
|
this.formConfig[1].selectOptions = res.data || [];
|
||||||
|
});
|
||||||
|
},
|
||||||
getArr() {
|
getArr() {
|
||||||
const params = {
|
const params = {
|
||||||
page: 1,
|
page: 1,
|
||||||
@@ -121,9 +143,10 @@ export default {
|
|||||||
case 'search':
|
case 'search':
|
||||||
this.listQuery.pageNo = 1;
|
this.listQuery.pageNo = 1;
|
||||||
this.listQuery.pageSize = 10;
|
this.listQuery.pageSize = 10;
|
||||||
this.listQuery.productionLineId = val.productionLineId;
|
this.listQuery.factoryId = val.factoryId || undefined;
|
||||||
|
this.listQuery.productionLineId = val.productionLineId || [];
|
||||||
this.listQuery.productId = val.productId;
|
this.listQuery.productId = val.productId;
|
||||||
this.listQuery.startTime = val.startTime;
|
this.listQuery.startTime = val.startTime ? val.startTime : null;
|
||||||
this.getDataList();
|
this.getDataList();
|
||||||
break;
|
break;
|
||||||
case 'reset':
|
case 'reset':
|
||||||
|
|||||||
@@ -72,19 +72,37 @@
|
|||||||
</el-row>
|
</el-row>
|
||||||
<el-row :gutter="20">
|
<el-row :gutter="20">
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="规格" prop="specifications">
|
<el-form-item label="原片规格" prop="originalSpecifications">
|
||||||
<el-input
|
<el-input
|
||||||
:disabled="isdetail"
|
:disabled="isdetail"
|
||||||
v-model="dataForm.specifications"
|
v-model="dataForm.originalSpecifications"
|
||||||
placeholder="请输入规格" />
|
placeholder="请输入原片规格" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="单位平方数" prop="area">
|
<el-form-item label="原片单位平方数" prop="originalArea">
|
||||||
|
<el-input
|
||||||
|
:disabled="isdetail"
|
||||||
|
v-model="dataForm.originalArea"
|
||||||
|
placeholder="请输入原片单位平方数" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<el-row :gutter="20">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="深加工规格" prop="specifications">
|
||||||
|
<el-input
|
||||||
|
:disabled="isdetail"
|
||||||
|
v-model="dataForm.specifications"
|
||||||
|
placeholder="请输入深加工规格" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="深加工单位平方数" prop="area">
|
||||||
<el-input
|
<el-input
|
||||||
:disabled="isdetail"
|
:disabled="isdetail"
|
||||||
v-model="dataForm.area"
|
v-model="dataForm.area"
|
||||||
placeholder="请输入单位平方数" />
|
placeholder="请输入深加工单位平方数" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
@@ -154,7 +172,9 @@
|
|||||||
<el-button v-if="isdetail" type="primary" @click="goEdit()">
|
<el-button v-if="isdetail" type="primary" @click="goEdit()">
|
||||||
编辑
|
编辑
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button v-else type="primary" @click="dataFormSubmit()">确定</el-button>
|
<el-button v-else type="primary" @click="dataFormSubmit()">
|
||||||
|
确定
|
||||||
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<product-attr-add
|
<product-attr-add
|
||||||
@@ -220,11 +240,13 @@ export default {
|
|||||||
id: null,
|
id: null,
|
||||||
name: '', // 产品名称
|
name: '', // 产品名称
|
||||||
code: '', // 产品编码
|
code: '', // 产品编码
|
||||||
area: 0, // 单位平方数(float only)
|
area: 0, // 深加工单位平方数(float only)
|
||||||
typeDictValue: null, // 产品类型id
|
typeDictValue: null, // 产品类型id
|
||||||
processTime: null, // 单位产品用时 (s)
|
processTime: null, // 单位产品用时 (s)
|
||||||
specifications: '', // 规格
|
specifications: '', // 深加工规格
|
||||||
unitDictValue: '', // 单位id
|
unitDictValue: '', // 单位id
|
||||||
|
originalSpecifications: '', // 原片规格
|
||||||
|
originalArea: 0, // 原片单位平方数
|
||||||
},
|
},
|
||||||
listQuery: {
|
listQuery: {
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
@@ -371,9 +393,20 @@ export default {
|
|||||||
// 添加的提交
|
// 添加的提交
|
||||||
createProduct(this.dataForm).then((response) => {
|
createProduct(this.dataForm).then((response) => {
|
||||||
this.$modal.msgSuccess('新增成功');
|
this.$modal.msgSuccess('新增成功');
|
||||||
|
this.$confirm(`是否新增产品属性?`, '系统提示', {
|
||||||
|
confirmButtonText: '确定',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'warning',
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
this.dataForm.id = response.data
|
||||||
|
this.addNew();
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
this.visible = false;
|
this.visible = false;
|
||||||
this.$emit('refreshDataList');
|
this.$emit('refreshDataList');
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@@ -382,10 +415,14 @@ export default {
|
|||||||
},
|
},
|
||||||
// 新增 / 修改
|
// 新增 / 修改
|
||||||
addNew(id) {
|
addNew(id) {
|
||||||
|
if (this.dataForm.id) {
|
||||||
this.addOrUpdateVisible = true;
|
this.addOrUpdateVisible = true;
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.$refs.addOrUpdate.init(id);
|
this.$refs.addOrUpdate.init(id);
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
this.$message('请先创建产品!');
|
||||||
|
}
|
||||||
},
|
},
|
||||||
goback() {
|
goback() {
|
||||||
this.$emit('refreshDataList');
|
this.$emit('refreshDataList');
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<!--
|
<!--
|
||||||
* @Author: zwq
|
* @Author: zwq
|
||||||
* @Date: 2023-08-01 14:55:51
|
* @Date: 2023-08-01 14:55:51
|
||||||
* @LastEditors: DY
|
* @LastEditors: zwq
|
||||||
* @LastEditTime: 2023-10-13 10:27:00
|
* @LastEditTime: 2025-02-24 16:06:59
|
||||||
* @Description:
|
* @Description:
|
||||||
-->
|
-->
|
||||||
<template>
|
<template>
|
||||||
@@ -49,27 +49,31 @@ import {
|
|||||||
|
|
||||||
const tableProps = [
|
const tableProps = [
|
||||||
{
|
{
|
||||||
prop: 'code',
|
prop: 'createTime',
|
||||||
label: '产品编码'
|
label: '创建时间',
|
||||||
|
filter: parseTime
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'name',
|
prop: 'name',
|
||||||
label: '产品名称'
|
label: '产品名称'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
prop: 'code',
|
||||||
|
label: '产品编码'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'originalSpecifications',
|
||||||
|
label: '原片规格'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
prop: 'specifications',
|
prop: 'specifications',
|
||||||
label: '规格'
|
label: '深加工规格'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'unitDictValue',
|
prop: 'unitDictValue',
|
||||||
label: '单位',
|
label: '单位',
|
||||||
subcomponent: unitDict,
|
subcomponent: unitDict,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
prop: 'createTime',
|
|
||||||
label: '创建时间',
|
|
||||||
filter: parseTime
|
|
||||||
},
|
|
||||||
];
|
];
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
* @Author: zwq
|
* @Author: zwq
|
||||||
* @Date: 2023-08-01 13:52:10
|
* @Date: 2023-08-01 13:52:10
|
||||||
* @LastEditors: zwq
|
* @LastEditors: zwq
|
||||||
* @LastEditTime: 2024-04-10 16:31:51
|
* @LastEditTime: 2025-02-24 15:32:45
|
||||||
* @Description:
|
* @Description:
|
||||||
-->
|
-->
|
||||||
<template>
|
<template>
|
||||||
@@ -12,6 +12,7 @@
|
|||||||
:rules="dataRule"
|
:rules="dataRule"
|
||||||
ref="dataForm"
|
ref="dataForm"
|
||||||
@keyup.enter.native="dataFormSubmit()"
|
@keyup.enter.native="dataFormSubmit()"
|
||||||
|
label-position="top"
|
||||||
label-width="90px">
|
label-width="90px">
|
||||||
<el-row :gutter="20">
|
<el-row :gutter="20">
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
@@ -48,11 +49,11 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="产线TT值(h)" prop="tvalue">
|
<el-form-item label="产线理论生产能效(片/min)" prop="tvalue">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="dataForm.tvalue"
|
v-model="dataForm.tvalue"
|
||||||
clearable
|
clearable
|
||||||
placeholder="请输入每小时下片数量" />
|
placeholder="请输入数量" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
@@ -80,6 +81,17 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="24">
|
||||||
|
<el-form-item label="描述" prop="description">
|
||||||
|
<el-input
|
||||||
|
v-model="dataForm.description"
|
||||||
|
type="textarea"
|
||||||
|
placeholder="请输入内容" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="备注" prop="remark">
|
<el-form-item label="备注" prop="remark">
|
||||||
<el-input
|
<el-input
|
||||||
@@ -89,17 +101,6 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-row>
|
|
||||||
<el-col>
|
|
||||||
<el-form-item label="描述" prop="description">
|
|
||||||
<el-input
|
|
||||||
v-model="dataForm.description"
|
|
||||||
type="textarea"
|
|
||||||
placeholder="请输入内容" />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
</el-form>
|
</el-form>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -139,11 +140,11 @@ export default {
|
|||||||
},
|
},
|
||||||
pdTypeArr: [
|
pdTypeArr: [
|
||||||
{
|
{
|
||||||
id: 0,
|
id: '0',
|
||||||
name: '深加工'
|
name: '深加工'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 1,
|
id: '1',
|
||||||
name: '原片'
|
name: '原片'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -159,6 +160,7 @@ export default {
|
|||||||
],
|
],
|
||||||
tvalue: [
|
tvalue: [
|
||||||
{
|
{
|
||||||
|
required: true,
|
||||||
type: 'number',
|
type: 'number',
|
||||||
message: '请输入正确的数字',
|
message: '请输入正确的数字',
|
||||||
trigger: 'change',
|
trigger: 'change',
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ import {
|
|||||||
exportProductionLineExcel,
|
exportProductionLineExcel,
|
||||||
getStatus,
|
getStatus,
|
||||||
} from '@/api/core/base/productionLine';
|
} from '@/api/core/base/productionLine';
|
||||||
|
import { getFactoryPage } from '@/api/core/base/factory';
|
||||||
|
|
||||||
const tableProps = [
|
const tableProps = [
|
||||||
{
|
{
|
||||||
@@ -121,6 +122,13 @@ export default {
|
|||||||
].filter((v) => v),
|
].filter((v) => v),
|
||||||
tableData: [],
|
tableData: [],
|
||||||
formConfig: [
|
formConfig: [
|
||||||
|
{
|
||||||
|
type: 'select',
|
||||||
|
label: '工厂',
|
||||||
|
selectOptions: [],
|
||||||
|
param: 'factoryId',
|
||||||
|
onchange: true,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
type: 'input',
|
type: 'input',
|
||||||
label: '产线名称',
|
label: '产线名称',
|
||||||
@@ -168,7 +176,15 @@ export default {
|
|||||||
components: {
|
components: {
|
||||||
AddOrUpdate,
|
AddOrUpdate,
|
||||||
},
|
},
|
||||||
created() {},
|
created() {
|
||||||
|
const params = {
|
||||||
|
pageSize: 100,
|
||||||
|
pageNo: 1,
|
||||||
|
};
|
||||||
|
getFactoryPage(params).then((res) => {
|
||||||
|
this.formConfig[0].selectOptions = res.data.list || [];
|
||||||
|
});
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
// 获取数据列表
|
// 获取数据列表
|
||||||
getDataList() {
|
getDataList() {
|
||||||
@@ -197,6 +213,7 @@ export default {
|
|||||||
case 'search':
|
case 'search':
|
||||||
this.listQuery.pageNo = 1;
|
this.listQuery.pageNo = 1;
|
||||||
this.listQuery.pageSize = 10;
|
this.listQuery.pageSize = 10;
|
||||||
|
this.listQuery.factoryId = val.factoryId || undefined;
|
||||||
this.listQuery.name = val.name;
|
this.listQuery.name = val.name;
|
||||||
this.getDataList();
|
this.getDataList();
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
<search-bar
|
<search-bar
|
||||||
:formConfigs="formConfig"
|
:formConfigs="formConfig"
|
||||||
ref="searchBarForm"
|
ref="searchBarForm"
|
||||||
|
@select-changed="handleSearchBarChanged"
|
||||||
@headBtnClick="buttonClick" />
|
@headBtnClick="buttonClick" />
|
||||||
<base-table
|
<base-table
|
||||||
v-loading="dataListLoading"
|
v-loading="dataListLoading"
|
||||||
@@ -46,6 +47,8 @@ import {
|
|||||||
getWorkshopSectionPage,
|
getWorkshopSectionPage,
|
||||||
exportWorkshopSectionExcel
|
exportWorkshopSectionExcel
|
||||||
} from "@/api/core/base/workshopSection";
|
} from "@/api/core/base/workshopSection";
|
||||||
|
import { getPdList } from '@/api/core/monitoring/auto';
|
||||||
|
import { getFactoryPage } from '@/api/core/base/factory';
|
||||||
|
|
||||||
const tableProps = [
|
const tableProps = [
|
||||||
{
|
{
|
||||||
@@ -56,6 +59,10 @@ const tableProps = [
|
|||||||
prop: 'name',
|
prop: 'name',
|
||||||
label: '工段名称'
|
label: '工段名称'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
prop: 'factoryName',
|
||||||
|
label: '工厂'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
prop: 'productionLineName',
|
prop: 'productionLineName',
|
||||||
label: '产线'
|
label: '产线'
|
||||||
@@ -99,8 +106,25 @@ export default {
|
|||||||
}
|
}
|
||||||
: undefined,
|
: undefined,
|
||||||
].filter((v)=>v),
|
].filter((v)=>v),
|
||||||
|
listQuery: {
|
||||||
|
lineId: [],
|
||||||
|
},
|
||||||
tableData: [],
|
tableData: [],
|
||||||
formConfig: [
|
formConfig: [
|
||||||
|
{
|
||||||
|
type: 'select',
|
||||||
|
label: '工厂',
|
||||||
|
selectOptions: [],
|
||||||
|
param: 'factoryId',
|
||||||
|
onchange: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'select',
|
||||||
|
label: '产线',
|
||||||
|
selectOptions: [],
|
||||||
|
param: 'lineId',
|
||||||
|
multiple: true,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
type: 'input',
|
type: 'input',
|
||||||
label: '工段名称',
|
label: '工段名称',
|
||||||
@@ -146,14 +170,37 @@ export default {
|
|||||||
components: {
|
components: {
|
||||||
AddOrUpdate,
|
AddOrUpdate,
|
||||||
},
|
},
|
||||||
created() {},
|
created() {
|
||||||
|
this.getPdLineList();
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
getPdLineList() {
|
||||||
|
getPdList().then((res) => {
|
||||||
|
this.formConfig[1].selectOptions = res.data || [];
|
||||||
|
});
|
||||||
|
const params = {
|
||||||
|
pageSize: 100,
|
||||||
|
pageNo: 1,
|
||||||
|
};
|
||||||
|
getFactoryPage(params).then((res) => {
|
||||||
|
this.formConfig[0].selectOptions = res.data.list || [];
|
||||||
|
});
|
||||||
|
},
|
||||||
|
handleSearchBarChanged({ param, value }) {
|
||||||
|
this.listQuery.lineId = [];
|
||||||
|
this.$refs.searchBarForm.formInline.lineId = undefined;
|
||||||
|
getPdList(value).then((res) => {
|
||||||
|
this.formConfig[1].selectOptions = res.data || [];
|
||||||
|
});
|
||||||
|
},
|
||||||
buttonClick(val) {
|
buttonClick(val) {
|
||||||
switch (val.btnName) {
|
switch (val.btnName) {
|
||||||
case 'search':
|
case 'search':
|
||||||
this.listQuery.pageNo = 1;
|
this.listQuery.pageNo = 1;
|
||||||
this.listQuery.pageSize = 10;
|
this.listQuery.pageSize = 10;
|
||||||
this.listQuery.name = val.name;
|
this.listQuery.name = val.name;
|
||||||
|
this.listQuery.factoryId = val.factoryId || undefined;
|
||||||
|
this.listQuery.lineId = val.lineId || [];
|
||||||
this.getDataList();
|
this.getDataList();
|
||||||
break;
|
break;
|
||||||
case 'reset':
|
case 'reset':
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<!--
|
<!--
|
||||||
* @Author: Do not edit
|
* @Author: Do not edit
|
||||||
* @Date: 2023-08-29 14:59:29
|
* @Date: 2023-08-29 14:59:29
|
||||||
* @LastEditTime: 2023-10-16 15:10:42
|
* @LastEditTime: 2024-12-02 13:59:32
|
||||||
* @LastEditors: DY
|
* @LastEditors: zwq
|
||||||
* @Description:
|
* @Description:
|
||||||
-->
|
-->
|
||||||
<template>
|
<template>
|
||||||
@@ -92,7 +92,8 @@ const tableProps = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'outputArea',
|
prop: 'outputArea',
|
||||||
label: '产出面积/㎡'
|
label: '产出面积/㎡',
|
||||||
|
filter: (val) => (val != null ? val.toFixed(2) : '-'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'lossNum',
|
prop: 'lossNum',
|
||||||
@@ -100,11 +101,13 @@ const tableProps = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'lossArea',
|
prop: 'lossArea',
|
||||||
label: '损耗面积/㎡'
|
label: '损耗面积/㎡',
|
||||||
|
filter: (val) => (val != null ? val.toFixed(2) : '-'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'lossRatio',
|
prop: 'lossRatio',
|
||||||
label: '损耗比例%'
|
label: '损耗比例%',
|
||||||
|
filter: (val) => (val != null ? val.toFixed(2) : '-'),
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -180,7 +183,6 @@ export default {
|
|||||||
startPlaceholder: '开始时间',
|
startPlaceholder: '开始时间',
|
||||||
endPlaceholder: '结束时间',
|
endPlaceholder: '结束时间',
|
||||||
param: 'timeVal',
|
param: 'timeVal',
|
||||||
defaultSelect: [],
|
|
||||||
width: 350
|
width: 350
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -312,8 +314,8 @@ export default {
|
|||||||
this.listQuery.pageSize = 10;
|
this.listQuery.pageSize = 10;
|
||||||
this.listQuery.lineId = val.line ? val.line : undefined;
|
this.listQuery.lineId = val.line ? val.line : undefined;
|
||||||
this.listQuery.reportType = val.reportType ? val.reportType : undefined;
|
this.listQuery.reportType = val.reportType ? val.reportType : undefined;
|
||||||
this.listQuery.reportStartTime = val.timeVal ? [new Date(val.timeVal[0]).getTime()] : undefined;
|
this.listQuery.reportStartTime = val.timeVal ? [new Date(val.timeVal[0]).getTime(),new Date(val.timeVal[1]).getTime()] : undefined;
|
||||||
this.listQuery.reportEndTime = val.timeVal ? [new Date(val.timeVal[1]).getTime()] : undefined;
|
//this.listQuery.reportEndTime = val.timeVal ? [new Date(val.timeVal[1]).getTime()] : undefined;
|
||||||
if (val.timeVal && val.timeVal.length > 0) {
|
if (val.timeVal && val.timeVal.length > 0) {
|
||||||
this.fileName = val.timeVal[0].slice(0, 10) + '-' + val.timeVal[1].slice(0, 10) + '_'
|
this.fileName = val.timeVal[0].slice(0, 10) + '-' + val.timeVal[1].slice(0, 10) + '_'
|
||||||
}
|
}
|
||||||
|
|||||||
169
src/views/core/monitoring/data/BarChart.vue
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
<template>
|
||||||
|
<div
|
||||||
|
:class="className"
|
||||||
|
:style="{ height: height, width: width, marginLeft: '10px' }" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
require('echarts/theme/macarons'); // echarts theme
|
||||||
|
import resize from '@/utils/chartMixins/resize';
|
||||||
|
|
||||||
|
const animationDuration = 1000;
|
||||||
|
export default {
|
||||||
|
mixins: [resize],
|
||||||
|
props: {
|
||||||
|
className: {
|
||||||
|
type: String,
|
||||||
|
default: 'chart',
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
width: {
|
||||||
|
type: String,
|
||||||
|
default: '100%',
|
||||||
|
},
|
||||||
|
height: {
|
||||||
|
type: String,
|
||||||
|
default: '300px',
|
||||||
|
},
|
||||||
|
barData: {
|
||||||
|
type: Array,
|
||||||
|
default: () => [],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
chart: null,
|
||||||
|
targetId: '',
|
||||||
|
};
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
if (!this.chart) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.chart.dispose();
|
||||||
|
this.chart = null;
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
initChart() {
|
||||||
|
this.chart = echarts.init(this.$el, 'macarons');
|
||||||
|
const _this = this;
|
||||||
|
this.chart.setOption({
|
||||||
|
title: {
|
||||||
|
text: this.title
|
||||||
|
? '{space|}{tip|}{space|}{value|' + this.title + '}'
|
||||||
|
: '',
|
||||||
|
textStyle: {
|
||||||
|
rich: {
|
||||||
|
tip: {
|
||||||
|
width: 6,
|
||||||
|
height: 6,
|
||||||
|
borderRadius: 50,
|
||||||
|
backgroundColor: '#288AFF',
|
||||||
|
},
|
||||||
|
space: {
|
||||||
|
width: 8,
|
||||||
|
},
|
||||||
|
value: {
|
||||||
|
fontSize: 14,
|
||||||
|
color: 'black',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
color: ['#288AFF', '#8EF0AB', '#FFDC94'],
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
|
type: 'cross',
|
||||||
|
crossStyle: {
|
||||||
|
color: '#999',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: ['投入', '产出', '加工成品率'],
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
containLabel: true,
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
type: 'category',
|
||||||
|
data: this.barData.map((item) => {
|
||||||
|
return item.lineName;
|
||||||
|
}),
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
type: 'value',
|
||||||
|
name: '投入/产出 片',
|
||||||
|
min: 0,
|
||||||
|
axisLabel: {
|
||||||
|
formatter: '{value}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'value',
|
||||||
|
name: '加工成品率',
|
||||||
|
min: 0,
|
||||||
|
max: 100,
|
||||||
|
interval: 10,
|
||||||
|
axisLabel: {
|
||||||
|
formatter: '{value} %',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: '投入',
|
||||||
|
type: 'bar',
|
||||||
|
barWidth: '20',
|
||||||
|
data: this.barData.map((item) => {
|
||||||
|
return item.inputNum;
|
||||||
|
}),
|
||||||
|
tooltip: {
|
||||||
|
valueFormatter: function (value) {
|
||||||
|
return value + ' 片';
|
||||||
|
},
|
||||||
|
},
|
||||||
|
animationDuration,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '产出',
|
||||||
|
type: 'bar',
|
||||||
|
barWidth: '20',
|
||||||
|
data: this.barData.map((item) => {
|
||||||
|
return item.outputNum;
|
||||||
|
}),
|
||||||
|
tooltip: {
|
||||||
|
valueFormatter: function (value) {
|
||||||
|
return value + ' 片';
|
||||||
|
},
|
||||||
|
},
|
||||||
|
animationDuration,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '加工成品率',
|
||||||
|
type: 'line',
|
||||||
|
yAxisIndex: 1,
|
||||||
|
tooltip: {
|
||||||
|
valueFormatter: function (value) {
|
||||||
|
return value + ' %';
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data: this.barData.map((item) => {
|
||||||
|
return item.processingRatio;
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
273
src/views/core/monitoring/data/baseTable.vue
Normal file
@@ -0,0 +1,273 @@
|
|||||||
|
<template>
|
||||||
|
<div class="baseTable">
|
||||||
|
<el-table
|
||||||
|
:ref="id"
|
||||||
|
:data="renderData"
|
||||||
|
v-bind="$attrs"
|
||||||
|
:border="cancelBorder ? false : true"
|
||||||
|
@current-change="currentChange"
|
||||||
|
@selection-change="handleSelectionChange"
|
||||||
|
style="width: 100%"
|
||||||
|
:header-cell-style="{
|
||||||
|
background: '#F2F4F9',
|
||||||
|
color: '#606266',
|
||||||
|
}">
|
||||||
|
<!-- 多选 -->
|
||||||
|
<el-table-column
|
||||||
|
v-if="selectWidth"
|
||||||
|
type="selection"
|
||||||
|
:width="selectWidth" />
|
||||||
|
<!-- 序号 -->
|
||||||
|
<el-table-column
|
||||||
|
v-if="page && limit"
|
||||||
|
prop="_pageIndex"
|
||||||
|
:width="pageWidth"
|
||||||
|
align="center"
|
||||||
|
:fixed="cancelPageFixed ? false : true">
|
||||||
|
<template slot="header">
|
||||||
|
<el-popover placement="bottom-start" width="300" trigger="click">
|
||||||
|
<div
|
||||||
|
class="setting-box"
|
||||||
|
style="max-height: 400px; overflow-y: auto">
|
||||||
|
<el-checkbox
|
||||||
|
v-for="(item, index) in tableProps"
|
||||||
|
:key="'cb' + index"
|
||||||
|
v-model="selectedBox[index]"
|
||||||
|
:label="item.label" />
|
||||||
|
</div>
|
||||||
|
<i slot="reference" class="el-icon-s-tools" />
|
||||||
|
</el-popover>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
|
||||||
|
<el-table-column
|
||||||
|
v-for="item in renderTableHeadList"
|
||||||
|
:key="item.prop"
|
||||||
|
v-bind="item"
|
||||||
|
:label="item.label"
|
||||||
|
:prop="item.prop"
|
||||||
|
:fixed="item.fixed || false"
|
||||||
|
:show-overflow-tooltip="item.showOverflowtooltip || false"
|
||||||
|
:sortable="item.sortable || false">
|
||||||
|
<template slot="header">
|
||||||
|
<span>{{ item.label }}</span>
|
||||||
|
</template>
|
||||||
|
<!-- 多表头 -->
|
||||||
|
<template v-if="item.children">
|
||||||
|
<el-table-column
|
||||||
|
v-for="sub in item.children"
|
||||||
|
:prop="sub.prop"
|
||||||
|
:key="sub.prop"
|
||||||
|
v-bind="sub"
|
||||||
|
:label="sub.label">
|
||||||
|
<template v-if="sub.children">
|
||||||
|
<el-table-column
|
||||||
|
v-for="ssub in sub.children"
|
||||||
|
:prop="ssub.prop"
|
||||||
|
:key="ssub.prop"
|
||||||
|
v-bind="ssub"
|
||||||
|
:label="ssub.label">
|
||||||
|
<template slot-scope="sscopeInner">
|
||||||
|
<component
|
||||||
|
:is="ssub.subcomponent"
|
||||||
|
v-if="ssub.subcomponent"
|
||||||
|
:key="sscopeInner.row.id"
|
||||||
|
:inject-data="{ ...sscopeInner.row, ...ssub }"
|
||||||
|
@emitData="emitData" />
|
||||||
|
<span v-else>
|
||||||
|
{{ sscopeInner.row[ssub.prop] | commonFilter(ssub.filter) }}
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</template>
|
||||||
|
<template slot-scope="scopeInner">
|
||||||
|
<component
|
||||||
|
:is="sub.subcomponent"
|
||||||
|
v-if="sub.subcomponent"
|
||||||
|
:key="scopeInner.row.id"
|
||||||
|
:inject-data="{ ...scopeInner.row, ...sub }"
|
||||||
|
@emitData="emitData" />
|
||||||
|
<span v-else>
|
||||||
|
{{ scopeInner.row[sub.prop] | commonFilter(sub.filter) }}
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</template>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<component
|
||||||
|
:is="item.subcomponent"
|
||||||
|
v-if="item.subcomponent"
|
||||||
|
:key="scope.row.id"
|
||||||
|
:itemProp="item.prop"
|
||||||
|
:inject-data="{ ...scope.row, ...item }"
|
||||||
|
@emitData="emitData" />
|
||||||
|
<span v-else>
|
||||||
|
{{ scope.row[item.prop] | commonFilter(item.filter) }}
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<slot name="handleBtn" />
|
||||||
|
</el-table>
|
||||||
|
<!-- 表格底部加号 -->
|
||||||
|
<el-button
|
||||||
|
v-if="addButtonShow"
|
||||||
|
class="addButton"
|
||||||
|
icon="el-icon-plus"
|
||||||
|
@click="emitButtonClick">
|
||||||
|
{{ addButtonShow }}
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'BaseTable',
|
||||||
|
filters: {
|
||||||
|
commonFilter: (source, filterType = (a) => a) => {
|
||||||
|
return filterType(source);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
cancelBorder: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
cancelPageFixed: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
tableData: {
|
||||||
|
type: Array,
|
||||||
|
required: true,
|
||||||
|
default: () => {
|
||||||
|
return [];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
tableProps: {
|
||||||
|
type: Array,
|
||||||
|
default: () => {
|
||||||
|
return [];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
id: {
|
||||||
|
type: String,
|
||||||
|
required: false,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
page: {
|
||||||
|
type: Number,
|
||||||
|
required: false,
|
||||||
|
default: 0,
|
||||||
|
},
|
||||||
|
pageWidth: {
|
||||||
|
type: Number,
|
||||||
|
required: false,
|
||||||
|
default: 70,
|
||||||
|
},
|
||||||
|
limit: {
|
||||||
|
type: Number,
|
||||||
|
required: false,
|
||||||
|
default: 0,
|
||||||
|
},
|
||||||
|
selectWidth: {
|
||||||
|
type: Number,
|
||||||
|
required: false,
|
||||||
|
default: 0,
|
||||||
|
},
|
||||||
|
addButtonShow: {
|
||||||
|
type: String,
|
||||||
|
required: false,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
selectedBox: new Array(100).fill(true),
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
renderTableHeadList() {
|
||||||
|
return this.tableProps.filter((item, index) => {
|
||||||
|
return this.selectedBox[index];
|
||||||
|
});
|
||||||
|
},
|
||||||
|
renderData() {
|
||||||
|
return this.tableData.map((item, index) => {
|
||||||
|
return {
|
||||||
|
...item,
|
||||||
|
_pageIndex: (this.page - 1) * this.limit + index + 1,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
beforeMount() {
|
||||||
|
this.selectedBox = new Array(100).fill(true);
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
currentChange(newVal, oldVal) {
|
||||||
|
this.$emit('current-change', { newVal, oldVal });
|
||||||
|
},
|
||||||
|
handleSelectionChange(val) {
|
||||||
|
this.$emit('selection-change', val);
|
||||||
|
},
|
||||||
|
emitData(val) {
|
||||||
|
this.$emit('emitFun', val);
|
||||||
|
},
|
||||||
|
emitButtonClick() {
|
||||||
|
this.$emit('emitButtonClick');
|
||||||
|
},
|
||||||
|
setCurrent(name, index) {
|
||||||
|
let _this = this;
|
||||||
|
let obj = _this.$refs[name].data[index];
|
||||||
|
_this.$refs[name].setCurrentRow(obj);
|
||||||
|
},
|
||||||
|
doLayout(name) {
|
||||||
|
this.$refs[name].doLayout();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<style scoped>
|
||||||
|
.baseTable .show-col-btn {
|
||||||
|
margin-right: 5px;
|
||||||
|
line-height: inherit;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.baseTable .el-icon-refresh {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<style>
|
||||||
|
.baseTable .el-table__body tr.current-row > td.el-table__cell {
|
||||||
|
background-color: #eaf1fc;
|
||||||
|
}
|
||||||
|
.baseTable .el-table .el-table__cell {
|
||||||
|
padding: 0;
|
||||||
|
height: 35px;
|
||||||
|
}
|
||||||
|
.baseTable .addButton {
|
||||||
|
width: 100%;
|
||||||
|
height: 35px;
|
||||||
|
border-top: none;
|
||||||
|
color: #0b58ff;
|
||||||
|
border-color: #ebeef5;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
.baseTable .addButton:hover {
|
||||||
|
color: #0b58ff;
|
||||||
|
border-color: #ebeef5;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
.baseTable .addButton:focus {
|
||||||
|
border-color: #ebeef5;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-tooltip__popper.is-dark {
|
||||||
|
background: rgba(0, 0, 0, 0.6) !important;
|
||||||
|
}
|
||||||
|
.el-tooltip__popper .popper__arrow,
|
||||||
|
.el-tooltip__popper .popper__arrow::after {
|
||||||
|
border-top-color: rgba(0, 0, 0, 0.4) !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
314
src/views/core/monitoring/data/index-old.vue
Normal file
@@ -0,0 +1,314 @@
|
|||||||
|
<!--
|
||||||
|
* @Author: Do not edit
|
||||||
|
* @Date: 2023-08-29 14:59:29
|
||||||
|
* @LastEditTime: 2024-12-02 13:43:57
|
||||||
|
* @LastEditors: zwq
|
||||||
|
* @Description:
|
||||||
|
-->
|
||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
<search-bar
|
||||||
|
:formConfigs="formConfig"
|
||||||
|
ref="searchBarForm"
|
||||||
|
@headBtnClick="buttonClick" />
|
||||||
|
<base-table
|
||||||
|
v-if="showData.length"
|
||||||
|
class="right-aside"
|
||||||
|
v-loading="dataListLoading"
|
||||||
|
:table-props="tableProps"
|
||||||
|
:page="listQuery.pageNo"
|
||||||
|
:limit="listQuery.pageSize"
|
||||||
|
:selectWidth="55"
|
||||||
|
:table-data="showData"
|
||||||
|
@selection-change="selectChange"
|
||||||
|
>
|
||||||
|
<method-btn
|
||||||
|
v-if="tableBtn.length"
|
||||||
|
slot="handleBtn"
|
||||||
|
:width="120"
|
||||||
|
label="操作"
|
||||||
|
:method-list="tableBtn"
|
||||||
|
@clickBtn="handleClick" />
|
||||||
|
</base-table>
|
||||||
|
<div v-else class="no-data-bg"></div>
|
||||||
|
<pagination
|
||||||
|
:limit.sync="listQuery.pageSize"
|
||||||
|
:page.sync="listQuery.pageNo"
|
||||||
|
:total="listQuery.total"
|
||||||
|
@pagination="getDataList" />
|
||||||
|
<el-dialog
|
||||||
|
title="提示"
|
||||||
|
:visible.sync="dialogVisible"
|
||||||
|
width="30%"
|
||||||
|
:before-close="handleClose">
|
||||||
|
<el-button type="primary" @click="exportXlsx">xlsx</el-button>
|
||||||
|
<el-button type="success" @click="exportPdf">pdf</el-button>
|
||||||
|
<span slot="footer" class="dialog-footer">
|
||||||
|
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||||
|
<el-button type="primary" @click="dialogVisible = false">确 定</el-button>
|
||||||
|
</span>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { getPdlDataSearch, getPdList } from '@/api/core/monitoring/data'
|
||||||
|
import * as XLSX from 'xlsx'
|
||||||
|
import FileSaver from 'file-saver'
|
||||||
|
import jsPDF from 'jspdf'
|
||||||
|
import html2canvas from 'html2canvas'
|
||||||
|
|
||||||
|
const tableProps = [
|
||||||
|
{
|
||||||
|
prop: 'proLineName',
|
||||||
|
label: '产线名称'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'inputNum',
|
||||||
|
label: '投入数量/片'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'outputNum',
|
||||||
|
label: '产出数量/片'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'outputArea',
|
||||||
|
label: '产出面积/㎡',
|
||||||
|
filter: (val) => (val != null ? val.toFixed(2) : '-'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'lossNum',
|
||||||
|
label: '损耗数量/片'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'lossArea',
|
||||||
|
label: '损耗面积/㎡',
|
||||||
|
filter: (val) => (val != null ? val.toFixed(2) : '-'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'lossRate',
|
||||||
|
label: '损耗比例%',
|
||||||
|
filter: (val) => (val != null ? val.toFixed(2) : '-'),
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
urlOptions: {
|
||||||
|
getDataListURL: getPdlDataSearch
|
||||||
|
},
|
||||||
|
tableData: [],
|
||||||
|
listQuery: {
|
||||||
|
pageSize: 10,
|
||||||
|
pageNo: 1,
|
||||||
|
total: 1,
|
||||||
|
proLineId: undefined
|
||||||
|
},
|
||||||
|
exportLoading: false,
|
||||||
|
dataListLoading: false,
|
||||||
|
dialogVisible: false,
|
||||||
|
addOrEditTitle: '',
|
||||||
|
addOrUpdateVisible: false,
|
||||||
|
tableProps,
|
||||||
|
tableBtn: [],
|
||||||
|
showData: [],
|
||||||
|
tableData: [],
|
||||||
|
selectedList: [],
|
||||||
|
fileName: '',
|
||||||
|
formConfig: [
|
||||||
|
{
|
||||||
|
type: 'select',
|
||||||
|
label: '产线',
|
||||||
|
selectOptions: [],
|
||||||
|
param: 'line'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'datePicker',
|
||||||
|
label: '时间范围',
|
||||||
|
dateType: 'datetimerange',
|
||||||
|
format: 'yyyy-MM-dd HH:mm:ss',
|
||||||
|
valueFormat: "yyyy-MM-ddTHH:mm:ss",
|
||||||
|
rangeSeparator: '-',
|
||||||
|
startPlaceholder: '开始时间',
|
||||||
|
endPlaceholder: '结束时间',
|
||||||
|
param: 'timeVal',
|
||||||
|
defaultSelect: [],
|
||||||
|
width: 350
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'button',
|
||||||
|
btnName: '查询',
|
||||||
|
name: 'search',
|
||||||
|
color: 'primary',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'separate',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// type: this.$auth.hasPermi('base:factory:export') ? 'button' : '',
|
||||||
|
type: 'button',
|
||||||
|
btnName: '导出',
|
||||||
|
name: 'export',
|
||||||
|
color: 'warning',
|
||||||
|
}
|
||||||
|
],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
if (this.$route.params.startTime) {
|
||||||
|
this.formConfig[1].defaultSelect = [this.$route.params.startTime, this.$route.params.endTime]
|
||||||
|
}
|
||||||
|
// const time = new Date()
|
||||||
|
// this.formConfig[1].defaultSelect = [time, time]
|
||||||
|
this.getDataList()
|
||||||
|
this.getPdLineList()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
test() {
|
||||||
|
var target = document.getElementsByClassName("right-aside")[0]
|
||||||
|
target.style.background = '#FFFFFF'
|
||||||
|
var that = this
|
||||||
|
setTimeout(() => {
|
||||||
|
html2canvas(target).then(function(canvas) {
|
||||||
|
var contentWidth = canvas.width
|
||||||
|
var contentHeight = canvas.height
|
||||||
|
|
||||||
|
// 一页pdf显示html页面生成的canvas高度
|
||||||
|
var pageHeight = contentHeight / 592.28 * 841.89
|
||||||
|
// 未生成pdf的html页面高度
|
||||||
|
var leftHeight = contentHeight
|
||||||
|
// 页面偏移
|
||||||
|
var position = 0
|
||||||
|
// a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的高度
|
||||||
|
var imgWidth = 595.28
|
||||||
|
var imgHeight = 592.28 / contentWidth * contentHeight
|
||||||
|
|
||||||
|
var pageData = canvas.toDataURL('image/jpeg', 1.0)
|
||||||
|
|
||||||
|
console.log('nihc URL', leftHeight, pageHeight)
|
||||||
|
|
||||||
|
var pdf = new jsPDF('', 'pt', 'a4')
|
||||||
|
|
||||||
|
if (leftHeight < pageHeight) {
|
||||||
|
pdf.addImage(pageData, 'JPEG', 0, 20, imgWidth, imgHeight)
|
||||||
|
} else {
|
||||||
|
while(leftHeight > 0) {
|
||||||
|
pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
|
||||||
|
leftHeight -= pageHeight
|
||||||
|
position -= 841.89
|
||||||
|
// 避免空白页
|
||||||
|
if (leftHeight > 0) {
|
||||||
|
pdf.addPage()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pdf.save(that.fileName + '产线产量.pdf')
|
||||||
|
})
|
||||||
|
}, 300)
|
||||||
|
},
|
||||||
|
exportECL() {
|
||||||
|
let tables = document.querySelector('.el-table').cloneNode(true)
|
||||||
|
const fix = tables.querySelector('.el-table__fixed')
|
||||||
|
const fixRight = tables.querySelector('.el-table__fixed-right')
|
||||||
|
if (fix) {
|
||||||
|
tables.removeChild(tables.querySelector('.el-table__fixed'))
|
||||||
|
}
|
||||||
|
if (fixRight) {
|
||||||
|
tables.removeChild(tables.querySelector('.el-table__fixed-right'))
|
||||||
|
}
|
||||||
|
let exportTable = XLSX.utils.table_to_book(tables)
|
||||||
|
|
||||||
|
var exportTableOut = XLSX.write(exportTable, {
|
||||||
|
bookType: 'xlsx', bookSST: true, type: 'array'
|
||||||
|
})
|
||||||
|
// sheetjs.xlsx为导出表格的标题名称
|
||||||
|
try {
|
||||||
|
FileSaver.saveAs(new Blob([exportTableOut], {
|
||||||
|
type: 'application/octet-stream'
|
||||||
|
}), this.fileName + '产线产量.xlsx')
|
||||||
|
} catch (e) {
|
||||||
|
if (typeof console !== 'undefined') console.log(e, exportTableOut)
|
||||||
|
}
|
||||||
|
return exportTableOut
|
||||||
|
},
|
||||||
|
exportPdf() {
|
||||||
|
this.test()
|
||||||
|
setTimeout(() =>{
|
||||||
|
this.dialogVisible = false
|
||||||
|
this.showData = this.tableData
|
||||||
|
}, 600)
|
||||||
|
|
||||||
|
},
|
||||||
|
exportXlsx() {
|
||||||
|
this.exportECL()
|
||||||
|
this.dialogVisible = false
|
||||||
|
this.showData = this.tableData
|
||||||
|
},
|
||||||
|
handleClose(done) {
|
||||||
|
this.$confirm('确认关闭?')
|
||||||
|
.then(_ => {
|
||||||
|
done();
|
||||||
|
})
|
||||||
|
.catch(_ => {});
|
||||||
|
},
|
||||||
|
getPdLineList() {
|
||||||
|
getPdList().then((res) => {
|
||||||
|
this.formConfig[0].selectOptions = res.data || []
|
||||||
|
})
|
||||||
|
},
|
||||||
|
selectChange(val) {
|
||||||
|
console.log(val)
|
||||||
|
this.selectedList = val
|
||||||
|
},
|
||||||
|
buttonClick(val) {
|
||||||
|
switch (val.btnName) {
|
||||||
|
case 'search':
|
||||||
|
this.listQuery.pageNo = 1;
|
||||||
|
this.listQuery.pageSize = 10;
|
||||||
|
this.listQuery.proLineId = val.line ? val.line : undefined;
|
||||||
|
this.listQuery.startTime = val.timeVal ? new Date(val.timeVal[0]).getTime() : undefined;
|
||||||
|
this.listQuery.endTime = val.timeVal ? new Date(val.timeVal[1]).getTime() : undefined;
|
||||||
|
if (val.timeVal && val.timeVal.length > 0) {
|
||||||
|
this.fileName = val.timeVal[0].slice(0, 10) + '-' + val.timeVal[1].slice(0, 10) + '_'
|
||||||
|
}
|
||||||
|
this.getDataList();
|
||||||
|
break;
|
||||||
|
case 'export':
|
||||||
|
this.handleExport();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
console.log(val);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 获取数据列表
|
||||||
|
getDataList() {
|
||||||
|
this.dataListLoading = true;
|
||||||
|
this.urlOptions.getDataListURL(this.listQuery).then(response => {
|
||||||
|
this.tableData = response.data;
|
||||||
|
this.listQuery.total = response.data.length;
|
||||||
|
this.dataListLoading = false;
|
||||||
|
this.showData = this.tableData
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// 每页数
|
||||||
|
sizeChangeHandle(val) {
|
||||||
|
this.listQuery.pageSize = val;
|
||||||
|
this.listQuery.pageNo = 1;
|
||||||
|
this.getDataList();
|
||||||
|
},
|
||||||
|
// 当前页
|
||||||
|
currentChangeHandle(val) {
|
||||||
|
this.listQuery.pageNo = val;
|
||||||
|
this.getDataList();
|
||||||
|
},
|
||||||
|
handleExport() {
|
||||||
|
if (this.selectedList.length > 0) {
|
||||||
|
this.showData = this.selectedList
|
||||||
|
}
|
||||||
|
this.dialogVisible = true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||