Compare commits

..

76 Commits

Author SHA1 Message Date
gtz
be430ebbff Merge branch 'projects/mes-test' of git.picaiba.com:mt-fe-group/yudao-dev into projects/mes-test 2023-11-30 09:08:59 +08:00
eb063779b4 Merge pull request 'projects/mes-dy' (#129) from projects/mes-dy into projects/mes-test
Reviewed-on: #129
2023-11-30 08:58:32 +08:00
helloDy
a2672c1742 Merge branch 'projects/mes-test' into projects/mes-dy 2023-11-30 08:57:43 +08:00
4e97989ede Merge pull request 'projects/mes-zhp' (#131) from projects/mes-zhp into projects/mes-test
Reviewed-on: #131
2023-11-30 08:54:28 +08:00
‘937886381’
67200710c9 Merge branch 'projects/mes-test' into projects/mes-zhp 2023-11-30 08:52:23 +08:00
7e2b75aaa5 Merge pull request 'projects/mes-zjl' (#130) from projects/mes-zjl into projects/mes-test
Reviewed-on: #130
2023-11-29 17:00:45 +08:00
8ad9b9d717 merge test 2023-11-29 17:00:00 +08:00
3bf2757e42 班组跳转 2023-11-29 16:58:08 +08:00
helloDy
2267444b4a Merge branch 'projects/mes-test' into projects/mes-dy 2023-11-29 16:54:30 +08:00
helloDy
fa5a303c08 bug ui 2023-11-29 16:53:51 +08:00
‘937886381’
37586a31c5 Merge branch 'projects/mes-test' into projects/mes-zhp 2023-11-29 15:06:55 +08:00
‘937886381’
40b023cd8d 修改bug 2023-11-29 15:06:27 +08:00
5dce57e4bb Merge pull request 'projects/mes-lb' (#127) from projects/mes-lb into projects/mes-test
Reviewed-on: #127
2023-11-29 13:41:28 +08:00
lb
50a75dcb74 Merge branch 'projects/mes-test' into projects/mes-lb 2023-11-29 13:37:51 +08:00
lb
9ed4c944c5 fix bugs 2023-11-29 13:36:53 +08:00
lb
6702521f31 overwrite 产线平衡分析 2023-11-29 11:34:43 +08:00
gtz
61b4bf784b Merge branch 'projects/mes-test' of git.picaiba.com:mt-fe-group/yudao-dev into projects/mes-test 2023-11-29 10:17:02 +08:00
gtz
b0f10b9002 '1' 2023-11-29 10:16:58 +08:00
f37bba6747 Merge pull request 'projects/mes-zjl' (#126) from projects/mes-zjl into projects/mes-test
Reviewed-on: #126
2023-11-29 10:15:59 +08:00
365aafc21a merge test 2023-11-29 10:15:08 +08:00
de65afef11 登录页去掉验证 2023-11-29 10:12:41 +08:00
a135877df1 Merge pull request 'projects/mes-zhp' (#125) from projects/mes-zhp into projects/mes-test
Reviewed-on: #125
2023-11-29 09:06:51 +08:00
‘937886381’
8d26a9e487 Merge branch 'projects/mes-test' into projects/mes-zhp 2023-11-29 08:49:05 +08:00
‘937886381’
76771489da Merge branch 'projects/mes-test' of git.picaiba.com:mt-fe-group/yudao-dev into projects/mes-test 2023-11-29 08:48:41 +08:00
‘937886381’
27faa04c7a 修改bug 2023-11-29 08:48:09 +08:00
lb
c0daa74a84 update 产线平衡分析 2023-11-28 19:31:08 +08:00
6e7339bca3 Merge pull request 'projects/mes-dy' (#124) from projects/mes-dy into projects/mes-test
Reviewed-on: #124
2023-11-28 19:09:11 +08:00
helloDy
904350a4d8 Merge branch 'projects/mes-test' into projects/mes-dy 2023-11-28 18:09:16 +08:00
helloDy
4873f750d8 ui 2023-11-28 18:08:39 +08:00
13b522475e Merge pull request 'projects/mes-zjl' (#123) from projects/mes-zjl into projects/mes-test
Reviewed-on: #123
2023-11-28 16:51:59 +08:00
1a7e8cfc19 merge test 2023-11-28 16:50:51 +08:00
a0790a6e19 11.28 2023-11-28 16:42:40 +08:00
b76b8f4fe9 Merge pull request 'projects/mes-lb' (#122) from projects/mes-lb into projects/mes-test
Reviewed-on: #122
2023-11-28 16:29:12 +08:00
lb
978291e68a Merge branch 'projects/mes-test' into projects/mes-lb 2023-11-28 16:23:20 +08:00
lb
a5c17d2276 fix conflicts 2023-11-28 16:14:24 +08:00
a7b4e72bc2 Merge pull request 'projects/mes-lb' (#121) from projects/mes-lb into projects/mes-test
Reviewed-on: #121
2023-11-28 15:53:19 +08:00
lb
99f771a445 Merge branch 'projects/mes-test' into projects/mes-lb 2023-11-28 15:50:00 +08:00
lb
7201c26792 fix bugs 2023-11-28 15:46:50 +08:00
ad56aaf359 Merge pull request 'projects/mes-zhp' (#120) from projects/mes-zhp into projects/mes-test
Reviewed-on: #120
2023-11-28 11:01:53 +08:00
‘937886381’
5033bbb206 解决冲突 2023-11-28 10:59:24 +08:00
‘937886381’
6fc4794300 修改bug 2023-11-28 10:56:48 +08:00
‘937886381’
79c9f1ca66 修改bug 2023-11-28 10:54:51 +08:00
c74269b282 Merge pull request 'projects/mes-lb' (#119) from projects/mes-lb into projects/mes-test
Reviewed-on: #119
2023-11-28 09:06:58 +08:00
lb
57deff3875 Merge branch 'projects/mes-test' into projects/mes-lb 2023-11-28 09:06:01 +08:00
lb
68d3b46bab update process flow 2023-11-28 09:04:57 +08:00
gtz
e6b9d75f16 Merge branch 'projects/mes-test' of git.picaiba.com:mt-fe-group/yudao-dev into projects/mes-test 2023-11-28 09:03:13 +08:00
4323982b89 Merge pull request 'projects/mes-dy' (#118) from projects/mes-dy into projects/mes-test
Reviewed-on: #118
2023-11-28 09:01:37 +08:00
helloDy
c76078214e Merge branch 'projects/mes-test' into projects/mes-dy 2023-11-27 20:42:33 +08:00
helloDy
b527589e0f ui 2023-11-27 20:41:45 +08:00
375273419d Merge pull request 'projects/mes-lb' (#117) from projects/mes-lb into projects/mes-test
Reviewed-on: #117
2023-11-27 17:05:07 +08:00
lb
a18929a261 Merge branch 'projects/mes-test' into projects/mes-lb 2023-11-27 17:04:32 +08:00
6d465c17c2 Merge pull request 'projects/mes-zjl' (#116) from projects/mes-zjl into projects/mes-test
Reviewed-on: #116
2023-11-27 16:43:48 +08:00
669345c983 merge test 2023-11-27 16:43:15 +08:00
b86094c630 订单监控 2023-11-27 16:41:14 +08:00
lb
2fdee9cafd update 2023-11-27 15:39:30 +08:00
lb
4348d66e53 update 2023-11-27 14:40:11 +08:00
lb
76c2f50bf3 fix bugs 2023-11-27 11:31:21 +08:00
888b5aa91f Merge pull request 'projects/mes-dy' (#115) from projects/mes-dy into projects/mes-test
Reviewed-on: #115
2023-11-27 09:42:54 +08:00
helloDy
a7f1087775 Merge branch 'projects/mes-test' into projects/mes-dy 2023-11-27 09:39:01 +08:00
helloDy
b0efd66a75 bug ui 2023-11-27 09:38:31 +08:00
gtz
d9f3434712 Merge branch 'projects/mes-test' of git.picaiba.com:mt-fe-group/yudao-dev into projects/mes-test 2023-11-27 09:31:52 +08:00
51f72ea5d2 Merge pull request 'projects/mes-lb' (#114) from projects/mes-lb into projects/mes-test
Reviewed-on: #114
2023-11-27 08:43:14 +08:00
lb
d5507ec4c0 Merge branch 'projects/mes-test' into projects/mes-lb 2023-11-24 19:15:23 +08:00
lb
8802c932e2 update 设备报警日志 2023-11-24 19:10:33 +08:00
ee26741e62 Merge pull request 'projects/mes-dy' (#113) from projects/mes-dy into projects/mes-test
Reviewed-on: #113
2023-11-24 19:06:04 +08:00
lb
a8fa98cb91 update StatusAndParams 2023-11-24 14:56:17 +08:00
lb
54b63a7f53 update drawer and edit 2023-11-24 10:41:11 +08:00
gtz
de15716b7c Merge branch 'projects/mes-test' of git.picaiba.com:mt-fe-group/yudao-dev into projects/mes-test 2023-11-22 14:53:49 +08:00
gtz
c736992a34 '1' 2023-11-22 14:49:56 +08:00
gtz
dcbb2c719b Merge branch 'projects/mes-test' of git.picaiba.com:mt-fe-group/yudao-dev into projects/mes-test 2023-11-22 14:15:39 +08:00
gtz
bc2940ca99 Merge branch 'projects/mes-test' of git.picaiba.com:mt-fe-group/yudao-dev into projects/mes-test 2023-11-21 17:30:38 +08:00
gtz
76938951ed Merge branch 'projects/mes-test' of git.picaiba.com:mt-fe-group/yudao-dev into projects/mes-test 2023-11-20 16:07:12 +08:00
gtz
8b91e7812f '1' 2023-11-17 10:38:44 +08:00
gtz
9cffa01414 Merge branch 'projects/mes-test' of git.picaiba.com:mt-fe-group/yudao-dev into projects/mes-test 2023-11-17 10:38:35 +08:00
gtz
905479d5f4 'del_dist' 2023-11-17 10:29:23 +08:00
gtz
c1ae248234 '1' 2023-11-17 10:28:39 +08:00
121 changed files with 3854 additions and 3239 deletions

View File

@@ -16,7 +16,7 @@ VUE_APP_TITLE = MES系统
VUE_APP_BASE_API = 'http://192.168.0.33:48082' VUE_APP_BASE_API = 'http://192.168.0.33:48082'
# VUE_APP_BASE_API = 'http://192.168.4.173:48080' # VUE_APP_BASE_API = 'http://192.168.4.173:48080'
# VUE_APP_BASE_API = 'http://192.168.2.173:48080' # VUE_APP_BASE_API = 'http://192.168.2.173:48080'
# VUE_APP_BASE_API = 'http://192.168.1.49:48080' # VUE_APP_BASE_API = 'http://192.168.1.49:48082'
# VUE_APP_BASE_API = 'http://192.168.1.8:48082' # VUE_APP_BASE_API = 'http://192.168.1.8:48082'
# VUE_APP_BASE_API = 'http://192.168.4.159:48080' # VUE_APP_BASE_API = 'http://192.168.4.159:48080'
# VUE_APP_BASE_API = 'http://192.168.1.56:48082' # VUE_APP_BASE_API = 'http://192.168.1.56:48082'
@@ -31,9 +31,6 @@ VUE_CLI_BABEL_TRANSPILE_MODULES = true
# 多租户的开关 # 多租户的开关
VUE_APP_TENANT_ENABLE = true VUE_APP_TENANT_ENABLE = true
# 验证码的开关
VUE_APP_CAPTCHA_ENABLE = true
# 文档的开关 # 文档的开关
VUE_APP_DOC_ENABLE = true VUE_APP_DOC_ENABLE = true

View File

@@ -14,9 +14,6 @@ VUE_CLI_BABEL_TRANSPILE_MODULES = true
# 多租户的开关 # 多租户的开关
VUE_APP_TENANT_ENABLE = true VUE_APP_TENANT_ENABLE = true
# 验证码的开关
VUE_APP_CAPTCHA_ENABLE = true
# 文档的开关 # 文档的开关
VUE_APP_DOC_ENABLE = true VUE_APP_DOC_ENABLE = true

View File

@@ -15,22 +15,18 @@ VUE_APP_TITLE = MES系统
VUE_APP_BASE_API = '/prod-api' VUE_APP_BASE_API = '/prod-api'
# 积木报表指向地址 # 积木报表指向地址
VUE_APP_JIMU_API = 'http://192.168.0.33:48082' VUE_APP_JIMU_API = 'http://10.70.2.2:8080'
# 根据服务器或域名修改 # 根据服务器或域名修改
# PUBLIC_PATH = 'http://my-pi.com:8888/yudao-admin/' PUBLIC_PATH = 'http://10.70.2.32'
PUBLIC_PATH = 'http://192.168.0.33:8889/'
# 二级部署路径 # 二级部署路径
VUE_APP_APP_NAME ='yudao-admin' # VUE_APP_APP_NAME ='yudao-admin'
# 多租户的开关 # 多租户的开关
VUE_APP_TENANT_ENABLE = true VUE_APP_TENANT_ENABLE = true
# 验证码的开关
VUE_APP_CAPTCHA_ENABLE = true
# 文档的开关 # 文档的开关
VUE_APP_DOC_ENABLE = false VUE_APP_DOC_ENABLE = false

View File

@@ -1,26 +1,27 @@
NODE_ENV = production # 生产环境配置
ENV = 'production'
# 页面标题 # 页面标题
VUE_APP_TITLE = 产线监控系统 VUE_APP_TITLE = MES系统
# 测试环境配置 # 芋道管理系统/生产环境
ENV = 'staging' VUE_APP_BASE_API = '/prod-api'
# 芋道管理系统/测试环境 # 积木报表指向地址
VUE_APP_BASE_API = 'http://api-dashboard.yudao.iocoder.cn' VUE_APP_JIMU_API = 'http://192.168.0.33:48082'
# 静态资源地址
PUBLIC_PATH = 'http://static.yudao.iocoder.cn/' # 根据服务器或域名修改
PUBLIC_PATH = 'http://192.168.0.33:8889/'
# 二级部署路径
# VUE_APP_APP_NAME ='yudao-admin'
# 多租户的开关 # 多租户的开关
VUE_APP_TENANT_ENABLE = true VUE_APP_TENANT_ENABLE = true
# 验证码的开关
VUE_APP_CAPTCHA_ENABLE = true
# 文档的开关 # 文档的开关
VUE_APP_DOC_ENABLE = false VUE_APP_DOC_ENABLE = false
# 百度统计 # 百度统计
VUE_APP_BAIDU_CODE = fadc1bd5db1a1d6f581df60a1807f8ab VUE_APP_BAIDU_CODE = fadc1bd5db1a1d6f581df60a1807f8ab

View File

@@ -17,9 +17,6 @@ VUE_APP_APP_NAME ='/admin-ui-vue2/'
# 多租户的开关 # 多租户的开关
VUE_APP_TENANT_ENABLE = true VUE_APP_TENANT_ENABLE = true
# 验证码的开关
VUE_APP_CAPTCHA_ENABLE = true
# 文档的开关 # 文档的开关
VUE_APP_DOC_ENABLE = true VUE_APP_DOC_ENABLE = true

View File

@@ -18,6 +18,15 @@ export function deliveryProgressPage(data) {
}) })
} }
// 获取订单列表
export function listOrderList(query) {
return request({
url: '/extend/delivery-log/listOrderList',
method: 'get',
params: query
})
}
// 获取发货进度分页 // 获取发货进度分页
export function deliveryLogDetPage(data) { export function deliveryLogDetPage(data) {
return request({ return request({

View File

@@ -1,7 +1,7 @@
/* /*
* @Author: Do not edit * @Author: Do not edit
* @Date: 2023-10-21 11:50:46 * @Date: 2023-10-21 11:50:46
* @LastEditTime: 2023-10-26 20:06:29 * @LastEditTime: 2023-11-27 17:54:28
* @LastEditors: DY * @LastEditors: DY
* @Description: * @Description:
*/ */
@@ -110,3 +110,11 @@ export function deleteMaterialPBDet(id) {
method: 'delete' method: 'delete'
}) })
} }
// 获得产品Bom详细
export function getMaterialPBDet(id) {
return request({
url: '/base/material-product-bom-det/get?id=' + id,
method: 'get'
})
}

View File

@@ -1,7 +1,7 @@
/* /*
* @Author: Do not edit * @Author: Do not edit
* @Date: 2023-11-08 15:56:52 * @Date: 2023-11-08 15:56:52
* @LastEditTime: 2023-11-20 16:38:18 * @LastEditTime: 2023-11-25 16:22:49
* @LastEditors: DY * @LastEditors: DY
* @Description: * @Description:
*/ */
@@ -73,4 +73,30 @@ export function deleteCheck(id) {
url: '/base/equipment-check/delete?id=' + id, url: '/base/equipment-check/delete?id=' + id,
method: 'delete' method: 'delete'
}) })
} }
// 获得设备巡检设置code
export function getCode() {
return request({
url: '/base/equipment-check-config/getCode',
method: 'get'
})
}
// 创建巡检配置
export function createCheckConfig(data) {
return request({
url: '/base/equipment-check-config/create',
method: 'post',
data: data
})
}
// 更新巡检配置
export function updateCheckConfig(data) {
return request({
url: '/base/equipment-check-config/update',
method: 'put',
data: data
})
}

View File

@@ -1,7 +1,7 @@
/* /*
* @Author: zhp * @Author: zhp
* @Date: 2023-10-31 15:05:06 * @Date: 2023-10-31 15:05:06
* @LastEditTime: 2023-11-03 09:05:50 * @LastEditTime: 2023-11-28 09:28:05
* @LastEditors: zhp * @LastEditors: zhp
* @Description: * @Description:
*/ */
@@ -24,6 +24,14 @@ export function getWorkOrderList(query) {
params: query, params: query,
}) })
} }
export function getCoreProduct(id) {
return request({
url: '/base/core-product/get?id=' + id,
method: 'get'
})
}
// 导出物料信息 // 导出物料信息
// export function exportEnergyPlcExcel(query) { // export function exportEnergyPlcExcel(query) {
// return request({ // return request({

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="1_基础资料" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="1-1工厂信息" transform="translate(-1834.000000, -253.000000)">
<g id="icon/界面内/编辑" transform="translate(1834.000000, 253.000000)">
<rect id="矩形" x="0" y="0" width="16" height="16"></rect>
<g id="常用购票人编辑32" fill-rule="nonzero">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="16" height="16"></rect>
<path d="M13.5,7.8285 C13.5,7.55235763 13.7238576,7.3285 14,7.3285 C14.2761424,7.3285 14.5,7.55235763 14.5,7.8285 L14.5,12 C14.5,13.3807119 13.3807119,14.5 12,14.5 L4,14.5 C2.61928813,14.5 1.5,13.3807119 1.5,12 L1.5,4 C1.5,2.61928813 2.61928813,1.5 4,1.5 L8.759,1.5 C8.9376328,1.5 9.10269631,1.59529946 9.19201271,1.75 C9.28132911,1.90470054 9.28132911,2.09529946 9.19201271,2.25 C9.10269631,2.40470054 8.9376328,2.5 8.759,2.5 L4,2.5 C3.17157288,2.5 2.5,3.17157288 2.5,4 L2.5,12 C2.5,12.8284271 3.17157288,13.5 4,13.5 L12,13.5 C12.8284271,13.5 13.5,12.8284271 13.5,12 L13.5,7.8285 Z M13.284,2.312 C13.4738226,2.11757837 13.784168,2.11034095 13.9828473,2.2957025 C14.1815266,2.48106405 14.1958051,2.79116533 14.015,2.994 L8.56,8.845 C8.43817243,8.97566989 8.25588756,9.03141962 8.08181033,8.9912488 C7.90773311,8.95107798 7.76830999,8.82108951 7.71606033,8.65024879 C7.66381067,8.47940808 7.70667243,8.29366989 7.8285,8.163 L13.284,2.312 Z" id="形状" stroke="#0B58FF" stroke-width="0.1" fill="#0B58FF"></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -76,6 +76,7 @@
class="upload-area" class="upload-area"
:class="uploadOpen ? '' : 'height-48'" :class="uploadOpen ? '' : 'height-48'"
ref="uploadArea" ref="uploadArea"
:key="col.prop"
v-if="col.upload"> v-if="col.upload">
<span class="close-icon" :class="uploadOpen ? 'open' : ''"> <span class="close-icon" :class="uploadOpen ? 'open' : ''">
<el-button <el-button
@@ -87,13 +88,18 @@
<el-upload <el-upload
class="upload-in-dialog" class="upload-in-dialog"
v-if="col.upload" v-if="col.upload"
:key="col.prop + '__el-upload'"
:action="uploadUrl" :action="uploadUrl"
:headers="uploadHeaders" :headers="uploadHeaders"
:show-file-list="false" :show-file-list="false"
icon="el-icon-upload2" icon="el-icon-upload2"
:disabled="disabled" :disabled="disabled"
:before-upload="beforeUpload" :before-upload="beforeUpload"
:on-success="handleUploadSuccess" :on-success="
(response, file, fileList) => {
handleUploadSuccess(response, file, col.prop);
}
"
v-bind="col.bind"> v-bind="col.bind">
<el-button size="mini" :disabled="col.bind?.disabled || false"> <el-button size="mini" :disabled="col.bind?.disabled || false">
<svg-icon <svg-icon
@@ -108,10 +114,10 @@
<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="!disabled && handleDeleteFile(file)" /> @delete="!disabled && handleDeleteFile(file, col.prop)" />
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col>
@@ -136,6 +142,9 @@ function findMaxLabelWidth(rows) {
if (!opt.label) return 0; if (!opt.label) return 0;
if (opt.label.length > max) { if (opt.label.length > max) {
max = opt.label.length; max = opt.label.length;
if (opt.label.includes('(')) {
max = max - 3
}
} }
}); });
}); });
@@ -152,12 +161,30 @@ const uploadedFile = {
handleDelete() { handleDelete() {
this.$emit('delete', this.file); this.$emit('delete', this.file);
}, },
async handleDownload() {
const data = await this.$axios({
url: this.file.fileUrl,
method: 'get',
responseType: 'blob',
});
await this.$message.success('开始下载');
// create download link
const url = window.URL.createObjectURL(data);
const link = document.createElement('a');
link.href = url;
link.download = this.file.fileName;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
},
}, },
mounted() {}, mounted() {},
render: function (h) { render: function (h) {
return ( return (
<div <div
title={this.file.fileName} title={this.file.fileName}
onClick={this.handleDownload}
style={{ style={{
background: `url(${tupleImg}) no-repeat`, background: `url(${tupleImg}) no-repeat`,
backgroundSize: '14px', backgroundSize: '14px',
@@ -205,7 +232,7 @@ export default {
default: false, default: false,
}, },
hasFiles: { hasFiles: {
type: Boolean, type: Boolean | Array,
default: false, default: false,
}, },
labelPosition: { labelPosition: {
@@ -215,7 +242,7 @@ export default {
size: { size: {
type: String, type: String,
default: '', default: '',
}, }
}, },
data() { data() {
return { return {
@@ -251,7 +278,13 @@ export default {
handler(val) { handler(val) {
this.form = JSON.parse(JSON.stringify(val)); this.form = JSON.parse(JSON.stringify(val));
if (this.hasFiles) { if (this.hasFiles) {
this.form.files = this.form.files ?? []; if (typeof this.hasFiles == 'boolean' && this.hasFiles) {
this.form.files = this.form.files ?? [];
} else if (Array.isArray(this.hasFiles)) {
this.hasFiles.forEach((prop) => {
this.form[prop] = this.form[prop] ?? [];
});
}
} }
}, },
deep: true, deep: true,
@@ -348,7 +381,7 @@ export default {
// 处理输入框数据 // 处理输入框数据
this.form[opt.prop] = response.data; this.form[opt.prop] = response.data;
// 更新下外部的 dataForm防止code字段有数据也报空的bug // 更新下外部的 dataForm防止code字段有数据也报空的bug
this.$emit('update', this.form) this.$emit('update', this.form);
} }
}); });
} }
@@ -377,11 +410,12 @@ export default {
// 上传成功的特殊处理 // 上传成功的特殊处理
beforeUpload() {}, beforeUpload() {},
// 上传前的验证规则可通过 bind 属性传入 // 上传前的验证规则可通过 bind 属性传入
handleUploadSuccess(response, file, fileList) { handleUploadSuccess(response, file, prop) {
this.form.files.push({ console.log('[handleUploadSuccess]', response, file, prop);
this.form[prop].push({
fileName: file.name, fileName: file.name,
fileUrl: response.data, fileUrl: response.data,
fileType: 2, fileType: prop == 'files' ? 2 : 1,
}); });
this.$modal.msgSuccess('上传成功'); this.$modal.msgSuccess('上传成功');
this.$emit('update', this.form); this.$emit('update', this.form);
@@ -395,8 +429,8 @@ export default {
this.uploadOpen = !this.uploadOpen; this.uploadOpen = !this.uploadOpen;
}, },
handleDeleteFile(file) { handleDeleteFile(file, prop) {
this.form.files = this.form.files.filter( this.form[prop] = this.form[prop].filter(
(item) => item.fileUrl != file.fileUrl (item) => item.fileUrl != file.fileUrl
); );
this.$emit('update', this.form); this.$emit('update', this.form);

View File

@@ -83,7 +83,7 @@ export default {
], ],
}, },
placeholder: '请输入内容', placeholder: '请输入内容',
readOnly: true, // readOnly: false,
}, },
}; };
}, },
@@ -123,11 +123,13 @@ export default {
const editor = this.$refs.editor; const editor = this.$refs.editor;
this.Quill = new Quill(editor, this.options); this.Quill = new Quill(editor, this.options);
// 取消自动聚焦 start // 取消自动聚焦 start
this.Quill?.enable(false);
this.$nextTick(() => { this.$nextTick(() => {
this.Quill.blur(); this.Quill?.enable(true);
if (!this.readOnly) { this.Quill?.blur();
this.Quill.enable(); // if (!this.readOnly) {
} // this.Quill?.enable();
// }
}); });
// 如果设置了上传地址则自定义图片上传事件 // 如果设置了上传地址则自定义图片上传事件
if (this.type === 'url') { if (this.type === 'url') {
@@ -196,7 +198,7 @@ export default {
}; };
</script> </script>
<style> <style lang="scss" scoped>
.editor-wrapper { .editor-wrapper {
position: relative; position: relative;
cursor: not-allowed; cursor: not-allowed;

View File

@@ -29,10 +29,10 @@
<transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul"> <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
<li :key="file.url" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList"> <li :key="file.url" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList">
<el-link :href="`${file.url}`" :underline="false" target="_blank"> <el-link :href="`${file.url}`" :underline="false" target="_blank">
<span class="el-icon-document"> {{ getFileName(file.name) }} </span> <span class="el-icon-document"> {{ fileName }} </span>
</el-link> </el-link>
<div class="ele-upload-list__item-content-action"> <div class="ele-upload-list__item-content-action">
<el-link :underline="false" @click="handleDelete(index)" type="danger">删除</el-link> <el-link :underline="false" @click="handleDelete(index)" :disabled="disabled" type="danger">删除</el-link>
</div> </div>
</li> </li>
</transition-group> </transition-group>
@@ -71,6 +71,11 @@ export default {
disabled: { disabled: {
type: Boolean, type: Boolean,
default: false default: false
},
//文件名称
fName: {
type: String,
default: ''
} }
}, },
data() { data() {
@@ -81,6 +86,7 @@ export default {
uploadFileUrl: process.env.VUE_APP_BASE_API + "/admin-api/infra/file/upload", // 请求地址 uploadFileUrl: process.env.VUE_APP_BASE_API + "/admin-api/infra/file/upload", // 请求地址
headers: { Authorization: "Bearer " + getAccessToken() }, // 设置上传的请求头部 headers: { Authorization: "Bearer " + getAccessToken() }, // 设置上传的请求头部
fileList: [], fileList: [],
fileName: ''
}; };
}, },
watch: { watch: {
@@ -105,6 +111,14 @@ export default {
}, },
deep: true, deep: true,
immediate: true immediate: true
},
fName: {
handler(val) {
if (val) {
console.log('11', val)
this.fileName = val
}
}
} }
}, },
computed: { computed: {
@@ -117,6 +131,7 @@ export default {
// 上传前校检格式和大小 // 上传前校检格式和大小
handleBeforeUpload(file) { handleBeforeUpload(file) {
// 校检文件类型 // 校检文件类型
this.fileName = file.name
if (this.fileType) { if (this.fileType) {
let fileExtension = ""; let fileExtension = "";
if (file.name.lastIndexOf(".") > -1) { if (file.name.lastIndexOf(".") > -1) {
@@ -150,7 +165,7 @@ export default {
}, },
// 上传失败 // 上传失败
handleUploadError(err) { handleUploadError(err) {
this.$modal.msgError("上传图片失败,请重试"); this.$modal.msgError("上传文件失败,请重试");
this.$modal.closeLoading() this.$modal.closeLoading()
}, },
// 上传成功回调 // 上传成功回调
@@ -180,8 +195,12 @@ export default {
this.number = 0; this.number = 0;
this.$emit("input", this.listToString(this.fileList)); this.$emit("input", this.listToString(this.fileList));
this.$modal.closeLoading(); this.$modal.closeLoading();
this.returnFileName()
} }
}, },
returnFileName() {
this.$emit('name', this.fileName)
},
// 获取文件名称 // 获取文件名称
getFileName(name) { getFileName(name) {
console.log('你好', name) console.log('你好', name)

View File

@@ -360,6 +360,7 @@ export default {
ts: Date.now(), // 现在的时间戳 ts: Date.now(), // 现在的时间戳
} }
reqGet(data).then(res => { reqGet(data).then(res => {
console.log(1)
if (res.repCode === '0000') { if (res.repCode === '0000') {
this.backImgBase = res.repData.originalImageBase64 this.backImgBase = res.repData.originalImageBase64
this.blockBackImgBase = res.repData.jigsawImageBase64 this.blockBackImgBase = res.repData.jigsawImageBase64

View File

@@ -1,978 +0,0 @@
<template>
<el-dialog class="dialog-with-menu" :visible="dialogVisible" :destroy-on-close="false" @close="handleClose"
:close-on-click-modal="configs.clickModalToClose ?? true">
<!-- title -->
<div slot="title" class="dialog-title">
<h1 class="">
{{ detailMode ? "查看详情" : dataForm.id ? "编辑" : "新增" }}
</h1>
</div>
<div class="dialog-body__inner relative">
<!-- v-if="dataForm.id && !detailMode && /属性|详情/.test(activeMenu) && $hasPermission()" -->
<el-button v-if="configs.allowAdd ?? (dataForm.id && !detailMode && /属性|详情|参数/.test(activeMenu))" plain
type="primary" size="small" class="at-right-top" style="margin-bottom: 16px" @click="handleAddParam()">+
添加</el-button>
<template v-if="dataForm.id && !detailMode && /附件/.test(activeMenu)">
<el-upload style="position: absolute; width: 100%; height: 0" name="files" :action="uploadUrl"
:show-file-list="false" :headers="uploadHeaders" :on-success="handleUploadSuccess"
:before-upload="handleUploadCheck">
<el-button plain type="primary" size="small" class="at-right-top" style=""> <i class="el-icon-upload"></i> 上传
</el-button>
</el-upload>
</template>
<!-- menu -->
<el-tabs v-model="activeMenu" type="card" @tab-click="handleTabClick">
<!-- <el-tab-pane v-for="(tab, index) in configs.menu" :key="index" :label="tab.name" :name="tab.name"> -->
<el-tab-pane v-for="(tab, index) in actualMenus" :key="index" :name="tab.name">
<span class="slot" slot="label">
<i :class="{
'el-icon-edit': tab.key === 'info',
'el-icon-s-data': tab.key === 'attr',
'el-icon-folder-opened': tab.key === 'attachment',
}"></i>
{{ tab.name }}
</span>
<!-- 表单标签页 -->
<div v-if="tab.key === 'info'">
<!-- form -->
<el-form ref="dataForm" :model="dataForm" v-loading="loadingStatus">
<el-row v-for="(row, rowIndex) in configs.form.rows" :key="'row_' + rowIndex" :gutter="20">
<el-col v-for="(col, colIndex) in row" :key="colIndex" :span="24 / row.length">
<el-form-item :label="col.label" :prop="col.prop" :rules="col.rules || null"
v-show="!col.forceDisabled || (col.forceDisabled && dataForm.id)">
<div v-if="col.forceDisabled && dataForm.id" class="force-disabled">
<el-tag :key="col.key" :type="col.type">{{ dataForm[col.prop] || "-" }}</el-tag>
</div>
<el-input v-if="col.input" v-model="dataForm[col.prop]" clearable
:disabled="disableCondition(col.prop)" v-bind="col.elparams" />
<el-cascader v-if="col.cascader" v-model="dataForm[col.prop]" :options="col.options"
:disabled="detailMode" v-bind="col.elparams"></el-cascader>
<el-select v-if="col.select" v-model="dataForm[col.prop]" clearable
:disabled="disableCondition(col.prop)" v-bind="col.elparams"
@change="handleSelectChange(col, $event)">
<el-option v-for="(opt, optIdx) in col.options" :key="'option_' + optIdx" :label="opt.label"
:value="opt.value" />
</el-select>
<el-switch v-if="col.switch" v-model="dataForm[col.prop]" :active-value="1" :inactive-value="0"
@change="handleSwitchChange" :disabled="disableCondition(col.prop)" />
<el-input v-if="col.textarea" type="textarea" v-model="dataForm[col.prop]"
:disabled="disableCondition(col.prop)" v-bind="col.elparams" />
<quillEditor v-if="col.richInput" ref="quill-editor" v-model="dataForm[col.prop]"
:options="col.quillConfig ?? defaultQuillConfig" style="margin-top: 42px"
:disabled="disableCondition(col.prop)" />
<div class="" v-if="col.component" style="margin: 42px 0 0">
<!-- 下面这个 component 几乎是为 富文本 quill 定制的了... TODO后续可能会根据业务需求创建新的版本 -->
<component :is="col.component" :key="'component_' + col.prop"
@update:modelValue="handleComponentModelUpdate(col.prop, $event)" :modelValue="dataForm[col.prop]"
:mode="detailMode ? 'detail' : dataForm.id ? 'edit' : 'create'" />
</div>
<!-- add more... -->
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<!-- 表格标签页 -->
<div v-if="dataForm.id && tab.key === 'attr'" key="attr-list">
<BaseListTable :table-config="null" :column-config="filteredTableProps" :table-data="subList"
@operate-event="handleTableRowOperate" :current-page="attrPage" :current-size="attrSize"
:refresh-layout-key="Math.random()" v-loading="loadingStatus" />
<!-- paginator -->
<el-pagination class="" style="text-align: left" background @size-change="handleSizeChange"
@current-change="handlePageChange" :current-page.sync="attrPage" :page-sizes="[5, 10, 20]"
:page-size="attrSize" :total="attrTotal" layout="total, sizes, prev, next"></el-pagination>
</div>
<!-- 附件标签页 -->
<div v-if="dataForm.id && tab.key === 'attachment'" key="attachment">
<div class="upload-tips" style="font-size: 0.8em; margin-bottom: 12px">文件大小不要超过 2MB</div>
<!-- 附件列表 -->
<div class="" v-loading="loadingStatus">
<ul class="file-list">
<li v-for="(file, index) in fileList" :key="index">
<span class="file-name">{{ file.name }}</span>
<span class="file-operations">
<span class="file-icon preview" @click="handleFileClick('view', file)">
<i class="el-icon-view" style="cursor: pointer"></i>
</span>
<span class="file-icon download" @click="handleFileClick('download', file)">
<i class="el-icon-download" style="color: #0b58ff; cursor: pointer"></i>
</span>
<span class="file-icon delete" @click="handleFileClick('delete', file)">
<i class="el-icon-delete" style="color: red; cursor: pointer"></i>
</span>
</span>
</li>
</ul>
</div>
<!-- img preview dialog -->
<el-dialog key="image-preview-dialog" class="image-preview-dialog" :visible.sync="imgPreviewDialogVisible"
:append-to-body="true">
<div class="img-container">
<img width="100%" :src="currentImgUrl" alt="" />
</div>
</el-dialog>
</div>
</el-tab-pane>
</el-tabs>
</div>
<!-- sub dialog -->
<small-dialog :append-to-body="true" v-if="showSubDialog" ref="subDialog" :url="urls.subase"
:configs="configs.subDialog" :related-id="dataForm.id" @refreshDataList="getSubList"></small-dialog>
<!-- footer -->
<div slot="footer">
<template v-for="(operate, index) in configs.form.operations">
<el-button v-if="showButton(operate)" :key="'operation_' + index" :type="operate.type"
@click="handleBtnClick(operate)"
:loading="(operate.name === 'add' || operate.name === 'update') && btnLoading">{{ operate.label }}</el-button>
</template>
<el-button @click="handleBtnClick({ name: 'cancel' })">取消</el-button>
</div>
</el-dialog>
</template>
<script>
import { pick as __pick } from "@/utils/filters";
import SmallDialog from "@/components/SmallDialog.vue";
import BaseListTable from "@/components/BaseListTable.vue";
import Cookies from "js-cookie";
import "quill/dist/quill.core.css";
import "quill/dist/quill.snow.css";
import "quill/dist/quill.bubble.css";
import { quillEditor } from "vue-quill-editor";
function reConstructTreeData(listObj) {
const entry = [];
Object.keys(listObj).map((key) => {
const currentNode = listObj[key];
currentNode.label = currentNode.name;
currentNode.value = currentNode.id;
if (currentNode.parentId === "0") {
entry.push(listObj[key]);
return; // return { label: currentNode.name, value: currentNode.id, children: currentNode.children ?? [] };
}
const parentNode = listObj[currentNode.parentId];
if (!parentNode.children) {
parentNode.children = [];
}
parentNode.children.push(currentNode);
});
return entry;
}
export default {
name: "DialogWithMenu",
components: { SmallDialog, BaseListTable, quillEditor },
props: {
configs: {
type: Object,
default: () => ({}),
},
dialogVisible: {
type: Boolean,
default: false,
},
},
inject: ["urls"],
data() {
const dataForm = {};
const autoDisabledQueue = [];
const watingToRefreshQueue = [];
const cached = {}
this.configs.form.rows.forEach((row) => {
row.forEach((col) => {
if (col.upload) dataForm[col.prop] = col.default ?? [];
else dataForm[col.prop] = col.default ?? null;
if (col.autoDisabled) autoDisabledQueue.push(col.prop);
if (!!col.refreshOptionsAfterConfirm) watingToRefreshQueue.push(col);
if (col.fetchData)
col.fetchData().then(({ data: res }) => {
console.log("[Fetch Data]", "list" in res.data, res.data, res.data.list);
if (res.code === 0) {
if (col.cacheFetchedData) {
// cache fetched data
cached[col.prop] = 'list' in res.data ? res.data.list : (Array.isArray(res.data) ? res.data : [])
}
if (!col.options || !col.options.length) {
this.$set(
col,
"options",
"list" in res.data
? res.data.list.map((i) => ({
label: col.optionLabel ? i[col.optionLabel] : i.name,
value: col.optionValue ? i[col.optionValue] : i.id,
}))
: res.data.map((i) => ({
label: col.optionLabel ? i[col.optionLabel] : i.name,
value: col.optionValue ? i[col.optionValue] : i.id,
}))
);
}
// col.options = res.data.list;
else if (col.options.length) {
"list" in res.data ? res.data.list.unshift(...col.options) : res.data.unshift(...col.options);
this.$set(
col,
"options",
"list" in res.data
? res.data.list.map((i) => ({
label: col.optionLabel ? i[col.optionLabel] : i.name,
value: col.optionValue ? i[col.optionValue] : i.id,
}))
: res.data.map((i) => ({
label: col.optionLabel ? i[col.optionLabel] : i.name,
value: col.optionValue ? i[col.optionValue] : i.id,
}))
);
}
} else {
col.options.splice(0);
}
// dataForm[col.prop] = col.default ?? null; // not perfect!
});
else if (col.fetchTreeData) {
// 获取设备类型时触发的用于前端构建属性结构约定parentId 为0时是顶级节点
col.fetchTreeData().then(({ data: res }) => {
console.log("[Fetch Tree Data]", res.data);
if (res.code === 0) {
// 先把数据先重构成一个对象
const obj = {};
if ("list" in res.data) {
res.data.list.map((item) => {
obj[item.id] = item;
});
} else if (Array.isArray(res.data)) {
res.data.map((item) => {
obj[item.id] = item;
});
}
// 再过滤这个对象
let filteredList = reConstructTreeData(obj);
console.log("** filteredList **", filteredList);
// 最后设置 options
this.$set(col, "options", filteredList);
} else {
col.options.splice(0);
this.$message.error(res.msg);
}
});
}
});
});
return {
// configs,
btnLoading: false,
loadingStatus: false,
activeMenu: this.configs.menu[0].name,
dataForm,
detailMode: false,
autoDisabledQueue,
watingToRefreshQueue,
cached,
showBaseDialog: false,
baseDialogConfig: null,
subList: [],
showSubDialog: false,
disableXXX: false,
defaultQuillConfig: {
modules: {
toolbar: [
[{ font: [] }],
[{ size: ["small", false, "large", "huge"] }], // custom dropdown
["bold", "italic", "underline", "strike"], // toggled buttons
[{ color: [] }, { background: [] }], // dropdown with defaults from theme
["blockquote", "code-block"],
[{ header: 1 }, { header: 2 }], // custom button values
[{ list: "ordered" }, { list: "bullet" }],
// [{ 'script': 'sub'}, { 'script': 'super' }], // superscript/subscript
[{ indent: "-1" }, { indent: "+1" }], // outdent/indent
// [{ 'direction': 'rtl' }], // text direction
// [{ 'header': [1, 2, 3, 4, 5, 6, false] }],
// [{ 'align': [] }],
// ['clean'] // remove formatting button
],
},
theme: "snow",
readOnly: false,
placeholder: "在这里输入描述信息...",
scrollingContainer: null,
},
attrPage: 1,
attrSize: 10,
attrTotal: 0,
fileList: [],
imgPreviewDialogVisible: false,
currentImgUrl: "",
};
},
mounted() {
this.configs.form.rows.forEach((row) => {
row.forEach((col) => {
if (col.changeReflects && typeof col.changeReflects === 'object' && 'fromKey' in col.changeReflects && 'toProp' in col.changeReflects) {
this.$watch(
() => this.dataForm[col.prop],
val => {
if (val && (col.prop in this.cached)) {
console.log("here changeReflects", col.prop, col.changeReflects.toProp, this.cached[col.prop])
if (typeof col.changeReflects.fromKey === 'string') {
this.dataForm[col.changeReflects.toProp] = this.cached[col.prop].find(item => item.id === val)?.[col.changeReflects.fromKey]
} else if (Array.isArray(col.changeReflects.fromKey) && col.changeReflects.delimiter) {
const foundItem = this.dataForm[col.changeReflects.toProp] = this.cached[col.prop].find(item => item.id === val)
if (foundItem) {
const values = col.changeReflects.fromKey.map(key => foundItem[key])
this.dataForm[col.changeReflects.toProp] = values.join(col.changeReflects.delimiter)
} else {
this.dataForm[col.changeReflects.toProp] = col.changeReflects.delimiter
console.log("[DialogWithMenu] mounted() 没找到对应数据")
}
}
}
},
{
immediate: false
}
)
}
});
});
},
watch: {
dialogVisible: function (val) {
if (!!val) {
this.attrPage = 1
this.attrSize = 10
}
},
},
computed: {
actualMenus() {
return this.configs.menu.filter((m) => {
if (m.onlyEditMode && !this.dataForm.id) {
return false;
}
return true;
});
},
filteredTableProps() {
return this.detailMode ? this.configs.table.props.filter((v) => v.prop !== "operations") : this.configs.table.props;
},
uploadHeaders() {
return {
token: Cookies.get("token") || "",
};
},
uploadUrl() {
return this.configs.menu.find((item) => item.key === "attachment")?.actionUrl || "#";
},
},
methods: {
disableCondition(prop) {
return this.detailMode || (this.disableXXX && this.autoDisabledQueue.indexOf(prop) !== -1);
},
/** utitilities */
showButton(operate) {
const notDetailMode = !this.detailMode;
const showAlways = operate.showAlways ?? false;
const editMode = operate.showOnEdit && this.dataForm.id;
const addMode = !operate.showOnEdit && !this.dataForm.id;
const permission = operate.permission ? this.$hasPermission(operate.permission) : true;
const currentMenuKey = this.configs.menu.find((item) => item.name === this.activeMenu)?.key;
return notDetailMode && (showAlways || ((editMode || addMode) && permission)) && currentMenuKey === "info";
},
resetForm(excludeId = false, immediate = false) {
setTimeout(
() => {
Object.keys(this.dataForm).forEach((key) => {
if (excludeId && key === "id") return;
if ("files" in this.dataForm) this.dataForm.files = [];
if ("fileIds" in this.dataForm) this.dataForm.fileIds = [];
else this.dataForm[key] = null;
if (Array.isArray(this.fileList)) {
this.fileList = [];
}
});
this.activeMenu = this.configs.menu[0].name;
this.$refs.dataForm[0].clearValidate();
},
immediate ? 0 : 200
);
},
updateOptions() {
return new Promise((resolve, reject) => {
if (this.watingToRefreshQueue.length) {
this.watingToRefreshQueue.forEach((opt) => {
console.log("[刷新数据, ", opt, "]");
if ("fetchData" in opt) {
opt.fetchData(this.dataForm.id ? this.dataForm.id : -1).then(({ data: res }) => {
if (res.code === 0) {
this.$set(
opt,
"options",
"list" in res.data
? res.data.list.map((i) => ({ label: i.code, value: i.id }))
: res.data.map((i) => ({ label: i.code, value: i.id }))
);
resolve({ done: true });
} else {
this.$message({
message: `${res.code}: ${res.msg}`,
type: "error",
duration: 1500,
});
resolve({ done: false });
}
});
}
});
} else resolve(null);
});
},
/** init **/
init(id, detailMode, menu) {
// this.dialogVisible = true;
if (this.$refs.dataForm && this.$refs.dataForm.length) {
// 当不是首次渲染dialog的时候一开始就清空验证信息本组件的循环里只有一个 dataForm 所以只用取 [0] 即可
this.$refs.dataForm[0].clearValidate();
}
console.log("[dialog] DialogWithHead init():", id, detailMode);
this.detailMode = detailMode ?? false;
this.$nextTick(() => {
this.dataForm.id = id || null;
if (this.dataForm.id) {
// 如果是编辑
this.loadingStatus = true;
// 提前获取属性列表
this.getSubList();
// 获取详情
this.updateOptions().then((result) => {
if (result === null || (typeof result === "object" && result.done)) {
this.$http.get(this.urls.base + `/${this.dataForm.id}`).then(({ data: res }) => {
if (res && res.code === 0) {
const dataFormKeys = Object.keys(this.dataForm);
this.dataForm = __pick(res.data, dataFormKeys);
if ("files" in res.data) {
console.log("[DialogWithMenu] fileList===>", res.data.files, this.fileList);
/** 返回的文件列表 */
this.fileList = res.data.files
? res.data.files.map((file) => ({
id: file.id,
name: file.fileUrl.split("/").pop(),
url: file.fileUrl,
typeCode: file.typeCode,
}))
: [];
}
}
this.loadingStatus = false;
// 是否要跳转到附件页
if (menu && menu.key) {
this.activeMenu = this.configs.menu.find((item) => item.key === menu.key)?.name;
}
});
}
});
} else {
// 如果不是编辑
this.updateOptions();
}
});
},
/** handlers */
handleFileClick(type, file) {
switch (type) {
case "view": {
// 加载图片
this.$http
.get("/pms/attachment/downloadFile", {
params: {
attachmentId: file.id,
type: 0, // 0 预览1 下载
},
responseType: "blob",
})
.then(({ data: res }) => {
console.log("preivew", res);
if (/image/i.test(res.type)) {
// 显示图片
this.currentImgUrl = URL.createObjectURL(res);
this.imgPreviewDialogVisible = true;
} else if (/pdf/i.test(res.type)) {
// 预览pdf
let a = document.createElement('a')
a.setAttribute('target', '_blank')
a.href = URL.createObjectURL(res)
a.click()
console.log('before remove a ', a)
a.remove()
console.log('removed a ', a)
} else {
this.$message({
message: "非图片和PDF文件请下载后预览",
type: "error",
duration: 1500,
});
}
});
break;
}
case "download": {
// 下载图片
this.$http
.get("/pms/attachment/downloadFile", {
params: {
attachmentId: file.id,
type: 1, // 0 预览1 下载
},
responseType: "blob",
})
.then(({ data: res }) => {
const blob = new Blob([res]);
/** 通知 */
this.$notify({
title: "成功",
message: "开始下载",
type: "success",
duration: 1200,
});
if ("download" in document.createElement("a")) {
const alink = document.createElement("a");
alink.download = file.name;
alink.style.display = "none";
alink.target = "_blank";
alink.href = URL.createObjectURL(blob);
document.body.appendChild(alink);
alink.click();
URL.revokeObjectURL(alink.href);
document.body.removeChild(alink);
} else {
navigator.msSaveBlob(blob, fileName);
}
});
break;
}
case "delete": {
return this.$confirm(`确定删除图片: ${file.name}`, "提示", {
confirmButtonText: "确认",
cancelButtonText: "我再想想",
type: "warning",
})
.then(() => {
this.loadingStatus = true;
const newFilelist = this.fileList.filter((f) => f.id !== file.id);
this.updateRemoteFiles(newFilelist).then((msg) => {
if (msg && msg === "success") {
this.fileList = newFilelist;
this.loadingStatus = false;
/** 通知 */
this.$notify({
title: "成功",
message: "已删除",
type: "success",
duration: 1200,
});
}
});
})
.catch((err) => { });
}
}
},
handleUploadSuccess(response, file, fileList) {
console.log("[DialogWithMenu] uploadedFileList", response, file, fileList);
if (response.code === 0) {
const uploadedFile = response.data[0];
const fileItem = {
id: uploadedFile.id,
name: uploadedFile.fileUrl.split("/").pop(),
url: uploadedFile.fileUrl,
typeCode: file.typeCode,
};
this.loadingStatus = true;
this.updateRemoteFiles([...this.fileList, fileItem]).then((msg) => {
if (msg && msg === "success") {
this.fileList.push(fileItem);
this.loadingStatus = false;
/** 通知 */
this.$notify({
title: "成功",
message: "上传成功",
type: "success",
duration: 1200,
});
}
});
}
},
updateRemoteFiles(filelist) {
return this.$http
.put("/pms/product", {
id: "id" in this.dataForm ? this.dataForm.id : "DEFAULT_ID",
fileIds: filelist.map((f) => f.id),
})
.then(({ data: res }) => {
if (res.code === 0) return "success";
});
},
handleUploadCheck(file) {
console.log("[before upload]", file);
const LIMIT = 2 * 1024 * 1024; // bytes
if (file.size > LIMIT) {
this.$message({
message: "文件大小不能超过 2MB",
type: "error",
duration: 1500,
});
return false;
} else return true;
},
handleComponentModelUpdate(propName, { subject, payload: { data } }) {
this.dataForm[propName] = JSON.stringify(data);
console.log("[DialogJustForm] handleComponentModelUpdate", this.dataForm[propName]);
},
handleSelectChange(col, eventValue) {
console.log("[dialog] select change: ", col, eventValue);
},
handleSwitchChange(val) {
console.log("[dialog] switch change: ", val, this.dataForm);
},
handleBtnClick(payload) {
console.log("btn click payload: ", payload);
if ("name" in payload) {
switch (payload.name) {
case "cancel":
this.handleClose();
break;
case "reset":
this.resetForm(true, true); // true means exclude id
break;
case "add":
case "update": {
this.$refs.dataForm[0].validate((passed, result) => {
if (passed) {
// 如果通过验证
this.btnLoading = true
this.loadingStatus = true;
const method = payload.name === "add" ? "POST" : "PUT";
// 判断是否有附件选项
const hasAttachment = !!this.configs.menu.find((item) => item.key === "attachment");
if (hasAttachment) {
const fileIds = this.fileList.map((item) => item.id);
this.$set(this.dataForm, "fileIds", fileIds);
}
// 加载额外需要的 id
let extraIds = {};
if (this.configs.extraIds && typeof this.configs.extraIds === "object") {
// 如果配置里,有 extraIds 选项
Object.entries(this.configs.extraIds).forEach(([key, value]) => {
extraIds[key] = value;
});
}
// 实际发送请求
this.btnLoading = true
this.$http({
url: this.urls.base,
method,
data: {
...extraIds,
...this.dataForm,
},
})
.then(({ data: res }) => {
this.btnLoading = false
this.loadingStatus = false;
console.log("[add&update] res is: ", res);
if (res.code === 0) {
this.$message.success(payload.name === "add" ? "添加成功" : "更新成功");
this.$emit("refreshDataList");
// 如果 watingToRefreshQueue 队列里有数据
// if (this.watingToRefreshQueue.length) {
// // 刷新队列
// this.watingToRefreshQueue.forEach((opt) => {
// console.log("[刷新数据, ", opt, "]");
// if ("fetchData" in opt) {
// opt.fetchData().then(({ data: res }) => {
// if (res.code === 0) {
// this.$set(
// opt,
// "options",
// "list" in res.data
// ? res.data.list.map((i) => ({ label: i.name, value: i.id }))
// : res.data.map((i) => ({ label: i.name, value: i.id }))
// );
// }
// });
// }
// });
// }
this.handleClose();
} else {
this.$message({
message: `${res.code}: ${res.msg}`,
type: "error",
duration: 2000,
});
if (this.btnLoading) this.btnLoading = false
}
})
.catch((errMsg) => {
this.$message.error("参数错误:" + errMsg);
if (this.loadingStatus) this.loadingStatus = false;
if (this.btnLoading) this.btnLoading = false
});
} else {
this.$message.error("请核查字段信息");
}
});
}
}
}
},
handleTabClick(payload) {
// console.log("tab click payload: ", this.activeMenu);
// if (this.activeMenu === this.configs.menu[1].name) {
// // 获取数据
// this.getSubList();
// }
},
handlePageChange(val) {
this.getSubList(val, this.attrSize);
},
handleSizeChange(val) {
this.attrPage = 1;
this.attrSize = val
this.getSubList(1, val);
},
getSubList(page, size) {
const params = {};
params.page = page ?? this.attrPage;
params.limit = size ?? this.attrSize;
const requiredParams = this.configs.table.extraParams;
if (requiredParams) {
if (Array.isArray(requiredParams)) {
requiredParams.forEach((str) => {
if (/id/i.test(str)) {
params[str] = this.dataForm.id;
} else {
params[str] = "";
}
});
} else if (typeof requiredParams === "string") {
// 如果需要额外参数,一般肯定需要
params[this.configs.table.extraParams] = this.dataForm.id;
// 此时 dataForm.id 一定是存在的
}
}
this.$http.get(this.urls.subpage, { params }).then(({ data: res }) => {
console.log("[DialogWithMenu] getSubList:", res);
if (res.code === 0 && res.data?.list) {
// 有数据
this.subList = res.data.list;
this.attrTotal = res.data.total;
} else {
this.subList.splice(0);
this.attrTotal = 0;
}
});
},
handleAddParam(id) {
this.showSubDialog = true;
this.$nextTick(() => {
this.$refs.subDialog.init(id ?? null);
});
},
handleClose() {
this.resetForm();
this.$emit("update:dialogVisible", false);
},
/** 列表handlers */
handleAddItem() {
// console.log('[dialog] handleAddItem ot list...');
this.showBaseDialog = true;
this.$nextTick(() => {
console.log("[sub-dialog] ", this.$refs["sub-dialog"].init());
});
},
handleTableRowOperate({ type, data }) {
console.log("handleTableRowOperate", type, data);
switch (type) {
case "delete": {
// 确认是否删除
console.log('delete....', data)
const itemName = typeof data === 'object' ? (data.attrName || data.name || data.material || data.id) : data
return this.$confirm(`是否删除条目: ${itemName}`, "提示", {
confirmButtonText: "确认",
cancelButtonText: "我再想想",
type: "warning",
})
.then(() => {
// this.$http.delete(this.urls.base + `/${data}`).then((res) => {
this.$http({
url: this.urls.subase,
method: "DELETE",
data: [`${data.id}`],
}).then(({ data: res }) => {
if (res.code === 0) {
this.$message.success({
message: "删除成功!",
duration: 1000,
onClose: () => {
this.getSubList(1, 20);
},
});
}
});
})
.catch((err) => { });
}
case "edit": {
this.handleAddParam(data); /** data is ==> id */
break;
}
// case 'view-detail-action':
// this.openDialog(data, true);
// break;
}
},
},
};
</script>
<style scoped>
.el-menu {
margin: 16px 0 !important;
}
.el-menu.el-menu--horizontal {
border: none !important;
/* background: #0f02 !important; */
}
/* .el-menu--horizontal > .el-menu-item.is-active { */
/* border-bottom-color: #0b58ff; */
/* } */
.dialog-with-menu>>>.el-dialog__body {
/* padding-top: 16px !important;
padding-bottom: 16px !important; */
padding-top: 0 !important;
padding-bottom: 0 !important;
}
.el-select,
.el-cascader {
width: 100% !important;
}
.dialog-with-menu>>>.el-dialog__header {
padding: 10px 20px 10px;
/* background: linear-gradient(to bottom, rgba(0, 0, 0, 0.25), white); */
}
.relative {
position: relative;
}
.at-right-top {
position: absolute;
top: 0;
right: 0;
z-index: 10000;
}
ul.file-list,
ul.file-list>li {
padding: 0;
margin: 0;
list-style: none;
}
.file-list {
max-height: 20vh;
overflow-y: auto;
margin-top: 12px;
/* width: 240px; */
display: flex;
flex-direction: column;
}
ul.file-list>li {
border-radius: 4px;
background-color: #edededd2;
padding: 8px;
margin-bottom: 2px;
display: flex;
justify-content: space-between;
}
ul.file-list>li:hover {
background-color: #ededed;
}
.file-operations {
display: flex;
}
.file-icon {
margin-right: 8px;
font-size: 16px;
line-height: 1;
display: flex;
place-content: center;
width: 16px;
height: 16px;
}
/* .image-preview-dialog {
} */
.force-disabled {
margin-top: 42px;
}
</style>

View File

@@ -104,7 +104,7 @@ export const constantRoutes = [
// this generates a separate chunk (about.[hash].js) for this route // this generates a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited. // which is lazy-loaded when the route is visited.
component: () => import(/* webpackChunkName: "about" */ '@/views/OperationalOverview/coldBoard.vue') component: () => import(/* webpackChunkName: "about" */ '@/views/OperationalOverview/coldBoard.vue')
}, },
{ {
path: '/processingBoard', path: '/processingBoard',
name: 'processingBoard', name: 'processingBoard',

View File

@@ -196,4 +196,8 @@ input, textarea{
margin-right: 8px; margin-right: 8px;
vertical-align: middle; vertical-align: middle;
} }
// 抽屉head区域---end // 抽屉head区域---end
// 弹出框上下分布去掉label的padding-bottom
.el-form--label-top .el-form-item__label {
padding: 0;
}

View File

@@ -187,19 +187,6 @@ export function getTenantEnable() {
return process.env.VUE_APP_TENANT_ENABLE || true; return process.env.VUE_APP_TENANT_ENABLE || true;
} }
/**
* 获得验证码功能是否开启
*/
export function getCaptchaEnable() {
if (process.env.VUE_APP_CAPTCHA_ENABLE === "true") {
return true;
}
if (process.env.VUE_APP_CAPTCHA_ENABLE === "false") {
return false;
}
return process.env.VUE_APP_CAPTCHA_ENABLE || true;
}
/** /**
* 获得文档是否开启 * 获得文档是否开启
*/ */

View File

@@ -2,43 +2,45 @@
* @Author: zwq * @Author: zwq
* @Date: 2021-11-18 14:16:25 * @Date: 2021-11-18 14:16:25
* @LastEditors: DY * @LastEditors: DY
* @LastEditTime: 2023-11-22 10:32:10 * @LastEditTime: 2023-11-25 18:09:05
* @Description: * @Description:
--> -->
<template> <template>
<el-form <div class="dialog">
:model="dataForm" <el-form
:rules="dataRule" :model="dataForm"
ref="dataForm" :rules="dataRule"
@keyup.enter.native="dataFormSubmit()" ref="dataForm"
label-width="80px"> @keyup.enter.native="dataFormSubmit()"
<el-row :gutter="20"> label-width="80px">
<el-col :span="12"> <el-row :gutter="20">
<el-form-item label="部门名称" prop="name"> <el-col :span="12">
<el-input v-model="dataForm.name" clearable placeholder="请输入部门名称" /> <el-form-item label="部门名称" prop="name">
</el-form-item> <el-input v-model="dataForm.name" clearable placeholder="请输入部门名称" />
</el-col> </el-form-item>
<el-col :span="12"> </el-col>
<el-form-item label="部门编码" prop="code"> <el-col :span="12">
<el-input v-model="dataForm.code" clearable placeholder="请输入部门编码" /> <el-form-item label="部门编码" prop="code">
</el-form-item> <el-input v-model="dataForm.code" clearable placeholder="请输入部门编码" />
</el-col> </el-form-item>
</el-row> </el-col>
<el-row :gutter="20"> </el-row>
<el-col :span="12"> <el-row :gutter="20">
<el-form-item label="上级部门" prop="parentId"> <el-col :span="12">
<treeselect v-model="dataForm.parentId" :options="menuOptions" :normalizer="normalizer" :show-count="true" placeholder="选择上级部门"/> <el-form-item label="上级部门" prop="parentId">
</el-form-item> <treeselect v-model="dataForm.parentId" :options="menuOptions" :normalizer="normalizer" :show-count="true" placeholder="选择上级部门" />
</el-col> </el-form-item>
<el-col :span="12"> </el-col>
<el-form-item label="备注" prop="remark"> <el-col :span="12">
<el-input <el-form-item label="备注" prop="remark">
v-model="dataForm.remark" <el-input
placeholder="请输入备注" /> v-model="dataForm.remark"
</el-form-item> placeholder="请输入备注" />
</el-col> </el-form-item>
</el-row> </el-col>
</el-form> </el-row>
</el-form>
</div>
</template> </template>
<script> <script>
@@ -68,6 +70,7 @@ export default {
}, },
departmentlList: [], departmentlList: [],
menuOptions: [], menuOptions: [],
isChoosed: false,
dataRule: { dataRule: {
code: [{ required: true, message: "部门编码不能为空", trigger: "blur" }], code: [{ required: true, message: "部门编码不能为空", trigger: "blur" }],
name: [{ required: true, message: "部门名称不能为空", trigger: "blur" }], name: [{ required: true, message: "部门名称不能为空", trigger: "blur" }],
@@ -104,3 +107,9 @@ export default {
}, },
}; };
</script> </script>
<style scoped>
.dialog {
min-height: 180px;
}
</style>

View File

@@ -46,35 +46,36 @@
}}文件大小不超过2MB }}文件大小不超过2MB
</div> </div>
</el-upload> </el-upload>
<!-- <div
class="file-list__item"
v-for="n in 9"
:key="n"
:style="{
display: n > 4 && !expand ? 'none' : 'block',
}"
:data-name="n"
:class="{ 'default-icon': !isPicMode }">
<i class="el-icon-delete"></i>
</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="{ style="width: 100%">
background: isPicMode <div
? `url(${file.fileUrl}) no-repeat` class="file-list__item"
: `url(${defaultBg}) no-repeat`, v-if="!isPicMode"
backgroundSize: isPicMode ? '100% 100%' : '64px', :style="{
backgroundPosition: isPicMode ? '0% 0%' : 'center', background: isPicMode
}" ? `url(${file.fileUrl}) no-repeat`
:data-name="file.fileName"> : `url(${defaultBg}) no-repeat`,
<el-button backgroundSize: isPicMode ? '100% 100%' : '64px',
v-if="!disabled" backgroundPosition: isPicMode ? '0% 0%' : 'center',
type="text" }"
class="el-icon-delete" @click="handleDownload(file)"
style="padding: 0" :data-name="file.fileName">
@click="(e) => handleDelete(file)" /> <el-button
v-if="!disabled"
type="text"
class="el-icon-delete"
style="padding: 0"
@click="(e) => handleDelete(file)" />
</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> </div>
</section> </section>
</div> </div>
@@ -189,6 +190,32 @@ export default {
}, 500); }, 500);
}, },
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);
}
},
emitFilelist() { emitFilelist() {
this.$emit('update', this.files); this.$emit('update', this.files);
}, },

