diff --git a/.env.dev b/.env.dev index d6048b91..574a759f 100644 --- a/.env.dev +++ b/.env.dev @@ -9,7 +9,7 @@ ENV = 'development' # 页面标题 -VUE_APP_TITLE = 芋道管理系统 +VUE_APP_TITLE = 产线监控系统 # 芋道管理系统/开发环境 # VUE_APP_BASE_API = 'http://192.168.1.49:48080' diff --git a/.env.front b/.env.front index 9e2d4d2b..34f878c2 100644 --- a/.env.front +++ b/.env.front @@ -2,7 +2,7 @@ ENV = 'development' # 页面标题 -VUE_APP_TITLE = 芋道管理系统 +VUE_APP_TITLE = 产线监控系统 # 芋道管理系统/本地环境 VUE_APP_BASE_API = 'http://api-dashboard.yudao.iocoder.cn' diff --git a/.env.prod b/.env.prod index 4c6133c8..7ac2b7f1 100644 --- a/.env.prod +++ b/.env.prod @@ -2,7 +2,7 @@ ENV = 'production' # 页面标题 -VUE_APP_TITLE = 芋道管理系统 +VUE_APP_TITLE = 产线监控系统 # 芋道管理系统/生产环境 VUE_APP_BASE_API = '/prod-api' diff --git a/.env.stage b/.env.stage index 5942b3c6..3602a9b9 100644 --- a/.env.stage +++ b/.env.stage @@ -1,7 +1,7 @@ NODE_ENV = production # 页面标题 -VUE_APP_TITLE = 芋道管理系统 +VUE_APP_TITLE = 产线监控系统 # 测试环境配置 ENV = 'staging' diff --git a/.env.static b/.env.static index 13901cd3..35e7a28e 100644 --- a/.env.static +++ b/.env.static @@ -4,7 +4,7 @@ NODE_ENV = development ENV = 'staging' # 页面标题 -VUE_APP_TITLE = 芋道管理系统 +VUE_APP_TITLE = 产线监控系统 # 芋道管理系统/测试环境 VUE_APP_BASE_API = 'http://127.0.0.1:48080' diff --git a/public/favicon.ico b/public/favicon.ico index e2637602..e3bdd359 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index b4572179..655a9ab5 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -94,7 +94,7 @@ export default { async logout() { this.$modal.confirm('确定注销并退出系统吗?', '提示').then(() => { this.$store.dispatch('LogOut').then(() => { - location.href = getPath('/index'); + location.href = getPath('/'); }) }).catch(() => {}); } diff --git a/src/router/index.js b/src/router/index.js index ca26742b..f8430b94 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -65,16 +65,17 @@ export const constantRoutes = [ hidden: true }, { - path: '', + path: '/', component: Layout, - redirect: 'index', - children: [{ - path: 'index', - component: (resolve) => require(['@/views/index'], resolve), - name: '首页', - meta: {title: '首页', icon: 'dashboard', affix: true} - } - ] + redirect: 'core/base/factory', + // children: [{ + // path: 'index', + // redirect: 'core/base/factory', + // component: (resolve) => require(['@/views/index'], resolve), + // name: '首页', + // meta: { title: '首页', icon: 'dashboard', affix: true } + // } + // ] }, { path: '/user', @@ -82,15 +83,15 @@ export const constantRoutes = [ hidden: true, redirect: 'noredirect', children: [{ - path: 'profile', - component: (resolve) => require(['@/views/system/user/profile/index'], resolve), - name: 'Profile', - meta: {title: '个人中心', icon: 'user'} - }, { - path: 'notify-message', - component: (resolve) => require(['@/views/system/notify/my/index'], resolve), - name: 'MyNotifyMessage', - meta: { title: '我的站内信', icon: 'message' }, + path: 'profile', + component: (resolve) => require(['@/views/system/user/profile/index'], resolve), + name: 'Profile', + meta: { title: '个人中心', icon: 'user' } + }, { + path: 'notify-message', + component: (resolve) => require(['@/views/system/notify/my/index'], resolve), + name: 'MyNotifyMessage', + meta: { title: '我的站内信', icon: 'message' }, }] }, { @@ -98,11 +99,11 @@ export const constantRoutes = [ component: Layout, hidden: true, children: [{ - path: 'type/data/:dictId(\\d+)', - component: (resolve) => require(['@/views/system/dict/data'], resolve), - name: 'SystemDictData', - meta: {title: '字典数据', icon: '', activeMenu: '/system/dict'} - } + path: 'type/data/:dictId(\\d+)', + component: (resolve) => require(['@/views/system/dict/data'], resolve), + name: 'SystemDictData', + meta: { title: '字典数据', icon: '', activeMenu: '/system/dict' } + } ] }, { @@ -110,22 +111,22 @@ export const constantRoutes = [ component: Layout, hidden: true, children: [{ - path: 'log', - component: (resolve) => require(['@/views/infra/job/log'], resolve), - name: 'InfraJobLog', - meta: {title: '调度日志', activeMenu: '/infra/job'} - } + path: 'log', + component: (resolve) => require(['@/views/infra/job/log'], resolve), + name: 'InfraJobLog', + meta: { title: '调度日志', activeMenu: '/infra/job' } + } ] }, { path: '/codegen', component: Layout, hidden: true, children: [{ - path: 'edit/:tableId(\\d+)', - component: (resolve) => require(['@/views/infra/codegen/editTable'], resolve), - name: 'InfraCodegenEditTable', - meta: {title: '修改生成配置', activeMenu: '/infra/codegen'} - } + path: 'edit/:tableId(\\d+)', + component: (resolve) => require(['@/views/infra/codegen/editTable'], resolve), + name: 'InfraCodegenEditTable', + meta: { title: '修改生成配置', activeMenu: '/infra/codegen' } + } ] }, { @@ -134,16 +135,16 @@ export const constantRoutes = [ hidden: true, redirect: 'noredirect', children: [{ - path: 'oa/leave/create', - component: (resolve) => require(['@/views/bpm/oa/leave/create'], resolve), - name: 'BpmOALeaveCreate', - meta: {title: '发起 OA 请假', icon: 'form', activeMenu: '/bpm/oa/leave'} - }, { - path: 'oa/leave/detail', - component: (resolve) => require(['@/views/bpm/oa/leave/detail'], resolve), - name: 'BpmOALeaveDetail', - meta: {title: '查看 OA 请假', icon: 'view', activeMenu: '/bpm/oa/leave'} - } + path: 'oa/leave/create', + component: (resolve) => require(['@/views/bpm/oa/leave/create'], resolve), + name: 'BpmOALeaveCreate', + meta: { title: '发起 OA 请假', icon: 'form', activeMenu: '/bpm/oa/leave' } + }, { + path: 'oa/leave/detail', + component: (resolve) => require(['@/views/bpm/oa/leave/detail'], resolve), + name: 'BpmOALeaveDetail', + meta: { title: '查看 OA 请假', icon: 'view', activeMenu: '/bpm/oa/leave' } + } ] }, { @@ -151,31 +152,31 @@ export const constantRoutes = [ component: Layout, hidden: true, children: [{ - path: 'manager/form/edit', - component: (resolve) => require(['@/views/bpm/form/formEditor'], resolve), - name: 'BpmFormEditor', - meta: {title: '流程表单-编辑', activeMenu: '/bpm/manager/form'} - }, { - path: 'manager/definition', - component: (resolve) => require(['@/views/bpm/definition/index'], resolve), - name: 'BpmProcessDefinition', - meta: {title: '流程定义', activeMenu: '/bpm/manager/model'} - }, { - path: 'manager/model/design', - component: (resolve) => require(['@/views/bpm/model/modelEditor'], resolve), - name: 'BpmModelEditor', - meta: {title: '设计流程', activeMenu: '/bpm/manager/model'} - }, { - path: 'process-instance/create', - component: (resolve) => require(['@/views/bpm/processInstance/create'], resolve), - name: 'BpmProcessInstanceCreate', - meta: {title: '发起流程', activeMenu: '/bpm/task/my'} - }, { - path: 'process-instance/detail', - component: (resolve) => require(['@/views/bpm/processInstance/detail'], resolve), - name: 'BpmProcessInstanceDetail', - meta: {title: '流程详情', activeMenu: '/bpm/task/my'} - } + path: 'manager/form/edit', + component: (resolve) => require(['@/views/bpm/form/formEditor'], resolve), + name: 'BpmFormEditor', + meta: { title: '流程表单-编辑', activeMenu: '/bpm/manager/form' } + }, { + path: 'manager/definition', + component: (resolve) => require(['@/views/bpm/definition/index'], resolve), + name: 'BpmProcessDefinition', + meta: { title: '流程定义', activeMenu: '/bpm/manager/model' } + }, { + path: 'manager/model/design', + component: (resolve) => require(['@/views/bpm/model/modelEditor'], resolve), + name: 'BpmModelEditor', + meta: { title: '设计流程', activeMenu: '/bpm/manager/model' } + }, { + path: 'process-instance/create', + component: (resolve) => require(['@/views/bpm/processInstance/create'], resolve), + name: 'BpmProcessInstanceCreate', + meta: { title: '发起流程', activeMenu: '/bpm/task/my' } + }, { + path: 'process-instance/detail', + component: (resolve) => require(['@/views/bpm/processInstance/detail'], resolve), + name: 'BpmProcessInstanceDetail', + meta: { title: '流程详情', activeMenu: '/bpm/task/my' } + } ] }, { @@ -186,7 +187,7 @@ export const constantRoutes = [ path: 'value/:propertyId(\\d+)', component: (resolve) => require(['@/views/mall/product/property/value'], resolve), name: 'ProductPropertyValue', - meta: {title: '商品属性值', icon: '', activeMenu: '/product/property'} + meta: { title: '商品属性值', icon: '', activeMenu: '/product/property' } } ] }, @@ -198,14 +199,14 @@ export const constantRoutes = [ path: 'edit/:spuId(\\d+)', component: (resolve) => require(['@/views/mall/product/spu/save'], resolve), name: 'ProductSpuUpdate', - meta: {title: '修改商品', activeMenu: '/product/spu'} + meta: { title: '修改商品', activeMenu: '/product/spu' } }, - { - path: 'add', - component: (resolve) => require(['@/views/mall/product/spu/save'], resolve), - name: 'ProductSpuCreate', - meta: {title: '添加商品', activeMenu: '/product/spu'} - } + { + path: 'add', + component: (resolve) => require(['@/views/mall/product/spu/save'], resolve), + name: 'ProductSpuCreate', + meta: { title: '添加商品', activeMenu: '/product/spu' } + } ] }, { @@ -248,6 +249,6 @@ Router.prototype.push = function push(location) { export default new Router({ base: process.env.VUE_APP_APP_NAME ? process.env.VUE_APP_APP_NAME : "/", mode: 'hash', // 去掉url中的# - scrollBehavior: () => ({y: 0}), + scrollBehavior: () => ({ y: 0 }), routes: constantRoutes }) diff --git a/src/views/base/equipmentPlc/index.vue b/src/views/base/equipmentPlc/index.vue index 59c6fa71..09a47404 100644 --- a/src/views/base/equipmentPlc/index.vue +++ b/src/views/base/equipmentPlc/index.vue @@ -211,6 +211,7 @@ export default { switch: true, label: '是否采集', // 是否采集 0 代表不采集, 1 代表采集 prop: 'collection', + value: 1, bind: { 'active-value': 1, 'inactive-value': 0, diff --git a/src/views/base/equipmentPlcConnect/index.vue b/src/views/base/equipmentPlcConnect/index.vue index e6022379..5d7e72d9 100644 --- a/src/views/base/equipmentPlcConnect/index.vue +++ b/src/views/base/equipmentPlcConnect/index.vue @@ -144,7 +144,7 @@ export default { }, { type: 'select', - label: 'PLC编码', + label: '编码', placeholder: '请选择编码', param: 'plcId', selectOptions: [], @@ -184,6 +184,9 @@ export default { labelKey: `plcTableName`, url: '/base/equipment-plc/listAll', rules: [{ required: true, message: '不能为空', trigger: 'blur' }], + bind: { + filterable: true + } }, ], [ @@ -193,6 +196,9 @@ export default { prop: 'equipmentId', url: '/base/equipment/page?pageNo=1&pageSize=99', rules: [{ required: true, message: '不能为空', trigger: 'blur' }], + bind: { + filterable: true + } }, ], ], @@ -351,11 +357,7 @@ export default { handleDelete(row) { const id = row.id; this.$modal - .confirm( - '是否确认删除设备与实时采集关系表(一对多)编号为"' + - id + - '"的数据项?' - ) + .confirm('是否删除该配置?') .then(function () { return deleteEquipmentPlcConnect(id); }) diff --git a/src/views/base/equipmentPlcParam/index.vue b/src/views/base/equipmentPlcParam/index.vue index 6d932706..e2454c75 100644 --- a/src/views/base/equipmentPlcParam/index.vue +++ b/src/views/base/equipmentPlcParam/index.vue @@ -419,7 +419,7 @@ export default { handleDelete(row) { const id = row.id; this.$modal - .confirm('是否确认删除设备数采详情编号为"' + id + '"的数据项?') + .confirm('是否确认删除"' + row.name + '"的参数绑定?') .then(function () { return deleteEquipmentPlcParam(id); }) diff --git a/src/views/equipment/analysis/efficiency/index.vue b/src/views/equipment/analysis/efficiency/index.vue index 3f2e2853..87695fb6 100644 --- a/src/views/equipment/analysis/efficiency/index.vue +++ b/src/views/equipment/analysis/efficiency/index.vue @@ -55,7 +55,10 @@
-
+
@@ -253,7 +256,7 @@ export default { rangeSeparator: '-', startPlaceholder: '开始时间', endPlaceholder: '结束时间', - param: 'recordTime', + param: 'timerange', }, { parent: 'dateFilterType', @@ -264,7 +267,7 @@ export default { placeholder: '选择日期', format: 'yyyy-MM-dd', valueFormat: 'yyyy-MM-dd', - param: 'recordTime', + param: 'timeday', }, ], }, @@ -383,22 +386,18 @@ export default { if (btnName == 'search') { this.queryParams.factoryId = payload.factoryId || null; this.queryParams.lineId = payload.lineId || null; - if (payload.recordTime != null) { - if (typeof payload.recordTime == 'string') { - if (payload.recordTime.trim() !== '') { - this.queryParams.recordTime = [ - `${payload.recordTime} 00:00:00`, - `${payload.recordTime} 23:59:59`, - ]; - } - } else { - this.queryParams.recordTime = payload.recordTime; - } - } else { - this.queryParams.recordTime = null; + if (0 == payload.dateFilterType) { + this.queryParams.recordTime = payload.timerange; + } else if (1 == payload.dateFilterType) { + this.queryParams.recordTime = [ + `${payload.timeday} 00:00:00`, + `${payload.timeday} 23:59:59`, + ]; } - this.getList(); + } else { + this.queryParams.recordTime = null; } + this.getList(); }, cancel() { diff --git a/src/views/equipment/analysis/quality/components/lineChart.vue b/src/views/equipment/analysis/quality/components/lineChart.vue index b91b93f1..025af935 100644 --- a/src/views/equipment/analysis/quality/components/lineChart.vue +++ b/src/views/equipment/analysis/quality/components/lineChart.vue @@ -37,8 +37,14 @@ export default { option() { const opt = []; this.list.map((eq) => { - /** [设备名, ok数量, 不ok数量] */ - opt.push([eq.equipmentName, eq.okQuantity, eq.nokQuantity]); + /** [设备名, ok数量, 不ok数量, 加工数量, 合格率] */ + opt.push([ + eq.equipmentName, + eq.okQuantity, + eq.nokQuantity, + eq.totalQuantity, + eq.passRate.toFixed(2), + ]); }); return { color: ['#288AFF', '#8EF0AB'], @@ -51,7 +57,7 @@ export default { legend: { itemWidth: 12, itemHeight: 12, - right: 0 + right: 0, }, grid: { left: '1%', @@ -104,6 +110,17 @@ export default { stack: 's', data: opt.map((item) => item[2]), }, + { + name: '加工数量', + type: 'bar', + barWidth: 20, + data: opt.map((item) => item[3]), + }, + { + name: '合格率', + type: 'line', + data: opt.map((item) => item[4]), + }, ], }; }, diff --git a/src/views/equipment/timing-diagram/components/gantt.js b/src/views/equipment/timing-diagram/components/gantt.js new file mode 100644 index 00000000..fcbc6fba --- /dev/null +++ b/src/views/equipment/timing-diagram/components/gantt.js @@ -0,0 +1,191 @@ + +// filename: gantt.vue +// author: liubin +// date: 2023 -09 - 25 14: 28: 12 +// description: 甘特图 + + +import * as echarts from 'echarts'; + +/** + * + * @param {*} params + * @param {*} api + * + * https://echarts.apache.org/zh/option.html#series-custom.renderItem.arguments.params + */ +function renderItem(params, api) { } + +export default class Gantt { + constructor(el) { + this.chart = echarts.init(el); + let options = { + series: [ + { + type: 'custom', + coordinateSystem: 'cartesian2d', + renderItem: renderItem, + } + ] + } + this.chart.setOption(options); + } + + update(options) { + this.chart.setOption(options); + } + + resize() { + // todo + } + + destroy() { + this.chart.dispose(); + } +} + + + +var data = []; +var categories = ['设备1', '设备2', '设备3']; +var types = [ + { name: '运行', color: '#7b9ce1' }, + { name: '故障', color: '#bd6d6c' }, + { name: '停机', color: '#75d874' }, +]; +// return new Date(new Date(timestamp).toLocaleDateString()).getTime() +// })(1691568181000)) +function getStartTime(timestamp) { + return new Date(new Date(timestamp).toLocaleDateString()).getTime() +} + + +data.push({ + name: 'running', + value: [0, 1691568181000, 1691568181000 + 60 * 60 * 1000, 60], + itemStyle: { + normal: { + color: types[0].color + } + } +}) + + + +function renderItem(params, api) { + var categoryIndex = api.value(0); + var start = api.coord([api.value(1), categoryIndex]); + var end = api.coord([api.value(2), categoryIndex]); + var height = api.size([0, 1])[1] * 0.8; + var rectShape = echarts.graphic.clipRectByRect( + { + x: start[0], + y: start[1] - height / 2, + width: end[0] - start[0], + height: height + }, + { + x: params.coordSys.x, + y: params.coordSys.y, + width: params.coordSys.width, + height: params.coordSys.height + } + ); + return ( + rectShape && { + type: 'rect', + transition: ['shape'], + shape: rectShape, + style: api.style() + } + ); +} + +option = { + tooltip: { + // show: false, + formatter: function (params) { + return params.marker + params.name + ': ' + new Date(params.value[1]).toLocaleTimeString() + ' - ' + new Date(params.value[2]).toLocaleTimeString(); + } + }, + // title: { + // text: 'Profile', + // left: 'center' + // }, + // dataZoom: [ + // { + // type: 'slider', + // filterMode: 'weakFilter', + // showDataShadow: false, + // top: 400, + // labelFormatter: '' + // }, + // { + // type: 'inside', + // filterMode: 'weakFilter' + // } + // ], + grid: { + height: 300 + }, + xAxis: { + type: 'time', + min: getStartTime(1691568181000), + max: getStartTime(1691568181000 + 3600 * 24 * 1000), + splitNumber: 10, + // interval: 60*3600*1000, + // scale: true, + axisLabel: { + // rotate: -15, + formatter: function (val) { + return new Date(val).toLocaleTimeString() + } + }, + axisTick: { + show: true + }, + splitLine: { + show: false, + } + }, + yAxis: [{ + axisLine: { + // show: false, + lineStyle: { + color: '' + } + }, + axisLabel: { + fontSize: 14, + }, + axisTick: { + show: false, + }, + splitLine: { + show: true + }, + data: categories + }, { + axisLine: { + // show: false, + lineStyle: { + color: '' + } + }, + data: [] + }], + series: [ + { + type: 'custom', + renderItem: renderItem, + itemStyle: { + opacity: 0.8 + }, + encode: { + x: [1, 2], + y: 0 + }, + data: data + } + ] +}; \ No newline at end of file diff --git a/src/views/equipment/timing-diagram/status/index.vue b/src/views/equipment/timing-diagram/status/index.vue index ac4769a9..5c5b02d7 100644 --- a/src/views/equipment/timing-diagram/status/index.vue +++ b/src/views/equipment/timing-diagram/status/index.vue @@ -6,7 +6,9 @@ -->