View File

@@ -42,16 +42,26 @@
v-model="form" /> v-model="form" />
</div> </div>
<div v-if="section.key == 'attrs'" style="margin-top: 12px"> <div
v-if="section.key == 'attrs'"
style="margin-top: 12px; position: relative">
<div
v-if="!mode.includes('detail')"
style="position: absolute; top: -40px; right: 0">
<el-button @click="handleAddAttr" type="text">
<i class="el-icon-plus"></i>
添加属性
</el-button>
</div>
<base-table <base-table
v-loading="attrListLoading" v-loading="attrListLoading"
:table-props="section.props" :table-props="section.props"
:page="attrQuery?.params.pageNo || 1" :page="attrQuery?.params.pageNo || 1"
:limit="attrQuery?.params.pageSize || 10" :limit="attrQuery?.params.pageSize || 10"
:table-data="list" :table-data="list"
:add-button-show="mode.includes('detail') ? null : '添加属性'"
@emitButtonClick="handleAddAttr"
@emitFun="handleEmitFun"> @emitFun="handleEmitFun">
<!-- :add-button-show="mode.includes('detail') ? null : '添加属性'"
@emitButtonClick="handleAddAttr" -->
<method-btn <method-btn
v-if="section.tableBtn" v-if="section.tableBtn"
slot="handleBtn" slot="handleBtn"
@@ -76,7 +86,7 @@
<el-button v-if="mode == 'detail'" type="primary" @click="toggleEdit"> <el-button v-if="mode == 'detail'" type="primary" @click="toggleEdit">
编辑 编辑
</el-button> </el-button>
<el-button v-else type="primary" @click="handleConfirm">确定</el-button> <el-button v-else type="primary" @click="handleConfirm">保存</el-button>
<!-- sections的第二项必须是 属性列表 --> <!-- sections的第二项必须是 属性列表 -->
<!-- <el-button <!-- <el-button
v-if="sections[1].allowAdd" v-if="sections[1].allowAdd"
@@ -162,7 +172,9 @@ export default {
input: true, input: true,
label: '属性名称', label: '属性名称',
prop: 'name', prop: 'name',
rules: [{ required: true, message: '属性名称不能为空', trigger: 'blur' }], rules: [
{ required: true, message: '属性名称不能为空', trigger: 'blur' },
],
}, },
], ],
[ [

View File

@@ -1,29 +1,62 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<SearchBar :formConfigs="searchBarFormConfig" ref="search-bar" @headBtnClick="handleSearchBarBtnClick" /> <SearchBar
:formConfigs="searchBarFormConfig"
ref="search-bar"
@headBtnClick="handleSearchBarBtnClick" />
<!-- 列表 --> <!-- 列表 -->
<base-table :table-props="tableProps" :page="queryParams.pageNo" :limit="queryParams.pageSize" :table-data="list" <base-table
:table-props="tableProps"
:page="queryParams.pageNo"
:limit="queryParams.pageSize"
:table-data="list"
@emitFun="handleEmitFun"> @emitFun="handleEmitFun">
<method-btn v-if="tableBtn.length" slot="handleBtn" :width="120" label="操作" :method-list="tableBtn" <method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="120"
label="操作"
:method-list="tableBtn"
@clickBtn="handleTableBtnClick" /> @clickBtn="handleTableBtnClick" />
</base-table> </base-table>
<!-- 分页组件 --> <!-- 分页组件 -->
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" <pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
@pagination="getList" /> @pagination="getList" />
<!-- 对话框(添加) --> <!-- 对话框(添加) -->
<base-dialog :dialogTitle="title" :dialogVisible="open" @close="cancel" @cancel="cancel" width="60%" <base-dialog
:dialogTitle="title"
:dialogVisible="open"
@close="cancel"
@cancel="cancel"
width="60%"
@confirm="submitForm"> @confirm="submitForm">
<DialogForm v-if="open" key="index-dialog-form" ref="form" label-position="top" size="small" v-model="form" <DialogForm
v-if="open"
key="index-dialog-form"
ref="form"
label-position="top"
size="small"
v-model="form"
:has-files="['files', 'files2']"
:rows="computedRows" /> :rows="computedRows" />
</base-dialog> </base-dialog>
<!-- 设备 详情 - 编辑 --> <!-- 设备 详情 - 编辑 -->
<EquipmentDrawer v-if="editVisible" ref="drawer" :mode="editMode" @update-mode="editMode = $event" <EquipmentDrawer
:data-id="form.id" :sections="[ v-if="editVisible"
ref="drawer"
:mode="editMode"
@update-mode="editMode = $event"
:data-id="form.id"
:sections="[
{ {
name: '基本信息', name: '基本信息',
key: 'base', key: 'base',
@@ -50,20 +83,23 @@
tableBtn: [ tableBtn: [
this.$auth.hasPermi('base:core-equipment-attr:update') this.$auth.hasPermi('base:core-equipment-attr:update')
? { ? {
type: 'edit', type: 'edit',
btnName: '修改', btnName: '修改',
} }
: undefined, : undefined,
this.$auth.hasPermi('base:core-equipment-attr:delete') this.$auth.hasPermi('base:core-equipment-attr:delete')
? { ? {
type: 'delete', type: 'delete',
btnName: '删除', btnName: '删除',
} }
: undefined, : undefined,
].filter((v) => v), ].filter((v) => v),
allowAdd: true, allowAdd: true,
}, },
]" @refreshDataList="getList" @cancel="cancelEdit" @destroy="cancelEdit" /> ]"
@refreshDataList="getList"
@cancel="cancelEdit"
@destroy="cancelEdit" />
</div> </div>
</template> </template>
@@ -96,21 +132,21 @@ export default {
tableBtn: [ tableBtn: [
this.$auth.hasPermi(`base:core-equipment:update`) this.$auth.hasPermi(`base:core-equipment:update`)
? { ? {
type: 'detail', type: 'detail',
btnName: '详情', btnName: '详情',
} }
: undefined, : undefined,
this.$auth.hasPermi('base:core-equipment:update') this.$auth.hasPermi('base:core-equipment:update')
? { ? {
type: 'edit', type: 'edit',
btnName: '修改', btnName: '修改',
} }
: undefined, : undefined,
this.$auth.hasPermi('base:core-equipment:delete') this.$auth.hasPermi('base:core-equipment:delete')
? { ? {
type: 'delete', type: 'delete',
btnName: '删除', btnName: '删除',
} }
: undefined, : undefined,
].filter((v) => v), ].filter((v) => v),
tableProps: [ tableProps: [
@@ -176,14 +212,18 @@ export default {
type: 'separate', type: 'separate',
}, },
{ {
type: this.$auth.hasPermi('base:core-equipment:export') ? 'button' : '', type: this.$auth.hasPermi('base:core-equipment:export')
? 'button'
: '',
btnName: '导出', btnName: '导出',
name: 'export', name: 'export',
plain: true, plain: true,
color: 'primary', color: 'primary',
}, },
{ {
type: this.$auth.hasPermi('base:core-equipment:create') ? 'button' : '', type: this.$auth.hasPermi('base:core-equipment:create')
? 'button'
: '',
btnName: '新增', btnName: '新增',
name: 'add', name: 'add',
plain: true, plain: true,
@@ -196,7 +236,9 @@ export default {
input: true, input: true,
label: '设备名称', label: '设备名称',
prop: 'name', prop: 'name',
rules: [{ required: true, message: '设备名称不能为空', trigger: 'blur' }], rules: [
{ required: true, message: '设备名称不能为空', trigger: 'blur' },
],
// bind: { // bind: {
// disabled: this.editMode == 'detail', // some condition, like detail mode... // disabled: this.editMode == 'detail', // some condition, like detail mode...
// } // }
@@ -225,7 +267,9 @@ export default {
label: '设备类型', label: '设备类型',
prop: 'equipmentTypeId', prop: 'equipmentTypeId',
url: '/base/core-equipment-type/page?pageNo=1&pageSize=100', url: '/base/core-equipment-type/page?pageNo=1&pageSize=100',
rules: [{ required: true, message: '设备类型不能为空', trigger: 'blur' }], rules: [
{ required: true, message: '设备类型不能为空', trigger: 'blur' },
],
bind: { bind: {
filterable: true, filterable: true,
}, },
@@ -235,7 +279,11 @@ export default {
label: '预计生产时间(min/天)', label: '预计生产时间(min/天)',
prop: 'workTime', prop: 'workTime',
rules: [ rules: [
{ required: true, message: '预计生产时间不能为空', trigger: 'blur' }, {
required: true,
message: '预计生产时间不能为空',
trigger: 'blur',
},
{ {
type: 'number', type: 'number',
message: '请输入正确的数字值', message: '请输入正确的数字值',
@@ -291,7 +339,11 @@ export default {
label: '单件产品加工时间(s)', label: '单件产品加工时间(s)',
prop: 'processingTime', prop: 'processingTime',
rules: [ rules: [
{ required: true, message: '单件产品加工时间不能为空', trigger: 'blur' }, {
required: true,
message: '单件产品加工时间不能为空',
trigger: 'blur',
},
{ {
type: 'number', type: 'number',
message: '请输入正确的数字值', message: '请输入正确的数字值',
@@ -322,13 +374,19 @@ export default {
[ [
{ {
upload: true, upload: true,
label: '上传资料', label: '设备资料',
prop: 'files', prop: 'files',
}, },
], ],
[ [
{ input: true, label: '备注', prop: 'remark' } {
upload: true,
label: '设备图片',
prop: 'files2',
fileType: 1,
},
], ],
[{ input: true, label: '备注', prop: 'remark' }],
// [ // [
// { // {
// assetUpload: true, // assetUpload: true,
@@ -429,7 +487,7 @@ export default {
// 表单参数 // 表单参数
form: { form: {
id: null, id: null,
files: [] files: [],
}, },
showUploadComponents: false, // 是否显示上传组件 showUploadComponents: false, // 是否显示上传组件
}; };
@@ -441,36 +499,36 @@ export default {
computedRows() { computedRows() {
return this.showUploadComponents return this.showUploadComponents
? [ ? [
...this.rows, ...this.rows,
[ [
{ {
assetUpload: true, assetUpload: true,
key: 'eq-assets', // 用于区分不同的上传组件 key: 'eq-assets', // 用于区分不同的上传组件
label: '上传资料', label: '上传资料',
fieldName: 'assets', fieldName: 'assets',
subcomponent: AssetsUpload, subcomponent: AssetsUpload,
prop: 'uploadedAssets', prop: 'uploadedAssets',
default: [], default: [],
bind: { bind: {
'is-pic-mode': false, 'is-pic-mode': false,
},
}, },
}, ],
], [
[ {
{ assetUpload: true,
assetUpload: true, key: 'eq-pics', // 用于区分不同的上传组件
key: 'eq-pics', // 用于区分不同的上传组件 label: '上传图片',
label: '上传图片', fieldName: 'images',
fieldName: 'images', subcomponent: AssetsUpload,
subcomponent: AssetsUpload, // prop: '',
// prop: '', // default: [],
// default: [], bind: {
bind: { 'is-pic-mode': true,
'is-pic-mode': true, },
}, },
}, ],
], ]
]
: this.rows; : this.rows;
}, },
}, },
@@ -512,7 +570,8 @@ export default {
spec: undefined, spec: undefined,
description: undefined, description: undefined,
remark: undefined, remark: undefined,
files: [] files: [],
files2: [],
}; };
this.resetForm('form'); this.resetForm('form');
}, },
@@ -540,9 +599,12 @@ export default {
if (!valid) { if (!valid) {
return; return;
} }
const payload = Object.assign({}, this.form);
payload.files = [...payload.files, ...payload.files2];
delete payload.files2;
// 修改的提交 // 修改的提交
if (this.form.id != null) { if (this.form.id != null) {
updateEquipment(this.form).then((response) => { updateEquipment(payload).then((response) => {
this.$modal.msgSuccess('修改成功'); this.$modal.msgSuccess('修改成功');
this.open = false; this.open = false;
this.getList(); this.getList();
@@ -550,7 +612,7 @@ export default {
return; return;
} }
// 添加的提交 // 添加的提交
createEquipment(this.form).then((response) => { createEquipment(payload).then((response) => {
this.$modal.msgSuccess('新增成功'); this.$modal.msgSuccess('新增成功');
this.open = false; this.open = false;
this.getList(); this.getList();
@@ -569,7 +631,7 @@ export default {
this.getList(); this.getList();
this.$modal.msgSuccess('删除成功'); this.$modal.msgSuccess('删除成功');
}) })
.catch(() => { }); .catch(() => {});
}, },
/** 导出按钮操作 */ /** 导出按钮操作 */
handleExport() { handleExport() {
@@ -587,7 +649,7 @@ export default {
this.$download.excel(response, '设备.xls'); this.$download.excel(response, '设备.xls');
this.exportLoading = false; this.exportLoading = false;
}) })
.catch(() => { }); .catch(() => {});
}, },
// 查看详情 // 查看详情
viewDetail(id) { viewDetail(id) {

View File

@@ -2,7 +2,7 @@
* @Author: zwq * @Author: zwq
* @Date: 2021-11-18 14:16:25 * @Date: 2021-11-18 14:16:25
* @LastEditors: DY * @LastEditors: DY
* @LastEditTime: 2023-11-15 16:23:49 * @LastEditTime: 2023-11-27 20:12:00
* @Description: * @Description:
--> -->
<template> <template>
@@ -11,7 +11,7 @@
:rules="dataRule" :rules="dataRule"
ref="dataForm" ref="dataForm"
@keyup.enter.native="dataFormSubmit()" @keyup.enter.native="dataFormSubmit()"
label-width="100px"> label-width="90px">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="原料名称" prop="name"> <el-form-item label="原料名称" prop="name">
@@ -46,6 +46,9 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-form-item label="备注" prop="remark">
<el-input v-model="dataForm.remark" clearable placeholder="请输入备注" />
</el-form-item>
</el-form> </el-form>
</template> </template>
@@ -70,7 +73,8 @@ export default {
code: undefined, code: undefined,
name: undefined, name: undefined,
unit: undefined, unit: undefined,
dailyCost: undefined dailyCost: undefined,
remark: undefined
}, },
departmentlList: [], departmentlList: [],
menuOptions: [], menuOptions: [],

View File

@@ -29,7 +29,7 @@
@cancel="handleCancel" @cancel="handleCancel"
@confirm="handleConfirm" @confirm="handleConfirm"
:before-close="handleCancel" :before-close="handleCancel"
width="50%"> width="45%">
<add-or-update <add-or-update
ref="addOrUpdate" ref="addOrUpdate"
@refreshDataList="successSubmit"></add-or-update> @refreshDataList="successSubmit"></add-or-update>

View File

@@ -2,14 +2,14 @@
* @Author: zwq * @Author: zwq
* @Date: 2021-11-18 14:16:25 * @Date: 2021-11-18 14:16:25
* @LastEditors: DY * @LastEditors: DY
* @LastEditTime: 2023-11-15 15:41:44 * @LastEditTime: 2023-11-27 20:07:09
* @Description: * @Description:
--> -->
<template> <template>
<el-drawer <el-drawer
:visible.sync="visible" :visible.sync="visible"
:show-close="false" :show-close="false"
:wrapper-closable="false" :wrapper-closable="isdetail"
class="drawer" class="drawer"
size="60%"> size="60%">
<small-title slot="title" :no-padding="true"> <small-title slot="title" :no-padding="true">
@@ -114,14 +114,6 @@
</el-row> </el-row>
</el-form> </el-form>
</div> </div>
<div class="drawer-body__footer">
<el-button v-if="!idAttrShow" @click="goback()">取消</el-button>
<el-button v-else :disabled="isdetail" @click="init(dataForm.id)">重置</el-button>
<el-button v-if="isdetail" type="primary" @click="goEdit()">
编辑
</el-button>
<el-button v-else type="primary" @click="dataFormSubmit()">确定</el-button>
</div>
<div class="attr-list" v-if="idAttrShow"> <div class="attr-list" v-if="idAttrShow">
<small-title <small-title
@@ -158,14 +150,16 @@
:limit.sync="listQuery.pageSize" :limit.sync="listQuery.pageSize"
:page-sizes="[5, 10, 15]" :page-sizes="[5, 10, 15]"
@pagination="getList" /> @pagination="getList" />
<div class="drawer-body__footer">
<el-button type="primary" @click="goback()">关闭</el-button>
</div>
</div> </div>
</div> </div>
<div v-if="!isdetail" class="drawer-body__footer">
<el-button @click="goback()">取消</el-button>
<el-button :disabled="isdetail" @click="init(dataForm.id)">重置</el-button>
<el-button type="primary" @click="dataFormSubmit()">确定</el-button>
</div>
<attr-add <attr-add
v-if="addOrUpdateVisible" v-if="addOrUpdateVisible"
ref="addOrUpdate" ref="addOrUpdate"
@@ -253,8 +247,8 @@ export default {
isdetail: false, isdetail: false,
idAttrShow: false, idAttrShow: false,
dataRule: { dataRule: {
code: [{ required: true, message: "物料编码不能为空", trigger: "blur" }], code: [{ required: true, message: "产品编码不能为空", trigger: "blur" }],
name: [{ required: true, message: "物料名称不能为空", trigger: "blur" }], name: [{ required: true, message: "产品名称不能为空", trigger: "blur" }],
materialType: [{ required: true, message: "物料类型不能为空", trigger: "change" }], materialType: [{ required: true, message: "物料类型不能为空", trigger: "change" }],
productType: [{ required: true, message: "产品类型不能为空", trigger: "change" }], productType: [{ required: true, message: "产品类型不能为空", trigger: "change" }],
processTime: [{ required: true, message: "产线生产单位用时不能为空", trigger: "blur" }] processTime: [{ required: true, message: "产线生产单位用时不能为空", trigger: "blur" }]
@@ -270,11 +264,7 @@ export default {
handleClick(raw) { handleClick(raw) {
if (raw.type === 'delete') { if (raw.type === 'delete') {
this.$confirm( this.$confirm(
`确定对${ `是否确认删除属性名为"${raw.data.name}"的数据项?`,
raw.data.attrName
? '[名称=' + raw.data.attrName + ']'
: '[序号=' + raw.data._pageIndex + ']'
}进行删除操作?`,
'提示', '提示',
{ {
confirmButtonText: '确定', confirmButtonText: '确定',

View File

@@ -84,18 +84,18 @@ export default {
}, },
tableProps, tableProps,
tableBtn: [ tableBtn: [
this.$auth.hasPermi(`base:core-product:detail`)
? {
type: 'detail',
btnName: '查看详情',
}
: undefined,
this.$auth.hasPermi(`base:core-product:update`) this.$auth.hasPermi(`base:core-product:update`)
? { ? {
type: 'edit', type: 'edit',
btnName: '编辑', btnName: '编辑',
} }
: undefined, : undefined,
this.$auth.hasPermi(`base:core-product:detail`)
? {
type: 'detail',
btnName: '查看详情',
}
: undefined,
this.$auth.hasPermi(`base:core-product:delete`) this.$auth.hasPermi(`base:core-product:delete`)
? { ? {
type: 'delete', type: 'delete',
@@ -141,6 +141,27 @@ export default {
}, },
created() {}, created() {},
methods: { methods: {
// 删除
deleteHandle(id, name, index) {
this.$confirm(`是否确认删除产品名称为"${name}"的数据项`, "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
this.urlOptions.deleteURL(id).then(({ data }) => {
this.$message({
message: "操作成功",
type: "success",
duration: 1500,
onClose: () => {
this.getDataList();
},
});
});
})
.catch(() => { });
},
// 查看详情 // 查看详情
otherMethods(val) { otherMethods(val) {
if (val.type === 'detail') { if (val.type === 'detail') {

View File

@@ -105,7 +105,7 @@ export default {
formConfig: [ formConfig: [
{ {
type: 'input', type: 'input',
label: '关键字', label: '供应商',
placeholder: '供应商名称', placeholder: '供应商名称',
param: 'name', param: 'name',
}, },

View File

@@ -2,23 +2,23 @@
* @Author: zwq * @Author: zwq
* @Date: 2021-11-18 14:16:25 * @Date: 2021-11-18 14:16:25
* @LastEditors: DY * @LastEditors: DY
* @LastEditTime: 2023-11-24 18:20:26 * @LastEditTime: 2023-11-28 14:09:09
* @Description: * @Description:
--> -->
<template> <template>
<el-drawer <el-drawer
:visible.sync="visible" :visible.sync="visible"
:show-close="false" :show-close="false"
:wrapper-closable="false" :wrapper-closable="true"
class="drawer" class="drawer"
size="50%"> size="50%">
<small-title slot="title" :no-padding="true"> <small-title slot="title" :no-padding="true">
{{ '预使用主原料信息' }} {{ '工单名称:' + dataForm.name }}
</small-title> </small-title>
<div class="content"> <div class="content">
<div style="height: 10vh"> <!-- <div style="height: 10vh">
<div style="font-size: 18px;">工单名{{ dataForm.name }}</div> <div style="font-size: 18px;">工单名{{ dataForm.name }}</div>
</div> </div> -->
<div class="attr-list"> <div class="attr-list">
<small-title <small-title
@@ -30,7 +30,7 @@
<div class="action_btn"> <div class="action_btn">
<template> <template>
<span style="display: inline-block;"> <span style="display: inline-block;">
<el-button type="text" @click="addNew()" icon="el-icon-plus">添加</el-button> <el-button type="text" @click="addNew()" icon="el-icon-plus">新增</el-button>
</span> </span>
</template> </template>
</div> </div>
@@ -55,9 +55,9 @@
@pagination="getList" /> @pagination="getList" />
</div> </div>
<div class="drawer-body__footer"> <!-- <div class="drawer-body__footer">
<el-button type="primary" @click="goback()">关闭</el-button> <el-button type="primary" @click="goback()">关闭</el-button>
</div> </div> -->
</div> </div>
<attr-add <attr-add

View File

@@ -1,21 +1,19 @@
<template> <template>
<el-form ref="dataForm" :rules="rules" label-width="130px" :model="dataForm"> <el-form ref="dataForm" :rules="rules" label-width="130px" :model="dataForm" label-position="top">
<el-row> <el-row :gutter="20">
<el-col :span='12'> <el-col :span='8'>
<el-form-item label="工单名称" prop="name"> <el-form-item label="工单名称" prop="name">
<el-input v-model="dataForm.name"></el-input> <el-input v-model="dataForm.name" placeholder="请输入工单名称"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span='12'> <el-col :span='8'>
<el-form-item label="工单编码" prop="code"> <el-form-item label="工单编码" prop="code">
<el-input v-model="dataForm.code" disabled></el-input> <el-input v-model="dataForm.code" disabled placeholder="请输入工单编码"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> <el-col :span='8'>
<el-row>
<el-col :span='12'>
<el-form-item label="产品名称" prop="planProductId"> <el-form-item label="产品名称" prop="planProductId">
<el-select v-model="dataForm.planProductId" placeholder="请选择" style="width: 100%;" @change="selectProduct"> <el-select v-model="dataForm.planProductId" placeholder="请选择产品" style="width: 100%;" filterable @change="selectProduct">
<el-option <el-option
v-for="item in productList" v-for="item in productList"
:key="item.id" :key="item.id"
@@ -25,52 +23,50 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span='12'> </el-row>
<el-row :gutter="20">
<el-col :span='8'>
<el-form-item label="产品规格" prop="specifications"> <el-form-item label="产品规格" prop="specifications">
<el-input v-model="dataForm.specifications" /> <el-input v-model="dataForm.specifications" placeholder="请输入产品规格" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> <el-col :span='8'>
<el-row>
<el-col :span='12'>
<el-form-item label="计划开始时间"> <el-form-item label="计划开始时间">
<el-date-picker <el-date-picker
v-model="dataForm.planStartTime" v-model="dataForm.planStartTime"
type="datetime" type="datetime"
value-format="timestamp" value-format="timestamp"
style="width: 100%;" style="width: 100%;"
placeholder="选择日期"> placeholder="选择计划开始时间">
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span='12'> <el-col :span='8'>
<el-form-item label="计划完成时间"> <el-form-item label="计划完成时间">
<el-date-picker <el-date-picker
v-model="dataForm.planFinishTime" v-model="dataForm.planFinishTime"
type="datetime" type="datetime"
value-format="timestamp" value-format="timestamp"
style="width: 100%;" style="width: 100%;"
placeholder="选择日期"> placeholder="选择计划完成时间">
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row :gutter="20">
<el-col :span='12'> <el-col :span='8'>
<el-form-item label="计划投入数量" prop="planAssignQuantity"> <el-form-item label="计划投入数量" prop="planAssignQuantity">
<el-input-number v-model="dataForm.planAssignQuantity" :min="0" :max="9999999999999" style="width: 100%;"></el-input-number> <el-input-number v-model="dataForm.planAssignQuantity" :min="0" :max="9999999999999" style="width: 100%;" placeholder="请输入计划投入数量"></el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span='12'> <el-col :span='8'>
<el-form-item label="计划生产数量" prop="planQuantity"> <el-form-item label="计划生产数量" prop="planQuantity">
<el-input-number v-model="dataForm.planQuantity" :min="0" :max="9999999999999" style="width: 100%;"></el-input-number> <el-input-number v-model="dataForm.planQuantity" :min="0" :max="9999999999999" style="width: 100%;" placeholder="请输入计划生产数量"></el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> <el-col :span='8'>
<el-row>
<el-col :span='12'>
<el-form-item label="关联工艺" prop="processFlowId"> <el-form-item label="关联工艺" prop="processFlowId">
<el-select v-model="dataForm.processFlowId" placeholder="请选择工艺" clearable filterable style="width: 100%;" @change="processFlowIdChange"> <el-select v-model="dataForm.processFlowId" placeholder="请选择关联工艺" clearable filterable style="width: 100%;" @change="processFlowIdChange">
<el-option <el-option
v-for="item in processFlowList" v-for="item in processFlowList"
:key="item.id" :key="item.id"
@@ -80,19 +76,23 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span='12'> </el-row>
<el-row :gutter="20">
<el-col :span='8'>
<el-form-item label="物料计算方式" prop="materialMethod"> <el-form-item label="物料计算方式" prop="materialMethod">
<el-radio-group v-model="dataForm.materialMethod" @change="materialMethodChange"> <!-- <el-radio-group v-model="dataForm.materialMethod" @change="materialMethodChange">
<el-radio :label="1">产品基础BOM</el-radio> <el-radio :label="1">产品基础BOM</el-radio>
<el-radio :label="2">工艺扩展BOM</el-radio> <el-radio :label="2">工艺扩展BOM</el-radio>
</el-radio-group> </el-radio-group> -->
<el-select v-model="dataForm.materialMethod" placeholder="请选择物料计算方式" style="width: 100%;" @change="materialMethodChange">
<el-option key="1" label="产品基础BOM" :value="1" />
<el-option key="2" label="工艺扩展BOM" :value="2" />
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> <el-col :span='8'>
<el-row>
<el-col :span='12'>
<el-form-item label="优先级" prop="priority"> <el-form-item label="优先级" prop="priority">
<el-select v-model="dataForm.priority" placeholder="请选择" style="width: 100%;"> <el-select v-model="dataForm.priority" placeholder="请选择优先级" style="width: 100%;">
<el-option <el-option
v-for="item in getDictDatas(DICT_TYPE.ORDER_PRIORITY)" v-for="item in getDictDatas(DICT_TYPE.ORDER_PRIORITY)"
:key="item.value" :key="item.value"
@@ -102,9 +102,9 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span='12'> <el-col :span='8'>
<el-form-item label="工单类型" prop="type"> <el-form-item label="工单类型" prop="type">
<el-select v-model="dataForm.type" placeholder="请选择" style="width: 100%;"> <el-select v-model="dataForm.type" placeholder="请选择工单类型" style="width: 100%;">
<el-option <el-option
v-for="item in workOrderTypeList" v-for="item in workOrderTypeList"
:key="item.id" :key="item.id"
@@ -115,10 +115,10 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row :gutter="20">
<el-col :span='12'> <el-col :span='8'>
<el-form-item label="关联产线" prop="productLineIds"> <el-form-item label="关联产线" prop="productLineIds">
<el-select v-model="dataForm.productLineIds" placeholder="请选择" multiple style="width: 100%;"> <el-select v-model="dataForm.productLineIds" placeholder="请选择关联产线" multiple style="width: 100%;">
<el-option <el-option
v-for="item in productLineList" v-for="item in productLineList"
:key="item.id" :key="item.id"
@@ -128,9 +128,9 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span='12'> <el-col :span='8'>
<el-form-item label="负责人" prop="workers"> <el-form-item label="负责人" prop="workers">
<el-input v-model="dataForm.workers"></el-input> <el-input v-model="dataForm.workers" placeholder="请输入负责人"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@@ -175,6 +175,7 @@ export default {
planQuantity: 0, planQuantity: 0,
processFlowId: '', processFlowId: '',
materialMethod: 1, materialMethod: 1,
triggerOrigin: 1,
priority: '', priority: '',
productLineIds: [], productLineIds: [],
type: '', type: '',

View File

@@ -1,7 +1,7 @@
<template> <template>
<el-dialog <el-dialog
:visible.sync="visible" :visible.sync="visible"
:width="'35%'" :width="'50%'"
:append-to-body="true" :append-to-body="true"
:close-on-click-modal="false" :close-on-click-modal="false"
class="dialog"> class="dialog">
@@ -17,73 +17,92 @@
ref="dataForm" ref="dataForm"
:model="dataForm" :model="dataForm"
:rules="dataRule" :rules="dataRule"
label-width="100px" label-width="80px"
@keyup.enter.native="dataFormSubmit()"> @keyup.enter.native="dataFormSubmit()">
<el-form-item label="原料" prop="material"> <el-row :gutter="20">
<el-select <el-col :span="12">
v-model="dataForm.material" <el-form-item label="原料" prop="material">
filterable <el-select
style="width: 100%" v-model="dataForm.material"
placeholder="请选择原料"> filterable
<el-option style="width: 100%"
v-for="dict in getDictDatas('material')" placeholder="请选择原料">
:key="dict.value" <el-option
:label="dict.label" v-for="dict in getDictDatas('material')"
:value="dict.value" /> :key="dict.value"
</el-select> :label="dict.label"
</el-form-item> :value="dict.value" />
<el-form-item label="来源" prop="origin"> </el-select>
<el-select </el-form-item>
v-model="dataForm.origin" </el-col>
filterable <el-col :span="12">
style="width: 100%" <el-form-item label="来源" prop="origin">
placeholder="请选择来源"> <el-select
<el-option v-model="dataForm.origin"
v-for="dict in originList" filterable
:key="dict.value" style="width: 100%"
:label="dict.label" placeholder="请选择来源">
:value="dict.value" /> <el-option
</el-select> v-for="dict in originList"
</el-form-item> :key="dict.value"
<el-form-item label="供应商" prop="supplierId"> :label="dict.label"
<el-select :value="dict.value" />
v-model="dataForm.supplierId" </el-select>
filterable </el-form-item>
style="width: 100%" </el-col>
placeholder="请选择供应商"> </el-row>
<el-option <el-row :gutter="20">
v-for="dict in supplierList" <el-col :span="12">
:key="dict.id" <el-form-item label="供应商" prop="supplierId">
:label="dict.name" <el-select
:value="dict.id" /> v-model="dataForm.supplierId"
</el-select> filterable
</el-form-item> style="width: 100%"
<el-form-item label="批次号" prop="batch"> placeholder="请选择供应商">
<el-input <el-option
v-model="dataForm.batch" v-for="dict in supplierList"
clearable :key="dict.id"
placeholder="请输入批次号" /> :label="dict.name"
</el-form-item> :value="dict.id" />
<el-form-item label="数量" prop="num"> </el-select>
<el-input-number </el-form-item>
v-model="dataForm.num" </el-col>
clearable <el-col :span="12">
style="width: 100%" <el-form-item label="批次号" prop="batch">
placeholder="请输入数量" /> <el-input
</el-form-item> v-model="dataForm.batch"
<el-form-item label="单位" prop="unit"> clearable
<el-select placeholder="请输入批次号" />
v-model="dataForm.unit" </el-form-item>
filterable </el-col>
style="width: 100%" </el-row>
placeholder="请选择单位"> <el-row :gutter="20">
<el-option <el-col :span="12">
v-for="dict in getDictDatas('unit_dict')" <el-form-item label="数量" prop="num">
:key="dict.value" <el-input-number
:label="dict.label" v-model="dataForm.num"
:value="dict.value" /> clearable
</el-select> controls-position="right"
</el-form-item> style="width: 100%"
placeholder="请输入数量" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单位" prop="unit">
<el-select
v-model="dataForm.unit"
filterable
style="width: 100%"
placeholder="请选择单位">
<el-option
v-for="dict in getDictDatas('unit_dict')"
:key="dict.value"
:label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
<el-row style="text-align: right"> <el-row style="text-align: right">

View File

@@ -13,7 +13,7 @@
<method-btn <method-btn
v-if="tableBtn.length" v-if="tableBtn.length"
slot="handleBtn" slot="handleBtn"
:width="300" :width="350"
label="操作" label="操作"
:method-list="tableBtn" :method-list="tableBtn"
@clickBtn="handleClick" /> @clickBtn="handleClick" />
@@ -57,7 +57,8 @@ import {
getCoreWOPage, getCoreWOPage,
deleteCoreWO, deleteCoreWO,
statusChange, statusChange,
getConOrderList getConOrderList,
getCoreWOList
} from '@/api/base/coreWorkOrder'; } from '@/api/base/coreWorkOrder';
@@ -65,19 +66,27 @@ const tableProps = [
{ {
prop: 'createTime', prop: 'createTime',
label: '创建时间', label: '创建时间',
filter: parseTime filter: parseTime,
minWidth: 150,
showOverflowtooltip: true
}, },
{ {
prop: 'name', prop: 'name',
label: '工单名称' label: '工单名称',
minWidth: 120,
showOverflowtooltip: true
}, },
{ {
prop: 'code', prop: 'code',
label: '工单编码' label: '工单编码',
minWidth: 150,
showOverflowtooltip: true
}, },
{ {
prop: 'workers', prop: 'workers',
label: '负责人' label: '负责人',
minWidth: 100,
showOverflowtooltip: true
}, },
{ {
prop: 'priority', prop: 'priority',
@@ -87,7 +96,7 @@ const tableProps = [
{ {
prop: 'triggerOrigin', prop: 'triggerOrigin',
label: '来源', label: '来源',
filter: (val) => ['', 'MES', 'ERP'][val] filter: (val) => ['', 'MES-手动', 'MES-订单下发', 'ERP'][val]
}, },
{ {
prop: 'status', prop: 'status',
@@ -97,15 +106,19 @@ const tableProps = [
{ {
prop: 'planFinishTime', prop: 'planFinishTime',
label: '计划完成时间', label: '计划完成时间',
filter: parseTime filter: parseTime,
minWidth: 150,
showOverflowtooltip: true
}, },
{ {
prop: 'planQuantity', prop: 'planQuantity',
label: '计划生产数量' label: '计划生产数量',
minWidth: 120,
}, },
{ {
prop: 'actualQuantity', prop: 'actualQuantity',
label: '实际生产数量' label: '实际生产数量',
minWidth: 120,
} }
]; ];
@@ -127,48 +140,10 @@ export default {
allocationVisible: false, allocationVisible: false,
tableProps, tableProps,
tableBtn: [ tableBtn: [
this.$auth.hasPermi(`base:core-work-order:update`) this.$auth.hasPermi(`base:core-work-order:material`)
? {
type: 'edit',
btnName: '编辑',
showParam: {
type: '&',
data: [
{
name: 'status',
type: 'equal',
value: 1
}
]
}
}
: undefined,
this.$auth.hasPermi(`base:core-work-order:material`)
? { ? {
type: 'material', type: 'material',
btnName: '预使用原料信息', btnName: '原料信息',
}
: undefined,
this.$auth.hasPermi(`base:core-work-order:detail`)
? {
type: 'detail',
btnName: '查看详情',
}
: undefined,
this.$auth.hasPermi(`base:core-work-order:delete`)
? {
type: 'delete',
btnName: '删除',
showParam: {
type: '|',
data: [
{
name: 'status',
type: 'equal',
value: 1
}
]
}
} }
: undefined, : undefined,
{ {
@@ -246,10 +221,58 @@ export default {
} }
] ]
} }
} },
this.$auth.hasPermi(`base:core-work-order:detail`)
? {
type: 'detail',
btnName: '查看详情',
}
: undefined,
this.$auth.hasPermi(`base:core-work-order:update`)
? {
type: 'edit',
btnName: '编辑',
showParam: {
type: '&',
data: [
{
name: 'status',
type: 'equal',
value: 1
}
]
}
}
: undefined,
this.$auth.hasPermi(`base:core-work-order:delete`)
? {
type: 'delete',
btnName: '删除',
showParam: {
type: '|',
data: [
{
name: 'status',
type: 'equal',
value: 1
}
]
}
}
: undefined
].filter((v)=>v), ].filter((v)=>v),
tableData: [], tableData: [],
formConfig: [ formConfig: [
// {
// type: 'select',
// label: '工单名称',
// placeholder: '工单名称',
// param: 'name',
// defaultSelect: '',
// selectOptions: [],
// allowCreate: true,
// filterable: true
// },
{ {
type: 'input', type: 'input',
label: '工单名称', label: '工单名称',
@@ -307,9 +330,20 @@ export default {
this.listQuery.name = this.$route.query.workOrderName; this.listQuery.name = this.$route.query.workOrderName;
this.formConfig[0].defaultSelect = this.$route.query.workOrderName; this.formConfig[0].defaultSelect = this.$route.query.workOrderName;
} }
// this.getWorkOrder()
this.getDataList() this.getDataList()
}, },
methods: { methods: {
getWorkOrder() {
getCoreWOList().then(res => {
this.formConfig[0].selectOptions = res.data.map(item => {
return {
name: item.name,
id: item.name
}
})
})
},
refreshWorkOrder(val) { refreshWorkOrder(val) {
console.log(val) console.log(val)
if (val) { if (val) {

View File

@@ -2,7 +2,7 @@
* @Author: zwq * @Author: zwq
* @Date: 2021-11-18 14:16:25 * @Date: 2021-11-18 14:16:25
* @LastEditors: DY * @LastEditors: DY
* @LastEditTime: 2023-11-22 08:55:37 * @LastEditTime: 2023-11-27 09:21:48
* @Description: * @Description:
--> -->
<template> <template>
@@ -43,7 +43,9 @@
<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"
placeholder="排序" /> controls-position="right"
placeholder="排序"
style="width: 100%" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>

View File

@@ -29,7 +29,7 @@
@cancel="handleCancel" @cancel="handleCancel"
@confirm="handleConfirm" @confirm="handleConfirm"
:before-close="handleCancel" :before-close="handleCancel"
width="50%"> width="40%">
<add-or-update <add-or-update
ref="addOrUpdate" ref="addOrUpdate"
@refreshDataList="successSubmit"></add-or-update> @refreshDataList="successSubmit"></add-or-update>

View File

@@ -166,13 +166,17 @@ export default {
input: true, input: true,
label: '参数列名', label: '参数列名',
prop: 'plcParamName', prop: 'plcParamName',
rules: [{ required: true, message: '参数列名不能为空', trigger: 'blur' }], rules: [
{ required: true, message: '参数列名不能为空', trigger: 'blur' },
],
}, },
{ {
input: true, input: true,
label: '参数名称', label: '参数名称',
prop: 'name', prop: 'name',
rules: [{ required: true, message: '参数名称不能为空', trigger: 'blur' }], rules: [
{ required: true, message: '参数名称不能为空', trigger: 'blur' },
],
}, },
], ],
[ [
@@ -419,35 +423,35 @@ export default {
}, },
// 提交属性表 // 提交属性表
async submitAttrForm() { submitAttrForm() {
this.$refs['attrForm'].validate((valid) => { this.$refs['attrForm'].validate(async (valid) => {
if (!valid) { if (!valid) {
return; return;
} }
}); const isEdit = this.attrForm.id != null;
const isEdit = this.attrForm.id != null; this.attrFormSubmitting = true;
this.attrFormSubmitting = true; const res = await this.$axios({
const res = await this.$axios({ url: isEdit ? this.sections[1].urlUpdate : this.sections[1].urlCreate,
url: isEdit ? this.sections[1].urlUpdate : this.sections[1].urlCreate, method: isEdit ? 'put' : 'post',
method: isEdit ? 'put' : 'post', data: {
data: { ...this.attrForm,
...this.attrForm, connectId: this.infoData.id,
connectId: this.infoData.id
},
});
if (res.code == 0) {
this.closeAttrForm();
this.$message({
message: `${isEdit ? '更新' : '创建'}成功`,
type: 'success',
duration: 1500,
onClose: () => {
this.getAttrList();
}, },
}); });
}
this.attrFormSubmitting = false; if (res.code == 0) {
this.closeAttrForm();
this.$message({
message: `${isEdit ? '更新' : '创建'}成功`,
type: 'success',
duration: 1500,
onClose: () => {
this.getAttrList();
},
});
}
this.attrFormSubmitting = false;
});
}, },
closeAttrForm() { closeAttrForm() {

View File

@@ -2,14 +2,14 @@
* @Author: zwq * @Author: zwq
* @Date: 2021-11-18 14:16:25 * @Date: 2021-11-18 14:16:25
* @LastEditors: DY * @LastEditors: DY
* @LastEditTime: 2023-11-22 11:22:38 * @LastEditTime: 2023-11-27 15:26:12
* @Description: * @Description:
--> -->
<template> <template>
<el-drawer <el-drawer
:visible.sync="visible" :visible.sync="visible"
:show-close="false" :show-close="false"
:wrapper-closable="false" :wrapper-closable="isdetail"
class="drawer" class="drawer"
size="60%"> size="60%">
<small-title slot="title" :no-padding="true"> <small-title slot="title" :no-padding="true">
@@ -120,6 +120,7 @@
</el-row> </el-row>
</el-form> </el-form>
</div> </div>
<div class="attr-list" v-if="idAttrShow"> <div class="attr-list" v-if="idAttrShow">
<small-title <small-title
style="margin: 16px 0; padding-left: 8px" style="margin: 16px 0; padding-left: 8px"
@@ -156,13 +157,11 @@
@pagination="getList" /> @pagination="getList" />
</div> </div>
<div class="drawer-body__footer"> <div v-if="!isdetail" class="drawer-body__footer">
<el-button style="" @click="goback()">{{ isdetail ? '关闭' : '取消' }}</el-button> <el-button style="" @click="goback()">取消</el-button>
<!-- <el-button v-if="isdetail" type="primary" @click="goEdit()"> <el-button type="primary" @click="dataFormSubmit()">确定</el-button>
编辑
</el-button> -->
<el-button v-if="!isdetail" type="primary" @click="dataFormSubmit()">确定</el-button>
</div> </div>
</div> </div>
<attr-add <attr-add
@@ -293,11 +292,7 @@ export default {
handleClick(raw) { handleClick(raw) {
if (raw.type === 'delete') { if (raw.type === 'delete') {
this.$confirm( this.$confirm(
`确定对${ `是否确认删除属性名为"${raw.data.attrName}"的数据项?`,
raw.data.attrName
? '[名称=' + raw.data.attrName + ']'
: '[序号=' + raw.data._pageIndex + ']'
}进行删除操作?`,
'提示', '提示',
{ {
confirmButtonText: '确定', confirmButtonText: '确定',
@@ -363,6 +358,29 @@ export default {
} }
}); });
}, },
// 表单提交
dataFormSubmit() {
this.$refs["dataForm"].validate((valid) => {
if (!valid) {
return false;
}
// 修改的提交
if (this.dataForm.id) {
this.urlOptions.updateURL(this.dataForm).then(response => {
this.$modal.msgSuccess("修改成功");
this.visible = false
this.$emit("refreshDataList");
});
return;
}
// 添加的提交
this.urlOptions.createURL(this.dataForm).then(response => {
this.$modal.msgSuccess("新增成功");
this.idAttrShow = true
this.$emit("refreshDataList");
});
});
},
goback() { goback() {
this.$emit('refreshDataList'); this.$emit('refreshDataList');
this.visible = false; this.visible = false;
@@ -432,7 +450,7 @@ export default {
} }
.action_btn { .action_btn {
float: right; float: right;
margin: -35px 15px; margin: -40px 15px;
font-size: 14px; font-size: 14px;
} }
.add { .add {

View File

@@ -1,7 +1,7 @@
<template> <template>
<el-dialog <el-dialog
:visible.sync="visible" :visible.sync="visible"
:width="'35%'" :width="'30%'"
:append-to-body="true" :append-to-body="true"
:close-on-click-modal="false" :close-on-click-modal="false"
class="dialog"> class="dialog">
@@ -17,7 +17,7 @@
ref="dataForm" ref="dataForm"
:model="dataForm" :model="dataForm"
:rules="dataRule" :rules="dataRule"
label-width="100px" label-width="70px"
@keyup.enter.native="dataFormSubmit()"> @keyup.enter.native="dataFormSubmit()">
<el-form-item label="属性名" prop="attrName"> <el-form-item label="属性名" prop="attrName">
<el-input <el-input

View File

@@ -13,7 +13,7 @@
<method-btn <method-btn
v-if="tableBtn.length" v-if="tableBtn.length"
slot="handleBtn" slot="handleBtn"
:width="220" :width="120"
label="操作" label="操作"
:method-list="tableBtn" :method-list="tableBtn"
@clickBtn="handleClick" /> @clickBtn="handleClick" />
@@ -85,25 +85,25 @@ export default {
}, },
tableProps, tableProps,
tableBtn: [ tableBtn: [
this.$auth.hasPermi(`base:material:queryAttr`)
? {
type: 'detail',
btnName: '查看属性',
}
: undefined,
this.$auth.hasPermi(`base:material:update`) this.$auth.hasPermi(`base:material:update`)
? { ? {
type: 'edit', type: 'edit',
btnName: '编辑', btnName: '编辑',
} }
: undefined, : undefined,
this.$auth.hasPermi(`base:material:queryAttr`) // this.$auth.hasPermi(`base:material:editAttr`)
? { // ? {
type: 'search', // type: 'editAttr',
btnName: '查看属性', // btnName: '编辑属性',
} // }
: undefined, // : undefined,
this.$auth.hasPermi(`base:material:editAttr`) this.$auth.hasPermi(`base:material:delete`)
? {
type: 'editAttr',
btnName: '编辑属性',
}
: undefined,
this.$auth.hasPermi(`base:material:delete`)
? { ? {
type: 'delete', type: 'delete',
btnName: '删除', btnName: '删除',
@@ -136,7 +136,7 @@ export default {
}, },
{ {
type: this.$auth.hasPermi('base:material:create') ? 'button' : '', type: this.$auth.hasPermi('base:material:create') ? 'button' : '',
btnName: '新增物料', btnName: '新增',
name: 'add', name: 'add',
color: 'success', color: 'success',
plain: true plain: true
@@ -166,7 +166,7 @@ export default {
}); });
}, },
otherMethods(val) { otherMethods(val) {
if (val.type === 'search') { if (val.type === 'detail') {
this.addOrUpdateVisible = true; this.addOrUpdateVisible = true;
this.addOrEditTitle = '详情'; this.addOrEditTitle = '详情';
this.$nextTick(() => { this.$nextTick(() => {

View File

@@ -2,7 +2,7 @@
* @Author: zwq * @Author: zwq
* @Date: 2021-11-18 14:16:25 * @Date: 2021-11-18 14:16:25
* @LastEditors: DY * @LastEditors: DY
* @LastEditTime: 2023-11-06 19:55:59 * @LastEditTime: 2023-11-27 15:10:20
* @Description: * @Description:
--> -->
<template> <template>
@@ -18,7 +18,8 @@
<el-select <el-select
v-model="dataForm.materialId" v-model="dataForm.materialId"
placeholder="请选择物料" placeholder="请选择物料"
@change="setMaterialCode"> @change="setMaterialCode"
style="width: 100%">
<el-option <el-option
v-for="dict in materialList" v-for="dict in materialList"
:key="dict.id" :key="dict.id"

View File

@@ -29,7 +29,7 @@
@cancel="handleCancel" @cancel="handleCancel"
@confirm="handleConfirm" @confirm="handleConfirm"
:before-close="handleCancel" :before-close="handleCancel"
width="50%"> width="40%">
<add-or-update <add-or-update
ref="addOrUpdate" ref="addOrUpdate"
@refreshDataList="successSubmit"></add-or-update> @refreshDataList="successSubmit"></add-or-update>

View File

@@ -2,14 +2,14 @@
* @Author: zwq * @Author: zwq
* @Date: 2021-11-18 14:16:25 * @Date: 2021-11-18 14:16:25
* @LastEditors: DY * @LastEditors: DY
* @LastEditTime: 2023-11-23 15:00:00 * @LastEditTime: 2023-11-27 19:50:36
* @Description: * @Description:
--> -->
<template> <template>
<el-drawer <el-drawer
:visible.sync="visible" :visible.sync="visible"
:show-close="false" :show-close="false"
:wrapper-closable="false" :wrapper-closable="isdetail"
class="drawer" class="drawer"
size="70%"> size="70%">
<small-title slot="title" :no-padding="true"> <small-title slot="title" :no-padding="true">
@@ -25,7 +25,7 @@
label-width="100px" label-width="100px"
label-position="top"> label-position="top">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="8">
<el-form-item label="产品名称" prop="productId"> <el-form-item label="产品名称" prop="productId">
<el-select <el-select
v-model="dataForm.productId" v-model="dataForm.productId"
@@ -42,15 +42,17 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="8">
<el-form-item label="产品BOM编码" prop="code"> <el-form-item label="产品BOM编码" prop="code">
<el-input v-model="dataForm.code" :disabled="isdetail" placeholder="请输入产品Bom编码" /> <el-input v-model="dataForm.code" :disabled="isdetail" placeholder="请输入产品Bom编码" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8">
<el-form-item label="备注" prop="remark">
<el-input v-model="dataForm.remark" :disabled="isdetail" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row> </el-row>
<el-form-item label="备注" prop="remark">
<el-input v-model="dataForm.remark" :disabled="isdetail" clearable placeholder="请输入备注" />
</el-form-item>
</el-form> </el-form>
</div> </div>
<div class="attr-list" v-if="idAttrShow"> <div class="attr-list" v-if="idAttrShow">
@@ -60,90 +62,26 @@
BOM明细 BOM明细
</small-title> </small-title>
<!-- <base-table <div v-if="!isdetail" class="action_btn">
<template>
<span style="display: inline-block;">
<el-button type="text" @click="addNew()" icon="el-icon-plus">添加</el-button>
</span>
</template>
</div>
<base-table
:table-props="tableProps" :table-props="tableProps"
:page="listQuery.pageNo" :page="listQuery.pageNo"
:limit="listQuery.pageSize" :limit="listQuery.pageSize"
:add-button-show="isdetail ? null : '添加属性'" :table-data="tableData">
@emitButtonClick="addNew()"
:table-data="materialAttrList">
<method-btn <method-btn
v-if="!isdetail" v-if="!isdetail"
slot="handleBtn" slot="handleBtn"
:width="120" :width="90"
label="操作" label="操作"
:method-list="tableBtn" :method-list="tableBtn"
@clickBtn="handleClick" /> @clickBtn="handleClick" />
</base-table> --> </base-table>
<el-button v-show="!isdetail" type="success" size="small" style="float: right" @click="addRow()">添加一行</el-button>
<el-table
:data="tableData"
style="width: 100%">
<el-table-column type="index" label="序号" />
<el-table-column prop="createTime" label="添加时间">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column prop="materialId" label="物料名称">
<template slot-scope="scope">
<el-select
v-model="scope.row.materialId"
filterable
clearable
:disabled="!scope.row.isEdit"
placeholder="请选择物料"
@change="setCode(scope.row)">
<el-option
v-for="dict in materialList"
:key="dict.id"
:label="dict.name"
:value="dict.id" />
</el-select>
</template>
</el-table-column>
<el-table-column prop="materialCode" label="物料编码" />
<el-table-column prop="mUnit" label="单位" />
<el-table-column prop="num" label="数量">
<template slot-scope="scope">
<el-input v-model="scope.row.num" :disabled="!scope.row.isEdit"></el-input>
</template>
</el-table-column>
<el-table-column prop="remark" label="备注">
<template slot-scope="scope">
<el-input v-model="scope.row.remark" :disabled="!scope.row.isEdit"></el-input>
</template>
</el-table-column>
<el-table-column v-if="!isdetail" label="操作">
<template slot-scope="scope">
<el-tooltip v-if="!scope.row.isEdit" placement="top" content="编辑">
<el-button
type="text"
:style="{color:'#0B58FF'}"
size="mini"
@click="edit(scope.row)"
>
<!-- 此处的icon的名字命名为'table_'加上按钮的type -->
<svg-icon style="width: 18px; height: 18px" class="item-icon" icon-class="edit" />
<!-- <span>{{ item.btnName | i18nFilter }}</span> -->
</el-button>
</el-tooltip>
<el-button v-else type="text" size="small" @click="saveData(scope.row)">保存</el-button>
<el-tooltip placement="top" content="删除">
<el-button
type="text"
:style="{color:'#FF5454'}"
size="mini"
@click="deleteDetail(scope.row)"
>
<!-- 此处的icon的名字命名为'table_'加上按钮的type -->
<svg-icon style="width: 18px; height: 18px" class="item-icon" icon-class="table_delete" />
<!-- <span>{{ item.btnName | i18nFilter }}</span> -->
</el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination <pagination
v-show="listQuery.total > 0" v-show="listQuery.total > 0"
:total="listQuery.total" :total="listQuery.total"
@@ -153,20 +91,17 @@
@pagination="getList" /> @pagination="getList" />
</div> </div>
<div class="drawer-body__footer"> <div v-if="!isdetail" class="drawer-body__footer">
<el-button style="" @click="goback()">{{ isdetail ? '关闭' : '取消' }}</el-button> <el-button style="" @click="goback()">取消</el-button>
<!-- <el-button v-if="isdetail" type="primary" @click="goEdit()"> <el-button type="primary" @click="dataFormSubmit()">确定</el-button>
编辑
</el-button> -->
<el-button v-if="!isdetail" type="primary" @click="dataFormSubmit()">确定</el-button>
</div> </div>
</div> </div>
<!-- <attr-add <attr-add
v-if="addOrUpdateVisible" v-if="addOrUpdateVisible"
ref="addOrUpdate" ref="addOrUpdate"
:material-id="dataForm.id" :bom-id="dataForm.id"
@refreshDataList="getList" /> --> @refreshDataList="getList" />
</el-drawer> </el-drawer>
</template> </template>
@@ -177,7 +112,8 @@ import { getMaterialList } from "@/api/base/material";
import { listData } from "@/api/system/dict/data"; import { listData } from "@/api/system/dict/data";
import SmallTitle from '../material/SmallTitle'; import SmallTitle from '../material/SmallTitle';
import { parseTime } from '../../core/mixins/code-filter'; import { parseTime } from '../../core/mixins/code-filter';
// import attrAdd from './attr-add'; import attrAdd from './attr-add';
import { publicFormatter } from '@/utils/dict';
const tableBtn = [ const tableBtn = [
{ {
@@ -196,18 +132,31 @@ const tableProps = [
filter: parseTime, filter: parseTime,
}, },
{ {
prop: 'attrName', prop: 'materialName',
label: '属性名', label: '物料名称',
}, },
{ {
prop: 'attrValue', prop: 'materialCode',
label: '属性值', label: '物料编码',
}, },
{
prop: 'unit',
label: '单位',
filter: publicFormatter('unit_dict'),
},
{
prop: 'num',
label: '数量',
},
{
prop: 'remark',
label: '备注',
}
]; ];
export default { export default {
mixins: [basicAdd], mixins: [basicAdd],
components: { SmallTitle }, components: { SmallTitle, attrAdd },
data() { data() {
return { return {
tableBtn, tableBtn,
@@ -233,7 +182,6 @@ export default {
}, },
productList: [], productList: [],
materialAttrList: [], materialAttrList: [],
materialList: [],
tableData: [], tableData: [],
unitList: [], unitList: [],
visible: false, visible: false,
@@ -248,13 +196,42 @@ export default {
this.getDict() this.getDict()
}, },
methods: { methods: {
handleClick(raw) {
if (raw.type === 'delete') {
this.deleteDetail(raw.data);
} else {
this.addNew(raw.data.id);
}
},
// 表单提交
dataFormSubmit() {
this.$refs["dataForm"].validate((valid) => {
if (!valid) {
return false;
}
// 修改的提交
if (this.dataForm.id) {
this.urlOptions.updateURL(this.dataForm).then(response => {
this.$modal.msgSuccess("修改成功");
this.visible = false;
this.$emit("refreshDataList");
});
return;
}
// 添加的提交
this.urlOptions.createURL(this.dataForm).then(response => {
this.$modal.msgSuccess("新增成功");
// this.visible = false;
this.idAttrShow = true;
this.dataForm.id = response.data
this.$emit("refreshDataList");
});
});
},
async getDict() { async getDict() {
// 产品列表 // 产品列表
const proRes = await getProList(); const proRes = await getProList();
this.productList = proRes.data; this.productList = proRes.data;
// 物料列表
const res = await getMaterialList();
this.materialList = res.data;
// 物料单位列表 // 物料单位列表
const unitRes = await listData({ const unitRes = await listData({
pageNo: 1, pageNo: 1,
@@ -274,8 +251,7 @@ export default {
}, },
deleteDetail(raw) { deleteDetail(raw) {
this.$confirm( this.$confirm(
`确定删除关于物料编码为${ `是否确认删除物料名称为"${raw.materialName}"的数据项?`,
raw.materialCode}的数据?`,
'提示', '提示',
{ {
confirmButtonText: '确定', confirmButtonText: '确定',
@@ -297,70 +273,13 @@ export default {
}) })
.catch(() => {}); .catch(() => {});
}, },
setCode(row) {
const tempM = this.materialList.filter(item => {
if (row.materialId === item.id) {
row.materialCode = item.code
}
return row.materialId === item.id
})
if (tempM[0].unit) {
this.unitList.filter(u => {
if (tempM[0].unit === u.value) {
row.unit = u.value
row.mUnit = u.label
}
})
} else {
row.unit = null
row.mUnit = ''
}
// row.materialCode = tempList[0].code
// row.unit = tempList[0].unit
},
edit(row) {
row.isEdit = true
},
saveData(row) {
// this.$refs['dataForm'].validate((valid) => {
// if (valid) {
// 修改的提交
if (row.id) {
updateMaterialPBDet({
...row
}).then((response) => {
this.$modal.msgSuccess('修改成功');
// this.visible = false;
this.getList();
});
return;
}
// 添加的提交
createMaterialPBDet({
...row
}).then((response) => {
this.$modal.msgSuccess('新增成功');
// this.visible = false;
this.getList();
});
// }
// });
},
getList() { getList() {
// 获取产品Bom详细列表 // 获取产品Bom详细列表
getProBomList({ getProBomList({
...this.listQuery, ...this.listQuery,
bomId: this.dataForm.id bomId: this.dataForm.id
}).then((response) => { }).then((response) => {
this.tableData = response.data.records.map(item => { this.tableData = response.data.records
this.unitList.filter(u => {
if (item.unit === u.value) {
item.mUnit = u.label
}
})
item.isEdit = false
return item
});
this.listQuery.total = response.data.total; this.listQuery.total = response.data.total;
}); });
}, },
@@ -456,7 +375,7 @@ export default {
.drawer >>> .visual-part { .drawer >>> .visual-part {
flex: 1 auto; flex: 1 auto;
max-height: 30vh; max-height: 20vh;
overflow: hidden; overflow: hidden;
overflow-y: scroll; overflow-y: scroll;
padding-right: 10px; /* 调整滚动条样式 */ padding-right: 10px; /* 调整滚动条样式 */
@@ -472,4 +391,12 @@ export default {
justify-content: flex-end; justify-content: flex-end;
padding: 18px; padding: 18px;
} }
.action_btn {
float: right;
margin: -40px 15px;
font-size: 14px;
}
.add {
color: #0b58ff;
}
</style> </style>

View File

@@ -0,0 +1,197 @@
<template>
<el-dialog
:visible.sync="visible"
:width="'40%'"
:append-to-body="true"
:close-on-click-modal="false"
class="dialog">
<template #title>
<slot name="title">
<div class="titleStyle">
{{ !dataForm.id ? '新增' : '编辑' }}
</div>
</slot>
</template>
<el-form
ref="dataForm"
:model="dataForm"
:rules="dataRule"
label-width="80px"
@keyup.enter.native="dataFormSubmit()">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="物料名称" prop="materialId">
<el-select
v-model="dataForm.materialId"
placeholder="请选择物料"
clearable
filterable
@change="setCode"
style="width: 100%"
>
<el-option
v-for="dict in materialList"
:key="dict.id"
:label="dict.name"
:value="dict.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="物料编码" prop="materialCode">
<el-input
v-model="dataForm.materialCode"
clearable
disabled
placeholder="请输入物料编码" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="单位" prop="unit">
<el-select
v-model="dataForm.unit"
style="width: 100%"
disabled
placeholder="请选择单位">
<el-option
v-for="dict in getDictDatas(DICT_TYPE.UNIT_DICT)"
:key="dict.value"
:label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="数量" prop="num">
<el-input-number v-model="dataForm.num" controls-position="right" clearable placeholder="请输入数量" style="width: 100%" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="备注" prop="remark">
<el-input v-model="dataForm.remark" clearable placeholder="请输入备注" />
</el-form-item>
</el-form>
<el-row style="text-align: right">
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="dataFormSubmit()">确定</el-button>
</el-row>
</el-dialog>
</template>
<script>
import { getMaterialList } from '@/api/base/material';
import { createMaterialPBDet, updateMaterialPBDet, getMaterialPBDet } from "@/api/base/materialProductBom";
export default {
props: {
bomId: {
type: String,
default: '',
},
},
data() {
return {
visible: false,
dataForm: {
id: undefined,
materialId: '',
num: 0,
materialCode: undefined,
unit: undefined,
remark: '',
},
materialList: [],
dataRule: {
materialId: [{ required: true, message: '物料名称不能为空', trigger: 'change' }],
num: [{ required: true, message: '数量不能为空', trigger: 'blur' }]
},
};
},
mounted() {
this.getDict()
},
methods: {
async getDict() {
// 物料列表
const res = await getMaterialList();
this.materialList = res.data;
},
init(id) {
this.dataForm.id = id || '';
this.visible = true;
this.$nextTick(() => {
this.$refs['dataForm'].resetFields();
if (this.dataForm.id) {
getMaterialPBDet(this.dataForm.id).then((res) => {
this.dataForm = res.data
this.setCode()
});
}
});
},
setCode() {
const tempMaterial = this.materialList.filter(item =>{
return item.id === this.dataForm.materialId
})
this.dataForm.materialCode = tempMaterial[0]?.code
this.dataForm.unit = tempMaterial[0].unit === undefined ? undefined : String(tempMaterial[0]?.unit)
},
// 表单提交
dataFormSubmit() {
this.$refs['dataForm'].validate((valid) => {
if (valid) {
// 修改的提交
if (this.dataForm.id) {
updateMaterialPBDet({
...this.dataForm,
bomId: this.bomId,
}).then((response) => {
this.$modal.msgSuccess('修改成功');
this.visible = false;
this.$emit('refreshDataList');
});
return;
}
// 添加的提交
createMaterialPBDet({
...this.dataForm,
bomId: this.bomId,
}).then((response) => {
this.$modal.msgSuccess('新增成功');
this.visible = false;
this.$emit('refreshDataList');
});
}
});
},
},
};
</script>
<style scoped>
.dialog >>> .el-dialog__body {
padding: 30px 24px;
}
.dialog >>> .el-dialog__header {
font-size: 16px;
color: rgba(0, 0, 0, 0.85);
font-weight: 500;
padding: 13px 24px;
border-bottom: 1px solid #e9e9e9;
}
.dialog >>> .el-dialog__header .titleStyle::before {
content: '';
display: inline-block;
width: 4px;
height: 16px;
background-color: #0b58ff;
border-radius: 1px;
margin-right: 8px;
position: relative;
top: 2px;
}
</style>

View File

@@ -13,7 +13,7 @@
<method-btn <method-btn
v-if="tableBtn.length" v-if="tableBtn.length"
slot="handleBtn" slot="handleBtn"
:width="220" :width="120"
label="操作" label="操作"
:method-list="tableBtn" :method-list="tableBtn"
@clickBtn="handleClick" /> @clickBtn="handleClick" />
@@ -68,24 +68,24 @@ export default {
}, },
tableProps, tableProps,
tableBtn: [ tableBtn: [
this.$auth.hasPermi(`base:material-product-bom:update`) this.$auth.hasPermi(`base:material-product-bom:queryMaterial`)
? {
type: 'detail',
btnName: '查看物料',
}
: undefined,
this.$auth.hasPermi(`base:material-product-bom:update`)
? { ? {
type: 'edit', type: 'edit',
btnName: '编辑', btnName: '编辑',
} }
: undefined, : undefined,
this.$auth.hasPermi(`base:material-product-bom:queryMaterial`) // this.$auth.hasPermi(`base:material-product-bom:editMaterial`)
? { // ? {
type: 'search', // type: 'editMaterial',
btnName: '查看物料', // btnName: '编辑物料',
} // }
: undefined, // : undefined,
this.$auth.hasPermi(`base:material-product-bom:editMaterial`)
? {
type: 'editMaterial',
btnName: '编辑物料',
}
: undefined,
this.$auth.hasPermi(`base:material-product-bom:delete`) this.$auth.hasPermi(`base:material-product-bom:delete`)
? { ? {
type: 'delete', type: 'delete',
@@ -123,7 +123,7 @@ export default {
created() {}, created() {},
methods: { methods: {
otherMethods(val) { otherMethods(val) {
if (val.type === 'search') { if (val.type === 'detail') {
this.addOrUpdateVisible = true; this.addOrUpdateVisible = true;
this.addOrEditTitle = '详情'; this.addOrEditTitle = '详情';
this.$nextTick(() => { this.$nextTick(() => {

View File

@@ -2,7 +2,7 @@
* @Author: zwq * @Author: zwq
* @Date: 2021-11-18 14:16:25 * @Date: 2021-11-18 14:16:25
* @LastEditors: DY * @LastEditors: DY
* @LastEditTime: 2023-11-22 10:40:08 * @LastEditTime: 2023-11-27 19:57:23
* @Description: * @Description:
--> -->
<template> <template>
@@ -11,9 +11,10 @@
:rules="dataRule" :rules="dataRule"
ref="dataForm" ref="dataForm"
@keyup.enter.native="dataFormSubmit()" @keyup.enter.native="dataFormSubmit()"
label-width="80px"> label-width="80px"
label-position="top">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="8">
<el-form-item label="物料名称" prop="materialId"> <el-form-item label="物料名称" prop="materialId">
<el-select <el-select
v-model="dataForm.materialId" v-model="dataForm.materialId"
@@ -21,6 +22,7 @@
clearable clearable
filterable filterable
@change="setCode" @change="setCode"
style="width: 100%"
> >
<el-option <el-option
v-for="dict in materialList" v-for="dict in materialList"
@@ -30,7 +32,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="8">
<el-form-item label="物料编码" prop="materialCode"> <el-form-item label="物料编码" prop="materialCode">
<el-input <el-input
v-model="dataForm.materialCode" v-model="dataForm.materialCode"
@@ -39,15 +41,14 @@
placeholder="请输入物料编码" /> placeholder="请输入物料编码" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> <el-col :span="8">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="批次号" prop="materialDateId"> <el-form-item label="批次号" prop="materialDateId">
<el-select <el-select
v-model="dataForm.materialDateId" v-model="dataForm.materialDateId"
clearable clearable
filterable filterable
placeholder="请选择物料批次" placeholder="请选择物料批次"
style="width: 100%"
> >
<el-option <el-option
v-for="dict in materialDateList" v-for="dict in materialDateList"
@@ -57,13 +58,16 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> </el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="使用设备" prop="equipmentId"> <el-form-item label="使用设备" prop="equipmentId">
<el-select <el-select
v-model="dataForm.equipmentId" v-model="dataForm.equipmentId"
clearable clearable
filterable filterable
placeholder="请选择使用设备"> placeholder="请选择使用设备"
style="width: 100%">
<el-option <el-option
v-for="dict in eqList" v-for="dict in eqList"
:key="dict.id" :key="dict.id"
@@ -72,9 +76,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> <el-col :span="8">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="使用时间" prop="useTime"> <el-form-item label="使用时间" prop="useTime">
<el-date-picker <el-date-picker
v-model="dataForm.useTime" v-model="dataForm.useTime"
@@ -84,14 +86,15 @@
placeholder="选择日期时间" /> placeholder="选择日期时间" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="8">
<el-form-item label="操作员" prop="userNames"> <el-form-item label="操作员" prop="userNames">
<el-select <el-select
v-model="dataForm.userNames" v-model="dataForm.userNames"
clearable clearable
filterable filterable
multiple multiple
placeholder="请选择操作员"> placeholder="请选择操作员"
style="width: 100%">
<el-option <el-option
v-for="dict in workersList" v-for="dict in workersList"
:key="dict.id" :key="dict.id"
@@ -102,12 +105,12 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="8">
<el-form-item label="使用数量" prop="num"> <el-form-item label="使用数量" prop="num">
<el-input-number v-model="dataForm.num" clearable placeholder="请输入使用数量" /> <el-input-number v-model="dataForm.num" clearable controls-position="right" placeholder="请输入使用数量" style="width: 100%" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="8">
<el-form-item label="数据来源" prop="source"> <el-form-item label="数据来源" prop="source">
<el-select <el-select
v-model="dataForm.source" v-model="dataForm.source"
@@ -121,10 +124,12 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8">
<el-form-item label="备注" prop="remark">
<el-input v-model="dataForm.remark" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row> </el-row>
<el-form-item label="备注" prop="remark">
<el-input v-model="dataForm.remark" clearable placeholder="请输入备注" />
</el-form-item>
</el-form> </el-form>
</template> </template>
@@ -237,13 +242,8 @@ export default {
this.dataForm.source = response.data.source this.dataForm.source = response.data.source
this.dataForm.remark = response.data.remark this.dataForm.remark = response.data.remark
this.dataForm.userNames = response.data.userName.split(',') this.dataForm.userNames = response.data.userName.split(',')
console.log('打印', this.dataForm)
}); });
} else { } else {}
if (this.urlOptions.isGetCode) {
this.getCode()
}
}
}); });
}, },
setCode() { setCode() {

View File

@@ -29,7 +29,7 @@
@cancel="handleCancel" @cancel="handleCancel"
@confirm="handleConfirm" @confirm="handleConfirm"
:before-close="handleCancel" :before-close="handleCancel"
width="50%"> width="60%">
<add-or-update <add-or-update
ref="addOrUpdate" ref="addOrUpdate"
@refreshDataList="successSubmit"></add-or-update> @refreshDataList="successSubmit"></add-or-update>

View File

@@ -2,7 +2,7 @@
* @Author: zwq * @Author: zwq
* @Date: 2022-08-24 11:19:43 * @Date: 2022-08-24 11:19:43
* @LastEditors: zhp * @LastEditors: zhp
* @LastEditTime: 2023-11-01 10:30:12 * @LastEditTime: 2023-11-24 09:29:36
* @Description: * @Description:
*/ */
export default { export default {
@@ -85,6 +85,7 @@ export default {
}, },
//tableBtn点击 //tableBtn点击
handleClick(val) { handleClick(val) {
console.log(val.data.packagingCode);
if (val.type === "edit") { if (val.type === "edit") {
this.addOrUpdateVisible = true; this.addOrUpdateVisible = true;
this.addOrEditTitle = "编辑"; this.addOrEditTitle = "编辑";
@@ -92,7 +93,7 @@ export default {
this.$refs.addOrUpdate.init(val.data.id); this.$refs.addOrUpdate.init(val.data.id);
}); });
} else if (val.type === "delete") { } else if (val.type === "delete") {
this.deleteHandle(val.data.id, val.data.name, val.data._pageIndex) this.deleteHandle(val.data.id, val.data.name, val.data._pageIndex,val.data.packagingCode )
} else if (val.type === "change") { } else if (val.type === "change") {
this.changeStatus(val.data.id) this.changeStatus(val.data.id)
} else { } else {
@@ -101,7 +102,7 @@ export default {
}, },
// 删除 // 删除
deleteHandle(id, name, index) { deleteHandle(id, name, index) {
this.$confirm(`是否确认删除${name ? '[' + name + ']' : '[' + index + ']'}数据项?`, "提示", { this.$confirm(`是否确认删除${name ? ' 名称为'+ name : '[' + index + ']'}数据项?`, "提示", {
confirmButtonText: "确定", confirmButtonText: "确定",
cancelButtonText: "取消", cancelButtonText: "取消",
type: "warning", type: "warning",

View File

@@ -2,7 +2,7 @@
* @Author: zwq * @Author: zwq
* @Date: 2023-08-01 14:55:51 * @Date: 2023-08-01 14:55:51
* @LastEditors: zhp * @LastEditors: zhp
* @LastEditTime: 2023-11-22 14:40:59 * @LastEditTime: 2023-11-24 09:13:50
* @Description: * @Description:
--> -->
<template> <template>
@@ -122,7 +122,8 @@ export default {
selectOptions: [], selectOptions: [],
labelField: 'name', labelField: 'name',
valueField: 'id', valueField: 'id',
param: 'workOrderId' param: 'workOrderId',
filterable: true,
}, },
{ {
// parent: 'dateFilterType', // parent: 'dateFilterType',
@@ -214,6 +215,26 @@ export default {
// this.listQuery.total = response.data.total; // this.listQuery.total = response.data.total;
}) })
}, },
deleteHandle(id, name, index, packagingCode) {
this.$confirm(`是否确认删除${'[' + packagingCode + ']'}数据项?`, "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
this.urlOptions.deleteURL(id).then(({ data }) => {
this.$message({
message: "操作成功",
type: "success",
duration: 1500,
onClose: () => {
this.getDataList();
},
});
});
})
.catch(() => { });
},
handlePrint(id) { handlePrint(id) {
if (id) { if (id) {
getPackingModel(id).then(res => { getPackingModel(id).then(res => {

View File

@@ -0,0 +1,228 @@
<!--
filename: chart.vue
author: liubin
date: 2023-11-29 09:03:01
description:
-->
<template>
<div class="analysis-chart">
<!-- tt ct 选择 -->
<el-button
v-for="(item, index) in ['设备CT', '设备TT', '产线CT', '产线TT']"
:key="index"
:class="[index == activeIndex ? 'activeButton' : '']"
@click="activeIndex = index">
{{ item }}
</el-button>
<!-- chart -->
<div id="chart" ref="chartDiv" class="chart" style="margin-top: 12px" />
</div>
</template>
<script>
import * as echarts from 'echarts';
export default {
name: 'AnalysisChart',
components: {},
props: ['daterange', 'tableData'],
data() {
return {
activeIndex: 0,
chart: null,
templateOption: {
tooltip: {
trigger: 'axis',
},
legend: {
icon: 'roundRect',
itemWidth: 12,
itemHeight: 12,
},
grid: {
top: '12%',
left: '6%',
right: '6%',
bottom: '12%',
},
xAxis: {
name: '时间',
axisLabel: {
margin: 12,
rotate: -8,
},
axisTicks: {
show: false,
},
data: this.daterange || [
'2020-01-02',
'2020-02-02',
'2020-03-02',
'2020-04-02',
],
},
yAxis: {
name: ['设备CT', '设备TT', '产线CT', '产线TT'][this.activeIndex],
nameLocation: 'end',
nameGap: 28,
nameTextStyle: {
fontSize: 14,
align: 'right',
},
axisLine: {
show: true,
lineStyle: {
color: '#333',
opacity: 0.6,
},
},
},
series: [
{
name: 'der Hund',
type: 'line',
data: [15, undefined, 36, 11],
},
{
name: 'die Katze',
type: 'line',
data: [5, 2, 6, 3],
},
{
name: 'die Maus',
type: 'line',
data: [11, 12, 13, 10],
},
],
},
};
},
mounted() {
this.initChart();
},
deactivated() {},
watch: {
activeIndex(val) {
this.initChart(val);
},
},
methods: {
/**
*
* @param {object} row 表格的每一列
* @param {string} key 表格列prop的后缀
*/
getListFromTableRow(row, key = '_eq_ct') {
const list = [];
for (const prop of Object.keys(row).sort()) {
if (prop.endsWith(key)) {
list.push(row[prop]);
}
}
return list;
},
/** 初始化/设置 图表 */
initChart(val) {
console.log('tableData', this.tableData);
if (!this.chart) this.chart = echarts.init(this.$refs.chartDiv);
switch (val) {
case 0:
const eqCt = this.tableData.map((row) => ({
name: row.equName,
type: 'line',
symbol: 'circle',
symbolSize: 8,
data: this.getListFromTableRow(row, '_eq_ct'),
}));
this.chart.setOption({
...this.templateOption,
yAxis: { ...this.templateOption.yAxis, name: '设备CT' },
series: eqCt,
});
break;
case 1:
const eqTt = this.tableData.map((row) => ({
name: row.equName,
type: 'line',
symbol: 'circle',
symbolSize: 8,
data: this.getListFromTableRow(row, '_eq_tt'),
}));
this.chart.setOption({
...this.templateOption,
yAxis: { ...this.templateOption.yAxis, name: '设备TT' },
series: eqTt,
});
break;
case 2:
const plCt = this.tableData.map((row) => ({
name: row.equName,
type: 'line',
symbol: 'circle',
symbolSize: 8,
data: this.getListFromTableRow(row, '_pl_ct'),
}));
this.chart.setOption({
...this.templateOption,
yAxis: { ...this.templateOption.yAxis, name: '产线CT' },
series: plCt,
});
break;
case 3:
const plTt = this.tableData.map((row) => ({
name: row.equName,
type: 'line',
symbol: 'circle',
symbolSize: 8,
data: this.getListFromTableRow(row, '_pl_tt'),
}));
this.chart.setOption({
...this.templateOption,
yAxis: { ...this.templateOption.yAxis, name: '产线TT' },
series: plTt,
});
break;
default:
const eqCt2 = this.tableData.map((row) => ({
name: row.equName,
type: 'line',
symbol: 'circle',
symbolSize: 8,
data: this.getListFromTableRow(row, '_eq_ct'),
}));
this.chart.setOption({
...this.templateOption,
yAxis: { ...this.templateOption.yAxis, name: '设备CT' },
series: eqCt2,
});
}
},
},
};
</script>
<style scoped>
.analysis-chart {
width: 100%;
height: 100%;
}
.analysis-chart >>> .el-button {
background: #f1f1f1;
color: #333;
transition: all 0.3s;
border: none;
&.activeButton,
&:hover {
background: #0b58ff;
color: #fff;
}
}
#chart {
height: 100%;
/* background: #ccc; */
}
</style>

View File

@@ -0,0 +1,270 @@
<template>
<div class="app-container">
<search-bar
:formConfigs="formConfig"
ref="searchBarForm"
@headBtnClick="buttonClick" />
<div v-if="tableData.length">
<el-tabs
v-model="activeName"
@tab-click="handleTabClick"
style="height: 100%">
<el-tab-pane :label="'\u2002数据列表\u2002'" name="table">
<!-- @emitFun="handleEmitFun"> -->
<base-table
v-if="mode == 'table'"
:span-method="mergeColumnHandler"
:page="1"
:limit="999"
:table-props="tableProps"
:table-data="tableData" />
</el-tab-pane>
<el-tab-pane :label="'\u3000产线平衡分析图\u3000'" name="graph">
<div class="graph" style="height: 100%">
<!-- graph -->
<!-- <Graph
v-if="list.length"
:equipment-list="list"
:render="renderKey" /> -->
<BalanceChart ref="lineChart" />
<div v-if="list.length == 0" class="no-data-bg"></div>
</div>
</el-tab-pane>
</el-tabs>
<!-- <SearchBar :formConfigs="[{ label: '产线平衡分析图', type: 'title' }]" /> -->
</div>
<div v-else class="no-data-bg"></div>
</div>
</template>
<script>
import { getCT } from '@/api/core/analysis/index';
import { getCorePLList } from '@/api/base/coreProductionLine';
import BalanceChart from '../balanceChart';
export default {
components: {
BalanceChart,
},
// mixins: [basicPage],
data() {
return {
urlOptions: {
getDataListURL: getCT,
},
activeName: 'table',
tableProps: [],
tableData: [],
listQuery: {
// time: ''
endTime: undefined,
lineId: undefined,
startTime: undefined,
},
timeList: [],
spanArr: [],
xData: [],
yData: [],
optionArrUrl: [getCorePLList],
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: {
handleTabClick(tab, event) {
if (tab.name == 'graph') this.renderKey = Math.random();
},
getArr() {
const params = {
page: 1,
limit: 500,
};
this.optionArrUrl.forEach((item, index) => {
item(params).then((response) => {
this.formConfig[index].selectOptions = response.data;
});
});
},
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',
},
];
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, this.yData);
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>

View File

@@ -1,262 +1,454 @@
<template> <template>
<div class="app-container"> <div class="app-container" style="flex: 1; height: 1px">
<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' }]" /> @headBtnClick="handleSearchBarBtnClick" />
<BalanceChart ref="lineChart" />
</div> <!-- <div v-if="tableData.length"> -->
<div v-else class="no-data-bg"></div> <div class="custom-tabs" style="">
<!-- <pagination <el-tabs
:limit.sync="listQuery.pageSize" v-model="activeName"
:page.sync="listQuery.pageNo" @tab-click="handleTabClick"
:total="listQuery.total" style="height: 100%">
@pagination="getDataList" /> --> <el-tab-pane :label="'\u2002数据列表\u2002'" name="table">
</div> <base-table
v-if="activeName == 'table' && ready"
:span-method="mergeRow"
:page="1"
:limit="999"
:table-props="tableProps"
:table-data="tableData" />
<div v-if="tableData.length == 0" class="no-data-bg"></div>
</el-tab-pane>
<el-tab-pane :label="'\u3000产线平衡分析图\u3000'" name="graph">
<div class="graph" style="height: 800px">
<!-- graph -->
<AnalysisChart
v-if="activeName == 'graph'"
:table-data="tableData"
:daterange="dateArr"></AnalysisChart>
<!-- <div v-else class="no-data-bg"></div> -->
<!-- <Graph
v-if="list.length"
:equipment-list="list"
:render="renderKey" /> -->
<!-- <BalanceChart ref="lineChart" /> -->
<!-- <div v-if="list.length == 0" class="no-data-bg"></div> -->
</div>
</el-tab-pane>
</el-tabs>
</div>
</div>
</template> </template>
<script> <script>
// import basicPage from '../../mixins/basic-page'; import BalanceChart from '../balanceChart';
import { parseTime } from '../../mixins/code-filter'; import basicPageMixin from '@/mixins/lb/basicPageMixin';
import { getCT } from '@/api/core/analysis/index'; import AnalysisChart from './chart.vue';
import { getCorePLList } from '@/api/base/coreProductionLine';
import BalanceChart from '../balanceChart'
import { time } from 'echarts';
// 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 { export default {
components: { components: {
BalanceChart BalanceChart,
}, AnalysisChart,
// mixins: [basicPage], },
data() { mixins: [basicPageMixin],
return { data() {
urlOptions: { return {
getDataListURL: getCT, activeName: 'table',
}, tableProps: [
tableProps: [], {
dataListLoading: false, prop: 'sectionName',
tableData: [], label: '工段',
listQuery: { align: 'center',
// time: '' },
endTime: undefined, {
lineId:undefined, prop: 'equName',
startTime:undefined label: '设备',
}, align: 'center',
timeList: [], },
spanArr: [], ],
xData: [], tableData: [],
yData: [], formConfig: [
optionArrUrl: [getCorePLList], {
formConfig: [ type: 'select',
{ label: '产线',
type: 'select', selectOptions: [],
label: '产线', param: 'lineIds',
selectOptions: [], defaultSelect: '',
param: 'lineIds', multiple: false,
defaultSelect: '', filterable: true,
multiple: false, },
filterable: true, {
}, type: 'datePicker',
{ label: '时间',
type: 'datePicker', dateType: 'monthrange',
label: '时间', format: 'yyyy-MM',
dateType: 'datetimerange', valueFormat: 'yyyy-MM-ddTHH:mm:ss',
format: 'yyyy-MM-dd', rangeSeparator: '-',
valueFormat: 'yyyy-MM-dd HH:mm:ss', startPlaceholder: '开始时间',
rangeSeparator: '-', endPlaceholder: '结束时间',
startPlaceholder: '开始时间', width: 240,
endPlaceholder: '结束时间', param: 'timeArr',
width: 350, },
param: 'time', {
}, type: 'button',
{ btnName: '查询',
type: 'button', name: 'search',
btnName: '查询', color: 'primary',
name: 'search', },
color: 'primary', ],
} queryParams: {
], lineId: null,
}; startTime: null,
}, endTime: null,
created() { },
this.getArr(); sectionMap: {},
}, lastSection: null,
methods: { currRowIndex: 0,
getArr() { spanArr: [],
const params = { // 保存时间列表
page: 1, dateArr: [],
limit: 500 ready: false,
} };
this.optionArrUrl.forEach((item, index) => { },
item(params).then((response) => {
this.formConfig[index].selectOptions = response.data mounted() {
}); this.getLine();
}); },
},
setRowSpan(arr) { methods: {
let count = 0 handleTabClick(tab, event) {
arr.forEach((item, index) => { if (tab.name == 'graph') this.renderKey = Math.random();
if(index === 0) { },
this.spanArr.push(1)
} else { /** 初始化 tableProps */
if (item === arr[index - 1]) { initTableProps() {
this.spanArr[count] += 1 this.tableProps = [
this.spanArr.push(0) {
} else { prop: 'sectionName',
count = index label: '工段',
this.spanArr.push(1) align: 'center',
} },
} {
}) prop: 'equName',
}, label: '设备',
/** 合并table列的规则 */ align: 'center',
mergeColumnHandler({ row, column, rowIndex, columnIndex }) { },
if (columnIndex == 0) { ];
if (this.spanArr[rowIndex]) { },
return [
this.spanArr[rowIndex], // row span /** 获取产线 */
1, // col span async getLine() {
]; this.formConfig[0].selectOptions = [];
} else { const { code, data } = await this.http(
return [0, 0]; '/base/core-production-line/listAll',
} 'get'
);
if (code == 0) {
this.formConfig[0].selectOptions = data;
} }
}, },
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, this.yData) /** 获取产线平衡数据 */
this.$nextTick(() => { async getCT() {
this.$refs.lineChart.initChart(this.xData, this.yData) const { code, data } = await this.http(
}) '/analysis/equipment-analysis/getCT',
// this.total = response.data.total; 'post',
// this.dataListLoading = false; this.queryParams
}); );
}, if (code == 0) {
buttonClick(val) { return data;
// console.log(val) }
switch (val.btnName) { return { data: [], nameData: [] };
case 'search': },
// this.listQuery.pageNo = 1;
// this.listQuery.pageSize = 10; /** 解析数据 */
this.listQuery.lineId = val.lineIds async getList() {
this.listQuery.startTime = val.time ? String(new Date(val.time[0]).getTime()) : undefined; const { data, nameData } = await this.getCT();
this.listQuery.endTime = val.time ? String(new Date(val.time[1]).getTime()) : undefined; await this.buildProps(nameData);
if (val.time && val.lineIds) { await this.buildTableData(data);
this.tableData = [] this.tableData = this.tableData.sort((a, b) => {
this.xData = [] if (a.sectionName < b.sectionName) return -1;
this.yData = [] return 1;
this.tableProps = [] });
this.spanArr = [] // const p = this.tableProps
this.timeList = [] // const d = this.tableData
this.getData() // debugger;
} else { this.ready = true;
this.$message({ },
message: '请选择产线和时间',
type: 'warning' buildProps(nameData) {
}); this.initTableProps();
} this.dateArr = [];
break; return new Promise((resolve, reject) => {
case 'reset': try {
this.$refs.searchBarForm.resetForm(); const dateArr = Array.from(
this.listQuery = { new Set(
pageSize: 10, nameData
pageNo: 1, .map((item) => (item.tree == 1 ? item.name : undefined))
total: 1, .filter((v) => v)
}; )
this.getDataList(); );
break; // 排个序
default: dateArr.sort().forEach((date) => {
console.log(val); this.tableProps.push({
} label: date,
}, align: 'center',
}, children: [
{
prop: date + '_eq_ct',
label: '设备CT',
align: 'center',
},
{
prop: date + '_eq_tt',
label: '设备TT',
align: 'center',
},
{
prop: date + '_pl_ct',
label: '产线CT',
align: 'center',
},
{
prop: date + '_pl_tt',
label: '产线TT',
align: 'center',
},
],
});
});
this.dateArr = dateArr;
resolve();
} catch (err) {
reject(err);
}
});
},
async buildTableData(data) {
this.tableData = [];
const sectionArr = Array.from(
new Set(data.map((item) => item.sectionName))
).sort();
const sectionMap = sectionArr.reduce(
(sum, curr) => ({ ...sum, [curr]: 0 }),
{}
);
console.log('sectionArr', sectionArr);
console.log('sectionMap', sectionMap);
let spanArr = Array.from(sectionArr, () => 0);
return new Promise((resolve, reject) => {
/** 处理 工段 分组 */
data.map((item) => {
sectionMap[item.sectionName]++;
/** 处理 设备 */
const row = {
equName: item.equName,
sectionName: item.sectionName,
};
item.data.forEach((eq) => {
const date = eq.dynamicName;
eq.children.forEach((sub) => {
if (sub.dynamicName == '设备CT')
row[date + '_eq_ct'] = sub.dynamicValue;
if (sub.dynamicName == '设备TT')
row[date + '_eq_tt'] = sub.dynamicValue;
if (sub.dynamicName == '产线CT')
row[date + '_pl_ct'] = sub.dynamicValue;
if (sub.dynamicName == '产线TT')
row[date + '_pl_tt'] = sub.dynamicValue;
});
});
this.tableData.push(row);
});
/** 生成span数组 */
const tmp = [...spanArr];
for (const [index, key] of sectionArr.entries()) {
tmp[index + 1] = tmp[index] + sectionMap[key];
}
console.log('tep', tmp);
spanArr = tmp;
this.sectionMap = sectionMap;
this.spanArr = spanArr;
resolve();
});
},
mergeRow({ row, column, rowIndex, columnIndex }) {
if (columnIndex == 1) {
const span = this.sectionMap[row.sectionName];
if (this.spanArr.includes(rowIndex)) {
console.log('span...');
return [span, 1];
}
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, this.yData);
this.$nextTick(() => {
this.$refs.lineChart.initChart(this.xData, this.yData);
});
// this.total = response.data.total;
// this.dataListLoading = false;
});
},
handleSearchBarBtnClick(btn) {
switch (btn.btnName) {
case 'search':
this.queryParams.lineId = btn.lineIds || null;
this.queryParams.startTime = btn.timeArr ? btn.timeArr[0] : null;
this.queryParams.endTime = btn.timeArr ? btn.timeArr[1] : null;
if (!btn.lineIds || !btn.timeArr.length) {
this.$message({
message: '请选择产线和时间',
type: 'warning',
});
}
this.getList();
break;
}
},
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> </script>
<style scoped>
.custom-tabs >>> .el-tabs__header {
margin-bottom: 8px;
display: inline-block;
transform: translateY(-12px);
}
.custom-tabs >>> .el-tabs__item {
padding-left: 0px !important;
padding-right: 0px !important;
line-height: 36px !important;
height: 36px;
}
.custom-tabs >>> .el-tabs__content {
height: calc(100% - 42px);
}
.custom-tabs >>> .el-tab-pane {
height: 100%;
}
</style>

View File

@@ -110,7 +110,7 @@ export default {
}, },
{ {
type: 'button', type: 'button',
btnName: '搜索', btnName: '查询',
name: 'search', name: 'search',
color: 'primary', color: 'primary',
}, },
@@ -149,6 +149,27 @@ export default {
}, },
created() {}, created() {},
methods: { methods: {
// 删除
deleteHandle(id, name, index) {
this.$confirm(`确定确认删除工厂名称为"${name}"的数据项?`, "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
this.urlOptions.deleteURL(id).then(({ data }) => {
this.$message({
message: "操作成功",
type: "success",
duration: 1500,
onClose: () => {
this.getDataList();
},
});
});
})
.catch(() => { });
},
buttonClick(val) { buttonClick(val) {
switch (val.btnName) { switch (val.btnName) {
case 'search': case 'search':

View File

@@ -3,7 +3,7 @@
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span='6'> <el-col :span='6'>
<el-form-item label="订单名" prop="orderId"> <el-form-item label="订单名" prop="orderId">
<el-select v-model="form.orderId" placeholder="请选择" style="width: 100%;"> <el-select v-model="form.orderId" placeholder="请选择" style="width: 100%;" filterable>
<el-option <el-option
v-for="item in orderList" v-for="item in orderList"
:key="item.id" :key="item.id"
@@ -39,7 +39,7 @@
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span='6'> <el-col :span='6'>
<el-form-item label="发货负责人" prop="deliveryPersonId"> <el-form-item label="发货负责人" prop="deliveryPersonId">
<el-select v-model="form.deliveryPersonId" placeholder="请选择" style="width: 100%;"> <el-select v-model="form.deliveryPersonId" placeholder="请选择" style="width: 100%;" filterable>
<el-option <el-option
v-for="item in personList" v-for="item in personList"
:key="item.id" :key="item.id"
@@ -75,9 +75,8 @@
</el-form> </el-form>
</template> </template>
<script> <script>
import { orderList } from '@/api/base/orderManage'
import { getWorkerList } from '@/api/base/worker' import { getWorkerList } from '@/api/base/worker'
import { deliveryLogCreate, deliveryLogUpdate, getDeliveryLog } from '@/api/base/delivery' import { deliveryLogCreate, deliveryLogUpdate, getDeliveryLog, listOrderList } from '@/api/base/delivery'
export default { export default {
name: 'AddOrUpdate', name: 'AddOrUpdate',
data() { data() {
@@ -116,7 +115,7 @@ export default {
} }
}, },
getSelectList() { getSelectList() {
orderList().then(res => { listOrderList().then(res => {
this.orderList = res.data || [] this.orderList = res.data || []
}) })
getWorkerList().then(res => { getWorkerList().then(res => {

View File

@@ -1,7 +1,7 @@
<template> <template>
<el-form ref="form" :rules="rules" label-width="100px" :model="form"> <el-form ref="form" :rules="rules" label-width="100px" :model="form">
<el-form-item label="关联表名" prop="plcId"> <el-form-item label="关联表名" prop="plcId">
<el-select v-model="form.plcId" placeholder="请选择" style="width: 100%;"> <el-select v-model="form.plcId" placeholder="请选择" style="width: 100%;" filterable>
<el-option <el-option
v-for="item in plcList" v-for="item in plcList"
:key="item.id" :key="item.id"

View File

@@ -3,7 +3,7 @@
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="能源类型" prop="typeId"> <el-form-item label="能源类型" prop="typeId">
<el-select v-model="form.typeId" placeholder="请选择" style="width: 100%;"> <el-select v-model="form.typeId" placeholder="请选择" style="width: 100%;" filterable>
<el-option <el-option
v-for="item in energyListType" v-for="item in energyListType"
:key="item.id" :key="item.id"

View File

@@ -63,7 +63,7 @@ const tableProps = [
} }
] ]
export default { export default {
name: "EnergyPlc", name: "EnergyQuantityRealtime",
data() { data() {
return { return {
formConfig: [ formConfig: [
@@ -125,10 +125,34 @@ export default {
window.addEventListener('resize', () => { window.addEventListener('resize', () => {
this.tableH = this.tableHeight(260) this.tableH = this.tableHeight(260)
}) })
if (location.href.indexOf('?') > 0) {
let arr = location.href.split('?')[1].split('&')
this.formConfig[1].defaultSelect = [arr[0].split('=')[1], arr[1].split('=')[1]]
} else {
this.formConfig[1].defaultSelect = [Date.now() - 7*24*3600000, Date.now()]
}
this.queryParams.startTime = this.formConfig[1].defaultSelect[0]
this.queryParams.endTime = this.formConfig[1].defaultSelect[1]
this.getList(); this.getList();
this.getTypeList() this.getTypeList()
}, },
watch: {
$route: 'initData'
},
methods: { methods: {
initData(to) {
if (to.name === 'EnergyQuantityRealtime') {
if (location.href.indexOf('?') > 0) {
let arr = location.href.split('?')[1].split('&')
this.formConfig[1].defaultSelect = [arr[0].split('=')[1], arr[1].split('=')[1]]
} else {
this.formConfig[1].defaultSelect = [Date.now() - 7*24*3600000, Date.now()]
}
this.queryParams.startTime = this.formConfig[1].defaultSelect[0]
this.queryParams.endTime = this.formConfig[1].defaultSelect[1]
this.getList()
}
},
buttonClick(val) { buttonClick(val) {
this.queryParams.pageNo = 1; this.queryParams.pageNo = 1;
this.queryParams.energyTypeId = val.energyTypeId this.queryParams.energyTypeId = val.energyTypeId

View File

@@ -15,7 +15,7 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="能源类型" prop="energyTypeId"> <el-form-item label="能源类型" prop="energyTypeId">
<el-select v-model="form.energyTypeId" placeholder="请选择" style="width: 100%;" @change="toggleType"> <el-select v-model="form.energyTypeId" placeholder="请选择" style="width: 100%;" filterable @change="toggleType">
<el-option <el-option
v-for="item in this.energyTypeList" v-for="item in this.energyTypeList"
:key="item.id" :key="item.id"

View File

@@ -80,8 +80,7 @@ export default {
param: 'timeVal', param: 'timeVal',
defaultSelect: [], defaultSelect: [],
width: 350, width: 350,
clearable: false, clearable: false
required:true
}, },
{ {
type: 'button', type: 'button',
@@ -122,35 +121,11 @@ export default {
this.tableH = this.tableHeight(260) this.tableH = this.tableHeight(260)
this.isFold = this.searchBarWidth('energyReportSearchBox', 1180) this.isFold = this.searchBarWidth('energyReportSearchBox', 1180)
}) })
if (location.href.indexOf('?') > 0) {
let arr = location.href.split('?')[1].split('&')
this.formConfig[2].defaultSelect = [arr[0].split('=')[1], arr[1].split('=')[1]]
} else {
this.formConfig[2].defaultSelect = [Date.now() - 7*24*3600000, Date.now()]
}
this.queryParams.startTime = this.formConfig[2].defaultSelect[0]
this.queryParams.endTime = this.formConfig[2].defaultSelect[1]
this.getList() this.getList()
this.getTypeList() this.getTypeList()
this.isFold = this.searchBarWidth('energyReportSearchBox', 1180) this.isFold = this.searchBarWidth('energyReportSearchBox', 1180)
}, },
watch: {
$route: 'initData'
},
methods: { methods: {
initData(to) {
if (to.name === 'EnergyReportSearch') {
if (location.href.indexOf('?') > 0) {
let arr = location.href.split('?')[1].split('&')
this.formConfig[2].defaultSelect = [arr[0].split('=')[1], arr[1].split('=')[1]]
} else {
this.formConfig[2].defaultSelect = [Date.now() - 7*24*3600000, Date.now()]
}
this.queryParams.startTime = this.formConfig[2].defaultSelect[0]
this.queryParams.endTime = this.formConfig[2].defaultSelect[1]
this.getList()
}
},
getTypeList() { getTypeList() {
getEnergyTypeListAll().then((res) => { getEnergyTypeListAll().then((res) => {
this.formConfig[1].selectOptions = res.data || [] this.formConfig[1].selectOptions = res.data || []

View File

@@ -27,7 +27,7 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="能源类型" prop="energyTypeId"> <el-form-item label="能源类型" prop="energyTypeId">
<el-select v-model="form.energyTypeId" placeholder="请选择" style="width: 100%;"> <el-select v-model="form.energyTypeId" placeholder="请选择" style="width: 100%;" filterable>
<el-option <el-option
v-for="item in energyListType" v-for="item in energyListType"
:key="item.id" :key="item.id"

View File

@@ -8,11 +8,11 @@
<template> <template>
<div class="app-container allow-overflow"> <div class="app-container allow-overflow">
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<small-title <!-- <small-title
style="margin: 16px 0; padding-left: 8px" style="margin: 16px 0; padding-left: 8px"
:no-padding="true"> :no-padding="true">
设备运行状态 设备运行状态
</small-title> </small-title> -->
<div <div
class="graph" class="graph"
@@ -22,7 +22,8 @@
flex-direction: column; flex-direction: column;
position: relative; position: relative;
"> ">
<div class="blue-title">各设备加工数量</div> <!-- <div class="blue-title">各设备加工数量</div> -->
<div class="blue-title">设备运行状态</div>
<div class="legend"> <div class="legend">
<div class="legend-item"> <div class="legend-item">
<span class="icon blue"></span> <span class="icon blue"></span>
@@ -41,22 +42,17 @@
<span class="text">速度开动率</span> <span class="text">速度开动率</span>
</div> </div>
</div> </div>
<div class="graph-grid"> <div v-if="list.length" class="graph-grid">
<div class="bg-grid grid-line"> <div class="bg-grid grid-line">
<div <div class="grid-item" v-for="item in list.length" :key="item"></div>
class="grid-item"
v-for="item in list.length"
:key="item"></div>
</div> </div>
<div class="bg-grid grid-charts"> <div class="bg-grid grid-charts">
<pie-chart <pie-chart v-for="item in list" :key="item.id" :value="item" />
v-for="item in list"
:key="item.id"
:value="item" />
<!-- <pie-chart v-for="item in 5" :key="item" :value="item" /> --> <!-- <pie-chart v-for="item in 5" :key="item" :value="item" /> -->
</div> </div>
</div> </div>
<div class="no-data-bg" v-else></div>
</div> </div>
</div> </div>
</template> </template>

View File

@@ -202,7 +202,9 @@ export default {
]; ];
this.config.series[1].data = [ this.config.series[1].data = [
{ name: '速度开动率', value: peEfficiency }, { name: '速度开动率', value: peEfficiency },
{ name: '', value: Math.ceil(peEfficiency) - peEfficiency }, { name: '', value: 100 },
// { name: '速度开动率', value: peEfficiency },
// { name: '', value: Math.ceil(peEfficiency) - peEfficiency },
]; ];
// //
this.textData = { this.textData = {

View File

@@ -21,18 +21,15 @@ export default {
chart: null, chart: null,
}; };
}, },
// watch: { watch: {
// list: { list: {
// handler(listdata) { handler(listdata) {
// if (listdata && listdata.length) { this.setOption();
// console.log('[linechart] list changed', listdata); },
// const option = this.handleList(listdata); immediate: true,
// this.setOption(option); deep: true,
// } },
// }, },
// immediate: true,
// },
// },
computed: { computed: {
option() { option() {
const opt = []; const opt = [];
@@ -55,7 +52,7 @@ export default {
}, },
formatter: (params) => { formatter: (params) => {
const name = params[0].name; const name = params[0].name;
const goodRate = opt.find((item) => item[0] == name)[4]; const goodRate = opt.find((item) => item[0] == name)[4] || '0';
return ` return `
<h1 style="font-size: 18px; letter-spacing: 1px;">${ <h1 style="font-size: 18px; letter-spacing: 1px;">${
params[0].axisValue params[0].axisValue
@@ -109,6 +106,9 @@ export default {
xAxis: { xAxis: {
type: 'category', type: 'category',
axisTick: { show: false }, axisTick: { show: false },
axisLabel: {
rotate: 45,
},
data: opt.map((item) => item[0]), data: opt.map((item) => item[0]),
}, },
yAxis: { yAxis: {

View File

@@ -6,15 +6,15 @@
--> -->
<template> <template>
<div class="app-container"> <div class="app-container" style="flex: 1; height: 1px; display: flex; flex-direction: column;">
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<SearchBar <SearchBar
:formConfigs="searchBarFormConfig" :formConfigs="searchBarFormConfig"
ref="search-bar" ref="search-bar"
@headBtnClick="handleSearchBarBtnClick" /> @headBtnClick="handleSearchBarBtnClick" />
<el-row> <el-row type="flex" style="flex: 1;">
<el-col class="custom-tabs"> <el-col class="custom-tabs" style="flex: 1;">
<el-tabs <el-tabs
v-model="activeName" v-model="activeName"
:stretch="true" :stretch="true"
@@ -32,7 +32,7 @@
<div <div
v-if="activeName == 'graph'" v-if="activeName == 'graph'"
class="graph" class="graph"
style="height: 40vh; display: flex; flex-direction: column"> style="height: 100%; display: flex; flex-direction: column">
<div class="blue-title">各设备加工数量</div> <div class="blue-title">各设备加工数量</div>
<LineChart v-if="list && list.length" :list="list" /> <LineChart v-if="list && list.length" :list="list" />
<div v-else class="no-data-bg"></div> <div v-else class="no-data-bg"></div>
@@ -63,13 +63,13 @@ export default {
activeName: 'table', // defaults to 'table' activeName: 'table', // defaults to 'table'
searchBarFormConfig: [ searchBarFormConfig: [
// 产品 // 产品
{ // {
__index: 'product', // __index: 'product',
type: 'select', // type: 'select',
label: '产品', // label: '产品',
placeholder: '请选择产品', // placeholder: '请选择产品',
param: 'productId', // param: 'productId',
}, // },
// 产线 // 产线
{ {
__index: 'line', __index: 'line',
@@ -156,17 +156,17 @@ export default {
{ {
// width: 160, // width: 160,
prop: 'inQuantity', prop: 'inQuantity',
label: '进片数量', label: '加工数量',
}, },
{ {
// width: 160, // width: 160,
prop: 'outQuantity', prop: 'outQuantity',
label: '出片数量', label: '合格数量',
}, },
{ {
// width: 160, // width: 160,
prop: 'nokQuantity', prop: 'nokQuantity',
label: '破损/不合格数', label: '不合格数',
}, },
{ {
// width: 160, // width: 160,
@@ -377,6 +377,9 @@ export default {
} }
:deep(.custom-tabs) { :deep(.custom-tabs) {
.el-tabs {
height: 100%;
}
.el-tabs__header { .el-tabs__header {
margin-bottom: 8px; margin-bottom: 8px;
display: inline-block; display: inline-block;
@@ -389,6 +392,14 @@ export default {
line-height: 36px !important; line-height: 36px !important;
height: 36px; height: 36px;
} }
.el-tabs__content {
height: calc(100% - 48px);
}
#pane-graph {
height: 100%;
}
} }
.blue-title { .blue-title {

View File

@@ -0,0 +1,303 @@
<!--
* @Author: zwq
* @Date: 2021-11-18 14:16:25
* @LastEditors: DY
* @LastEditTime: 2023-11-11 20:33:12
* @Description:
-->
<template>
<div class="alarm-handle">
<el-skeleton v-if="loading" />
<div v-else>
<DialogForm
ref="orderForm"
key="orderForm"
v-model="orderForm"
:disabled="readOnly"
:has-files="false"
label-position="top"
:rows="orderFormRows" />
<small-title style="margin: 16px 0" :no-padding="true" size="sm">
处理方式
</small-title>
<DialogForm
key="handleMethodForm"
ref="handleMethodForm"
v-model="handleMethodForm"
:disabled="readOnly"
:has-files="true"
label-position="top"
:rows="handleMethodFormRows" />
</div>
</div>
</template>
<script>
import SmallTitle from './SmallTitle';
import { getworkerAll } from '@/api/base/materialUseLog';
import Editor from '@/components/Editor';
import DialogForm from '@/components/DialogForm';
export default {
name: 'AlarmHandle',
props: ['readOnly', 'logId'],
components: { SmallTitle, DialogForm, Editor },
data() {
return {
loading: false,
orderForm: {
id: null,
equipment: null,
createTime: null,
alarmContent: null,
alarmValue: null,
// 缺少报警编号字段, 用 alarmValue 代替
alarmCode: null,
equipmentCode: null
},
orderFormRows: [
[
{
input: true,
label: '设备编码',
prop: 'equipmentCode',
},
{
datetime: true,
label: '报警时间',
prop: 'createTime',
},
{
input: true,
label: '报警编号',
prop: 'alarmCode',
},
{
input: true,
label: '报警内容',
prop: 'alarmContent',
},
],
],
handleMethodFormRows: [
[
{
select: true,
label: '处理人',
prop: 'hander',
url: '/base/core-worker/listAll',
bind: {
multiple: true,
},
rules: [
{ required: true, message: '类型名称不能为空', trigger: 'blur' },
],
},
{
upload: true,
label: '上传资料',
prop: 'files',
},
],
[
{
key: 'handerMode',
subcomponent: Editor,
label: '处理方式',
prop: 'handerMode',
bind: {
'min-height': 200,
},
},
],
],
handleMethodForm: {
id: null,
logId: null,
hander: null,
handerMode: null,
remark: null,
files: [
// {
// fileName: '',
// fileType: '',
// fileUrl: ''
// }
],
},
workersList: [],
};
},
mounted() {
this.loading = true;
this.getDict()
.then(() => {
this.init();
})
.catch((err) => {
this.loading = false;
});
},
methods: {
/**
* 获取员工数据
*/
async getDict() {
const workerRes = await getworkerAll();
this.workersList = workerRes.data;
},
/**
* 初始化
*/
async init() {
await this.initTop();
await this.initDown();
this.loading = false;
},
/**
* 初始化上部表单
*/
async initTop() {
if (!this.logId) {
this.$msgError('缺少报警日志id');
this.$emit('close');
}
const url = '/base/equipment-alarm-log/get';
const { data, code } = await this.$axios({
url: url,
method: 'get',
params: {
id: this.logId,
},
});
if (code == 0) {
this.orderForm = data;
}
},
/**
* 初始化下部表单
*/
async initDown() {
if (!this.logId) {
this.$msgError('缺少报警日志id');
this.$emit('close');
}
const url = '/base/equipment-alarm-hand/page'; // 经沟通此处采用page接口的第一个返回值
const { data, code } = await this.$axios({
url: url,
method: 'get',
params: {
logId: this.logId,
},
});
if (code == 0) {
this.handleMethodForm = {
...data.list[0],
hander: data.list[0]?.hander?.split(',') || '',
};
}
},
/**
* 更新表单
*/
async submit() {
const result = await Promise.all([
await this.updateTop(),
await this.updateHandleMethod(),
]);
if (result[0] == true && result[1] == true) {
this.$modal.msgSuccess('更新成功');
this.$emit('refreshDataList');
} else {
this.$modal.msgError('更新失败');
}
},
/**
* 更新下部表单
*/
async updateHandleMethod() {
const url = '/base/equipment-alarm-hand';
const valid = await this.$refs.orderForm.validate();
if (!valid) {
return false;
}
const { code, data } = await this.$axios({
url: url + (this.handleMethodForm.id ? '/update' : '/create'),
method: this.handleMethodForm.id ? 'put' : 'post',
data: {
...this.handleMethodForm,
hander: this.handleMethodForm.hander?.join(',') || '',
logId: this.logId,
},
});
if (code == 0) {
return true;
}
return false;
},
/**
* 更新上部分表单
*/
async updateTop() {
const url = '/base/equipment-alarm-log';
const valid = await this.$refs.handleMethodForm.validate();
if (!valid) {
return false;
}
const { code, data } = await this.$axios({
url: url + '/update',
method: 'put',
data: this.orderForm,
});
if (code == 0) {
return true;
}
return false;
},
// 表单提交
dataFormSubmit() {
this.$refs['dataForm'].validate((valid) => {
if (!valid) {
return false;
}
if (this.file) {
const temp = this.file.split(','); // 获取文件个数
let arry = [];
temp.forEach((item) => {
arry.push({
fileType: 2,
fileUrl: item,
});
});
this.dataForm.files = arry;
}
this.urlOptions.createURL(this.dataForm).then((response) => {
this.$modal.msgSuccess('新增成功');
this.visible = false;
this.$emit('refreshDataList');
});
});
},
},
};
</script>
<style scoped>
.alarm-handle {
padding: 0;
}
.alarm-handle__method >>> .el-select {
width: 100% !important;
}
</style>

View File

@@ -40,7 +40,7 @@ $pxls: (xl, 28px) (lg, 24px) (de, 20px) (md, 18px) (sm, 16px);
$mgr: 8px; $mgr: 8px;
@each $size, $height in $pxls { @each $size, $height in $pxls {
.#{$size}-title { .#{$size}-title {
font-size: 18px; font-size: $height;
line-height: $height; line-height: $height;
color: #000; color: #000;
font-weight: 500; font-weight: 500;
@@ -53,7 +53,7 @@ $mgr: 8px;
width: 4px; width: 4px;
height: $height + 2px; height: $height + 2px;
border-radius: 1px; border-radius: 1px;
margin-right: $mgr; margin-right: 4px;
background-color: #0b58ff; background-color: #0b58ff;
} }
} }

View File

@@ -1,195 +0,0 @@
<!--
* @Author: zwq
* @Date: 2021-11-18 14:16:25
* @LastEditors: DY
* @LastEditTime: 2023-11-11 20:33:12
* @Description:
-->
<template>
<div>
<small-title
style="margin: 16px 0; padding-left: 8px"
:no-padding="true">
系统自带
</small-title>
<el-form
:model="dataForm1"
ref="dataForm1"
label-width="80px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="设备编码" prop="equipment">
<el-input
v-model="dataForm1.equipment"
disabled
placeholder="请输入设备编码" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报警时间" prop="createTime">
<el-input
v-model="dataForm1.createTime"
disabled
placeholder="请输入报警时间" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="报警编号" prop="code">
<!-- 接口缺参数 -->
<el-input
v-model="dataForm1.code"
disabled
placeholder="请输入报警编号" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报警内容" prop="alarmContent">
<el-input
v-model="dataForm1.alarmContent"
disabled
placeholder="请输入报警内容" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<small-title
style="margin: 16px 0; padding-left: 8px"
:no-padding="true">
处理方式
</small-title>
<el-form
:model="dataForm"
:rules="dataRule"
ref="dataForm"
label-width="80px">
<el-form-item label="处理人" prop="hander">
<el-select
v-model="dataForm.hander"
:disabled="isdetail"
placeholder="请选择处理人"
>
<el-option
v-for="dict in workersList"
:key="dict.id"
:label="dict.name"
:value="dict.name" />
</el-select>
</el-form-item>
<el-form-item label="处理方式" prop="handerMode">
<editor v-model="dataForm.handerMode" :read-only="isdetail" :min-height="200"/>
</el-form-item>
<el-form-item label="附件" prop="file">
<!-- <el-input
v-model="dataForm.file"
type="textarea"
min-size="3"
placeholder="请输入处理方式" /> -->
<FileUpload v-model="file" :disabled="isdetail" />
</el-form-item>
</el-form>
</div>
</template>
<script>
import basicAdd from '../../../../core/mixins/basic-add';
import SmallTitle from './SmallTitle';
import { getworkerAll } from "@/api/base/materialUseLog";
import { createAlarmHand, getAlarmLog } from '@/api/equipment/base/alarm/records';
import FileUpload from "@/components/FileUpload";
import Editor from "@/components/Editor";
export default {
components: { SmallTitle, FileUpload, Editor },
mixins: [basicAdd],
data() {
return {
urlOptions: {
createURL: createAlarmHand,
infoURL: getAlarmLog,
},
dataForm1: {
id: undefined,
equipment: undefined,
createTime: undefined,
alarmContent: undefined,
code: undefined
},
file: '',
dataForm: {
id: undefined,
hander: undefined,
handerMode: undefined
},
isdetail: false,
workersList: [],
dataRule: {
hander: [{ required: true, message: "处理人不能为空", trigger: "change" }],
handerMode: [{ required: true, message: "处理方式不能为空", trigger: "blur" }]
}
};
},
mounted() {
this.getDict()
console.log('我看看', this.dataForm)
},
methods: {
async getDict() {
// 获得员工
const workerRes = await getworkerAll()
this.workersList = workerRes.data
},
// 表单提交
dataFormSubmit() {
this.$refs["dataForm"].validate((valid) => {
if (!valid) {
return false;
}
// 修改的提交
// if (this.dataForm.id) {
// this.urlOptions.updateURL(this.dataForm).then(response => {
// this.$modal.msgSuccess("修改成功");
// this.visible = false;
// this.$emit("refreshDataList");
// });
// return;
// }
// 添加的提交
if (this.file) {
const temp = this.file.split(',') // 获取文件个数
let arry = []
temp.forEach(item => {
arry.push({
fileType: 2,
fileUrl: item
})
})
this.dataForm.files = arry
}
this.urlOptions.createURL(this.dataForm).then(response => {
this.$modal.msgSuccess("新增成功");
this.visible = false;
this.$emit("refreshDataList");
});
});
},
init(id, isdetail) {
this.dataForm1.id = id || "";
this.isdetail = isdetail || false
this.visible = true;
this.$nextTick(() => {
this.$refs["dataForm1"].resetFields();
this.$refs["dataForm"].resetFields();
if (this.dataForm1.id) {
this.urlOptions.infoURL(id).then(response => {
if (response.data) {
this.dataForm1 = response.data;
}
});
}
});
},
},
};
</script>

View File

@@ -45,20 +45,23 @@
:disabled="mode == 'detail'" :disabled="mode == 'detail'"
:has-files="false" :has-files="false"
:rows="rows" /> --> :rows="rows" /> -->
<add-or-update <AddOrUpdate
ref="addOrUpdate" v-if="open"
@refreshDataList="successSubmit" /> ref="addOrUpdate"
:read-only="readOnly"
:log-id="chosedLogId"
@close="cancel"
@refreshDataList="successSubmit" />
</base-dialog> </base-dialog>
</div> </div>
</template> </template>
<script> <script>
import moment from 'moment';
import basicPageMixin from '@/mixins/lb/basicPageMixin'; import basicPageMixin from '@/mixins/lb/basicPageMixin';
import AddOrUpdate from './add-or-updata.vue'
import { publicFormatter } from '@/utils/dict'; import { publicFormatter } from '@/utils/dict';
// const timeFilter = (val) => moment(val).format('yyyy-MM-DD HH:mm:ss'); import AddOrUpdate from './AddOrUpdate.vue';
import moment from 'moment';
const timeFilter = (val) => moment(val).format('yyyy-MM-DD HH:mm:ss');
const btn = { const btn = {
name: 'tableBtn', name: 'tableBtn',
@@ -68,7 +71,10 @@ const btn = {
}, },
methods: { methods: {
handleClick() { handleClick() {
this.$emit('emitData', { action: this.injectData.name, value: this.injectData }); this.$emit('emitData', {
action: this.injectData.name,
value: this.injectData,
});
}, },
}, },
render: function (h) { render: function (h) {
@@ -80,14 +86,14 @@ const btn = {
}, },
}; };
export default { export default {
name: 'Record', name: 'Record',
components: { AddOrUpdate }, components: { AddOrUpdate },
mixins: [basicPageMixin], mixins: [basicPageMixin],
data() { data() {
return { return {
readOnly: false,
chosedLogId: false,
searchBarKeys: ['equipmentName', 'recordTime'], searchBarKeys: ['equipmentName', 'recordTime'],
tableBtn: [ tableBtn: [
// this.$auth.hasPermi('equipment:spare-parts-config:update') // this.$auth.hasPermi('equipment:spare-parts-config:update')
@@ -113,12 +119,16 @@ export default {
{ prop: 'productionLine', label: '产线' }, { prop: 'productionLine', label: '产线' },
{ prop: 'workshopSection', label: '工段' }, { prop: 'workshopSection', label: '工段' },
{ prop: 'equipment', label: '设备名称' }, { prop: 'equipment', label: '设备名称' },
{ prop: 'alarmGrade', label: '报警级别', filter: publicFormatter(this.DICT_TYPE.EQU_ALARM_LEVEL) }, {
{ prop: 'responsible', label: '报警时间' }, // 接口缺 prop: 'alarmGrade',
{ prop: 'responsible1', label: '设备报警码' }, // 接口缺 label: '报警级别',
filter: publicFormatter(this.DICT_TYPE.EQU_ALARM_LEVEL),
},
{ prop: 'createTime', label: '报警时间', filter: timeFilter }, // 接口缺
{ prop: 'alarmCode', label: '设备报警码' }, // 接口缺
{ prop: 'alarmContent', label: '报警内容' }, { prop: 'alarmContent', label: '报警内容' },
{ prop: 'opt1', label: '处理记录', name: '查看', subcomponent: btn }, { prop: 'opt1', label: '处理记录', name: '查看', subcomponent: btn },
{ prop: 'opt2', label: '处理', name: '报警处理', subcomponent: btn }, // TODO: 是否换成按钮, 群里问 { prop: 'opt2', label: '处理', name: '报警处理', subcomponent: btn }, // TODO: 是否换成按钮, 群里问
// { prop: 'remark', label: '备注' }, // { prop: 'remark', label: '备注' },
], ],
searchBarFormConfig: [ searchBarFormConfig: [
@@ -135,13 +145,13 @@ export default {
dateType: 'daterange', // datetimerange dateType: 'daterange', // datetimerange
// format: 'yyyy-MM-dd HH:mm:ss', // format: 'yyyy-MM-dd HH:mm:ss',
format: 'yyyy-MM-dd', format: 'yyyy-MM-dd',
// valueFormat: 'timestamp', valueFormat: 'timestamp',
valueFormat: 'yyyy-MM-dd HH:mm:ss', // valueFormat: 'yyyy-MM-dd HH:mm:ss',
rangeSeparator: '-', rangeSeparator: '-',
startPlaceholder: '开始日期', startPlaceholder: '开始日期',
endPlaceholder: '结束日期', endPlaceholder: '结束日期',
defaultTime: ['00:00:00', '23:59:59'], defaultTime: ['00:00:00', '23:59:59'],
param: 'recordTime', param: 'createTime',
// defaultSelect: [ // defaultSelect: [
// new Date(y, m, d) // new Date(y, m, d)
// .toLocaleString() // .toLocaleString()
@@ -196,9 +206,10 @@ export default {
pageSize: 10, pageSize: 10,
lineId: null, lineId: null,
equipmentId: null, equipmentId: null,
recordTime: [],
}, },
basePath: '/base/equipment-alarm-log', basePath: '/base/equipment-alarm-log',
list: [] list: [],
}; };
}, },
created() { created() {
@@ -206,21 +217,20 @@ export default {
}, },
methods: { methods: {
handleEmitFun(val) { handleEmitFun(val) {
console.log('你好', val)
if (val.action === '报警处理') { if (val.action === '报警处理') {
// this.chosedLogId = val.value.alarmId;
this.chosedLogId = val.value.id;
// 报警处理 // 报警处理
this.open = true this.open = true;
this.title = '报警处理' this.title = '报警处理';
this.$nextTick(() => { this.readOnly = false;
this.$refs.addOrUpdate.init(val.value.id);
});
} else { } else {
// this.chosedLogId = val.value.alarmId;
this.chosedLogId = val.value.id;
// 查看 // 查看
this.open = true this.open = true;
this.title = '查看' this.title = '查看';
this.$nextTick(() => { this.readOnly = true;
this.$refs.addOrUpdate.init(val.value.id, true);
});
} }
}, },
/** 查询列表 */ /** 查询列表 */
@@ -234,9 +244,9 @@ export default {
}); });
}, },
successSubmit() { successSubmit() {
this.cancel() this.cancel();
this.getList() this.getList();
}, },
/** 取消按钮 */ /** 取消按钮 */
cancel() { cancel() {
this.open = false; this.open = false;
@@ -282,7 +292,7 @@ export default {
}, },
/** 提交按钮 */ /** 提交按钮 */
submitForm() { submitForm() {
this.$refs.addOrUpdate.dataFormSubmit() this.$refs.addOrUpdate.submit();
// this.$refs['form'].validate((valid) => { // this.$refs['form'].validate((valid) => {
// if (!valid) { // if (!valid) {
// return; // return;

View File

@@ -9,10 +9,11 @@
<el-drawer <el-drawer
:visible="visible" :visible="visible"
:show-close="false" :show-close="false"
:wrapper-closable="false" :wrapper-closable="mode.includes('detail') ? true : false"
:before-close="handleCancel"
class="drawer" class="drawer"
custom-class="mes-drawer" custom-class="mes-drawer"
size="60%" :size="size || '50%'"
@closed="$emit('destroy')"> @closed="$emit('destroy')">
<SmallTitle slot="title"> <SmallTitle slot="title">
{{ {{
@@ -42,7 +43,8 @@
:dataForm="form" :dataForm="form"
:rows="formRows" /> --> :rows="formRows" /> -->
<el-row style="margin-bottom: 24px"> <!-- if -->
<el-row v-if="mode.includes('detail')" style="margin-bottom: 24px">
<el-col :span="8"> <el-col :span="8">
<div <div
class="title" class="title"
@@ -62,13 +64,39 @@
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
<!-- else -->
<el-row v-else style="margin-bottom: 24px" :gutter="20">
<el-form ref="form" :model="form">
<el-col :span="8">
<el-form-item
class="title"
label="设备分组名称"
style="font-size: 16px; margin: 8px 0">
<el-input
v-model="form.name"
placeholder="请输入设备分组名称"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
class="title"
label="设备分组编码"
style="font-size: 16px; margin: 8px 0">
<el-input
v-model="form.code"
placeholder="请输入设备分组编码"></el-input>
</el-form-item>
</el-col>
</el-form>
</el-row>
</div> </div>
<div <div
v-if="section.key == 'attrs'" v-if="section.key == 'attrs'"
style="position: relative; margin-top: 12px"> style="position: relative; margin-top: 12px">
<!-- v-if="!mode.includes('detail')" --> <div
<div style="position: absolute; top: -40px; right: 0"> v-if="!mode.includes('detail')"
style="position: absolute; top: -40px; right: 0">
<el-button @click="handleAddAttr" type="text"> <el-button @click="handleAddAttr" type="text">
<i class="el-icon-plus"></i> <i class="el-icon-plus"></i>
添加报警 添加报警
@@ -84,7 +112,7 @@
<!-- :add-button-show="mode.includes('detail') ? null : '添加属性'" <!-- :add-button-show="mode.includes('detail') ? null : '添加属性'"
@emitButtonClick="handleAddAttr" --> @emitButtonClick="handleAddAttr" -->
<method-btn <method-btn
v-if="section.tableBtn" v-if="section.tableBtn && !mode.includes('detail')"
slot="handleBtn" slot="handleBtn"
label="操作" label="操作"
:method-list="tableBtn" :method-list="tableBtn"
@@ -102,12 +130,13 @@
</section> </section>
</div> </div>
<div class="drawer-body__footer"> <div v-if="!mode.includes('detail')" class="drawer-body__footer">
<el-button style="" @click="handleCancel">取消</el-button> <el-button style="" @click="handleCancel">取消</el-button>
<!-- <el-button v-if="mode == 'detail'" type="primary" @click="toggleEdit"> <el-button
编辑 type="primary"
</el-button> --> @click="handleSave">
<!-- <el-button v-else type="primary" @click="handleCancel">确定</el-button> --> 确定
</el-button>
</div> </div>
</div> </div>
@@ -163,7 +192,7 @@ const SmallTitle = {
export default { export default {
components: { SmallTitle, DialogForm, BaseInfoForm }, components: { SmallTitle, DialogForm, BaseInfoForm },
props: ['sections', 'defaultMode', 'dataId'], // dataId 作为一个通用的存放id的字段 props: ['sections', 'defaultMode', 'dataId', 'size'], // dataId 作为一个通用的存放id的字段
data() { data() {
return { return {
mode: '', mode: '',
@@ -191,7 +220,9 @@ export default {
label: '报警编码', // 自动生成 label: '报警编码', // 自动生成
prop: 'code', prop: 'code',
url: '/base/equipment-group-alarm/getCode', url: '/base/equipment-group-alarm/getCode',
rules: [{ required: true, message: '报警编码不能为空', trigger: 'blur' }], rules: [
{ required: true, message: '报警编码不能为空', trigger: 'blur' },
],
}, },
{ {
select: true, select: true,
@@ -205,13 +236,17 @@ export default {
input: true, input: true,
label: '参数列名', // 在实时数据库的列名 label: '参数列名', // 在实时数据库的列名
prop: 'plcParamName', prop: 'plcParamName',
rules: [{ required: true, message: '参数列名不能为空', trigger: 'blur' }], rules: [
{ required: true, message: '参数列名不能为空', trigger: 'blur' },
],
}, },
{ {
input: true, input: true,
label: '报警内容', label: '报警内容',
prop: 'alarmContent', prop: 'alarmContent',
rules: [{ required: true, message: '报警内容不能为空', trigger: 'blur' }], rules: [
{ required: true, message: '报警内容不能为空', trigger: 'blur' },
],
}, },
], ],
[ [
@@ -223,7 +258,9 @@ export default {
{ label: '布尔型', value: 2 }, { label: '布尔型', value: 2 },
{ label: '字符型', value: 1 }, { label: '字符型', value: 1 },
], ],
rules: [{ required: true, message: '报警类型不能为空', trigger: 'blur' }], rules: [
{ required: true, message: '报警类型不能为空', trigger: 'blur' },
],
}, },
{ {
input: true, input: true,
@@ -322,7 +359,7 @@ export default {
handleSave() { handleSave() {
this.$refs['form'][0].validate(async (valid) => { this.$refs['form'][0].validate(async (valid) => {
if (valid) { if (valid) {
const isEdit = this.mode == 'edit'; const isEdit = !this.mode.includes('detail');
await this.$axios({ await this.$axios({
url: this.sections[0][isEdit ? 'urlUpdate' : 'urlCreate'], url: this.sections[0][isEdit ? 'urlUpdate' : 'urlCreate'],
method: isEdit ? 'put' : 'post', method: isEdit ? 'put' : 'post',
@@ -403,32 +440,32 @@ export default {
}, },
// 提交属性表 // 提交属性表
async submitAttrForm() { submitAttrForm() {
this.$refs['attrForm'].validate((valid) => { this.$refs['attrForm'].validate(async (valid) => {
if (!valid) { if (!valid) {
return; return;
} }
}); const isEdit = this.attrForm.id != null;
const isEdit = this.attrForm.id != null; this.attrFormSubmitting = true;
this.attrFormSubmitting = true; const res = await this.$axios({
const res = await this.$axios({ url: isEdit ? this.sections[1].urlUpdate : this.sections[1].urlCreate,
url: isEdit ? this.sections[1].urlUpdate : this.sections[1].urlCreate, method: isEdit ? 'put' : 'post',
method: isEdit ? 'put' : 'post', data: this.attrForm,
data: this.attrForm,
});
if (res.code == 0) {
this.closeAttrForm();
this.$message({
message: `${isEdit ? '更新' : '创建'}成功`,
type: 'success',
duration: 1500,
onClose: () => {
this.getAttrList();
},
}); });
}
this.attrFormSubmitting = false; if (res.code == 0) {
this.closeAttrForm();
this.$message({
message: `${isEdit ? '更新' : '创建'}成功`,
type: 'success',
duration: 1500,
onClose: () => {
this.getAttrList();
},
});
}
this.attrFormSubmitting = false;
});
}, },
closeAttrForm() { closeAttrForm() {

View File

@@ -45,6 +45,7 @@
<BasicDrawer <BasicDrawer
v-if="editVisible" v-if="editVisible"
ref="drawer" ref="drawer"
size="45%"
:default-mode="editMode" :default-mode="editMode"
:data-id="alarmForm.id" :data-id="alarmForm.id"
:sections="[ :sections="[
@@ -403,12 +404,25 @@ export default {
}); });
}); });
}, },
handleTableBtnClick({ data, type }) {
switch (type) {
case 'edit':
this.handleDetail(data, 'edit');
break;
case 'delete':
this.handleDelete(data);
break;
case 'detail':
this.handleDetail(data);
break;
}
},
// 查看报警 // 查看报警
handleDetail(row) { handleDetail(row, mode = 'detail') {
// debugger; // debugger;
const { id, code, name, createTime } = row; const { id, code, name, createTime } = row;
// 打开抽屉 // 打开抽屉
this.editMode = 'detail'; this.editMode = mode;
this.alarmForm.id = id; this.alarmForm.id = id;
this.alarmForm.equipmentGroupCode = code; this.alarmForm.equipmentGroupCode = code;
this.alarmForm.equipmentGroupName = name; this.alarmForm.equipmentGroupName = name;

View File

@@ -9,10 +9,11 @@
<el-drawer <el-drawer
:visible="visible" :visible="visible"
:show-close="false" :show-close="false"
:wrapper-closable="false" :wrapper-closable="mode.includes('detail') ? true : false"
:before-close="handleCancel"
class="drawer" class="drawer"
custom-class="mes-drawer" custom-class="mes-drawer"
size="60%" :size="size || '50%'"
@closed="$emit('destroy')"> @closed="$emit('destroy')">
<SmallTitle slot="title"> <SmallTitle slot="title">
{{ {{
@@ -42,6 +43,7 @@
:dataForm="form" :dataForm="form"
:rows="formRows" /> --> :rows="formRows" /> -->
<!-- <el-row v-if="mode.includes('detail')" style="margin-bottom: 24px"> -->
<el-row style="margin-bottom: 24px"> <el-row style="margin-bottom: 24px">
<el-col :span="8"> <el-col :span="8">
<div <div
@@ -62,13 +64,38 @@
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
<!-- <el-row v-else style="margin-bottom: 24px" :gutter="20">
<el-form ref="form" :model="form">
<el-col :span="8">
<el-form-item
class="title"
label="设备分组名称"
style="font-size: 16px; margin: 8px 0">
<el-input
v-model="form.name"
placeholder="请输入设备分组名称"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
class="title"
label="设备分组编码"
style="font-size: 16px; margin: 8px 0">
<el-input
v-model="form.code"
placeholder="请输入设备分组编码"></el-input>
</el-form-item>
</el-col>
</el-form>
</el-row> -->
</div> </div>
<div <div
v-if="section.key == 'attrs'" v-if="section.key == 'attrs'"
style="position: relative; margin-top: 12px"> style="position: relative; margin-top: 12px">
<!-- v-if="!mode.includes('detail')" --> <div
<div style="position: absolute; top: -40px; right: 0"> v-if="!mode.includes('detail')"
style="position: absolute; top: -40px; right: 0">
<el-button @click="handleAddAttr" type="text"> <el-button @click="handleAddAttr" type="text">
<i class="el-icon-plus"></i> <i class="el-icon-plus"></i>
添加属性 添加属性
@@ -84,7 +111,7 @@
<!-- :add-button-show="mode.includes('detail') ? null : '添加属性'" <!-- :add-button-show="mode.includes('detail') ? null : '添加属性'"
@emitButtonClick="handleAddAttr" --> @emitButtonClick="handleAddAttr" -->
<method-btn <method-btn
v-if="section.tableBtn" v-if="section.tableBtn && !mode.includes('detail')"
slot="handleBtn" slot="handleBtn"
label="操作" label="操作"
:method-list="tableBtn" :method-list="tableBtn"
@@ -102,12 +129,13 @@
</section> </section>
</div> </div>
<div class="drawer-body__footer"> <div v-if="!mode.includes('detail')" class="drawer-body__footer">
<el-button style="" @click="handleCancel">取消</el-button> <el-button style="" @click="handleCancel">取消</el-button>
<!-- <el-button v-if="mode == 'detail'" type="primary" @click="toggleEdit"> <el-button
编辑 type="primary"
</el-button> --> @click="handleCancel">
<!-- <el-button v-else type="primary" @click="handleCancel">确定</el-button> --> 确定
</el-button>
</div> </div>
</div> </div>
@@ -163,7 +191,7 @@ const SmallTitle = {
export default { export default {
components: { SmallTitle, DialogForm, BaseInfoForm }, components: { SmallTitle, DialogForm, BaseInfoForm },
props: ['sections', 'defaultMode', 'dataId'], // dataId 作为一个通用的存放id的字段 props: ['sections', 'defaultMode', 'dataId', 'size'], // dataId 作为一个通用的存放id的字段
data() { data() {
return { return {
mode: '', mode: '',
@@ -191,7 +219,9 @@ export default {
label: '报警编码', // 自动生成 label: '报警编码', // 自动生成
prop: 'code', prop: 'code',
url: '/base/equipment-group-alarm/getCode', url: '/base/equipment-group-alarm/getCode',
rules: [{ required: true, message: '报警编码不能为空', trigger: 'blur' }], rules: [
{ required: true, message: '报警编码不能为空', trigger: 'blur' },
],
}, },
{ {
select: true, select: true,
@@ -201,7 +231,9 @@ export default {
{ label: '布尔型', value: 2 }, { label: '布尔型', value: 2 },
{ label: '字符型', value: 1 }, { label: '字符型', value: 1 },
], ],
rules: [{ required: true, message: '报警类型不能为空', trigger: 'blur' }], rules: [
{ required: true, message: '报警类型不能为空', trigger: 'blur' },
],
}, },
], ],
[ [
@@ -222,13 +254,17 @@ export default {
input: true, input: true,
label: '参数列名', // 在实时数据库的列名 label: '参数列名', // 在实时数据库的列名
prop: 'plcParamName', prop: 'plcParamName',
rules: [{ required: true, message: '参数列名不能为空', trigger: 'blur' }], rules: [
{ required: true, message: '参数列名不能为空', trigger: 'blur' },
],
}, },
{ {
input: true, input: true,
label: '报警内容', label: '报警内容',
prop: 'alarmContent', prop: 'alarmContent',
rules: [{ required: true, message: '报警内容不能为空', trigger: 'blur' }], rules: [
{ required: true, message: '报警内容不能为空', trigger: 'blur' },
],
}, },
], ],
], ],
@@ -322,7 +358,7 @@ export default {
handleSave() { handleSave() {
this.$refs['form'][0].validate(async (valid) => { this.$refs['form'][0].validate(async (valid) => {
if (valid) { if (valid) {
const isEdit = this.mode == 'edit'; const isEdit = !this.mode.includes('detail');
await this.$axios({ await this.$axios({
url: this.sections[0][isEdit ? 'urlUpdate' : 'urlCreate'], url: this.sections[0][isEdit ? 'urlUpdate' : 'urlCreate'],
method: isEdit ? 'put' : 'post', method: isEdit ? 'put' : 'post',
@@ -403,33 +439,32 @@ export default {
}, },
// 提交属性表 // 提交属性表
async submitAttrForm() { submitAttrForm() {
this.$refs['attrForm'].validate((valid) => { this.$refs['attrForm'].validate(async (valid) => {
if (!valid) { if (!valid) {
return; return;
} }
}); const isEdit = this.attrForm.id != null;
console.log('this.attrform', this.attrForm); this.attrFormSubmitting = true;
const isEdit = this.attrForm.id != null; const res = await this.$axios({
this.attrFormSubmitting = true; url: isEdit ? this.sections[1].urlUpdate : this.sections[1].urlCreate,
const res = await this.$axios({ method: isEdit ? 'put' : 'post',
url: isEdit ? this.sections[1].urlUpdate : this.sections[1].urlCreate, data: this.attrForm,
method: isEdit ? 'put' : 'post',
data: this.attrForm,
});
if (res.code == 0) {
this.closeAttrForm();
this.$message({
message: `${isEdit ? '更新' : '创建'}成功`,
type: 'success',
duration: 1500,
onClose: () => {
this.getAttrList();
},
}); });
}
this.attrFormSubmitting = false; if (res.code == 0) {
this.closeAttrForm();
this.$message({
message: `${isEdit ? '更新' : '创建'}成功`,
type: 'success',
duration: 1500,
onClose: () => {
this.getAttrList();
},
});
}
this.attrFormSubmitting = false;
});
}, },
closeAttrForm() { closeAttrForm() {

View File

@@ -34,7 +34,7 @@
<base-dialog <base-dialog
:dialogTitle="title" :dialogTitle="title"
:dialogVisible="open" :dialogVisible="open"
width="700px" width="30%"
@close="cancel" @close="cancel"
@cancel="cancel" @cancel="cancel"
@confirm="submitForm"> @confirm="submitForm">
@@ -45,6 +45,7 @@
<BasicDrawer <BasicDrawer
v-if="editVisible" v-if="editVisible"
ref="drawer" ref="drawer"
size="45%"
:default-mode="editMode" :default-mode="editMode"
:data-id="alarmForm.id" :data-id="alarmForm.id"
:sections="[ :sections="[
@@ -224,7 +225,9 @@ export default {
bind: { bind: {
filterable: true, filterable: true,
}, },
rules: [{ required: true, message: '设备不能为空', trigger: 'blur' }], rules: [
{ required: true, message: '设备不能为空', trigger: 'blur' },
],
}, },
], ],
[ [
@@ -238,7 +241,9 @@ export default {
bind: { bind: {
filterable: true, filterable: true,
}, },
rules: [{ required: true, message: '报警分组不能为空', trigger: 'blur' }], rules: [
{ required: true, message: '报警分组不能为空', trigger: 'blur' },
],
}, },
], ],
], ],
@@ -269,7 +274,13 @@ export default {
input: true, input: true,
label: '设备分组名称', label: '设备分组名称',
prop: 'name', prop: 'name',
rules: [{ required: true, message: '设备分组名称不能为空', trigger: 'blur' }], rules: [
{
required: true,
message: '设备分组名称不能为空',
trigger: 'blur',
},
],
// bind: { // bind: {
// disabled: this.editMode == 'detail', // some condition, like detail mode... // disabled: this.editMode == 'detail', // some condition, like detail mode...
// } // }
@@ -287,26 +298,23 @@ export default {
prop: 'createTime', prop: 'createTime',
label: '添加时间', label: '添加时间',
fixed: true, fixed: true,
width: 180,
filter: (val) => moment(val).format('yyyy-MM-DD HH:mm:ss'), filter: (val) => moment(val).format('yyyy-MM-DD HH:mm:ss'),
}, },
{ width: 240, prop: 'code', label: '报警编码' }, { prop: 'code', label: '报警编码' },
{ {
width: 100,
prop: 'type', prop: 'type',
label: '报警类型', label: '报警类型',
filter: (val) => filter: (val) =>
val != null ? ['-', '字符型', '布尔型', '-'][val] : '-', val != null ? ['-', '字符型', '布尔型', '-'][val] : '-',
}, },
{ {
width: 90,
prop: 'grade', prop: 'grade',
label: '报警级别', label: '报警级别',
filter: publicFormatter(this.DICT_TYPE.EQU_ALARM_LEVEL), filter: publicFormatter(this.DICT_TYPE.EQU_ALARM_LEVEL),
}, },
{ width: 180, prop: 'alarmCode', label: '设备报警编码' }, { prop: 'alarmCode', label: '设备报警编码' },
{ width: 128, prop: 'plcParamName', label: '参数列名' }, { prop: 'plcParamName', label: '参数列名' },
{ width: 128, prop: 'alarmContent', label: '报警内容' }, { prop: 'alarmContent', label: '报警内容' },
], ],
}; };
}, },
@@ -361,6 +369,19 @@ export default {
}; };
this.resetForm('form'); this.resetForm('form');
}, },
handleTableBtnClick({ data, type }) {
switch (type) {
case 'edit':
this.handleDetail(data, 'edit');
break;
case 'delete':
this.handleDelete(data);
break;
case 'detail':
this.handleDetail(data);
break;
}
},
/** 搜索按钮操作 */ /** 搜索按钮操作 */
handleQuery() { handleQuery() {
this.queryParams.pageNo = 1; this.queryParams.pageNo = 1;
@@ -411,11 +432,11 @@ export default {
}); });
}, },
// 查看报警 // 查看报警
handleDetail(row) { handleDetail(row, mode = 'detail') {
const { equipmentId, equipmentName, groupCode, groupId, groupName, id } = const { equipmentId, equipmentName, groupCode, groupId, groupName, id } =
row; row;
// 打开抽屉 // 打开抽屉
this.editMode = 'detail'; this.editMode = mode;
this.alarmForm.id = groupId; this.alarmForm.id = groupId;
this.alarmForm.equipmentGroupCode = groupCode; this.alarmForm.equipmentGroupCode = groupCode;
this.alarmForm.equipmentGroupName = groupName; this.alarmForm.equipmentGroupName = groupName;

View File

@@ -52,6 +52,7 @@
<BasicDrawer <BasicDrawer
v-if="editVisible" v-if="editVisible"
ref="drawer" ref="drawer"
size="45%"
:default-mode="editMode" :default-mode="editMode"
:info-data="alarmForm" :info-data="alarmForm"
:sections="[ :sections="[
@@ -59,6 +60,10 @@
name: '基本信息', name: '基本信息',
key: 'base', key: 'base',
rows: drawerBaseInfoRows, rows: drawerBaseInfoRows,
url: '/base/equipment-plc-connect/get',
urlUpdate: '/base/equipment-plc-connect/update',
urlCreate: '/base/equipment-plc-connect/create',
queryParams: { id: alarmForm.id },
}, },
{ {
name: '采集参数', name: '采集参数',
@@ -189,7 +194,7 @@ export default {
placeholder: '请选择设备', placeholder: '请选择设备',
param: 'equipmentId', param: 'equipmentId',
selectOptions: [], selectOptions: [],
filterable: true filterable: true,
}, },
{ {
type: 'select', type: 'select',
@@ -197,7 +202,7 @@ export default {
placeholder: '请选择关联表编码', placeholder: '请选择关联表编码',
param: 'plcId', param: 'plcId',
selectOptions: [], selectOptions: [],
filterable: true filterable: true,
}, },
{ {
type: 'button', type: 'button',
@@ -299,7 +304,7 @@ export default {
filter: publicFormatter('unit_dict'), filter: publicFormatter('unit_dict'),
}, },
{ {
prop: 'equipment_param_type', prop: 'equipmentParamType',
label: '设备参数类型', label: '设备参数类型',
filter: (val) => filter: (val) =>
val != null val != null
@@ -307,12 +312,12 @@ export default {
: '-', : '-',
}, },
{ {
prop: 'production_param_type', prop: 'productionParamType',
label: '生产参数类型', label: '生产参数类型',
filter: (val) => filter: (val) =>
val != null val != null
// ? ['', '进片数量', '出片数量', '破损数量', '无类型', ''][val] ? // ? ['', '进片数量', '出片数量', '破损数量', '无类型', ''][val]
? ['', '进口计数', '出口计数', '损耗计数', '无类型', ''][val] ['', '进口计数', '出口计数', '损耗计数', '无类型', ''][val]
: '-', : '-',
}, },
{ {
@@ -423,6 +428,19 @@ export default {
}; };
this.resetForm('form'); this.resetForm('form');
}, },
handleTableBtnClick({ data, type }) {
switch (type) {
case 'edit':
this.handleDetail(data, 'edit');
break;
case 'delete':
this.handleDelete(data);
break;
case 'detail':
this.handleDetail(data);
break;
}
},
/** 搜索按钮操作 */ /** 搜索按钮操作 */
handleQuery() { handleQuery() {
this.queryParams.pageNo = 1; this.queryParams.pageNo = 1;
@@ -474,7 +492,7 @@ export default {
}, },
// 查看报警 // 查看报警
handleDetail(row) { handleDetail(row, mode = 'detail') {
// debugger; // debugger;
const { const {
id, id,
@@ -490,7 +508,7 @@ export default {
workshopSection, workshopSection,
} = row; } = row;
// 打开抽屉 // 打开抽屉
this.editMode = 'detail'; this.editMode = mode;
this.alarmForm.id = id; this.alarmForm.id = id;
this.alarmForm.plcTableName = plcTableName; // 关联表名 this.alarmForm.plcTableName = plcTableName; // 关联表名
this.alarmForm.equipmentName = equipmentName; this.alarmForm.equipmentName = equipmentName;

View File

@@ -25,6 +25,7 @@
v-if="tableBtn.length" v-if="tableBtn.length"
slot="handleBtn" slot="handleBtn"
label="操作" label="操作"
:width="90"
:method-list="tableBtn" :method-list="tableBtn"
@clickBtn="handleTableBtnClick" /> @clickBtn="handleTableBtnClick" />
</base-table> </base-table>
@@ -41,7 +42,7 @@
<base-dialog <base-dialog
:dialogTitle="title" :dialogTitle="title"
:dialogVisible="open" :dialogVisible="open"
width="700px" width="45%"
@close="cancel" @close="cancel"
@cancel="cancel" @cancel="cancel"
@confirm="submitForm"> @confirm="submitForm">
@@ -127,7 +128,7 @@ 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: 'code', label: '编码' }, { prop: 'code', label: '编码', showOverflowtooltip: true },
{ prop: 'plcTableName', label: '关联表名' }, { prop: 'plcTableName', label: '关联表名' },
{ prop: 'name', label: '标识名称' }, { prop: 'name', label: '标识名称' },
{ prop: 'enName', label: '英文名称' }, { prop: 'enName', label: '英文名称' },
@@ -136,7 +137,7 @@ export default {
label: '是否采集', label: '是否采集',
subcomponent: switchBtn, subcomponent: switchBtn,
}, },
{ prop: 'description', label: '描述' }, { prop: 'description', label: '描述', showOverflowtooltip: true },
], ],
searchBarFormConfig: [ searchBarFormConfig: [
{ {
@@ -213,16 +214,28 @@ export default {
}, },
], ],
[ [
// {
// switch: true,
// label: '是否采集', // 是否采集 0 代表不采集, 1 代表采集
// prop: 'collection',
// bind: {
// 'active-value': 1,
// 'inactive-value': 0,
// value: 1,
// },
// },
{ {
switch: true, select: true,
label: '是否采集', // 是否采集 0 代表不采集, 1 代表采集 options: [
{ label: '否', value: 0 },
{ label: '是', value: 1 }
],
label: '是否采集',
prop: 'collection', prop: 'collection',
bind: { bind: {
'active-value': 1, clearable: true, filterable: true
'inactive-value': 0, }
value: 1, }
},
},
], ],
[ [
{ {

View File

@@ -9,10 +9,11 @@
<el-drawer <el-drawer
:visible="visible" :visible="visible"
:show-close="false" :show-close="false"
:wrapper-closable="false" :wrapper-closable="mode.includes('detail') ? true : false"
:before-close="handleCancel"
class="drawer" class="drawer"
custom-class="mes-drawer" custom-class="mes-drawer"
size="60%" :size="size || '50%'"
@closed="$emit('destroy')"> @closed="$emit('destroy')">
<SmallTitle slot="title"> <SmallTitle slot="title">
{{ {{
@@ -42,7 +43,8 @@
v-model="form" v-model="form"
:rows="formRows" /> --> :rows="formRows" /> -->
<el-row style="margin-bottom: 24px"> <!-- if -->
<el-row v-if="mode.includes('detail')" style="margin-bottom: 24px">
<el-col :span="8"> <el-col :span="8">
<div <div
class="title" class="title"
@@ -60,17 +62,59 @@
关联表名 关联表名
</div> </div>
<div class="value" style="font-size: 14px"> <div class="value" style="font-size: 14px">
{{ form.plcTableName }} {{ form.plcName }}
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
<!-- else -->
<el-row v-else style="margin-bottom: 24px" :gutter="20">
<el-form ref="form" :model="form">
<el-col :span="8">
<el-form-item
class="title"
label="设备名"
style="font-size: 16px; margin: 8px 0">
<el-select
v-model="form.equipmentId"
filterable
clearable
placeholder="请选择设备">
<el-option
v-for="eq in eqList"
:key="eq.id"
:label="eq.name"
:value="eq.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
class="title"
label="设备关联表名"
style="font-size: 16px; margin: 8px 0">
<el-select
v-model="form.plcId"
filterable
clearable
placeholder="请选择关联表">
<el-option
v-for="plc in plcList"
:key="plc.id"
:label="plc.name"
:value="plc.id"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-form>
</el-row>
</div> </div>
<div <div
v-if="section.key == 'attrs'" v-if="section.key == 'attrs'"
style="position: relative; margin-top: 12px"> style="position: relative; margin-top: 12px">
<!-- v-if="!mode.includes('detail')" --> <div
<div style="position: absolute; top: -40px; right: 0"> v-if="!mode.includes('detail')"
style="position: absolute; top: -40px; right: 0">
<el-button @click="handleAddAttr" type="text"> <el-button @click="handleAddAttr" type="text">
<i class="el-icon-plus"></i> <i class="el-icon-plus"></i>
添加属性 添加属性
@@ -86,7 +130,7 @@
<!-- :add-button-show="mode.includes('detail') ? null : '添加属性'" <!-- :add-button-show="mode.includes('detail') ? null : '添加属性'"
@emitButtonClick="handleAddAttr" --> @emitButtonClick="handleAddAttr" -->
<method-btn <method-btn
v-if="section.tableBtn" v-if="section.tableBtn && !mode.includes('detail')"
slot="handleBtn" slot="handleBtn"
label="操作" label="操作"
:method-list="tableBtn" :method-list="tableBtn"
@@ -104,12 +148,13 @@
</section> </section>
</div> </div>
<div class="drawer-body__footer"> <div v-if="!mode.includes('detail')" class="drawer-body__footer">
<el-button style="" @click="handleCancel">取消</el-button> <el-button style="" @click="handleCancel">取消</el-button>
<!-- <el-button v-if="mode == 'detail'" type="primary" @click="toggleEdit"> <el-button
编辑 type="primary"
</el-button> --> @click="handleSave">
<!-- <el-button v-else type="primary" @click="handleCancel">确定</el-button> --> 确定
</el-button>
</div> </div>
</div> </div>
@@ -164,7 +209,7 @@ const SmallTitle = {
export default { export default {
components: { SmallTitle, DialogForm: BaseInfoForm, BaseInfoForm }, components: { SmallTitle, DialogForm: BaseInfoForm, BaseInfoForm },
props: ['sections', 'defaultMode', 'infoData'], props: ['sections', 'defaultMode', 'infoData', 'size'],
data() { data() {
return { return {
mode: '', mode: '',
@@ -173,6 +218,8 @@ export default {
total: 0, total: 0,
form: {}, form: {},
list: [], list: [],
eqList: [],
plcList: [],
attrTitle: '', attrTitle: '',
attrForm: { attrForm: {
id: null, id: null,
@@ -228,7 +275,7 @@ export default {
{ {
select: true, select: true,
label: '设备参数类型', label: '设备参数类型',
prop: 'equipment_param_type', prop: 'equipmentParamType',
options: [ options: [
{ label: '一般参数', value: 1 }, { label: '一般参数', value: 1 },
{ label: '工艺参数', value: 2 }, { label: '工艺参数', value: 2 },
@@ -245,7 +292,7 @@ export default {
{ {
select: true, select: true,
label: '生产参数类型', label: '生产参数类型',
prop: 'production_param_type', prop: 'productionParamType',
options: [ options: [
// { label: '进片数量', value: 1 }, // { label: '进片数量', value: 1 },
// { label: '出片数量', value: 2 }, // { label: '出片数量', value: 2 },
@@ -351,6 +398,17 @@ export default {
mounted() { mounted() {
this.shouldRefreshPageView = false; this.shouldRefreshPageView = false;
this.mode = this.defaultMode || 'detail'; this.mode = this.defaultMode || 'detail';
if (this.mode != 'detail') {
this.$axios('/base/core-equipment/listAll').then(({ code, data }) => {
this.eqList = data;
});
this.$axios({
url: '/base/equipment-plc/page',
}).then(({ code, data }) => {
this.plcList = data.list;
});
}
for (const section of this.sections) { for (const section of this.sections) {
// 请求具体信息 // 请求具体信息
if ('url' in section) { if ('url' in section) {
@@ -412,7 +470,7 @@ export default {
handleSave() { handleSave() {
this.$refs['form'][0].validate(async (valid) => { this.$refs['form'][0].validate(async (valid) => {
if (valid) { if (valid) {
const isEdit = this.mode == 'edit'; const isEdit = !this.mode.includes('detail');
await this.$axios({ await this.$axios({
url: this.sections[0][isEdit ? 'urlUpdate' : 'urlCreate'], url: this.sections[0][isEdit ? 'urlUpdate' : 'urlCreate'],
method: isEdit ? 'put' : 'post', method: isEdit ? 'put' : 'post',
@@ -450,6 +508,8 @@ export default {
defaultValue: '', defaultValue: '',
description: '', description: '',
remark: '', remark: '',
equipmentParamType: '',
productionParamType: '',
alarmContent: '', alarmContent: '',
}; };
this.attrTitle = '添加参数绑定信息'; this.attrTitle = '添加参数绑定信息';

View File

@@ -7,13 +7,15 @@
<template> <template>
<el-drawer <el-drawer
ref="drawer"
:visible.sync="visible" :visible.sync="visible"
:show-close="false" :show-close="false"
:wrapper-closable="false" :wrapper-closable="isdetail"
class="drawer" class="drawer"
size="60%"> size="60%"
@closed="$emit('destroy')">
<small-title slot="title" :no-padding="true"> <small-title slot="title" :no-padding="true">
{{ isdetail ? '查看详情' : '新增' }} {{ isdetail ? '查看详情' : !dataForm.id ? '新增' : '编辑' }}
</small-title> </small-title>
<el-form <el-form
ref="dataForm" ref="dataForm"
@@ -84,6 +86,19 @@
placeholder="选择巡检时间" /> placeholder="选择巡检时间" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-form-item label="数据来源" prop="origin">
<el-select
v-model="dataForm.origin"
filterable
:disabled="isdetail"
style="width: 100%"
placeholder="请选择数据来源">
<el-option key="1" label="手动" :value="1" />
<el-option key="2" label="自动" :value="2" />
</el-select>
</el-form-item>
</el-col>
</el-row> </el-row>
<el-form-item label="巡检内容"> <el-form-item label="巡检内容">
<base-table <base-table
@@ -93,20 +108,17 @@
:table-data="list" /> :table-data="list" />
</el-form-item> </el-form-item>
<el-form-item label="巡检详情" prop="description"> <el-form-item label="巡检详情" prop="description">
<editor v-model="dataForm.description" :read-only="isdetail" :min-height="380"/> <editor v-model="dataForm.description" :read-only="isdetail" :min-height="150"/>
</el-form-item> </el-form-item>
<el-form-item label="附件"> <el-form-item label="附件">
<FileUpload v-model="file" :disabled="isdetail" /> <FileUpload v-model="file" :limit="1" :f-name="fileName" :disabled="isdetail" @name="setFileName" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<div class="drawer-body__footer"> <div v-if="!isdetail" class="drawer-body__footer">
<el-button type="primary" @click="goback()">取消</el-button> <el-button type="primary" @click="goback()">取消</el-button>
<el-button v-if="isdetail" type="primary" @click="goEdit()"> <el-button type="primary" @click="dataFormSubmit()">确定</el-button>
编辑
</el-button>
<el-button v-else type="primary" @click="dataFormSubmit()">确定</el-button>
</div> </div>
</el-drawer> </el-drawer>
</template> </template>
@@ -173,6 +185,7 @@ export default {
actualTime: undefined, actualTime: undefined,
responsible: undefined, responsible: undefined,
description: undefined, description: undefined,
origin: undefined,
files: [] files: []
}, },
list: [], list: [],
@@ -184,6 +197,7 @@ export default {
total: 0, total: 0,
}, },
file: '', file: '',
fileName: '',
dataRule: { dataRule: {
responsible: [{ required: true, message: "巡检人不能为空", trigger: "blur" }], responsible: [{ required: true, message: "巡检人不能为空", trigger: "blur" }],
actualTime: [{ required: true, message: "巡检时间不能为空", trigger: "blur" }] actualTime: [{ required: true, message: "巡检时间不能为空", trigger: "blur" }]
@@ -194,6 +208,9 @@ export default {
this.getDict() this.getDict()
}, },
methods: { methods: {
setFileName(val) {
this.fileName = val
},
async getDict() { async getDict() {
const res = await getEquipmentAll() const res = await getEquipmentAll()
this.eqList = res.data this.eqList = res.data
@@ -222,16 +239,9 @@ export default {
return this.$refs.dataForm.resetFields(args); return this.$refs.dataForm.resetFields(args);
}, },
initData() { initData() {
this.dataForm = {
id: undefined,
configId: undefined,
equipmentId: undefined,
actualTime: undefined,
responsible: undefined,
description: undefined,
files: []
}
this.list = [] this.list = []
this.file = ''
this.fileName = ''
}, },
init(id, isdetail) { init(id, isdetail) {
this.initData(); this.initData();
@@ -239,6 +249,10 @@ export default {
this.dataForm.id = id || undefined; this.dataForm.id = id || undefined;
this.visible = true; this.visible = true;
// const scrollContainer = this.$refs.dataForm;
// const scrollPosition = scrollContainer.scrollTop;
// console.log('12', scrollPosition);
this.$nextTick(() => { this.$nextTick(() => {
this.$refs['dataForm'].resetFields(); this.$refs['dataForm'].resetFields();
@@ -247,6 +261,12 @@ export default {
getEqCheckLog(this.dataForm.id).then(response => { getEqCheckLog(this.dataForm.id).then(response => {
this.formLoading = false this.formLoading = false
this.dataForm = response.data; this.dataForm = response.data;
if (this.dataForm.files.length > 0) {
this.file = this.dataForm.files[0].fileUrl
this.fileName = this.dataForm.files[0].fileName
}
this.setConfig()
this.setInspectionContet()
}); });
} else { } else {
// if (this.urlOptions.isGetCode) { // if (this.urlOptions.isGetCode) {
@@ -283,8 +303,9 @@ export default {
if (this.file) { if (this.file) {
const temp = this.file.split(',') // 获取文件个数 const temp = this.file.split(',') // 获取文件个数
let arry = [] let arry = []
temp.forEach(item => { temp.forEach((item, index) => {
arry.push({ arry.push({
fileName: this.fileName,
fileType: 2, fileType: 2,
fileUrl: item fileUrl: item
}) })

View File

@@ -1,148 +0,0 @@
<template>
<el-dialog
:visible.sync="visible"
:width="'35%'"
:append-to-body="true"
:close-on-click-modal="false"
class="dialog">
<template #title>
<slot name="title">
<div class="titleStyle">
{{ !dataForm.id ? '新增' : '编辑' }}
</div>
</slot>
</template>
<el-form
ref="dataForm"
:model="dataForm"
:rules="dataRule"
label-width="100px"
@keyup.enter.native="dataFormSubmit()">
<el-form-item label="备品备件" prop="sparePartId">
<el-select
v-model="dataForm.sparePartId"
filterable
style="width: 100%"
placeholder="请选择备品备件">
<el-option
v-for="dict in partList"
:key="dict.id"
:label="dict.name"
:value="dict.id" />
</el-select>
</el-form-item>
</el-form>
<el-row style="text-align: right">
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="dataFormSubmit()">确定</el-button>
</el-row>
</el-dialog>
</template>
<script>
import {
createConfigDet,
getSparePartList
} from '@/api/equipment/base/spare-parts/config';
export default {
props: {
configId: {
type: String,
default: '',
},
},
data() {
return {
visible: false,
dataForm: {
id: undefined,
sparePartId: ''
},
partList: [],
dataRule: {
sparePartId: [{ required: true, message: '备品备件不能为空', trigger: 'change' }]
},
};
},
mounted() {
this.getDict()
},
methods: {
async getDict() {
const res = await getSparePartList()
this.partList = res.data
},
init(id) {
this.dataForm.id = id || '';
this.visible = true;
// this.$nextTick(() => {
// this.$refs['dataForm'].resetFields();
// if (this.dataForm.id) {
// getCoreProductAttr({
// id: this.dataForm.id
// }).then((res) => {
// const { name, value } = res.data;
// this.dataForm.name = name;
// this.dataForm.value = value;
// });
// }
// });
},
// 表单提交
dataFormSubmit() {
this.$refs['dataForm'].validate((valid) => {
if (valid) {
// 修改的提交
// if (this.dataForm.id) {
// updateCoreProductAttr({
// ...this.dataForm,
// productId: this.productId,
// }).then((response) => {
// this.$modal.msgSuccess('修改成功');
// this.visible = false;
// this.$emit('refreshDataList');
// });
// return;
// }
// 添加的提交
createConfigDet({
...this.dataForm,
configId: this.configId,
}).then((response) => {
this.$modal.msgSuccess('新增成功');
this.visible = false;
this.$emit('refreshDataList');
});
}
});
},
},
};
</script>
<style scoped>
.dialog >>> .el-dialog__body {
padding: 30px 24px;
}
.dialog >>> .el-dialog__header {
font-size: 16px;
color: rgba(0, 0, 0, 0.85);
font-weight: 500;
padding: 13px 24px;
border-bottom: 1px solid #e9e9e9;
}
.dialog >>> .el-dialog__header .titleStyle::before {
content: '';
display: inline-block;
width: 4px;
height: 16px;
background-color: #0b58ff;
border-radius: 1px;
margin-right: 8px;
position: relative;
top: 2px;
}
</style>

View File

@@ -49,7 +49,8 @@
<addRecord <addRecord
v-if="addOrUpdateVisible" v-if="addOrUpdateVisible"
ref="addOrUpdate" ref="addOrUpdate"
@refreshDataList="getList" /> @refreshDataList="getList"
@destroy="addOrUpdateVisible = false" />
</div> </div>
</template> </template>
@@ -93,7 +94,7 @@ export default {
tableProps: [ tableProps: [
{ prop: 'configName', label: '配置名称' }, { prop: 'configName', label: '配置名称' },
{ prop: 'equipmentName', label: '设备名称' }, { prop: 'equipmentName', label: '设备名称' },
// { prop: 'lineName', label: '数据来源' }, { prop: 'origin', label: '数据来源', filter: (val) => ['', '手动', '自动'][val] },
// { prop: 'sectionName', label: '计划巡检时间' }, // { prop: 'sectionName', label: '计划巡检时间' },
{ prop: 'actualTime', label: '实际巡检时间', filter: parseTime }, { prop: 'actualTime', label: '实际巡检时间', filter: parseTime },
// { prop: 'maintenanceDetail', label: '完成状态' }, // { prop: 'maintenanceDetail', label: '完成状态' },

View File

@@ -2,7 +2,7 @@
* @Author: zwq * @Author: zwq
* @Date: 2021-11-18 14:16:25 * @Date: 2021-11-18 14:16:25
* @LastEditors: DY * @LastEditors: DY
* @LastEditTime: 2023-11-24 18:38:22 * @LastEditTime: 2023-11-27 10:48:55
* @Description: * @Description:
--> -->
<template> <template>
@@ -176,11 +176,7 @@ export default {
handleClick(raw) { handleClick(raw) {
if (raw.type === 'delete') { if (raw.type === 'delete') {
this.$confirm( this.$confirm(
`确定对${ `是否确认删除巡检项目名称为"${raw.data.program}"的数据项?`,
raw.data.attrName
? '[名称=' + raw.data.attrName + ']'
: '[序号=' + raw.data._pageIndex + ']'
}进行删除操作?`,
'提示', '提示',
{ {
confirmButtonText: '确定', confirmButtonText: '确定',

View File

@@ -0,0 +1,105 @@
<!--
* @Author: zwq
* @Date: 2021-11-18 14:16:25
* @LastEditors: DY
* @LastEditTime: 2023-11-25 16:23:13
* @Description:
-->
<template>
<el-form
:model="dataForm"
:rules="dataRule"
ref="dataForm"
@keyup.enter.native="dataFormSubmit()"
label-width="80px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="配置名称" prop="name">
<el-input
v-model="dataForm.name"
placeholder="请输入配置名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="配置编码" prop="code">
<el-input
v-model="dataForm.code"
placeholder="请输入配置编码" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="设备名称" prop="equipmentId">
<el-select
v-model="dataForm.equipmentId"
filterable
style="width: 100%"
placeholder="请选择设备名称"
@change="setCode">
<el-option
v-for="dict in eqList"
:key="dict.id"
:label="dict.name"
:value="dict.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="设备编码" prop="equipmentCode">
<el-input v-model="dataForm.equipmentCode" disabled placeholder="请输入设备编码" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script>
import basicAdd from '../../../../core/mixins/basic-add';
import { getEqCheck, getCode, createCheckConfig, updateCheckConfig } from "@/api/equipment/base/inspection/settings";
import { getEquipmentAll } from '@/api/base/equipment'
export default {
mixins: [basicAdd],
data() {
return {
urlOptions: {
isGetCode: true,
codeURL: getCode,
createURL: createCheckConfig,
updateURL: updateCheckConfig,
infoURL: getEqCheck,
},
dataForm: {
id: undefined,
code: undefined,
name: undefined,
equipmentId: undefined,
equipmentCode: undefined
},
eqList: [],
dataRule: {
equipmentId: [{ required: true, message: "设备不能为空", trigger: "blur" }],
code: [{ required: true, message: "配置编码不能为空", trigger: "blur" }],
name: [{ required: true, message: "配置名称不能为空", trigger: "blur" }],
}
};
},
mounted() {
this.getDict()
},
methods: {
async getDict() {
// 设备列表
const res = await getEquipmentAll()
this.eqList = res.data
},
setCode() {
const chooseM = this.eqList.filter(item => {
return item.id === this.dataForm.equipmentId
})
this.dataForm.equipmentCode = chooseM[0].code
}
},
};
</script>

View File

@@ -36,14 +36,10 @@
:dialogVisible="open" :dialogVisible="open"
@close="cancel" @close="cancel"
@cancel="cancel" @cancel="cancel"
@confirm="submitForm"> @confirm="handleConfirm">
<DialogForm <add
v-if="open" ref="add"
ref="form" @refreshDataList="successSubmit" />
v-model="form"
:disabled="mode == 'detail'"
:has-files="false"
:rows="rows" />
</base-dialog> </base-dialog>
<!-- 添加巡检查看详情 --> <!-- 添加巡检查看详情 -->
<addOrUpdata <addOrUpdata
@@ -56,12 +52,13 @@
<script> <script>
import basicPageMixin from '@/mixins/lb/basicPageMixin'; import basicPageMixin from '@/mixins/lb/basicPageMixin';
import addOrUpdata from './add-or-updata.vue'; import addOrUpdata from './add-or-updata.vue';
import add from './add.vue'
// import { publicFormatter } from '@/utils/dict'; // import { publicFormatter } from '@/utils/dict';
// const timeFilter = (val) => moment(val).format('yyyy-MM-DD HH:mm:ss'); // const timeFilter = (val) => moment(val).format('yyyy-MM-DD HH:mm:ss');
export default { export default {
name: 'EquipmentCheckSetting', name: 'EquipmentCheckSetting',
components: { addOrUpdata }, components: { addOrUpdata, add },
mixins: [basicPageMixin], mixins: [basicPageMixin],
data() { data() {
return { return {
@@ -206,6 +203,13 @@ export default {
this.getList(); this.getList();
}, },
methods: { methods: {
handleConfirm() {
this.$refs.add.dataFormSubmit()
},
successSubmit() {
this.cancel()
this.getList()
},
initSearchBar() { initSearchBar() {
this.http('/base/core-equipment/listAll', 'get').then(({ data }) => { this.http('/base/core-equipment/listAll', 'get').then(({ data }) => {
this.$set( this.$set(
@@ -230,9 +234,10 @@ export default {
}, },
/** 取消按钮 */ /** 取消按钮 */
cancel() { cancel() {
this.$refs.add.formClear()
this.open = false; this.open = false;
this.mode = null; this.title = ''
this.reset(); // this.reset();
}, },
/** 表单重置 */ /** 表单重置 */
reset() { reset() {
@@ -257,18 +262,26 @@ export default {
}, },
/** 新增按钮操作 */ /** 新增按钮操作 */
handleAdd() { handleAdd() {
this.reset(); // this.reset();
this.open = true; this.open = true;
this.title = '添加巡检设置'; this.title = '添加巡检设置';
this.$nextTick(() => {
this.$refs.add.init();
});
}, },
/** 修改按钮操作 */ /** 修改按钮操作 */
handleUpdate(row) { handleUpdate(row) {
this.reset(); // this.reset();
const id = row.id; // const id = row.id;
this.info({ id }).then((response) => { // this.info({ id }).then((response) => {
this.form = response.data; // this.form = response.data;
this.open = true; // this.open = true;
this.title = '修改巡检设置'; // this.title = '修改巡检设置';
// });
this.open = true;
this.title = '修改巡检设置';
this.$nextTick(() => {
this.$refs.add.init(row.id);
}); });
}, },
/** 提交按钮 */ /** 提交按钮 */
@@ -298,7 +311,7 @@ export default {
handleDelete(row) { handleDelete(row) {
const id = row.id; const id = row.id;
this.$modal this.$modal
.confirm('是否确认删除该巡检记录?') .confirm('是否确认删除配置名为"' + row.name + '"的数据项?')
.then(() => { .then(() => {
return this.del({ id }); return this.del({ id });
}) })

View File

@@ -49,7 +49,7 @@
<script> <script>
import { publicFormatter } from '@/utils/dict'; import { publicFormatter } from '@/utils/dict';
import moment from 'moment'; // import moment from 'moment';
import basicPageMixin from '@/mixins/lb/basicPageMixin'; import basicPageMixin from '@/mixins/lb/basicPageMixin';
import { exportMaintainMonitorExcel } from '@/api/equipment/base/maintain/record' import { exportMaintainMonitorExcel } from '@/api/equipment/base/maintain/record'
import { parseTime } from '@/utils/ruoyi' import { parseTime } from '@/utils/ruoyi'
@@ -67,7 +67,7 @@ const remainBox = {
color() { color() {
if (this.value) { if (this.value) {
const v = +this.value; const v = +this.value;
return v < 0 ? 'red' : v >= 0 && v < 2 ? 'yellow' : 'green'; return v < 0 ? '#FF5454' : v >= 0 && v < 2 ? '#FFD767' : '#37D97F';
} }
return 'unset'; return 'unset';
}, },
@@ -78,9 +78,10 @@ const remainBox = {
style={`background: ${ style={`background: ${
this.color this.color
}; position:absolute; inset: 0; padding: 0 10px; display: flex; align-items: center; color: ${ }; position:absolute; inset: 0; padding: 0 10px; display: flex; align-items: center; color: ${
this.color == 'red' ? '#fff' : 'unset' // this.color == 'red' ? '#fff' : 'unset'
'#fff'
}`}> }`}>
{this.injectData[this.injectData.prop] || ''} { this.injectData[this.injectData.prop]?.toFixed(0) || '' }
</div> </div>
); );
}, },
@@ -121,30 +122,35 @@ export default {
// width: 180, // width: 180,
// filter: parseTime(createTime), // filter: parseTime(createTime),
// }, // },
{ prop: 'name', label: '保养计划' }, { prop: 'name', label: '保养计划', minWidth: 100, showOverflowtooltip: true },
{ prop: 'lineName', label: '产线名' }, { prop: 'lineName', label: '产线名', minWidth: 100, showOverflowtooltip: true },
{ prop: 'sectionName', label: '工段名' }, { prop: 'sectionName', label: '工段名', minWidth: 100, showOverflowtooltip: true },
{ prop: 'equipmentName', label: '设备名称' }, { prop: 'equipmentName', label: '设备名称', minWidth: 100, showOverflowtooltip: true },
{ prop: 'equipmentCode', label: '设备编码' }, { prop: 'equipmentCode', label: '设备编码', minWidth: 100, showOverflowtooltip: true },
{ prop: 'maintenancePeriod', label: '保养频率' }, { prop: 'maintenancePeriod', label: '保养频率' },
{ {
prop: 'maintainType', prop: 'maintainType',
label: '保养类型', label: '保养类型',
showOverflowtooltip: true,
filter: publicFormatter(this.DICT_TYPE.MAINTAIN_TYPE), filter: publicFormatter(this.DICT_TYPE.MAINTAIN_TYPE),
}, },
{ {
prop: 'lastMaintainTime', prop: 'lastMaintainTime',
label: '上次保养时间', label: '上次保养时间',
filter: parseTime, filter: parseTime,
minWidth: 150,
showOverflowtooltip: true
}, },
{ prop: 'nextMaintainTime', label: '计划下次保养时间', filter: parseTime }, { prop: 'nextMaintainTime', label: '计划下次保养时间', filter: parseTime, minWidth: 150, showOverflowtooltip: true },
{ {
prop: 'remainDays', prop: 'remainDays',
label: '距离保养时间(天)', label: '距离保养时间(天)',
subcomponent: remainBox, subcomponent: remainBox,
minWidth: 150,
// showOverflowtooltip: true
}, },
{ prop: 'opt1', label: '设备保养', name: '操作', subcomponent: btn }, { prop: 'opt1', label: '设备保养', name: '操作', subcomponent: btn, width: 100 },
{ prop: 'opt2', label: '保养记录', name: '查看详情', subcomponent: btn }, { prop: 'opt2', label: '保养记录', name: '查看详情', subcomponent: btn, width: 100 },
], ],
searchBarFormConfig: [ searchBarFormConfig: [
{ {
@@ -176,6 +182,7 @@ export default {
: '', : '',
btnName: '导出', btnName: '导出',
name: 'export', name: 'export',
plain: true,
color: 'warning', color: 'warning',
}, },
], ],

View File

@@ -99,23 +99,24 @@ export default {
prop: 'createTime', prop: 'createTime',
label: '添加时间', label: '添加时间',
fixed: true, fixed: true,
width: 180, width: 150,
filter: timeFilter, filter: timeFilter,
}, },
{ prop: 'maintainOrderNumber', label: '设备保养单号' }, { prop: 'maintainOrderNumber', label: '设备保养单号', width: 110, showOverflowtooltip: true },
{ prop: 'startTime', label: '开始时间', filter: timeFilter }, { prop: 'startTime', label: '开始时间', filter: timeFilter, minWidth: 150, showOverflowtooltip: true },
{ prop: 'endTime', label: '结束时间', filter: timeFilter }, { prop: 'endTime', label: '结束时间', filter: timeFilter, minWidth: 150, showOverflowtooltip: true },
{ prop: 'equipmentName', label: '设备名称' }, { prop: 'equipmentName', label: '设备名称', minWidth: 100, showOverflowtooltip: true },
{ prop: 'maintainWorker', label: '保养人员' }, { prop: 'maintainWorker', label: '保养人员', minWidth: 100, showOverflowtooltip: true },
{ {
prop: 'relatePlan', prop: 'relatePlan',
label: '是否计划保养', label: '是否计划保养',
width: 120,
filter: (v) => (v != null ? ['', '是', '否'][v] : ''), filter: (v) => (v != null ? ['', '是', '否'][v] : ''),
}, },
{ prop: 'planName', label: '保养计划名称' }, { prop: 'planName', label: '保养计划名称', minWidth: 120, showOverflowtooltip: true },
{ prop: 'maintainDuration', label: '计划保养用时(h)' }, { prop: 'maintainDuration', label: '计划保养用时(h)', minWidth: 130, showOverflowtooltip: true },
{ prop: 'timeUsed', label: '实际保养用时(h)' }, { prop: 'timeUsed', label: '实际保养用时(h)', minWidth: 130 },
{ prop: 'remark', label: '备注' }, { prop: 'remark', label: '备注', minWidth: 100, showOverflowtooltip: true },
], ],
searchBarFormConfig: [ searchBarFormConfig: [
{ {
@@ -162,6 +163,15 @@ export default {
{ {
type: 'separate', type: 'separate',
}, },
{
type: this.$auth.hasPermi('equipment:maintain-record:export')
? 'button'
: '',
btnName: '导出',
name: 'export',
plain: true,
color: 'warning',
},
{ {
type: this.$auth.hasPermi('equipment:maintain-record:create') type: this.$auth.hasPermi('equipment:maintain-record:create')
? 'button' ? 'button'
@@ -171,14 +181,6 @@ export default {
plain: true, plain: true,
color: 'success', color: 'success',
}, },
{
type: this.$auth.hasPermi('equipment:maintain-record:export')
? 'button'
: '',
btnName: '导出',
name: 'export',
color: 'warning',
},
], ],
rows: [ rows: [
[ [
@@ -213,17 +215,29 @@ export default {
}, },
], ],
[ [
// {
// switch: true,
// label: '是否计划保养',
// prop: 'relatePlan',
// bind: {
// 'active-value': 1,
// 'inactive-value': 2,
// },
// rules: [{ required: true, message: '是否计划保养不能为空', trigger: 'blur' }],
// },
{ {
switch: true, select: true,
options: [
{ label: '是', value: 1 },
{ label: '否', value: 2 }
],
label: '是否计划保养', label: '是否计划保养',
prop: 'relatePlan', prop: 'relatePlan',
bind: { bind: {
'active-value': 1, clearable: true, filterable: true
'inactive-value': 2,
}, },
rules: [{ required: true, message: '是否计划保养不能为空', trigger: 'blur' }], rules: [{ required: true, message: '是否计划保养不能为空', trigger: 'blur' }],
}, },
{},
{ {
select: true, select: true,
label: '所属计划', label: '所属计划',
@@ -234,6 +248,11 @@ export default {
clearable: true, clearable: true,
}, },
}, },
{
input: true,
label: '保养用时',
prop: 'timeUsed',
},
], ],
[ [
{ {
@@ -260,11 +279,7 @@ export default {
clearable: true, clearable: true,
}, },
}, },
{ {}
input: true,
label: '保养用时',
prop: 'timeUsed',
},
], ],
[ [

View File

@@ -9,166 +9,168 @@
<el-drawer <el-drawer
:visible.sync="visible" :visible.sync="visible"
:show-close="false" :show-close="false"
:wrapper-closable="false" :wrapper-closable="disabled"
class="drawer" class="drawer"
size="60%"> custom-class="mes-drawer"
size="65%"
@closed="$emit('destroy')">
<small-title slot="title" :no-padding="true"> <small-title slot="title" :no-padding="true">
{{ disabled ? '查看详情' : !dataForm.maintenanceStatus ? '修改' : '完成' }} {{ disabled ? '查看详情' : !dataForm.maintenanceStatus ? '修改' : '完成' }}
</small-title> </small-title>
<el-form <div class="drawer-body flex">
ref="form" <div class="drawer-body__content">
:model="dataForm" <el-form
label-width="100px" ref="form"
label-position="top" :model="dataForm"
v-loading="formLoading"> label-width="100px"
<el-row :gutter="20"> label-position="top"
<el-col :span="8"> v-loading="formLoading">
<el-form-item label="维修单号" prop="repairOrderNumber"> <el-row :gutter="20">
<span>{{ dataForm.repairOrderNumber }}</span> <el-col :span="8">
</el-form-item> <el-form-item label="维修单号" prop="repairOrderNumber">
</el-col> <span>{{ dataForm.repairOrderNumber }}</span>
<el-col :span="8"> </el-form-item>
<el-form-item label="设备名称" prop="equipmentName"> </el-col>
<span>{{ dataForm.equipmentName }}</span> <el-col :span="8">
</el-form-item> <el-form-item label="设备名称" prop="equipmentName">
</el-col> <span>{{ dataForm.equipmentName }}</span>
<el-col :span="8"> </el-form-item>
<el-form-item label="维修工" prop="repairman"> </el-col>
<span>{{ dataForm.repairman }}</span> <el-col :span="8">
</el-form-item> <el-form-item label="维修工" prop="repairman">
</el-col> <span>{{ dataForm.repairman }}</span>
</el-row> </el-form-item>
<el-row :gutter="20"> </el-col>
<el-col :span="8"> </el-row>
<el-form-item label="故障发生时间" prop="faultTime"> <el-row :gutter="20">
<span>{{ parseTime(dataForm.faultTime) }}</span> <el-col :span="8">
</el-form-item> <el-form-item label="故障发生时间" prop="faultTime">
</el-col> <span>{{ parseTime(dataForm.faultTime) }}</span>
<el-col :span="8"> </el-form-item>
<el-form-item label="故障级别" prop="faultLevel"> </el-col>
<span>{{ getDictDataLabel('fault-level', dataForm.faultLevel) }}</span> <el-col :span="8">
</el-form-item> <el-form-item label="故障级别" prop="faultLevel">
</el-col> <span>{{ getDictDataLabel('fault-level', dataForm.faultLevel) }}</span>
<el-col :span="8"> </el-form-item>
<el-form-item label="联系方式" prop="repairmanPhone"> </el-col>
<span>{{ dataForm.repairmanPhone }}</span> <el-col :span="8">
</el-form-item> <el-form-item label="联系方式" prop="repairmanPhone">
</el-col> <span>{{ dataForm.repairmanPhone }}</span>
</el-row> </el-form-item>
<small-title style="margin: 16px 0; padding-left: 8px" :no-padding="true"> </el-col>
{{ '可编辑信息' }} </el-row>
</small-title>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item
label="维修开始时间"
prop="maintenanceStartTime"
:rules="[{ required: true, message: '维修开始时间不能为空', trigger: 'blur' }]">
<el-date-picker
v-model="dataForm.maintenanceStartTime"
type="datetime"
:disabled="disabled"
placeholder="请选择维修开始时间"
value-format="timestamp" />
</el-form-item>
</el-col>
<el-col :span="8"> <el-divider style="margin-top: -10px" />
<el-form-item
label="维修结束时间" <small-title style="margin: 16px 0; padding-left: 8px" :no-padding="true">
prop="maintenanceFinishTime" {{ '设备维修信息' }}
:rules="[{ required: true, message: '维修结束时间不能为空', trigger: 'blur' }]"> </small-title>
<el-date-picker <el-row :gutter="20">
v-model="dataForm.maintenanceFinishTime" <el-col :span="6">
type="datetime" <el-form-item
:disabled="disabled" label="维修开始时间"
placeholder="请选择维修开始时间" prop="maintenanceStartTime"
value-format="timestamp" /> :rules="[{ required: true, message: '维修开始时间不能为空', trigger: 'blur' }]">
</el-form-item> <el-date-picker
</el-col> v-model="dataForm.maintenanceStartTime"
type="datetime"
:disabled="disabled"
placeholder="请选择维修开始时间"
value-format="timestamp" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item
label="维修结束时间"
prop="maintenanceFinishTime"
:rules="[{ required: true, message: '维修结束时间不能为空', trigger: 'blur' }]">
<el-date-picker
v-model="dataForm.maintenanceFinishTime"
type="datetime"
:disabled="disabled"
placeholder="请选择维修开始时间"
value-format="timestamp" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item
label="维修方式"
prop="repairMode"
:rules="[{ required: true, message: '维修方式不能为空', trigger: 'blur' }]">
<el-select
:disabled="disabled"
v-model="dataForm.repairMode"
placeholder="请选择维修方式">
<el-option
v-for="opt in getDictDatas('repair-mode')"
:key="opt.value"
:label="opt.label"
:value="opt.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="故障类型" prop="faultType">
<el-select
:disabled="disabled"
v-model="dataForm.faultType"
placeholder="请选择故障类型">
<el-option
v-for="opt in getDictDatas('fault-type')"
:key="opt.value"
:label="opt.label"
:value="opt.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-col :span="8"> <el-row :gutter="20">
<el-form-item <el-col>
label="维修方式" <el-form-item
prop="repairMode" label="故障明细"
:rules="[{ required: true, message: '维修方式不能为空', trigger: 'blur' }]"> prop="faultDetail"
<el-select :rules="[{ required: true, message: '故障明细不能为空', trigger: 'blur' }]">
:disabled="disabled" <!-- // 富文本 -->
v-model="dataForm.repairMode" <editor v-model="dataForm.faultDetail" :read-only="disabled" :min-height="150"/>
placeholder="请选择维修方式"> </el-form-item>
<el-option </el-col>
v-for="opt in getDictDatas('repair-mode')" </el-row>
:key="opt.value"
:label="opt.label"
:value="opt.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="故障类型" prop="faultType">
<el-select
:disabled="disabled"
v-model="dataForm.faultType"
placeholder="请选择故障类型">
<el-option
v-for="opt in getDictDatas('fault-type')"
:key="opt.value"
:label="opt.label"
:value="opt.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col> <el-col>
<el-form-item <el-form-item label="维修记录" prop="maintenanceDetail">
label="故障明细" <!-- // 富文本 -->
prop="faultDetail" <editor v-model="dataForm.maintenanceDetail" :read-only="disabled" :min-height="150"/>
:rules="[{ required: true, message: '故障明细不能为空', trigger: 'blur' }]"> </el-form-item>
<!-- // 富文本 --> </el-col>
<editor v-model="dataForm.faultDetail" :read-only="disabled" :min-height="380"/> </el-row>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col> <el-col>
<el-form-item label="维修记录" prop="maintenanceDetail"> <el-form-item label="维修附件" prop="file">
<!-- // 富文本 --> <FileUpload v-model="file" :limit="1" :f-name="fileName" :disabled="disabled" @name="setFileName" />
<editor v-model="dataForm.maintenanceDetail" :read-only="disabled" :min-height="380"/> </el-form-item>
</el-form-item> </el-col>
</el-col> </el-row>
</el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col> <el-col>
<el-form-item label="维修附件" prop="file"> <el-form-item label="备注" prop="remark">
<FileUpload v-model="file" :disabled="disabled" /> <el-input
</el-form-item> v-model="dataForm.remark"
</el-col> :placeholder="`请输入备注`"
</el-row> :disabled="disabled" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-row :gutter="20"> <div v-if="!disabled" class="drawer-body__footer">
<el-col> <el-button style="" @click="goback()">取消</el-button>
<el-form-item label="备注" prop="remark"> <el-button type="primary" @click="dataFormSubmit()">确定</el-button>
<el-input </div>
v-model="dataForm.remark" </div>
:placeholder="`请输入备注`"
:disabled="disabled" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="drawer-body__footer">
<el-button style="" @click="goback()">{{ disabled ? '返回' : '取消' }}</el-button>
<!-- <el-button v-if="disabled" type="primary" @click="goEdit()">
编辑
</el-button> -->
<el-button v-if="!disabled" type="primary" @click="dataFormSubmit()">确定</el-button>
</div> </div>
</el-drawer> </el-drawer>
</template> </template>
@@ -206,11 +208,15 @@ export default {
visible: false, visible: false,
disabled: false, disabled: false,
dataForm: {}, dataForm: {},
file: '' file: '',
fileName: ''
}; };
}, },
mounted() {}, mounted() {},
methods: { methods: {
setFileName(val) {
this.fileName = val
},
goback() { goback() {
this.$emit('refreshDataList'); this.$emit('refreshDataList');
this.visible = false; this.visible = false;
@@ -225,12 +231,15 @@ export default {
resetFields(args) { resetFields(args) {
return this.$refs.form.resetFields(args); return this.$refs.form.resetFields(args);
}, },
initData() {
this.file = ''
this.fileName = ''
},
init(row, isdetail) { init(row, isdetail) {
// this.initData(); this.initData();
this.disabled = isdetail || false; this.disabled = isdetail || false;
this.dataForm.id = row.id || undefined; this.dataForm.id = row.id || undefined;
this.visible = true; this.visible = true;
console.log('111', this.dataForm, row)
this.$nextTick(() => { this.$nextTick(() => {
this.$refs['form'].resetFields(); this.$refs['form'].resetFields();
@@ -241,6 +250,10 @@ export default {
this.formLoading = false this.formLoading = false
this.dataForm = response.data; this.dataForm = response.data;
this.dataForm.maintenanceStatus = row.maintenanceStatus || 0 this.dataForm.maintenanceStatus = row.maintenanceStatus || 0
if (this.dataForm.files.length > 0) {
this.file = this.dataForm.files[0].fileUrl
this.fileName = this.dataForm.files[0].fileName
}
}); });
} else { } else {
// if (this.urlOptions.isGetCode) { // if (this.urlOptions.isGetCode) {
@@ -261,6 +274,7 @@ export default {
let arry = [] let arry = []
temp.forEach(item => { temp.forEach(item => {
arry.push({ arry.push({
fileName: this.fileName,
fileType: 2, fileType: 2,
fileUrl: item fileUrl: item
}) })
@@ -288,56 +302,39 @@ export default {
</script> </script>
<style scoped> <style scoped>
.el-date-editor,
.el-select {
width: 100%;
}
.drawer-body__footer {
display: flex;
justify-content: flex-end;
padding: 18px;
}
.drawer >>> .el-drawer { .drawer >>> .el-drawer {
border-radius: 8px 0 0 8px; border-radius: 8px 0 0 8px;
display: flex;
flex-direction: column;
}
.drawer >>> .el-form-item__label {
padding: 0;
} }
.drawer >>> .el-drawer__header { .drawer >>> .el-drawer__header {
margin: 0; margin: 0;
padding: 32px 32px 24px; padding: 32px 32px 24px;
border-bottom: 1px solid #dcdfe6; border-bottom: 1px solid #dcdfe6;
margin-bottom: 0px;
} }
.drawer >>> .el-drawer__body {
flex: 1; .small-title::before {
height: 1px; content: '';
display: inline-block;
vertical-align: top;
width: 4px;
height: 22px;
border-radius: 1px;
margin-right: 8px;
background-color: #0b58ff;
}
.drawer-body {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: 100%;
} }
.drawer >>> .content { .drawer-body__content {
padding: 30px 24px;
flex: 1; flex: 1;
display: flex; /* background: #eee; */
flex-direction: column; padding: 20px 30px;
/* height: 100%; */ overflow-y: auto;
}
.drawer >>> .visual-part {
flex: 1 auto;
max-height: 76vh;
overflow: hidden;
overflow-y: scroll;
padding-right: 10px; /* 调整滚动条样式 */
}
.drawer >>> .el-form,
.drawer >>> .attr-list {
padding: 0 16px;
} }
.drawer-body__footer { .drawer-body__footer {

View File

@@ -17,7 +17,7 @@
v-if="tableBtn.length" v-if="tableBtn.length"
slot="handleBtn" slot="handleBtn"
label="操作" label="操作"
:width="180" :width="120"
:method-list="tableBtn" :method-list="tableBtn"
@clickBtn="handleTableBtnClick" /> @clickBtn="handleTableBtnClick" />
</base-table> </base-table>
@@ -48,7 +48,8 @@
<CustomDialogForm <CustomDialogForm
v-if="addOrUpdateVisible" v-if="addOrUpdateVisible"
ref="addOrUpdate" ref="addOrUpdate"
@refreshDataList="getList" /> @refreshDataList="getList"
@destroy="addOrUpdateVisible = false" />
</div> </div>
</template> </template>
@@ -69,12 +70,6 @@ export default {
addOrUpdateVisible: false, addOrUpdateVisible: false,
searchBarKeys: ['maintenanceStatus', 'createTime', 'equipmentId'], searchBarKeys: ['maintenanceStatus', 'createTime', 'equipmentId'],
tableBtn: [ tableBtn: [
this.$auth.hasPermi('equipment:repair:update')
? {
type: 'detail',
btnName: '详情',
}
: undefined,
this.$auth.hasPermi('equipment:repair:finish') this.$auth.hasPermi('equipment:repair:finish')
? { ? {
type: 'finish', type: 'finish',
@@ -83,10 +78,16 @@ export default {
: undefined, : undefined,
this.$auth.hasPermi('equipment:repair:update') this.$auth.hasPermi('equipment:repair:update')
? { ? {
type: 'edit', type: 'detail',
btnName: '修改', btnName: '详情',
} }
: undefined, : undefined,
// this.$auth.hasPermi('equipment:repair:update')
// ? {
// type: 'edit',
// btnName: '修改',
// }
// : undefined,
this.$auth.hasPermi('equipment:repair:delete') this.$auth.hasPermi('equipment:repair:delete')
? { ? {
type: 'delete', type: 'delete',
@@ -99,29 +100,31 @@ export default {
prop: 'createTime', prop: 'createTime',
label: '添加时间', label: '添加时间',
fixed: true, fixed: true,
width: 180, width: 150,
filter: parseTime, filter: parseTime,
}, },
{ prop: 'repairOrderNumber', label: '设备维修单号' }, { prop: 'repairOrderNumber', label: '设备维修单号', minWidth: 100, showOverflowtooltip: true },
{ prop: 'maintenanceStartTime', label: '开始时间', filter: parseTime }, { prop: 'maintenanceStartTime', label: '开始时间', filter: parseTime, minWidth: 150, showOverflowtooltip: true },
{ {
prop: 'maintenanceFinishTime', prop: 'maintenanceFinishTime',
label: '结束时间', label: '结束时间',
filter: parseTime, filter: parseTime,
minWidth: 150,
showOverflowtooltip: true
}, },
{ {
prop: 'maintenanceStatus', prop: 'maintenanceStatus',
label: '维修状态', label: '维修状态',
filter: (v) => (v != null ? ['未完成', '完成', '进行中'][v] : ''), filter: (v) => (v != null ? ['未完成', '完成', '进行中'][v] : ''),
}, },
{ prop: 'maintenanceDuration', label: '维修时长(h)' }, { prop: 'maintenanceDuration', label: '维修时长(h)', width: 110 },
{ prop: 'lineName', label: '产线' }, { prop: 'lineName', label: '产线' },
{ prop: 'sectionName', label: '工段' }, { prop: 'sectionName', label: '工段' },
{ prop: 'equipmentName', label: '设备名称' }, { prop: 'equipmentName', label: '设备名称', minWidth: 100, showOverflowtooltip: true },
{ prop: 'maintenanceDetail', label: '维修明细' }, { prop: 'maintenanceDetail', label: '维修明细' },
{ prop: 'repairman', label: '维修工' }, { prop: 'repairman', label: '维修工', minWidth: 100, showOverflowtooltip: true },
{ prop: 'repairmanPhone', label: '联系方式' }, { prop: 'repairmanPhone', label: '联系方式', minWidth: 100, showOverflowtooltip: true },
{ prop: 'remark', label: '备注' }, { prop: 'remark', label: '备注', minWidth: 120, showOverflowtooltip: true },
], ],
searchBarFormConfig: [ searchBarFormConfig: [
{ {
@@ -176,6 +179,7 @@ export default {
type: this.$auth.hasPermi('equipment:repair:export') ? 'button' : '', type: this.$auth.hasPermi('equipment:repair:export') ? 'button' : '',
btnName: '导出', btnName: '导出',
name: 'export', name: 'export',
plain: true,
color: 'warning', color: 'warning',
}, },
], ],

View File

@@ -17,6 +17,8 @@
<el-select <el-select
size="small" size="small"
placeholder="请选择产线" placeholder="请选择产线"
clearable
filterable
@change="getEquipmentByLineId" @change="getEquipmentByLineId"
v-model="form.productionLineId"> v-model="form.productionLineId">
<el-option <el-option
@@ -30,6 +32,8 @@
<el-select <el-select
size="small" size="small"
placeholder="请选择设备" placeholder="请选择设备"
clearable
filterable
v-model="form.equipmentId"> v-model="form.equipmentId">
<el-option <el-option
v-for="item in listEq" v-for="item in listEq"
@@ -105,7 +109,12 @@ export default {
} }
this.listEq.splice(0); this.listEq.splice(0);
}, },
handleSearch() {}, handleSearch() {
this.$emit('action', {
action: 'search',
payload: this.form,
});
},
}, },
}; };
</script> </script>

View File

@@ -1,7 +1,7 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<SearchBarNew v-model="searchBarForm" /> <SearchBarNew v-model="searchBarForm" @action="handleSearchBarActions" />
<!-- 列表 --> <!-- 列表 -->
<base-table <base-table
@@ -128,13 +128,31 @@ export default {
list: [], list: [],
}; };
}, },
mounted() {
this.getList();
},
methods: { methods: {
handleEmitFun(val) { /**
console.log('你好', val); * 处理表格按钮点击事件
if (val.action === '状态可视化') { * @param {string} action 按钮名称
* @param {object} value 按钮数据(行数据) { equipmentId, equipmentCode, equipmentName, inQuantity, outQuantity, run, status, error, quantityRecordTime, statusRecordTime}
*/
handleEmitFun({ action, value: row } = {}) {
if (action === '状态可视化') {
// 状态可视化 // 状态可视化
} else { } else if (action === '参数监控') {
// 参数监控 // 参数监控
// 接口需要 equipmentId recordTime workOrderId 工单id
this.$router.push({
// path: '/equipment/monitor/full-params',
name: 'EquipmentFullParams',
params: {
equipmentId: row.equipmentId,
equipmentCode: row.equipmentCode,
equipmentName: row.equipmentName,
},
});
} else {
} }
}, },
/** 查询列表 */ /** 查询列表 */
@@ -172,9 +190,25 @@ export default {
// }; // };
// this.resetForm('form'); // this.resetForm('form');
// }, // },
handleSearchBarActions({ action, payload }) {
switch (action) {
case 'search':
this.handleQuery();
break;
case 'reset':
this.resetQuery();
break;
default:
break;
}
},
/** 搜索按钮操作 */ /** 搜索按钮操作 */
handleQuery() { handleQuery() {
this.queryParams.pageNo = 1; this.queryParams = {
...this.queryParams,
...this.searchBarForm,
pageNo: 1,
};
this.getList(); this.getList();
}, },
/** 重置按钮操作 */ /** 重置按钮操作 */

View File

@@ -80,6 +80,8 @@
<el-select <el-select
v-if="open" v-if="open"
style="width: 100%" style="width: 100%"
filterable
clearable
v-model="queryParams.equipmentId" v-model="queryParams.equipmentId"
placeholder="请选择一个设备"> placeholder="请选择一个设备">
<el-option <el-option

View File

@@ -2,7 +2,7 @@
* @Author: zwq * @Author: zwq
* @Date: 2021-11-18 14:16:25 * @Date: 2021-11-18 14:16:25
* @LastEditors: zhp * @LastEditors: zhp
* @LastEditTime: 2023-11-22 16:50:55 * @LastEditTime: 2023-11-28 10:03:20
* @Description: * @Description:
--> -->
<template> <template>
@@ -53,7 +53,7 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
<div class="drawer-body__footer"> <div v-if="!isdetail" class="drawer-body__footer">
<el-button style="" @click="goback()">取消</el-button> <el-button style="" @click="goback()">取消</el-button>
<el-button v-if="isdetail" type="primary" @click="goEdit()"> <el-button v-if="isdetail" type="primary" @click="goEdit()">
编辑 编辑

View File

@@ -1,8 +1,13 @@
<!-- <!--
* @Author: zwq * @Author: zwq
* @Date: 2021-11-18 14:16:25 * @Date: 2021-11-18 14:16:25
<<<<<<< HEAD
* @LastEditors: zhp * @LastEditors: zhp
* @LastEditTime: 2023-11-23 09:20:12 * @LastEditTime: 2023-11-28 10:09:20
=======
* @LastEditors: DY
* @LastEditTime: 2023-11-27 16:37:17
>>>>>>> projects/mes-test
* @Description: * @Description:
--> -->
<template> <template>
@@ -53,7 +58,7 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
<div v-if="isdetail" class="drawer-body__footer"> <div v-if="!isdetail" class="drawer-body__footer">
<el-button style="" @click="goback()">取消</el-button> <el-button style="" @click="goback()">取消</el-button>
<el-button v-if="isdetail" type="primary" @click="goEdit()"> <el-button v-if="isdetail" type="primary" @click="goEdit()">
编辑 编辑
@@ -140,7 +145,7 @@ const tableProps = [
label: '最小值(工艺)', label: '最小值(工艺)',
}, },
{ {
prop: 'manValue', prop: 'maxValue',
label: '最大值(工艺)', label: '最大值(工艺)',
}, },
{ {

View File

@@ -1,7 +1,7 @@
<!-- <!--
* @Author: zhp * @Author: zhp
* @Date: 2023-11-08 15:30:27 * @Date: 2023-11-08 15:30:27
* @LastEditTime: 2023-11-23 14:26:54 * @LastEditTime: 2023-11-28 10:11:40
* @LastEditors: zhp * @LastEditors: zhp
* @Description: * @Description:
--> -->
@@ -84,7 +84,7 @@ export default {
}, },
equipmentId:null, equipmentId:null,
dataRule: { dataRule: {
attrName: [{ required: true, message: '名称不能为空', trigger: 'blur' }], paramId: [{ required: true, message: '参数名称不能为空', trigger: 'change' }],
}, },
}; };
}, },

View File

@@ -279,7 +279,7 @@ export default {
.then(async () => { .then(async () => {
const { code } = await this.http( const { code } = await this.http(
'/extend/process-flow/copy', '/extend/process-flow/copy',
'post', 'get',
{ {
id, id,
} }
@@ -333,10 +333,11 @@ export default {
async getList() { async getList() {
this.loading = true; this.loading = true;
const { code, data } = await this.recv(this.queryParams); // const { code, data } = await this.recv(this.queryParams);
const { code, data } = await this.http('/extend/process-flow/listAll', 'get');
if (code == 0) { if (code == 0) {
this.list = data.list; this.list = data;
this.total = data.total; // this.total = data.total;
this.loading = false; this.loading = false;
return; return;
} }

View File

@@ -28,7 +28,7 @@ export default {
// }, // },
props: { props: {
currentSelect: { currentSelect: {
type: String, type: String | Number,
default: null, default: null,
}, },
list: { list: {
@@ -59,8 +59,16 @@ export default {
}, },
currentSelect: { currentSelect: {
handler(val) { handler(val) {
// val: string
this.selected = val; this.selected = val;
this.randomKey = Math.random(); this.randomKey = Math.random();
// 更新选中状态
if (val) {
this.list__inner.forEach((item) => {
if (item.id == val) item.disabled = false;
else item.disabled = true;
});
}
}, },
immediate: true, immediate: true,
}, },

View File

@@ -19,7 +19,7 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row style="border: 1px solid #ccc; display: flex"> <el-row v-if="filteredBomList.length" style="border: 1px solid #ccc; display: flex">
<el-col :span="8"> <el-col :span="8">
<div class="select-list"> <div class="select-list">
<div class="sl__header" style="background: #f3f4fb; padding: 12px"> <div class="sl__header" style="background: #f3f4fb; padding: 12px">
@@ -78,6 +78,7 @@
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
<div class="no-data-bg" v-else></div>
</div> </div>
</template> </template>
; ;

View File

@@ -77,6 +77,17 @@
:bom-list="bomList" :bom-list="bomList"
:value="selectedBoms" :value="selectedBoms"
@update="selectedBoms = $event" /> @update="selectedBoms = $event" />
<el-row slot="footer">
<el-button size="small" @click="cancel">取消</el-button>
<el-button
type="primary"
size="small"
@click="submitForm"
:loading="btnLoading">
确定
</el-button>
</el-row>
</base-dialog> </base-dialog>
</section> </section>
</template> </template>
@@ -95,6 +106,7 @@ export default {
}, },
data() { data() {
return { return {
btnLoading: false,
open: false, open: false,
eqList: [], eqList: [],
bomList: [], bomList: [],
@@ -170,6 +182,7 @@ export default {
}); });
}, },
submitForm() { submitForm() {
this.btnLoading = true;
// 现将子组件的修改提交更新至本组件 // 现将子组件的修改提交更新至本组件
this.$refs.bomSelector.commit(); this.$refs.bomSelector.commit();
// 再提交至后端 // 再提交至后端
@@ -187,11 +200,14 @@ export default {
if (code == 0) { if (code == 0) {
this.$message.success('操作成功'); this.$message.success('操作成功');
this.getList(this.currentDet); this.getList(this.currentDet);
this.btnLoading = false;
this.cancel(); this.cancel();
} else { } else {
this.btnLoading = false;
this.$message.error('操作失败'); this.$message.error('操作失败');
} }
} else { } else {
this.btnLoading = false;
this.$message.info('请选择设备'); this.$message.info('请选择设备');
} }
}); });
@@ -218,34 +234,45 @@ export default {
this.total = 0; this.total = 0;
} }
this.selectedBoms = [];
// 获取设备及bom列表 // 获取设备及bom列表
this.http('/extend/process-flow-det/getEquipmentDetBySectionId', 'post', { this.http('/extend/process-flow-det/getEquipmentDetBySectionId', 'post', {
sectionId, sectionId,
flowDetId: detId, flowDetId: detId,
}).then(({ code, data }) => { })
if (code == 0) { .then(({ code, data }) => {
this.bomList = data.map((eq) => { if (code == 0) {
eq.materialsBom = eq.materialsBom || []; this.bomList = data.map((eq) => {
eq.valuesBom = eq.valuesBom || []; eq.materialsBom = eq.materialsBom || [];
// 设置选中状态 eq.valuesBom = eq.valuesBom || [];
eq.materialsBom.chosen = eq.materialsBomChoseId ?? null; // 设置选中状态
eq.valuesBom.chosen = eq.valuesBomChoseId ?? null; eq.materialsBom.chosen = eq.materialsBomChoseId ?? null;
if (eq.equChose || eq.materialsBom.chosen || eq.valuesBom.chosen) { eq.valuesBom.chosen = eq.valuesBomChoseId ?? null;
this.selectedBoms.push({ if (
equipmentId: eq.id, eq.equChose ||
equMaterialBomId: eq.materialsBom.chosen, eq.materialsBom.chosen ||
equValueBomId: eq.valuesBom.chosen, eq.valuesBom.chosen
}); ) {
} this.selectedBoms.push({
// 设置设备id equipmentId: eq.id,
eq.materialsBom.equipmentId = eq.id; equMaterialBomId: eq.materialsBom.chosen,
eq.valuesBom.equipmentId = eq.id; equValueBomId: eq.valuesBom.chosen,
return eq; });
}); }
} else { // 设置设备id
eq.materialsBom.equipmentId = eq.id;
eq.valuesBom.equipmentId = eq.id;
return eq;
});
} else {
this.bomList.splice(0);
this.selectedBoms = [];
}
})
.catch((err) => {
this.bomList.splice(0); this.bomList.splice(0);
} this.selectedBoms = [];
}); });
}, },
async handleAddEquipment() { async handleAddEquipment() {
this.open = true; this.open = true;

View File

@@ -34,7 +34,7 @@
class="btn-refresh" class="btn-refresh"
@click="handleUpdateLayout" @click="handleUpdateLayout"
icon="el-icon-refresh"> icon="el-icon-refresh">
刷新布局 保存布局
</el-button> </el-button>
<el-button <el-button
type="primary" type="primary"
@@ -62,6 +62,16 @@
@cancel="cancel" @cancel="cancel"
@confirm="submitForm"> @confirm="submitForm">
<DialogForm v-if="open" ref="form" v-model="form" :rows="rows" /> <DialogForm v-if="open" ref="form" v-model="form" :rows="rows" />
<el-row slot="footer">
<el-button size="small" @click="cancel">取消</el-button>
<el-button
type="primary"
size="small"
@click="submitForm"
:loading="btnLoading">
确定
</el-button>
</el-row>
</base-dialog> </base-dialog>
</section> </section>
</template> </template>
@@ -102,7 +112,9 @@ export default {
input: true, input: true,
label: '工序名称', label: '工序名称',
prop: 'name', prop: 'name',
rules: [{ required: true, message: '工序名称不能为空', trigger: 'blur' }], rules: [
{ required: true, message: '工序名称不能为空', trigger: 'blur' },
],
}, },
], ],
[ [
@@ -111,7 +123,9 @@ export default {
label: '工段', label: '工段',
prop: 'sectionId', prop: 'sectionId',
url: '/base/core-workshop-section/listAll', url: '/base/core-workshop-section/listAll',
rules: [{ required: true, message: '工段不能为空', trigger: 'blur' }], rules: [
{ required: true, message: '工段不能为空', trigger: 'blur' },
],
bind: { bind: {
filterable: true, filterable: true,
}, },
@@ -139,6 +153,7 @@ export default {
}, },
currentDet: null, currentDet: null,
currentNode: null, currentNode: null,
btnLoading: false
}; };
}, },
watch: { watch: {
@@ -221,7 +236,7 @@ export default {
node.attr('container/stroke', '#0b58ff'); node.attr('container/stroke', '#0b58ff');
const { detId, detName, detDesc, processId, sectionId, sectionName } = const { detId, detName, detDesc, processId, sectionId, sectionName } =
node.attrs; node.attrs;
console.log('node clicked!', node) console.log('node clicked!', node);
this.currentDet = {}; this.currentDet = {};
this.$set(this.currentDet, 'detId', detId?.text); this.$set(this.currentDet, 'detId', detId?.text);
this.$set(this.currentDet, 'sectionId', sectionId?.text); this.$set(this.currentDet, 'sectionId', sectionId?.text);
@@ -354,6 +369,7 @@ export default {
}, },
handleEdit() { handleEdit() {
console.log('edit: ', this.currentDet);
this.form.name = this.currentDet.detName; this.form.name = this.currentDet.detName;
this.form.sectionId = this.currentDet.sectionId; this.form.sectionId = this.currentDet.sectionId;
this.form.remark = this.currentDet.detDesc; this.form.remark = this.currentDet.detDesc;
@@ -379,6 +395,7 @@ export default {
if (!valid) { if (!valid) {
return; return;
} }
this.btnLoading = true;
// 修改的提交 // 修改的提交
if (this.form.id != null) { if (this.form.id != null) {
this.updateProcess() this.updateProcess()
@@ -392,9 +409,20 @@ export default {
sectionName: { text: sectionName }, sectionName: { text: sectionName },
detDesc: { text: remark }, detDesc: { text: remark },
}); });
// 修改currentDet
this.currentDet = {
...this.currentDet,
detName: name,
sectionId: sectionId,
sectionName: sectionName,
detDesc: remark,
};
this.btnLoading = false;
}); });
}) })
.catch((err) => {}); .catch((err) => {
this.btnLoading = false;
});
return; return;
} }
@@ -412,11 +440,14 @@ export default {
.then((node) => { .then((node) => {
if (!node) { if (!node) {
this.$modal.msgError('创建节点失败'); this.$modal.msgError('创建节点失败');
this.btnLoading = false;
return; return;
} }
this.btnLoading = false;
this.graph.addNode(node); this.graph.addNode(node);
}) })
.catch((err) => { .catch((err) => {
this.btnLoading = false;
return; return;
}); });
}); });

View File

@@ -21,12 +21,12 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20" style="margin-top: 12px;"> <el-row :gutter="20" style="margin-top: 12px">
<el-col :span="6"> <el-col :span="6">
<!-- <InfoItem label="创建人" value="xxse" /> --> <!-- <InfoItem label="创建人" value="xxse" /> -->
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<InfoItem label="创建时间" :value="form.createTime" /> <InfoItem label="创建时间" :value="form.createTime" :time-format="true" />
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<!-- <InfoItem label="更新人" value="xxse" /> --> <!-- <InfoItem label="更新人" value="xxse" /> -->
@@ -39,11 +39,12 @@
</template> </template>
<script> <script>
import moment from 'moment';
const InfoItem = { const InfoItem = {
name: 'InfoItem', name: 'InfoItem',
components: {}, components: {},
props: ['label', 'value'], props: ['label', 'value', 'timeFormat'],
data() { data() {
return {}; return {};
}, },
@@ -52,9 +53,13 @@ const InfoItem = {
render: function (h) { render: function (h) {
return ( return (
<div style="display: flex; align-items: center; font-size: 14px; line-height: 1.5"> <div style="display: flex; align-items: center; font-size: 14px; line-height: 1.5">
<span style="width: 100px; text-align: left; font-weight: 700">{this.label}:</span> <span style="width: 100px; text-align: left; font-weight: 700">
{this.label}:
</span>
<span style="width: 200px; text-align: left; text-overflow: ellipse; white-space: nowrap"> <span style="width: 200px; text-align: left; text-overflow: ellipse; white-space: nowrap">
{this.value} {this.timeFormat
? moment(this.value).format('YYYY-MM-DD HH:mm:ss')
: this.value}
</span> </span>
</div> </div>
); );
@@ -77,12 +82,12 @@ export default {
createTime: null, createTime: null,
remark: null, remark: null,
enable: null, enable: null,
code: null code: null,
}, },
}; };
}, },
activated() { activated() {
this.getInfo() this.getInfo();
}, },
computed: {}, computed: {},
methods: { methods: {
@@ -93,7 +98,7 @@ export default {
method, method,
params: method === 'get' ? payload : null, params: method === 'get' ? payload : null,
data: method !== 'get' ? payload : null, data: method !== 'get' ? payload : null,
}) });
}, },
put(payload) { put(payload) {
return this.http(this.updateUrl, 'put', payload); return this.http(this.updateUrl, 'put', payload);
@@ -114,12 +119,12 @@ export default {
// debugger; // debugger;
if (code == 0) { if (code == 0) {
this.form = { this.form = {
...data ...data,
}; };
} else { } else {
this.$modal.msgError('工艺信息获取失败') this.$modal.msgError('工艺信息获取失败');
} }
} },
}, },
}; };
</script> </script>

View File

@@ -2,7 +2,7 @@
* @Author: zwq * @Author: zwq
* @Date: 2023-08-01 14:55:51 * @Date: 2023-08-01 14:55:51
* @LastEditors: zhp * @LastEditors: zhp
* @LastEditTime: 2023-11-22 14:23:40 * @LastEditTime: 2023-11-28 10:34:24
* @Description: * @Description:
--> -->
<template> <template>
@@ -26,9 +26,10 @@ import { parseTime } from '../../core/mixins/code-filter';
import { import {
getProcessTraceabilityPage, getProcessTraceabilityPage,
getWorkOrderList, getWorkOrderList,
getCoreProduct
// exportEnergyPlcExcel // exportEnergyPlcExcel
} from '@/api/quality/processTraceability'; } from '@/api/quality/processTraceability';
import { publicFormatter } from '@/utils/dict';
const tableProps = [ const tableProps = [
{ {
prop: 'name', prop: 'name',
@@ -44,7 +45,8 @@ const tableProps = [
}, },
{ {
prop: 'status', prop: 'status',
label: '状态' label: '状态',
filter: (val) => val == 1 ? '等待' : val == 2 ? '激活' : val == 3 ? '暂停' : val == 4 ? '完成' : '作废',
}, },
{ {
prop: 'startProduceTime', prop: 'startProduceTime',
@@ -61,8 +63,9 @@ const tableProps = [
label: '生产数量' label: '生产数量'
}, },
{ {
prop: 'unit', prop: 'planProductUnit',
label: '单位' label: '单位',
filter: publicFormatter('unit_dict')
}, },
{ {
prop: 'processFlowName', prop: 'processFlowName',
@@ -113,7 +116,8 @@ export default {
selectOptions: [], selectOptions: [],
labelField: 'name', labelField: 'name',
valueField: 'id', valueField: 'id',
param: 'orderName' param: 'orderName',
filterable: true,
}, },
{ {
type: 'datePicker', type: 'datePicker',
@@ -182,17 +186,25 @@ export default {
handleClick(val) { handleClick(val) {
if (val.type === "processDetail") { if (val.type === "processDetail") {
console.log(val); console.log(val);
this.$router.push({ let specificationsData =''
name: 'process-traceability-detail', getCoreProduct(val.data.planProductId).then((res) => {
params: { console.log(res)
id: '1715180991838887938',
orderId: val.data.id, this.$router.push({
name: val.data.name, path: 'process-traceability-detail',
productName: val.data.planProductName, query: {
processFlowName: val.data.processFlowName id: val.data.processFlowId,
// equipmentName, orderId: val.data.id,
}, name: val.data.name,
}); specifications: res.data.specifications,
productName: val.data.planProductName,
processFlowName: val.data.processFlowName,
// planProductId: val.data.planProductId
// equipmentName,
},
});
})
// this.deleteHandle(val.data.id, val.data.name, val.data._pageIndex) // this.deleteHandle(val.data.id, val.data.name, val.data._pageIndex)
} }
}, },

View File

@@ -117,11 +117,11 @@ export default {
// }, // },
{ prop: 'name', label: '参数名' }, { prop: 'name', label: '参数名' },
{ {
prop: 'name', label: '设定范围最小- 最大 / 标准', prop: 'status', label: '设定范围最小- 最大 / 标准',
subcomponent: StatusBtn subcomponent: StatusBtn
}, },
{ {
prop: 'code', label: '最小值', prop: '', label: '最小值',
children: [ children: [
{ {
prop: 'minValueSet', prop: 'minValueSet',
@@ -134,7 +134,7 @@ export default {
] ]
}, },
{ {
prop: 'code', label: '最大值', prop: '', label: '最大值',
children: [ children: [
{ {
prop: 'maxValueSet', prop: 'maxValueSet',
@@ -184,9 +184,9 @@ export default {
getDetMaterial({ getDetMaterial({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
orderId: this.$route.params.orderId, orderId: this.$route.query.orderId,
flowDetId: [this.detId], flowDetId: [this.detId],
// orderId: this.$route.params.orderId, // orderId: this.$route.query.orderId,
},).then((res) => { },).then((res) => {
console.log(res); console.log(res);
@@ -231,25 +231,29 @@ export default {
getDetMaterial({ getDetMaterial({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
orderId: this.$route.params.orderId, orderId: this.$route.query.orderId,
flowDetId: [this.detId], flowDetId: [this.detId],
// orderId: this.$route.params.orderId, // orderId: this.$route.query.orderId,
},).then((res) => { },).then((res) => {
this.materialList = res.data[0].data if (res.data.length != []) {
this.name = res.data[0].name this.materialList = res.data[0].data
this.name = res.data[0].name
}
}) })
} else { } else {
getDetValue({ getDetValue({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
orderId: this.$route.params.orderId, orderId: this.$route.query.orderId,
flowDetId: [this.detId], flowDetId: [this.detId],
// orderId: this.$route.params.orderId, // orderId: this.$route.query.orderId,
}).then((res) => { }).then((res) => {
this.valueList = res.data[0].data if (res.data.length != []) {
this.name = res.data[0].name this.valueList = res.data[0].data
this.name = res.data[0].name
}
}) })
} }
}, },
@@ -258,12 +262,14 @@ export default {
getDetMaterial({ getDetMaterial({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
orderId: this.$route.params.orderId, orderId: this.$route.query.orderId,
flowDetId: [this.detId], flowDetId: [this.detId],
}).then((res) => { }).then((res) => {
console.log(res); console.log(res);
this.materialList = res.data[0].data if (res.data.length != []) {
this.name = res.data[0].name this.materialList = res.data[0].data
this.name = res.data[0].name
}
}) })
}, },
clearList() { clearList() {

View File

@@ -123,7 +123,7 @@ export default {
} }
}, },
mounted() { mounted() {
console.log(this.$route.params.id) console.log(this.$route.query.id)
this.loadLayout().then(json => { this.loadLayout().then(json => {
this.initGraph(json) this.initGraph(json)
}) })
@@ -260,7 +260,7 @@ export default {
}, },
async loadLayout() { async loadLayout() {
const flowId = this.$route.params.id; const flowId = this.$route.query.id;
console.log(flowId) console.log(flowId)
if (!flowId) return { cells: [] } if (!flowId) return { cells: [] }
const { code, data } = await this.info({ id: flowId }); const { code, data } = await this.info({ id: flowId });
@@ -288,12 +288,12 @@ export default {
async handleUpdateLayout() { async handleUpdateLayout() {
this.layout.content = JSON.stringify(this.graph.toJSON()); this.layout.content = JSON.stringify(this.graph.toJSON());
let code, data; let code, data;
console.table([this.layout, this.$route.params.id]) console.table([this.layout, this.$route.query.id])
// 手动刷新布局 // 手动刷新布局
if (this.layout.id) { if (this.layout.id) {
({ code, data } = await this.http('/extend/process-flow-view/update', 'put', this.layout)); ({ code, data } = await this.http('/extend/process-flow-view/update', 'put', this.layout));
} else { } else {
this.layout.flowId = this.$route.params.id; this.layout.flowId = this.$route.query.id;
({ code, data } = await this.http('/extend/process-flow-view/create', 'post', this.layout)); ({ code, data } = await this.http('/extend/process-flow-view/create', 'post', this.layout));
} }
@@ -410,7 +410,7 @@ export default {
}, },
createProcess() { createProcess() {
// const flowId = this.$route.params.id; // const flowId = this.$route.query.id;
const flowId = this.getFlowId(); // it also works const flowId = this.getFlowId(); // it also works
if (!flowId) { if (!flowId) {
this.$modal.msgError('工艺ID不能为空'); this.$modal.msgError('工艺ID不能为空');

View File

@@ -20,14 +20,13 @@
<InfoItem label="产品名称" :value="form.productName" /> <InfoItem label="产品名称" :value="form.productName" />
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<InfoItem label="产品规格" /> <InfoItem label="产品规格" :value="form.specifications" />
</el-col> </el-col>
</el-row> </el-row>
</section> </section>
</template> </template>
<script> <script>
const InfoItem = { const InfoItem = {
name: 'InfoItem', name: 'InfoItem',
components: {}, components: {},
@@ -62,6 +61,7 @@ export default {
id: null, id: null,
name: null, name: null,
productName: null, productName: null,
specifications:null,
processFlowName: null, processFlowName: null,
// remark: null, // remark: null,
// enable: null, // enable: null,
@@ -70,7 +70,8 @@ export default {
}; };
}, },
mounted() { mounted() {
this.getInfo() this.getInfo()
console.log(this.$route.query)
}, },
computed: {}, computed: {},
methods: { methods: {
@@ -95,12 +96,14 @@ export default {
// info(payload) { // info(payload) {
// return this.http(this.infoUrl, 'get', payload); // return this.http(this.infoUrl, 'get', payload);
// }, // },
async getInfo() { getInfo() {
this.form.name = this.$route.params.name // console.log(this.$route.query.planProductId);
this.form.productName = this.$route.params.productName this.form.name = this.$route.query.name
this.form.processFlowName = this.$route.params.processFlowName this.form.specifications = this.$route.query.specifications
// this.form.name = this.$route.params.name this.form.productName = this.$route.query.productName
// const flowId = this.$route.params.id; this.form.processFlowName = this.$route.query.processFlowName
// this.form.name = this.$route.query.name
// const flowId = this.$route.query.id;
// console.log(flowId); // console.log(flowId);
// if (!flowId) this.$router.go(-1); // if (!flowId) this.$router.go(-1);
// const { code, data } = await this.info({ id: flowId }); // const { code, data } = await this.info({ id: flowId });

View File

@@ -15,7 +15,7 @@
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="班组组长" prop="leaderId"> <el-form-item label="班组组长" prop="leaderId">
<el-select v-model="form.leaderId" placeholder="请选择" style="width: 100%;" @change="selectLeader"> <el-select v-model="form.leaderId" placeholder="请选择" style="width: 100%;" filterable @change="selectLeader">
<el-option <el-option
v-for="item in workerList" v-for="item in workerList"
:key="item.id" :key="item.id"

View File

@@ -290,7 +290,8 @@ export default {
break; break;
case '2': // 能源 case '2': // 能源
this.$router.push({ this.$router.push({
path: '/energy/monitoring/energy-report-search?startTime='+this.chooseObj.startTime+'&endTime='+this.chooseObj.endTime // path: '/energy/monitoring/energy-report-search?startTime='+this.chooseObj.startTime+'&endTime='+this.chooseObj.endTime
path: '/energy/base/energy-quantity-realtime?startTime='+this.chooseObj.startTime+'&endTime='+this.chooseObj.endTime
}) })
break; break;
default: default:

Some files were not shown because too many files have changed in this diff Show More