289 Commits

Author SHA1 Message Date
‘937886381’
a618e081b5 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-08-01 14:30:05 +08:00
‘937886381’
9efddba586 修改ui 2024-08-01 14:29:31 +08:00
12b37c13c7 Merge pull request '修改bug' (#109) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #109
2024-07-26 19:23:38 +08:00
‘937886381’
eda007d713 修改bug 2024-07-26 17:03:09 +08:00
9e3c9fff6d Merge pull request 'projects/mescc/zhp' (#108) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #108
2024-07-26 11:17:35 +08:00
‘937886381’
4d8300d213 修改页码页数 2024-07-26 11:16:16 +08:00
‘937886381’
52dbb694a8 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-26 11:08:45 +08:00
‘937886381’
cd36d33be9 修改bug 2024-07-26 11:07:52 +08:00
52d968fdde Merge pull request 'projects/mescc/zhp' (#107) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #107
2024-07-26 10:52:36 +08:00
‘937886381’
b05d9067d3 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-26 10:48:44 +08:00
‘937886381’
7e9f89fdda 新增成本核算及即时库存 2024-07-26 10:47:36 +08:00
2d89137809 Merge pull request 'projects/mescc/zhp' (#106) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #106
2024-07-25 14:19:34 +08:00
‘937886381’
f5f472854b 解决冲突 2024-07-25 14:17:06 +08:00
‘937886381’
737949d3ec 修改ui 2024-07-25 14:13:35 +08:00
e802674196 Merge pull request 'projects/mescc/dy' (#105) from projects/mescc/dy into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #105
2024-07-24 14:52:55 +08:00
helloDy
8da6dc6232 Merge branch 'projects/mescc/develop' into projects/mescc/dy 2024-07-24 14:51:56 +08:00
helloDy
3e2661581e bug 2024-07-24 14:51:26 +08:00
ec5e47a416 Merge pull request 'projects/mescc/dy' (#104) from projects/mescc/dy into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #104
2024-07-24 13:07:28 +08:00
helloDy
99d60a14bd merge 2024-07-23 18:01:22 +08:00
helloDy
6409d2d348 bug 2024-07-23 17:59:11 +08:00
71f548cb3b Merge pull request 'projects/mescc/zhp' (#103) from projects/mescc/zhp into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #103
2024-07-22 08:36:42 +08:00
‘937886381’
8ecf281f08 修改ui 2024-07-19 16:46:51 +08:00
‘937886381’
fa75a2b89f Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-19 15:30:38 +08:00
‘937886381’
c469ca5ebe 修改ui 2024-07-19 15:30:05 +08:00
9b8c090f7e Merge pull request 'projects/mescc/zhp' (#102) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #102
2024-07-19 13:25:45 +08:00
‘937886381’
cbae9ef922 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-19 13:23:06 +08:00
‘937886381’
c7a6ad2e22 修改ui 2024-07-19 13:22:42 +08:00
e66ef52489 Merge pull request 'projects/mescc/zhp' (#101) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #101
2024-07-19 08:39:41 +08:00
‘937886381’
ebb7f597b9 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-19 08:38:37 +08:00
‘937886381’
7d6a0e228f 修改ui 2024-07-19 08:37:54 +08:00
3bec7e3333 Merge pull request 'projects/mescc/zhp' (#100) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #100
2024-07-17 09:47:25 +08:00
‘937886381’
5444ff92f7 解决冲突 2024-07-17 08:56:03 +08:00
‘937886381’
0713cb1650 修改bug 2024-07-17 08:53:32 +08:00
9da2e20b24 Merge pull request '生产数据echarts图重写' (#99) from projects/mescc/dy into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #99
2024-07-17 08:28:56 +08:00
helloDy
efa5a7c383 生产数据echarts图重写 2024-07-16 18:41:57 +08:00
6ba4c90767 Merge pull request 'projects/mescc/zhp' (#98) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #98
2024-07-12 09:32:46 +08:00
‘937886381’
b45818e2a4 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-12 09:21:20 +08:00
‘937886381’
00a5a8ed34 修改bug 2024-07-12 09:20:51 +08:00
f51d786fd3 Merge pull request 'projects/mescc/zhp' (#97) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #97
2024-07-12 09:12:23 +08:00
‘937886381’
01464663fa Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-12 09:10:20 +08:00
‘937886381’
db393bec12 修改bug 2024-07-12 09:09:49 +08:00
59df1c16f6 Merge pull request 'projects/mescc/zhp' (#96) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #96
2024-07-12 09:02:10 +08:00
‘937886381’
2f2d3defd0 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-12 09:00:25 +08:00
‘937886381’
0b847d2903 修改bug 2024-07-12 08:59:59 +08:00
5b0bb2ccdb Merge pull request 'projects/mescc/zhp' (#95) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #95
2024-07-12 08:54:16 +08:00
‘937886381’
4d4feee160 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-12 08:52:14 +08:00
‘937886381’
8d370118aa 修改bug 2024-07-12 08:51:45 +08:00
3a5c2eeb2a Merge pull request '修改bug' (#94) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #94
2024-07-12 08:35:13 +08:00
‘937886381’
72f146394b 修改bug 2024-07-12 08:33:10 +08:00
53b10a9847 Merge pull request 'projects/mescc/zhp' (#93) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #93
2024-07-11 15:15:28 +08:00
‘937886381’
82a7a2b8cd 修改bug 2024-07-11 15:01:49 +08:00
‘937886381’
3e327277e9 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-11 14:50:34 +08:00
‘937886381’
06ab8159c5 修改ui 2024-07-11 14:49:48 +08:00
cdf0525fca Merge pull request 'projects/mescc/zhp' (#92) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #92
2024-07-11 14:36:34 +08:00
‘937886381’
0547133e35 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-11 14:34:40 +08:00
‘937886381’
11387724de 修改ui 2024-07-11 14:34:19 +08:00
fe6fb41e29 Merge pull request 'projects/mescc/zhp' (#91) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #91
2024-07-11 08:28:10 +08:00
‘937886381’
074432851c Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-10 15:46:53 +08:00
‘937886381’
8af5158a1b 修改bug 2024-07-10 15:46:21 +08:00
46743fa4ef Merge pull request 'projects/mescc/zhp' (#90) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #90
2024-07-10 15:26:27 +08:00
‘937886381’
91c352ff79 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-10 15:17:44 +08:00
‘937886381’
41748b740d 修改ui 2024-07-10 15:17:16 +08:00
8d524a71a6 Merge pull request 'projects/mescc/zhp' (#89) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #89
2024-07-10 10:01:27 +08:00
‘937886381’
4fa58b62fc 修改bug 2024-07-10 09:59:53 +08:00
‘937886381’
2d67ca4347 修改ui 2024-07-09 17:01:11 +08:00
‘937886381’
91ac125671 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-09 11:11:01 +08:00
‘937886381’
9ea2f2dbe3 修改bug 2024-07-09 11:10:38 +08:00
30e04d641f Merge pull request 'projects/mescc/zhp' (#88) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #88
2024-07-09 10:21:47 +08:00
‘937886381’
6f2f751b0e Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-09 10:20:17 +08:00
‘937886381’
96f7798708 导出 2024-07-09 10:19:54 +08:00
1aa2310adf Merge pull request 'projects/mescc/zhp' (#87) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #87
2024-07-08 16:57:02 +08:00
‘937886381’
63f4fd7cb5 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-08 16:55:21 +08:00
‘937886381’
72855a6f04 工单导出 2024-07-08 16:54:58 +08:00
b3bd3eea22 Merge pull request 'projects/mescc/zhp' (#86) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #86
2024-07-08 13:26:37 +08:00
‘937886381’
2c53c249af Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-08 13:25:52 +08:00
‘937886381’
f2d57a8ebb 修改ui 2024-07-08 13:25:28 +08:00
00ed35ed82 Merge pull request 'projects/mescc/zhp' (#85) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #85
2024-07-05 16:36:30 +08:00
‘937886381’
689de3173f Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-05 16:33:39 +08:00
‘937886381’
865698a9be 修改ui 2024-07-05 16:33:14 +08:00
798ea2d90d Merge pull request 'projects/mescc/zhp' (#84) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #84
2024-07-05 14:08:40 +08:00
‘937886381’
44f3ab3e99 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-05 14:06:39 +08:00
‘937886381’
3e025020ab 修改bug 2024-07-05 14:06:15 +08:00
d62015bfbb Merge pull request 'projects/mescc/zhp' (#83) from projects/mescc/zhp into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #83
2024-07-04 16:41:23 +08:00
‘937886381’
a7e89fe7e8 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-04 09:39:31 +08:00
‘937886381’
6cb91b2c4a 修改bug 2024-07-04 09:39:08 +08:00
165722d67d Merge pull request 'projects/mescc/zhp' (#82) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #82
2024-07-03 16:59:09 +08:00
‘937886381’
486cffd64e 解决冲突 2024-07-03 16:30:14 +08:00
‘937886381’
81c4af0cc8 修改ui 2024-07-03 16:28:41 +08:00
db113cdba9 Merge pull request 'projects/mescc/dy' (#81) from projects/mescc/dy into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #81
2024-07-03 08:52:56 +08:00
helloDy
af52db4a37 Merge branch 'projects/mescc/develop' into projects/mescc/dy 2024-07-03 08:52:07 +08:00
helloDy
e0ca435014 ui 2024-07-03 08:51:32 +08:00
affe8ec026 Merge pull request 'projects/mescc/zhp' (#80) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #80
2024-07-02 13:42:35 +08:00
‘937886381’
aa6ae82607 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-02 13:16:48 +08:00
‘937886381’
eee121e5ab 修改bui 2024-07-02 13:15:50 +08:00
4332113e3b Merge pull request 'projects/mescc/zhp' (#79) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #79
2024-07-01 20:34:09 +08:00
‘937886381’
53ba98b01a Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-01 15:28:12 +08:00
‘937886381’
23cf4aaa1e 修改bug 2024-07-01 15:27:49 +08:00
81a110ba45 Merge pull request 'projects/mescc/zhp' (#78) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #78
2024-07-01 14:58:13 +08:00
‘937886381’
a249e88530 修改bug 2024-07-01 14:40:09 +08:00
‘937886381’
2128538199 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-01 13:50:06 +08:00
‘937886381’
052d0704fd 修改bug 2024-07-01 13:49:30 +08:00
749b9c6576 Merge pull request 'projects/mescc/zhp' (#77) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #77
2024-07-01 12:10:22 +08:00
‘937886381’
3f942111b0 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-07-01 11:52:14 +08:00
‘937886381’
716c88dfc4 修改bug 2024-07-01 11:51:44 +08:00
ec0a99b5fb Merge pull request 'projects/mescc/zhp' (#76) from projects/mescc/zhp into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #76
2024-06-28 16:35:08 +08:00
‘937886381’
384527d6db Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-28 16:32:12 +08:00
‘937886381’
26cf9a6ce4 修改 2024-06-28 16:30:52 +08:00
5ba0b62ae6 Merge pull request 'projects/mescc/zhp' (#75) from projects/mescc/zhp into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #75
2024-06-28 16:12:04 +08:00
‘937886381’
5ac5da1bf5 修改 2024-06-28 16:03:42 +08:00
‘937886381’
99f5f978d4 修改 2024-06-28 15:35:28 +08:00
‘937886381’
04af70f416 修改bug 2024-06-28 14:55:12 +08:00
‘937886381’
242e42a56a Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-28 14:42:26 +08:00
‘937886381’
2ab541d4c1 修改bug 2024-06-28 14:41:50 +08:00
95d530e5f1 Merge pull request 'projects/mescc/zhp' (#74) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #74
2024-06-28 13:22:49 +08:00
‘937886381’
83b9867c2a Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-28 13:16:07 +08:00
‘937886381’
7b8f4cac21 修改bug 2024-06-28 13:15:43 +08:00
7886d5ad5a Merge pull request 'projects/mescc/zjl' (#73) from projects/mescc/zjl into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #73
2024-06-28 11:10:40 +08:00
b31b67d2ed Merge branch 'projects/mescc/develop' into projects/mescc/zjl 2024-06-28 11:09:49 +08:00
fc21359f8f 样式 2024-06-28 11:09:02 +08:00
be6d84daf5 Merge pull request 'projects/mescc/zjl' (#72) from projects/mescc/zjl into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #72
2024-06-27 16:57:47 +08:00
daaec2417c Merge branch 'projects/mescc/develop' into projects/mescc/zjl 2024-06-27 16:57:20 +08:00
dcf4f6c392 Merge pull request 'projects/mescc/zhp' (#71) from projects/mescc/zhp into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #71
2024-06-27 16:56:15 +08:00
d27e56cd7f 报表样式 2024-06-27 16:55:47 +08:00
‘937886381’
445ebe339d Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-27 15:47:28 +08:00
‘937886381’
353e3e0f35 修改bug 2024-06-27 15:47:07 +08:00
ea29a33c2a Merge pull request 'projects/mescc/dy' (#70) from projects/mescc/dy into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #70
2024-06-27 14:59:19 +08:00
helloDy
d5673f3c9f 工厂更改 2024-06-27 14:56:47 +08:00
helloDy
3064722052 Merge branch 'projects/mescc/develop' into projects/mescc/dy 2024-06-27 14:53:37 +08:00
helloDy
dfe52cbac5 工单管理详情ui 2024-06-27 14:53:11 +08:00
68e386333b Merge pull request 'projects/mescc/zhp' (#69) from projects/mescc/zhp into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #69
2024-06-27 14:43:32 +08:00
‘937886381’
96d55b5a57 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-27 13:59:29 +08:00
‘937886381’
fb74340f0f 修改滚动条样式及导出 2024-06-27 13:58:58 +08:00
b1ddfa5c0d Merge pull request 'projects/mescc/zhp' (#68) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #68
2024-06-27 09:29:54 +08:00
‘937886381’
f7b151f9aa Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-27 09:28:27 +08:00
‘937886381’
51938926d3 修改bug 2024-06-27 09:28:04 +08:00
588037c45c Merge pull request 'projects/mescc/zhp' (#67) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #67
2024-06-27 08:38:58 +08:00
‘937886381’
354031f119 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-26 16:56:44 +08:00
‘937886381’
44c5271b5a 修改bug 2024-06-26 16:56:22 +08:00
241810d1c8 Merge pull request 'projects/mescc/zhp' (#66) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #66
2024-06-26 15:53:43 +08:00
‘937886381’
92a297a5e9 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-26 15:19:10 +08:00
‘937886381’
f67e781146 修改bug 2024-06-26 15:18:38 +08:00
e310c5465e Merge pull request 'projects/mescc/zhp' (#65) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #65
2024-06-26 11:04:29 +08:00
‘937886381’
f2cfe94dfc 剞劂冲突 2024-06-26 11:00:48 +08:00
‘937886381’
92c0c33fbd 修改bug 2024-06-26 10:59:23 +08:00
0a391a4de5 Merge pull request 'projects/mescc/dy' (#64) from projects/mescc/dy into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #64
2024-06-25 14:40:13 +08:00
helloDy
8be57f586e Merge branch 'projects/mescc/develop' into projects/mescc/dy 2024-06-25 14:36:04 +08:00
helloDy
4e5a5f9ba2 2024-06-25 14:35:23 +08:00
a78c3d79f1 Merge pull request 'projects/mescc/dy' (#63) from projects/mescc/dy into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #63
2024-06-24 17:00:47 +08:00
helloDy
3c5163bd66 merge 2024-06-24 16:58:08 +08:00
helloDy
8437d52c1b bug 2024-06-24 16:57:15 +08:00
ca0a0142db Merge pull request 'projects/mescc/zjl' (#62) from projects/mescc/zjl into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #62
2024-06-24 13:33:08 +08:00
703334ac3c mt 2024-06-24 13:32:34 +08:00
3897f35d28 Merge pull request 'projects/mescc/zhp' (#61) from projects/mescc/zhp into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #61
2024-06-24 13:30:57 +08:00
3c6e408074 Merge branch 'projects/mescc/develop' into projects/mescc/zjl 2024-06-24 13:27:57 +08:00
a9392c8999 1 2024-06-24 13:27:09 +08:00
‘937886381’
196a615f61 修改bug 2024-06-24 10:44:21 +08:00
‘937886381’
8395f37371 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-24 10:39:42 +08:00
‘937886381’
5e703350e1 修改bug 2024-06-24 10:39:10 +08:00
266604878b Merge pull request 'projects/mescc/zhp' (#60) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #60
2024-06-24 09:50:07 +08:00
‘937886381’
0c2221b373 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-24 09:48:30 +08:00
‘937886381’
0992940655 修改bug 2024-06-24 09:48:06 +08:00
7e1b0f8725 Merge pull request 'projects/mescc/zjl' (#59) from projects/mescc/zjl into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #59
2024-06-24 09:17:14 +08:00
8f8d0396b7 Merge branch 'projects/mescc/develop' into projects/mescc/zjl 2024-06-24 09:16:37 +08:00
582484f6db 时间 2024-06-24 09:15:51 +08:00
b259cdb545 Merge pull request 'projects/mescc/zjl' (#58) from projects/mescc/zjl into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #58
2024-06-21 16:21:40 +08:00
b6aa6a19f4 Merge branch 'projects/mescc/develop' into projects/mescc/zjl 2024-06-21 16:21:02 +08:00
a9e176be74 1 2024-06-21 16:20:14 +08:00
a237c66901 Merge pull request 'projects/mescc/zhp' (#57) from projects/mescc/zhp into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #57
2024-06-21 16:19:01 +08:00
‘937886381’
c7205e32a3 报表 2024-06-21 16:17:25 +08:00
‘937886381’
b180bac226 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-21 16:05:33 +08:00
‘937886381’
670d7e5600 报表 2024-06-21 16:04:50 +08:00
69b3e7de2e Merge pull request 'projects/mescc/zhp' (#56) from projects/mescc/zhp into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #56
2024-06-21 10:42:43 +08:00
‘937886381’
0eb17fa08b 报表 2024-06-20 20:54:34 +08:00
‘937886381’
cc800eae5d Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-20 20:38:45 +08:00
‘937886381’
6be1a83dd8 报表 2024-06-20 20:38:11 +08:00
033d61ea96 Merge pull request 'projects/mescc/zjl' (#55) from projects/mescc/zjl into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #55
2024-06-20 17:10:00 +08:00
4fb88a5201 Merge branch 'projects/mescc/develop' into projects/mescc/zjl 2024-06-20 17:08:51 +08:00
0e60ba7dc8 1 2024-06-20 17:07:57 +08:00
1969cd3ada Merge pull request 'projects/mescc/dy' (#54) from projects/mescc/dy into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #54
2024-06-20 16:58:00 +08:00
helloDy
510f12e40b Merge branch 'projects/mescc/develop' into projects/mescc/dy 2024-06-20 16:54:45 +08:00
helloDy
7a67da105f bug 2024-06-20 16:54:14 +08:00
6c145579cb Merge pull request '1' (#53) from projects/mescc/zjl into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #53
2024-06-20 16:52:26 +08:00
e512ad5858 1 2024-06-20 16:51:44 +08:00
a7b13c6a8f Merge pull request 'projects/mescc/zjl' (#52) from projects/mescc/zjl into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #52
2024-06-20 15:25:01 +08:00
0655eafb1d Merge branch 'projects/mescc/develop' into projects/mescc/zjl 2024-06-20 15:24:20 +08:00
ce350c0c7f 剩余报表 2024-06-20 15:23:05 +08:00
abfd20bac6 Merge pull request 'projects/mescc/zjl' (#51) from projects/mescc/zjl into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #51
2024-06-19 16:52:26 +08:00
7ba831f496 Merge branch 'projects/mescc/develop' into projects/mescc/zjl 2024-06-19 16:51:33 +08:00
78d387b2c6 1 2024-06-19 16:50:44 +08:00
‘937886381’
15d3b3622c Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-19 16:26:17 +08:00
‘937886381’
c8bc54e04b 报表 2024-06-19 16:25:50 +08:00
a5d0970fa0 Merge pull request 'projects/mescc/dy' (#50) from projects/mescc/dy into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #50
2024-06-19 16:07:14 +08:00
helloDy
2368916e62 merge 2024-06-19 16:06:12 +08:00
helloDy
2d5bd161f3 生产数据管理 2024-06-19 16:04:42 +08:00
ff424ca1b6 Merge pull request '对接报表' (#49) from projects/mescc/zjl into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #49
2024-06-19 16:01:50 +08:00
9de0dfc639 对接报表 2024-06-19 16:01:13 +08:00
fc0a97a9c6 Merge pull request 'projects/mescc/zjl' (#48) from projects/mescc/zjl into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #48
2024-06-19 08:50:56 +08:00
45538e80c4 mt 2024-06-19 08:50:24 +08:00
be75dd0702 报表2页面 2024-06-19 08:48:48 +08:00
6233ca4dca Merge pull request 'projects/mescc/zhp' (#47) from projects/mescc/zhp into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #47
2024-06-18 16:03:14 +08:00
‘937886381’
41d554f897 修改bug 2024-06-18 15:55:48 +08:00
‘937886381’
d95853dec2 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-18 10:25:39 +08:00
‘937886381’
eacf93e0db 修改bug 2024-06-18 10:25:13 +08:00
1e941180b0 Merge pull request 'projects/mescc/dy' (#46) from projects/mescc/dy into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #46
2024-06-18 08:49:31 +08:00
helloDy
7f379f2589 Merge branch 'projects/mescc/develop' into projects/mescc/dy 2024-06-18 08:48:31 +08:00
helloDy
e990680159 bug 2024-06-18 08:47:53 +08:00
d6cb371c68 Merge pull request 'projects/mescc/zhp' (#45) from projects/mescc/zhp into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #45
2024-06-18 08:46:50 +08:00
‘937886381’
731243636f Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-17 17:00:11 +08:00
‘937886381’
14c782f112 修改 2024-06-17 16:59:41 +08:00
2b3db710c1 Merge pull request 'projects/mescc/zhp' (#44) from projects/mescc/zhp into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #44
2024-06-17 15:36:53 +08:00
‘937886381’
0ef7c9808c Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-17 15:35:14 +08:00
‘937886381’
f241a35252 修改 2024-06-17 15:34:37 +08:00
89b71d5aa2 报表样式2.0 2024-06-17 13:40:30 +08:00
e9d17e0f82 Merge pull request 'projects/mescc/dy' (#43) from projects/mescc/dy into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #43
2024-06-17 09:19:57 +08:00
helloDy
e1e39681ce merge 2024-06-17 09:01:58 +08:00
helloDy
2d49bfe10e bug 2024-06-17 09:00:07 +08:00
6bd65b19f9 Merge pull request 'projects/mescc/zhp' (#42) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #42
2024-06-14 10:22:16 +08:00
‘937886381’
03dd862cb4 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-14 10:18:46 +08:00
‘937886381’
f14e9d7408 修改bug 2024-06-14 10:18:20 +08:00
7232486f8d Merge pull request '报表样式' (#41) from projects/mescc/zjl into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #41
2024-06-13 17:13:17 +08:00
2ab8acd4ca 报表样式 2024-06-13 17:12:50 +08:00
9adeb160c1 Merge pull request 'projects/mescc/zjl' (#40) from projects/mescc/zjl into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #40
2024-06-13 15:41:35 +08:00
05b5814907 报表 2024-06-13 15:36:02 +08:00
3d7e3d828c Merge branch 'projects/mescc/develop' into projects/mescc/zjl 2024-06-12 13:28:22 +08:00
5f98f4a361 产量对标FTo 2024-06-12 13:27:09 +08:00
76c95f7048 Merge pull request '新增报表' (#39) from projects/mescc/zhp into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #39
2024-06-11 14:34:26 +08:00
‘937886381’
fad6028469 新增报表 2024-06-11 14:08:32 +08:00
ae520f84d0 Merge pull request 'projects/mescc/zhp' (#38) from projects/mescc/zhp into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #38
2024-06-07 16:02:08 +08:00
‘937886381’
b40414b837 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-07 14:56:26 +08:00
b0f979318b Merge pull request 'projects/mescc/dy' (#37) from projects/mescc/dy into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #37
2024-06-07 14:55:58 +08:00
‘937886381’
db70699a6b Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-07 14:49:01 +08:00
‘937886381’
a2e73b25ce 修改 2024-06-07 14:48:33 +08:00
helloDy
0a10b7f177 Merge branch 'projects/mescc/develop' into projects/mescc/dy 2024-06-07 14:16:51 +08:00
helloDy
39cb9acfec 工单 2024-06-07 14:16:20 +08:00
3df0ab48de Merge pull request 'projects/mescc/zhp' (#36) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #36
2024-06-07 11:18:49 +08:00
‘937886381’
9854dd83b2 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-07 11:14:42 +08:00
‘937886381’
ef618a4abb 修改bug 2024-06-07 11:13:59 +08:00
40c7aaa323 Merge pull request 'projects/mescc/dy' (#35) from projects/mescc/dy into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #35
2024-06-05 16:46:34 +08:00
helloDy
1a3599a42b Merge branch 'projects/mescc/develop' into projects/mescc/dy 2024-06-05 16:43:31 +08:00
helloDy
8a08846198 bug 工单详情 2024-06-05 16:42:54 +08:00
6d6f73e7d2 Merge pull request 'projects/mescc/zhp' (#34) from projects/mescc/zhp into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #34
2024-06-05 15:05:23 +08:00
‘937886381’
1e8d60696b Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-05 14:30:51 +08:00
‘937886381’
ba0ba04182 修改首页 2024-06-05 14:30:05 +08:00
6a9acc13ae Merge pull request 'projects/mescc/zhp' (#33) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #33
2024-06-05 14:16:55 +08:00
‘937886381’
035bf0e095 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-05 14:14:44 +08:00
‘937886381’
69f953fb0c 修改 2024-06-05 14:14:12 +08:00
d43a53e7f5 Merge pull request '修改bug' (#32) from projects/mescc/zjl into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #32
2024-06-04 15:43:44 +08:00
7fc6ed87a4 修改bug 2024-06-04 15:43:00 +08:00
006d44b842 Merge pull request 'projects/mescc/zjl' (#31) from projects/mescc/zjl into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #31
2024-06-04 09:09:27 +08:00
7c6949dfa0 Merge branch 'projects/mescc/develop' into projects/mescc/zjl 2024-06-04 09:08:07 +08:00
78f7784f23 router 2024-06-04 09:07:23 +08:00
7d7e4314e9 Merge pull request 'projects/mescc/dy' (#30) from projects/mescc/dy into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #30
2024-06-04 08:57:54 +08:00
helloDy
c77130603e merge 2024-06-04 08:56:52 +08:00
helloDy
7cb8abd618 滚动条 2024-06-04 08:55:45 +08:00
c6169afaec Merge branch 'projects/mescc/develop' into projects/mescc/zjl 2024-06-04 08:36:06 +08:00
ff98ad35c5 logo图标等 2024-06-04 08:35:23 +08:00
acb87e86a1 Merge pull request 'projects/mescc/zhp' (#29) from projects/mescc/zhp into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #29
2024-06-03 16:44:17 +08:00
‘937886381’
1e3ba8c9d0 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-03 16:43:16 +08:00
‘937886381’
9d11f8b943 修改 2024-06-03 16:42:28 +08:00
1cc4c8f8a3 Merge pull request 'projects/mescc/zhp' (#28) from projects/mescc/zhp into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #28
2024-06-03 10:05:37 +08:00
‘937886381’
38b278530c Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-03 08:57:56 +08:00
‘937886381’
7a9549bc8f 修改bug 2024-06-03 08:57:04 +08:00
5f2c85e4d7 Merge pull request 'projects/mescc/dy' (#27) from projects/mescc/dy into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #27
2024-06-03 08:53:37 +08:00
helloDy
44283a049b merge 2024-06-03 08:52:30 +08:00
helloDy
da14d9f018 merge 2024-06-03 08:44:28 +08:00
00dd5b4bfe Merge pull request 'projects/mescc/zhp' (#25) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #25
2024-06-03 08:44:02 +08:00
helloDy
fe70138870 生产管理 2024-06-03 08:37:31 +08:00
‘937886381’
a5f8e72a78 Merge branch 'projects/mescc/develop' into projects/mescc/zhp 2024-06-03 08:24:18 +08:00
‘937886381’
38665c38bd 修改 2024-06-03 08:23:40 +08:00
edade214af Merge pull request 'projects/mescc/zhp' (#23) from projects/mescc/zhp into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #23
2024-05-30 22:11:27 +08:00
‘937886381’
91fd1b09d5 工厂驾驶舱 2024-05-30 16:00:18 +08:00
‘937886381’
4569d047d7 解决冲突 2024-05-29 17:07:09 +08:00
‘937886381’
dc1667cdb7 产量和效率 2024-05-29 17:05:55 +08:00
9bd4ac5066 Merge pull request 'projects/mescc/zjl' (#22) from projects/mescc/zjl into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #22
2024-05-29 13:15:23 +08:00
4b0e8dfab6 Merge branch 'projects/mescc/develop' into projects/mescc/zjl 2024-05-29 13:14:43 +08:00
71a428f034 系统管理 2024-05-29 13:13:46 +08:00
05c170ba5e Merge pull request 'projects/mescc/dy' (#21) from projects/mescc/dy into projects/mescc/develop
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #21
2024-05-22 16:52:01 +08:00
helloDy
8fd8c36b8a merge 2024-05-22 16:31:29 +08:00
helloDy
fe39f72045 生产管理 2024-05-22 16:28:47 +08:00
‘937886381’
5c05e6c2e4 修改ui 2024-05-21 09:13:52 +08:00
ab4d7a8e4b Merge pull request 'projects/mescc/zjl' (#20) from projects/mescc/zjl into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #20
2024-05-21 08:35:14 +08:00
3228987c40 1 2024-05-21 08:34:03 +08:00
e16915450b Merge pull request 'projects/mescc/dy' (#19) from projects/mescc/dy into projects/mescc/develop
Some checks are pending
continuous-integration/drone/push Build is pending
Reviewed-on: #19
2024-05-20 15:00:05 +08:00
helloDy
2061384d96 merge 2024-05-20 14:57:43 +08:00
f84355b673 mt 2024-05-20 14:56:35 +08:00
helloDy
14fa1823f2 生产管理 2024-05-20 14:55:36 +08:00
aec811827d 1 2024-05-20 14:54:18 +08:00
18e50722b0 Merge branch 'projects/mescc/develop' into projects/mescc/zjl 2024-05-14 15:19:51 +08:00
34bf9f91cf 角色管理 2024-05-14 15:18:44 +08:00
199 changed files with 31591 additions and 5383 deletions

View File

@@ -1,7 +1,7 @@
### ###
# @Author: zhp # @Author: zhp
# @Date: 2024-04-28 13:42:51 # @Date: 2024-04-28 13:42:51
# @LastEditTime: 2024-05-20 08:31:10 # @LastEditTime: 2024-07-26 10:50:10
# @LastEditors: zhp # @LastEditors: zhp
# @Description: # @Description:
### ###
@@ -9,12 +9,23 @@
ENV = 'development' ENV = 'development'
# 页面标题 # 页面标题
VUE_APP_TITLE = 芋道管理系统 VUE_APP_TITLE = 发电玻璃智能管控平台
# 芋道管理系统/开发环境 # 芋道管理系统/开发环境
VUE_APP_BASE_API = 'http://192.168.1.61:48080' # VUE_APP_BASE_API = 'http://192.168.1.70:30307'
# VUE_APP_BASE_API = 'http://glass.kszny.picaiba.com' VUE_APP_BASE_API = 'http://glass.kszny.picaiba.com'
# # 闫阳
# VUE_APP_BASE_API = 'http://192.168.1.81:48080'
# 徐
# VUE_APP_BASE_API = 'http://192.168.1.56:48080'
# 郭
# VUE_APP_BASE_API = 'http://192.168.1.61:48080'
# sara
# VUE_APP_BASE_API = 'http://192.168.1.63:8080'
# 张一丁
# VUE_APP_BASE_API = 'http://192.168.4.139:48080'
# 蔡
# VUE_APP_BASE_API = 'http://192.168.1.54:48080'
# 路由懒加载 # 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true VUE_CLI_BABEL_TRANSPILE_MODULES = true
@@ -22,7 +33,7 @@ VUE_CLI_BABEL_TRANSPILE_MODULES = true
VUE_APP_TENANT_ENABLE = true VUE_APP_TENANT_ENABLE = true
# 验证码的开关 # 验证码的开关
VUE_APP_CAPTCHA_ENABLE = true VUE_APP_CAPTCHA_ENABLE = false
# 文档的开关 # 文档的开关
VUE_APP_DOC_ENABLE = true VUE_APP_DOC_ENABLE = true

View File

@@ -2,7 +2,7 @@
ENV = 'development' ENV = 'development'
# 页面标题 # 页面标题
VUE_APP_TITLE = 芋道管理系统 VUE_APP_TITLE = 发电玻璃智能管控平台
# 芋道管理系统/本地环境 # 芋道管理系统/本地环境
VUE_APP_BASE_API = 'http://api-dashboard.yudao.iocoder.cn' VUE_APP_BASE_API = 'http://api-dashboard.yudao.iocoder.cn'
@@ -14,7 +14,7 @@ VUE_CLI_BABEL_TRANSPILE_MODULES = true
VUE_APP_TENANT_ENABLE = true VUE_APP_TENANT_ENABLE = true
# 验证码的开关 # 验证码的开关
VUE_APP_CAPTCHA_ENABLE = true VUE_APP_CAPTCHA_ENABLE = false
# 文档的开关 # 文档的开关
VUE_APP_DOC_ENABLE = true VUE_APP_DOC_ENABLE = true

View File

@@ -2,7 +2,7 @@
NODE_ENV = 'production' NODE_ENV = 'production'
# 页面标题 # 页面标题
VUE_APP_TITLE = 玻璃控股信息平台 VUE_APP_TITLE = 发电玻璃智能管控平台
# 芋道管理系统/生产环境 # 芋道管理系统/生产环境
VUE_APP_BASE_API = '' VUE_APP_BASE_API = ''
@@ -16,7 +16,7 @@ PUBLIC_PATH = ''
VUE_APP_TENANT_ENABLE = true VUE_APP_TENANT_ENABLE = true
# 验证码的开关 # 验证码的开关
VUE_APP_CAPTCHA_ENABLE = true VUE_APP_CAPTCHA_ENABLE = false
# 文档的开关 # 文档的开关
VUE_APP_DOC_ENABLE = false VUE_APP_DOC_ENABLE = false

View File

@@ -1,7 +1,7 @@
NODE_ENV = production NODE_ENV = production
# 页面标题 # 页面标题
VUE_APP_TITLE = 芋道管理系统 VUE_APP_TITLE = 发电玻璃智能管控平台
# 测试环境配置 # 测试环境配置
ENV = 'staging' ENV = 'staging'
@@ -16,7 +16,7 @@ PUBLIC_PATH = 'http://static.yudao.iocoder.cn/'
VUE_APP_TENANT_ENABLE = true VUE_APP_TENANT_ENABLE = true
# 验证码的开关 # 验证码的开关
VUE_APP_CAPTCHA_ENABLE = true VUE_APP_CAPTCHA_ENABLE = false
# 文档的开关 # 文档的开关
VUE_APP_DOC_ENABLE = false VUE_APP_DOC_ENABLE = false

View File

@@ -4,7 +4,7 @@ NODE_ENV = development
ENV = 'staging' ENV = 'staging'
# 页面标题 # 页面标题
VUE_APP_TITLE = 芋道管理系统 VUE_APP_TITLE = 发电玻璃智能管控平台
# 芋道管理系统/测试环境 # 芋道管理系统/测试环境
VUE_APP_BASE_API = 'http://127.0.0.1:48080' VUE_APP_BASE_API = 'http://127.0.0.1:48080'
@@ -18,7 +18,7 @@ VUE_APP_APP_NAME ='/admin-ui-vue2/'
VUE_APP_TENANT_ENABLE = true VUE_APP_TENANT_ENABLE = true
# 验证码的开关 # 验证码的开关
VUE_APP_CAPTCHA_ENABLE = true VUE_APP_CAPTCHA_ENABLE = false
# 文档的开关 # 文档的开关
VUE_APP_DOC_ENABLE = true VUE_APP_DOC_ENABLE = true

View File

@@ -51,10 +51,14 @@
"crypto-js": "^4.0.0", "crypto-js": "^4.0.0",
"echarts": "5.4.0", "echarts": "5.4.0",
"element-ui": "2.15.12", "element-ui": "2.15.12",
"exceljs": "^4.4.0",
"file-saver": "^2.0.5",
"fuse.js": "6.6.2", "fuse.js": "6.6.2",
"highlight.js": "^11.9.0", "highlight.js": "^11.9.0",
"html2canvas": "^1.4.1",
"js-beautify": "^1.15.1", "js-beautify": "^1.15.1",
"jsencrypt": "3.3.1", "jsencrypt": "3.3.1",
"jspdf": "^2.5.1",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"mockjs": "^1.1.0", "mockjs": "^1.1.0",
"moment": "^2.30.1", "moment": "^2.30.1",
@@ -69,7 +73,8 @@
"vue-quill-editor": "^3.0.6", "vue-quill-editor": "^3.0.6",
"vue-router": "3.4.9", "vue-router": "3.4.9",
"vuedraggable": "2.24.3", "vuedraggable": "2.24.3",
"vuex": "3.6.2" "vuex": "3.6.2",
"xlsx": "^0.18.5"
}, },
"devDependencies": { "devDependencies": {
"@vue/cli-plugin-babel": "4.5.18", "@vue/cli-plugin-babel": "4.5.18",

View File

@@ -1,32 +1,24 @@
/* /*
* @Author: zhp * @Author: zhp
* @Date: 2024-04-26 14:53:45 * @Date: 2024-04-26 14:53:45
* @LastEditTime: 2024-05-06 14:55:33 * @LastEditTime: 2024-07-26 09:32:26
* @LastEditors: zhp * @LastEditors: zhp
* @Description: * @Description:
*/ */
import request from '@/utils/request' import request from '@/utils/request'
export function getCostMainPage(data) {
// 查询部门列表
export function getOrderList(data) {
return request({ return request({
url: 'ip/prod-order/prodOrderList', url: 'ip/cost-main/page',
method: 'post',
data: data
})
}
export function getCostPage(data) {
return request({
url: 'ip/cost/costPage',
method: 'post', method: 'post',
data: data data: data
}) })
} }
export function getCostList(data) { export function exportExcel(data) {
return request({ return request({
url: 'ip/cost/costList', url: 'ip/cost-main/export-excel',
method: 'post', method: 'post',
data: data data: data,
responseType: 'blob'
}) })
} }

View File

@@ -1,16 +1,25 @@
/* /*
* @Author: zhp * @Author: zhp
* @Date: 2024-05-07 08:54:59 * @Date: 2024-05-07 08:54:59
* @LastEditTime: 2024-05-14 15:43:50 * @LastEditTime: 2024-06-19 15:22:10
* @LastEditors: zhp * @LastEditors: DY
* @Description: * @Description:
*/ */
import request from '@/utils/request' import request from '@/utils/request'
// 查询部门列表 // 查询生产数据管理分页
export function getProduceDataPage(data) { export function getProduceDataPage(data) {
return request({ return request({
url: 'ip/prod-output/prodOutputDataPage', url: '/ip/proddata/page',
method: 'post',
data: data
})
}
// 查询图数据
export function getproddata(data) {
return request({
url: '/ip/proddata/list',
method: 'post', method: 'post',
data: data data: data
}) })
@@ -18,9 +27,118 @@ export function getProduceDataPage(data) {
export function getProduceDataDetail(data){ export function getProduceDataDetail(data){
return request({ return request({
url: '/ip/prod-output/get=' + id, url: '/ip/proddata/get',
method: 'get', method: 'post',
query: data data: data
})
}
// 导出生产数据
export function exportOutPutExcel(data) {
return request({
url: '/ip/proddata/export-excel',
method: 'post',
data: data,
responseType: 'blob'
})
}
// 获取生产数据管理列表
export function prodOutputDataList(data) {
return request({
url: '/ip/prod-output/prodOutputDataList',
method: 'post',
data: data
})
}
// 获取生产管理生产目标管理碲化镉工厂分页
export function prodTargetDiPage(data) {
return request({
url: '/ip/prod-target/prodTargetDiPage',
method: 'post',
data: data
})
}
// 获取生产管理生产目标管理铜铟镓硒工厂分页
export function prodTargetToPage(data) {
return request({
url: '/ip/prod-target/prodTargetToPage',
method: 'post',
data: data
})
}
// 创建生产目标
export function createProduce(data) {
return request({
url: '/ip/prod-target/create',
method: 'post',
data: data
})
}
// 获得生产目标
export function getProduceTargetDetail(id){
return request({
url: '/ip/prod-target/get?id=' + id,
method: 'get'
})
}
// 修改生产目标
export function updateProduceTarget(data) {
return request({
url: '/ip/prod-target/update',
method: 'put',
data: data
})
}
// 导出碲化镉生产目标数据
export function exportDiTargetExcel(data) {
return request({
url: '/ip/prod-target/di-target-export-excel',
method: 'post',
data: data,
responseType: 'blob'
})
}
// 导出铜铟镓硒生产目标数据
export function exportToTargetExcel(data) {
return request({
url: '/ip/prod-target/to-target-export-excel',
method: 'post',
data: data,
responseType: 'blob'
})
}
// 删除生产目标
export function delTarget(id) {
return request({
url: '/ip/prod-target/delete?id=' + id,
method: 'delete'
})
}
// 导入铜铟镓硒工厂
export function importToTarget(data) {
return request({
url: '/ip/prod-target/to-target-import-excel',
method: 'post',
data: data
})
}
// 导入碲化镉工厂
export function importDiTarget(data) {
return request({
url: '/ip/prod-target/di-target-import-excel',
method: 'post',
data: data
}) })
} }
@@ -32,10 +150,19 @@ export function getProduceDataDetail(data){
// }) // })
// } // }
export function cockpitDataMonitor(query) { export function cockpitDataMonitor(data) {
return request({ return request({
url: 'https://restapi.amap.com/v3/weather/weatherInfo?key=95bdbdc1c387a170105f84cd416c4c9f&city=110108', url: '/ip/prod-output/cockpitDataMonitor',
method: 'get', method: 'post',
query: query data: data
})
}
export function exportFactoryDataExcel(data) {
return request({
url: '/ip/prod-output-month/export/excel',
method: 'post',
data: data,
responseType: 'blob'
}) })
} }

View File

@@ -0,0 +1,60 @@
/*
* @Author: zhp
* @Date: 2024-05-07 08:54:59
* @LastEditTime: 2024-06-03 14:25:02
* @LastEditors: DY
* @Description:
*/
import request from '@/utils/request'
// 查询工单分页
export function getWorkOrderPage(data) {
return request({
url: '/ip/prod-work-order/page',
method: 'post',
data: data
})
}
// 查询工单趋势数据
export function getDailyTrend(data) {
return request({
url: '/ip/prod-work-order/getDailyTrend',
method: 'post',
data: data
})
}
// 获得工单
export function getWorkOrderDetail(id){
return request({
url: '/ip/prod-work-order/get?id=' + id,
method: 'get'
})
}
// 获得工单设备加工数量
export function getEqNum(id){
return request({
url: '/ip/prod-work-order/getEqNum?workOrderId=' + id,
method: 'get'
})
}
// 导出工单数据
export function exportExcel(data) {
return request({
url: '/ip/prod-work-order/export-excel',
method: 'post',
data: data,
responseType: 'blob'
})
}
// 获得工单数据概览
export function getOverView(){
return request({
url: '/ip/prod-work-order/getOverView',
method: 'get'
})
}

View File

@@ -0,0 +1,219 @@
// 对标报表的接口
import request from '@/utils/request'
// 产量对标FTO
export function fTOReportByDateRangePage(data) {
return request({
url: '/ip/prod-output/queryOBFTOReportByDateRange',
method: 'post',
data: data
})
}
// 产量对标FTO导出
export function fTOReportByDateRangeExport(data) {
return request({
url: '/ip/prod-output/queryOBFTOReportByDateRangeExcel',
method: 'post',
responseType: 'blob',
data: data
})
}
// 芯片产量对标
export function cPReportByDateRangePage(data) {
return request({
url: '/ip/prod-output/queryCPReportByDateRange',
method: 'post',
data: data
})
}
// 芯片产量对标导出
export function cPReportByDateRangeExport(data) {
return request({
url: '/ip/prod-output/queryCPReportByDateRangeExport',
method: 'post',
responseType: 'blob',
data: data
})
}
// 标准组件产量对标
export function sCPReportByDateRangePage(data) {
return request({
url: '/ip/prod-output/querySCPReportByDateRange',
method: 'post',
data: data
})
}
// 标准组件产量对标导出
export function sCPReportByDateRangeExport(data) {
return request({
url: '/ip/prod-output/querySCPReportByDateRangeExport',
method: 'post',
responseType: 'blob',
data: data
})
}
// 转化效率对标
export function componentconvertrateCPage(data) {
return request({
url: '/ip/componentconvertrate-compare/page',
method: 'post',
data: data
})
}
// 转化效率对标导出
export function componentconvertrateCExport(data) {
return request({
url: '/ip/componentconvertrate-compare/export-excel',
method: 'post',
responseType: 'blob',
data: data
})
}
// 芯片良率对标
export function chipyieldRatePage(data) {
return request({
url: '/ip/chipyield-rate/page',
method: 'post',
data: data
})
}
// 芯片良率对标导出
export function chipyieldRateExport(data) {
return request({
url: '/ip/chipyield-rate/export-excel',
method: 'post',
responseType: 'blob',
data: data
})
}
// 标准组件良率对标
export function componentyieldRatePage(data) {
return request({
url: '/ip/componentyield-rate/page',
method: 'post',
data: data
})
}
// 标准组件良率对标导出
export function componentyieldRateExport(data) {
return request({
url: '/ip/componentyield-rate/export-excel',
method: 'post',
responseType: 'blob',
data: data
})
}
// 稼动率对标
export function utilzationComparePage(data) {
return request({
url: '/ip/utilzation-compare/page',
method: 'post',
data: data
})
}
// 稼动率对标导出
export function utilzationCompareExport(data) {
return request({
url: '/ip/utilzation-compare/export-excel',
method: 'post',
responseType: 'blob',
data: data
})
}
// 芯片OEE对标
export function chipoeeComparePage(data) {
return request({
url: '/ip/chipoee-compare/page',
method: 'post',
data: data
})
}
// 芯片OEE对标导出
export function chipoeeCompareExport(data) {
return request({
url: '/ip/chipoee-compare/export-excel',
method: 'post',
responseType: 'blob',
data: data
})
}
// 封装OEE对标
export function componentOEEPage(data) {
return request({
url: '/ip/component-oee/page',
method: 'post',
data: data
})
}
// 封装OEE对标导出
export function componentOEEExport(data) {
return request({
url: '/ip/component-oee/export',
method: 'post',
responseType: 'blob',
data: data
})
}
// 芯片人均产量
export function chipAnnualAverageProductionPage(data) {
return request({
url: '/ip/chip-annual-average-production/page',
method: 'post',
data: data
})
}
// 芯片人均产量导出
export function chipAnnualAverageProductionExport(data) {
return request({
url: '/ip/chip-annual-average-production/export',
method: 'post',
responseType: 'blob',
data: data
})
}
// 标准组件人均产量对标
export function componentAapPage(data) {
return request({
url: '/ip/prod-output/componentAap',
method: 'post',
data: data
})
}
// 标准组件人均产量对标导出
export function componentAapExport(data) {
return request({
url: '/ip/prod-output/componentAap-export',
method: 'post',
responseType: 'blob',
data: data
})
}
// 指标完成情况对标
export function targetCompletionPage(data) {
return request({
url: '/ip/prod-output/TargetCompletion',
method: 'post',
data: data
})
}
// 指标完成情况对标导出
export function targetCompletionExport(data) {
return request({
url: '/ip/prod-output/TargetCompletion-export',
method: 'post',
responseType: 'blob',
data: data
})
}

95
src/api/report/index.js Normal file
View File

@@ -0,0 +1,95 @@
/*
* @Author: zhp
* @Date: 2024-06-17 09:41:03
* @LastEditTime: 2024-06-20 15:39:21
* @LastEditors: zhp
* @Description:
*/
import request from '@/utils/request'
export function getComprehensiveDataPage(data) {
return request({
url: 'ip/comprehensive/data/get/comprehensive/data',
method: 'post',
data: data
})
}
export function exportComprehensiveDataPage(data) {
return request({
url: 'ip/comprehensive/data/export/comprehensive/data',
method: 'post',
data: data,
responseType: 'blob',
})
}
export function getProduceTransData(data) {
return request({
url: 'ip/prod-output/queryYCEReportByDateRange',
method: 'post',
data: data
})
}
export function exportProduceTransData(data) {
return request({
url: 'ip/prod-output/queryYCEReportByDateRangeExcel',
method: 'post',
data: data,
responseType: 'blob',
})
}
export function getProduceSituationData(data) {
return request({
url: 'ip/production/situation/get/production/situation',
method: 'post',
data: data
})
}
export function exportProduceSituationData(data) {
return request({
url: 'ip/production/situation/export/production/situation',
method: 'post',
data: data,
responseType: 'blob',
})
}
export function getProductionSituationMWData(data) {
return request({
url: 'ip/production/situation/power/get/production/situation',
method: 'post',
data: data
})
}
export function exportProductionSituationMWData(data) {
return request({
url: 'ip/production/situation/power/export/production/situation',
method: 'post',
data: data,
responseType: 'blob',
})
}
export function getProductionYieldSituationMWData(data) {
return request({
url: 'ip/product/yield/get/production/situation',
method: 'post',
data: data
})
}
export function exportProductionYieldSituationMWData(data) {
return request({
url: 'ip/product/yield/export/production/situation',
method: 'post',
data: data,
responseType: 'blob',
})
}

View File

@@ -1,15 +1,24 @@
/* /*
* @Author: zhp * @Author: zhp
* @Date: 2024-04-28 09:28:12 * @Date: 2024-04-28 09:28:12
* @LastEditTime: 2024-04-28 15:52:36 * @LastEditTime: 2024-07-25 15:05:43
* @LastEditors: zhp * @LastEditors: zhp
* @Description: * @Description:
*/ */
import request from '@/utils/request' import request from '@/utils/request'
export function getStockPage(data) { export function getStockRealTimePage(data) {
return request({ return request({
url: 'ip/stock/page', url: 'ip/stock-realtime/page',
method: 'post', method: 'post',
data: data data: data
}) })
} }
export function exportExcel(data) {
return request({
url: '/ip/stock-realtime/export-excel',
method: 'get',
data: data,
responseType: 'blob'
})
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 MiB

After

Width:  |  Height:  |  Size: 1.8 MiB

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>编组</title>
<g id="01数字驾驶舱" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="产量驾驶舱" transform="translate(-1438.000000, -12.000000)" fill="#FFFFFF" fill-rule="nonzero">
<g id="编组-20" transform="translate(1438.000000, 8.000000)">
<g id="编组" transform="translate(0.000000, 4.000000)">
<rect id="矩形" opacity="0" x="0" y="0" width="24" height="24"></rect>
<path d="M11.1710783,2.42919989 C11.7298936,2.09409047 12.4328291,2.12455473 12.9654367,2.52059014 L20.3218013,7.99000647 L20.4665209,8.10559268 C21.0744501,8.62656431 21.4302636,9.40344805 21.4302636,10.227099 L21.4302636,19.0470569 L21.4250327,19.2212289 C21.3382831,20.6611171 20.1833875,21.8011882 18.7715031,21.8011882 L5.2284969,21.8011882 L5.06035624,21.7957697 C3.67032883,21.7059084 2.56973638,20.5095861 2.56973638,19.0470569 L2.56973638,10.2273587 L2.57600507,10.0381789 C2.63012926,9.22282649 3.03207443,8.47038558 3.67819781,7.99000711 L11.034559,2.52059336 Z M12.0713092,3.55793652 C11.9772762,3.53774358 11.8769764,3.55793433 11.7954857,3.6185066 L4.43911542,9.0879271 L4.32641124,9.18150853 C4.04059293,9.44596068 3.87451485,9.82573182 3.87451485,10.2273587 L3.87451485,19.0470569 L3.880713,19.1821318 C3.94632222,19.8933667 4.52470053,20.4496068 5.2284969,20.4496068 L11.2507497,20.4487759 L11.3507364,20.3451977 L11.3512202,14.4627186 L11.3582338,14.3683764 C11.4044406,14.0603828 11.6734228,13.8227675 12,13.8227675 C12.3345637,13.8227675 12.6123182,14.0734451 12.6454705,14.3976012 L12.6489183,14.4681588 L12.6487364,20.3451881 L12.7487231,20.4487759 L18.7714898,20.4496068 L18.9018895,20.4431864 C19.5885066,20.3752237 20.1254851,19.7760987 20.1254851,19.0470569 L20.1254851,10.2273587 L20.1177907,10.0779557 C20.0769951,9.68325297 19.8759128,9.32208831 19.5608746,9.08791971 L12.2045243,3.61851399 L12.1402672,3.58065321 Z" id="形状结合" stroke="#FFFFFF" stroke-width="0.1"></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="26px" height="26px" viewBox="0 0 26 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>编组 15</title>
<g id="03设备管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="工单管理" transform="translate(-714.000000, -131.000000)">
<g id="编组-15" transform="translate(714.000000, 131.000000)">
<g id="编组-13备份" fill="#0B58FF" opacity="0.227236793">
<rect id="矩形备份-2" x="0" y="0" width="26" height="26" rx="6"></rect>
</g>
<g id="公司" transform="translate(4.749735, 4.749735)" fill-rule="nonzero">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="16.50053" height="16.50053"></rect>
<path d="M11.933204,3.46511501 L11.933204,1 C11.933204,0.44771525 11.4854888,-1.01453063e-16 10.933204,0 L7.7088886,0 L7.7088886,0 C3.83109495,0 0.687522083,3.16186639 0.687522083,7.06222625 L0.687522083,15.50053 C0.687522083,16.0528147 1.13523733,16.50053 1.68752208,16.50053 L14.8130079,16.50053 C15.3652927,16.50053 15.8130079,16.0528147 15.8130079,15.50053 L15.8130079,6.45996015 L15.8130079,6.45996015 L11.933204,3.46511501 Z M10.8812851,15.4709239 L1.80917527,15.4709239 L1.80917527,6.9505448 C1.81175925,3.6815283 4.55432163,1.03209261 7.93823277,1.02960612 L10.8812851,1.02960612 L10.8812851,15.4709239 Z M14.8298514,15.4709239 L11.9257773,15.4709239 L11.9257773,5.179727 L14.850314,7.12879718 L14.8298514,15.4709239 Z M3.75976827,9.04329837 L8.75976827,9.04329837 L8.75976827,10.3766317 L3.75976827,10.3766317 L3.75976827,9.04329837 Z M3.75976827,6.3766317 L8.75976827,6.3766317 L8.75976827,7.70996504 L3.75976827,7.70996504 L3.75976827,6.3766317 Z" id="形状" fill="#0B58FF"></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

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">
<title>菜单</title>
<g id="10系统管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="用户管理" transform="translate(-284.000000, -164.000000)" fill-rule="nonzero">
<g id="编组-7" transform="translate(284.000000, 162.000000)">
<g id="菜单" transform="translate(0.000000, 2.000000)">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="16" height="16"></rect>
<path d="M3.00057813,4.49926562 L13.0025156,4.49926562 C13.2786563,4.49926562 13.5025156,4.27540625 13.5025156,3.99926563 C13.5025156,3.723125 13.2786563,3.49926563 13.0025156,3.49926563 L3.00057813,3.49926563 C2.7244375,3.49926563 2.50057813,3.723125 2.50057813,3.99926563 C2.50057813,4.27540625 2.7244375,4.49926562 3.00057813,4.49926562 Z M3.0004375,8.48703125 L12.9786875,8.48703125 C13.2548281,8.48703125 13.4786875,8.26317187 13.4786875,7.98703125 C13.4786875,7.71089062 13.2548281,7.48703125 12.9786875,7.48703125 L3.0004375,7.48703125 C2.72429687,7.48703125 2.5004375,7.71089062 2.5004375,7.98703125 C2.5004375,8.26317187 2.72429687,8.48703125 3.0004375,8.48703125 Z M13.0025156,11.4969063 L3.00057813,11.4969063 C2.7244375,11.4969063 2.50057813,11.7207656 2.50057813,11.9969063 C2.50057813,12.2730469 2.7244375,12.4969063 3.00057813,12.4969063 L13.0025156,12.4969063 C13.2786563,12.4969063 13.5025156,12.2730469 13.5025156,11.9969063 C13.5025156,11.7207656 13.2786563,11.4969063 13.0025156,11.4969063 L13.0025156,11.4969063 Z" id="形状" fill="#373738"></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="127.000000pt" height="127.000000pt" viewBox="0 0 127.000000 127.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,127.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M520 831 c-19 -10 -48 -35 -64 -55 -25 -30 -31 -48 -34 -100 -8 -122
69 -206 188 -206 119 0 196 84 188 205 -5 74 -36 123 -98 155 -51 26 -133 26
-180 1z m137 -32 c67 -25 111 -99 98 -165 -8 -45 -57 -100 -101 -114 -100 -33
-209 62 -190 165 12 62 82 124 143 125 12 0 34 -5 50 -11z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 725 B

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="26px" height="26px" viewBox="0 0 26 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>编组 13</title>
<g id="03设备管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="工单管理" transform="translate(-474.000000, -131.000000)">
<g id="编组-13" transform="translate(474.000000, 131.000000)">
<rect id="矩形备份-2" fill="#66DD89" opacity="0.227236793" x="0" y="0" width="26" height="26" rx="6"></rect>
<g id="机床、加工中心" transform="translate(3.000000, 3.000000)" fill-rule="nonzero">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="20" height="20"></rect>
<path d="M18.1818304,15.1909171 L18.1818304,2.5 C18.1818304,2.22385763 17.9579728,2 17.6818304,2 L2.7272736,2 C2.45113122,2 2.2272736,2.22385763 2.2272736,2.5 L2.2272736,10.195451 C2.2272736,10.3084167 2.31885035,10.3999934 2.431816,10.3999934 C2.54478165,10.3999934 2.63635841,10.4915702 2.63635841,10.6045358 L2.63635841,10.999993 C2.63635841,11.3313636 2.90498735,11.5999925 3.23635794,11.5999925 L3.24999521,11.5999925 C3.58889745,11.5999925 3.86363201,11.8747271 3.86363201,12.2136293 L3.86363201,12.7909094 C3.86363201,13.016846 4.04678981,13.2000037 4.2727264,13.2000037 C4.498663,13.2000037 4.6818208,13.016846 4.6818208,12.7909094 L4.6818208,12.2136293 C4.6818208,11.8747271 4.95655535,11.5999925 5.2954576,11.5999925 L5.30909486,11.5999925 C5.64046546,11.5999925 5.9090944,11.3313636 5.9090944,10.999993 L5.9090944,10.6045358 C5.9090944,10.4915702 6.00067115,10.3999934 6.1136368,10.3999934 C6.22660245,10.3999934 6.3181792,10.3084167 6.3181792,10.195451 L6.3181792,6.5 C6.3181792,6.22385763 6.54203683,6 6.8181792,6 L12.772736,6 C13.0488784,6 13.272736,6.22385763 13.272736,6.5 L13.272736,15.1000019 C13.272736,15.3761442 13.0488784,15.6000019 12.772736,15.6000019 L11.7272736,15.6000019 C11.4511312,15.6000019 11.2272736,15.3761442 11.2272736,15.1000019 L11.2272736,14.8000009 C11.2272736,14.3581726 10.869101,14 10.4272727,14 L8.75453855,14 C8.31271023,14 7.95453761,14.3581726 7.95453761,14.8000009 L7.95453761,15.1000019 C7.95453761,15.3761442 7.73067998,15.6000019 7.45453761,15.6000019 L6.4090944,15.6000019 C6.13295202,15.6000019 5.9090944,15.3761442 5.9090944,15.1000019 L5.9090944,14.8000009 C5.9090944,14.3581726 5.55092178,14 5.10909346,14 L3.43635934,14 C2.99453103,14 2.63635841,14.3581726 2.63635841,14.8000009 L2.63635841,15.1000019 C2.63635841,15.3761442 2.41250078,15.6000019 2.13635841,15.6000019 L1.8181792,15.6000019 C1.36631131,15.6000019 1,15.9663132 1,16.4181811 L1,17.5 C1,17.7761424 1.22385763,18 1.5,18 L18.5,18 C18.7761424,18 19,17.7761424 19,17.5 L19,16.0090867 C19,15.7831554 18.8168465,15.6000019 18.5909152,15.6000019 C18.3649839,15.6000019 18.1818304,15.4168484 18.1818304,15.1909171 Z M5.0909056,10.8000056 L3.4545472,10.8000056 L3.4545472,10.3999934 L5.0909056,10.3999934 L5.0909056,10.8000056 Z M5.49999041,6.20000375 L5.49999041,9.60000656 L5.49999041,9.60000656 L3.04544321,9.60000656 L3.04544321,2.80000562 L17.3636416,2.80000562 L17.3636416,15.6000019 L14.0909056,15.6000019 L14.0909056,6.20000375 C14.0909056,5.647719 13.6431904,5.20000375 13.0909056,5.20000375 L6.49999041,5.20000375 C5.94770566,5.20000375 5.49999041,5.647719 5.49999041,6.20000375 Z M8.7727264,14.7999963 L10.4090848,14.7999963 L10.4090848,15.6000019 L8.7727264,15.6000019 L8.7727264,14.7999963 Z M3.4545472,14.7999963 L5.0909056,14.7999963 L5.0909056,15.6000019 L3.4545472,15.6000019 L3.4545472,14.7999963 Z M18.1818304,17.1999944 L1.81816962,17.1999944 L1.81816962,16.3999888 L18.1818304,16.3999888 L18.1818304,17.1999944 Z M12.0454528,4.00000469 C12.0440427,4.28673847 12.1996755,4.55228735 12.4534043,4.69605646 C12.707133,4.83982557 13.0201502,4.83982557 13.2738789,4.69605646 C13.5276077,4.55228735 13.6832405,4.28673847 13.6818304,4.00000469 C13.6832405,3.71327091 13.5276077,3.44772202 13.2738789,3.30395291 C13.0201502,3.1601838 12.707133,3.1601838 12.4534043,3.30395291 C12.1996755,3.44772202 12.0440427,3.71327091 12.0454528,4.00000469 L12.0454528,4.00000469 Z M5.49999041,3.60001125 L11.2272736,3.60001125 L11.2272736,4.39999813 L5.49999041,4.39999813 L5.49999041,3.60001125 Z M15.3181792,11.5999925 L16.136368,11.5999925 L16.136368,14.7999963 L15.3181792,14.7999963 L15.3181792,11.5999925 Z M15.3181792,9.19999438 L16.136368,9.19999438 L16.136368,10.8000056 L15.3181792,10.8000056 L15.3181792,9.19999438 Z M15.3181792,6.79999625 L16.136368,6.79999625 L16.136368,8.4000075 L15.3181792,8.4000075 L15.3181792,6.79999625 Z" id="形状" fill="#43B866"></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

BIN
src/assets/images/map.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -123,7 +123,7 @@ aside {
//main-container全局样式 //main-container全局样式
.app-container { .app-container {
padding: 16px; // padding: 16px;
} }
.components-container { .components-container {
@@ -232,6 +232,8 @@ aside {
background-color: #d9d9d9; background-color: #d9d9d9;
} }
// 大屏滚动表格
.no-data-bg { .no-data-bg {
position: absolute; position: absolute;
display: inline-block; display: inline-block;
@@ -252,3 +254,13 @@ aside {
letter-spacing: 1px; letter-spacing: 1px;
} }
} }
.dv-scroll-board .rows .ceil,
.dv-scroll-board .header .header-item {
border-right: 1px solid rgba(13, 23, 40, 1);
}
.dv-scroll-board .rows .ceil:last-child,
.dv-scroll-board .header .header-item:last-child {
border-right: none;
}

View File

@@ -1,11 +1,13 @@
<template> <template>
<el-breadcrumb class="app-breadcrumb" separator="/"> <el-breadcrumb class="app-breadcrumb" separator="/">
<transition-group name="breadcrumb"> <transition-group name="breadcrumb">
<el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path"> <el-breadcrumb-item v-for=" (item, index) in levelList" :key="item.path">
<span v-if="item.redirect === 'noRedirect' || index === levelList.length - 1" class="no-redirect">{{ <span :style="{ color: (changeColor == true ? 'rgba(255, 255, 255, 0.45)' :' rgba(0, 0, 0, .65)')}"
item.meta.title v-if="item.redirect === 'noRedirect' || index === levelList.length - 1" class="no-redirect">{{
}}</span> item.meta.title
<a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a> }}</span>
<a :style="{ color: (changeColor == true ? 'rgba(255, 255, 255, 0.45)' :' rgba(0, 0, 0, .45)')}" v-else
@click.prevent="handleLink(item)">{{ item.meta.title }}</a>
</el-breadcrumb-item> </el-breadcrumb-item>
</transition-group> </transition-group>
</el-breadcrumb> </el-breadcrumb>
@@ -18,7 +20,29 @@ export default {
levelList: null levelList: null
} }
}, },
computed: {
changeColor() {
// console.log(this.$route);
if (this.$route.path == '/copilot/efficiency-container' || this.$route.path == '/copilot/main' || this.$route.path == '/factoryData/hdIndex' || this.$route.path === '/factoryData/factory-data') {
return true
} else {
return false
}
}
},
watch: { watch: {
changeColor(val) {
if (val == true) {
let item = document.getElementsByClassName('el-breadcrumb__separator')
// let item =document.getElementsByClassName('')
item[0].style.color = rgba(255, 255, 255, 0.45)
item[1].style.color = rgba(255, 255, 255, 0.45)
} else {
let item = document.getElementsByClassName('el-breadcrumb__separator')
item[0].style.color = ''
item[1].style.color = ''
}
},
$route(route) { $route(route) {
// if you go to the redirect page, do not update the breadcrumbs // if you go to the redirect page, do not update the breadcrumbs
if (route.path.startsWith('/redirect/')) { if (route.path.startsWith('/redirect/')) {
@@ -70,13 +94,20 @@ export default {
margin-left: 8px; margin-left: 8px;
.no-redirect { .no-redirect {
color: rgba(0, 0, 0, 0.65); color: rgba(0, 0, 0, .45);
cursor: text; cursor: text;
} }
} }
.app-breadcrumb .el-breadcrumb__inner a, .app-breadcrumb .el-breadcrumb__inner a,
.el-breadcrumb__inner.is-link { .el-breadcrumb__inner.is-link {
color: rgba(0, 0, 0, 0.45); color:rgba(0, 0, 0, 0.65)
} }
</style> </style>
<!-- <style lang="scss">
.changeColor {
--theme-color: rgba(255, 255, 255, 0.45);
}
.el-breadcrumb__separator {
color:var(--theme-color);
}
</style> -->

View File

@@ -82,6 +82,8 @@ export default {
border: none; border: none;
background: #fff; background: #fff;
border-radius: 8px; border-radius: 8px;
border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px;
padding: 20px; padding: 20px;
color: #888; color: #888;
letter-spacing: 2px; letter-spacing: 2px;

View File

@@ -1,14 +1,16 @@
<!--
* @Author: zhp
* @Date: 2024-06-03 15:38:31
* @LastEditTime: 2024-07-22 16:15:21
* @LastEditors: zhp
* @Description:
-->
<template> <template>
<div style="padding: 0 15px;" @click="toggleClick"> <div style="padding: 0 15px;" @click="toggleClick">
<svg <svg :class="{'is-active':isActive}" class="hamburger" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg"
:class="{'is-active':isActive}" width="64" height="64" :fill="changeColor === true ? 'rgba(255, 255, 255,.65)' : '' ">
class="hamburger" <path
viewBox="0 0 1024 1024" d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z" />
xmlns="http://www.w3.org/2000/svg"
width="64"
height="64"
>
<path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z" />
</svg> </svg>
</div> </div>
</template> </template>
@@ -22,6 +24,15 @@ export default {
default: false default: false
} }
}, },
computed: {
changeColor() {
if (this.$route.path == '/copilot/efficiency-container' || this.$route.path == '/copilot/main' || this.$route.path == '/factoryData/hdIndex' || this.$route.path === '/factoryData/factory-data') {
return true
} else {
return false
}
},
},
methods: { methods: {
toggleClick() { toggleClick() {
this.$emit('toggleClick') this.$emit('toggleClick')

View File

@@ -17,20 +17,20 @@
</template> </template>
<script> <script>
import iframeToggle from "./IframeToggle/index" import iframeToggle from "./IframeToggle/index";
export default { export default {
name: 'AppMain', name: "AppMain",
components: { iframeToggle }, components: { iframeToggle },
computed: { computed: {
cachedViews() { cachedViews() {
return this.$store.state.tagsView.cachedViews return this.$store.state.tagsView.cachedViews;
}, },
key() { key() {
return this.$route.path return this.$route.path;
} },
} },
} };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@@ -45,7 +45,7 @@ export default {
// background-color: #fff; // background-color: #fff;
} }
.fixed-header+.app-main { .fixed-header + .app-main {
padding-top: 56px; padding-top: 56px;
} }
@@ -57,7 +57,7 @@ export default {
flex-direction: column; flex-direction: column;
} }
.fixed-header+.app-main { .fixed-header + .app-main {
padding-top: 90px; padding-top: 90px;
} }
} }

View File

@@ -1,6 +1,7 @@
<template> <template>
<div class="navbar"> <div ref="navbar" class="navbar"
<hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" :style="changeColor ? 'background: rgba(0, 21, 41, 1);boxShadow:0px 1px 8px 0px rgba(0,131,255,0.35);' : ''">
<hamburger style="margin-left: 20px;" id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container"
@toggleClick="toggleSideBar" /> @toggleClick="toggleSideBar" />
<breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav" /> <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav" />
@@ -41,6 +42,13 @@ export default {
'nickname', 'nickname',
'device' 'device'
]), ]),
changeColor() {
if (this.$route.path == '/copilot/efficiency-container' || this.$route.path == '/copilot/main' || this.$route.path == '/factoryData/hdIndex' || this.$route.path === '/factoryData/factory-data') {
return true
} else {
return false
}
},
setting: { setting: {
get() { get() {
return this.$store.state.settings.showSettings return this.$store.state.settings.showSettings
@@ -58,6 +66,23 @@ export default {
} }
} }
}, },
watch: {
// changeColor: {
// handler(val){
// if (val == true) {
// let svg = document.getElementsByClassName('hamburger')
// console.log('svg', svg)
// svg[0].style.color = 'rgba(255, 255, 255, 1)'
// svg[0].setAttribute('fill', 'rgba(255, 255, 255, 1)')
// } else {
// let svg = document.getElementsByClassName('hamburger')
// console.log('svg', svg);
// svg[0].setAttribute('fill', '')
// }
// },
// immediate: true, //立即执行
// }
},
methods: { methods: {
toggleSideBar() { toggleSideBar() {
this.$store.dispatch('app/toggleSideBar') this.$store.dispatch('app/toggleSideBar')

View File

@@ -1,25 +1,31 @@
<template> <template>
<div class="right-msg" :style="blackTitle ? 'color: #000' : 'color: #fff'"> <div class="right-msg" :style="blackTitle ? 'color: #000' : 'color: #fff'">
<div class="home-icon" v-if='blackTitle'> <div class="home-icon" v-if='blackTitle'>
<svg-icon icon-class="home" style="font-size: 24px; cursor: pointer;" @click="toHome" /> <svg-icon :icon-class="changeColor === true ? 'darkHome' : 'home'"
style="font-size: 24px; cursor: pointer;color: aqua;" @click="toHome" />
</div> </div>
<div class="time-msg"> <div class="time-msg">
<div class="line1">{{ timeZone }}&nbsp;&nbsp;&nbsp;&nbsp;{{ topTime }}</div> <div class="line1" :style="changeColor === true ? 'color:rgba(255, 255, 255, 1)' : ''">{{ timeZone
<div class="line2">{{ topDate }}</div> }}&nbsp;&nbsp;&nbsp;&nbsp;{{ topTime }}</div>
<div :style="changeColor === true ? 'color:rgba(255, 255, 255, .65)' : ''" class="line2">{{ topDate }}</div>
</div> </div>
<div class="base-msg"> <div class="base-msg">
<div class="avatar"> <div class="avatar">
<el-dropdown> <el-dropdown>
<img :src="require(`../../assets/images/choicepart/avatar.png`)" alt="" width="32" height="32" /> <img :src="require(`../../assets/images/choicepart/avatar.png`)" alt="" width="32" height="32" />
<el-dropdown-menu slot="dropdown"> <el-dropdown-menu slot="dropdown">
<el-dropdown-item><svg-icon icon-class="helpbtn" />帮助文档</el-dropdown-item> <el-dropdown-item>
<el-dropdown-item @click.native="logout"><svg-icon icon-class="exitbtn" />退出登录</el-dropdown-item> <svg-icon icon-class="helpbtn" />帮助文档
</el-dropdown-item>
<el-dropdown-item @click.native="logout">
<svg-icon icon-class="exitbtn" />退出登录
</el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</el-dropdown> </el-dropdown>
</div> </div>
<div class="use-msg"> <div class="use-msg">
<div class="line1">{{ nickname }}</div> <div :style="changeColor === true ? 'color:rgba(255, 255, 255, 1)' : ''" class="line1">{{ nickname }}</div>
<div class="line2">{{ dept }}</div> <div :style="changeColor === true ? 'color:rgba(255, 255, 255, .65)' : ''" class="line2">{{ dept }}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -48,6 +54,15 @@ export default {
} }
} }
}, },
computed: {
changeColor() {
if (this.$route.path == '/copilot/efficiency-container' || this.$route.path == '/copilot/main' || this.$route.path == '/factoryData/hdIndex' || this.$route.path === '/factoryData/factory-data') {
return true
} else {
return false
}
},
},
created() { created() {
// this.getUserMsg() // this.getUserMsg()
this.getTime() this.getTime()
@@ -124,4 +139,4 @@ export default {
opacity: 0.65; opacity: 0.65;
} }
} }
</style> </style>

View File

@@ -49,7 +49,7 @@
</template> </template>
<script> <script>
import logoImg from "@/assets/logo/logo.png"; import logoImg from "@/assets/logo/cnbm.png";
import variables from "@/assets/styles/variables.scss"; import variables from "@/assets/styles/variables.scss";
export default { export default {
@@ -70,7 +70,7 @@ export default {
}, },
data() { data() {
return { return {
title: "玻璃控股信息平台", title: "发电玻璃智能管控平台",
logo: logoImg, logo: logoImg,
}; };
}, },
@@ -104,7 +104,7 @@ export default {
width: 32px; width: 32px;
height: 32px; height: 32px;
vertical-align: middle; vertical-align: middle;
margin-right: 12px; margin-right: 10px;
} }
& .sidebar-title { & .sidebar-title {
@@ -113,7 +113,7 @@ export default {
color: #fff; color: #fff;
font-weight: 600; font-weight: 600;
line-height: 50px; line-height: 50px;
font-size: 14px; font-size: 19px;
font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif; font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
vertical-align: middle; vertical-align: middle;
} }

View File

@@ -1,3 +1,10 @@
<!--
* @Author: zhp
* @Date: 2024-06-03 15:38:31
* @LastEditTime: 2024-07-04 10:44:35
* @LastEditors: zhp
* @Description:
-->
<template> <template>
<el-scrollbar ref="scrollContainer" :vertical="false" class="scroll-container" @wheel.native.prevent="handleScroll"> <el-scrollbar ref="scrollContainer" :vertical="false" class="scroll-container" @wheel.native.prevent="handleScroll">
<slot /> <slot />
@@ -17,7 +24,9 @@ export default {
computed: { computed: {
scrollWrapper() { scrollWrapper() {
return this.$refs.scrollContainer.$refs.wrap return this.$refs.scrollContainer.$refs.wrap
} },
},
watch: {
}, },
mounted() { mounted() {
this.scrollWrapper.addEventListener('scroll', this.emitScroll, true) this.scrollWrapper.addEventListener('scroll', this.emitScroll, true)

View File

@@ -1,5 +1,7 @@
<template> <template>
<div id="tags-view-container" class="tags-view-container"> <div ref="tagsViewContainer"
:style="changeColor === true ? 'background:rgba(0, 21, 41, 1);borderTop:0px solid #d8dce5' : ''" id="tags-view-container"
class="tags-view-container">
<scroll-pane ref="scrollPane" class="tags-view-wrapper" @scroll="handleScroll"> <scroll-pane ref="scrollPane" class="tags-view-wrapper" @scroll="handleScroll">
<router-link v-for="tag in visitedViews" ref="tag" :key="tag.path" :class="isActive(tag) ? 'active' : ''" <router-link v-for="tag in visitedViews" ref="tag" :key="tag.path" :class="isActive(tag) ? 'active' : ''"
:to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }" tag="span" class="tags-view-item" :to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }" tag="span" class="tags-view-item"
@@ -36,6 +38,13 @@ export default {
} }
}, },
computed: { computed: {
changeColor() {
if (this.$route.path == '/copilot/efficiency-container' || this.$route.path == '/copilot/main' || this.$route.path == '/factoryData/hdIndex' || this.$route.path === '/factoryData/factory-data') {
return true
} else {
return false
}
},
visitedViews() { visitedViews() {
return this.$store.state.tagsView.visitedViews return this.$store.state.tagsView.visitedViews
}, },
@@ -44,9 +53,31 @@ export default {
}, },
theme() { theme() {
return this.$store.state.settings.theme; return this.$store.state.settings.theme;
} },
}, },
watch: { watch: {
changeColor(val) {
if (val == true) {
// console.log('this.$refs.tagsViewContainer', this.$refs.tagsViewContainer);
// this.$refs.tagsViewContainer.style.backgroundColor = 'rgba(0, 21, 41, 1)'
// this.$refs.tagsViewContainer.style.borderTop = '0px solid #d8dce5'
var tag = document.getElementsByClassName("tags-view-item")
console.log('tag', tag)
for (let i in tag) {
tag[i].classList.add("changeColor")
// tag[i].classList.remove("default")
}
// console.log('this.$refs.scrollContainer', this.$refs.tag);
} else {
// this.$refs.tagsViewContainer.style.backgroundColor = ''
// this.$refs.tagsViewContainer.style.borderTop = '1px solid #d8dce5'
var tag = document.getElementsByClassName("tags-view-item")
for (let i in tag) {
tag[i].classList.remove("changeColor")
// tag[i].classList.add("default")
}
}
},
$route() { $route() {
this.addTags() this.addTags()
this.moveToCurrentTag() this.moveToCurrentTag()
@@ -60,6 +91,7 @@ export default {
} }
}, },
mounted() { mounted() {
console.log(this.$route, this.changeColor);
this.initTags() this.initTags()
this.addTags() this.addTags()
}, },
@@ -68,11 +100,23 @@ export default {
return route.path === this.$route.path return route.path === this.$route.path
}, },
activeStyle(tag) { activeStyle(tag) {
if (!this.isActive(tag)) return {}; if (this.changeColor) {
return { if (!this.isActive(tag)) return {
"background-color": this.theme, "background-color": 'rgba(0, 59, 115, 1)',
"border-color": this.theme "border-color": 'rgba(0, 59, 115, 1)',
}; "color": 'rgba(255, 255, 255, 1)'
};
return {
"background-color": this.theme,
"border-color": this.theme
};
} else {
if (!this.isActive(tag)) return {};
return {
"background-color": this.theme,
"border-color": this.theme
};
}
}, },
isAffix(tag) { isAffix(tag) {
return tag.meta && tag.meta.affix return tag.meta && tag.meta.affix
@@ -230,6 +274,14 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
// :root{
// --theme-color: rgba(0, 0, 0, 0.45);
// --theme-background: #f4f4f4ff;
// }
.changeColor{
--theme-background: rgba(0, 59, 115, 1);
--theme-color: rgba(255, 255, 255, 1);
}
.tags-view-container { .tags-view-container {
height: 42px; height: 42px;
width: 100%; width: 100%;
@@ -245,8 +297,8 @@ export default {
cursor: pointer; cursor: pointer;
height: 28px; height: 28px;
line-height: 28px; line-height: 28px;
color: rgba(0, 0, 0, 0.45); color: var(--theme-color,rgba(0, 0, 0, 0.45));
background: #F4F4F4FF; background:var(--theme-background,#f4f4f4ff);
padding: 0 8px 0 12px; padding: 0 8px 0 12px;
font-size: 14px; font-size: 14px;
letter-spacing: 1px; letter-spacing: 1px;
@@ -331,7 +383,7 @@ export default {
.el-icon-close { .el-icon-close {
&:hover { &:hover {
background-color: #fff; background-color: #fff;
color: #409eff; color: rgba(62, 142, 247, 1);
} }
} }
} }

View File

@@ -2,7 +2,8 @@
<div :class="classObj" class="app-wrapper" :style="{ '--current-color': theme }"> <div :class="classObj" class="app-wrapper" :style="{ '--current-color': theme }">
<div v-if="device === 'mobile' && sidebar.opened" class="drawer-bg" @click="handleClickOutside" /> <div v-if="device === 'mobile' && sidebar.opened" class="drawer-bg" @click="handleClickOutside" />
<sidebar v-if="!sidebar.hide" class="sidebar-container" /> <sidebar v-if="!sidebar.hide" class="sidebar-container" />
<div :class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide }" class="main-container"> <div :style="changeColor ? 'background: rgba(0, 21, 41, 1)' : ''" ref="mainContainer"
:class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide }" class="main-container">
<div :class="{ 'fixed-header': fixedHeader }"> <div :class="{ 'fixed-header': fixedHeader }">
<navbar /> <navbar />
<tags-view v-if="needTagsView" /> <tags-view v-if="needTagsView" />
@@ -39,6 +40,13 @@ export default {
needTagsView: state => state.settings.tagsView, needTagsView: state => state.settings.tagsView,
fixedHeader: state => state.settings.fixedHeader fixedHeader: state => state.settings.fixedHeader
}), }),
changeColor() {
if (this.$route.path == '/copilot/efficiency-container' || this.$route.path == '/copilot/main' || this.$route.path == '/factoryData/hdIndex' || this.$route.path === '/factoryData/factory-data') {
return true
} else {
return false
}
},
classObj() { classObj() {
return { return {
hideSidebar: !this.sidebar.opened, hideSidebar: !this.sidebar.opened,
@@ -51,6 +59,16 @@ export default {
return variables; return variables;
} }
}, },
watch: {
// changeColor(val) {
// if (val == true) {
// // console.log('this.$refs.mainContainer', this.$refs.mainContainer);
// this.$refs.mainContainer.style.backgroundColor = 'rgba(0, 21, 41, 1)'
// } else {
// this.$refs.mainContainer.style.backgroundColor = ''
// }
// },
},
methods: { methods: {
handleClickOutside() { handleClickOutside() {
this.$store.dispatch('app/closeSideBar', { withoutAnimation: false }) this.$store.dispatch('app/closeSideBar', { withoutAnimation: false })

View File

@@ -1,12 +1,12 @@
/* /*
* @Author: zhp * @Author: zhp
* @Date: 2024-04-12 11:13:06 * @Date: 2024-04-12 11:13:06
* @LastEditTime: 2024-04-12 16:20:31 * @LastEditTime: 2024-07-26 09:31:09
* @LastEditors: zhp * @LastEditors: zhp
* @Description: * @Description:
*/ */
import Vue from 'vue' import Vue from 'vue'
import Element from 'element-ui' import Element, { DatePicker } from 'element-ui'
// 修改如下样式文件,覆盖样式,或者新增样式文件 // 修改如下样式文件,覆盖样式,或者新增样式文件
import "./assets/styles/element-variables.scss"; import "./assets/styles/element-variables.scss";
@@ -44,7 +44,7 @@ import {
} from "@/utils/dict"; } from "@/utils/dict";
import CodeBrickZj from 'code-brick-zj'; import CodeBrickZj from 'code-brick-zj';
import "./theme/index.css"; // 自定义主题包 - code-brick-zj import "./theme/index.css"; // 自定义主题包 - code-brick-zj
// Vue.component(Select.name, Select)
// 全局方法挂载 // 全局方法挂载
Vue.prototype.getDicts = getDicts; Vue.prototype.getDicts = getDicts;
Vue.prototype.parseTime = parseTime; Vue.prototype.parseTime = parseTime;
@@ -56,6 +56,9 @@ Vue.prototype.DICT_TYPE = DICT_TYPE;
Vue.prototype.handleTree = handleTree; Vue.prototype.handleTree = handleTree;
Vue.prototype.addBeginAndEndTime = addBeginAndEndTime; Vue.prototype.addBeginAndEndTime = addBeginAndEndTime;
Vue.prototype.divide = divide; Vue.prototype.divide = divide;
Vue.prototype.tableHeight = function (n) {
return window.innerHeight - n;
};
// 全局组件挂载 // 全局组件挂载
Vue.component("DictTag", DictTag); Vue.component("DictTag", DictTag);
@@ -65,7 +68,8 @@ Vue.component("RightToolbar", RightToolbar);
import DictTag from "@/components/DictTag"; import DictTag from "@/components/DictTag";
// 头部标签插件 // 头部标签插件
import VueMeta from "vue-meta"; import VueMeta from "vue-meta";
// import locale from './views/cost/zh'; // 请根据实际路径修改
// Vue.use(ElementUI, { locale });
Vue.use(directive) Vue.use(directive)
Vue.use(plugins) Vue.use(plugins)
Vue.use(VueMeta) Vue.use(VueMeta)

View File

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

View File

@@ -0,0 +1,20 @@
export default {
data() {
return {
tableH: this.tableHeight(260),
};
},
created() {
this.tableH = this?.heightNum ? this.tableHeight(this.heightNum) : this.tableHeight(260);
window.addEventListener('resize', this._setTableHeight);
},
destroyed() {
window.removeEventListener('resize', this._setTableHeight);
},
methods: {
_setTableHeight() {
this.tableH = this?.heightNum ? this.tableHeight(this.heightNum) : this.tableHeight(260);
// this.tableH = this.tableHeight(260);
},
},
};

View File

@@ -127,7 +127,8 @@ Router.prototype.push = function push(location) {
export default new Router({ export default new Router({
base: process.env.VUE_APP_APP_NAME ? process.env.VUE_APP_APP_NAME : "/", base: process.env.VUE_APP_APP_NAME ? process.env.VUE_APP_APP_NAME : "/",
mode: "history", // 去掉url中的# // mode: "history", // 去掉url中的#
mode: "hash",
scrollBehavior: () => ({ y: 0 }), scrollBehavior: () => ({ y: 0 }),
routes: constantRoutes, routes: constantRoutes,
}); });

View File

@@ -1,4 +1,3 @@
import axios from "@/utils/request"; import axios from "@/utils/request";
import { deepClone } from "../../utils"; import { deepClone } from "../../utils";
@@ -25,10 +24,12 @@ const state = {
chipOee: { chipOee: {
current: [], current: [],
previous: [], previous: [],
target:[]
}, },
transformRate: { transformRate: {
current: [], current: [],
previous: [], previous: [],
target:[]
}, },
chipRate: { chipRate: {
target: [], target: [],
@@ -39,6 +40,7 @@ const state = {
stdRate: { stdRate: {
target: [], target: [],
current: [], current: [],
previous: [],
outputNumber:[] outputNumber:[]
}, },
}, },
@@ -77,7 +79,7 @@ const mutations = {
state.copilot.energy.elecList = payload.elecList; state.copilot.energy.elecList = payload.elecList;
break; break;
case "efficiency": case "efficiency":
state.copilot.efficiency.chipOee = payload.chipOee; state.copilot.efficiency.chipOeeRate = payload.chipOeeRate;
state.copilot.efficiency.transformRate = payload.transformRate; state.copilot.efficiency.transformRate = payload.transformRate;
state.copilot.efficiency.chipRate = payload.chipRate; state.copilot.efficiency.chipRate = payload.chipRate;
state.copilot.efficiency.stdRate = payload.stdRate; state.copilot.efficiency.stdRate = payload.stdRate;
@@ -90,14 +92,16 @@ const actions = {
/** 初始化首页数据 */ /** 初始化首页数据 */
async initHome({ commit }) { async initHome({ commit }) {
const dataArr = await getHomeInfo(); const dataArr = await getHomeInfo();
console.log('dataArr',dataArr); // console.log('dataArr', dataArr);
let preData = dataArr.previousProdOutputOutDO
let preFtoData = dataArr.previousProdOutputFtoDO
// const targetArr = await getHomeInfo(); // const targetArr = await getHomeInfo();
const payload = splitCurrentAndPrevious(dataArr.prodOutputOutDO, dataArr.prodTargetDO,dataArr.prodOutputFtoDO // factoryListResponse, targetListResponse, prodOutputFtoListRes,preData,preFtoData
); const payload = splitCurrentAndPrevious(dataArr.prodOutputOutDO, dataArr.prodTargetOutputDO,dataArr.prodOutputFtoDO,preData,preFtoData);
commit("SET_HOME_INFO", payload); commit("SET_HOME_INFO", payload);
}, },
/** 初始化驾驶舱数据 */ /** 初始化驾驶舱数据 */
async initCopilot({ commit }, { period, source }) { async initCopilot({ commit }, { period,source,than}) {
// if (source == "energy") return; // if (source == "energy") return;
const fetcher = { const fetcher = {
@@ -111,25 +115,28 @@ const actions = {
efficiency: splitCurrentAndPreviousA, efficiency: splitCurrentAndPreviousA,
}[source] }[source]
// 获取产量数据 // 获取产量数据
let { data: factoryList, type } = await fetcher(period) let { data: factoryList, type } = await fetcher(period,than)
let targetList = null; // let targetList = null;
if (source === "yield" || source === "efficiency") { // if (source === "yield" || source === "efficiency") {
// 获取目标数据 // // 获取目标数据
let { data } = await fetcher(period, true) // let { data } = await fetcher(period,than, true)
targetList = data // targetList = data
} // }
if (source == "energy") { // if (source == "energy") {
let factoryData = factoryList // let factoryData = factoryList
const payload = handler(factoryData) // const payload = handler(factoryData)
commit("SET_COPILOT_INFO", { type, payload }); // commit("SET_COPILOT_INFO", { type, payload });
} else { // } else {
// console.log('factoryList',factoryList)
let factoryData = factoryList.prodOutputOutDO ? factoryList.prodOutputOutDO : factoryList.prodOutputRateDO let factoryData = factoryList.prodOutputOutDO ? factoryList.prodOutputOutDO : factoryList.prodOutputRateDO
let preData = factoryList.previousProdOutputOutDO ? factoryList.previousProdOutputOutDO : factoryList.previousProdOutputRateDO
let preFtoData = factoryList.previousProdOutputFtoDO ? factoryList.previousProdOutputFtoDO : []
let prodOutputFtoDO = factoryList.prodOutputFtoDO ? factoryList.prodOutputFtoDO : [] let prodOutputFtoDO = factoryList.prodOutputFtoDO ? factoryList.prodOutputFtoDO : []
let targetData = targetList.prodTargetDO ? targetList.prodTargetDO : targetList.prodTargetDO let targetData = factoryList.prodTargetOutputDO ? factoryList.prodTargetOutputDO : factoryList.prodTargetRateDO
const payload = handler(factoryData, targetData,prodOutputFtoDO) const payload = handler(factoryData,targetData,prodOutputFtoDO,preData,preFtoData)
commit("SET_COPILOT_INFO", { type, payload }); commit("SET_COPILOT_INFO", { type, payload });
} // }
}, },
}; };
@@ -281,11 +288,11 @@ function splitCurrentAndPreviousB(factoryListResponse) {
} }
} }
function splitCurrentAndPreviousA(factoryListResponse, targetListResponse) { function splitCurrentAndPreviousA(factoryListResponse, targetListResponse, prodOutputFtoListRes,preData,preFtoData) {
// console.log('工厂',factoryListResponse); // console.log('工厂',preData);
// 初始数据 // 初始数据
const { chipOee, transformRate, chipRate, stdRate } = initA(); const { chipOeeRate, transformRate, chipRate, stdRate } = initA();
// factoryListResponse = [ // factoryListResponse = [
// { // {
// factory: 0, // factory: 0,
@@ -336,6 +343,30 @@ function splitCurrentAndPreviousA(factoryListResponse, targetListResponse) {
// componentYieldRate: 0.73, // componentYieldRate: 0.73,
// }, // },
// ]; // ];
if (preData) {
for (const factory of preData) {
const fId = getPreFactoryId(factory)
// console.log('factory',factory.previousYearOee);
// chipInvest.previous[fId] = factory.previousYearInputNumber;
// chipOeeRate.current[fId] = factory.oee;
if (factory.previousGlassType === 0) {
chipOeeRate.previous[fId] = factory.previousYearOee;
}
// chipOeeRate.previous[fId] = factory.previousYearOee;
// 转化效率
if (factory.previousGlassType === 1) {
transformRate.previous[fId] = factory.previousYearComponentConversionEfficiency;
}
// transformRate.previous[fId] =factory.previousYearComponentConversionEfficiency ;
// 芯片良率 与 标准组件良率
if (![0, 1].includes(factory.previousGlassType)) continue;
const _t = [chipRate, stdRate][factory.previousGlassType]
// _t.current[fId] = factory.yieldRate ;
_t.previous[fId] = factory.previousYearYieldRate ;
// }
// debugger;
}
}
if (factoryListResponse) { if (factoryListResponse) {
for (const factory of factoryListResponse) { for (const factory of factoryListResponse) {
const fId = getFactoryId(factory); const fId = getFactoryId(factory);
@@ -347,27 +378,32 @@ function splitCurrentAndPreviousA(factoryListResponse, targetListResponse) {
chipOee, chipOee,
componentConversionEfficiency, componentConversionEfficiency,
componentYield componentYield
} = getFactoryTargetValueA(targetListResponse, fId); } = getFactoryTargetValueA(targetListResponse, fId)
stdRate.target[fId] = componentYieldRate stdRate.target[fId] = componentYieldRate
chipRate.target[fId] = chipYieldRate chipRate.target[fId] = chipYieldRate
chipOeeRate.target[fId] = chipOee
transformRate.target[fId] = componentConversionEfficiency
} }
// 芯片OEE // 芯片OEE
chipOee.current[fId] = factory.oee * 100 ; if (factory.glassType === 0) {
chipOee.previous[fId] = factory.previousYearOee * 100 ; chipOeeRate.current[fId] = factory.oee;
}
// chipOeeRate.previous[fId] = factory.previousYearOee;
// 转化效率 // 转化效率
transformRate.current[fId] = if (factory.glassType === 1) {
factory.componentConversionEfficiency * 100 ; transformRate.current[fId] = factory.componentConversionEfficiency;
transformRate.previous[fId] = }
factory.previousYearComponentConversionEfficiency * 100 ; // transformRate.previous[fId] = factory.previousYearComponentConversionEfficiency ;
// 芯片良率 与 标准组件良率 // 芯片良率 与 标准组件良率
if (![0, 1].includes(factory.glassType)) continue; if (![0, 1].includes(factory.glassType)) continue;
const _t = [chipRate, stdRate][factory.glassType] const _t = [chipRate, stdRate][factory.glassType]
_t.current[fId] = factory.yieldRate ; _t.current[fId] = factory.yieldRate ;
_t.previous[fId] = factory.previousYearYieldRate ; // _t.previous[fId] = factory.previousYearYieldRate ;
} }
// console.log('chipOeeRate',stdRate);
// console.log('chipOeeRate',chipOeeRate);
return { return {
chipOee, chipOeeRate,
transformRate, transformRate,
chipRate, chipRate,
stdRate, stdRate,
@@ -375,21 +411,63 @@ function splitCurrentAndPreviousA(factoryListResponse, targetListResponse) {
} }
} }
function splitCurrentAndPrevious(factoryListResponse, targetListResponse, prodOutputFtoListRes) { function splitCurrentAndPrevious(factoryListResponse, targetListResponse, prodOutputFtoListRes,preData,preFtoData) {
console.log('prodOutputFtoListRes',prodOutputFtoListRes); // console.log('prodOutputFtoListRes',preFtoData);
// 初始数据 // 初始数据
const { chipInvest, ftoInvest, chipOutput, stdOutput, bipvOutput } = init() const { chipInvest, ftoInvest, chipOutput, stdOutput, bipvOutput } = init()
if (prodOutputFtoListRes) { if (prodOutputFtoListRes.length !== 0 ) {
for (const factory of prodOutputFtoListRes) { for (const factory of prodOutputFtoListRes) {
console.log(factory); // console.log(factory);
const fId = getFactoryId(factory); const fId = getFactoryId(factory);
// const preFId = getPreFactoryId(factory);
// if (fId) {
ftoInvest.current[fId] = factory.chipInput; ftoInvest.current[fId] = factory.chipInput;
// }
// if (preFId) {
// ftoInvest.previous[fId] = factory.previousYearChipInput;
// }
}
}
if (preFtoData) {
for (const factory of preFtoData) {
// console.log(factory);
const fId = getPreFactoryId(factory);
// const preFId = getPreFactoryId(factory);
// if (fId) {
ftoInvest.previous[fId] = factory.previousYearChipInput; ftoInvest.previous[fId] = factory.previousYearChipInput;
// }
// if (preFId) {
// ftoInvest.previous[fId] = factory.previousYearChipInput;
// }
}
}
if (preData) {
for (const factory of preData) {
const fId = getPreFactoryId(factory);
if (factory.previousGlassType === 0) {
chipInvest.previous[fId] = factory.previousYearInputNumber
}
// chipInvest.previous[fId] = factory.previousYearInputNumber;
if (![0, 1, 2].includes(factory.previousGlassType)) continue;
const _t = [chipOutput, stdOutput, bipvOutput][factory.previousGlassType];
// if (fId) {
// _t.current[fId] = factory.outputNumber;
// }
// if (preFId) {
_t.previous[fId] = factory.previousYearOutputNumber
// }
// debugger;
} }
} }
// console.log('ftoInvest',ftoInvest)
if (factoryListResponse) { if (factoryListResponse) {
for (const factory of factoryListResponse) { for (const factory of factoryListResponse) {
const fId = getFactoryId(factory); const fId = getFactoryId(factory);
// console.log('factory.inputNumber', factory, fId);
if (factory.glassType === 0) {
chipInvest.current[fId] = factory.inputNumber
}
// const preFId = getPreFactoryId(factory);
// 获取目标值 // 获取目标值
if (targetListResponse) { if (targetListResponse) {
const { chipYield, componentYield, bipvProductOutput } = const { chipYield, componentYield, bipvProductOutput } =
@@ -399,23 +477,14 @@ function splitCurrentAndPrevious(factoryListResponse, targetListResponse, prodOu
bipvOutput.target[fId] = bipvProductOutput; bipvOutput.target[fId] = bipvProductOutput;
} }
// 芯片投入 // 芯片投入
chipInvest.current[fId] = factory.inputNumber;
chipInvest.previous[fId] = factory.previousYearInputNumber;
// FTO投入
// if (factory.chipInput || factory.previousYearChipInput) {
// ftoInvest.current[fId] = factory.chipInput;
// ftoInvest.previous[fId] = factory.previousYearChipInput;
// }
// 产出数据, 0 - (玻璃)芯片产出, 1 - 标准组件产出, 2 - BIPV产出 // 产出数据, 0 - (玻璃)芯片产出, 1 - 标准组件产出, 2 - BIPV产出
// 因为后端写的垃圾数据,所以这里要做一下判断 // 因为后端写的垃圾数据,所以这里要做一下判断
if (![0, 1, 2].includes(factory.glassType)) continue; if (![0, 1, 2].includes(factory.glassType)) continue;
const _t = [chipOutput, stdOutput, bipvOutput][factory.glassType]; const _t = [chipOutput, stdOutput, bipvOutput][factory.glassType];
_t.current[fId] = factory.outputNumber; _t.current[fId] = factory.outputNumber;
_t.previous[fId] = factory.previousYearOutputNumber;
// debugger;
} }
// console.log('chipInvest',ftoInvest);
return { return {
chipInvest, chipInvest,
// ftoInvest, // ftoInvest,
@@ -430,21 +499,24 @@ function splitCurrentAndPrevious(factoryListResponse, targetListResponse, prodOu
function getFactoryId(factory) { function getFactoryId(factory) {
return factory.factory; return factory.factory;
} }
function getPreFactoryId(factory) {
return factory.previousFactory;
}
function getFactoryTargetValue(targetList, factoryId) { function getFactoryTargetValue(targetList, factoryId) {
const target = targetList.find((item) => item.factory === factoryId); const target = targetList.find((item) => item.factory === factoryId);
if (target) { if (target) {
return { return {
// 自带模拟数据了.... random_default // 自带模拟数据了.... random_default
chipYield: target.chipYield ?? random_default(), chipYield: target.chipYield ?? 0,
componentYield: target.componentYield ?? random_default(), componentYield: target.componentYield ?? 0,
bipvProductOutput: target.bipvProductOutput ?? random_default(), bipvProductOutput: target.bipvProductOutput ?? 0,
}; };
} }
return { return {
chipYield: random_default(), chipYield: 0,
componentYield: random_default(), componentYield: 0,
bipvProductOutput: random_default(), bipvProductOutput: 0,
}; };
} }
@@ -458,15 +530,18 @@ function getFactoryTargetValueA(targetList, factoryId) {
const target = targetList.find((item) => item.factory === factoryId) const target = targetList.find((item) => item.factory === factoryId)
if (target) { if (target) {
return { return {
chipYieldRate: target.chipYieldRate ?? random_default(), chipYieldRate: target.chipYieldRate ?? 0,
componentYieldRate: target.componentYieldRate ?? random_default(), componentYieldRate: target.componentYieldRate ?? 0,
componentYield: target.componentYield ?? random_default(), componentYield: target.componentYield ?? 0,
// componentYield: target.componentYield ?? 0,
chipOee: target.chipOee ?? 0,
}; };
} }
return { return {
chipYieldRate:0, chipYieldRate:0,
componentYieldRate:0, componentYieldRate:0,
componentYield:0 , componentYield: 0,
chipOee:0,
}; };
} }
@@ -476,22 +551,22 @@ function getFactoryTargetValueA(targetList, factoryId) {
*/ */
function initA() { function initA() {
const t_ = { const t_ = {
current: Array(7).fill(0), current: Array(2).fill(0),
previous: Array(7).fill(0), previous: Array(2).fill(0),
}; };
// 芯片OEE // 芯片OEE
const chipOee = deepClone(t_);
// 转化效率 // 转化效率
const transformRate = deepClone(t_);
// 标准组件良率 // 标准组件良率
const stdRate = { const stdRate = {
...deepClone(t_), ...deepClone(t_),
target: Array(7).fill(0), target: Array(2).fill(0),
}; };
// 芯片良率 // 芯片良率
const transformRate = deepClone(stdRate);
const chipRate = deepClone(stdRate); const chipRate = deepClone(stdRate);
const chipOeeRate = deepClone(stdRate);
return { return {
chipOee, chipOeeRate,
transformRate, transformRate,
chipRate, chipRate,
stdRate, stdRate,
@@ -504,8 +579,8 @@ function initA() {
*/ */
function init() { function init() {
const t_ = { const t_ = {
current: Array(7).fill(0), current: Array(2).fill(0),
previous: Array(7).fill(0), previous: Array(2).fill(0),
}; };
// 芯片投入 // 芯片投入
const chipInvest = deepClone(t_); const chipInvest = deepClone(t_);
@@ -514,7 +589,7 @@ function init() {
// 芯片产出 // 芯片产出
const chipOutput = { const chipOutput = {
...deepClone(t_), ...deepClone(t_),
target: Array(7).fill(0), target: Array(2).fill(0),
}; };
// 标准组件产出 // 标准组件产出
const stdOutput = deepClone(chipOutput); const stdOutput = deepClone(chipOutput);
@@ -544,6 +619,7 @@ async function getHomeInfo() {
const { code, data } = await axios.post("ip/prod-output/cockpitData", { const { code, data } = await axios.post("ip/prod-output/cockpitData", {
factorys: [], factorys: [],
date: 4, date: 4,
mode:0
}); });
if (code == 0) { if (code == 0) {
return data; return data;
@@ -609,16 +685,16 @@ async function doFetch(copilot_module = "yield", fetch_target, params) {
* @param {*} target 是否获取目标数据 * @param {*} target 是否获取目标数据
* @returns * @returns
*/ */
function getCopilotYield(period, target = false) { function getCopilotYield(period,than,target = false) {
return getCopilotData("yield", period, target); return getCopilotData("yield", period,than, target);
} }
function getCopilotEnergy(period, target = false) { function getCopilotEnergy(period, target = false) {
return getCopilotData("energy", period, target); return getCopilotData("energy", period,than, target);
} }
function getCopilotEfficiency(period, target = false) { function getCopilotEfficiency(period,than, target = false) {
return getCopilotData("efficiency", period, target); return getCopilotData("efficiency", period,than, target);
} }
/** /**
@@ -627,12 +703,13 @@ function getCopilotEfficiency(period, target = false) {
* @param {*} target 是否获取目标数据:默认 否 * @param {*} target 是否获取目标数据:默认 否
* @returns * @returns
*/ */
async function getCopilotData(copilot_module, period, target = false) { async function getCopilotData(copilot_module, period,than, target = false) {
if (!copilot_module) copilot_module = "yield"; if (!copilot_module) copilot_module = "yield";
// 请求参数,直接一次性获取所有工厂 // 请求参数,直接一次性获取所有工厂
let queryParams = { let queryParams = {
factorys: [], factorys: [],
date: 4, date: 4,
mode:0
}; };
switch (period) { switch (period) {
@@ -652,7 +729,14 @@ async function getCopilotData(copilot_module, period, target = false) {
queryParams.date = 1; queryParams.date = 1;
break; break;
} }
switch (than) {
case "同比":
queryParams.mode = 0;
break;
case "环比":
queryParams.mode = 1;
break;
}
return { return {
data: await doFetch(copilot_module, target ? true : false, queryParams), data: await doFetch(copilot_module, target ? true : false, queryParams),
type: copilot_module, type: copilot_module,

View File

@@ -163,4 +163,4 @@ textarea {
.el-upload__tip { .el-upload__tip {
line-height: 1.2; line-height: 1.2;
} }

View File

@@ -71,6 +71,102 @@ export const SystemDataScopeEnum = {
DEPT_SELF: 5 // 仅本人数据权限 DEPT_SELF: 5 // 仅本人数据权限
} }
/**
* 工厂名称
*/
// export const factoryList =['瑞昌中建材光电材料有限公司', '邯郸中建材光电材料有限公司', '中建材株洲光电材料有限公司', '佳木斯中建材光电材料有限公司', '成都中建材光电材料有限公司', '凯盛光伏材料有限公司', '蚌埠兴科玻璃有限公司']
export const factoryArray1 =[
{
name: '瑞昌中建材光电材料有限公司',
id: 0
},
{
name: '邯郸中建材光电材料有限公司',
id: 1
},
{
name: '中建材株洲光电材料有限公司',
id: 2
},
{
name: '佳木斯中建材光电材料有限公司',
id: 3
},
{
name: '成都中建材光电材料有限公司',
id: 4
},
{
name: '凯盛光伏材料有限公司',
id: 5
},
{
name: '蚌埠兴科玻璃有限公司',
id: 6
}
]
// export const dhgfactoryList =[
// {
// name: '瑞昌中建材光电材料有限公司',
// id: 0
// },
// {
// name: '邯郸中建材光电材料有限公司',
// id: 1
// },
// {
// name: '中建材株洲光电材料有限公司',
// id: 2
// },
// {
// name: '佳木斯中建材光电材料有限公司',
// id: 3
// },
// {
// name: '成都中建材光电材料有限公司',
// id: 4
// },
// {
// name: '蚌埠兴科玻璃有限公司',
// id: 6
// }
// ]
export const tyjxfactoryList =[
{
name: '凯盛光伏材料有限公司',
id: 5
}
]
// 暂时只有瑞昌邯郸数据
export const factoryList =['瑞昌中建材光电材料有限公司', '邯郸中建材光电材料有限公司']
export const factoryListabbr =['瑞昌', '邯郸']
export const factoryArray =[
{
name: '瑞昌中建材光电材料有限公司',
id: 0
},
{
name: '邯郸中建材光电材料有限公司',
id: 1
}
]
export const dhgfactoryList =[
{
name: '瑞昌中建材光电材料有限公司',
id: 0
},
{
name: '邯郸中建材光电材料有限公司',
id: 1
}
]
/** /**
* 代码生成模板类型 * 代码生成模板类型
*/ */

View File

@@ -139,3 +139,15 @@ export function getDictDataLabel(dictType, value) {
const dict = getDictData(dictType, value); const dict = getDictData(dictType, value);
return dict ? dict.label : ''; return dict ? dict.label : '';
} }
// table中用来过滤字典
export function publicFormatter(dictTable) {
const dictDatas = getDictDatas(dictTable)
return function (val) {
const arr = {}
dictDatas.map((item) => {
arr[item.value] = item.label
})
return arr?.[val]
}
}

View File

@@ -1,8 +1,16 @@
<!-- <!--
* @Author: zhp
* @Date: 2024-07-10 15:17:28
* @LastEditTime: 2024-07-23 17:03:42
* @LastEditors: zhp
* @Description:
-->
<!--
filename: ChartContainer.vue filename: ChartContainer.vue
author: liubin author: liubin
date: 2024-04-10 08:54:33 date: 2024-04-10 08:54:33
description: description:
todo: 驾驶舱和首页的 ChartContainer, 实现滑动条 和动态宽高 todo: 驾驶舱和首页的 ChartContainer, 实现滑动条 和动态宽高
--> -->
@@ -19,7 +27,7 @@ export default {
props: { props: {
noScroll: { noScroll: {
type: Boolean, type: Boolean,
default: false, default: true,
}, },
}, },
data() { data() {

View File

@@ -9,9 +9,9 @@
<chart-container class="bar-chart-base"> <chart-container class="bar-chart-base">
<div class="legend"> <div class="legend">
<span v-for="item in legend" :key="item.label" class="legend-item" <span v-for="item in legend" :key="item.label" class="legend-item"
:style="{ fontSize: isFullscreen ? '0.58vw' : '0.54vw' }">{{ item.label }}</span> :style="{ fontSize: isFullscreen ? '0.72vw' : '0.7vw' }">{{ item.label }}</span>
</div> </div>
<div ref="chart" :style="{ height: '95%',width: width}"></div> <div ref="chart" style="height:94%;width:100%"></div>
</chart-container> </chart-container>
</template> </template>
@@ -51,7 +51,7 @@ export default {
}, },
data() { data() {
return { return {
width: '', width: '100%',
isFullscreen: false, isFullscreen: false,
actualOptions: null, actualOptions: null,
options: { options: {
@@ -62,7 +62,36 @@ export default {
top: "15%", top: "15%",
containLabel: true, containLabel: true,
}, },
tooltip: {}, tooltip: {
trigger: "axis",
axisPointer: {
// type: "cross",
crossStyle: {
color: "rgba(237,237,237,0.5)",
},
},
backgroundColor: 'rgba(0,0,0,0)', // tooltip默认背景为白色手动置为透明
extraCssText: 'padding:0;border-width:0',
formatter: params => {
var res = `<span style='color:rgba(255,255,255,0.85);display:inline-block;margin-bottom:8px;'>${params[0].axisValueLabel}</span>`;
for (var i = 0, l = params.length; i < l; i++) {
let color = Object.prototype.toString.call(params[i].color) == "[object String]" ? params[i].color : params[i].color.colorStops ? params[i].color.colorStops[0].color : ''
// console.log(item.color, color);
res +=
"<br/>" +
`<span style='border-radius:2px;display:inline-block;margin-right:4px;width:12px;height:12px;background-color:${color}'></span>` +
`<span style='display:inline-block;width:150px;color:rgba(255,255,255,.85);font-size:16px;letter-spacing: 2px;'>${params[i].seriesName}</span>` +
`<span style='display:inline-block;width:60px;color:rgba(255,255,255,0.65);font-size:16px;letter-spacing: 2px;text-align: right;'>${params[i].value ? params[i].value : 0}</span>`;
}
const htmlContent = `
<div style="padding: 12px 16px;background:rgba(0,24,41,.5);box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.38);backdrop-filter: blur(10px);">
${res}
</div>
`;
return htmlContent;
},
},
xAxis: { xAxis: {
axisTick: { axisTick: {
show: false, show: false,
@@ -73,23 +102,24 @@ export default {
}, },
}, },
axisLabel: { axisLabel: {
color: "#fff", color: "rgba(223,241,254,.8)",
fontSize: 12, fontSize: 16,
}, },
data: this.xAxis, data: this.xAxis,
}, },
yAxis: { yAxis: {
name: "单位/片", name: "单位/片",
nameTextStyle: { nameTextStyle: {
color: "#fff", color: "rgba(223,241,254,.8)",
fontSize: 12, fontSize: 16,
align: "right",
}, },
axisTick: { axisTick: {
show: false, show: false,
}, },
axisLabel: { axisLabel: {
color: "#fff", color: "rgba(223,241,254,.8)",
fontSize: 12, fontSize: 16,
}, },
axisLine: { axisLine: {
show: true, show: true,
@@ -99,7 +129,7 @@ export default {
}, },
splitLine: { splitLine: {
lineStyle: { lineStyle: {
color: "#4561AE", color: "rgba(69,97,174,.4)",
}, },
}, },
}, },
@@ -107,7 +137,7 @@ export default {
{ {
name: "", // this.series[0].name, name: "", // this.series[0].name,
type: "bar", type: "bar",
barWidth: 12, barWidth: 16,
itemStyle: { itemStyle: {
borderRadius: [10, 10, 0, 0], borderRadius: [10, 10, 0, 0],
color: { color: {
@@ -142,7 +172,7 @@ export default {
{ {
name: "", // this.series[1].name, name: "", // this.series[1].name,
type: "bar", type: "bar",
barWidth: 12, barWidth: 16,
// tooltip: { // tooltip: {
// valueFormatter: function (value) { // valueFormatter: function (value) {
// return value + " ml"; // return value + " ml";
@@ -184,54 +214,38 @@ export default {
/** 全屏状态切换时,对柱子粗细和字体大小进行相应调整 */ /** 全屏状态切换时,对柱子粗细和字体大小进行相应调整 */
isOpen(val) { isOpen(val) {
// console.log(val) // console.log(val)
if (val === true) { this.canvasReset()
console.log('ztl')
this.width = 95 + '%'
this.canvasReset()
console.log(this.width)
} else {
this.watch = 100 + '%'
this.canvasReset()
}
}, },
isFullscreen(val) { isFullscreen(val) {
this.actualOptions.series.map((item) => { this.options.series.map((item) => {
item.barWidth = val ? 18 : 12; item.barWidth = val ? 18 : 16;
}); });
this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 12; this.options.xAxis.axisLabel.fontSize = val ? 18 : 16;
this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 12; this.options.yAxis.axisLabel.fontSize = val ? 18 : 16;
this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 12; this.options.yAxis.nameTextStyle.fontSize = val ? 18 : 16;
this.initChart(this.actualOptions); this.initChart(this.options);
if (val === false && this.isOpen === true) {
console.log(val)
this.width = 97 + '%'
this.canvasReset()
} else if (val === false && this.isOpen === false) {
this.watch = 100 + '%'
this.canvasReset()
}
// this.actualOptions.series.map((item) => { // this.actualOptions.series.map((item) => {
// item.barWidth = val ? 18 : 12; // item.barWidth = val ? 18 : 16;
// }); // });
// this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 12; // this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 16;
// this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 12; // this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 16;
// this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 12; // this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 16;
this.initChart(this.actualOptions); // this.initChart(this.actualOptions);
this.canvasReset()
}, },
series(val) { series(val) {
if (!val) { if (!val) {
this.initChart(this.options); this.initChart(this.options);
return; return;
} }
const actualOptions = JSON.parse(JSON.stringify(this.options)); // const actualOptions = JSON.parse(JSON.stringify(this.options));
console.log('actualOptions', this.options) // console.log('actualOptions', this.options)
actualOptions.series[0].data = val[0].data; this.options.series[0].data = val[0].data;
actualOptions.series[0].name = val[0].name; this.options.series[0].name = val[0].name;
actualOptions.series[1].data = val?.[1]?.data || []; this.options.series[1].data = val?.[1]?.data || [];
actualOptions.series[1].name = val?.[1]?.name || ""; this.options.series[1].name = val?.[1]?.name || "";
this.actualOptions = actualOptions; // this.actualOptions = actualOptions;
this.initChart(actualOptions); this.initChart(this.options);
}, },
}, },
mounted() { mounted() {
@@ -240,7 +254,7 @@ export default {
this.isFullscreen = screenfull.isFullscreen; this.isFullscreen = screenfull.isFullscreen;
}); });
} }
this.actualOptions = this.options // this.actualOptions = this.options
this.canvasReset(); this.canvasReset();
window.addEventListener("resize", this.canvasReset); window.addEventListener("resize", this.canvasReset);
}, },
@@ -264,7 +278,7 @@ export default {
this.chart.dispose(); this.chart.dispose();
} }
this.chart = echarts.init(this.$refs.chart); this.chart = echarts.init(this.$refs.chart);
this.chart.setOption(this.actualOptions); this.chart.setOption(this.options);
}, },
}, },
}; };

View File

@@ -1,8 +1,15 @@
<!-- <!--
* @Author: zhp
* @Date: 2024-06-03 15:38:31
* @LastEditTime: 2024-07-24 10:29:26
* @LastEditors: zhp
* @Description:
-->
<!--
filename: ChartContainer.vue filename: ChartContainer.vue
author: liubin author: liubin
date: 2024-04-10 08:54:33 date: 2024-04-10 08:54:33
description: description:
todo: 驾驶舱和首页的 ChartContainer, 实现滑动条 和动态宽高 todo: 驾驶舱和首页的 ChartContainer, 实现滑动条 和动态宽高
--> -->
@@ -19,7 +26,7 @@ export default {
props: { props: {
noScroll: { noScroll: {
type: Boolean, type: Boolean,
default: false, default: true,
}, },
}, },
data() { data() {

View File

@@ -8,9 +8,7 @@
<template> <template>
<div class="copilot-container"> <div class="copilot-container">
<!-- refresh btn --> <!-- refresh btn -->
<button <button v-if="0" style="
v-if="0"
style="
appearance: none; appearance: none;
outline: none; outline: none;
border: none; border: none;
@@ -20,22 +18,11 @@
position: absolute; position: absolute;
top: 8px; top: 8px;
right: 8px; right: 8px;
" " @click="$emit('refresh')">
@click="$emit('refresh')" <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"
> style="width: 24px; height: 24px">
<svg <path stroke-linecap="round" stroke-linejoin="round"
xmlns="http://www.w3.org/2000/svg" d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99" />
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
style="width: 24px; height: 24px"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99"
/>
</svg> </svg>
</button> </button>
<!-- decoration --> <!-- decoration -->
@@ -44,19 +31,13 @@
<div v-if="side == 'left'" class="corner bl"></div> <div v-if="side == 'left'" class="corner bl"></div>
<div v-if="side == 'right'" class="corner br"></div> <div v-if="side == 'right'" class="corner br"></div>
<!-- content --> <!-- content -->
<div <div class="container-head" :class="[side == 'left' ? 'gradient-to-right' : 'gradient-to-left']">
class="container-head" <Icon style="margin-left: 16px;" :icon="icon"></Icon>
:class="[side == 'left' ? 'gradient-to-right' : 'gradient-to-left']"
>
<Icon :icon="icon"></Icon>
<h2 class="container-title">{{ title }}</h2> <h2 class="container-title">{{ title }}</h2>
</div> </div>
<div <div class="container-body" :class="[
class="container-body"
:class="[
side == 'left' ? 'body-gradient-to-right' : 'body-gradient-to-left', side == 'left' ? 'body-gradient-to-right' : 'body-gradient-to-left',
]" ]">
>
<slot /> <slot />
</div> </div>
</div> </div>
@@ -92,6 +73,7 @@ export default {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.copilot-container { .copilot-container {
height: 0; height: 0;
flex: 1; flex: 1;
@@ -141,7 +123,7 @@ export default {
gap: 8px; gap: 8px;
.container-title { .container-title {
font-size: 1.18vw; font-size: 1vw;
line-height: 1.39vw; line-height: 1.39vw;
font-weight: normal; font-weight: normal;
letter-spacing: 2px; letter-spacing: 2px;
@@ -161,8 +143,8 @@ export default {
position: absolute; position: absolute;
// width: 16px; // width: 16px;
// height: 16px; // height: 16px;
width: 0.95vw; width: 0.7vw;
height: 0.95vw; height: 0.7vw;
} }
.corner.tl { .corner.tl {

View File

@@ -1,7 +1,7 @@
<!-- <!--
* @Author: zhp * @Author: zhp
* @Date: 2024-04-28 13:42:51 * @Date: 2024-04-28 13:42:51
* @LastEditTime: 2024-05-07 16:54:54 * @LastEditTime: 2024-07-09 16:55:58
* @LastEditors: zhp * @LastEditors: zhp
* @Description: * @Description:
--> -->
@@ -61,8 +61,8 @@ export default {
.container-icon { .container-icon {
// width: 32px; // width: 32px;
// height: 32px; // height: 32px;
width: 1.701vw; width: 1.4vw;
height: 1.701vw; height: 1.4vw;
background: #ccc2; background: #ccc2;
} }
</style> </style>

View File

@@ -7,40 +7,31 @@
<template> <template>
<div class="copilot-header"> <div class="copilot-header">
<section class="menu"> <section class="menu left">
<CopilotButton <CopilotButton v-for="i in ['产量', '效率']" :key="i" :label="i" :active="i === active"
v-for="i in ['产量', '效率', '综合']" @click="() => $emit('update:active', i)" />
:key="i" <div class="type-name"></div>
:label="i" <CopilotButton v-for="i in ['同比', '环比']" :key="i" :label="i" :active="i === than"
:active="i === active" @click="() => $emit('update:than', i)" />
@click="() => $emit('update:active', i)"
/>
</section>
<section class="menu">
<CopilotButton
v-for="i in ['日', '周', '月', '年']"
:key="i"
:label="i"
:active="i === period"
@click="() => $emit('update:period', i)"
/>
<div class="btn-group">
<button type="button" class="export-btn" />
<button
type="button"
class="fullscreen-btn"
:class="[isFullscreen ? 'exit-fullscreen' : '']"
@click="toggleFullScreen"
/>
</div>
</section> </section>
<div class="page-title">{{ active }}驾驶舱</div> <div class="page-title">{{ active }}驾驶舱</div>
<section class="menu right" style="width: 24vw;float: right;">
<CopilotButton v-for="i in ['日', '周', '月', '年']" :key="i" :label="i" :active="i === period"
@click="() => $emit('update:period', i)" />
<div class="btn-group">
<!-- <button type="button" class="export-btn" @click="handleExport" /> -->
<button type="button" class="fullscreen-btn" :class="[isFullscreen ? 'exit-fullscreen' : '']"
@click="toggleFullScreen" />
<!-- <button class="times-btn"> {{ times }} </button> -->
</div>
</section>
</div> </div>
</template> </template>
<script> <script>
import CopilotButton from "./button.vue"; import CopilotButton from "./button.vue";
import screenfull from "screenfull"; import screenfull from "screenfull";
import { exportFactoryDataExcel } from "@/api/produceData";
export default { export default {
name: "CopilotHeader", name: "CopilotHeader",
@@ -52,14 +43,70 @@ export default {
period: { period: {
type: String, type: String,
}, },
than: {
type: String,
},
}, },
data() { data() {
return { return {
times:'',
isFullscreen: false, isFullscreen: false,
}; };
}, },
mounted () {
this.getTimes()
this.getTimesInterval();
},
computed: {}, computed: {},
methods: { methods: {
handleExport() {
exportFactoryDataExcel({
// factoryId: this.companyId,
timeSelection: this.period === 1 ? 0 : this.period === 2 ? 1 : this.period === 3 ? 2 : 3,
}).then(response => {
this.$download.excel(response, `生产数据.xls`);
// this.exportLoading = false;
}).catch(() => { });
},
getTimes() {
setInterval(this.getTimesInterval, 60000);
},
getTimesInterval() {
var now = new Date();
var weekDay = now.getDay();
var weeks = new Array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六");
var week = weeks[weekDay]
let _this = this;
let year = new Date().getFullYear(); //获取当前时间的年份
let month = new Date().getMonth() + 1; //获取当前时间的月份
let day = new Date().getDate(); //获取当前时间的天数
let hours = new Date().getHours(); //获取当前时间的小时
let minutes = new Date().getMinutes(); //获取当前时间的分数
// let seconds = new Date().getSeconds(); //获取当前时间的秒数
//当小于 10 的是时候,在前面加 0
if (hours < 10) {
hours = '0' + hours;
}
if (minutes < 10) {
minutes = '0' + minutes;
}
// if (seconds < 10) {
// seconds = '0' + seconds;
// }
//拼接格式化当前时间
this.times =
year +
'.' +
month +
'.' +
day +
" " + hours +
'.' +
minutes +
'.' +
week
},
toggleFullScreen() { toggleFullScreen() {
this.isFullscreen = !this.isFullscreen; this.isFullscreen = !this.isFullscreen;
screenfull.toggle(document.querySelector(".copilot-layout")) screenfull.toggle(document.querySelector(".copilot-layout"))
@@ -82,10 +129,17 @@ export default {
display: flex; display: flex;
gap: 12px; gap: 12px;
align-items: center; align-items: center;
justify-content: space-between;
} }
.copilot-header > section { .copilot-header > .left {
width: 24vw; width: 26vw;
display: flex;
align-items: center;
gap: 8px;
}
.copilot-header >.right {
width: 26vw;
display: flex; display: flex;
align-items: center; align-items: center;
gap: 8px; gap: 8px;
@@ -99,6 +153,17 @@ export default {
cursor: pointer; cursor: pointer;
} }
.times-btn {
width: 240px;
height: 32px;
margin-left: 24px;
cursor: pointer;
color: white;
font-size: 20px;
line-height: 30px;
float: right;
/* margin-bottom: 20px; */
}
.export-btn { .export-btn {
background: url(../../../assets/images/export-icon.png) 0 0 / 100% 100% background: url(../../../assets/images/export-icon.png) 0 0 / 100% 100%
no-repeat; no-repeat;
@@ -112,15 +177,27 @@ export default {
background: url(../../../assets/images/homeindex/exit-fullscreen.png) 0 0 / 100% 100% background: url(../../../assets/images/homeindex/exit-fullscreen.png) 0 0 / 100% 100%
no-repeat; no-repeat;
} }
.type-name {
/* content: ""; */
display: inline-block;
width: 1px;
height: 59px;
border: 1px solid;
opacity: 0.9;
border-image: linear-gradient(180deg, rgba(0, 176, 243, 0), rgba(88, 194, 255, 1), rgba(0, 120, 228, 0)) 2 2;
/* position: absolute; */
/* left: 0; */
/* top: 10px; */
}
.page-title { .page-title {
flex: 1; width: 26vw;
font-size: 54px; font-size: 54px;
line-height: 70px; line-height: 70px;
letter-spacing: 5px; letter-spacing: 5px;
font-family: 优设标题黑; font-family: 优设标题黑;
color: #6db6ff; color: #6db6ff;
text-align: right; text-align: center;
user-select: none; user-select: none;
background: url(../../../assets/images/homeindex/page-title.png) 0 0 / 100% 100% no-repeat;
} }
</style> </style>

View File

@@ -1,38 +1,35 @@
<template> <template>
<div class="factory-header"> <div class="factory-header">
<section class="menu1"> <section class="menu1">
<FactorySelect <!-- <CopilotButton v-for="i in ['产量', '效率']" :key="i" :label="i" :active="i === active"
:companyName="companyName" @click="() => $emit('update:active', i)" />
:companyId="companyId" <div class="type-name"></div> -->
@updateCompany="updateCompany" <CopilotButton v-for="i in dataList" :key="i.id" :label="i.name" :active="i.id === period"
/> @click="() => $emit('update:period', i.id)" />
</section> <!-- <CopilotButton v-for="i in ['同比', '环比']" :key="i" :label="i" :active="i === than"
<section class="menu2"> @click="() => $emit('update:than', i)" /> -->
<CopilotButton
v-for="i in ['日', '周', '月', '年']"
:key="i"
:label="i"
:active="i === period"
@click="() => $emit('update:period', i)"
/>
<div class="btn-group">
<button type="button" class="export-btn" />
<button
type="button"
class="fullscreen-btn"
:class="[isFullscreen ? 'exit-fullscreen' : '']"
@click="toggleFullScreen"
/>
</div>
</section> </section>
<div class="page-title">{{ companyName }}</div> <div class="page-title">{{ companyName }}</div>
<section class="menu2">
<div class="btn-group">
<el-tooltip v-if="showPeriod" class="item" effect="dark" content="导出" placement="top">
<button type="button" class="export-btn" @click="handleExport" />
</el-tooltip>
<el-tooltip class="item" effect="dark" :content="isFullscreen === false ? '退出全屏' : '全屏'" placement="top">
<button type="button" class="fullscreen-btn" :class="[isFullscreen ? 'exit-fullscreen' : '']"
@click="toggleFullScreen" />
</el-tooltip>
</div>
</section>
</div> </div>
</template> </template>
<script> <script>
import CopilotButton from "./button.vue"; // import CopilotButton from "./button.vue";
import FactorySelect from "./FactorySelect.vue"; import FactorySelect from "./FactorySelect.vue";
import screenfull from "screenfull"; import screenfull from "screenfull";
import CopilotButton from "./button.vue";
import { exportFactoryDataExcel } from "@/api/produceData";
export default { export default {
name: "FactoryDataHeader", name: "FactoryDataHeader",
@@ -42,19 +39,55 @@ export default {
type: String, type: String,
}, },
companyId: { companyId: {
type: String, type: Number,
}, },
period: { period: {
type: Number,
},
than: {
type: String, type: String,
}, },
}, },
watch: {
period(val) {
if (val != 1) {
this.showPeriod = true
} else {
this.showPeriod = false
}
}
},
data() { data() {
return { return {
isFullscreen: false, isFullscreen: false,
content: '全屏',
showPeriod:false,
dataList: [
{ id: 1, name: "日" },
{ id: 2, name: "周" },
{ id: 3, name: "月" },
{ id: 4, name: "年" },
],
}; };
}, },
computed: {}, computed: {},
methods: { methods: {
handleExport() {
// if (this.period != 1) {
this.showPeriod = true
exportFactoryDataExcel({
factoryId: this.companyId,
timeSelection: this.period === 1 ? 0 : this.period === 2 ? 1 : this.period === 3 ? 2 : 3,
compare: this.than === '同比' ? 1 : 2
}).then(response => {
this.$download.excel(response, `${this.companyName}生产数据.xls`);
// this.exportLoading = false;
}).catch(() => { });
// } else {
// this.showPeriod = false
// }
},
toggleFullScreen() { toggleFullScreen() {
this.isFullscreen = !this.isFullscreen; this.isFullscreen = !this.isFullscreen;
@@ -84,20 +117,22 @@ export default {
} }
.factory-header > .menu1 { .factory-header > .menu1 {
width: 24vw; width: 20vw;
/* display: flex; display: flex;
align-items: center; align-items: center;
gap: 8px; */ gap: 8px;
} }
.factory-header > .menu2 { .factory-header > .menu2 {
width: 30vw; width: 20vw;
display: flex; display: flex;
justify-content: flex-end;
align-items: center; align-items: center;
gap: 8px; gap: 8px;
} }
.export-btn, .export-btn,
.fullscreen-btn { .fullscreen-btn {
/* float: right; */
width: 32px; width: 32px;
height: 32px; height: 32px;
margin-left: 24px; margin-left: 24px;
@@ -122,10 +157,12 @@ export default {
flex: 1; flex: 1;
font-size: 40px; font-size: 40px;
line-height: 70px; line-height: 70px;
justify-content: center;
letter-spacing: 5px; letter-spacing: 5px;
font-family: 优设标题黑; font-family: 优设标题黑;
color: #6db6ff; color: #6db6ff;
text-align: right; text-align: center;
user-select: none; user-select: none;
background: url(../../../assets/images/homeindex/page-title-two.png) center no-repeat;
} }
</style> </style>

View File

@@ -26,20 +26,20 @@ export default {
type: String, type: String,
}, },
companyId: { companyId: {
type: String, type: Number,
}, },
}, },
data() { data() {
return { return {
isOpen: false, isOpen: false,
company: [ company: [
{ id: "1", name: "瑞昌中建材光电材料有限公司" }, { id: 0, name: "瑞昌中建材光电材料有限公司" },
{ id: "2", name: "邯郸中建材光电材料有限公司" }, { id: 1, name: "邯郸中建材光电材料有限公司" },
{ id: "3", name: "株洲中建材光电材料有限公司" }, { id: 2, name: "株洲中建材光电材料有限公司" },
{ id: "4", name: "佳木斯中建材光电材料有限公司" }, { id: 3, name: "佳木斯中建材光电材料有限公司" },
{ id: "5", name: "成都中建材光电材料有限公司" }, { id: 4, name: "成都中建材光电材料有限公司" },
{ id: "6", name: "凯盛中建材光电材料有限公司" }, { id: 5, name: "凯盛中建材光电材料有限公司" },
{ id: "7", name: "蚌埠中建材光电材料有限公司" }, { id: 6, name: "蚌埠中建材光电材料有限公司" },
], ],
}; };
}, },

View File

@@ -367,7 +367,7 @@ export default {
this.canvasReset() this.canvasReset()
console.log(this.width) console.log(this.width)
} else { } else {
this.watch = 100 + '%' this.width = 100 + '%'
this.canvasReset() this.canvasReset()
} }
@@ -378,7 +378,7 @@ export default {
this.width = 97 + '%' this.width = 97 + '%'
this.canvasReset() this.canvasReset()
} else if (val === false && this.isOpen === false) { } else if (val === false && this.isOpen === false) {
this.watch = 100 + '%' this.width = 100 + '%'
this.canvasReset() this.canvasReset()
} }

View File

@@ -365,7 +365,7 @@ export default {
console.log(this.width) console.log(this.width)
} else { } else {
this.watch = 100 + '%' this.width = 100 + '%'
this.canvasReset() this.canvasReset()
} }
}, },
@@ -376,7 +376,7 @@ export default {
this.width = 97 + '%' this.width = 97 + '%'
this.canvasReset() this.canvasReset()
} else if(val === false && this.isOpen === false) { } else if(val === false && this.isOpen === false) {
this.watch = 100 + '%' this.width = 100 + '%'
this.canvasReset() this.canvasReset()
} }
// this.actualOptions.series.map((item) => { // this.actualOptions.series.map((item) => {

View File

@@ -0,0 +1,27 @@
<template>
<div class="notmsg">暂无数据</div>
</template>
<script>
export default {
name: 'NotMsg',
components: {},
data() {
return {
};
},
computed: {
},
methods: {
},
};
</script>
<style scoped lang="scss">
.notmsg {
padding-top: 72px;
color: rgba(255, 255, 255, 0.4);
text-align: center;
font-size: 24px;
}
</style>

View File

@@ -0,0 +1,227 @@
<!--
* @Author: zhp
* @Date: 2024-07-09 15:07:50
* @LastEditTime: 2024-07-22 13:41:40
* @LastEditors: zhp
* @Description:
-->
<!--
* @Author: zhp
* @Date: 2024-06-05 09:43:51
* @LastEditTime: 2024-07-09 15:06:52
* @LastEditors: zhp
* @Description:
-->
<template>
<div class="copilot-container">
<!-- refresh btn -->
<button v-if="false" style="
appearance: none;
outline: none;
border: none;
background: none;
color: #fff;
cursor: pointer;
position: absolute;
top: 8px;
right: 8px;
" @click="$emit('refresh')">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"
style="width: 24px; height: 24px">
<path stroke-linecap="round" stroke-linejoin="round"
d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99" />
</svg>
</button>
<!-- decoration -->
<div class="corner tl"></div>
<div class="corner tr"></div>
<div class="corner bl"></div>
<div class="corner br"></div>
<!-- content -->
<div class="container-head" :class="[side == 'left' ? 'gradient-to-right' : 'gradient-to-left']">
<Icon style="margin-left: 16px;" :icon="icon"></Icon>
<h2 class="container-title">{{ title }}</h2>
</div>
<div class="container-body" :class="[
side == 'left' ? 'body-gradient-to-right' : 'body-gradient-to-left',
]">
<slot />
</div>
</div>
</template>
<script>
import ContainerIconVue from "./ContainerIcon.vue";
export default {
name: "DashboardContainer",
components: {
Icon: ContainerIconVue,
},
props: {
side: {
type: String,
default: "left",
},
icon: {
type: String,
default: "cube",
},
title: {
type: String,
default: "Default Title",
},
},
data() {
return {};
},
computed: {},
methods: {},
};
</script>
<style scoped lang="scss">
.copilot-container {
height: 0;
flex: 1;
display: flex;
flex-direction: column;
position: relative;
box-shadow: inset 0 0 20px 1px #fff1;
border-right: .13vw solid;
// border-image: linear-gradient(to bottom,transparent 10%,
// #024798 20%,
// transparent 90%) 1;
border-image: linear-gradient(to bottom, transparent 10%, rgba(5, 138, 237, 1) 30%, rgba(2, 82, 215, 0.24) 90%)1;
box-sizing: border-box;
backdrop-filter: blur(4px);
&::before {
content: "";
position: absolute;
display: inline-block;
height: 92%;
width: 0.13vw;
border-radius: 2px;
top: 0%;
left: 0;
background: radial-gradient(circle at center,
#1481fd 2%,
#024798 90%,
transparent);
z-index: 1;
}
&::after {
content: "";
position: absolute;
display: inline-block;
width: 90%;
height: 0.31415vh;
border-radius: 2px;
left: 8%;
bottom: 0;
background: linear-gradient(to right, transparent 60%, #4197f9 98%, transparent 98%);
z-index: 0;
}
.container-head {
// height: 40px;
height: 3.8vh;
padding: 8px;
display: flex;
align-items: center;
gap: 8px;
.container-title {
font-size: 1vw;
line-height: 1.39vw;
font-weight: normal;
letter-spacing: 2px;
}
}
.container-body {
padding: 12px;
display: flex;
flex-direction: column;
flex: 1;
height: 0;
}
.corner {
z-index: 1;
position: absolute;
// width: 16px;
// height: 16px;
width: 0.95vw;
height: 0.95vw;
}
.corner.tl {
border-top: 2px solid #0175dc;
border-left: 2px solid #0175dc;
top: 0;
left: 0;
}
.corner.tr {
top: 0;
right: 0;
border-top: 2px solid #0175dc;
border-right: 2px solid #0175dc;
}
.corner.bl {
// width: 20px;
// height: 20px;
width: 1.064vw;
height: 1.064vw;
bottom: 0;
left: 0;
// border-left: 10px solid #0175dc;
// border-bottom: 10px solid #0175dc;
// border-top: 10px solid transparent;
// border-right: 10px solid transparent;
border-left: 0.532vw solid transparent;
border-bottom: .6vw solid #0175dc;
border-top: 0.532vw solid transparent;
border-right: 0.532vw solid transparent;
}
.corner.br {
bottom: 0;
right: 0;
// width: 20px;
// height: 20px;
width: 1.064vw;
height: 1.064vw;
border-left: 0.532vw solid transparent;
border-bottom: 0.532vw solid #0175dc;
border-top: 0.532vw solid transparent;
border-right: 0.532vw solid #0175dc;
// border-left: 10px solid transparent;
// border-bottom: 10px solid #0175dc;
// border-top: 10px solid transparent;
// border-right: 10px solid #0175dc;
// transform: rotate(-90deg);
}
.gradient-to-right {
background: linear-gradient(to right, #0c3f68cc, transparent);
}
.gradient-to-left {
background: linear-gradient(to left, #0c3f68cc, transparent);
}
.body-gradient-to-right {
background: linear-gradient(to right, #0003, transparent);
}
.body-gradient-to-left {
background: linear-gradient(to left, #0003, transparent);
}
}
</style>

View File

@@ -0,0 +1,220 @@
<!--
filename: Container.vue
author: liubin
date: 2024-04-09 10:44:09
description:
-->
<template>
<div class="copilot-container">
<!-- refresh btn -->
<button v-if="false" style="
appearance: none;
outline: none;
border: none;
background: none;
color: #fff;
cursor: pointer;
position: absolute;
top: 8px;
right: 8px;
" @click="$emit('refresh')">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"
style="width: 24px; height: 24px">
<path stroke-linecap="round" stroke-linejoin="round"
d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99" />
</svg>
</button>
<!-- decoration -->
<div class="corner tl"></div>
<div class="corner tr"></div>
<div class="corner bl"></div>
<div class="corner br"></div>
<!-- content -->
<div class="container-head" :class="[side == 'left' ? 'gradient-to-right' : 'gradient-to-left']">
<Icon style="margin-left: 16px;" :icon="icon"></Icon>
<h2 class="container-title">{{ title }}</h2>
</div>
<div class="container-body" :class="[
side == 'left' ? 'body-gradient-to-right' : 'body-gradient-to-left',
]">
<slot />
</div>
</div>
</template>
<script>
import ContainerIconVue from "./ContainerIcon.vue";
export default {
name: "DashboardContainer",
components: {
Icon: ContainerIconVue,
},
props: {
side: {
type: String,
default: "left",
},
icon: {
type: String,
default: "cube",
},
title: {
type: String,
default: "Default Title",
},
},
data() {
return {};
},
computed: {},
methods: {},
};
</script>
<style scoped lang="scss">
.copilot-container {
height: 0;
flex: 1;
display: flex;
flex-direction: column;
position: relative;
box-shadow: inset 0 0 20px 1px #fff1;
border-right: .13vw solid;
// border-image: linear-gradient(to bottom,transparent 10%,
// #024798 20%,
// transparent 90%) 1;
border-image: linear-gradient(to bottom, transparent 10%, rgba(5, 138, 237, 1) 30%, rgba(2, 82, 215, 0.24) 90%)1;
box-sizing: border-box;
backdrop-filter: blur(4px);
&::before {
content: "";
position: absolute;
display: inline-block;
height: 92%;
width: 0.13vw;
border-radius: 2px;
top: 0%;
left: 0;
background: radial-gradient(circle at center,
#1481fd 2%,
#024798 90%,
transparent);
z-index: 1;
}
&::after {
content: "";
position: absolute;
display: inline-block;
width: 95%;
height: 0.31415vh;
border-radius: 2px;
right: 3%;
bottom: 0;
background: linear-gradient(to left, transparent 60%, #4197f9 98%, transparent 98%);
z-index: 0;
}
.container-head {
// height: 40px;
height: 3.8vh;
padding: 8px;
display: flex;
align-items: center;
gap: 8px;
.container-title {
font-size: 1vw;
line-height: 1.39vw;
font-weight: normal;
letter-spacing: 2px;
}
}
.container-body {
padding: 12px;
display: flex;
flex-direction: column;
flex: 1;
height: 0;
}
.corner {
z-index: 1;
position: absolute;
// width: 16px;
// height: 16px;
width: 0.95vw;
height: 0.95vw;
}
.corner.tl {
border-top: 2px solid #0175dc;
border-left: 2px solid #0175dc;
top: 0;
left: 0;
}
.corner.tr {
top: 0;
right: 0;
border-top: 2px solid #0175dc;
border-right: 2px solid #0175dc;
}
.corner.bl {
// width: 20px;
// height: 20px;
width: 1.064vw;
height: 1.064vw;
bottom: 0;
left: 0;
// border-left: 10px solid #0175dc;
// border-bottom: 10px solid #0175dc;
// border-top: 10px solid transparent;
// border-right: 10px solid transparent;
border-left: 0.532vw solid #0175dc;
border-bottom: 0.532vw solid #0175dc;
border-top: 0.532vw solid transparent;
border-right: 0.532vw solid transparent;
}
.corner.br {
bottom: 0;
right: 0;
// width: 20px;
// height: 20px;
width: 1.064vw;
height: 1.064vw;
// border-left: 10px solid transparent;
// border-bottom: 10px solid #0175dc;
// border-top: 10px solid transparent;
// border-right: 10px solid #0175dc;
// transform: rotate(-90deg);
border-left: 0.532vw solid transparent;
border-bottom: .6vw solid #0175dc;
border-top: 0.532vw solid transparent;
border-right: 0.532vw solid transparent;
}
.gradient-to-right {
background: linear-gradient(to right, #0c3f68cc, transparent);
}
.gradient-to-left {
background: linear-gradient(to left, #0c3f68cc, transparent);
}
.body-gradient-to-right {
background: linear-gradient(to right, #0003, transparent);
}
.body-gradient-to-left {
background: linear-gradient(to left, #0003, transparent);
}
}
</style>

View File

@@ -1,8 +1,15 @@
<!-- <!--
* @Author: zhp
* @Date: 2024-04-28 13:42:51
* @LastEditTime: 2024-07-31 08:52:25
* @LastEditors: zhp
* @Description:
-->
<!--
filename: button.vue filename: button.vue
author: liubin author: liubin
date: 2024-04-16 15:02:34 date: 2024-04-16 15:02:34
description: description:
--> -->
<template> <template>
@@ -47,10 +54,10 @@ button {
background: #006acd40; background: #006acd40;
backdrop-filter: blur(3px); backdrop-filter: blur(3px);
text-align: center; text-align: center;
padding: 12px; padding: 16px 24px 16px 24px;
padding-left: 20px; padding-left: 32px;
color: #fff; color: #fff;
font-size: 22px; font-size: 18px;
letter-spacing: 10px; letter-spacing: 10px;
cursor: pointer; cursor: pointer;
} }
@@ -68,8 +75,8 @@ button {
.copilot-btn::after { .copilot-btn::after {
content: ""; content: "";
position: absolute; position: absolute;
width: 16px; width: 0.7vw;
height: 16px; height: 0.7vw;
top: 0; top: 0;
background: transparent; background: transparent;
border-style: solid; border-style: solid;

View File

@@ -0,0 +1,220 @@
<!--
* @Author: zhp
* @Date: 2024-07-09 15:15:00
* @LastEditTime: 2024-07-22 13:42:08
* @LastEditors: zhp
* @Description:
-->
<template>
<div class="copilot-container">
<!-- refresh btn -->
<button v-if="false" style="
appearance: none;
outline: none;
border: none;
background: none;
color: #fff;
cursor: pointer;
position: absolute;
top: 8px;
right: 8px;
" @click="$emit('refresh')">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"
style="width: 24px; height: 24px">
<path stroke-linecap="round" stroke-linejoin="round"
d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99" />
</svg>
</button>
<!-- decoration -->
<div class="corner tl"></div>
<div class="corner tr"></div>
<div class="corner bl"></div>
<div class="corner br"></div>
<!-- content -->
<div class="container-head" :class="[side == 'left' ? 'gradient-to-right' : 'gradient-to-left']">
<Icon style="margin-left: 16px;" :icon="icon"></Icon>
<h2 class="container-title">{{ title }}</h2>
</div>
<div class="container-body" :class="[
side == 'left' ? 'body-gradient-to-right' : 'body-gradient-to-left',
]">
<slot />
</div>
</div>
</template>
<script>
import ContainerIconVue from "./ContainerIcon.vue";
export default {
name: "DashboardContainer",
components: {
Icon: ContainerIconVue,
},
props: {
side: {
type: String,
default: "left",
},
icon: {
type: String,
default: "cube",
},
title: {
type: String,
default: "Default Title",
},
},
data() {
return {};
},
computed: {},
methods: {},
};
</script>
<style scoped lang="scss">
.copilot-container {
height: 0;
flex: 1;
display: flex;
flex-direction: column;
position: relative;
box-shadow: inset 0 0 20px 1px #fff1;
border-right: .13vw solid;
// border-image: linear-gradient(to bottom,transparent 10%,
// #024798 20%,
// transparent 90%) 1;
border-image: linear-gradient(to bottom, transparent 10%, rgba(5, 138, 237, 1) 30%, rgba(2, 82, 215, 0.24) 90%)1;
box-sizing: border-box;
backdrop-filter: blur(4px);
&::before {
content: "";
position: absolute;
display: inline-block;
height: 92%;
width: 0.13vw;
border-radius: 2px;
top: 0%;
left: 0;
background: radial-gradient(circle at center,
#1481fd 2%,
#024798 90%,
transparent);
z-index: 1;
}
&::after {
content: "";
position: absolute;
display: inline-block;
width: 90%;
height: 0.31415vh;
border-radius: 2px;
left: 10%;
bottom: 0;
background: linear-gradient(to right, transparent 60%, #4197f9 98%, transparent 98%);
z-index: 0;
}
.container-head {
// height: 40px;
height: 3.8vh;
padding: 8px;
display: flex;
align-items: center;
gap: 8px;
.container-title {
font-size: 1vw;
line-height: 1.39vw;
font-weight: normal;
letter-spacing: 2px;
}
}
.container-body {
padding: 12px;
display: flex;
flex-direction: column;
flex: 1;
height: 0;
}
.corner {
z-index: 1;
position: absolute;
// width: 16px;
// height: 16px;
width: 0.7vw;
height: 0.7vw;
}
.corner.tl {
border-top: 2px solid #0175dc;
border-left: 2px solid #0175dc;
top: 0;
left: 0;
}
.corner.tr {
top: 0;
right: 0;
border-top: 2px solid #0175dc;
border-right: 2px solid #0175dc;
}
.corner.bl {
// width: 20px;
// height: 20px;
width: 1.064vw;
height: 1.064vw;
bottom: 0;
left: 0;
// border-left: 10px solid #0175dc;
// border-bottom: 10px solid #0175dc;
// border-top: 10px solid transparent;
// border-right: 10px solid transparent;
border-left: 0.532vw solid transparent;
border-bottom: .6vw solid #0175dc;
border-top: 0.532vw solid transparent;
border-right: 0.532vw solid transparent;
}
.corner.br {
bottom: 0;
right: 0;
// width: 20px;
// height: 20px;
width: 1.064vw;
height: 1.064vw;
border-left: 0.532vw solid transparent;
border-bottom: 0.532vw solid #0175dc;
border-top: 0.532vw solid transparent;
border-right: 0.532vw solid #0175dc;
// border-left: 10px solid transparent;
// border-bottom: 10px solid #0175dc;
// border-top: 10px solid transparent;
// border-right: 10px solid #0175dc;
// transform: rotate(-90deg);
}
.gradient-to-right {
background: linear-gradient(to right, #0c3f68cc, transparent);
}
.gradient-to-left {
background: linear-gradient(to left, #0c3f68cc, transparent);
}
.body-gradient-to-right {
background: linear-gradient(to right, #0003, transparent);
}
.body-gradient-to-left {
background: linear-gradient(to left, #0003, transparent);
}
}
</style>

View File

@@ -0,0 +1,220 @@
<!--
filename: Container.vue
author: liubin
date: 2024-04-09 10:44:09
description:
-->
<template>
<div class="copilot-container">
<!-- refresh btn -->
<button v-if="false" style="
appearance: none;
outline: none;
border: none;
background: none;
color: #fff;
cursor: pointer;
position: absolute;
top: 8px;
right: 8px;
" @click="$emit('refresh')">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"
style="width: 24px; height: 24px">
<path stroke-linecap="round" stroke-linejoin="round"
d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99" />
</svg>
</button>
<!-- decoration -->
<div class="corner tl"></div>
<div class="corner tr"></div>
<div class="corner bl"></div>
<div class="corner br"></div>
<!-- content -->
<div class="container-head" :class="[side == 'left' ? 'gradient-to-right' : 'gradient-to-left']">
<Icon style="margin-left: 16px;" :icon="icon"></Icon>
<h2 class="container-title">{{ title }}</h2>
</div>
<div class="container-body" :class="[
side == 'left' ? 'body-gradient-to-right' : 'body-gradient-to-left',
]">
<slot />
</div>
</div>
</template>
<script>
import ContainerIconVue from "./ContainerIcon.vue";
export default {
name: "DashboardContainer",
components: {
Icon: ContainerIconVue,
},
props: {
side: {
type: String,
default: "left",
},
icon: {
type: String,
default: "cube",
},
title: {
type: String,
default: "Default Title",
},
},
data() {
return {};
},
computed: {},
methods: {},
};
</script>
<style scoped lang="scss">
.copilot-container {
height: 0;
flex: 1;
display: flex;
flex-direction: column;
position: relative;
box-shadow: inset 0 0 20px 1px #fff1;
border-right: .13vw solid;
// border-image: linear-gradient(to bottom,transparent 10%,
// #024798 20%,
// transparent 90%) 1;
border-image: linear-gradient(to bottom, transparent 10%, rgba(5, 138, 237, 1) 30%, rgba(2, 82, 215, 0.24) 90%)1;
box-sizing: border-box;
backdrop-filter: blur(4px);
&::before {
content: "";
position: absolute;
display: inline-block;
height: 92%;
width: 0.13vw;
border-radius: 2px;
top: 0%;
left: 0;
background: radial-gradient(circle at center,
#1481fd 2%,
#024798 90%,
transparent);
z-index: 1;
}
&::after {
content: "";
position: absolute;
display: inline-block;
width: 95%;
height: 0.31415vh;
border-radius: 2px;
right: 3%;
bottom: 0;
background: linear-gradient(to left, transparent 60%, #4197f9 98%, transparent 98%);
z-index: 0;
}
.container-head {
// height: 40px;
height: 3.8vh;
padding: 8px;
display: flex;
align-items: center;
gap: 8px;
.container-title {
font-size: 1vw;
line-height: 1.39vw;
font-weight: normal;
letter-spacing: 2px;
}
}
.container-body {
padding: 12px;
display: flex;
flex-direction: column;
flex: 1;
height: 0;
}
.corner {
z-index: 1;
position: absolute;
// width: 16px;
// height: 16px;
width: 0.7vw;
height: 0.7vw;
}
.corner.tl {
border-top: 2px solid #0175dc;
border-left: 2px solid #0175dc;
top: 0;
left: 0;
}
.corner.tr {
top: 0;
right: 0;
border-top: 2px solid #0175dc;
border-right: 2px solid #0175dc;
}
.corner.bl {
// width: 20px;
// height: 20px;
width: 1.064vw;
height: 1.064vw;
bottom: 0;
left: 0;
// border-left: 10px solid #0175dc;
// border-bottom: 10px solid #0175dc;
// border-top: 10px solid transparent;
// border-right: 10px solid transparent;
border-left: 0.532vw solid #0175dc;
border-bottom: 0.532vw solid #0175dc;
border-top: 0.532vw solid transparent;
border-right: 0.532vw solid transparent;
}
.corner.br {
bottom: 0;
right: 0;
// width: 20px;
// height: 20px;
width: 1.064vw;
height: 1.064vw;
// border-left: 10px solid transparent;
// border-bottom: 10px solid #0175dc;
// border-top: 10px solid transparent;
// border-right: 10px solid #0175dc;
// transform: rotate(-90deg);
border-left: 0.532vw solid transparent;
border-bottom: .6vw solid #0175dc;
border-top: 0.532vw solid transparent;
border-right: 0.532vw solid transparent;
}
.gradient-to-right {
background: linear-gradient(to right, #0c3f68cc, transparent);
}
.gradient-to-left {
background: linear-gradient(to left, #0c3f68cc, transparent);
}
.body-gradient-to-right {
background: linear-gradient(to right, #0003, transparent);
}
.body-gradient-to-left {
background: linear-gradient(to left, #0003, transparent);
}
}
</style>

View File

@@ -0,0 +1,322 @@
<!--
* @Author: zhp
* @Date: 2024-05-23 15:49:14
* @LastEditTime: 2024-07-25 14:29:40
* @LastEditors: zhp
* @Description:
-->
<template>
<chart-container class="bar-chart-base">
<div class="legend">
<span v-for="item in legend" :key="item.label" class="legend-item"
:style="{ fontSize: isFullscreen ? '0.72vw' : '0.7vw' }">{{ item.label }}</span>
</div>
<div ref="ftoChart" style="height:94%;width:100%"></div>
</chart-container>
</template>
<script>
import screenfull from "screenfull";
import ChartContainer from "./ChartContainer.vue";
import { debounce } from "@/utils/debounce";
// import chartMixin from "@/mixins/chart.js";
import * as echarts from "echarts";
export default {
name: "BarChartBase",
components: {
ChartContainer,
},
// mixins: [chartMixin],
props: {
vHeight: {
type: Number,
default: 34,
},
legend: {
type: Array,
required: true,
},
xAxis: {
type: Array,
required: true,
},
series: {
type: Array,
required: true,
},
in: {
type: String,
default: "",
},
},
data() {
return {
width: '100%',
isFullscreen: false,
actualOptions: null,
options: {
grid: {
left: "5%",
right: "4%",
bottom: "3%",
top: "15%",
containLabel: true,
},
tooltip: {
trigger: "axis",
axisPointer: {
// type: "cross",
crossStyle: {
color: "rgba(237,237,237,0.5)",
},
},
backgroundColor: 'rgba(0,0,0,0)', // tooltip默认背景为白色手动置为透明
extraCssText: 'padding:0;border-width:0',
formatter: params => {
var res = `<span style='color:rgba(255,255,255,0.85);display:inline-block;margin-bottom:8px;'>${params[0].axisValueLabel}</span>`;
for (var i = 0, l = params.length; i < l; i++) {
let color = Object.prototype.toString.call(params[i].color) == "[object String]" ? params[i].color : params[i].color.colorStops ? params[i].color.colorStops[0].color : ''
// console.log(item.color, color);
res +=
"<br/>" +
`<span style='border-radius:2px;display:inline-block;margin-right:4px;width:12px;height:12px;background-color:${color}'></span>` +
`<span style='display:inline-block;width:150px;color:rgba(255,255,255,.85);font-size:16px;letter-spacing: 2px;'>${params[i].seriesName}</span>` +
`<span style='display:inline-block;width:60px;color:rgba(255,255,255,0.65);font-size:16px;letter-spacing: 2px;text-align: right;'>${params[i].value ? params[i].value : 0 }</span>`;
}
const htmlContent = `
<div style="padding: 12px 16px;background:rgba(0,24,41,.5);box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.38);backdrop-filter: blur(10px);">
${res}
</div>
`;
return htmlContent;
},
},
xAxis: {
axisTick: {
show: false,
},
axisLine: {
lineStyle: {
color: "#4561AE",
},
},
axisLabel: {
color: "rgba(223,241,254,.8)",
fontSize: 16,
},
data: this.xAxis,
},
yAxis: {
name: "单位/片",
nameTextStyle: {
color: "rgba(223,241,254,.8)",
fontSize: 16,
align: "right",
},
axisTick: {
show: false,
},
axisLabel: {
color: "rgba(223,241,254,.8)",
fontSize: 16,
},
axisLine: {
show: true,
lineStyle: {
color: "#4561AE",
},
},
splitLine: {
lineStyle: {
color: "rgba(69,97,174,.4)",
},
},
},
series: [
{
name: "", // this.series[0].name,
type: "bar",
barWidth: 16,
itemStyle: {
borderRadius: [10, 10, 0, 0],
color: {
type: "linear",
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: "#12f7f1", // 0% 处的颜色
},
{
offset: 0.35,
color: "#12f7f177", // 100% 处的颜色
},
{
offset: 0.75,
color: "#12f7f133", // 100% 处的颜色
},
{
offset: 1,
color: "transparent", // 100% 处的颜色
},
],
global: false, // 缺省为 false
},
},
data: [], // this.series[0].data,
},
{
name: "", // this.series[1].name,
type: "bar",
barWidth: 16,
// tooltip: {
// valueFormatter: function (value) {
// return value + " ml";
// },
// },
itemStyle: {
borderRadius: [10, 10, 0, 0],
color: {
type: "linear",
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: "#57abf8", // 0% 处的颜色
},
{
offset: 1,
color: "#364BFE66", // 100% 处的颜色
},
],
global: false, // 缺省为 false
},
},
data: [], // this.series[1].data,
},
],
},
};
},
computed: {
isOpen() {
return this.$store.getters.sidebar.opened
},
},
watch: {
/** 全屏状态切换时,对柱子粗细和字体大小进行相应调整 */
isOpen(val) {
// console.log(val)
this.canvasReset()
},
isFullscreen(val) {
this.options.series.map((item) => {
item.barWidth = val ? 18 : 16;
});
this.options.xAxis.axisLabel.fontSize = val ? 18 : 16;
this.options.yAxis.axisLabel.fontSize = val ? 18 : 16;
this.options.yAxis.nameTextStyle.fontSize = val ? 18 : 16;
this.initChart(this.options);
// this.actualOptions.series.map((item) => {
// item.barWidth = val ? 18 : 16;
// });
// this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 16;
// this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 16;
// this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 16;
// this.initChart(this.actualOptions);
this.canvasReset()
},
series(val) {
if (!val) {
this.initChart(this.options);
return;
}
// const actualOptions = JSON.parse(JSON.stringify(this.options));
// console.log('actualOptions', this.options)
this.options.series[0].data = val[0].data;
this.options.series[0].name = val[0].name;
this.options.series[1].data = val[1].data;
this.options.series[1].name = val[1].name;
// this.actualOptions = actualOptions;
this.initChart(this.options);
},
},
mounted() {
if (screenfull.isEnabled) {
screenfull.on("change", () => {
this.isFullscreen = screenfull.isFullscreen;
});
}
// this.actualOptions = this.options
this.canvasReset();
window.addEventListener("resize", this.canvasReset);
},
beforeDestroy() {
if (this.chart) {
this.chart.dispose();
}
},
destroyed() {
window.removeEventListener("resize", this.canvasReset);
},
methods: {
canvasReset() {
debounce(() => {
this.initChart();
}, 500)();
},
initChart() {
if (this.chart) {
this.chart.dispose();
}
this.chart = echarts.init(this.$refs.ftoChart);
this.chart.setOption(this.options);
},
},
};
</script>
<style scoped lang="scss">
.bar-chart-base {
// position: relative;
.legend {
position: absolute;
top: 5.2vh;
right: 1vw;
}
.legend-item {
position: relative;
// font-size: 12px;
margin-right: 0.67vw;
&::before {
content: "";
display: inline-block;
width: 0.531vw;
height: 0.531vw;
background-color: #ccc;
border-radius: 2px;
margin-right: 0.22vw;
}
}
.legend-item:nth-child(1):before {
background-color: #12f7f1;
}
.legend-item:nth-child(2):before {
background-color: #58adfa;
}
}
</style>

View File

@@ -1,7 +1,7 @@
<!-- <!--
* @Author: zhp * @Author: zhp
* @Date: 2024-05-13 14:08:51 * @Date: 2024-05-13 14:08:51
* @LastEditTime: 2024-05-17 09:37:01 * @LastEditTime: 2024-05-23 15:18:53
* @LastEditors: zhp * @LastEditors: zhp
* @Description: * @Description:
--> -->
@@ -191,7 +191,7 @@ export default {
console.log(this.width) console.log(this.width)
} else { } else {
console.log('ryf') console.log('ryf')
this.watch = 100 + '%' this.width = 100 + '%'
this.canvasReset() this.canvasReset()
} }
}, },
@@ -201,7 +201,7 @@ export default {
this.width = 97 + '%' this.width = 97 + '%'
this.canvasReset() this.canvasReset()
} else if (val === false && this.isOpen === false) { } else if (val === false && this.isOpen === false) {
this.watch = 100 + '%' this.width = 100 + '%'
this.canvasReset() this.canvasReset()
} }
// this.actualOptions.series.map((item) => { // this.actualOptions.series.map((item) => {

View File

@@ -0,0 +1,218 @@
<!--
* @Author: zhp
* @Date: 2024-06-05 09:43:51
* @LastEditTime: 2024-07-22 13:36:30
* @LastEditors: zhp
* @Description:
-->
<template>
<div class="copilot-container">
<!-- refresh btn -->
<button v-if="false" style="
appearance: none;
outline: none;
border: none;
background: none;
color: #fff;
cursor: pointer;
position: absolute;
top: 8px;
right: 8px;
" @click="$emit('refresh')">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"
style="width: 24px; height: 24px">
<path stroke-linecap="round" stroke-linejoin="round"
d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99" />
</svg>
</button>
<!-- decoration -->
<div class="corner tl"></div>
<div class="corner tr"></div>
<div class="corner bl"></div>
<div class="corner br"></div>
<!-- content -->
<div class="container-head" :class="[side == 'left' ? 'gradient-to-right' : 'gradient-to-left']">
<Icon style="margin-left: 16px;" :icon="icon"></Icon>
<h2 class="container-title">{{ title }}</h2>
</div>
<div class="container-body" :class="[
side == 'left' ? 'body-gradient-to-right' : 'body-gradient-to-left',
]">
<slot />
</div>
</div>
</template>
<script>
import ContainerIconVue from "./ContainerIcon.vue";
export default {
name: "DashboardContainer",
components: {
Icon: ContainerIconVue,
},
props: {
side: {
type: String,
default: "left",
},
icon: {
type: String,
default: "cube",
},
title: {
type: String,
default: "Default Title",
},
},
data() {
return {};
},
computed: {},
methods: {},
};
</script>
<style scoped lang="scss">
.copilot-container {
height: 0;
flex: 1;
display: flex;
flex-direction: column;
position: relative;
box-shadow: inset 0 0 20px 1px #fff1;
border-right: .13vw solid;
// border-image: linear-gradient(to bottom,transparent 10%,
// #024798 20%,
// transparent 90%) 1;
border-image: linear-gradient(to bottom, transparent 10%, rgba(5, 138, 237, 1) 30%, rgba(2, 82, 215, 0.24) 90%)1;
box-sizing: border-box;
backdrop-filter: blur(4px);
&::before {
content: "";
position: absolute;
display: inline-block;
height: 92%;
width: 0.13vw;
border-radius: 2px;
top: 0%;
left: 0;
background: radial-gradient(circle at center,
#1481fd 2%,
#024798 90%,
transparent);
z-index: 1;
}
&::after {
content: "";
position: absolute;
display: inline-block;
width: 90%;
height: 0.31415vh;
border-radius: 2px;
left: 7%;
bottom: 0;
background: linear-gradient(to right, transparent 60%, #4197f9 98%, transparent 98%);
z-index: 0;
}
.container-head {
// height: 40px;
height: 3.8vh;
padding: 8px;
display: flex;
align-items: center;
gap: 8px;
.container-title {
font-size: 1vw;
line-height: 1.39vw;
font-weight: normal;
letter-spacing: 2px;
}
}
.container-body {
padding: 12px;
display: flex;
flex-direction: column;
flex: 1;
height: 0;
}
.corner {
z-index: 1;
position: absolute;
// width: 16px;
// height: 16px;
width: 0.7vw;
height: 0.7vw;
}
.corner.tl {
border-top: 2px solid #0175dc;
border-left: 2px solid #0175dc;
top: 0;
left: 0;
}
.corner.tr {
top: 0;
right: 0;
border-top: 2px solid #0175dc;
border-right: 2px solid #0175dc;
}
.corner.bl {
// width: 20px;
// height: 20px;
width: 1.064vw;
height: 1.064vw;
bottom: 0;
left: 0;
// border-left: 10px solid #0175dc;
// border-bottom: 10px solid #0175dc;
// border-top: 10px solid transparent;
// border-right: 10px solid transparent;
border-left: 0.532vw solid transparent;
border-bottom: .6vw solid #0175dc;
border-top: 0.532vw solid transparent;
border-right: 0.532vw solid transparent;
}
.corner.br {
bottom: 0;
right: 0;
// width: 20px;
// height: 20px;
width: 1.064vw;
height: 1.064vw;
border-left: 0.532vw solid transparent;
border-bottom: 0.532vw solid #0175dc;
border-top: 0.532vw solid transparent;
border-right: 0.532vw solid #0175dc;
// border-left: 10px solid transparent;
// border-bottom: 10px solid #0175dc;
// border-top: 10px solid transparent;
// border-right: 10px solid #0175dc;
// transform: rotate(-90deg);
}
.gradient-to-right {
background: linear-gradient(to right, #0c3f68cc, transparent);
}
.gradient-to-left {
background: linear-gradient(to left, #0c3f68cc, transparent);
}
.body-gradient-to-right {
background: linear-gradient(to right, #0003, transparent);
}
.body-gradient-to-left {
background: linear-gradient(to left, #0003, transparent);
}
}
</style>

View File

@@ -0,0 +1,222 @@
<!--
filename: Container.vue
author: liubin
date: 2024-04-09 10:44:09
description:
-->
<template>
<div class="copilot-container">
<!-- refresh btn -->
<button v-if="false" style="
appearance: none;
outline: none;
border: none;
background: none;
color: #fff;
cursor: pointer;
position: absolute;
top: 8px;
right: 8px;
" @click="$emit('refresh')">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"
style="width: 24px; height: 24px">
<path stroke-linecap="round" stroke-linejoin="round"
d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99" />
</svg>
</button>
<!-- decoration -->
<div class="corner tl"></div>
<div class="corner tr"></div>
<div class="corner bl"></div>
<div class="corner br"></div>
<!-- content -->
<div class="container-head" :class="[side == 'left' ? 'gradient-to-right' : 'gradient-to-left']">
<Icon style="margin-left: 16px;" :icon="icon"></Icon>
<h2 class="container-title">{{ title }}</h2>
</div>
<div class="container-body" :class="[
side == 'left' ? 'body-gradient-to-right' : 'body-gradient-to-left',
]">
<slot />
</div>
</div>
</template>
<script>
import ContainerIconVue from "./ContainerIcon.vue";
export default {
name: "DashboardContainer",
components: {
Icon: ContainerIconVue,
},
props: {
side: {
type: String,
default: "left",
},
icon: {
type: String,
default: "cube",
},
title: {
type: String,
default: "Default Title",
},
},
data() {
return {};
},
computed: {},
methods: {},
};
</script>
<style scoped lang="scss">
.copilot-container {
height: 0;
flex: 1;
display: flex;
flex-direction: column;
position: relative;
box-shadow: inset 0 0 20px 1px #fff1;
border-right: .13vw solid;
// padding-right: .2vw;
box-sizing: border-box; // border-image: linear-gradient(to bottom,transparent 10%,
// #024798 20%,
// transparent 90%) 1;
border-image: linear-gradient(to bottom,transparent 10%, rgba(5, 138, 237, 1) 30%, rgba(2, 82, 215, 0.24) 90%)1;
backdrop-filter: blur(4px);
&::before {
content: "";
position: absolute;
display: inline-block;
height: 92%;
width: 0.13vw;
border-radius: 2px;
top: 0%;
left: 0;
background: radial-gradient(
circle at center,
#1481fd 2%,
#024798 90%,
transparent
);
z-index: 1;
}
&::after {
content: "";
position: absolute;
display: inline-block;
width: 95%;
height: 0.31415vh;
border-radius: 2px;
right: 1%;
bottom: 0;
background: linear-gradient(to left, transparent 60%, #4197f9 98%, transparent 98%);
z-index: 0;
}
.container-head {
// height: 40px;
height: 3.8vh;
padding: 8px;
display: flex;
align-items: center;
gap: 8px;
.container-title {
font-size: 1vw;
line-height: 1.39vw;
font-weight: normal;
letter-spacing: 2px;
}
}
.container-body {
padding: 12px;
display: flex;
flex-direction: column;
flex: 1;
height: 0;
}
.corner {
z-index: 1;
position: absolute;
// width: 16px;
// height: 16px;
width: 0.7vw;
height: 0.7vw;
}
.corner.tl {
border-top: 2px solid #0175dc;
border-left: 2px solid #0175dc;
top: 0;
left: 0;
}
.corner.tr {
top: 0;
right: 0;
border-top: 2px solid #0175dc;
border-right: 2px solid #0175dc;
}
.corner.bl {
// width: 20px;
// height: 20px;
width: 1.064vw;
height: 1.064vw;
bottom: 0;
left: 0;
// border-left: 10px solid #0175dc;
// border-bottom: 10px solid #0175dc;
// border-top: 10px solid transparent;
// border-right: 10px solid transparent;
border-left: 0.532vw solid #0175dc;
border-bottom: 0.532vw solid #0175dc;
border-top: 0.532vw solid transparent;
border-right: 0.532vw solid transparent;
}
.corner.br {
bottom: 0;
right: 0;
// width: 20px;
// height: 20px;
width: 1.064vw;
height: 1.064vw;
// border-left: 10px solid transparent;
// border-bottom: 10px solid #0175dc;
// border-top: 10px solid transparent;
// border-right: 10px solid #0175dc;
// transform: rotate(-90deg);
border-left: 0.532vw solid transparent;
border-bottom: .6vw solid #0175dc;
border-top: 0.532vw solid transparent;
border-right: 0.532vw solid transparent;
}
.gradient-to-right {
background: linear-gradient(to right, #0c3f68cc, transparent);
}
.gradient-to-left {
background: linear-gradient(to left, #0c3f68cc, transparent);
}
.body-gradient-to-right {
background: linear-gradient(to right, #0003, transparent);
}
.body-gradient-to-left {
background: linear-gradient(to left, #0003, transparent);
}
}
</style>

View File

@@ -0,0 +1,245 @@
<!--
* @Author: zhp
* @Date: 2024-06-05 09:48:37
* @LastEditTime: 2024-07-22 13:37:48
* @LastEditors: zhp
* @Description:
-->
<!--
filename: Container.vue
author: liubin
date: 2024-04-09 10:44:09
description:
-->
<template>
<div class="copilot-container">
<!-- refresh btn -->
<button
v-if="0"
style="
appearance: none;
outline: none;
border: none;
background: none;
color: #fff;
cursor: pointer;
position: absolute;
top: 8px;
right: 8px;
"
@click="$emit('refresh')"
>rotate
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
style="width: 24px; height: 24px"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99"
/>
</svg>
</button>
<!-- decoration -->
<div class="corner tl"></div>
<div class="corner tr"></div>
<div class="corner bl"></div>
<div class="corner br"></div>
<!-- content -->
<div
class="container-head"
:class="[side == 'left' ? 'gradient-to-right' : 'gradient-to-left']"
>
<Icon :icon="icon"></Icon>
<h2 class="container-title">{{ title }}</h2>
</div>
<div
class="container-body"
:class="[
side == 'left' ? 'body-gradient-to-right' : 'body-gradient-to-left',
]"
>
<slot />
</div>
</div>
</template>
<script>
import ContainerIconVue from "./ContainerIcon.vue";
export default {
name: "DashboardContainer",
components: {
Icon: ContainerIconVue,
},
props: {
side: {
type: String,
default: "left",
},
icon: {
type: String,
default: "cube",
},
title: {
type: String,
default: "Default Title",
},
},
data() {
return {};
},
computed: {},
methods: {},
};
</script>
<style scoped lang="scss">
.copilot-container {
height: 0;
flex: 1;
display: flex;
flex-direction: column;
position: relative;
box-shadow: inset 0 0 20px 1px #fff1;
border-right: .13vw solid;
// border-image: linear-gradient(to bottom,transparent 10%,
// #024798 20%,
// transparent 90%) 1;
border-image: linear-gradient(to bottom, transparent 10%, rgba(5, 138, 237, 1) 30%, rgba(2, 82, 215, 0.24) 90%)1;
box-sizing: border-box;
backdrop-filter: blur(4px);
&::before {
content: "";
position: absolute;
display: inline-block;
height: 92%;
width: 0.13vw;
border-radius: 2px;
top: 0%;
left: 0;
background: radial-gradient(circle at center,
#1481fd 2%,
#024798 90%,
transparent);
z-index: 1;
}
&::after {
content: "";
position: absolute;
display: inline-block;
width: 95%;
height: 0.31415vh;
border-radius: 2px;
left: 6%;
bottom: 0;
background: linear-gradient(to left, transparent 60%, #4197f9 98%, transparent 98%);
z-index: 0;
}
.container-head {
// height: 40px;
height: 3.8vh;
padding: 8px;
display: flex;
align-items: center;
gap: 8px;
.container-title {
font-size: 1vw;
line-height: 1.39vw;
font-weight: normal;
letter-spacing: 2px;
}
}
.container-body {
padding: 12px;
display: flex;
flex-direction: column;
flex: 1;
height: 0;
}
.corner {
z-index: 1;
position: absolute;
// width: 16px;
// height: 16px;
width: 0.7vw;
height: 0.7vw;
}
.corner.tl {
border-top: 2px solid #0175dc;
border-left: 2px solid #0175dc;
top: 0;
left: 0;
}
.corner.tr {
top: 0;
right: 0;
border-top: 2px solid #0175dc;
border-right: 2px solid #0175dc;
}
.corner.bl {
// width: 20px;
// height: 20px;
width: 1.064vw;
height: 1.064vw;
bottom: 0;
left: 0;
// border-left: 10px solid #0175dc;
// border-bottom: 10px solid #0175dc;
// border-top: 10px solid transparent;
// border-right: 10px solid transparent;
border-left: 0.532vw solid #0175dc;
border-bottom: 0.532vw solid #0175dc;
border-top: 0.532vw solid transparent;
border-right: 0.532vw solid transparent;
}
.corner.br {
bottom: 0;
right: 0;
// width: 20px;
// height: 20px;
width: 1.064vw;
height: 1.064vw;
// border-left: 10px solid transparent;
// border-bottom: 10px solid #0175dc;
// border-top: 10px solid transparent;
// border-right: 10px solid #0175dc;
border-left: 0.532vw solid transparent;
border-bottom: 0.532vw solid #0175dc;
border-top: 0.532vw solid transparent;
border-right: 0.532vw solid #0175dc;
}
.gradient-to-right {
background: linear-gradient(to right, #0c3f68cc, transparent);
}
.gradient-to-left {
background: linear-gradient(to left, #0c3f68cc, transparent);
}
.body-gradient-to-right {
background: linear-gradient(to right, #0003, transparent);
}
.body-gradient-to-left {
background: linear-gradient(to left, #0003, transparent);
}
}
</style>

View File

@@ -1,4 +1,3 @@
<!-- <!--
filename: container.vue filename: container.vue
author: liubin author: liubin
@@ -8,12 +7,13 @@
<template> <template>
<!-- <div class="copilot-layout" ref="copilot-layout"> --> <!-- <div class="copilot-layout" ref="copilot-layout"> -->
<div class="copilot-layout" ref="copilot-layout" :class="[page == '效率' ? 'other' : 'produce' ]"> <div class="copilot-layout produce" ref="copilot-layout">
<CopilotHeaderVue :active="page" :period="period" @update:active="page = $event" @update:period="period = $event" /> <CopilotHeaderVue :than="than" :active="page" :period="period" @update:active="updateActive" @update:period="period = $event"
@update:than="updateThan" />
<YieldCopilot v-if="page == '产量'" :period="period" /> <YieldCopilot :period="period" :than="than" />
<EnergyCopilot v-if="page == '综合'" :period="period" /> <!-- <EnergyCopilot v-if="page == '综合'" :period="period" /> -->
<EfficiencyCopilot v-if="page == '效率'" :period="period" /> <!-- <EfficiencyCopilot v-if="page == '效率'" :period="period" /> -->
<div class="copilot-footer">© 中建材智能自动化研究院有限公司</div> <div class="copilot-footer">© 中建材智能自动化研究院有限公司</div>
</div> </div>
</template> </template>
@@ -21,24 +21,55 @@
<script> <script>
import CopilotHeaderVue from "./components/CopilotHeader.vue"; import CopilotHeaderVue from "./components/CopilotHeader.vue";
import YieldCopilot from "./yield/index.vue"; import YieldCopilot from "./yield/index.vue";
import EnergyCopilot from "./energy/index.vue"; // import EnergyCopilot from "./energy/index.vue";
import EfficiencyCopilot from "./efficiency/index.vue"; // import EfficiencyCopilot from "./efficiency/index.vue";
export default { export default {
name: "CopilotContainer", name: "copilotContainer",
components: { components: {
CopilotHeaderVue, CopilotHeaderVue,
YieldCopilot, YieldCopilot,
EnergyCopilot, // EnergyCopilot,
EfficiencyCopilot, // EfficiencyCopilot,
}, },
data() { data() {
return { return {
page: "产量", page: "产量",
period: "", period: "",
than:'同比',
currentsStyles: '', currentsStyles: '',
}; };
}, },
methods: {
updateThan(val) {
console.log(val);
this.than = val;
// this.getMes();
},
updateActive(val, oldVal) {
console.log(val)
if (val === '效率') {
this.$router.push({
path: 'efficiency-container',
query: {
name: '效率'
}
})
// this.page = oldVal
} else if (val === '产量') {
this.$router.push({
path: 'main',
query: {
name: '产量'
}
})
// this.page = oldVal
}
}
},
// mounted() {
// this.page = this.$route.query.name
// },
// watch: { // watch: {
// page(val) { // page(val) {
// if (val === '产量') { // if (val === '产量') {
@@ -65,7 +96,6 @@ export default {
}; };
</script> </script>
<style> <style>
.copilot-layout { .copilot-layout {
padding: 16px; padding: 16px;
background: url(../../assets/images/copilot-bg.png) 0 0 / 100% 100% no-repeat; background: url(../../assets/images/copilot-bg.png) 0 0 / 100% 100% no-repeat;
@@ -81,12 +111,14 @@ export default {
gap: 8px; gap: 8px;
} }
.produce{ .produce {
height: calc(100% + 38px); height: calc(100% + 38px);
} }
.other { .other {
height: calc(100% + 240px); height: calc(100% + 240px);
} }
.copilot-footer { .copilot-footer {
/** position: absolute; /** position: absolute;
bottom: 10px; **/ bottom: 10px; **/

View File

@@ -25,88 +25,284 @@ export default {
type: String, type: String,
default: "日", default: "日",
}, },
than: {
type: String,
default: "同比",
},
chipOeeRate: {
type: Object,
default:{}
}
}, },
data() { data() {
// 城市数组的顺序必须是固定的 // 城市数组的顺序必须是固定的
const cities = ["瑞昌", "邯郸", "株洲", "佳木斯", "成都", "凯盛", "蚌埠"]; const cities = ["瑞昌", "邯郸",
// "株洲", "佳木斯", "成都", "凯盛", "蚌埠"
];
return { return {
xAxis: cities, xAxis: cities,
}; };
}, },
computed: { computed: {
legend() { legend() {
switch (this.period) { let items = [];
case "日": var day1 = new Date();
return [{ label: "昨日", color: "#12f7f1" }]; var day2 = new Date();
case "周": day1.setTime(day1.getTime() - 24 * 60 * 60 * 1000)
return [{ label: "本周", color: "#12f7f1" }]; day2.setTime(day2.getTime() - 48 * 60 * 60 * 1000)
case "月": { var yesterday = (day1.getMonth() + 1) + "月" + day1.getDate()
const year = new Date().getFullYear(); var dayBeYes = (day2.getMonth() + 1) + "月" + day2.getDate()
const month = new Date().getMonth() + 1; //今天的时间
return [ // var day2 = new Date();
{ label: `${year - 1}${month}`, color: "#12f7f1" }, // day2.setTime(day2.getTime());
{ label: `${year}${month}`, color: "#58adfa" }, // var s2 = (day2.getMonth() + 1) + "月" + day2.getDate() + '日';
]; const today = new Date().getDate();
} // let yesterday = new Date().getDate() -1;
case "年": { const month = new Date().getMonth() + 1;
const year = new Date().getFullYear(); const lastMonth = new Date().getMonth() + 1 === 12 ? 1 : new Date().getMonth() + 1 - 1;
return [ const year = new Date().getFullYear();
{ label: `${year - 1}`, color: "#12f7f1" }, if (this.period === '日' && this.than === '同比') {
{ label: `${year}`, color: "#58adfa" }, items = [
]; { label: `${yesterday}日目标`, color: "#58adfa" },
} { label: `${year - 1}${yesterday}`, color: "#12f7f1" },
default: { label: `${yesterday}`, color: "#58adfa" },
return [ ];
{ label: `${year - 1}`, color: "#12f7f1" }, } else if (this.period === '日' && this.than === '环比') {
{ label: `${year}`, color: "#58adfa" }, items = [
]; { label: `${yesterday}日目标`, color: "#58adfa" },
{ label: `${dayBeYes}`, color: "#12f7f1" },
{ label: `${yesterday}`, color: "#58adfa" },
];
} else if (this.period === '周' && this.than === '同比') {
items = [
{ label: `本周目标`, color: "#58adfa" },
{ label: `${year - 1}年本周`, color: "#12f7f1" },
{ label: `本周`, color: "#58adfa" },
];
} else if (this.period === '周' && this.than === '环比') {
items = [
{ label: `本周目标`, color: "#58adfa" },
{ label: `上周`, color: "#12f7f1" },
{ label: `本周`, color: "#58adfa" },
];
} else if (this.period === '月' && this.than === '同比') {
items = [
{ label: `${month}月目标`, color: "#58adfa" },
{ label: `${year - 1}${month}`, color: "#12f7f1" },
{ label: `${month}`, color: "#58adfa" },
// { label: `${month}月目标`, value: valueTuple[2] },
];
} else if (this.period === '月' && this.than === '环比') {
items = [
{ label: `${month}月目标`, color: "#58adfa" },
{ label: `${lastMonth}`, color: "#12f7f1" },
{ label: `${month}`, color: "#58adfa" },
// { label: `${month}月目标`, value: valueTuple[2] },
];
} else {
items = [
{ label: `${year}年目标`, color: "#58adfa" },
{ label: `${year - 1}`, color: "#12f7f1" },
{ label: `${year}`, color: "#58adfa" },
// { label: `${year}年目标`, value: valueTuple[2] },
];
} }
return items
// switch (this.period) {
// case "日":
// return [{ label: "昨日", color: "#12f7f1" }];
// case "周":
// return [{ label: "本周", color: "#12f7f1" }];
// case "月": {
// const year = new Date().getFullYear();
// const month = new Date().getMonth() + 1;
// return [
// { label: `${year - 1}年${month}月`, color: "#12f7f1" },
// { label: `${year}年${month}月`, color: "#58adfa" },
// ];
// }
// case "年": {
// const year = new Date().getFullYear();
// return [
// { label: `${year - 1}年`, color: "#12f7f1" },
// { label: `${year}年`, color: "#58adfa" },
// ];
// }
// default:
// return [
// { label: `${year - 1}年`, color: "#12f7f1" },
// { label: `${year}年`, color: "#58adfa" },
// ];
// }
}, },
// chipOeeRate() {
// return this.$store.getters.copilot.efficiency.chipOeeRate
// },
series() { series() {
// console.log('aaaaaaaa', this.$store.getters.copilot.efficiency.chipOee); // console.log('aaaaaaaa', this.$store.getters.copilot.efficiency.chipOee);
const { chipOee } = this.$store.getters.copilot.efficiency; const chipOeeRate = this.chipOeeRate
let dataList = null; // console.log('chipOee', chipOeeRate)
let dataList = null
switch (this.period) { switch (this.period) {
case "日": default:
case "周":
dataList = chipOee?.current;
case "周":
dataList = chipOee?.current;
break;
default:
dataList = []; dataList = [];
dataList[0] = chipOee?.previous; dataList[0] = chipOeeRate?.previous;
dataList[1] = chipOee?.current; dataList[1] = chipOeeRate?.current
dataList[2] = chipOeeRate?.target
} }
// console.log(dataList) console.log(dataList)
return getTemplate(this.period, dataList); return getTemplate(this.period, dataList,this.than);
}, },
}, },
methods: {}, methods: {},
}; };
function getTemplate(period, dataList) { function getTemplate(period, dataList, than) {
const year = new Date().getFullYear(); // console.log('dataList',dataList);
let items = [];
var day1 = new Date();
var day2 = new Date();
day1.setTime(day1.getTime() - 24 * 60 * 60 * 1000)
day2.setTime(day2.getTime() - 48 * 60 * 60 * 1000)
var yesterday = (day1.getMonth() + 1) + "月" + day1.getDate()
var dayBeYes = (day2.getMonth() + 1) + "月" + day2.getDate()
//今天的时间
// var day2 = new Date();
// day2.setTime(day2.getTime());
// var s2 = (day2.getMonth() + 1) + "月" + day2.getDate() + '日';
const today = new Date().getDate();
// let yesterday = new Date().getDate() -1;
const month = new Date().getMonth() + 1; const month = new Date().getMonth() + 1;
// console.log('11111', dataList); const lastMonth = new Date().getMonth() + 1 === 12 ? 1 : new Date().getMonth() + 1 - 1;
return period == "日" || period == "周" const year = new Date().getFullYear();
? [ if (period === '日' && than === '同比') {
{ items = [
name: period == "日" ? "昨日" : "本周", {
data: dataList ?? [], name: `${yesterday}日目标`,
}, data: dataList ? dataList[2] : [],
] // : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
: [ },
{ {
name: period == "年" ? `${year - 1}` : `${year - 1}${month}`, name: `${year - 1}${yesterday}`,
data: dataList ? dataList[0] : [], data: dataList ? dataList[0] : [],
}, },
{ {
name: period == "年" ? `${year}` : `${year}${month}`, name: `${yesterday}`,
data: dataList ? dataList[1] : [], data: dataList ? dataList[1] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)), // : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
}, },
];
];
} else if (period === '日' && than === '环比') {
items = [
{
name: `${yesterday}日目标`,
data: dataList ? dataList[2] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
{
name: `${dayBeYes}`,
data: dataList ? dataList[0] : [],
},
{
name: `${yesterday}`,
data: dataList ? dataList[1] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
];
} else if (period === '周' && than === '同比') {
items = [
{
name: `本周目标`,
data: dataList ? dataList[2] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
{
name: `${year-1}年本周`,
data: dataList ? dataList[0] : [],
},
{
name: `本周`,
data: dataList ? dataList[1] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
];
} else if (period === '周' && than === '环比') {
items = [
{
name: `本周目标`,
data: dataList ? dataList[2] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
{
name: `上周`,
data: dataList ? dataList[0] : [],
},
{
name: `本周`,
data: dataList ? dataList[1] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
];
} else if (period === '月' && than === '同比') {
items = [
{
name: `${month}月目标`,
data: dataList ? dataList[2] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
{
name: `${year-1}${month}`,
data: dataList ? dataList[0] : [],
},
{
name: `${month}`,
data: dataList ? dataList[1] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
];
} else if (period === '月' && than === '环比') {
items = [
{
name: `${month}`,
data: dataList ? dataList[1] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
{
name: `${month}月目标`,
data: dataList ? dataList[2] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
{
name: `${lastMonth}`,
data: dataList ? dataList[0] : [],
},
];
} else {
items = [
{
name: `${year}目标`,
data: dataList ? dataList[2] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
{
name: `${year - 1}`,
data: dataList ? dataList[0] : [],
},
{
name: `${year}`,
data: dataList ? dataList[1] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
];
}
return items
} }
</script> </script>

View File

@@ -1,22 +1,15 @@
<!-- <!--
filename: ChipRate.vue * @Author: zhp
author: liubin * @Date: 2024-05-10 11:10:54
date: 2024-04-29 08:50:54 * @LastEditTime: 2024-06-06 10:04:49
description: 芯片良率 * @LastEditors: zhp
* @Description:
--> -->
<template> <template>
<div class="chip-rate"> <div class="chip-rate">
<ChipRateItem <ChipRateItem :period="period" :than="than" :cities="['邯郸',]" :color="1" />
:period="period" <ChipRateItem :period="period" :than="than" :cities="['瑞昌']" :color="2" />
:cities="['成都', '邯郸', '株洲', '瑞昌']"
:color="1"
/>
<ChipRateItem
:period="period"
:cities="['佳木斯', '凯盛光伏', '蚌埠兴科']"
:color="2"
/>
</div> </div>
</template> </template>
@@ -30,6 +23,10 @@ export default {
type: String, type: String,
default: "日", default: "日",
}, },
than: {
type: String,
default: '同比',
}
}, },
data() { data() {
return {}; return {};

View File

@@ -1,18 +1,19 @@
<!-- <!--
* @Author: zhp * @Author: zhp
* @Date: 2024-05-07 10:25:10 * @Date: 2024-05-07 10:25:10
* @LastEditTime: 2024-05-20 10:04:03 * @LastEditTime: 2024-06-06 13:55:10
* @LastEditors: zhp * @LastEditors: zhp
* @Description: * @Description:
--> -->
<template> <template>
<div class="std-rate"> <!-- <div class="order"> -->
<div class="span-2"> <div class="std-rate" style="width: 100%">
<StdRateItem :period="period" :city="cities[5]" /> <!-- <div class="span-2">
</div> <StdRateItem :period="period" :city="cities[5]" />
<div class="flex-item" v-for="item in cities.filter((val, index) => index != 5)" :key="item.name"> </div> -->
<StdRateItem :period="period" :city="item" /> <div class="span-2" v-for="item in cities.filter((val, index) => index != 5)" :key="item.name">
<StdRateItem :period="period" :than="than" :city="item" />
</div> </div>
</div> </div>
</template> </template>
@@ -27,8 +28,20 @@ export default {
type: String, type: String,
default: "日", default: "日",
}, },
than: {
type: String,
default: "同比",
},
},
data() {
return {
// data: null
}
}, },
computed: { computed: {
stdData() {
return this.$store.getters.copilot.efficiency.stdRate
},
cities() { cities() {
console.log('ztl', this.$store.getters.copilot.efficiency.stdRate) console.log('ztl', this.$store.getters.copilot.efficiency.stdRate)
// let getterName = ""; // let getterName = "";
@@ -44,30 +57,30 @@ export default {
// break; // break;
// } // }
const _cities = [ const _cities = [
{ name: "瑞昌", target: 0, total: 0, current: 0, componentYield: 0, goodNumber:0,}, { name: "瑞昌", target: 0, previous: 0, current: 0, componentYield: 0, goodNumber: 0, },
{ name: "邯郸", target: 0, total: 0, current: 0, componentYield: 0, goodNumber: 0, }, { name: "邯郸",target: 0, previous: 0, current: 0, componentYield: 0, goodNumber: 0, },
{ name: "株洲", target: 0, previous: 0, current: 0, componentYield: 0, goodNumber: 0, }, { name: "株洲", target: 0, previous: 0, current: 0, componentYield: 0, goodNumber: 0, },
{ name: "佳木斯", target: 0, previous: 0, current: 0, componentYield: 0, goodNumber: 0, }, { name: "佳木斯", target: 0, previous: 0, current: 0, componentYield: 0, goodNumber: 0, },
{ name: "成都", target: 0, previous: 0, current: 0, componentYield: 0, goodNumber: 0, }, { name: "成都", target: 0, previous: 0, current: 0, componentYield: 0, goodNumber: 0, },
{ name: "凯盛光伏", target: 0, previous: 0, current: 0, componentYield: 0, goodNumber: 0, }, { name: "凯盛光伏", target: 0, previous: 0, current: 0, componentYield: 0, goodNumber: 0, },
{ name: "蚌埠", target: 0, previous: 0, current: 0, componentYield: 0, goodNumber: 0, }, { name: "蚌埠", target: 0, previous: 0, current: 0, componentYield: 0, goodNumber: 0, },
] ]
if (this.$store.getters.copilot?.efficiency.stdRate?.previous) { if (this.stdData?.previous) {
this.$store.getters.copilot?.efficiency.stdRate?.previous.forEach( this.stdData?.previous.forEach(
(v, idx) => { (v, idx) => {
_cities[idx].previous = v ?? 0; _cities[idx].previous = v ?? 0;
} }
); );
} }
if (this.$store.getters.copilot?.efficiency.stdRate?.target) { if (this.stdData?.target) {
this.$store.getters.copilot?.efficiency.stdRate?.target.forEach( this.stdData?.target.forEach(
(v, idx) => { (v, idx) => {
_cities[idx].target = v ?? 0; _cities[idx].target = v ?? 0;
} }
) )
} }
if (this.$store.getters.copilot?.efficiency.stdRate?.current) { if (this.stdData?.current) {
this.$store.getters.copilot?.efficiency.stdRate?.current.forEach( this.stdData?.current.forEach(
(v, idx) => { (v, idx) => {
_cities[idx].current = v ?? 0; _cities[idx].current = v ?? 0;
} }
@@ -75,22 +88,30 @@ export default {
} }
// 删掉凯盛光伏 // 删掉凯盛光伏
// _cities.splice(4, 1); // _cities.splice(4, 1);
return _cities; let arr = []
arr.push(_cities[0])
arr.push(_cities[1])
return arr;
}, },
}, },
data() { watch: {
return { period() {
// cities: [ this.data = this.$store.getters.copilot.efficiency.stdRate
// { name: "瑞昌", target: 100, total: 200, current: 20 }, }
// { name: "邯郸", target: 200, total: 300, current: 20 },
// { name: "株洲", target: 300, total: 400, current: 20 },
// { name: "佳木斯", target: 400, total: 500, current: 20 },
// { name: "成都", target: 500, total: 600, current: 20 },
// { name: "凯盛光伏", target: 400, total: 500, current: 20 },
// { name: "蚌埠", target: 500, total: 600, current: 20 },
// ],
};
}, },
// data() {
// return {
// // cities: [
// // { name: "瑞昌", target: 100, total: 200, current: 20 },
// // { name: "邯郸", target: 200, total: 300, current: 20 },
// // { name: "株洲", target: 300, total: 400, current: 20 },
// // { name: "佳木斯", target: 400, total: 500, current: 20 },
// // { name: "成都", target: 500, total: 600, current: 20 },
// // { name: "凯盛光伏", target: 400, total: 500, current: 20 },
// // { name: "蚌埠", target: 500, total: 600, current: 20 },
// // ],
// };
// },
methods: {}, methods: {},
}; };
</script> </script>
@@ -98,18 +119,21 @@ export default {
<style scoped lang="scss"> <style scoped lang="scss">
.std-rate { .std-rate {
display: flex; display: flex;
// gap: 1px; gap: 16px;
flex: 1 1 auto; // flex: 1 1 auto;
flex-direction: column;
// display: -webkit-box; // display: -webkit-box;
flex-wrap: wrap; flex-wrap: wrap;
align-items: center; // align-items: center;
// grid-template-columns: repeat(2, 1fr); // grid-template-columns: repeat(2, 1fr);
// grid-template-rows: repeat(4, 1fr); // grid-template-rows: repeat(4, 1fr);
} }
.std-rate::-webkit-scrollbar {
display: none;
}
.flex-item{ .flex-item{
// flex: 1 1 auto; // flex: 1 1 auto;
width: 50%; // width: 50%;
} }
.span-2 { .span-2 {
// flex: 1 1 auto; // flex: 1 1 auto;

View File

@@ -16,7 +16,7 @@
</template> </template>
<script> <script>
import BarChartBase from "@/views/copilot/efficiency/components/sub/bar/BarChartChipOEE.vue"; import BarChartBase from "@/views/copilot/efficiency/components/sub/bar/BarChartChipTrans.vue";
export default { export default {
name: "TransformRate", name: "TransformRate",
components: { BarChartBase }, components: { BarChartBase },
@@ -25,85 +25,276 @@ export default {
type: String, type: String,
default: "日", default: "日",
}, },
than: {
type: String,
default: '同比',
},
transformRate: {
type: Object,
default: {}
}
}, },
data() { data() {
// 城市数组的顺序必须是固定的 // 城市数组的顺序必须是固定的
const cities = ["瑞昌", "邯郸", "株洲", "佳木斯", "成都", "凯盛", "蚌埠"]; const cities = ["瑞昌", "邯郸",
// "株洲", "佳木斯", "成都", "凯盛", "蚌埠"
];
return { return {
xAxis: cities, xAxis: cities,
}; };
}, },
computed: { computed: {
legend() { legend() {
switch (this.period) { let items = [];
case "日": var day1 = new Date();
return [{ label: "昨日", color: "#12f7f1" }]; var day2 = new Date();
case "周": day1.setTime(day1.getTime() - 24 * 60 * 60 * 1000)
return [{ label: "本周", color: "#12f7f1" }]; day2.setTime(day2.getTime() - 48 * 60 * 60 * 1000)
case "月": { var yesterday = (day1.getMonth() + 1) + "月" + day1.getDate()
const year = new Date().getFullYear(); var dayBeYes = (day2.getMonth() + 1) + "月" + day2.getDate()
const month = new Date().getMonth() + 1; //今天的时间
return [ // var day2 = new Date();
{ label: `${year - 1}${month}`, color: "#12f7f1" }, // day2.setTime(day2.getTime());
{ label: `${year}${month}`, color: "#58adfa" }, // var s2 = (day2.getMonth() + 1) + "月" + day2.getDate() + '日';
]; const today = new Date().getDate();
} // let yesterday = new Date().getDate() -1;
case "年": { const month = new Date().getMonth() + 1;
const year = new Date().getFullYear(); const lastMonth = new Date().getMonth() + 1 === 12 ? 1 : new Date().getMonth() + 1 - 1;
return [ const year = new Date().getFullYear();
{ label: `${year - 1}`, color: "#12f7f1" }, if (this.period === '日' && this.than === '同比') {
{ label: `${year}`, color: "#58adfa" }, items = [
]; { label: `${yesterday}日目标`, color: "#58adfa" },
} { label: `${year - 1}${yesterday}`, color: "#12f7f1" },
default: { label: `${yesterday}`, color: "#58adfa" },
return [ ];
{ label: `${year - 1}`, color: "#12f7f1" }, } else if (this.period === '日' && this.than === '环比') {
{ label: `${year}`, color: "#58adfa" }, items = [
]; { label: `${yesterday}日目标`, color: "#58adfa" },
{ label: `${dayBeYes}`, color: "#12f7f1" },
{ label: `${yesterday}`, color: "#58adfa" },
];
} else if (this.period === '周' && this.than === '同比') {
items = [
{ label: `本周目标`, color: "#58adfa" },
{ label: `${year - 1}年本周`, color: "#12f7f1" },
{ label: `本周`, color: "#58adfa" },
];
} else if (this.period === '周' && this.than === '环比') {
items = [
{ label: `本周目标`, color: "#58adfa" },
{ label: `上周`, color: "#12f7f1" },
{ label: `本周`, color: "#58adfa" },
];
} else if (this.period === '月' && this.than === '同比') {
items = [
{ label: `${month}月目标`, color: "#58adfa" },
{ label: `${year - 1}${month}`, color: "#12f7f1" },
{ label: `${month}`, color: "#58adfa" },
// { label: `${month}月目标`, value: valueTuple[2] },
];
} else if (this.period === '月' && this.than === '环比') {
items = [
{ label: `${month}月目标`, color: "#58adfa" },
{ label: `${lastMonth}`, color: "#12f7f1" },
{ label: `${month}`, color: "#58adfa" },
// { label: `${month}月目标`, value: valueTuple[2] },
];
} else {
items = [
{ label: `${year}年目标`, color: "#58adfa" },
{ label: `${year - 1}`, color: "#12f7f1" },
{ label: `${year}`, color: "#58adfa" },
// { label: `${year}年目标`, value: valueTuple[2] },
];
} }
return items
}, },
// transformRate() {
// return this.$store.getters.copilot.efficiency.transformRate
// },
series() { series() {
const { transformRate } = this.$store.getters.copilot.efficiency; // console.log('aaaaaaaa', this.$store.getters.copilot.efficiency.chipOee);
const transformRate = this.transformRate
console.log('chipOee', transformRate)
let dataList = null; let dataList = null;
switch (this.period) { switch (this.period) {
case "日":
case "周":
dataList = transformRate?.current;
break;
default: default:
dataList = []; dataList = [];
dataList[0] = transformRate?.previous; dataList[0] = transformRate.previous;
dataList[1] = transformRate?.current; dataList[1] = transformRate.current
dataList[2] = transformRate.target
} }
console.log('transformRate', dataList)
return getTemplate(this.period, dataList); return getTemplate(this.period, dataList, this.than);
}, },
// series() {
// const { transformRate } = this.$store.getters.copilot.efficiency;
// let dataList = null;
// switch (this.period) {
// case "日":
// case "周":
// dataList = transformRate?.current;
// break;
// default:
// dataList = [];
// dataList[0] = transformRate?.previous;
// dataList[1] = transformRate?.current;
// }
// return getTemplate(this.period, dataList);
// },
}, },
methods: {}, methods: {},
}; };
function getTemplate(period, dataList) { function getTemplate(period, dataList,than) {
const year = new Date().getFullYear(); // console.log('dataList',dataList);
let items = [];
var day1 = new Date();
var day2 = new Date();
day1.setTime(day1.getTime() - 24 * 60 * 60 * 1000)
day2.setTime(day2.getTime() - 48 * 60 * 60 * 1000)
var yesterday = (day1.getMonth() + 1) + "月" + day1.getDate()
var dayBeYes = (day2.getMonth() + 1) + "月" + day2.getDate()
//今天的时间
// var day2 = new Date();
// day2.setTime(day2.getTime());
// var s2 = (day2.getMonth() + 1) + "月" + day2.getDate() + '日';
const today = new Date().getDate();
// let yesterday = new Date().getDate() -1;
const month = new Date().getMonth() + 1; const month = new Date().getMonth() + 1;
return period == "日" || period == "周" const lastMonth = new Date().getMonth() + 1 === 12 ? 1 : new Date().getMonth() + 1 - 1;
? [ const year = new Date().getFullYear();
{ if (period === '日' && than === '同比') {
name: period == "日" ? "昨日" : "本周", items = [
data: dataList ?? [], {
}, name: `${yesterday}日目标`,
] data: dataList ? dataList[2].splice(0,2) : [],
: [ // : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
{ },
name: period == "年" ? `${year - 1}` : `${year - 1}${month}`, {
data: dataList ? dataList[0] : [], name: `${year - 1}${yesterday}`,
}, data: dataList ? dataList[0].splice(0, 2) : [],
{ },
name: period == "年" ? `${year}` : `${year}${month}`, {
data: dataList ? dataList[1] : [], name: `${yesterday}`,
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)), data: dataList ? dataList[1].splice(0, 2) : [],
}, // : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
]; },
];
} else if (period === '日' && than === '环比') {
items = [
{
name: `${yesterday}日目标`,
data: dataList ? dataList[2] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
{
name: `${dayBeYes}`,
data: dataList ? dataList[0] : [],
},
{
name: `${yesterday}`,
data: dataList ? dataList[1] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
];
} else if (period === '周' && than === '同比') {
items = [
{
name: `本周目标`,
data: dataList ? dataList[2] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
{
name: `${year - 1}年本周`,
data: dataList ? dataList[0] : [],
},
{
name: `本周`,
data: dataList ? dataList[1] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
];
} else if (period === '周' && than === '环比') {
items = [
{
name: `本周目标`,
data: dataList ? dataList[2] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
{
name: `上周`,
data: dataList ? dataList[0] : [],
},
{
name: `本周`,
data: dataList ? dataList[1] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
];
} else if (period === '月' && than === '同比') {
items = [
{
name: `${month}月目标`,
data: dataList ? dataList[2] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
{
name: `${year - 1}${month}`,
data: dataList ? dataList[0] : [],
},
{
name: `${month}`,
data: dataList ? dataList[1] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
];
} else if (period === '月' && than === '环比') {
items = [
{
name: `${month}月目标`,
data: dataList ? dataList[2] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
{
name: `${month}`,
data: dataList ? dataList[1] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
{
name: `${lastMonth}`,
data: dataList ? dataList[0] : [],
},
];
} else {
items = [
{
name: `${year}目标`,
data: dataList ? dataList[2] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
{
name: `${year - 1}`,
data: dataList ? dataList[0] : [],
},
{
name: `${year}`,
data: dataList ? dataList[1] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
];
}
return items
} }
</script> </script>

View File

@@ -1,17 +1,17 @@
<!-- <!--
* @Author: zhp * @Author: zhp
* @Date: 2024-05-07 13:22:43 * @Date: 2024-05-07 13:22:43
* @LastEditTime: 2024-05-14 08:32:44 * @LastEditTime: 2024-07-25 14:29:04
* @LastEditors: zhp * @LastEditors: zhp
* @Description: * @Description:
--> -->
<template> <template>
<chart-container class="bar-chart-base"> <chart-container class="bar-chart-base">
<div class="legend"> <div class="legend">
<span v-for="item in legend" :key="item.label" class="legend-item" <span v-for="(item,index) in legend" :key="index" class="legend-item"
:style="{ fontSize: isFullscreen ? '0.58vw' : '0.54vw' }">{{ item.label }}</span> :style="{ fontSize: isFullscreen ? '0.72vw' : '0.7vw' }">{{ item.label }}</span>
</div> </div>
<div ref="chart" :style="{ height: '100%',width: width}"></div> <div ref="oeeChart" style="height:94%;width:100%"></div>
</chart-container> </chart-container>
</template> </template>
@@ -22,7 +22,7 @@ import ChartContainer from "../../../../components/ChartContainer.vue";
import { debounce } from "@/utils/debounce"; import { debounce } from "@/utils/debounce";
import * as echarts from "echarts"; import * as echarts from "echarts";
export default { export default {
name: "BarChartBase", name: "barChartBaseoee",
components: { components: {
ChartContainer, ChartContainer,
}, },
@@ -56,13 +56,48 @@ export default {
actualOptions: null, actualOptions: null,
options: { options: {
grid: { grid: {
left: "5%", left: "6%",
right: "0%", right: "0%",
bottom: "3%", bottom: "3%",
top: "15%", top: "15%",
containLabel: true, containLabel: true,
}, },
tooltip: {}, tooltip: {
trigger: "axis",
axisPointer: {
// type: "cross",
crossStyle: {
color: "rgba(237,237,237,0.5)",
},
},
backgroundColor: 'rgba(0,0,0,0)', // tooltip默认背景为白色手动置为透明
extraCssText: 'padding:0;border-width:0',
formatter: params => {
console.log('params', params)
var res = `<span style='color:rgba(255,255,255,0.85);margin-bottom:8px'>${params[0].axisValueLabel}</span>`;
for (var i = 0, l = params.length; i < l; i++) {
let color = Object.prototype.toString.call(params[i].color) == "[object String]" ? params[i].color : params[i].color.colorStops ? params[i].color.colorStops[0].color : ''
// console.log(item.color, color);
res +=
"<br/>" +
`${params[i].seriesType === "line"
? `<span style='display:inline-block; width: 20px;height: 2px;background-color: #f3c000;position: absolute;top:39%;left:3.05%;'></span>
<span style='display:inline-block;width: 8px;height: 8px;border-radius: 100%;background-color: #f3c000;position: absolute;top:36%;left:4.8%;'></span>
<span style='display:inline-block;width:150px;color:rgba(255,255,255,.85);font-size:16px;margin-left:20px'>${params[i].seriesName}</span>`
: `<span style="display:inline-block;margin-right:4px;border-radius:2px;width:12px;height:12px;background-color:${color}"></span>
<span style='display:inline-block;width:150px;color:rgba(255,255,255,.85);font-size:16px'>${params[i].seriesName}</span>`
}` +
`<span style='display:inline-block;text-align: right;width:180px;color:rgba(255,255,255,0.65);;font-size:16px;letter-spacing: 2px;'>${params[i].value ? params[i].value.toFixed(2) + '%' : "0.00" + '%'}</span>`;
}
const htmlContent = `
<div style="padding: 12px 16px;background:rgba(0,24,41,.5);box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.38);backdrop-filter: blur(10px);">
${res}
</div>
`;
return htmlContent;
},
},
xAxis: { xAxis: {
axisTick: { axisTick: {
show: false, show: false,
@@ -73,23 +108,24 @@ export default {
}, },
}, },
axisLabel: { axisLabel: {
color: "#fff", color: "rgba(223,241,254,.8)",
fontSize: 12, fontSize: 16,
}, },
data: this.xAxis, data: this.xAxis,
}, },
yAxis: { yAxis: {
name: "单位/%", name: "单位/%",
nameTextStyle: { nameTextStyle: {
color: "#fff", color: "rgba(223,241,254,.8)",
fontSize: 12, fontSize: 16,
align: "right",
}, },
axisTick: { axisTick: {
show: false, show: false,
}, },
axisLabel: { axisLabel: {
color: "#fff", color: "rgba(223,241,254,.8)",
fontSize: 12, fontSize: 16,
}, },
axisLine: { axisLine: {
show: true, show: true,
@@ -99,15 +135,50 @@ export default {
}, },
splitLine: { splitLine: {
lineStyle: { lineStyle: {
color: "#4561AE", color: "rgba(69,97,174,.4)",
}, },
}, },
}, },
series: [ series: [
{
name: "", // "2024年目标值",
type: "line",
lineStyle: {
color: "#f3c000",
},
itemStyle: {
color: "#f3c000",
},
// areaStyle: {
// color: {
// type: "linear",
// x: 0,
// y: 0,
// x2: 0,
// y2: 1,
// colorStops: [
// {
// offset: 0,
// color: "#f3c000", // 0% 处的颜色
// },
// {
// offset: 0.55,
// color: "#f3c00033",
// },
// {
// offset: 1,
// color: "transparent", // 100% 处的颜色
// },
// ],
// global: false, // 缺省为 false
// },
// },
data: [], // this.series[0].data,
},
{ {
name: "", // this.series[0].name, name: "", // this.series[0].name,
type: "bar", type: "bar",
barWidth: 12, barWidth: 16,
itemStyle: { itemStyle: {
borderRadius: [10, 10, 0, 0], borderRadius: [10, 10, 0, 0],
color: { color: {
@@ -142,7 +213,7 @@ export default {
{ {
name: "", // this.series[1].name, name: "", // this.series[1].name,
type: "bar", type: "bar",
barWidth: 12, barWidth: 16,
// tooltip: { // tooltip: {
// valueFormatter: function (value) { // valueFormatter: function (value) {
// return value + " ml"; // return value + " ml";
@@ -170,7 +241,7 @@ export default {
}, },
}, },
data: [], // this.series[1].data, data: [], // this.series[1].data,
}, }
], ],
}, },
}; };
@@ -182,37 +253,49 @@ export default {
}, },
watch: { watch: {
isOpen(val) { isOpen(val) {
if (val === true) { this.canvasReset()
this.width = '100%-128px'
this.canvasReset()
} else {
this.watch = 100 + '%'
this.canvasReset()
}
}, },
/** 全屏状态切换时,对柱子粗细和字体大小进行相应调整 */ /** 全屏状态切换时,对柱子粗细和字体大小进行相应调整 */
isFullscreen(val) { isFullscreen(val) {
this.actualOptions.series.map((item) => { // this.actualOptions.series.map((item) => {
item.barWidth = val ? 18 : 12; // item.barWidth = val ? 18 : 16;
}); // });
this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 12; // this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 16;
this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 12; // this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 16;
this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 12; // this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 16;
this.initChart(this.actualOptions); // if (val === false && this.isOpen === true) {
// console.log(val)
// this.width = 97 + '%'
// this.canvasReset()
// } else if (val === false && this.isOpen === false) {
// this.width = 100 + '%'
// this.canvasReset()
// }
// this.actualOptions.series.map((item) => {
// item.barWidth = val ? 18 : 16;
// });
// this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 16;
// this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 16;
// this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 16;
this.initChart(this.options)
this.canvasReset()
}, },
series(val) { series(val) {
if (!val) { if (!val) {
this.initChart(this.options); this.initChart(this.options);
return; return;
} }
console.log(val) // console.log('val', val)
const actualOptions = JSON.parse(JSON.stringify(this.options)) const actualOptions = JSON.parse(JSON.stringify(this.options))
actualOptions.series[0].data = val[0].data; console.log(actualOptions)
actualOptions.series[0].name = val[0].name; this.options.series[0].data = val[0].data;
actualOptions.series[1].data = val?.[1]?.data || []; this.options.series[0].name = val[0].name;
actualOptions.series[1].name = val?.[1]?.name || ""; this.options.series[1].data = val?.[1]?.data;
this.options.series[1].name = val?.[1]?.name;
this.options.series[2].data = val?.[2]?.data || [];
this.options.series[2].name = val?.[2]?.name || "";
this.actualOptions = actualOptions; this.actualOptions = actualOptions;
this.initChart(actualOptions); this.initChart(this.options);
}, },
}, },
mounted() { mounted() {
@@ -221,7 +304,12 @@ export default {
// this.isFullscreen = screenfull.isFullscreen; // this.isFullscreen = screenfull.isFullscreen;
// }); // });
// } // }
this.actualOptions = this.options if (screenfull.isEnabled) {
screenfull.on("change", () => {
this.isFullscreen = screenfull.isFullscreen;
});
}
// this.actualOptions = this.options
this.canvasReset(); this.canvasReset();
window.addEventListener("resize", this.canvasReset); window.addEventListener("resize", this.canvasReset);
}, },
@@ -243,14 +331,15 @@ export default {
if (this.chart) { if (this.chart) {
this.chart.dispose(); this.chart.dispose();
} }
this.chart = echarts.init(this.$refs.chart); this.chart = echarts.init(this.$refs.oeeChart);
this.chart.setOption(this.actualOptions); this.chart.setOption(this.options);
}, },
}, },
}; };
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.bar-chart-base { .bar-chart-base {
// position: relative; // position: relative;
@@ -263,7 +352,7 @@ export default {
.legend-item { .legend-item {
position: relative; position: relative;
// font-size: 12px; // font-size: 12px;
margin-right: 0.67vw; margin-right: 1.3vw;
&::before { &::before {
content: ""; content: "";
@@ -275,12 +364,42 @@ export default {
margin-right: 0.22vw; margin-right: 0.22vw;
} }
} }
.legend-item:nth-child(1) {
margin-left: 1vw;
}
.legend-item:nth-child(1):before {
// width: 12px;
// height: 2px;
width: 1vw;
height: 0.1064vw;
background-color: #f3c000;
position: absolute;
top: 50%;
// left: -16px;
left: -1.2vw;
transform: translateY(-50%);
}
.legend-item:nth-child(1):before { .legend-item:nth-child(1):after {
background-color: #f3c000;
content: "";
display: inline-block;
position: absolute;
// width: 6px;
// height: 6px;
width: 0.4vw;
height: 0.4vw;
border-radius: 100%;
top: 50%;
left: -1.1vw;
// left: -16px;
transform: translateY(-50%) translateX(50%);
}
.legend-item:nth-child(2):before {
background-color: #12f7f1; background-color: #12f7f1;
} }
.legend-item:nth-child(2):before { .legend-item:nth-child(3):before {
background-color: #58adfa; background-color: #58adfa;
} }
} }

View File

@@ -0,0 +1,406 @@
<!--
* @Author: zhp
* @Date: 2024-05-23 15:50:44
* @LastEditTime: 2024-07-25 14:29:09
* @LastEditors: zhp
* @Description:
-->
<template>
<chart-container class="bar-chart-base">
<div class="legend">
<span v-for="(item,index) in legend" :key="index" class="legend-item"
:style="{ fontSize: isFullscreen ? '0.72vw' : '0.7vw' }">{{ item.label }}</span>
</div>
<div ref="oeeChart" style="height:94%;width:100%"></div>
</chart-container>
</template>
<script>
import screenfull from "screenfull";
import ChartContainer from "../../../../components/ChartContainer.vue";
// import chartMixin from "@/mixins/chart.js";
import { debounce } from "@/utils/debounce";
import * as echarts from "echarts";
export default {
name: "barChartBaseoee",
components: {
ChartContainer,
},
// mixins: [chartMixin],
props: {
vHeight: {
type: Number,
default: 36,
},
legend: {
type: Array,
required: true,
},
xAxis: {
type: Array,
required: true,
},
series: {
type: Array,
required: true,
},
in: {
type: String,
default: "",
},
},
data() {
return {
width: '100%',
isFullscreen: false,
actualOptions: null,
options: {
grid: {
left: "6%",
right: "0%",
bottom: "3%",
top: "15%",
containLabel: true,
},
tooltip: {
trigger: "axis",
axisPointer: {
// type: "cross",
crossStyle: {
color: "rgba(237,237,237,0.5)",
},
},
backgroundColor: 'rgba(0,0,0,0)', // tooltip默认背景为白色手动置为透明
extraCssText: 'padding:0;border-width:0',
formatter: params => {
console.log('params', params)
var res = `<span style='color:rgba(255,255,255,0.85);margin-bottom:8px'>${params[0].axisValueLabel}</span>`;
for (var i = 0, l = params.length; i < l; i++) {
let color = Object.prototype.toString.call(params[i].color) == "[object String]" ? params[i].color : params[i].color.colorStops ? params[i].color.colorStops[0].color : ''
// console.log(item.color, color);
res +=
"<br/>" +
`${params[i].seriesType === "line"
? `<span style='display:inline-block; width: 20px;height: 2px;background-color: #f3c000;position: absolute;top:39%;left:3.05%;'></span>
<span style='display:inline-block;width: 8px;height: 8px;border-radius: 100%;background-color: #f3c000;position: absolute;top:36%;left:4.8%;'></span>
<span style='display:inline-block;width:150px;color:rgba(255,255,255,.85);font-size:16px;margin-left:20px'>${params[i].seriesName}</span>`
: `<span style="display:inline-block;margin-right:4px;border-radius:2px;width:12px;height:12px;background-color:${color}"></span>
<span style='display:inline-block;width:150px;color:rgba(255,255,255,.85);font-size:16px'>${params[i].seriesName}</span>`
}` +
`<span style='display:inline-block;text-align: right;width:180px;color:rgba(255,255,255,0.65);;font-size:16px;letter-spacing: 2px;'>${params[i].value ? params[i].value.toFixed(2) + '%' : "0.00" + '%'}</span>`;
}
const htmlContent = `
<div style="padding: 12px 16px;background:rgba(0,24,41,.5);box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.38);backdrop-filter: blur(10px);">
${res}
</div>
`;
return htmlContent;
},
},
xAxis: {
axisTick: {
show: false,
},
axisLine: {
lineStyle: {
color: "#4561AE",
},
},
axisLabel: {
color: "rgba(223,241,254,.8)",
fontSize: 16,
},
data: this.xAxis,
},
yAxis: {
name: "单位/%",
nameTextStyle: {
color: "rgba(223,241,254,.8)",
fontSize: 16,
align: "right",
},
axisTick: {
show: false,
},
axisLabel: {
color: "rgba(223,241,254,.8)",
fontSize: 16,
},
axisLine: {
show: true,
lineStyle: {
color: "#4561AE",
},
},
splitLine: {
lineStyle: {
color: "rgba(69,97,174,.4)",
},
},
},
series: [
{
name: "", // "2024年目标值",
type: "line",
lineStyle: {
color: "#f3c000",
},
itemStyle: {
color: "#f3c000",
},
// areaStyle: {
// color: {
// type: "linear",
// x: 0,
// y: 0,
// x2: 0,
// y2: 1,
// colorStops: [
// {
// offset: 0,
// color: "#f3c000", // 0% 处的颜色
// },
// {
// offset: 0.55,
// color: "#f3c00033",
// },
// {
// offset: 1,
// color: "transparent", // 100% 处的颜色
// },
// ],
// global: false, // 缺省为 false
// },
// },
data: [], // this.series[0].data,
},
{
name: "", // this.series[0].name,
type: "bar",
barWidth: 16,
itemStyle: {
borderRadius: [10, 10, 0, 0],
color: {
type: "linear",
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: "#12f7f1", // 0% 处的颜色
},
{
offset: 0.35,
color: "#12f7f177", // 100% 处的颜色
},
{
offset: 0.75,
color: "#12f7f133", // 100% 处的颜色
},
{
offset: 1,
color: "transparent", // 100% 处的颜色
},
],
global: false, // 缺省为 false
},
},
data: [], // this.series[0].data,
},
{
name: "", // this.series[1].name,
type: "bar",
barWidth: 16,
// tooltip: {
// valueFormatter: function (value) {
// return value + " ml";
// },
// },
itemStyle: {
borderRadius: [10, 10, 0, 0],
color: {
type: "linear",
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: "#57abf8", // 0% 处的颜色
},
{
offset: 1,
color: "#364BFE66", // 100% 处的颜色
},
],
global: false, // 缺省为 false
},
},
data: [], // this.series[1].data,
},
],
},
};
},
computed: {
isOpen() {
return this.$store.getters.sidebar.opened
},
},
watch: {
isOpen(val) {
this.canvasReset()
},
/** 全屏状态切换时,对柱子粗细和字体大小进行相应调整 */
isFullscreen(val) {
// this.actualOptions.series.map((item) => {
// item.barWidth = val ? 18 : 16;
// });
// this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 16;
// this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 16;
// this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 16;
// if (val === false && this.isOpen === true) {
// console.log(val)
// this.width = 97 + '%'
// this.canvasReset()
// } else if (val === false && this.isOpen === false) {
// this.width = 100 + '%'
// this.canvasReset()
// }
// this.actualOptions.series.map((item) => {
// item.barWidth = val ? 18 : 16;
// });
// this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 16;
// this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 16;
// this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 16;
this.initChart(this.options)
this.canvasReset()
},
series(val) {
if (!val) {
this.initChart(this.options);
return;
}
console.log(val)
// const actualOptions = JSON.parse(JSON.stringify(this.options))
this.options.series[0].data = val[0].data;
this.options.series[0].name = val[0].name;
this.options.series[1].data = val?.[1]?.data || [];
this.options.series[1].name = val?.[1]?.name || "";
this.options.series[2].data = val?.[2]?.data || [];
this.options.series[2].name = val?.[2]?.name || "";
// this.actualOptions = actualOptions;
this.initChart(this.options);
},
},
mounted() {
// if (screenfull.isEnabled) {
// screenfull.on("change", () => {
// this.isFullscreen = screenfull.isFullscreen;
// });
// }
if (screenfull.isEnabled) {
screenfull.on("change", () => {
this.isFullscreen = screenfull.isFullscreen;
});
}
// this.actualOptions = this.options
this.canvasReset();
window.addEventListener("resize", this.canvasReset);
},
beforeDestroy() {
if (this.chart) {
this.chart.dispose();
}
},
destroyed() {
window.removeEventListener("resize", this.canvasReset);
},
methods: {
canvasReset() {
debounce(() => {
this.initChart();
}, 500)();
},
initChart() {
if (this.chart) {
this.chart.dispose();
}
this.chart = echarts.init(this.$refs.oeeChart);
this.chart.setOption(this.options);
},
},
};
</script>
<style scoped lang="scss">
.bar-chart-base {
// position: relative;
.legend {
position: absolute;
top: 5.2vh;
right: 1vw;
}
.legend-item {
position: relative;
// font-size: 12px;
margin-right:1.3vw;
&::before {
content: "";
display: inline-block;
width: 0.531vw;
height: 0.531vw;
background-color: #ccc;
border-radius: 2px;
margin-right: 0.22vw;
}
}
.legend-item:nth-child(1) {
margin-left: 1vw;
}
.legend-item:nth-child(2):before {
background-color: #12f7f1;
}
.legend-item:nth-child(3):before {
background-color: #58adfa;
}
.legend-item:nth-child(1):before {
// width: 12px;
// height: 2px;
width: 1vw;
height: 0.1064vw;
background-color: #f3c000;
position: absolute;
top: 50%;
// left: -16px;
left: -1.2vw;
transform: translateY(-50%);
}
.legend-item:nth-child(1):after {
background-color: #f3c000;
content: "";
display: inline-block;
position: absolute;
// width: 6px;
// height: 6px;
width: 0.4vw;
height: 0.4vw;
border-radius: 100%;
top: 50%;
left: -1.1vw;
// left: -16px;
transform: translateY(-50%) translateX(50%);
}
}
</style>

View File

@@ -13,10 +13,11 @@
<!-- <div style="flex:1;padding: 0 20%;"> --> <!-- <div style="flex:1;padding: 0 20%;"> -->
<div class="chart" ref="chart"></div> <div class="chart" ref="chart"></div>
<!-- </div> --> <!-- </div> -->
<div class="legend" v-if="period == '月' || period == '年'"> <div class="legend">
<div class="legend-item" v-for="lgd in legend" :key="lgd.label"> <div class="legend-item" v-for="lgd in legend" :key="lgd.label">
<span class="legend-item__value">{{ lgd.value }}</span>
<span class="legend-item__label">{{ lgd.label }}</span> <span class="legend-item__label">{{ lgd.label }}</span>
<span class="legend-item__value">{{ lgd.value }}</span>
</div> </div>
</div> </div>
</div> </div>
@@ -46,6 +47,10 @@ export default {
type: String, type: String,
default: "日", default: "日",
}, },
than: {
type: String,
default: '同比',
}
}, },
data() { data() {
return { return {
@@ -60,13 +65,13 @@ export default {
valueTuple() { valueTuple() {
const getter = this.chipRate; const getter = this.chipRate;
// console.log(getter) // console.log(getter)
if (this.period === "日" || this.period === "周") { // if (this.period === "日" || this.period === "周") {
return [ // return [
getter.previous[this.factoryId], // getter.previous[this.factoryId],
getter.current[this.factoryId], // getter.current[this.factoryId],
0, // 0,
]; // ];
} // }
// [100, 200, 200] // [100, 200, 200]
return [ return [
getter.previous[this.factoryId], getter.previous[this.factoryId],
@@ -75,27 +80,90 @@ export default {
]; ];
}, },
options() { options() {
const single = this.period === "日" || this.period === "周"; // const single = this.period === "日" || this.period === "周";
const today = new Date().getDate();
const year = new Date().getFullYear(); const year = new Date().getFullYear();
const month = new Date().getMonth() + 1; const month = new Date().getMonth() + 1;
const vt = this.valueTuple; const vt = this.valueTuple;
let titleValue = single let items = [];
? (vt[1] != null && `${vt[1] * 100}%`) || "0%" var day1 = new Date();
: vt[0] != null && vt[2] != null && vt[2] !== 0 var day2 = new Date();
? `${((vt[1] / vt[2]) * 100).toFixed(0)}%` day1.setTime(day1.getTime() - 24 * 60 * 60 * 1000)
: "0%", day2.setTime(day2.getTime() - 48 * 60 * 60 * 1000)
var yesterday = (day1.getMonth() + 1) + "月" + day1.getDate()
var dayBeYes = (day2.getMonth() + 1) + "月" + day2.getDate()
//今天的时间
// var day2 = new Date();
// day2.setTime(day2.getTime());
// var s2 = (day2.getMonth() + 1) + "月" + day2.getDate() + '日';
// const today = new Date().getDate();
// let yesterday = new Date().getDate() -1;
// const month = new Date().getMonth() + 1;
const lastMonth = new Date().getMonth() + 1 === 12 ? 1 : new Date().getMonth() + 1 - 1;
// const year = new Date().getFullYear();
if (this.period === '日' && this.than === '同比') {
items = [
{ label: `${yesterday}日良率`, },
{ label: `${year - 1}${yesterday}日良率` },
{ label: `${yesterday}日目标` },
];
} else if (this.period === '日' && this.than === '环比') {
items = [
{ label: `${yesterday}日良率` },
{ label: `${dayBeYes}日良率` },
{ label: `${yesterday}日目标` },
];
} else if (this.period === '周' && this.than === '同比') {
items = [
{ label: `本周良率`, },
{ label: `${year - 1}年本周良率` },
{ label: `本周目标`, },
];
} else if (this.period === '周' && this.than === '环比') {
items = [
{ label: `本周良率`, },
{ label: `上周良率`, },
{ label: `本周目标`, },
];
} else if (this.period === '月' && this.than === '同比') {
items = [
{ label: `${month}月良率`, },
{ label: `${year-1}${month}月良率`, },
{ label: `${month}月目标良率`, },
];
} else if (this.period === '月' && this.than === '环比') {
items = [
{ label: `${month}月良率`, },
{ label: `${lastMonth}月良率`, },
{ label: `${month}月目标良率`, },
];
} else {
items = [
{ label: `${year}年良率`, },
{ label: `${year - 1}年良率` },
{ label: `${year}年目标良率` },
];
}
let titleValue = vt[1] === null ? 0 + '%' : this.formatNumber(vt[1]) + '%',
subtitle = { subtitle = {
: "日良率", : "日良率",
: "本周良率", : "本周良率",
: `${month}月良率`, : `${month}月良率`,
: `${year}良率`, : `${year}良率`,
}[this.period]; }[this.period];
console.log(vt[0]);
let titleSize = this.fontSize(0.35)
let subtitleSize = this.fontSize(0.14)
const t = getOptions({ const t = getOptions({
single, // single,
color: this.color == 1 ? "#4CF0E8" : "#1065ff", color: this.color == 1 ? "#4CF0E8" : "#1065ff",
titleValue, titleValue,
titleSize,
subtitleSize,
subtitle, subtitle,
yesterday,
currentName: items[0].label,
preName: items[1].label,
previousSum: vt[0], previousSum: vt[0],
currentSum: vt[1], currentSum: vt[1],
targetSum: vt[2], targetSum: vt[2],
@@ -103,21 +171,82 @@ export default {
return t; return t;
}, },
legend() { legend() {
const year = new Date().getFullYear(); let items = [];
var day1 = new Date();
var day2 = new Date();
day1.setTime(day1.getTime() - 24 * 60 * 60 * 1000)
day2.setTime(day2.getTime() - 48 * 60 * 60 * 1000)
var yesterday = (day1.getMonth() + 1) + "月" + day1.getDate()
var dayBeYes = (day2.getMonth() + 1) + "月" + day2.getDate()
//今天的时间
// var day2 = new Date();
// day2.setTime(day2.getTime());
// var s2 = (day2.getMonth() + 1) + "月" + day2.getDate() + '日';
const today = new Date().getDate();
// let yesterday = new Date().getDate() -1;
const month = new Date().getMonth() + 1; const month = new Date().getMonth() + 1;
return [ const lastMonth = new Date().getMonth() + 1 === 12 ? 1 : new Date().getMonth() + 1 - 1;
{ const year = new Date().getFullYear();
label: if (this.period === '日' && this.than === '同比') {
this.period == "月" items = [
? `${year - 1}${month}良率` { label: `${year - 1}${yesterday}良率`, value: isNaN(this.valueTuple[0]) || this.valueTuple[0] == null ? 0 + "%" : (this.formatNumber(this.valueTuple[0]) ) + "%" },
: `${year - 1}年良率`, { label: `${yesterday}日良率`, value: isNaN(this.valueTuple[1]) || this.valueTuple[1] == null ? 0 + "%" : (this.formatNumber(this.valueTuple[1])) + "%" },
value: isNaN((this.valueTuple[0] * 100).toFixed(0)) ? 0 + "%" : (this.valueTuple[0] * 100).toFixed(0) + "%" { label: `${yesterday}日目标`, value: isNaN(this.valueTuple[2]) || this.valueTuple[2] == null ? 0 + "%" : (this.formatNumber(this.valueTuple[2])) + "%" },
}, ];
{ } else if (this.period === '日' && this.than === '环比') {
label: this.period == "月" ? `${month}月良率` : `${year}年良率`, items = [
value: isNaN((this.valueTuple[1] * 100).toFixed(0)) ? 0 + "%" : (this.valueTuple[1] * 100).toFixed(0) + "%" { label: `${dayBeYes}日良率`, value: isNaN(this.valueTuple[0]) || this.valueTuple[0] == null ? 0 + "%" : (this.formatNumber(this.valueTuple[0])) + "%" },
}, { label: `${yesterday}日良率`, value: isNaN(this.valueTuple[1]) || this.valueTuple[1] == null ? 0 + "%" : (this.formatNumber(this.valueTuple[1])) + "%" },
]; { label: `${yesterday}日目标`, value: isNaN(this.valueTuple[2]) || this.valueTuple[2] == null ? 0 + "%" : (this.formatNumber(this.valueTuple[2])) + "%" },
];
} else if (this.period === '周' && this.than === '同比') {
items = [
{ label: `${year-1}年本周良率`, value: isNaN(this.valueTuple[0]) || this.valueTuple[0] == null ? 0 + "%" : (this.formatNumber(this.valueTuple[0])) + "%" },
{ label: `本周良率`, value: isNaN(this.valueTuple[1]) || this.valueTuple[1] == null ? 0 + "%" : (this.formatNumber(this.valueTuple[1])) + "%" },
{ label: `本周目标`, value: isNaN(this.valueTuple[2]) || this.valueTuple[2] == null ? 0 + "%" : (this.formatNumber(this.valueTuple[2])) + "%" },
];
} else if (this.period === '周' && this.than === '环比') {
items = [
{ label: `上周良率`, value: isNaN(this.valueTuple[0]) || this.valueTuple[0] == null ? 0 + "%" : (this.formatNumber(this.valueTuple[0])) + "%" },
{ label: `本周良率`, value: isNaN(this.valueTuple[1]) || this.valueTuple[1] == null ? 0 + "%" : (this.formatNumber(this.valueTuple[1])) + "%" },
{ label: `本周目标`, value: isNaN(this.valueTuple[2]) || this.valueTuple[2] == null ? 0 + "%" : (this.formatNumber(this.valueTuple[2])) + "%" },
];
} else if (this.period === '月' && this.than === '同比') {
items = [
{ label: `${year-1}${month}月良率`, value: isNaN(this.valueTuple[0]) || this.valueTuple[0] == null ? 0 + "%" : (this.formatNumber(this.valueTuple[0])) + "%" },
{ label: `${month}月良率`, value: isNaN(this.valueTuple[1]) || this.valueTuple[1] == null ? 0 + "%" : (this.formatNumber(this.valueTuple[1])) + "%" },
{ label: `${month}月目标`, value: isNaN(this.valueTuple[2]) || this.valueTuple[2] == null ? 0 + "%" : (this.formatNumber(this.valueTuple[2])) + "%" },
];
} else if (this.period === '月' && this.than === '环比') {
items = [
{ label: `${lastMonth}月良率`, value: isNaN(this.valueTuple[0]) || this.valueTuple[0] == null ? 0 + "%" : (this.formatNumber(this.valueTuple[0])) + "%" },
{ label: `${month}月良率`, value: isNaN(this.valueTuple[1]) || this.valueTuple[1] == null ? 0 + "%" : (this.formatNumber(this.valueTuple[1])) + "%" },
{ label: `${month}月目标`, value: isNaN(this.valueTuple[2]) || this.valueTuple[2] == null ? 0 + "%" : (this.formatNumber(this.valueTuple[2])) + "%" },
];
} else {
items = [
{ label: `${year - 1}年良率`, value: isNaN(this.valueTuple[0]) || this.valueTuple[0] == null ? 0 + "%" : (this.formatNumber(this.valueTuple[0])) + "%" },
{ label: `${year}年良率`, value: isNaN(this.valueTuple[1]) || this.valueTuple[1] == null ? 0 + "%" : (this.formatNumber(this.valueTuple[1])) + "%" },
{ label: `${year}年目标`, value: isNaN(this.valueTuple[2]) || this.valueTuple[2] == null ? 0 + "%" : (this.formatNumber(this.valueTuple[2])) + "%" },
];
}
return items
// [
// {
// label:
// this.period == "月"
// ? `${year - 1}年${month}月良率`
// : `${year - 1}年良率`,
// value: isNaN((this.valueTuple[0] * 100).toFixed(0)) ? 0 + "%" : (this.valueTuple[0] * 100).toFixed(0) + "%"
// },
// {
// label: this.period == "月" ? `${month}月良率` : `${year}年良率`,
// value: isNaN((this.valueTuple[1] * 100).toFixed(0)) ? 0 + "%" : (this.valueTuple[1] * 100).toFixed(0) + "%"
// },
// ];
}, },
}, },
mounted() { mounted() {
@@ -136,6 +265,22 @@ export default {
}, },
}, },
methods: { methods: {
fontSize(res){
let clientWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
if (!clientWidth) return;
let fontSize = 100 * (clientWidth / 1920);
return res * fontSize;
},
formatNumber(num) {
console.log(num);
// 判断是否为整数
if (Number.isInteger(num)) {
return num; // 如果是整数,直接转换为字符串
} else {
// 如果不是整数,保留两位小数并转换为字符串
return num.toFixed(2);
}
},
handleCityUpdate(id) { handleCityUpdate(id) {
this.factoryId = id; this.factoryId = id;
}, },
@@ -151,37 +296,47 @@ export default {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
justify-content: center; // padding: 0 3px;
// justify-content: center;
gap: 3px; gap: 3px;
backdrop-filter: blur(24px); backdrop-filter: blur(24px);
.cities { // .cities {
height: 40px; // // height: 40px;
} // }
.chart { .chart {
// margin-left: 5%; // margin-left: 5%;
// width: 290px; // width: 290px;
align-self: stretch; flex: 1 1 auto;
// flex: 1 1 auto; padding: 0 20%;
// padding: 0 10%;
/* margin: 10%; */ /* margin: 10%; */
height: 0;
/* min-width: 300px; */ /* min-width: 300px; */
height: 200px; align-self: stretch;
} }
.legend { .legend {
height: 80px; // height: 80px;
display: flex; display: flex;
gap: 40px; color: #fff;
justify-content: space-around; justify-content: flex-end;
gap:20px;
// justify-content: space-between;
} }
// .legend:nth-child(3){
// margin-left: 30px;
// }
.legend-item { .legend-item {
margin-left: 15px;
display: flex; display: flex;
font-size: 16px;
// font-weight: 600;
flex-direction: column; flex-direction: column;
align-items: center; // align-items: center;
align-items: flex-start;
gap: 3px; gap: 3px;
&:first-child { &:first-child {
// margin-left: 5px;
.legend-item__value { .legend-item__value {
color: #0e61f5; color: #0e61f5;
} }
@@ -193,10 +348,41 @@ export default {
} }
} }
} }
.legend-item__label {
position: relative;
}
.legend-item__label::before {
content: "";
position: absolute;
width: 12px;
height: 12px;
background: #ccc;
border-radius: 2px;
top: 6px;
left: -18px;
}
.legend-item:nth-child(2) .legend-item__label::before {
background: #12fff5;
}
.legend-item:nth-child(2) .legend-item__value {
color: #12fff5;
}
.legend-item:nth-child(1) .legend-item__label::before {
background: #0f65ff;
}
.legend-item:nth-child(1) .legend-item__value {
color: #0f65ff;
}
.legend-item:nth-child(3) .legend-item__label::before {
background: #003982;
}
.legend-item__value { .legend-item__value {
font-size: 24px;
font-weight: 600;
} }
} }
</style> </style>

View File

@@ -1,8 +1,8 @@
<!-- <!--
filename: DoubleRingChart.vue filename: DoubleRingChart.vue
author: liubin author: liubin
date: 2024-04-17 11:01:55 date: 2024-04-17 11:01:55
description: description:
--> -->
<template> <template>
@@ -132,19 +132,19 @@ function calculateItems(period, valueTuple) {
case "日": case "日":
items = [ items = [
{ label: `${month}${today}日累计`, value: valueTuple[1] }, { label: `${month}${today}日累计`, value: valueTuple[1] },
{ label: `${month}${today}日累计`, value: valueTuple[0] }, { label: `${year-1}${month}${today}日累计`, value: valueTuple[0] },
]; ];
break; break;
case "周": case "周":
items = [ items = [
{ label: `本周累计`, value: valueTuple[1] }, { label: `本周累计`, value: valueTuple[1] },
{ label: `年本周累计`, value: valueTuple[0] }, { label: `${year-1}年本周累计`, value: valueTuple[0] },
]; ];
break; break;
case "月": case "月":
items = [ items = [
{ label: `${month}月累计`, value: valueTuple[1] }, { label: `${month}月累计`, value: valueTuple[1] },
{ label: `${month}月累计`, value: valueTuple[0] }, { label: `${year-1}${month}月累计`, value: valueTuple[0] },
{ label: `${month}月目标`, value: valueTuple[2] }, { label: `${month}月目标`, value: valueTuple[2] },
]; ];
break; break;

View File

@@ -6,7 +6,7 @@
--> -->
<template> <template>
<div class="progress-bar" :data-title="titleYear" :data-rate="number"> <div class="progress-bar" :data-title="title" :data-rate="current + '%'">
<div class="progress-bar__rate" :style="{ width: dataRate == '-' ? 0 : dataRate }"></div> <div class="progress-bar__rate" :style="{ width: dataRate == '-' ? 0 : dataRate }"></div>
</div> </div>
</template> </template>
@@ -24,48 +24,38 @@ export default {
type: Number, type: Number,
default: 0, default: 0,
}, },
goodNumber: { previous: {
type: Number, type: Number,
default:0 default: 0,
}, },
componentYield: { current: {
type: Number, type: Number,
default:0 default: 0,
},
period: {
type: String,
default:'日',
}, },
// total: {
// type: Number,
// default: 0,
// },
title: { title: {
type: String, type: String,
default: "", default: "",
}, },
city: {
type: String,
default:""
}
}, },
data() { data() {
return { return {};
number: 0,
titleYear:'',
};
}, },
computed: { computed: {
dataRate() { dataRate() {
if ((this.period === '年' || this.period === '月') && this.target != 0) { // if (this.current != 0 && this.target != 0) {
// console.log(this.componentYield) console.log( '1111111111', this.current, this.target,this.previous);
this.titleYear = this.title + ' ' + `${(this.target * 100).toFixed(0)}%` return this.current == 0 && this.target == 0
} else { ? 0
this.titleYear = this.title : this.current != 0 && this.target != 0
} ? `${((this.current / this.target) * 100).toFixed(2)}%`
this.number = this.value == 0 : this.current != 0 && this.target == 0 && this.current >= 100 ? 100 + '%' : this.current != 0 && this.target == 0 && this.current < 100 ? parseFloat(this.current).toFixed(2) + '%' : 0 + '%'
? "-" // } else if(this.previous != 0) {
: `${(this.value * 100).toFixed(0)}%` // return this.previous + '%'
// console.log(this.period) // }
return this.value == 0
? "-"
: this.value >1 ? 100 + '%' :`${(this.value * 100).toFixed(0)}%`
}, },
}, },
methods: {}, methods: {},
@@ -83,7 +73,7 @@ export default {
&:before { &:before {
content: attr(data-title); content: attr(data-title);
display: inline-block; display: inline-block;
color: #fff; color:rgba(223,241,254,.8);
position: absolute; position: absolute;
bottom: -200%; bottom: -200%;
font-size: 12px; font-size: 12px;
@@ -92,10 +82,10 @@ export default {
&:after { &:after {
content: attr(data-rate); content: attr(data-rate);
display: inline-block; display: inline-block;
color: #fff; color: rgba(223, 241, 254, .8);
position: absolute; position: absolute;
bottom: -200%; bottom: -200%;
right: 10px; right: 0;
font-size: 12px; font-size: 12px;
} }
@@ -104,6 +94,7 @@ export default {
color: #11eae3; color: #11eae3;
} }
} }
&:nth-child(2) { &:nth-child(2) {
&:after { &:after {
color: #0e65fd; color: #0e65fd;
@@ -116,17 +107,20 @@ export default {
height: 100%; height: 100%;
width: 0; width: 0;
border-radius: 4px; border-radius: 4px;
background: linear-gradient(to right,
#004c5e11 10%,
#004c5e,
#0ac0c0,
#11eae3);
} }
&:first-child { &:first-child {
.progress-bar__rate { .progress-bar__rate {
background: linear-gradient( background: linear-gradient(to right,
to right, #004c5e11 10%,
#004c5e11 10%, #004c5e,
#004c5e, #0ac0c0,
#0ac0c0, #11eae3);
#11eae3
);
} }
} }

View File

@@ -1,7 +1,7 @@
<!-- <!--
* @Author: zhp * @Author: zhp
* @Date: 2024-05-07 10:25:10 * @Date: 2024-05-07 10:25:10
* @LastEditTime: 2024-05-20 09:46:19 * @LastEditTime: 2024-07-09 15:04:24
* @LastEditors: zhp * @LastEditors: zhp
* @Description: * @Description:
--> -->
@@ -10,29 +10,31 @@
<div v-if="period == '日'" class="std-rate-item"> <div v-if="period == '日'" class="std-rate-item">
<CityName :value="city.name" /> <CityName :value="city.name" />
<div class="std-rate-item__value"> <div class="std-rate-item__value">
<ProgressBar :period="period" :title="title" :value="city.current" /> <ProgressBar :period="period" :title="title" :target="city.target" :current="city.current" />
<!-- <ProgressBar title="24年累计" :total="city.target" :value="city.thisYear" /> --> <preProgressBar :period="period" :title="titlePre" :previous="city.previous" />
</div> </div>
</div> </div>
<div v-else-if="period == '周'" class="std-rate-item"> <div v-else-if="period == '周'" class="std-rate-item">
<CityName :value="city.name" /> <CityName :value="city.name" />
<div class="std-rate-item__value"> <div class="std-rate-item__value">
<ProgressBar :period="period" :title="title" :value="city.current" /> <ProgressBar :period="period" :title="title" :target="city.target" :current="city.current" />
<!-- <ProgressBar title="24年累计" :total="city.target" :value="city.thisYear" /> --> <preProgressBar :period="period" :title="titlePre" :previous="city.previous" />
</div> </div>
</div> </div>
<div v-else-if="period == '月'" class="std-rate-item"> <div v-else-if="period == '月'" class="std-rate-item">
<CityName :value="city.name" /> <CityName :value="city.name" />
<div class="std-rate-item__value"> <div class="std-rate-item__value">
<ProgressBar :period="period" :title="titleEnd" :target="city.target" :value="city.current" /> <ProgressBar :period="period" :title="titleTarget" :target="city.target" :current="city.current" />
<ProgressBar :period="period" :title="title" :value="city.previous" /> <preProgressBar :period="period" :title="titlePre" :previous="city.previous" />
<!-- <ProgressBar :period="period" :title="title" :value="city.current" /> -->
</div> </div>
</div> </div>
<div v-else="period == '年'" class="std-rate-item"> <div v-else="period == '年'" class="std-rate-item">
<CityName :value="city.name" /> <CityName :value="city.name" />
<div class="std-rate-item__value"> <div class="std-rate-item__value">
<ProgressBar :period="period" :title="titleEnd" :target="city.target" :value="city.current" /> <ProgressBar :period="period" :title="titleTarget" :target="city.target" :current="city.current" />
<ProgressBar :period="period" :title="title" :value="city.previous" /> <preProgressBar :period="period" :title="titlePre" :previous="city.previous" />
<!-- <ProgressBar :period="period" :title="title" :value="city.current" /> -->
</div> </div>
</div> </div>
</template> </template>
@@ -40,10 +42,12 @@
<script> <script>
import CityName from "./CityName.vue"; import CityName from "./CityName.vue";
import ProgressBar from "./ProgressBar.vue"; import ProgressBar from "./ProgressBar.vue";
import preProgressBar from "./preProgressBar.vue";
export default { export default {
name: "StdRateItem", name: "StdRateItem",
components: { CityName, ProgressBar }, components: { CityName, ProgressBar, preProgressBar },
props: { props: {
city: { city: {
type: Object, type: Object,
@@ -52,7 +56,11 @@ export default {
period: { period: {
type: String, type: String,
default: "日", default: "日",
} },
than: {
type: String,
default: "同比",
},
}, },
data() { data() {
return { return {
@@ -60,44 +68,76 @@ export default {
}; };
}, },
computed: { computed: {
title() { titlePre() {
switch (this.period) { console.log(this.city);
case "日": var day1 = new Date();
return "今日" var day2 = new Date();
case "周": day1.setTime(day1.getTime() - 24 * 60 * 60 * 1000)
return "本周" day2.setTime(day2.getTime() - 48 * 60 * 60 * 1000)
case "月": var yesterday = (day1.getMonth() + 1) + "月" + day1.getDate()
const year = new Date().getFullYear(); var dayBeYes = (day2.getMonth() + 1) + "月" + day2.getDate()
const month = new Date().getMonth() + 1; const today = new Date().getDate();
return `${year - 1}${month}月累计` const month = new Date().getMonth() + 1;
case "年": { const lastMonth = new Date().getMonth() + 1 === 12 ? 1 : new Date().getMonth() + 1 - 1;
const year = new Date().getFullYear(); const year = new Date().getFullYear();
// return [ if (this.period === '日' && this.than === '同比') {
return `${year - 1}累计` return `${year - 1}${yesterday}`
// ]; } else if (this.period === '日' && this.than === '环比') {
} return `${dayBeYes}`
default: } else if (this.period === '周' && this.than === '同比') {
return "今日" return `${year-1}年本周`
} else if (this.period === '周' && this.than === '环比') {
return `上周`
} else if (this.period === '月' && this.than === '同比') {
return `${year-1}${month}`
} else if (this.period === '月' && this.than === '环比') {
return `${lastMonth}`
} else {
return `${year - 1}`
} }
}, },
titleEnd() { title() {
switch (this.period) { var day1 = new Date();
// case "日": var day2 = new Date();
// return "今日" day1.setTime(day1.getTime() - 24 * 60 * 60 * 1000)
// case "周": day2.setTime(day2.getTime() - 48 * 60 * 60 * 1000)
// return "本周" var yesterday = (day1.getMonth() + 1) + "月" + day1.getDate()
case "月": var dayBeYes = (day2.getMonth() + 1) + "月" + day2.getDate()
const year = new Date().getFullYear(); const today = new Date().getDate();
const month = new Date().getMonth() + 1; const month = new Date().getMonth() + 1;
return `${year}${month}月目标` const year = new Date().getFullYear();
case "年": { if (this.period === '日' && this.than === '同比') {
const year = new Date().getFullYear(); return `${yesterday}`
// return [ } else if (this.period === '日' && this.than === '环比') {
return `${year}年目标` return `${yesterday}`
// ]; } else if (this.period === '周' && this.than === '同比') {
} return `本周`
} else if (this.period === '周' && this.than === '环比') {
return `本周`
} else if (this.period === '月' && this.than === '同比') {
return `${month}`
} else if (this.period === '月' && this.than === '环比') {
return `${month}`
} else {
return `${year}`
} }
} },
titleTarget() {
var day1 = new Date();
day1.setTime(day1.getTime() - 24 * 60 * 60 * 1000);
const today = new Date().getDate();
const month = new Date().getMonth() + 1;
const year = new Date().getFullYear();
if (this.period === '月') {
return `${month}月目标${this.city.target}%`
} else if (this.period === '年') {
return `${year}年目标${this.city.target}%`
} else if (this.period === '周') {
return `本周目标${this.city.target}%`
} else if (this.period === '日') {
return `${month}${today}日目标${this.city.target}%`
}
},
}, },
}; };
</script> </script>
@@ -110,7 +150,7 @@ export default {
align-items: center; align-items: center;
gap: 8px; gap: 8px;
flex: 1 1 auto; flex: 1 1 auto;
padding: 12px; padding: 16px;
} }
.std-rate-item__value { .std-rate-item__value {

View File

@@ -0,0 +1,132 @@
<!--
* @Author: zhp
* @Date: 2024-06-27 09:12:54
* @LastEditTime: 2024-07-22 17:03:48
* @LastEditors: zhp
* @Description:
-->
<template>
<div class="progress-bar" :data-title="title" :data-rate="previous + '%'">
<div class="progress-bar__rate" :style="{ width: dataRate == '-' ? 0 : dataRate }"></div>
</div>
</template>
<script>
export default {
name: "ProgressBar",
components: {},
props: {
value: {
type: Number,
default: 0,
},
target: {
type: Number,
default: 0,
},
previous: {
type: Number,
default: 0,
},
current: {
type: Number,
default: 0,
},
// total: {
// type: Number,
// default: 0,
// },
title: {
type: String,
default: "",
},
},
data() {
return {};
},
computed: {
dataRate() {
// if (this.current != 0 && this.target != 0) {
// console.log( '1111111111', this.current, this.target,this.previous);
return this.previous >= 100 ? 100 + '%' : parseFloat(this.previous).toFixed(2) + '%';
// } else if(this.previous != 0) {
// return this.previous + '%'
// }
},
},
methods: {},
};
</script>
<style scoped lang="scss">
.progress-bar {
height: 10px;
background-color: #002f6b;
border-radius: 4px;
margin-bottom: 12px;
position: relative;
&:before {
content: attr(data-title);
display: inline-block;
color: rgba(223, 241, 254, .8);
position: absolute;
bottom: -200%;
font-size: 12px;
}
&:after {
content: attr(data-rate);
display: inline-block;
color: rgba(223, 241, 254, .8);
position: absolute;
bottom: -200%;
right: 0;
font-size: 12px;
}
&:first-child {
&:after {
color: #11eae3;
}
}
&:nth-child(2) {
&:after {
color: #0e65fd;
}
}
.progress-bar__rate {
position: absolute;
display: inline-block;
height: 100%;
width: 0;
border-radius: 4px;
background: linear-gradient(to right,
#004c5e11 10%,
#004c5e,
#0ac0c0,
#11eae3);
}
&:first-child {
.progress-bar__rate {
background: linear-gradient(to right,
#004c5e11 10%,
#004c5e,
#0ac0c0,
#11eae3);
}
}
&:nth-child(2) {
.progress-bar__rate {
background: linear-gradient(to right, #0048a811, #0048a8, #0e65fd);
}
}
}
</style>

View File

@@ -1,39 +1,48 @@
<!-- <!--
* @Author: zhp * @Author: zhp
* @Date: 2024-05-07 10:04:53 * @Date: 2024-05-07 10:04:53
* @LastEditTime: 2024-05-17 17:05:36 * @LastEditTime: 2024-07-09 15:16:43
* @LastEditors: zhp * @LastEditors: zhp
* @Description: * @Description:
--> -->
<template> <template>
<div class="efficiency-copilot"> <div class="efficiency-copilot">
<Container title="芯片良率" icon="chip2"> <section class="top flex">
<ChipRate :period="period" /> <Container title="芯片良率" icon="chip2">
</Container> <ChipRate :period="period" :than="than" />
<Container title="标准组件良率" icon="std"> </Container>
<StdRate :period="period" /> <left-container title="标准组件良率" icon="std">
</Container> <StdRate :period="period" :than="than" />
<Container title="芯片OEE" icon="chip"> </left-container>
<ChipOee :period="period" /> </section>
</Container> <section class="bottom flex">
<Container title="转化效率" icon="cube"> <Container title="芯片OEE" icon="chip">
<TransformRate :period="period" /> <ChipOee :chipOeeRate="chipOeeRate" :period="period" :than="than" />
</Container> </Container>
<left-container title="转化效率" icon="cube">
<TransformRate :transformRate="transformRate" :period="period" :than="than" />
</left-container>
</section>
</div> </div>
</template> </template>
<script> <script>
import Container from "@/views/copilot/components/Container.vue"; import Container from "@/views/copilot/components/efficiencyRightContainer.vue";
import leftContainer from "@/views/copilot/components/efficiencyLeftContainer.vue";
import ChipOeeVue from "./components/ChipOee.vue"; import ChipOeeVue from "./components/ChipOee.vue";
import ChipRateVue from "./components/ChipRate.vue"; import ChipRateVue from "./components/ChipRate.vue";
import StdRateVue from "./components/StdRate.vue"; import StdRateVue from "./components/StdRate.vue";
import TransformRateVue from "./components/TransformRate.vue"; import TransformRateVue from "./components/TransformRate.vue";
export default { export default {
name: "EfficiencyCopilot", name: "efficiencyCopilot",
components: { components: {
Container, Container,
leftContainer,
ChipOee: ChipOeeVue, ChipOee: ChipOeeVue,
ChipRate: ChipRateVue, ChipRate: ChipRateVue,
StdRate: StdRateVue, StdRate: StdRateVue,
@@ -44,31 +53,74 @@ export default {
type: String, type: String,
default: "日", default: "日",
}, },
than: {
type: String,
default: "同比",
},
}, },
data() { data() {
return {}; return {
chipOeeRate: {},
transformRate:{}
};
}, },
watch: { watch: {
period: { period: {
handler(val) { handler(val) {
val && this.fetchData(val); val && this.fetchData(val,this.than);
},
immediate: true,
},
than: {
handler(val) {
console.log(val)
val && this.fetchData(this.period, val);
}, },
immediate: true, immediate: true,
}, },
}, },
methods: { methods: {
fetchData(period = "日") { fetchData(period = "日",than) {
console.log(`效率驾驶舱,获取${period}数据`); console.log(`效率驾驶舱,获取${period}数据`);
this.$store.dispatch("copilot/initCopilot", { this.$store.dispatch("copilot/initCopilot", {
period, period,
source: "efficiency", source: "efficiency",
}); than
}).then(() => {
this.$nextTick(() => {
this.chipOeeRate = this.$store.getters.copilot.efficiency.chipOeeRate
this.transformRate = this.$store.getters.copilot.efficiency.transformRate
})
})
}, },
}, },
}; };
</script> </script>
<style scoped> <style scoped>
.efficiency-copilot {
flex: 1;
display: flex;
flex-direction: column;
gap: 20px;
}
.flex {
display: flex;
gap: 20px;
flex: 1;
}
.top > div,
.bottom > div {
height: 100%;
}
</style>
<!-- <style scoped>
.efficiency-copilot { .efficiency-copilot {
flex: 1; flex: 1;
display: grid; display: grid;
@@ -80,4 +132,4 @@ export default {
.efficiency-copilot > div { .efficiency-copilot > div {
height: 100%; height: 100%;
} }
</style> </style> -->

View File

@@ -1,163 +1,187 @@
export default function ({ export default ({
single = false,
color,
titleValue, titleValue,
subtitle, subtitle,
titleSize,
subtitleSize,
previousSum, previousSum,
currentSum, currentSum,
targetSum, targetSum,
}) { currentName,
return { preName,
grid: { yesterday,
left: 0, }) => ({
right: 0, grid: {
bottom: 0, left: 300,
top: 0, right: 0,
containLabel: true, bottom: 0,
top: 0,
containLabel: true,
},
tooltip: {
trigger: "item",
extraCssText: 'box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.38); border- radius: 4px;opacity: 0.6;backdrop- filter: blur(6px);',
backgroundColor: '#001829',
borderColor: '#001829',
},
title: {
text: titleValue,
left: "48%",
top: "middle",
textAlign: "center",
textVerticalAlign:'auto',
textStyle: {
fontWeight: 400,
fontSize: titleSize,
color: "rgba(223,241,254,1)",
}, },
tooltip: { subtext: `\u2002${yesterday + '日良率'}\u2002`,
// formatter(params) { subtextStyle: {
// return `${params.name}: ${(params.value * 100).toFixed(0)}%`; fontSize: subtitleSize,
// } fontWeight: 100,
color: "rgba(255,255,255,.7)",
align: "right",
}, },
title: { },
text: titleValue, series: [
left: "49%", // 背景 series
top: "39%", {
textAlign: "center", type: "pie",
textStyle: { name: "当前良率",
fontWeight: 600, radius: ["80%", "92%"],
fontSize: 32, center: ["50%", "50%"],
color: "#fffd", emptyCircleStyle: {
}, color: "#003982",
subtext: `\u2002${subtitle}\u2002`,
subtextStyle: {
fontSize: 14,
fontWeight: 100,
color: "#fffd",
align: "right",
}, },
}, },
series: [ // 数据 series
// 背景 series {
{ type: "pie",
type: "pie", radius: ["80%", "92%"],
name: "当前目标", center: ["50%", "50%"],
radius: ["70%", "85%"], avoidLabelOvervlap: false,
center: ["50%", "52%"], label: {
emptyCircleStyle: { show: false,
color: "#040c5f45",
},
}, },
// 数据 series labelLine: {
{ show: false,
type: "pie",
radius: ["70%", "85%"],
center: ["50%", "52%"],
avoidLabelOvervlap: false,
label: {
show: false,
},
labelLine: {
show: false,
},
data: [
{
value: currentSum,
name: "当前良率",
selected: false,
itemStyle: {
borderJoin: "round",
borderCap: "round",
borderWidth: 12,
borderRadius: "50%",
color: {
type: "linear",
x: 1,
y: 0,
x2: 0,
y2: 1,
colorStops: single
? [
{ offset: 0, color: `${color}11` },
{ offset: 1, color: `${color}` },
]
: [
{ offset: 0, color: "#4CF0E811" },
{ offset: 1, color: "#4CF0E8" },
],
},
},
},
{
value:
targetSum > currentSum
? targetSum - currentSum
: targetSum == 0
? currentSum == 0
? 1
: 0
: targetSum,
name: "未达成",
itemStyle: { color: "transparent" },
label: { show: false },
},
],
}, },
// 数据 series2 - 2023累计 data: [
single {
? null value: currentSum,
: { name: currentName,
type: "pie", tooltip: {
radius: ["55%", "70%"], backgroundColor: 'rgba(0,0,0,0)', // tooltip默认背景为白色手动置为透明
center: ["50%", "52%"], extraCssText: 'padding:0;border-width:0',
avoidLabelOvervlap: false, formatter:`
label: { <div style="padding: 12px 16px;background:rgba(0,24,41,.5);box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.38);backdrop-filter: blur(10px);">
show: false, <span style='display:inline-block;margin-right:4px;border-radius:2px;width:12px;height:12px;background-color:#4CF0E8'></span>
}, <span style='display:inline-block;width:150px;color:rgba(255,255,255,0855);font-size:16px;'>${currentName}</span>
labelLine: { <span style='color:rgba(255,255,255,0.65);font-size:16px;'>${currentSum}</span>
show: false, </div>
}, `
data: [
{
value: previousSum,
name: "上期良率",
selected: false,
itemStyle: {
borderJoin: "round",
borderCap: "round",
borderWidth: 12,
borderRadius: "50%",
color: {
type: "linear",
x: 1,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{ offset: 0, color: "#1065ff66" },
{ offset: 1, color: "#1065ff" },
],
},
},
},
{
value:
targetSum > previousSum
? targetSum - previousSum
: previousSum == 0
? 1
: 0,
name: "-",
formatter: {
show: false
},
itemStyle: { color: "transparent" },
label: { show: false },
},
],
}, },
], selected: false,
}; itemStyle: {
} borderJoin: "round",
borderCap: "round",
borderWidth: 12,
borderRadius: "50%",
color: {
type: "linear",
x: 1,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{ offset: 0, color: "#4CF0E811" },
{ offset: 1, color: "#4CF0E8" },
],
},
},
},
{
value:(targetSum - currentSum) === 0 ? 1 : (targetSum - currentSum),
name: currentName,
tooltip: {
backgroundColor: 'rgba(0,0,0,0)', // tooltip默认背景为白色手动置为透明
extraCssText: 'padding:0;border-width:0',
formatter:`
<div style="padding: 12px 16px;background:rgba(0,24,41,.5);box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.38);backdrop-filter: blur(10px);">
<span style='display:inline-block;margin-right:4px;border-radius:2px;width:12px;height:12px;background-color:#4CF0E8'></span>
<span style='display:inline-block;width:150px;color:rgba(255,255,255,0855);font-size:16px;'>${currentName}</span>
<span style='color:rgba(255,255,255,0.65);font-size:16px;'>${currentSum}</span>
</div>
`
},
itemStyle: { color: "transparent" },
label: { show: false },
},
],
},
// 数据 series2 - 2023累计
{
type: "pie",
radius: ["70%", "80%"],
center: ["50%", "50%"],
avoidLabelOvervlap: false,
label: {
show: false,
},
labelLine: {
show: false,
},
data: [
{
value: previousSum,
name: preName,
tooltip: {
backgroundColor: 'rgba(0,0,0,0)', // tooltip默认背景为白色手动置为透明
extraCssText: 'padding:0;border-width:0',
formatter:`
<div style="padding: 12px 16px;background:rgba(0,24,41,.5);box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.38);backdrop-filter: blur(10px);">
<span style='display:inline-block;margin-right:4px;border-radius:2px;width:12px;height:12px;background-color:#1065ff'></span>
<span style='display:inline-block;width:150px;color:rgba(255,255,255,0855);font-size:16px;'>${preName}</span>
<span style='color:rgba(255,255,255,0.65);font-size:16px;'>${previousSum}</span>
</div>
`
},
selected: false,
itemStyle: {
borderJoin: "round",
borderCap: "round",
borderWidth: 12,
borderRadius: "50%",
color: {
type: "linear",
x: 1,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{ offset: 0, color: "#1065ff66" },
{ offset: 1, color: "#1065ff" },
],
},
},
},
{
value:previousSum === 0 ? 1 : 0,
name: preName,
tooltip: {
backgroundColor: 'rgba(0,0,0,0)', // tooltip默认背景为白色手动置为透明
extraCssText: 'padding:0;border-width:0',
formatter:`
<div style="padding: 12px 16px;background:rgba(0,24,41,.5);box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.38);backdrop-filter: blur(10px);">
<span style='display:inline-block;margin-right:4px;border-radius:2px;width:12px;height:12px;background-color:#1065ff'></span>
<span style='display:inline-block;width:150px;color:rgba(255,255,255,0855);font-size:16px;'>${preName}</span>
<span style='color:rgba(255,255,255,0.65);font-size:16px;'>${previousSum}</span>
</div>
`
},
itemStyle: { color: "transparent" },
label: { show: false },
},
],
},
],
});

View File

@@ -6,7 +6,7 @@ export default ({
targetSum, targetSum,
}) => ({ }) => ({
grid: { grid: {
left: 0, left: '50%',
right: 0, right: 0,
bottom: 0, bottom: 0,
top: 0, top: 0,

View File

@@ -0,0 +1,132 @@
<!--
* @Author: zhp
* @Date: 2024-05-20 16:04:18
* @LastEditTime: 2024-06-03 16:46:11
* @LastEditors: zhp
* @Description:
-->
<template>
<!-- <div class="copilot-layout" ref="copilot-layout"> -->
<div class="copilot-layout" ref="copilot-layout">
<CopilotHeaderVue :than="than" :active="page" :period="period" @update:active="updateActive"
@update:period="period = $event" @update:than="updateThan" />
<!-- <YieldCopilot v-if="page == '产量'" :period="period" /> -->
<!-- <EnergyCopilot v-if="page == '综合'" :period="period" /> -->
<EfficiencyCopilot :period="period" :than="than" />
<div class="copilot-footer">© 中建材智能自动化研究院有限公司</div>
</div>
</template>
<script>
import CopilotHeaderVue from "./components/CopilotHeader.vue";
// import YieldCopilot from "./yield/index.vue";
// import EnergyCopilot from "./energy/index.vue";
import EfficiencyCopilot from "./efficiency/index.vue";
export default {
name: "copilotEfficiencyContainer",
components: {
CopilotHeaderVue,
EfficiencyCopilot,
},
data() {
return {
than:'同比',
page: "效率",
period: "月",
currentsStyles: '',
};
},
methods: {
updateThan(val) {
console.log(val);
this.than = val;
// this.getMes();
},
updateActive(val, oldVal) {
console.log(val)
if (val === '效率') {
this.$router.push({
path: 'efficiency-container',
query: {
name: '效率'
}
})
// this.page = oldVal
} else if (val === '产量') {
this.$router.push({
path: 'main',
query: {
name: '产量'
}
})
// this.page = oldVal
}
}
},
// mounted() {
// this.page = this.$route.query.name
// },
// watch: {
// page(val) {
// if (val === '产量') {
// console.log(val)
// this.currentsStyles =
// 'height: calc(100% + 38px)'
// console.log(this.currentsStyles)
// } else {
// console.log(val)
// this.currentsStyles = 'height:100%+38px'
// console.log(this.currentsStyles)
// }
// immediate: true
// }
// }
// mounted() {
// document.body.style.minHeight = "1024px";
// document.body.style.minWidth = "1550px";
// },
// destroyed() {
// document.body.style.minHeight = "1024px";
// document.body.style.minWidth = "1550px";
// },
};
</script>
<style>
.copilot-layout {
padding: 16px;
background: url(../../assets/images/copilot-bg.png) 0 0 / 100% 100% no-repeat;
position: absolute;
left: -16px;
/* top: -8px; */
height: calc(100% + 30px);
width: calc(100% + 30px);
z-index: 1001;
color: #fff;
display: flex;
flex-direction: column;
gap: 8px;
}
/* .produce{
height: calc(100% + 38px);
} */
/* .other { */
/* height: calc(100% + 240px); */
/* } */
.copilot-footer {
/** position: absolute;
bottom: 10px; **/
height: 10px;
width: 100%;
color: rgb(80, 80, 80);
user-select: none;
font-size: 14px;
letter-spacing: 1px;
display: grid;
place-content: center;
}
</style>

View File

@@ -0,0 +1,218 @@
<template>
<div class="factory-layout">
<FactoryDataHeader :companyName="companyName" :companyId="companyId" :period="period"
@update:period="updatePeriod" />
<div class="factory-section">
<section class="top flex">
<db-container title="生产监控" icon="prod" @update:than="updateThan" :than="than">
<prod-monitor :companyId="companyId" :factoryData="factoryData" :than="than" :period="period" :data="data"
:prodOutPut="prodOutPut" :prodFto="prodFto" :showBipv="show" />
</db-container>
<left-container title="工单监控" icon="order">
<order :prodOrder="prodOrder" />
</left-container>
<!-- <db-container title="" icon="store"> -->
<!-- <store :stock="stock" /> -->
<!-- </db-container> -->
</section>
<!-- <section class="bottom flex"> -->
<!-- <db-container title="" icon="energy"> -->
<!-- <energy :legend="energyLegend" :energyCockpits="energyCockpits" /> -->
<!-- </db-container> -->
<!-- </section> -->
</div>
<div class="factory-footer">© 中建材智能自动化研究院有限公司</div>
</div>
</template>
<script>
import FactoryDataHeader from "./../components/FactoryDataHeader.vue";
import Container from "./components/rightContainer.vue";
import leftContainer from "./components/leftContainer.vue";
import ProdMonitor from "./components/bipvProdMonitor.vue";
import { deepClone } from "@/utils";
// import Store from "./components/Store.vue";
// import Energy from "./components/Energy.vue";
import Order from "./components/Order.vue";
import { cockpitDataMonitor } from "@/api/produceData";
export default {
name: "factoryData",
components: {
FactoryDataHeader,
DbContainer: Container,
LeftContainer: leftContainer,
ProdMonitor,
// Store,
// Energy,
Order,
},
data() {
return {
companyId: 6,
companyName: "蚌埠中建材光电材料有限公司",
period: 1,
show: false,
than: '同比',
data: {},
// 接口获取的数据
prodOutPut: [], //生产
prodFto: [], //生产
stock: {}, //仓库
factoryData: {
preDataDetail: [],
currentDataDetail: {},
targetDataDetail: [],
},
energyCockpits: [], //能源
prodOrder: [], //订单
energyLegend: [
{ label: "电", color: "#FFD160" },
{ label: "水", color: "#2760FF" },
{ label: "气", color: "#12FFF5" },
],
};
},
mounted() {
this.getMes();
},
methods: {
updateCompany(obj) {
this.companyId = obj.companyId;
this.companyName = obj.companyName;
this.getMes();
},
updateThan(val) {
console.log(val);
this.than = val;
// this.getMes();
},
updatePeriod(val) {
this.period = val;
this.getMes();
},
getMes() {
cockpitDataMonitor({
factorys: [this.companyId],
date: this.period,
mode: this.than === '同比' ? 0 : 1
}).then((res) => {
console.log(res);
this.prodOutPut = res.data.prodOutputMonitorShDO || [];
this.prodFto = res.data.prodOutputFtoDO || [];
this.prodOrder = res.data.prodWorkOrderDO || [];
let prodOutputFtoListRes = res.data.prodOutputFtoDO || [];
let preFtoData = res.data.previousProdOutputFtoDO || [];
let preData = res.data.previousProdOutputMonitorShDO || [];
let factoryListResponse = res.data.prodOutputMonitorShDO || [];
let targetListResponse = res.data.prodTargetMonitorDO || [];
let preDataDetail = []
let currentDataDetail = []
let targetDataDetail = []
if (prodOutputFtoListRes) {
for (const factory of prodOutputFtoListRes) {
console.log(factory);
currentDataDetail[0] = factory.chipInput
}
}
if (preFtoData) {
for (const factory of preFtoData) {
console.log(factory);
// const fId = this.getPreFactoryId(factory);
// const preFId = getPreFactoryId(factory);
// if (fId) {
preDataDetail[0] = factory.previousYearChipInput
// }
// if (preFId) {
// ftoInvest.previous[fId] = factory.previousYearChipInput;
// }
}
}
if (preData && preData[0] != null) {
for (const factory of preData) {
if (factory.previousGlassType === 0) {
preDataDetail[1] = factory.previousYearOutputNumber
} else if (factory.previousGlassType === 1) {
preDataDetail[2] = factory.previousYearOutputNumber
} else if (factory.previousYearOutputNumber === 2) {
currentDataDetail[3] = factory.outputNumber
}
}
}
if (targetListResponse && targetListResponse[0] != null) {
for (const factory of targetListResponse) {
targetDataDetail[0] = factory.ftoInput
// if (factory.previousGlassType === 0) {
targetDataDetail[1] = factory.chipYield
// } else if (factory.previousGlassType === 1) {
targetDataDetail[2] = factory.componentYield
targetDataDetail[3] = factory.bipvProductoutput
// }
}
}
// console.log('ftoInvest',ftoInvest)
if (factoryListResponse && factoryListResponse[0] != null) {
for (const factory of factoryListResponse) {
// targetDataDetail[0] = factory.ftoInput
if (factory.glassType === 0) {
currentDataDetail[1] = factory.outputNumber
} else if (factory.glassType === 1) {
currentDataDetail[2] = factory.outputNumber
}else if (factory.glassType === 2) {
currentDataDetail[3] = factory.outputNumber
}
}
}
this.factoryData.preDataDetail = preDataDetail
this.factoryData.currentDataDetail = currentDataDetail
this.factoryData.targetDataDetail = targetDataDetail
});
},
},
};
</script>
<style lang="scss" scoped>
.factory-layout {
padding: 16px;
background: url(../../../assets/images/copilot-bg.png) 0 0 / 100% 100% no-repeat;
position: absolute;
height: calc(100% + 38px);
left: -16px;
top: -8px;
width: calc(100% + 30px);
z-index: 1001;
color: #fff;
display: flex;
flex-direction: column;
gap: 8px;
.factory-section {
flex: 1;
display: flex;
flex-direction: column;
gap: 16px;
.flex {
display: flex;
gap: 16px;
flex: 1;
}
.top>div,
.bottom>div {
height: 100%;
}
}
.factory-footer {
/** position: absolute;
bottom: 10px; **/
height: 10px;
width: 100%;
color: rgb(80, 80, 80);
user-select: none;
font-size: 14px;
letter-spacing: 1px;
display: grid;
place-content: center;
}
}
</style>

View File

@@ -0,0 +1,218 @@
<template>
<div class="factory-layout">
<FactoryDataHeader :than="than" :companyName="companyName" :companyId="companyId" :period="period"
@update:than="updateThan" @update:period="updatePeriod" />
<div class="factory-section">
<section class="top flex">
<db-container title="生产监控" icon="prod">
<prod-monitor :companyId="companyId" :factoryData="factoryData" :than="than" :period="period" :data="data"
:prodOutPut="prodOutPut" :prodFto="prodFto" :showBipv="show" />
</db-container>
<left-container title="工单监控" icon="order">
<order :prodOrder="prodOrder" />
</left-container>
<!-- <db-container title="" icon="store"> -->
<!-- <store :stock="stock" /> -->
<!-- </db-container> -->
</section>
<!-- <section class="bottom flex"> -->
<!-- <db-container title="" icon="energy"> -->
<!-- <energy :legend="energyLegend" :energyCockpits="energyCockpits" /> -->
<!-- </db-container> -->
<!-- </section> -->
</div>
<div class="factory-footer">© 中建材智能自动化研究院有限公司</div>
</div>
</template>
<script>
import FactoryDataHeader from "./../components/FactoryDataHeader.vue";
import Container from "./components/rightContainer.vue";
import leftContainer from "./components/leftContainer.vue";
import ProdMonitor from "./components/bipvProdMonitor";
import { deepClone } from "@/utils";
// import Store from "./components/Store.vue";
// import Energy from "./components/Energy.vue";
import Order from "./components/Order.vue";
import { cockpitDataMonitor } from "@/api/produceData";
export default {
name: "factoryData",
components: {
FactoryDataHeader,
DbContainer: Container,
LeftContainer: leftContainer,
ProdMonitor,
// Store,
// Energy,
Order,
},
data() {
return {
companyId: 4,
companyName: "成都中建材光电材料有限公司",
period: 1,
show: false,
than: '同比',
data: {},
// 接口获取的数据
prodOutPut: [], //生产
prodFto: [], //生产
stock: {}, //仓库
factoryData: {
preDataDetail: [],
currentDataDetail: {},
targetDataDetail: [],
},
energyCockpits: [], //能源
prodOrder: [], //订单
energyLegend: [
{ label: "电", color: "#FFD160" },
{ label: "水", color: "#2760FF" },
{ label: "气", color: "#12FFF5" },
],
};
},
mounted() {
this.getMes();
},
methods: {
updateCompany(obj) {
this.companyId = obj.companyId;
this.companyName = obj.companyName;
this.getMes();
},
updateThan(val) {
console.log(val);
this.than = val;
// this.getMes();
},
updatePeriod(val) {
this.period = val;
this.getMes();
},
getMes() {
cockpitDataMonitor({
factorys: [this.companyId],
date: this.period,
mode: this.than === '同比' ? 0 : 1
}).then((res) => {
console.log(res);
this.prodOutPut = res.data.prodOutputMonitorShDO || [];
this.prodFto = res.data.prodOutputFtoDO || [];
this.prodOrder = res.data.prodWorkOrderDO || [];
let prodOutputFtoListRes = res.data.prodOutputFtoDO || [];
let preFtoData = res.data.previousProdOutputFtoDO || [];
let preData = res.data.previousProdOutputMonitorShDO || [];
let factoryListResponse = res.data.prodOutputMonitorShDO || [];
let targetListResponse = res.data.prodTargetMonitorDO || [];
let preDataDetail = []
let currentDataDetail = []
let targetDataDetail = []
if (prodOutputFtoListRes) {
for (const factory of prodOutputFtoListRes) {
console.log(factory);
currentDataDetail[0] = factory.chipInput
}
}
if (preFtoData) {
for (const factory of preFtoData) {
console.log(factory);
// const fId = this.getPreFactoryId(factory);
// const preFId = getPreFactoryId(factory);
// if (fId) {
preDataDetail[0] = factory.previousYearChipInput
// }
// if (preFId) {
// ftoInvest.previous[fId] = factory.previousYearChipInput;
// }
}
}
if (preData && preData[0] != null) {
for (const factory of preData) {
if (factory.previousGlassType === 0) {
preDataDetail[1] = factory.previousYearOutputNumber
} else if (factory.previousGlassType === 1) {
preDataDetail[2] = factory.previousYearOutputNumber
} else if (factory.previousYearOutputNumber === 2) {
currentDataDetail[3] = factory.outputNumber
}
}
}
if (targetListResponse && targetListResponse[0] != null) {
for (const factory of targetListResponse) {
targetDataDetail[0] = factory.ftoInput
// if (factory.previousGlassType === 0) {
targetDataDetail[1] = factory.chipYield
// } else if (factory.previousGlassType === 1) {
targetDataDetail[2] = factory.componentYield
targetDataDetail[3] = factory.bipvProductoutput
// }
}
}
// console.log('ftoInvest',ftoInvest)
if (factoryListResponse && factoryListResponse[0] != null) {
for (const factory of factoryListResponse) {
// targetDataDetail[0] = factory.ftoInput
if (factory.glassType === 0) {
currentDataDetail[1] = factory.outputNumber
} else if (factory.glassType === 1) {
currentDataDetail[2] = factory.outputNumber
} else if (factory.glassType === 2) {
currentDataDetail[3] = factory.outputNumber
}
}
}
this.factoryData.preDataDetail = preDataDetail
this.factoryData.currentDataDetail = currentDataDetail
this.factoryData.targetDataDetail = targetDataDetail
});
},
},
};
</script>
<style lang="scss" scoped>
.factory-layout {
padding: 16px;
background: url(../../../assets/images/copilot-bg.png) 0 0 / 100% 100% no-repeat;
position: absolute;
height: calc(100% + 38px);
left: -16px;
top: -8px;
width: calc(100% + 30px);
z-index: 1001;
color: #fff;
display: flex;
flex-direction: column;
gap: 8px;
.factory-section {
flex: 1;
display: flex;
flex-direction: column;
gap: 16px;
.flex {
display: flex;
gap: 16px;
flex: 1;
}
.top>div,
.bottom>div {
height: 100%;
}
}
.factory-footer {
/** position: absolute;
bottom: 10px; **/
height: 10px;
width: 100%;
color: rgb(80, 80, 80);
user-select: none;
font-size: 14px;
letter-spacing: 1px;
display: grid;
place-content: center;
}
}
</style>

View File

@@ -0,0 +1,552 @@
<template>
<chart-container class="bar-chart-base">
<div class="left-chart-base">
<!-- <div class="legend">
<span v-for="item in legend" :key="item.label" class="legend-item"
:style="{ fontSize: isFullscreen ? '0.85vw' : '0.73vw' }">{{ item.label }}</span>
</div> -->
<div v-if="energyCockpits.length != 0" id="factoryEnergyChart" style="width: 100%; height: 100%"></div>
</div>
</chart-container>
</template>
<script>
import { debounce } from "@/utils/debounce";
import * as echarts from "echarts";
import ChartContainer from "../../components/ChartContainer.vue";
// import CopilotButton from "./chartButton"
export default {
components: {
ChartContainer
// CopilotButton,
},
name: "Energy",
props: {
// legend: {
// type: Array,
// required: true,
// },
type: {
type: String,
default:'目标产量'
},
energyCockpits: {
type: Array,
required: true,
},
},
data() {
return {
isFullscreen: false,
actualOptions: null,
chart: "",
data: [],
orderXAxis:[],
// obj:{
// seriesArr: [],
// targetProduceArr: [],
// planIn: [],
// acIn: [],
// acProduceArr: [],
// scrapNum: [],
// processNum: [],
// },
options: {
color: ["#FFD160", "#2760FF", "#12FFF5"],
grid: {
left: "9%",
right: "0%",
bottom: "15%",
top: "15%",
},
tooltip: {
trigger: "axis",
axisPointer: {
// type: "cross",
crossStyle: {
color: "rgba(237,237,237,0.5)",
},
},
backgroundColor: 'rgba(0,0,0,0)', // tooltip默认背景为白色手动置为透明
extraCssText: 'padding:0;border-width:0',
formatter: params => {
var res = ``;
for (var i = 0, l = params.length; i < l; i++) {
let color = Object.prototype.toString.call(params[i].color) == "[object String]" ? params[i].color : params[i].color.colorStops ? params[i].color.colorStops[0].color : ''
// console.log(item.color, color);
res +=
`<span style='border-radius:2px;display:inline-block;margin-right:4px;width:12px;height:12px;background-color:${color}'></span>` +
`<span style='display:inline-block;width:150px;color:rgba(255,255,255,0855);font-size:16px;letter-spacing: 2px;'>${params[0].axisValueLabel}</span>` +
`<span style='color:rgba(255,255,255,0.65);font-size:16px;letter-spacing: 2px;'>${params[i].value ? params[i].value : 0}</span>`;
}
const htmlContent = `
<div style="padding: 12px 16px;background:rgba(0,24,41,.5);box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.38);backdrop-filter: blur(10px);">
${res}
</div>
`;
return htmlContent;
// return res;
},
},
xAxis: {
axisTick: {
show: false,
},
axisLine: {
lineStyle: {
color: "#4561AE",
},
},
axisLabel: {
interval: 0,//设置横坐标为斜
rotate:45,
color: "rgba(223,241,254,.8)",
fontSize: 16,
// formatter: function (value) {
// console.log(value);
// return value;
// },
},
data: [],
},
// dataZoom: [
// {
// // show: true,
// start: 0,
// end: 50
// }
// ],
yAxis: {
type: "value",
name: "单位/片",
position: 'left',
nameTextStyle: {
color: "rgba(223,241,254,.8)",
fontSize: 16,
align: "right",
},
axisTick: {
show: false,
},
axisLabel: {
color: "rgba(223,241,254,.8)",
fontSize:16,
},
axisLine: {
show: true,
lineStyle: {
color: "#4561AE",
},
},
splitLine: {
lineStyle: {
color: "rgba(69,97,174,.4)",
},
},
},
series: [
// {
// name: "",
// data: [],
// type: "line",
// areaStyle: {
// color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
// { offset: 0, color: "#FFD160" + "80" },
// { offset: 0.5, color: "#FFD160" + "20" },
// { offset: 1, color: "#FFD160" + "00" },
// ]),
// },
// lineStyle: {
// width: 2,
// },
// symbol: "circle",
// symbolSize: 8,
// emphasis: {
// focus: "series",
// },
// },
// {
// name: "",
// data: [],
// type: "line",
// yAxisIndex: 1,
// areaStyle: {
// color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
// { offset: 0, color: "#2760FF" + "80" },
// { offset: 0.5, color: "#2760FF" + "20" },
// { offset: 1, color: "#2760FF" + "00" },
// ]),
// },
// lineStyle: {
// width: 2,
// },
// symbol: "circle",
// symbolSize: 8,
// emphasis: {
// focus: "series",
// },
// },
{
name: "",
data: [],
type: "bar",
// yAxisIndex: 1,
// areaStyle: {
// color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
// { offset: 0, color: "#12FFF5" + "80" },
// { offset: 0.5, color: "#12FFF5" + "20" },
// { offset: 1, color: "#12FFF5" + "00" },
// ]),
// },
barWidth: 16,
itemStyle: {
borderRadius: [10, 10, 0, 0],
color: {
type: "linear",
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: "#57abf8", // 0% 处的颜色
},
{
offset: 1,
color: "#364BFE66", // 100% 处的颜色
},
],
global: false, // 缺省为 false
},
},
symbol: "circle",
symbolSize: 8,
emphasis: {
focus: "series",
},
},
],
},
};
},
computed: {
isOpen() {
return this.$store.getters.sidebar.opened;
},
},
watch: {
type(val) {
this.initChart()
},
/** 全屏状态切换时,对柱子粗细和字体大小进行相应调整 */
// isFullscreen(val) {
// this.actualOptions.series.map((item) => {
// item.barWidth = val ? 18 : 16;
// });
// this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 16;
// this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 16;
// this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 16;
// this.initOptions(this.actualOptions);
// },
// series(val) {
// if (!val) {
// this.initOptions(this.options);
// return;
// }
// const actualOptions = JSON.parse(JSON.stringify(this.options));
// actualOptions.series[0].data = val[0].data;
// actualOptions.series[0].name = val[0].name;
// actualOptions.series[1].data = val[1].data;
// actualOptions.series[1].name = val[1].name;
// actualOptions.series[2].data = val[2].data;
// actualOptions.series[2].name = val[2].name;
// this.actualOptions = actualOptions;
// this.initOptions(actualOptions);
// },
// energyCockpits() {
// this.initChart();
// },
isOpen(val) {
this.canvasReset();
},
},
mounted() {
// if (screenfull.isEnabled) {
// screenfull.on("change", () => {
// this.isFullscreen = screenfull.isFullscreen;
// });
// }
this.canvasReset();
window.addEventListener("resize", this.canvasReset);
},
beforeDestroy() {
if (this.chart) {
this.chart.dispose();
}
},
destroyed() {
window.removeEventListener("resize", this.canvasReset);
},
methods: {
canvasReset() {
debounce(() => {
this.initChart();
}, 500)();
},
initChart() {
if (this.type === '目标产量') {
this.orderXAxis = []
this.data = []
if (this.energyCockpits) {
this.energyCockpits.forEach(ele => {
this.data.push(ele.targetProduction)
if (ele.workOrderNumber.length > 4) {
ele.workOrderNumber = ele.workOrderNumber.substring(0, 4) + "..";
}
this.orderXAxis.push(ele.workOrderNumber)
});
}
// this.initChart(targetProduceArr, orderXAxis)
} else if (this.type === '计划投入') {
this.orderXAxis = []
this.data = []
if (this.energyCockpits) {
this.energyCockpits.forEach(ele => {
this.data.push(ele.plannedInvestment)
if (ele.workOrderNumber.length > 4) {
ele.workOrderNumber = ele.workOrderNumber.substring(0, 4) + "..";
}
this.orderXAxis.push(ele.workOrderNumber)
});
}
} else if (this.type === '实际投入') {
this.orderXAxis = []
this.data = []
if (this.energyCockpits) {
this.energyCockpits.forEach(ele => {
this.data.push(ele.actualInvestment)
if (ele.workOrderNumber.length > 4) {
ele.workOrderNumber = ele.workOrderNumber.substring(0, 4) + "..";
}
this.orderXAxis.push(ele.workOrderNumber)
});
}
} else if (this.type === '实际产出') {
this.orderXAxis = []
this.data = []
if (this.energyCockpits) {
this.energyCockpits.forEach(ele => {
this.data.push(ele.actualProduction)
if (ele.workOrderNumber.length > 4) {
ele.workOrderNumber = ele.workOrderNumber.substring(0, 4) + "..";
}
this.orderXAxis.push(ele.workOrderNumber)
});
}
} else if (this.type === '废品数量') {
this.orderXAxis = []
this.data = []
if (this.energyCockpits) {
this.energyCockpits.forEach(ele => {
this.data.push(ele.wasteNum)
if (ele.workOrderNumber.length > 4) {
ele.workOrderNumber = ele.workOrderNumber.substring(0, 4) + "..";
}
this.orderXAxis.push(ele.workOrderNumber)
});
}
} else if (this.type === '待再加工') {
this.orderXAxis = []
this.data = []
if (this.energyCockpits) {
this.energyCockpits.forEach(ele => {
console.log(ele.reworkNum);
this.data.push(ele.reworkNum)
if (ele.workOrderNumber.length > 4) {
ele.workOrderNumber = ele.workOrderNumber.substring(0, 4) + "..";
}
this.orderXAxis.push(ele.workOrderNumber)
});
}
}
// let seriesArr = [
// {
// name: "水",
// energyType: 1,
// data: [],
// },
// {
// name: "电",
// energyType: 2,
// data: [],
// },
// {
// name: "气",
// energyType: 3,
// data: [],
// },
// ];
// if (this.energyCockpits.length > 0) {
// let dataArr = this.energyCockpits.map((item) => {
// return item.groupName;
// });
// energyxAxis = Array.from(new Set(dataArr));
// n = energyxAxis.length;
// seriesArr[0].data = Array.from({ length: n }, () => 0);
// seriesArr[1].data = Array.from({ length: n }, () => 0);
// seriesArr[2].data = Array.from({ length: n }, () => 0);
// for (let i = 0; i < this.energyCockpits.length; i++) {
// for (let j = 0; j < energyxAxis.length; j++) {
// if (this.energyCockpits[i].groupName === energyxAxis[j]) {
// if (this.energyCockpits[i].energyType === 1) {
// seriesArr[0].data[j] = this.energyCockpits[i].totalEnergyValue;
// } else if (this.energyCockpits[i].energyType === 2) {
// seriesArr[1].data[j] = this.energyCockpits[i].totalEnergyValue;
// } else if (this.energyCockpits[i].energyType === 3) {
// seriesArr[2].data[j] = this.energyCockpits[i].totalEnergyValue;
// }
// }
// }
// }
// }
// actualOptions.series[0].name = seriesArr[0].name;
// actualOptions.series[1].data = seriesArr[1].data;
// actualOptions.series[1].name = seriesArr[1].name;
// actualOptions.series[2].data = seriesArr[2].data;
// actualOptions.series[2].name = seriesArr[2].name;
if (this.chart) {
this.chart.dispose();
}
this.chart = echarts.init(document.getElementById("factoryEnergyChart"));
// const actualOptions = JSON.parse(JSON.stringify(this.options));
this.options.xAxis.data = this.orderXAxis;
this.options.series[0].data = this.data;
// this.actualOptions = actualOptions;
this.chart.setOption(this.options);
},
},
};
</script>
<style scoped lang="scss">
.left-chart-base {
// position: relative;
height: 100%;
.legend {
position: absolute;
top: 5.2vh;
right: 4vw;
}
.legend-item {
position: relative;
// font-size: 12px;
margin-right: 1.34vw;
&::before {
content: "";
display: inline-block;
// width: 10px;
// height: 10px;
width: 0.531vw;
height: 0.531vw;
background-color: #ccc;
border-radius: 2px;
margin-right: 0.22vw;
}
}
.legend-item:nth-child(1):before {
// width: 12px;
// height: 2px;
width: 0.638vw;
height: 0.1064vw;
background-color: #ffd160;
position: absolute;
top: 50%;
// left: -16px;
left: -0.851vw;
transform: translateY(-50%);
}
.legend-item:nth-child(1):after {
background-color: #ffd160;
content: "";
display: inline-block;
position: absolute;
// width: 6px;
// height: 6px;
width: 0.3191vw;
height: 0.3191vw;
border-radius: 100%;
top: 50%;
left: -0.851vw;
// left: -16px;
transform: translateY(-50%) translateX(50%);
}
.legend-item:nth-child(2):before {
// width: 12px;
// height: 2px;
width: 0.638vw;
height: 0.1064vw;
background-color: #2760ff;
position: absolute;
top: 50%;
// left: -16px;
left: -0.851vw;
transform: translateY(-50%);
}
.legend-item:nth-child(2):after {
background-color: #2760ff;
content: "";
display: inline-block;
position: absolute;
// width: 6px;
// height: 6px;
width: 0.3191vw;
height: 0.3191vw;
border-radius: 100%;
top: 50%;
left: -0.851vw;
// left: -16px;
transform: translateY(-50%) translateX(50%);
}
.legend-item:nth-child(3):before {
// width: 12px;
// height: 2px;
width: 0.638vw;
height: 0.1064vw;
background-color: #12fff5;
position: absolute;
top: 50%;
// left: -16px;
left: -0.851vw;
transform: translateY(-50%);
}
.legend-item:nth-child(3):after {
background-color: #12fff5;
content: "";
display: inline-block;
position: absolute;
// width: 6px;
// height: 6px;
width: 0.3191vw;
height: 0.3191vw;
border-radius: 100%;
top: 50%;
left: -0.851vw;
// left: -16px;
transform: translateY(-50%) translateX(50%);
}
}
</style>

View File

@@ -0,0 +1,414 @@
<!--
* @Author: zhp
* @Date: 2024-05-30 08:58:39
* @LastEditTime: 2024-07-26 16:48:15
* @LastEditors: zhp
* @Description:
-->
<template>
<chart-container class="bar-chart-base">
<div class="legend">
<span v-for="(item,index) in legend" :key="index" class="legend-item"
:style="{ fontSize: isFullscreen ? '0.72vw' : '0.7vw' }">{{ item.label }}</span>
</div>
<div ref="oeeChart" style="height:100%"></div>
</chart-container>
</template>
<script>
import screenfull from "screenfull";
import ChartContainer from "./ChartContainer.vue";
// import chartMixin from "@/mixins/chart.js";
import { debounce } from "@/utils/debounce";
import * as echarts from "echarts";
export default {
name: "BarChartBase",
components: {
ChartContainer,
},
// mixins: [chartMixin],
props: {
vHeight: {
type: Number,
default: 36,
},
legend: {
type: Array,
required: true,
},
xAxis: {
type: Array,
required: true,
},
series: {
type: Array,
required: true,
},
in: {
type: String,
default: "",
},
},
data() {
return {
width: '100%',
isFullscreen: false,
actualOptions: null,
options: {
grid: {
left: "10%",
right: "3%",
bottom: "14%",
top: "20%",
// containLabel: true,
},
// tooltip: {
// trigger: "axis",
// axisPointer: {
// // type: "cross",
// crossStyle: {
// color: "rgba(237,237,237,0.5)",
// },
// },
// extraCssText: 'box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.38); border- radius: 4px;opacity: 0.6;backdrop- filter: blur(6px);',
// backgroundColor: '#001829',
// borderColor: '#001829',
// // textStyle: {
// // color:'rgba(255, 255, 255, 0.85)'
// // },
// formatter: params => {
// console.log('params', params)
// var res = `<span style='color:rgba(255,255,255,0.85)'>${params[0].axisValueLabel}</span>`;
// for (var i = 0, l = params.length; i < l; i++) {
// res +=
// "<br/>" +
// `<span style='display:inline-block;margin-right:4px;width:10px;height:10px;background-color:${params[i].color}'></span>` +
// `<span style='display:inline-block;width:150px;color:rgba(255,255,255,0.65);font-size:14px;'>${params[i].seriesName}</span>` +
// `<span style='color:rgba(255,255,255,0.65);font-size:14px;'>${params[i].value}</span>`;
// }
// return res;
// },
// },
tooltip: {
trigger: "axis",
axisPointer: {
// type: "cross",
crossStyle: {
color: "rgba(237,237,237,0.5)",
},
},
backgroundColor: 'rgba(0,0,0,0)', // tooltip默认背景为白色手动置为透明
extraCssText: 'padding:0;border-width:0',
formatter: params => {
var res = `<span style='display:inline-block;color:rgba(255,255,255,0.85);margin-bottom:8px;font-size:16px;letter-spacing: 2px;'>${params[0].axisValueLabel}</span>`;
for (var i = 0, l = params.length; i < l; i++) {
let color = Object.prototype.toString.call(params[i].color) == "[object String]" ? params[i].color : params[i].color.colorStops ? params[i].color.colorStops[0].color : ''
// console.log(item.color, color);
res +=
"<br/>" +
`<span style='border-radius:2px;display:inline-block;margin-right:4px;width:12px;height:12px;background-color:${color}'></span>` +
`<span style='display:inline-block;width:150px;color:rgba(255,255,255,.85);font-size:16px;letter-spacing: 2px;'>${params[i].seriesName}</span>` +
`<span style='display:inline-block;width:60px;color:rgba(255,255,255,0.65);font-size:16px;letter-spacing: 2px;text-align:right'>${params[i].value ? params[i].value : 0}</span>`;
}
const htmlContent = `
<div style="padding: 12px 16px;background:rgba(0,24,41,.5);box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.38);backdrop-filter: blur(10px);">
${res}
</div>
`;
return htmlContent;
// return res;
},
},
xAxis: {
axisTick: {
show: false,
},
axisLine: {
lineStyle: {
color: "#4561AE",
},
},
axisLabel: {
color: "rgba(223,241,254,.8)",
fontSize: 16,
},
data: this.xAxis,
},
yAxis: {
name: "单位/片",
position: 'left',
nameTextStyle: {
color: "rgba(223,241,254,.8)",
fontSize: 16,
align: "right",
},
axisTick: {
show: false,
},
axisLabel: {
color: "rgba(223,241,254,.8)",
fontSize: 16,
},
axisLine: {
show: true,
lineStyle: {
color: "#4561AE",
},
},
splitLine: {
lineStyle: {
color: "rgba(69,97,174,.4)",
},
},
},
series: [
{
name: "FTO", // this.series[0].name,
type: "bar",
barWidth: 16,
itemStyle: {
borderRadius: [10, 10, 0, 0],
color: {
type: "linear",
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: "#12f7f1", // 0% 处的颜色
},
{
offset: 0.35,
color: "#12f7f177", // 100% 处的颜色
},
{
offset: 0.75,
color: "#12f7f133", // 100% 处的颜色
},
{
offset: 1,
color: "transparent", // 100% 处的颜色
},
],
global: false, // 缺省为 false
},
},
data: [], // this.series[0].data,
},
{
name: "", // this.series[1].name,
type: "bar",
barWidth: 16,
// tooltip: {
// valueFormatter: function (value) {
// return value + " ml";
// },
// },
itemStyle: {
borderRadius: [10, 10, 0, 0],
color: {
type: "linear",
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: "#57abf8", // 0% 处的颜色
},
{
offset: 1,
color: "#364BFE66", // 100% 处的颜色
},
],
global: false, // 缺省为 false
},
},
data: [], // this.series[1].data,
},
{
name: "", // "2024年目标值",
type: "line",
barWidth: 16,
itemStyle: {
borderRadius: [10, 10, 0, 0],
color:'#f3c000'
},
data: [], // this.series[0].data,
},
],
},
};
},
computed: {
isOpen() {
return this.$store.getters.sidebar.opened
},
},
watch: {
xAxis(val) {
this.options.xAxis.data = val
this.canvasReset()
},
isOpen(val) {
this.canvasReset()
},
/** 全屏状态切换时,对柱子粗细和字体大小进行相应调整 */
isFullscreen(val) {
this.options.series.map((item) => {
item.barWidth = val ? 18 : 16;
});
this.options.xAxis.axisLabel.fontSize = val ? 18 : 16;
this.options.yAxis.axisLabel.fontSize = val ? 18 : 16;
this.options.yAxis.nameTextStyle.fontSize = val ? 18 : 16;
// if (val === false && this.isOpen === true) {
// console.log(val)
// this.width = 97 + '%'
// this.canvasReset()
// } else if (val === false && this.isOpen === false) {
// this.width = 100 + '%'
// this.canvasReset()
// }
// this.actualOptions.series.map((item) => {
// item.barWidth = val ? 18 : 16;
// });
// this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 16;
// this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 16;
// this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 16;
this.initChart(this.options)
this.canvasReset()
},
series(val) {
if (!val) {
this.initChart(this.options);
return;
}
// console.log('val', val)
const actualOptions = JSON.parse(JSON.stringify(this.options))
console.log(actualOptions);
// actualOptions.xAxis.data = val
console.log(actualOptions)
this.options.series[0].data = val[0].data;
this.options.series[0].name = val[0].name;
this.options.series[1].data = val?.[1]?.data;
this.options.series[1].name = val?.[1]?.name;
this.options.series[2].data = val?.[2]?.data || [];
this.options.series[2].name = val?.[2]?.name || "";
this.actualOptions = actualOptions;
this.initChart(this.options);
},
},
mounted() {
// if (screenfull.isEnabled) {
// screenfull.on("change", () => {
// this.isFullscreen = screenfull.isFullscreen;
// });
// }
// if (screenfull.isEnabled) {
// screenfull.on("change", () => {
// this.isFullscreen = screenfull.isFullscreen;
// });
// }
this.actualOptions = this.options
this.canvasReset();
window.addEventListener("resize", this.canvasReset);
},
beforeDestroy() {
if (this.chart) {
this.chart.dispose();
}
},
destroyed() {
window.removeEventListener("resize", this.canvasReset);
},
methods: {
canvasReset() {
debounce(() => {
this.initChart();
}, 500)();
},
initChart() {
if (this.chart) {
this.chart.dispose();
}
this.chart = echarts.init(this.$refs.oeeChart);
this.chart.setOption(this.options);
},
},
};
</script>
<style scoped lang="scss">
.bar-chart-base {
// position: relative;
.legend {
position: absolute;
top: 6vh;
right: 13vw;
}
.legend-item {
position: relative;
font-size: 1.2vw;
margin-right:1.2vw;
color: #DFF1FE;
&::before {
content: "";
display: inline-block;
width: 0.531vw;
height: 0.531vw;
background-color: #ccc;
border-radius: 2px;
margin-right: 0.22vw;
}
}
.legend-item:nth-child(3) {
margin-left: 1vw;
}
.legend-item:nth-child(1):before {
background-color: #12f7f1;
}
.legend-item:nth-child(2):before {
background-color: #58adfa;
}
.legend-item:nth-child(3):before {
// width: 12px;
// height: 2px;
width: 1vw;
height: 0.1064vw;
background-color: #f3c000;
position: absolute;
top: 50%;
// left: -16px;
left: -0.951vw;
transform: translateY(-50%);
}
.legend-item:nth-child(3):after {
background-color: #f3c000;
content: "";
display: inline-block;
position: absolute;
// width: 6px;
// height: 6px;
width: 0.3191vw;
height: 0.3191vw;
border-radius: 100%;
top: 50%;
left: -0.851vw;
// left: -16px;
transform: translateY(-50%) translateX(50%);
}
}
.echarts-tooltip-dark {
background: #001829;
}
</style>

View File

@@ -0,0 +1,69 @@
<!--
* @Author: zhp
* @Date: 2024-05-30 09:00:01
* @LastEditTime: 2024-07-24 10:31:52
* @LastEditors: zhp
* @Description:
-->
<template>
<div class="chart-container" :class="{ 'no-scroll': noScroll }">
<slot />
</div>
</template>
<script>
export default {
name: "ChartContainer",
components: {},
props: {
noScroll: {
type: Boolean,
default: true,
},
},
data() {
return {};
},
computed: {},
methods: {},
};
</script>
<style scoped lang="scss">
.chart-container {
height: 0;
flex: 1;
overflow-x: scroll;
}
.no-scroll::-webkit-scrollbar {
width: 0;
height: 0;
}
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-button {
width: 0;
height: 0;
// width: 10px;
// height: 10px;
// background: #14305f;
}
::-webkit-scrollbar-track {
background: #14305f;
border: 0 none;
border-radius: 0;
}
::-webkit-scrollbar-thumb {
background: #004798;
border: 0 none;
border-radius: 6px;
}
</style>

View File

@@ -0,0 +1,296 @@
<!--
* @Author: zhp
* @Date: 2024-05-29 14:48:06
* @LastEditTime: 2024-06-18 14:49:25
* @LastEditors: zhp
* @Description:
-->
<template>
<BarChartBase
:legend="legend"
:series="series"
:xAxis="xAxis"
in="chipOEE"
class="chip-oee"
/>
</template>
<script>
import BarChartBase from "./BarChartChipOEE.vue";
export default {
name: "ChipOEE",
components: { BarChartBase },
props: {
period: {
type: Number,
default:1,
},
than: {
type: String,
default: "同比",
},
companyId: {
type: Number,
default: 0
},
data: {
type: Object,
default:{}
}
},
data() {
// 城市数组的顺序必须是固定的
const cities = ["FTO投入", "芯片产量", "标准组件产量"];
return {
// xAxis: cities,
};
},
computed: {
xAxis() {
console.log(' this.companyId', this.companyId);
return this.companyId === 0 ? ["FTO投入", "芯片产量", "标准组件产量"] : ["FTO投入", "芯片产量", "标准组件产量", 'BIPV产量'];
},
legend() {
let items = [];
var day1 = new Date();
var day2 = new Date();
day1.setTime(day1.getTime() - 24 * 60 * 60 * 1000)
day2.setTime(day2.getTime() - 48 * 60 * 60 * 1000)
var yesterday = (day1.getMonth() + 1) + "月" + day1.getDate()
var dayBeYes = (day2.getMonth() + 1) + "月" + day2.getDate()
//今天的时间
// var day2 = new Date();
// day2.setTime(day2.getTime());
// var s2 = (day2.getMonth() + 1) + "月" + day2.getDate() + '日';
// const today = new Date().getDate();
// let yesterday = new Date().getDate() -1;
// const month = new Date().getMonth() + 1;
// const lastMonth = new Date().getMonth() + 1 === 12 ? 1 : new Date().getMonth() + 1 - 1;
// const year = new Date().getFullYear();
//今天的时间
// var day2 = new Date();
// day2.setTime(day2.getTime());
// var s2 = (day2.getMonth() + 1) + "月" + day2.getDate() + '日';
const today = new Date().getDate();
// let yesterday = new Date().getDate() -1;
const month = new Date().getMonth() + 1;
const lastMonth = new Date().getMonth() + 1 === 12 ? 1 : new Date().getMonth() + 1 - 1;
const year = new Date().getFullYear();
if (this.period === 1 && this.than === '同比') {
items = [
{ label: `${year - 1}${yesterday}累计` },
{ label: `${yesterday}日累计`, },
// { label: `${month}月${today}日目标`, },
];
} else if (this.period === 1 && this.than === '环比') {
items = [
{ label: `${dayBeYes}日累计` },
{ label: `${yesterday}日累计` },
// { label: `${month}月${today}日目标`, },
];
} else if (this.period === 2 && this.than === '同比') {
items = [
{ label: `${year-1}年本周`, color: "#12f7f1" },
{ label: `本周`, color: "#58adfa" },
];
} else if (this.period === 2 && this.than === '环比') {
items = [
{ label: `上周`, color: "#12f7f1" },
{ label: `本周`, color: "#58adfa" },
];
} else if (this.period === 3 && this.than === '同比') {
items = [
{ label: `${year-1}${month}`, color: "#12f7f1" },
{ label: `${month}`, color: "#58adfa" },
{ label: `${month}月目标`, color: "#58adfa" },
// { label: `${month}月目标`, value: valueTuple[2] },
];
} else if (this.period === 3 && this.than === '环比') {
items = [
{ label: `${lastMonth}`, color: "#12f7f1" },
{ label: `${month}`, color: "#58adfa" },
{ label: `${month}月目标`, color: "#58adfa" },
// { label: `${month}月目标`, value: valueTuple[2] },
];
} else {
items = [
{ label: `${year - 1}`, color: "#12f7f1" },
{ label: `${year}`, color: "#58adfa" },
{ label: `${year}年目标`, color: "#58adfa" },
// { label: `${year}年目标`, value: valueTuple[2] },
];
}
return items
// switch (this.period) {
// case "日":
// return [{ label: "昨日", color: "#12f7f1" }];
// case "周":
// return [{ label: "本周", color: "#12f7f1" }];
// case "月": {
// const year = new Date().getFullYear();
// const month = new Date().getMonth() + 1;
// return [
// { label: `${year - 1}年${month}月`, color: "#12f7f1" },
// { label: `${year}年${month}月`, color: "#58adfa" },
// ];
// }
// case "年": {
// const year = new Date().getFullYear();
// return [
// { label: `${year - 1}年`, color: "#12f7f1" },
// { label: `${year}年`, color: "#58adfa" },
// ];
// }
// default:
// return [
// { label: `${year - 1}年`, color: "#12f7f1" },
// { label: `${year}年`, color: "#58adfa" },
// ];
// }
},
// chipOeeRate() {
// return this.$store.getters.copilot.efficiency.chipOeeRate
// },
series() {
// console.log('aaaaaaaa', this.$store.getters.copilot.efficiency.chipOee);
// const chipOeeRate = this.data
// console.log('chipOee', chipOeeRate)
let dataList = []
dataList[0] = this.data.preDataDetail
dataList[1] = this.data.currentDataDetail
dataList[2] = this.data.targetDataDetail
console.log(dataList)
return getTemplate(this.period, dataList,this.than);
},
},
methods: {},
};
function getTemplate(period, dataList, than) {
// console.log('dataList',dataList);
let items = [];
var day1 = new Date();
var day2 = new Date();
day1.setTime(day1.getTime() - 24 * 60 * 60 * 1000)
day2.setTime(day2.getTime() - 48 * 60 * 60 * 1000)
var yesterday = (day1.getMonth() + 1) + "月" + day1.getDate()
var dayBeYes = (day2.getMonth() + 1) + "月" + day2.getDate()
//今天的时间
// var day2 = new Date();
// day2.setTime(day2.getTime());
// var s2 = (day2.getMonth() + 1) + "月" + day2.getDate() + '日';
const today = new Date().getDate();
// let yesterday = new Date().getDate() -1;
const month = new Date().getMonth() + 1;
const lastMonth = new Date().getMonth() + 1 === 12 ? 1 : new Date().getMonth() + 1 - 1;
const year = new Date().getFullYear();
if (period === 1 && than === '同比') {
items = [
{
name: `${year - 1}${yesterday}`,
data: dataList ? dataList[0] : [],
},
{
name: `${yesterday}`,
data: dataList ? dataList[1] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
];
} else if (period ===1 && than === '环比') {
items = [
{
name: `${dayBeYes}`,
data: dataList ? dataList[0] : [],
},
{
name: `${yesterday}`,
data: dataList ? dataList[1] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
];
} else if (period === 2 && than === '同比') {
items = [
{
name: `${year-1}年本周`,
data: dataList ? dataList[0] : [],
},
{
name: `本周`,
data: dataList ? dataList[1] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
];
} else if (period === 2&& than === '环比') {
items = [
{
name: `上周`,
data: dataList ? dataList[0] : [],
},
{
name: `本周`,
data: dataList ? dataList[1] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
];
} else if (period === 3 && than === '同比') {
items = [
{
name: `${year-1}${month}`,
data: dataList ? dataList[0] : [],
},
{
name: `${month}`,
data: dataList ? dataList[1] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
{
name: `${month}目标`,
data: dataList ? dataList[2] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
];
} else if (period === 3 && than === '环比') {
items = [
{
name: `${lastMonth}`,
data: dataList ? dataList[0] : [],
},
{
name: `${month}`,
data: dataList ? dataList[1] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
{
name: `${month}目标`,
data: dataList ? dataList[2] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
];
} else {
items = [
{
name: `${year - 1}`,
data: dataList ? dataList[0] : [],
},
{
name: `${year}`,
data: dataList ? dataList[1] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
{
name: `${year}目标`,
data: dataList ? dataList[2] : [],
// : Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000)),
},
];
}
return items
}
</script>
<style scoped lang="scss">
</style>

View File

@@ -1,8 +1,15 @@
<!-- <!--
* @Author: zhp
* @Date: 2024-06-03 15:38:31
* @LastEditTime: 2024-07-09 16:49:22
* @LastEditors: zhp
* @Description:
-->
<!--
filename: ContainerIcon.vue filename: ContainerIcon.vue
author: liubin author: liubin
date: 2024-04-09 16:41:36 date: 2024-04-09 16:41:36
description: description:
--> -->
<template> <template>
@@ -49,8 +56,8 @@ export default {
.container-icon { .container-icon {
// width: 32px; // width: 32px;
// height: 32px; // height: 32px;
width: 1.701vw; width: 1.4vw;
height: 1.701vw; height: 1.4vw;
background: #ccc2; background: #ccc2;
} }
</style> </style>

View File

@@ -18,19 +18,11 @@ import * as echarts from "echarts";
export default { export default {
name: "Energy", name: "Energy",
props: { props: {
vHeight: {
type: Number,
default: 34,
},
legend: { legend: {
type: Array, type: Array,
required: true, required: true,
}, },
xAxis: { energyCockpits: {
type: Array,
required: true,
},
series: {
type: Array, type: Array,
required: true, required: true,
}, },
@@ -43,11 +35,10 @@ export default {
options: { options: {
color: ["#FFD160", "#2760FF", "#12FFF5"], color: ["#FFD160", "#2760FF", "#12FFF5"],
grid: { grid: {
left: "3%", left: "7%",
right: "4%", right: "7%",
bottom: "0", bottom: "8%",
top: "15%", top: "15%",
containLabel: true,
}, },
tooltip: { tooltip: {
trigger: "axis", trigger: "axis",
@@ -65,7 +56,7 @@ export default {
color: "rgba(255, 255, 255, 0.7)", color: "rgba(255, 255, 255, 0.7)",
fontSize: 12, fontSize: 12,
}, },
data: this.xAxis, data: [],
}, },
yAxis: [ yAxis: [
{ {
@@ -190,6 +181,11 @@ export default {
}, },
}; };
}, },
computed: {
isOpen() {
return this.$store.getters.sidebar.opened;
},
},
watch: { watch: {
/** 全屏状态切换时,对柱子粗细和字体大小进行相应调整 */ /** 全屏状态切换时,对柱子粗细和字体大小进行相应调整 */
// isFullscreen(val) { // isFullscreen(val) {
@@ -216,6 +212,12 @@ export default {
// this.actualOptions = actualOptions; // this.actualOptions = actualOptions;
// this.initOptions(actualOptions); // this.initOptions(actualOptions);
// }, // },
energyCockpits() {
this.initChart();
},
isOpen(val) {
this.canvasReset();
},
}, },
mounted() { mounted() {
// if (screenfull.isEnabled) { // if (screenfull.isEnabled) {
@@ -241,17 +243,60 @@ export default {
}, 500)(); }, 500)();
}, },
initChart() { initChart() {
let energyxAxis = [];
let n = 0;
let seriesArr = [
{
name: "水",
energyType: 1,
data: [],
},
{
name: "电",
energyType: 2,
data: [],
},
{
name: "气",
energyType: 3,
data: [],
},
];
if (this.energyCockpits.length > 0) {
let dataArr = this.energyCockpits.map((item) => {
return item.groupName;
});
energyxAxis = Array.from(new Set(dataArr));
n = energyxAxis.length;
seriesArr[0].data = Array.from({ length: n }, () => 0);
seriesArr[1].data = Array.from({ length: n }, () => 0);
seriesArr[2].data = Array.from({ length: n }, () => 0);
for (let i = 0; i < this.energyCockpits.length; i++) {
for (let j = 0; j < energyxAxis.length; j++) {
if (this.energyCockpits[i].groupName === energyxAxis[j]) {
if (this.energyCockpits[i].energyType === 1) {
seriesArr[0].data[j] = this.energyCockpits[i].totalEnergyValue;
} else if (this.energyCockpits[i].energyType === 2) {
seriesArr[1].data[j] = this.energyCockpits[i].totalEnergyValue;
} else if (this.energyCockpits[i].energyType === 3) {
seriesArr[2].data[j] = this.energyCockpits[i].totalEnergyValue;
}
}
}
}
}
if (this.chart) { if (this.chart) {
this.chart.dispose(); this.chart.dispose();
} }
this.chart = echarts.init(document.getElementById("factoryEnergyChart")); this.chart = echarts.init(document.getElementById("factoryEnergyChart"));
const actualOptions = JSON.parse(JSON.stringify(this.options)); const actualOptions = JSON.parse(JSON.stringify(this.options));
actualOptions.series[0].data = this.series[0].data; actualOptions.xAxis.data = energyxAxis;
actualOptions.series[0].name = this.series[0].name; actualOptions.series[0].data = seriesArr[0].data;
actualOptions.series[1].data = this.series[1].data; actualOptions.series[0].name = seriesArr[0].name;
actualOptions.series[1].name = this.series[1].name; actualOptions.series[1].data = seriesArr[1].data;
actualOptions.series[2].data = this.series[2].data; actualOptions.series[1].name = seriesArr[1].name;
actualOptions.series[2].name = this.series[2].name; actualOptions.series[2].data = seriesArr[2].data;
actualOptions.series[2].name = seriesArr[2].name;
this.actualOptions = actualOptions; this.actualOptions = actualOptions;
this.chart.setOption(actualOptions); this.chart.setOption(actualOptions);
}, },

View File

@@ -1,77 +1,199 @@
<template> <template>
<dv-scroll-board <div class="order-container">
v-if="aa" <div class="table">
:config="config" <dv-scroll-board v-if="showTable" :config="config"
style="width: 100%; height: 100%" style="width: 100%; height: 100%; color: rgba(255, 255, 255,1);font-size:16," ref="orderScrollBoard" />
/> </div>
<div class="chart">
<div class="chart-title">
<span class="title">工单情况</span>
<span class="line"></span>
</div>
<div class="button-type" style="margin-left: auto;position: absolute;right: 3%;top: 57%;z-index: 999;">
<CopilotButton v-for="i in ['目标产量', '计划投入', '实际投入', '实际产出', '废品数量', '待再加工']" :key="i" :label="i"
:active="i === type" @click="() => $emit('update:type', i)" />
</div>
<barChartBase :type="type" :energyCockpits="prodOrder" ref="barChart" style="height: 0;flex:1">
</barChartBase>
</div>
</div>
</template> </template>
<script> <script>
import { debounce } from "@/utils/debounce"; import { debounce } from "@/utils/debounce";
import barChartBase from './BarChartBase'
// import barChartBase from './BarChartBase'
import CopilotButton from "./chartButton"
export default { export default {
name: "Order", name: "Order",
components: {
barChartBase,
CopilotButton,
},
data() { data() {
return { return {
aa: true, showTable: true,
// type: '目标产量',
config: { config: {
header: ["号", "客户名称", "产品名称", "计划加工数量", "加工进度"], header: ["工单号", "工单状态", "计划投入", "实际投入", "目标产量", "实际产量", "生产进度"],
headerBGC: "rgba(0, 106, 205, 0.22)", headerBGC: "rgba(0, 106, 205, 0.22)",
oddRowBGC: "rgba(0, 106, 205, 0.22)", oddRowBGC: "rgba(0, 106, 205, 0.22)",
evenRowBGC: "rgba(rgba(2, 13, 45, 0.18)", evenRowBGC: "rgba(rgba(2, 13, 45, 0.18)",
data: [], data: [],
rowNum: 12, rowNum: 12,
fontSize:16,
waitTime: 3000, waitTime: 3000,
columnWidth: [50], columnWidth: [150],
align: ["center"], align: ["left"],
carousel: "page", carousel: "page",
}, },
}; };
}, },
props: {
type: {
type: String,
default: "目标产量",
},
prodOrder: {
type: Array,
default: [],
},
},
computed: {
isOpen() {
return this.$store.getters.sidebar.opened;
},
},
watch: {
isOpen(val) {
this.tableReset();
},
prodOrder() {
this.getTableList();
},
},
mounted() { mounted() {
this.getTableList(); window.addEventListener("resize", this.tableReset)
this.tableReset(); this.$nextTick(() => {
window.addEventListener("resize", this.tableReset); let button = document.getElementsByClassName('button-type')
console.log(button);
button[0].children[0].style.borderRadius = '4px 0 0 4px'
button[0].children[5].style.borderRadius = '0px 4px 4px 0px'
// children[5].classList.add('skate')
// console.log(button[0].children[5].classList);
});
}, },
methods: { methods: {
tableReset() { tableReset() {
this.aa = false; this.showTable = false;
debounce(() => { debounce(() => {
this.initTable(); this.initTable();
}, 500)(); }, 500)();
}, },
initTable() { initTable() {
this.aa = true; this.showTable = true;
}, },
getTableList() { getTableList() {
let _this = this; let outArr = [];
setTimeout( if (this.prodOrder.length > 0) {
(function name() { for (let i = 0; i < this.prodOrder.length; i++) {
_this.config.data = [ let arr = [];
["1", "行1列1", "行1列2", "行1列3", "50%"], // arr.push(i + 1);
["2", "行2列1", "行2列2", "行2列3", "50%"], arr.push(
["3", "行3列1", "行3列2", "行3列3", "50%"], `<span title=${this.prodOrder[i].workOrderNumber || ""} style='color: rgba(223,241,254,.8);font-size:16px' >${
["4", "行4列1", "行4列2", "行4列3", "50%"], this.prodOrder[i].workOrderNumber || ""
["5", "行5列1", "行5列2", "行5列3", "50%"], }</span>`,
["6", "行6列1", "行6列2", "行6列3", "50%"], `<span style='color: rgba(223,241,254,.8);font-size:16px' title=${this.prodOrder[i].orderStatus || ""}>${this.prodOrder[i].orderStatus === 1 ? '未开始' : this.prodOrder[i].orderStatus === 2 ? '进行中' : '已完成' || ""
["7", "行7列1", "行7列2", "行7列3", "50%"], }</span>`,
["8", "行8列1", "行8列2", "行8列3", "50%"], `<span style='color: rgba(223,241,254,.8);font-size:1.2em' title=${this.prodOrder[i].plannedInvestment || ""}>${this.prodOrder[i].plannedInvestment || ""
["9", "行9列1", "行9列2", "行9列3", "50%"], }</span>`,
["10", "行10列1", "行10列2", "行10列3", "50%"], `<span style='color: rgba(223,241,254,.8);font-size:16px' title=${this.prodOrder[i].actualInvestment || ""}>${this.prodOrder[i].actualInvestment || ""
["11", "行11列1", "行11列2", "行11列3", "50%"], }</span>`,
["12", "行12列1", "行12列2", "行12列3", "50%"], `<span style='color: rgba(223,241,254,.8);font-size:16px' title=${this.prodOrder[i].targetProduction || ""}>${this.prodOrder[i].targetProduction || ""
["13", "行13列1", "行13列2", "行13列3", "50%"], }</span>`,
["14", "行14列1", "行14列2", "行14列3", "50%"], `<span style='color: rgba(223,241,254,.8);font-size:16px' title=${this.prodOrder[i].actualProduction || ""}>${this.prodOrder[i].actualProduction || ""
["15", "行15列1", "行15列2", "行15列3", "50%"], }</span>`,
["16", "行16列1", "行16列2", "行16列3", "50%"], `<span style="display:inline-block;width:45px;color: rgba(223,241,254,.8)">${this.prodOrder[i].productionProgress
["17", "行17列1", "行17列2", "行17列3", "50%"], ? parseFloat((this.prodOrder[i].productionProgress * 100).toFixed(2)) + "%"
["18", "行18列1", "行18列2", "行18列3", "50%"], : "0%"
["19", "行19列1", "行19列2", "行19列3", "50%"], }</span>
["20", "行20列1", "行20列2", "行20列3", "50%"], <div style="display:inline-block;height:20px;vertical-align:top;margin-top:3px;">
]; <svg xmlns="http://www.w3.org/200/svg" height="18" width="18">
})(), <circle cx="10" cy="10" r="6" fill="none" stroke="#283851" stroke-width="4" stroke-linecap="round"/>
2000 <circle style="transform-origin: center;transform: rotate(-90deg);" id="J_progress_bar" cx="10" cy="10" r="6" fill="none" stroke="#47FF27" stroke-width="4" stroke-dasharray="${this.prodOrder[i].productionProgress
); ? this.prodOrder[i].productionProgress.toFixed(2) *100 *
this.initTable(); 37.68 *
0.01 +
"," +
(1 -
this.prodOrder[i].productionProgress.toFixed(2) * 0.01) * 100 *
37.68
: 0 + "," + 37.68
}"/>
</svg>
</div>`
)
outArr.push(arr);
}
this.config.data = outArr;
} else {
this.config.data = [];
}
this.$refs["orderScrollBoard"].updateRows(outArr);
}, },
}, },
}; };
</script> </script>
<style lang="scss" scoped>
.order-container{
display: flex;
flex-direction: column;
height: 100%;
.table{
flex: 1;
}
.chart {
flex: 1;
display: flex;
flex-direction: column;
// gap: 6px;
.chart-title {
margin-top: 5px;
// flex: 1;
// gap: 6px;
height: 1.5vw;
width: 100%;
display: flex;
align-items: center;
// flex-direction: column;
// flex-wrap: nowrap;
// justify-content: end
// margin-top: 10px;
.title {
// flex: 1;
font-weight: 400;
font-size: 24px;
// width: 5vw;
color: #FFFFFF;
line-height: 24px;
text-align: left;
font-style: normal;
display: inline-block;
}
.line {
flex: 1;
// width: 80%;
height: 1px; // display: inline-block;
border: 1px solid;
// display: inline-block;
// border-image: linear-gradient(to right, transparent 5%, rgba(95, 190, 249, 1) 20%, transparent 90%, )1;
border-image: linear-gradient(to right, transparent 10%, rgba(95, 190, 249, 1 )30%, transparent 90%,)1;
// backdrop-filter: blur(3px);
}
}
}
}
</style>

View File

@@ -1,272 +1,414 @@
<template> <template>
<div class="prod-monitor"> <div class="prod-monitor">
<div class="fto-box">
<div class="icon"> <div class="data">
<img <div class="fto-box">
src="./../assets/images/fto.png" <div class="icon">
alt="" <img src="./../assets/images/fto.png" alt="" style="width: 2.1875vw; height: 2.2875vw" />
style="width: 2.1875vw; height: 2.2875vw" </div>
/> <div class="middle-box">
<span class="type">玻璃类型</span>
<span class="type-name">FTO</span>
</div>
<div class="right-box">
<span class="type">投入数量</span>
<span class="num">{{ prodFto[0] ? prodFto[0].chipInput.toLocaleString() : 0 }}</span>
</div>
</div> </div>
<div class="middle-box"> <div class="std-box">
<span class="type">玻璃类型</span> <div class="icon">
<span class="type-name">FTO投入</span> <img src="./../assets/images/std.png" alt="" style="width: 2.1875vw; height: 2.1875vw" />
</div> </div>
<div class="right-box"> <div class="middle-box">
<span class="type">投入数量</span> <div class="separate">
<span class="num">8391222</span> <div>
</div> <span class="type">玻璃类型</span>
</div> <span class="type-name">标准组件</span>
<div class="std-box"> </div>
<div class="icon"> <div>
<img <span class="type">良品数量</span>
src="./../assets/images/std.png" <span class="type-name">{{
alt="" msgObj.stand.goodNumber ? msgObj.stand.goodNumber.toLocaleString() : 0
style="width: 2.1875vw; height: 2.1875vw" }}</span>
/> </div>
</div>
<div class="middle-box">
<div class="separate">
<div>
<span class="type">玻璃类型</span>
<span class="type-name">标准组检产量</span>
</div> </div>
<div> </div>
<span class="type">良品数量</span> <div class="right-box">
<span class="type-name">740</span> <div class="separate">
<div>
<span class="type">生产数量</span>
<span class="num">{{
msgObj.stand.outputNumber ? msgObj.stand.outputNumber.toLocaleString() : 0
}}</span>
</div>
<div>
<span class="type1">良品率</span>
<span class="num">{{ msgObj.stand.yieldRate ? msgObj.stand.yieldRate.toFixed(2) : 0 }}%</span>
</div>
</div> </div>
</div> </div>
</div> </div>
<div class="right-box"> <div class="chip-box">
<div class="separate"> <div class="icon">
<div> <img src="./../assets/images/chip.png" alt="" style="width: 2.1875vw; height: 2.1875vw" />
<span class="type">生产数量</span> </div>
<span class="num">783</span> <div class="middle-box">
<div class="separate">
<div>
<span class="type">玻璃类型</span>
<span class="type-name">芯片</span>
</div>
<div>
<span class="type">良品数量</span>
<span class="type-name">{{
msgObj.chip.goodNumber ? msgObj.chip.goodNumber.toLocaleString() : 0
}}</span>
</div>
</div> </div>
<div> </div>
<span class="type1">良品率</span> <div class="right-box">
<span class="num">96%</span> <div class="separate">
<div>
<span class="type">生产数量</span>
<span class="num">{{
msgObj.chip.outputNumber ? msgObj.chip.outputNumber.toLocaleString() : 0
}}</span>
</div>
<div>
<span class="type1">良品率</span>
<span class="num">{{ msgObj.chip.yieldRate ? msgObj.chip.yieldRate.toFixed(2) : 0 }}%</span>
</div>
</div>
</div>
</div>
<div class="bipv-box" v-if="companyId != 0">
<div class="icon">
<img src="./../assets/images/bipv.png" alt="" style="width: 2.1875vw; height: 2.1875vw" />
</div>
<div class="middle-box">
<div class="separate">
<div>
<span class="type">玻璃类型</span>
<span class="type-name">BIPV</span>
</div>
<div>
<span class="type">良品数量</span>
<span class="type-name">{{
msgObj.bipv.goodNumber ? msgObj.bipv.goodNumber.toLocaleString() : 0
}}</span>
</div>
</div>
</div>
<div class="right-box">
<div class="separate">
<div>
<span class="type">生产数量</span>
<span class="num">{{
msgObj.bipv.outputNumber ? msgObj.bipv.outputNumber.toLocaleString() : 0
}}</span>
</div>
<div>
<span class="type1">良品率</span>
<span class="num">{{ msgObj.bipv.yieldRate ? msgObj.bipv.yieldRate.toFixed(2) : 0 }}%</span>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="chip-box"> <div class="chart">
<div class="icon"> <div class="chart-title">
<img <span class="title">生产情况</span>
src="./../assets/images/chip.png" <div class="button-than" style="position: absolute;right: 0%;">
alt="" <CopilotButton v-for="i in ['同比', '环比']" :key="i" :label="i" :active="i === than"
style="width: 2.1875vw; height: 2.1875vw" @click="() => $emit('update:than', i)" />
/>
</div>
<div class="middle-box">
<div class="separate">
<div>
<span class="type">玻璃类型</span>
<span class="type-name">芯片产量</span>
</div>
<div>
<span class="type">良品数量</span>
<span class="type-name">740</span>
</div>
</div>
</div>
<div class="right-box">
<div class="separate">
<div>
<span class="type">生产数量</span>
<span class="num">783</span>
</div>
<div>
<span class="type1">良品率</span>
<span class="num">96%</span>
</div>
</div>
</div>
</div>
<div class="bipv-box">
<div class="icon">
<img
src="./../assets/images/bipv.png"
alt=""
style="width: 2.1875vw; height: 2.1875vw"
/>
</div>
<div class="middle-box">
<div class="separate">
<div>
<span class="type">玻璃类型</span>
<span class="type-name">BIPV产量</span>
</div>
<div>
<span class="type">良品数量</span>
<span class="type-name">740</span>
</div>
</div>
</div>
<div class="right-box">
<div class="separate">
<div>
<span class="type">生产数量</span>
<span class="num">783</span>
</div>
<div>
<span class="type1">良品率</span>
<span class="num">96%</span>
</div>
</div> </div>
<!-- <span class="line"></span> -->
</div> </div>
<barChartBase v-if="factoryData.length != 0" :companyId="companyId" :than="than" :period="period" :data="factoryData"
ref="barChart" style="height: 0;flex:1">
</barChartBase>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import { number } from 'echarts';
import barChartBase from './ChipOee'
import CopilotButton from "./button.vue"
export default { export default {
name: "ProdMonitor", name: "ProdMonitor",
components: {
barChartBase,
CopilotButton
},
data() {
return {
bipvVis:false,
msgObj: {
stand: {},
chip: {},
bipv: {},
},
};
},
props: {
period: {
type: Number,
default: 1,
},
companyId: {
type: Number,
default:0
},
than: {
type: String,
},
than: {
type: String,
default: '同比',
},
prodOutPut: {
type: Array,
default: [],
},
prodFto: {
type: Array,
default: [],
},
factoryData: {
type: Object,
default: {},
},
showBipv: {
type: Boolean,
default:true,
}
},
watch: {
prodOutPut() {
this.makeData();
},
},
mounted() {
this.makeData();
this.$nextTick(() => {
let button = document.getElementsByClassName('button-than')
button[0].children[0].style.borderRadius = '4px 0 0 4px'
button[0].children[1].style.borderRadius = '0px 4px 4px 0'
})
},
methods: {
makeData() {
this.msgObj.chip = {};
this.msgObj.stand = {};
this.msgObj.bipv = {};
if (this.prodOutPut.length > 0) {
this.prodOutPut.map((item) => {
if (item.glassType === 0) {
this.msgObj.chip = item;
} else if (item.glassType === 1) {
this.msgObj.stand = item;
} else if (item.glassType === 2) {
this.msgObj.bipv = item;
}
});
}
},
},
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.prod-monitor { .prod-monitor {
height: 100%; height: 100%;
display: flex; display: flex;
gap: 6px;
flex-direction: column; flex-direction: column;
.fto-box, .chart{
.std-box, flex: 1.3;
.chip-box,
.bipv-box {
box-shadow: inset 0 0 12px 2px #fff3;
border-radius: 4px;
display: flex; display: flex;
align-items: center; flex-direction: column;
.icon { position: relative;
// gap: 6px;
.chart-title{
margin-top: 20px;
// flex: 1;
// gap: 6px;
height: 1.5vw;
width: 100%;
display: flex;
align-items: center;
// flex-direction: column;
// flex-wrap: nowrap;
// justify-content: end
// margin-top: 10px;
.title{
// flex: 1;
font-weight: 400;
font-size: 24px;
// width: 5vw;
color: #FFFFFF;
line-height: 24px;
// text-align: left;
font-style: normal;
display: inline-block;
}
// .line{
// flex: 1;
// // width: 80%;
// height: 1px; // display: inline-block;
// border: 1px solid;
// // display: inline-block;
// border-image: linear-gradient(90deg, rgba(25, 146, 255, 0) 10%, rgba(95, 190, 249, 1), rgba(0, 120, 228, 0) 90%,) 2 2;
// backdrop-filter: blur(3px);
// }
}
}
.data{
flex: 1; flex: 1;
text-align: center; display: flex;
} gap: 6px;
.middle-box { flex-direction: column;
flex: 2.086; .fto-box,
position: relative; .std-box,
} .chip-box,
.right-box { .bipv-box {
flex: 2.424; box-shadow: inset 0 0 12px 2px #fff3;
position: relative; border-radius: 4px;
} display: flex;
.type { align-items: center;
display: inline-block;
font-size: 0.9375vw; .icon {
color: #6db6ff; flex: 1;
position: relative; text-align: center;
text-align: right; }
padding-right: 0.417vw;
letter-spacing: 2px; .middle-box {
width: 6.25vw; flex: 2.086;
} position: relative;
.type1 { }
display: inline-block;
font-size: 0.9375vw; .right-box {
color: #6db6ff; flex: 2.424;
position: relative; position: relative;
text-align: right; }
padding-right: 0.6vw;
width: 6.25vw; .type {
padding-left: 1.6vw; display: inline-block;
text-align: justify; font-size: 0.9375vw;
text-align-last: justify; color: #6db6ff;
} position: relative;
.type-name { text-align: right;
font-size: 1.042vw; padding-right: 0.417vw;
color: #fff; letter-spacing: 2px;
position: relative; width: 6.25vw;
text-align: left; }
padding-left: 0.573vw;
} .type1 {
.type-name::before { display: inline-block;
content: ""; font-size: 0.9375vw;
display: inline-block; color: #6db6ff;
width: 1px; position: relative;
height: 1.042vw; text-align: right;
border: 1px solid; padding-right: 0.6vw;
border-image: linear-gradient( width: 6.25vw;
180deg, padding-left: 1.6vw;
rgba(0, 176, 243, 0), text-align: justify;
rgba(31, 143, 255, 1) text-align-last: justify;
) }
2 2;
position: absolute; .type-name {
left: 0; font-size: 1.042vw;
top: 4px; color: #fff;
} position: relative;
.num { text-align: left;
font-size: 1.042vw; padding-left: 0.573vw;
color: #fff; }
position: relative;
text-align: left; .type-name::before {
padding-left: 0.573vw; content: "";
} display: inline-block;
.num::before { width: 1px;
content: ""; height: 1.042vw;
display: inline-block; border: 1px solid;
width: 1px; border-image: linear-gradient(180deg,
height: 1.042vw; rgba(0, 176, 243, 0),
border: 1px solid; rgba(31, 143, 255, 1)) 2 2;
border-image: linear-gradient( position: absolute;
180deg, left: 0;
rgba(0, 176, 243, 0), top: 4px;
rgba(31, 143, 255, 1) }
)
2 2; .num {
position: absolute; font-size: 1.042vw;
left: 0; color: #fff;
top: 4px; position: relative;
} text-align: left;
} padding-left: 0.573vw;
.fto-box { }
flex: 1;
.type::before { .num::before {
content: ""; content: "";
display: inline-block; display: inline-block;
width: 1px; width: 1px;
height: 1.6146vw; height: 1.042vw;
border: 1px solid; border: 1px solid;
border-image: linear-gradient( border-image: linear-gradient(180deg,
135deg, rgba(0, 176, 243, 0),
rgba(0, 176, 243, 0), rgba(31, 143, 255, 1)) 2 2;
rgba(31, 143, 255, 1), position: absolute;
rgba(31, 143, 255, 0) left: 0;
) top: 4px;
2 2; }
position: absolute; }
left: 0;
top: -2px; .fto-box {
} flex: .5;
}
.std-box { .type::before {
flex: 1.3; content: "";
} display: inline-block;
.chip-box { width: 1px;
flex: 1.3; height: 1.6146vw;
} border: 1px solid;
.bipv-box { border-image: linear-gradient(135deg,
flex: 1.3; rgba(0, 176, 243, 0),
} rgba(31, 143, 255, 1),
.std-box, rgba(31, 143, 255, 0)) 2 2;
.chip-box, position: absolute;
.bipv-box { left: 0;
.separate::before { top: -2px;
content: ""; }
display: inline-block; }
width: 1px;
height: 3.125vw; .std-box {
border: 1px solid; flex: .6;
border-image: linear-gradient( }
135deg,
rgba(0, 176, 243, 0), .chip-box {
rgba(31, 143, 255, 1), flex: .6;
rgba(31, 143, 255, 0) }
)
2 2; .bipv-box {
position: absolute; flex: .6;
left: 0; }
top: -2px;
} .std-box,
.chip-box,
.bipv-box {
.separate::before {
content: "";
display: inline-block;
width: 1px;
height: 3.125vw;
border: 1px solid;
border-image: linear-gradient(135deg,
rgba(0, 176, 243, 0),
rgba(31, 143, 255, 1),
rgba(31, 143, 255, 0)) 2 2;
position: absolute;
left: 0;
top: -2px;
}
}
} }
} }
</style> </style>

View File

@@ -0,0 +1,342 @@
<!--
* @Author: zhp
* @Date: 2024-05-21 14:25:19
* @LastEditTime: 2024-05-21 14:25:19
* @LastEditors: zhp
* @Description:
-->
<template>
<div class="prod-monitor">
<div class="fto-box">
<div class="icon">
<img
src="./../assets/images/fto.png"
alt=""
style="width: 2.1875vw; height: 2.2875vw"
/>
</div>
<div class="middle-box">
<span class="type">玻璃类型</span>
<span class="type-name">FTO投入</span>
</div>
<div class="right-box">
<span class="type">投入数量</span>
<span class="num">{{ prodFto[0] ? prodFto[0].chipInput : 0 }}</span>
</div>
</div>
<div class="std-box">
<div class="icon">
<img
src="./../assets/images/std.png"
alt=""
style="width: 2.1875vw; height: 2.1875vw"
/>
</div>
<div class="middle-box">
<div class="separate">
<div>
<span class="type">玻璃类型</span>
<span class="type-name">标准组检产量</span>
</div>
<div>
<span class="type">良品数量</span>
<span class="type-name">{{
msgObj.stand.goodNumber ? msgObj.stand.goodNumber : 0
}}</span>
</div>
</div>
</div>
<div class="right-box">
<div class="separate">
<div>
<span class="type">生产数量</span>
<span class="num">{{
msgObj.stand.outputNumber ? msgObj.stand.outputNumber : 0
}}</span>
</div>
<div>
<span class="type1">良品率</span>
<span class="num"
>{{ msgObj.stand.yieldRate ? msgObj.stand.yieldRate : 0 }}%</span
>
</div>
</div>
</div>
</div>
<div class="chip-box">
<div class="icon">
<img
src="./../assets/images/chip.png"
alt=""
style="width: 2.1875vw; height: 2.1875vw"
/>
</div>
<div class="middle-box">
<div class="separate">
<div>
<span class="type">玻璃类型</span>
<span class="type-name">芯片产量</span>
</div>
<div>
<span class="type">良品数量</span>
<span class="type-name">{{
msgObj.chip.goodNumber ? msgObj.chip.goodNumber : 0
}}</span>
</div>
</div>
</div>
<div class="right-box">
<div class="separate">
<div>
<span class="type">生产数量</span>
<span class="num">{{
msgObj.chip.outputNumber ? msgObj.chip.outputNumber : 0
}}</span>
</div>
<div>
<span class="type1">良品率</span>
<span class="num"
>{{ msgObj.chip.yieldRate ? msgObj.chip.yieldRate : 0 }}%</span
>
</div>
</div>
</div>
</div>
<div class="bipv-box">
<div class="icon">
<img
src="./../assets/images/bipv.png"
alt=""
style="width: 2.1875vw; height: 2.1875vw"
/>
</div>
<div class="middle-box">
<div class="separate">
<div>
<span class="type">玻璃类型</span>
<span class="type-name">BIPV产量</span>
</div>
<div>
<span class="type">良品数量</span>
<span class="type-name">{{
msgObj.bipv.goodNumber ? msgObj.bipv.goodNumber : 0
}}</span>
</div>
</div>
</div>
<div class="right-box">
<div class="separate">
<div>
<span class="type">生产数量</span>
<span class="num">{{
msgObj.bipv.outputNumber ? msgObj.bipv.outputNumber : 0
}}</span>
</div>
<div>
<span class="type1">良品率</span>
<span class="num"
>{{ msgObj.bipv.yieldRate ? msgObj.bipv.yieldRate : 0 }}%</span
>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "ProdMonitor",
data() {
return {
msgObj: {
stand: {},
chip: {},
bipv: {},
},
};
},
props: {
prodOutPut: {
type: Array,
default: [],
},
prodFto: {
type: Array,
default: [],
},
},
watch: {
prodOutPut() {
this.makeData();
},
},
mounted() {
this.makeData();
},
methods: {
makeData() {
this.msgObj.chip = {};
this.msgObj.stand = {};
this.msgObj.bipv = {};
if (this.prodOutPut.length > 0) {
this.prodOutPut.map((item) => {
if (item.glassType === 0) {
this.msgObj.chip = item;
} else if (item.glassType === 1) {
this.msgObj.stand = item;
} else if (item.glassType === 2) {
this.msgObj.bipv = item;
}
});
}
},
},
};
</script>
<style lang="scss" scoped>
.prod-monitor {
height: 100%;
display: flex;
gap: 6px;
flex-direction: column;
.fto-box,
.std-box,
.chip-box,
.bipv-box {
box-shadow: inset 0 0 12px 2px #fff3;
border-radius: 4px;
display: flex;
align-items: center;
.icon {
flex: 1;
text-align: center;
}
.middle-box {
flex: 2.086;
position: relative;
}
.right-box {
flex: 2.424;
position: relative;
}
.type {
display: inline-block;
font-size: 0.9375vw;
color: #6db6ff;
position: relative;
text-align: right;
padding-right: 0.417vw;
letter-spacing: 2px;
width: 6.25vw;
}
.type1 {
display: inline-block;
font-size: 0.9375vw;
color: #6db6ff;
position: relative;
text-align: right;
padding-right: 0.6vw;
width: 6.25vw;
padding-left: 1.6vw;
text-align: justify;
text-align-last: justify;
}
.type-name {
font-size: 1.042vw;
color: #fff;
position: relative;
text-align: left;
padding-left: 0.573vw;
}
.type-name::before {
content: "";
display: inline-block;
width: 1px;
height: 1.042vw;
border: 1px solid;
border-image: linear-gradient(
180deg,
rgba(0, 176, 243, 0),
rgba(31, 143, 255, 1)
)
2 2;
position: absolute;
left: 0;
top: 4px;
}
.num {
font-size: 1.042vw;
color: #fff;
position: relative;
text-align: left;
padding-left: 0.573vw;
}
.num::before {
content: "";
display: inline-block;
width: 1px;
height: 1.042vw;
border: 1px solid;
border-image: linear-gradient(
180deg,
rgba(0, 176, 243, 0),
rgba(31, 143, 255, 1)
)
2 2;
position: absolute;
left: 0;
top: 4px;
}
}
.fto-box {
flex: 1;
.type::before {
content: "";
display: inline-block;
width: 1px;
height: 1.6146vw;
border: 1px solid;
border-image: linear-gradient(
135deg,
rgba(0, 176, 243, 0),
rgba(31, 143, 255, 1),
rgba(31, 143, 255, 0)
)
2 2;
position: absolute;
left: 0;
top: -2px;
}
}
.std-box {
flex: 1.3;
}
.chip-box {
flex: 1.3;
}
.bipv-box {
flex: 1.3;
}
.std-box,
.chip-box,
.bipv-box {
.separate::before {
content: "";
display: inline-block;
width: 1px;
height: 3.125vw;
border: 1px solid;
border-image: linear-gradient(
135deg,
rgba(0, 176, 243, 0),
rgba(31, 143, 255, 1),
rgba(31, 143, 255, 0)
)
2 2;
position: absolute;
left: 0;
top: -2px;
}
}
}
</style>

View File

@@ -7,17 +7,14 @@ import * as echarts from "echarts";
export default { export default {
name: "Store", name: "Store",
props: { props: {
vHeight: { stock: {
type: Number, type: Object,
default: 34,
},
xAxis: {
type: Array,
required: true, required: true,
}, },
series: { },
type: Array, computed: {
required: true, isOpen() {
return this.$store.getters.sidebar.opened;
}, },
}, },
data() { data() {
@@ -27,11 +24,10 @@ export default {
chart: "", chart: "",
options: { options: {
grid: { grid: {
left: "3%", left: "8%",
right: "1%", right: "1%",
bottom: "0", bottom: "8%",
top: "10%", top: "15%",
containLabel: true,
}, },
tooltip: {}, tooltip: {},
xAxis: { xAxis: {
@@ -47,7 +43,7 @@ export default {
color: "rgba(255, 255, 255, 0.7)", color: "rgba(255, 255, 255, 0.7)",
fontSize: 12, fontSize: 12,
}, },
data: this.xAxis, data: [],
}, },
yAxis: { yAxis: {
name: "单位/片", name: "单位/片",
@@ -116,18 +112,11 @@ export default {
}; };
}, },
watch: { watch: {
series(val) { stock(val) {
if (!val) { this.initChart();
this.initOptions(this.options); },
return; isOpen(val) {
} this.canvasReset();
const actualOptions = JSON.parse(JSON.stringify(this.options));
actualOptions.series[0].data = val[0].data;
actualOptions.series[0].name = val[0].name;
actualOptions.series[1].data = val[1].data;
actualOptions.series[1].name = val[1].name;
this.actualOptions = actualOptions;
this.initOptions(actualOptions);
}, },
}, },
mounted() { mounted() {
@@ -154,13 +143,20 @@ export default {
}, 500)(); }, 500)();
}, },
initChart() { initChart() {
let xAxis = Object.keys(this.stock) || [];
let data = [];
if (xAxis.length > 0) {
data = xAxis.map((item) => {
return this.stock[item].total;
});
}
if (this.chart) { if (this.chart) {
this.chart.dispose(); this.chart.dispose();
} }
this.chart = echarts.init(document.getElementById("factoryStoreChart")); this.chart = echarts.init(document.getElementById("factoryStoreChart"));
const actualOptions = JSON.parse(JSON.stringify(this.options)); const actualOptions = JSON.parse(JSON.stringify(this.options));
actualOptions.series[0].data = this.series[0].data; actualOptions.xAxis.data = xAxis;
actualOptions.series[0].name = this.series[0].name; actualOptions.series[0].data = data;
this.actualOptions = actualOptions; this.actualOptions = actualOptions;
this.chart.setOption(actualOptions); this.chart.setOption(actualOptions);
}, },

View File

@@ -0,0 +1,422 @@
<!--
* @Author: zhp
* @Date: 2024-07-25 10:10:07
* @LastEditTime: 2024-07-26 16:47:15
* @LastEditors: zhp
* @Description:
-->
<template>
<div class="prod-monitor">
<div class="data">
<div class="fto-box">
<div class="icon">
<img src="./../assets/images/fto.png" alt="" style="width: 2.1875vw; height: 2.2875vw" />
</div>
<div class="middle-box">
<span class="type">玻璃类型</span>
<span class="type-name">FTO</span>
</div>
<div class="right-box">
<span class="type">投入数量</span>
<span class="num">{{ prodFto[0] ? prodFto[0].chipInput.toLocaleString() : 0 }}</span>
</div>
</div>
<div class="std-box">
<div class="icon">
<img src="./../assets/images/std.png" alt="" style="width: 2.1875vw; height: 2.1875vw" />
</div>
<div class="middle-box">
<div class="separate">
<div>
<span class="type">玻璃类型</span>
<span class="type-name">标准组件</span>
</div>
<div>
<span class="type">良品数量</span>
<span class="type-name">{{
msgObj.stand.goodNumber ? msgObj.stand.goodNumber.toLocaleString() : 0
}}</span>
</div>
</div>
</div>
<div class="right-box">
<div class="separate">
<div>
<span class="type">生产数量</span>
<span class="num">{{
msgObj.stand.outputNumber ? msgObj.stand.outputNumber.toLocaleString() : 0
}}</span>
</div>
<div>
<span class="type1">良品率</span>
<span class="num">{{ msgObj.stand.yieldRate ? msgObj.stand.yieldRate.toFixed(2) : 0 }}%</span>
</div>
</div>
</div>
</div>
<div class="chip-box">
<div class="icon">
<img src="./../assets/images/chip.png" alt="" style="width: 2.1875vw; height: 2.1875vw" />
</div>
<div class="middle-box">
<div class="separate">
<div>
<span class="type">玻璃类型</span>
<span class="type-name">芯片</span>
</div>
<div>
<span class="type">良品数量</span>
<span class="type-name">{{
msgObj.chip.goodNumber ? msgObj.chip.goodNumber.toLocaleString() : 0
}}</span>
</div>
</div>
</div>
<div class="right-box">
<div class="separate">
<div>
<span class="type">生产数量</span>
<span class="num">{{
msgObj.chip.outputNumber ? msgObj.chip.outputNumber.toLocaleString() : 0
}}</span>
</div>
<div>
<span class="type1">良品率</span>
<span class="num">{{ msgObj.chip.yieldRate ? msgObj.chip.yieldRate.toFixed(2) : 0 }}%</span>
</div>
</div>
</div>
</div>
<div class="bipv-box" v-if="companyId != 0">
<div class="icon">
<img src="./../assets/images/bipv.png" alt="" style="width: 2.1875vw; height: 2.1875vw" />
</div>
<div class="middle-box">
<div class="separate">
<div>
<span class="type">玻璃类型</span>
<span class="type-name">BIPV</span>
</div>
<div>
<span class="type">良品数量</span>
<span class="type-name">{{
msgObj.bipv.goodNumber ? msgObj.bipv.goodNumber.toLocaleString() : 0
}}</span>
</div>
</div>
</div>
<div class="right-box">
<div class="separate">
<div>
<span class="type">生产数量</span>
<span class="num">{{
msgObj.bipv.outputNumber ? msgObj.bipv.outputNumber.toLocaleString() : 0
}}</span>
</div>
<div>
<span class="type1">良品率</span>
<span class="num">{{ msgObj.bipv.yieldRate ? msgObj.bipv.yieldRate.toFixed(2) : 0 }}%</span>
</div>
</div>
</div>
</div>
</div>
<div class="chart">
<div class="chart-title">
<span class="title">生产情况</span>
<div class="button-than" style="position: absolute;right: 0%;">
<CopilotButton v-for="i in ['同比', '环比']" :key="i" :label="i" :active="i === than"
@click="() => $emit('update:than', i)" />
</div>
<!-- <span class="line"></span> -->
</div>
<barChartBase v-if="factoryData.length != 0" :companyId="companyId" :than="than" :period="period" :data="factoryData"
ref="barChart" style="height: 0;flex:1">
</barChartBase>
</div>
</div>
</template>
<script>
import { number } from 'echarts';
import barChartBase from './ChipOee'
import CopilotButton from "./button.vue"
export default {
name: "ProdMonitor",
components: {
barChartBase,
CopilotButton
},
data() {
return {
bipvVis:false,
msgObj: {
stand: {},
chip: {},
bipv: {},
},
};
},
props: {
period: {
type: Number,
default: 1,
},
companyId: {
type: Number,
default:0
},
than: {
type: String,
},
than: {
type: String,
default: '同比',
},
prodOutPut: {
type: Array,
default: [],
},
prodFto: {
type: Array,
default: [],
},
factoryData: {
type: Object,
default: {},
},
showBipv: {
type: Boolean,
default:true,
}
},
watch: {
prodOutPut() {
this.makeData();
},
},
mounted() {
this.makeData();
this.$nextTick(() => {
let button = document.getElementsByClassName('button-than')
button[0].children[0].style.borderRadius = '4px 0 0 4px'
button[0].children[1].style.borderRadius = '0px 4px 4px 0'
})
},
methods: {
makeData() {
this.msgObj.chip = {};
this.msgObj.stand = {};
this.msgObj.bipv = {};
if (this.prodOutPut.length > 0) {
this.prodOutPut.map((item) => {
if (item.glassType === 0) {
this.msgObj.chip = item;
} else if (item.glassType === 1) {
this.msgObj.stand = item;
} else if (item.glassType === 2) {
this.msgObj.bipv = item;
}
});
}
},
},
};
</script>
<style lang="scss" scoped>
.prod-monitor {
height: 100%;
display: flex;
flex-direction: column;
.chart{
flex: 1;
display: flex;
flex-direction: column;
position: relative;
// gap: 6px;
.chart-title{
margin-top: 20px;
// flex: 1;
// gap: 6px;
height: 1.5vw;
width: 100%;
display: flex;
align-items: center;
// flex-direction: column;
// flex-wrap: nowrap;
// justify-content: end
// margin-top: 10px;
.title{
// flex: 1;
font-weight: 400;
font-size: 24px;
// width: 5vw;
color: #FFFFFF;
line-height: 24px;
// text-align: left;
font-style: normal;
display: inline-block;
}
// .line{
// flex: 1;
// // width: 80%;
// height: 1px; // display: inline-block;
// border: 1px solid;
// // display: inline-block;
// border-image: linear-gradient(90deg, rgba(25, 146, 255, 0) 10%, rgba(95, 190, 249, 1), rgba(0, 120, 228, 0) 90%,) 2 2;
// backdrop-filter: blur(3px);
// }
}
}
.data{
flex: 1;
display: flex;
gap: 6px;
flex-direction: column;
.fto-box,
.std-box,
.chip-box,
.bipv-box {
box-shadow: inset 0 0 12px 2px #fff3;
border-radius: 4px;
display: flex;
align-items: center;
.icon {
flex: 1;
text-align: center;
}
.middle-box {
flex: 2.086;
position: relative;
}
.right-box {
flex: 2.424;
position: relative;
}
.type {
display: inline-block;
font-size: 0.9375vw;
color: #6db6ff;
position: relative;
text-align: right;
padding-right: 0.417vw;
letter-spacing: 2px;
width: 6.25vw;
}
.type1 {
display: inline-block;
font-size: 0.9375vw;
color: #6db6ff;
position: relative;
text-align: right;
padding-right: 0.6vw;
width: 6.25vw;
padding-left: 1.6vw;
text-align: justify;
text-align-last: justify;
}
.type-name {
font-size: 1.042vw;
color: #fff;
position: relative;
text-align: left;
padding-left: 0.573vw;
}
.type-name::before {
content: "";
display: inline-block;
width: 1px;
height: 1.042vw;
border: 1px solid;
border-image: linear-gradient(180deg,
rgba(0, 176, 243, 0),
rgba(31, 143, 255, 1)) 2 2;
position: absolute;
left: 0;
top: 4px;
}
.num {
font-size: 1.042vw;
color: #fff;
position: relative;
text-align: left;
padding-left: 0.573vw;
}
.num::before {
content: "";
display: inline-block;
width: 1px;
height: 1.042vw;
border: 1px solid;
border-image: linear-gradient(180deg,
rgba(0, 176, 243, 0),
rgba(31, 143, 255, 1)) 2 2;
position: absolute;
left: 0;
top: 4px;
}
}
.fto-box {
flex: 1;
.type::before {
content: "";
display: inline-block;
width: 1px;
height: 1.6146vw;
border: 1px solid;
border-image: linear-gradient(135deg,
rgba(0, 176, 243, 0),
rgba(31, 143, 255, 1),
rgba(31, 143, 255, 0)) 2 2;
position: absolute;
left: 0;
top: -2px;
}
}
.std-box {
flex: 1;
}
.chip-box {
flex: 1;
}
.bipv-box {
flex: 1;
}
.std-box,
.chip-box,
.bipv-box {
.separate::before {
content: "";
display: inline-block;
width: 1px;
height: 3.125vw;
border: 1px solid;
border-image: linear-gradient(135deg,
rgba(0, 176, 243, 0),
rgba(31, 143, 255, 1),
rgba(31, 143, 255, 0)) 2 2;
position: absolute;
left: 0;
top: -2px;
}
}
}
}
</style>

View File

@@ -0,0 +1,99 @@
<!--
* @Author: zhp
* @Date: 2024-06-06 14:22:56
* @LastEditTime: 2024-07-02 13:54:08
* @LastEditors: zhp
* @Description:
-->
<template>
<button
class="copilot-btn"
:class="[active ? 'active' : '']"
@click="$emit('click', label)"
>
{{ label }}
</button>
</template>
<script>
export default {
name: "CopilotButton",
props: {
label: {
type: String,
required: true,
},
active: {
type: Boolean,
default: false,
},
},
};
</script>
<style>
button {
appearance: none;
outline: none;
border: none;
background: none;
}
</style>
<style scoped>
.copilot-btn {
/* flex: 1; */
/* position: relative; */
width: 88px;
height: 32px;
background: #01306C;
/* border-radius: 4px 0px 0px 4px; */
backdrop-filter: blur(3px);
/* text-align: center;
padding: 12px;
padding-left: 20px;
color: #fff;
font-size: 18px; */
font-family: PingFangSC, PingFang SC;
font-weight: 400;
font-size: 16px;
color: #FFFFFF;
line-height: 22px;
/* letter-spacing: 5px; */
text-align: center;
font-style: normal;
letter-spacing: 10px;
cursor: pointer;
}
.copilot-btn.active {
background: #1D74D8;
/* border-radius: 4px;; */
}
/* .copilot-btn::before,
.copilot-btn::after {
content: "";
position: absolute;
width: 16px;
height: 16px;
top: 0;
background: transparent;
border-style: solid;
border-width: 2px;
border-color: transparent;
border-top-color: #007be4;
}
.copilot-btn::before {
left: 0;
border-left-color: #007be4;
}
.copilot-btn::after {
right: 0;
border-right-color: #007be4;
} */
</style>

View File

@@ -0,0 +1,148 @@
<!--
* @Author: zhp
* @Date: 2024-06-07 08:37:17
* @LastEditTime: 2024-07-18 16:16:24
* @LastEditors: zhp
* @Description:
-->
<template>
<button
class="chart-btn"
:class="[active ? 'active' : '']"
@click="$emit('click', label)"
>
{{ label }}
</button>
</template>
<script>
export default {
name: "CopilotButton",
props: {
label: {
type: String,
required: true,
},
active: {
type: Boolean,
default: false,
},
},
mounted() {
},
};
</script>
<style>
button {
appearance: none;
outline: none;
border: none;
background: none;
}
</style>
<style scoped>
.skate {
/* flex: 1; */
position: relative;
width: 88px;
height: 32px;
background: #01306C;
/* border-radius: 4px 0px 0px 4px; */
backdrop-filter: blur(3px);
/* text-align: center;
padding: 12px;
padding-left: 20px;
color: #fff;
font-size: 18px; */
font-family: PingFangSC, PingFang SC;
font-weight: 400;
font-size: 14px;
color: #FFFFFF;
line-height: 22px;
letter-spacing: 5px;
text-align: center;
font-style: normal;
/* margin-right: 1px; */
/* letter-spacing: 10px; */
cursor: pointer;
}
.chart-btn:nth-child(6)::after {
content: '';
width: 0;
height: 0;
display: none;
}
.chart-btn {
/* flex: 1; */
position: relative;
width: 88px;
height: 32px;
background: #01306C;
/* border-radius: 4px 0px 0px 4px; */
backdrop-filter: blur(3px);
/* text-align: center;
padding: 12px;
padding-left: 20px;
color: #fff;
font-size: 18px; */
font-family: PingFangSC, PingFang SC;
font-weight: 400;
font-size: 14px;
color: #FFFFFF;
line-height: 22px;
letter-spacing: 5px;
text-align: center;
font-style: normal;
/* margin-right: 1px; */
/* letter-spacing: 10px; */
cursor: pointer;
}
.chart-btn::after {
/* flex: 1; */
/* position: relative; */
content: "";
position: absolute;
/* width: 16px; */
/* height: 16px; */
top: px;
right: -1px;
width: 1px;
height: 23px;
border: 1px solid #010D18;
}
.chart-btn.active {
background: #1D74D8;
/* border-radius: 4px;; */
}
.chart-btn.active::after {
display: none;
/* border-radius: 4px;; */
}
/* .copilot-btn::before,
.copilot-btn::after {
content: "";
position: absolute;
width: 16px;
height: 16px;
top: 0;
background: transparent;
border-style: solid;
border-width: 2px;
border-color: transparent;
border-top-color: #007be4;
}
.copilot-btn::before {
left: 0;
border-left-color: #007be4;
}
.copilot-btn::after {
right: 0;
border-right-color: #007be4;
} */
</style>

View File

@@ -0,0 +1,222 @@
<!--
* @Author: zhp
* @Date: 2024-06-05 09:36:07
* @LastEditTime: 2024-07-24 13:39:01
* @LastEditors: zhp
* @Description:
-->
<template>
<div class="copilot-container">
<!-- refresh btn -->
<button v-if="false" style="
appearance: none;
outline: none;
border: none;
background: none;
color: #fff;
cursor: pointer;
position: absolute;
top: 8px;
right: 8px;
" @click="$emit('refresh')">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"
style="width: 24px; height: 24px">
<path stroke-linecap="round" stroke-linejoin="round"
d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99" />
</svg>
</button>
<!-- decoration -->
<div class="corner tl"></div>
<div class="corner tr"></div>
<div class="corner bl"></div>
<div class="corner br"></div>
<!-- content -->
<div class="container-head" :class="[side == 'left' ? 'gradient-to-right' : 'gradient-to-left']">
<Icon style="margin-left: 16px;" :icon="icon"></Icon>
<h2 class="container-title">{{ title }}</h2>
</div>
<div class="container-body" :class="[
side == 'left' ? 'body-gradient-to-right' : 'body-gradient-to-left',
]">
<slot />
</div>
</div>
</template>
<script>
import ContainerIconVue from "./ContainerIcon.vue";
export default {
name: "DashboardContainer",
components: {
Icon: ContainerIconVue,
},
props: {
side: {
type: String,
default: "left",
},
icon: {
type: String,
default: "cube",
},
title: {
type: String,
default: "Default Title",
},
},
data() {
return {};
},
computed: {},
methods: {},
};
</script>
<style scoped lang="scss">
.copilot-container {
height: 0;
flex: 1;
display: flex;
flex-direction: column;
position: relative;
box-shadow: inset 0 0 20px 1px #fff1;
border-right: .13vw solid;
// border-image: linear-gradient(to bottom,transparent 10%,
// #024798 20%,
// transparent 90%) 1;
border-image:radial-gradient(circle at center,
#1481fd 2%,
#024798 95%,
transparent)1;
box-sizing: border-box;
backdrop-filter: blur(4px);
&::before {
content: "";
position: absolute;
display: inline-block;
height: 92%;
width: 0.13vw;
border-radius: 2px;
top: 0%;
left: 0;
background: linear-gradient(to bottom, transparent 10%, rgba(5, 138, 237, 1) 30%, rgba(2, 82, 215, 0.24) 90%);
z-index: 1;
}
&::after {
content: "";
position: absolute;
display: inline-block;
width: 80%;
height: 0.31415vh;
border-radius: 2px;
right: 4%;
bottom: 0;
background: linear-gradient(to right, transparent 60%, #4197f9 98%, transparent 98%);
z-index: 0;
}
.container-head {
// height: 40px;
height: 3.8vh;
padding: 8px;
display: flex;
align-items: center;
gap: 8px;
.container-title {
font-size: 1vw;
line-height: 1.39vw;
font-weight: normal;
letter-spacing: 2px;
}
}
.container-body {
padding: 20px;
display: flex;
flex-direction: column;
flex: 1;
height: 0;
}
.corner {
z-index: 1;
position: absolute;
// width: 16px;
// height: 16px;
width: 0.7vw;
height: 0.7vw;
}
.corner.tl {
border-top: 2px solid #0175dc;
border-left: 2px solid #0175dc;
top: 0;
left: 0;
}
.corner.tr {
top: 0;
right: 0;
border-top: 2px solid #0175dc;
border-right: 2px solid #0175dc;
}
.corner.bl {
// width: 20px;
// height: 20px;
width: 1.064vw;
height: 1.064vw;
bottom: 0;
left: 0;
// border-left: 10px solid #0175dc;
// border-bottom: 10px solid #0175dc;
// border-top: 10px solid transparent;
// border-right: 10px solid transparent;
border-left: 0.532vw solid transparent;
border-bottom: .6vw solid #0175dc;
border-top: 0.532vw solid transparent;
border-right: 0.532vw solid transparent;
}
.corner.br {
bottom: 0;
right: 0;
// width: 20px;
// height: 20px;
width: 1.064vw;
height: 1.064vw;
border-left: 0.532vw solid transparent;
border-bottom: 0.532vw solid #0175dc;
border-top: 0.532vw solid transparent;
border-right: 0.532vw solid #0175dc;
// border-left: 10px solid transparent;
// border-bottom: 10px solid #0175dc;
// border-top: 10px solid transparent;
// border-right: 10px solid #0175dc;
// transform: rotate(-90deg);
}
.gradient-to-right {
background: linear-gradient(to right, #0c3f68cc, transparent);
}
.gradient-to-left {
background: linear-gradient(to left, #0c3f68cc, transparent);
}
.body-gradient-to-right {
background: linear-gradient(to right, #0003, transparent);
}
.body-gradient-to-left {
background: linear-gradient(to left, #0003, transparent);
}
}
</style>

View File

@@ -0,0 +1,225 @@
<!--
filename: Container.vue
author: liubin
date: 2024-04-09 10:44:09
description:
-->
<template>
<div class="copilot-container">
<!-- refresh btn -->
<button v-if="false" style="
appearance: none;
outline: none;
border: none;
background: none;
color: #fff;
cursor: pointer;
position: absolute;
top: 8px;
right: 8px;
" @click="$emit('refresh')">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"
style="width: 24px; height: 24px">
<path stroke-linecap="round" stroke-linejoin="round"
d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99" />
</svg>
</button>
<!-- decoration -->
<div class="corner tl"></div>
<div class="corner tr"></div>
<div class="corner bl"></div>
<div class="corner br"></div>
<!-- content -->
<div class="container-head" ref="container-head"
:class="[side == 'left' ? 'gradient-to-right' : 'gradient-to-left']">
<Icon style="margin-left: 16px;" :icon="icon"></Icon>
<h2 class="container-title">{{ title }}</h2>
</div>
<div class="container-body" :class="[
side == 'left' ? 'body-gradient-to-right' : 'body-gradient-to-left',
]">
<slot />
</div>
</div>
</template>
<script>
import ContainerIconVue from "./ContainerIcon.vue"
export default {
name: "DashboardContainer",
components: {
Icon: ContainerIconVue,
},
props: {
side: {
type: String,
default: "left",
},
icon: {
type: String,
default: "cube",
},
title: {
type: String,
default: "Default Title",
},
},
data() {
return {
};
},
computed: {},
mounted() {
},
methods: {},
};
</script>
<style scoped lang="scss">
.copilot-container {
height: 100%;
flex: 1;
display: flex;
flex-direction: column;
position: relative;
box-shadow: inset 0 0 20px 1px #fff1;
border-right: .13vw solid;
// border-image: linear-gradient(to bottom,transparent 10%,
// #024798 20%,
// transparent 90%) 1;
border-image: linear-gradient(to bottom, transparent 10%, rgba(5, 138, 237, 1) 30%, rgba(2, 82, 215, 0.24) 90%)1;
box-sizing: border-box;
backdrop-filter: blur(4px);
&::before {
content: "";
position: absolute;
display: inline-block;
height: 92%;
width: 0.13vw;
border-radius: 2px;
top: 0%;
left: 0;
background: radial-gradient(circle at center,
#1481fd 2%,
#024798 95%,
transparent);
z-index: 1;
}
&::after {
content: "";
position: absolute;
display: inline-block;
width: 80%;
height: 0.31415vh;
border-radius: 2px;
left: 3%;
bottom: 0;
background: linear-gradient(to left, transparent 60%, #4197f9 98%, transparent 98%);
z-index: 0;
}
.container-head {
// height: 40px;
height: 3.8vh;
padding: 8px;
display: flex;
align-items: center;
gap: 8px;
.container-title {
font-size: 1vw;
line-height: 1.39vw;
font-weight: normal;
letter-spacing: 2px;
}
}
.container-body {
padding: 20px;
display: flex;
flex-direction: column;
flex: 1;
height: 0;
}
.corner {
z-index: 1;
position: absolute;
// width: 16px;
// height: 16px;
width: 0.7vw;
height: 0.7vw;
}
.corner.tl {
border-top: 2px solid #0175dc;
border-left: 2px solid #0175dc;
top: 0;
left: 0;
}
.corner.tr {
top: 0;
right: 0;
border-top: 2px solid #0175dc;
border-right: 2px solid #0175dc;
}
.corner.bl {
// width: 20px;
// height: 20px;
width: 1.064vw;
height: 1.064vw;
bottom: 0;
left: 0;
// border-left: 10px solid #0175dc;
// border-bottom: 10px solid #0175dc;
// border-top: 10px solid transparent;
// border-right: 10px solid transparent;
border-left: 0.532vw solid #0175dc;
border-bottom: 0.532vw solid #0175dc;
border-top: 0.532vw solid transparent;
border-right: 0.532vw solid transparent;
}
.corner.br {
bottom: 0;
right: 0;
// width: 20px;
// height: 20px;
width: 1.064vw;
height: 1.064vw;
// border-left: 10px solid transparent;
// border-bottom: 10px solid #0175dc;
// border-top: 10px solid transparent;
// border-right: 10px solid #0175dc;
// transform: rotate(-90deg);
border-left: 0.532vw solid transparent;
border-bottom: .6vw solid #0175dc;
border-top: 0.532vw solid transparent;
border-right: 0.532vw solid transparent;
}
.gradient-to-right {
background: linear-gradient(to right, #0c3f68cc, transparent);
}
.gradient-to-left {
background: linear-gradient(to left, #0c3f68cc, transparent);
}
.body-gradient-to-right {
background: linear-gradient(to right, #0003, transparent);
}
.body-gradient-to-left {
background: linear-gradient(to left, #0003, transparent);
}
}
</style>

View File

@@ -0,0 +1,223 @@
<template>
<div class="factory-layout">
<FactoryDataHeader :than="than" :companyName="companyName" :companyId="companyId" :period="period"
@update:than="updateThan" @update:period="updatePeriod" />
<div class="factory-section">
<section class="top flex">
<db-container title="生产监控" icon="prod">
<prod-monitor @update:than="updateThan" :companyId="companyId" :factoryData="factoryData" :than="than"
:period="period" :data="data" :prodOutPut="prodOutPut" :prodFto="prodFto" :showBipv="show" />
</db-container>
<left-container title="工单监控" icon="order">
<order @update:type="updateType" :type="type" :prodOrder="prodOrder" />
</left-container>
<!-- <db-container title="" icon="store"> -->
<!-- <store :stock="stock" /> -->
<!-- </db-container> -->
</section>
<!-- <section class="bottom flex"> -->
<!-- <db-container title="" icon="energy"> -->
<!-- <energy :legend="energyLegend" :energyCockpits="energyCockpits" /> -->
<!-- </db-container> -->
<!-- </section> -->
</div>
<div class="factory-footer">© 中建材智能自动化研究院有限公司</div>
</div>
</template>
<script>
import FactoryDataHeader from "./../components/FactoryDataHeader.vue";
import Container from "./components/rightContainer.vue";
import leftContainer from "./components/leftContainer.vue";
import ProdMonitor from "./components/bipvProdMonitor";
import { deepClone } from "@/utils";
// import Store from "./components/Store.vue";
// import Energy from "./components/Energy.vue";
import Order from "./components/Order.vue";
import { cockpitDataMonitor } from "@/api/produceData";
export default {
name: "factoryData",
components: {
FactoryDataHeader,
DbContainer: Container,
LeftContainer: leftContainer,
ProdMonitor,
// Store,
// Energy,
Order,
},
data() {
return {
type: '目标产量',
companyId: 1,
companyName: "邯郸中建材光电材料有限公司",
period: 1,
show: false,
than: '同比',
data: {},
// 接口获取的数据
prodOutPut: [], //生产
prodFto: [], //生产
stock: {}, //仓库
factoryData: {
preDataDetail: [],
currentDataDetail: {},
targetDataDetail: [],
},
energyCockpits: [], //能源
prodOrder: [], //订单
energyLegend: [
{ label: "电", color: "#FFD160" },
{ label: "水", color: "#2760FF" },
{ label: "气", color: "#12FFF5" },
],
};
},
mounted() {
this.getMes();
},
methods: {
updateType(val) {
console.log(val)
this.type = val
},
updateCompany(obj) {
this.companyId = obj.companyId;
this.companyName = obj.companyName;
this.getMes();
},
updateThan(val) {
console.log(val);
this.than = val;
this.getMes()
},
updatePeriod(val) {
this.period = val;
this.getMes();
},
getMes() {
cockpitDataMonitor({
factorys: [this.companyId],
date: this.period,
mode: this.than === '同比' ? 0 : 1
}).then((res) => {
console.log(res);
this.prodOutPut = res.data.prodOutputMonitorShDO || [];
this.prodFto = res.data.prodOutputFtoDO || [];
this.prodOrder = res.data.prodWorkOrderDO || [];
let prodOutputFtoListRes = res.data.prodOutputFtoDO || [];
let preFtoData = res.data.previousProdOutputFtoDO || [];
let preData = res.data.previousProdOutputMonitorShDO || [];
let factoryListResponse = res.data.prodOutputMonitorShDO || [];
let targetListResponse = res.data.prodTargetMonitorDO || [];
let preDataDetail = []
let currentDataDetail = []
let targetDataDetail = []
if (prodOutputFtoListRes) {
for (const factory of prodOutputFtoListRes) {
console.log(factory);
currentDataDetail[0] = factory.chipInput
}
}
if (preFtoData) {
for (const factory of preFtoData) {
console.log(factory);
// const fId = this.getPreFactoryId(factory);
// const preFId = getPreFactoryId(factory);
// if (fId) {
preDataDetail[0] = factory.previousYearChipInput
// }
// if (preFId) {
// ftoInvest.previous[fId] = factory.previousYearChipInput;
// }
}
}
if (preData && preData[0] != null) {
for (const factory of preData) {
if (factory.previousGlassType === 0) {
preDataDetail[1] = factory.previousOutputNumber
} else if (factory.previousGlassType === 1) {
preDataDetail[2] = factory.previousOutputNumber
} else if (factory.previousGlassType === 2) {
preDataDetail[3] = factory.previousOutputNumber
}
}
}
if (targetListResponse && targetListResponse[0] != null) {
for (const factory of targetListResponse) {
targetDataDetail[0] = factory.ftoInput
// if (factory.previousGlassType === 0) {
targetDataDetail[1] = factory.chipYield
// } else if (factory.previousGlassType === 1) {
targetDataDetail[2] = factory.componentYield
targetDataDetail[3] = factory.bipvProductoutput
// }
}
}
// console.log('ftoInvest',ftoInvest)
if (factoryListResponse && factoryListResponse[0] != null) {
for (const factory of factoryListResponse) {
// targetDataDetail[0] = factory.ftoInput
if (factory.glassType === 0) {
currentDataDetail[1] = factory.outputNumber
} else if (factory.glassType === 1) {
currentDataDetail[2] = factory.outputNumber
} else if (factory.glassType === 2) {
currentDataDetail[3] = factory.outputNumber
}
}
}
this.factoryData.preDataDetail = preDataDetail
this.factoryData.currentDataDetail = currentDataDetail
this.factoryData.targetDataDetail = targetDataDetail
});
},
},
};
</script>
<style lang="scss" scoped>
.factory-layout {
padding: 16px;
background: url(../../../assets/images/copilot-bg.png) 0 0 / 100% 100% no-repeat;
position: absolute;
height: calc(100% + 38px);
left: -16px;
top: -8px;
width: calc(100% + 30px);
z-index: 1001;
color: #fff;
display: flex;
flex-direction: column;
gap: 8px;
.factory-section {
flex: 1;
display: flex;
flex-direction: column;
gap: 16px;
.flex {
display: flex;
gap: 16px;
flex: 1;
}
.top>div,
.bottom>div {
height: 100%;
}
}
.factory-footer {
/** position: absolute;
bottom: 10px; **/
height: 10px;
width: 100%;
color: rgb(80, 80, 80);
user-select: none;
font-size: 14px;
letter-spacing: 1px;
display: grid;
place-content: center;
}
}
</style>

View File

@@ -1,141 +1,175 @@
<template> <template>
<div class="factory-layout"> <div class="factory-layout">
<FactoryDataHeader <FactoryDataHeader :companyName="companyName" :companyId="companyId" :period="period"
:companyName="companyName" @update:period="updatePeriod" />
:companyId="companyId"
:period="period"
@updateCompany="updateCompany"
@update:period="period = $event"
/>
<div class="factory-section"> <div class="factory-section">
<section class="top flex"> <section class="top flex">
<db-container title="生产监控" icon="prod"> <db-container title="生产监控" icon="prod">
<prod-monitor /> <prod-monitor @update:than="updateThan" :than="than" :companyId="companyId" :factoryData="factoryData"
</db-container> :period="period" :data="data" :prodOutPut="prodOutPut" :prodFto="prodFto" :showBipv="show" />
<db-container title="仓库监控.当前" icon="store">
<store :series="series" :xAxis="xAxis" />
</db-container>
</section>
<section class="bottom flex">
<db-container title="能源监控" icon="energy">
<energy
:legend="energyLegend"
:series="energySeries"
:xAxis="energyxAxis"
/>
</db-container>
<db-container title="订单监控" icon="order">
<order />
</db-container> </db-container>
<left-container title="工单监控" icon="order">
<order @update:type="updateType" :type="type" :prodOrder="prodOrder" />
</left-container>
<!-- <db-container title="" icon="store"> -->
<!-- <store :stock="stock" /> -->
<!-- </db-container> -->
</section> </section>
<!-- <section class="bottom flex"> -->
<!-- <db-container title="" icon="energy"> -->
<!-- <energy :legend="energyLegend" :energyCockpits="energyCockpits" /> -->
<!-- </db-container> -->
<!-- </section> -->
</div> </div>
<div class="factory-footer">© 中建材智能自动化研究院有限公司</div> <div class="factory-footer">© 中建材智能自动化研究院有限公司</div>
</div> </div>
</template> </template>
<script> <script>
import FactoryDataHeader from "./../components/FactoryDataHeader.vue"; import FactoryDataHeader from "./../components/FactoryDataHeader.vue";
import Container from "./components/Container.vue"; import Container from "./components/rightContainer.vue";
import ProdMonitor from "./components/ProdMonitor.vue"; import leftContainer from "./components/leftContainer.vue";
import Store from "./components/Store.vue";
import Energy from "./components/Energy.vue"; import ProdMonitor from "./components/ProdMonitor";
import { deepClone } from "@/utils";
// import Store from "./components/Store.vue";
// import Energy from "./components/Energy.vue";
import Order from "./components/Order.vue"; import Order from "./components/Order.vue";
import { cockpitDataMonitor } from "@/api/produceData"; import { cockpitDataMonitor } from "@/api/produceData";
export default { export default {
name: "FactoryData", name: "factoryData",
components: { components: {
FactoryDataHeader, FactoryDataHeader,
DbContainer: Container, DbContainer: Container,
LeftContainer:leftContainer,
ProdMonitor, ProdMonitor,
Store, // Store,
Energy, // Energy,
Order, Order,
}, },
data() { data() {
const year = new Date().getFullYear();
const cities = ["瑞昌", "邯郸", "株洲", "佳木斯", "成都", "凯盛", "蚌埠"];
return { return {
companyId: "1", companyId: 0,
type:'目标产量',
companyName: "瑞昌中建材光电材料有限公司", companyName: "瑞昌中建材光电材料有限公司",
period: "日", period: 1,
show:false,
than: '同比',
data:{},
// 接口获取的数据
prodOutPut: [], //生产
prodFto: [], //生产
stock: {}, //仓库
factoryData: {
preDataDetail: [],
currentDataDetail: {},
targetDataDetail: [],
},
energyCockpits: [], //能源
prodOrder: [], //订单
energyLegend: [ energyLegend: [
{ label: "电", color: "#FFD160" }, { label: "电", color: "#FFD160" },
{ label: "水", color: "#2760FF" }, { label: "水", color: "#2760FF" },
{ label: "气", color: "#12FFF5" }, { label: "气", color: "#12FFF5" },
], ],
energyxAxis: [3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7],
legend: [
{ label: `${year - 1}`, color: "#12f7f1" },
// { label: `${year}年`, color: "#58adfa" },
],
xAxis: cities,
}; };
}, },
computed: {
energySeries() {
return [
{
name: "电",
data: Array.from({ length: 7 }, () =>
Math.floor(Math.random() * 1000)
),
},
{
name: "水",
data: Array.from({ length: 7 }, () =>
Math.floor(Math.random() * 1000)
),
},
{
name: "气",
data: Array.from({ length: 7 }, () =>
Math.floor(Math.random() * 1000)
),
},
];
},
series() {
// const ftoInvest = this.$store.getters.home.ftoInvest;
// if (!ftoInvest || !ftoInvest.current || !ftoInvest.previous) {
return [
{
name: "2023年",
data: Array.from({ length: 7 }, () =>
Math.floor(Math.random() * 1000)
),
},
];
// }
// return [
// {
// name: `${new Date().getFullYear() - 1}年`,
// data: ftoInvest.previous,
// },
// {
// name: `${new Date().getFullYear()}年`,
// data: ftoInvest.current,
// },
// ];
},
},
mounted() { mounted() {
this.getMes1(); this.getMes();
}, },
methods: { methods: {
updateType(val) {
console.log(val)
this.type = val
},
updateCompany(obj) { updateCompany(obj) {
this.companyId = obj.companyId; this.companyId = obj.companyId;
this.companyName = obj.companyName; this.companyName = obj.companyName;
this.getMes();
}, },
getMes1() { updateThan(val) {
// cockpitDataMonitor({ console.log(val);
// factorys: ["1"], this.than = val;
// date: 4, this.getMes()
// }).then((res) => { },
// console.log(res); updatePeriod(val) {
// }); this.period = val;
cockpitDataMonitor().then((res) => {}); this.getMes();
},
getMes() {
cockpitDataMonitor({
factorys: [this.companyId],
date: this.period,
mode:this.than === '同比' ? 0 : 1
}).then((res) => {
console.log(res);
this.prodOutPut = res.data.prodOutputMonitorShDO || [];
this.prodFto = res.data.prodOutputFtoDO || [];
this.prodOrder = res.data.prodWorkOrderDO || [];
let prodOutputFtoListRes = res.data.prodOutputFtoDO || [];
let preFtoData = res.data.previousProdOutputFtoDO || [];
let preData = res.data.previousProdOutputMonitorShDO || [];
let factoryListResponse = res.data.prodOutputMonitorShDO || [];
let targetListResponse = res.data.prodTargetMonitorDO || [];
let preDataDetail = []
let currentDataDetail = []
let targetDataDetail = []
if (prodOutputFtoListRes) {
for (const factory of prodOutputFtoListRes) {
console.log(factory);
currentDataDetail[0] = factory.chipInput
}
}
if (preFtoData) {
for (const factory of preFtoData) {
console.log(factory);
// const fId = this.getPreFactoryId(factory);
// const preFId = getPreFactoryId(factory);
// if (fId) {
preDataDetail[0] = factory.previousYearChipInput
// }
// if (preFId) {
// ftoInvest.previous[fId] = factory.previousYearChipInput;
// }
}
}
if (preData) {
for (const factory of preData) {
if (factory.previousGlassType === 0) {
console.log('factory', factory)
preDataDetail[1] = factory.previousOutputNumber
} else if (factory.previousGlassType === 1) {
preDataDetail[2] = factory.previousOutputNumber
}
}
}
if (targetListResponse) {
for (const factory of targetListResponse) {
targetDataDetail[0] = factory.ftoInput
// if (factory.previousGlassType === 0) {
targetDataDetail[1] = factory.chipYield
// } else if (factory.previousGlassType === 1) {
targetDataDetail[2] = factory.componentYield
// }
}
}
// console.log('ftoInvest',ftoInvest)
if (factoryListResponse) {
for (const factory of factoryListResponse) {
// targetDataDetail[0] = factory.ftoInput
if (factory.glassType === 0) {
currentDataDetail[1] = factory.outputNumber
} else if (factory.glassType === 1) {
currentDataDetail[2] = factory.outputNumber
}
}
}
console.log(' this.factoryData.preDataDetail', preDataDetail);
this.factoryData.preDataDetail = preDataDetail
this.factoryData.currentDataDetail = currentDataDetail
this.factoryData.targetDataDetail = targetDataDetail
console.log(' this.factoryData', this.factoryData);
});
}, },
}, },
}; };

View File

@@ -0,0 +1,218 @@
<template>
<div class="factory-layout">
<FactoryDataHeader :than="than" :companyName="companyName" :companyId="companyId" :period="period"
@update:than="updateThan" @update:period="updatePeriod" />
<div class="factory-section">
<section class="top flex">
<db-container title="生产监控" icon="prod">
<prod-monitor :companyId="companyId" :factoryData="factoryData" :than="than" :period="period" :data="data"
:prodOutPut="prodOutPut" :prodFto="prodFto" :showBipv="show" />
</db-container>
<left-container title="工单监控" icon="order">
<order :prodOrder="prodOrder" />
</left-container>
<!-- <db-container title="" icon="store"> -->
<!-- <store :stock="stock" /> -->
<!-- </db-container> -->
</section>
<!-- <section class="bottom flex"> -->
<!-- <db-container title="" icon="energy"> -->
<!-- <energy :legend="energyLegend" :energyCockpits="energyCockpits" /> -->
<!-- </db-container> -->
<!-- </section> -->
</div>
<div class="factory-footer">© 中建材智能自动化研究院有限公司</div>
</div>
</template>
<script>
import FactoryDataHeader from "./../components/FactoryDataHeader.vue";
import Container from "./components/rightContainer.vue";
import leftContainer from "./components/leftContainer.vue";
import ProdMonitor from "./components/bipvProdMonitor.vue";
import { deepClone } from "@/utils";
// import Store from "./components/Store.vue";
// import Energy from "./components/Energy.vue";
import Order from "./components/Order.vue";
import { cockpitDataMonitor } from "@/api/produceData";
export default {
name: "factoryData",
components: {
FactoryDataHeader,
DbContainer: Container,
LeftContainer: leftContainer,
ProdMonitor,
// Store,
// Energy,
Order,
},
data() {
return {
companyId: 3,
companyName: "佳木斯中建材光电材料有限公司",
period: 1,
show: false,
than: '同比',
data: {},
// 接口获取的数据
prodOutPut: [], //生产
prodFto: [], //生产
stock: {}, //仓库
factoryData: {
preDataDetail: [],
currentDataDetail: {},
targetDataDetail: [],
},
energyCockpits: [], //能源
prodOrder: [], //订单
energyLegend: [
{ label: "电", color: "#FFD160" },
{ label: "水", color: "#2760FF" },
{ label: "气", color: "#12FFF5" },
],
};
},
mounted() {
this.getMes();
},
methods: {
updateCompany(obj) {
this.companyId = obj.companyId;
this.companyName = obj.companyName;
this.getMes();
},
updateThan(val) {
console.log(val);
this.than = val;
// this.getMes();
},
updatePeriod(val) {
this.period = val;
this.getMes();
},
getMes() {
cockpitDataMonitor({
factorys: [this.companyId],
date: this.period,
mode: this.than === '同比' ? 0 : 1
}).then((res) => {
console.log(res);
this.prodOutPut = res.data.prodOutputMonitorShDO || [];
this.prodFto = res.data.prodOutputFtoDO || [];
this.prodOrder = res.data.prodWorkOrderDO || [];
let prodOutputFtoListRes = res.data.prodOutputFtoDO || [];
let preFtoData = res.data.previousProdOutputFtoDO || [];
let preData = res.data.previousProdOutputMonitorShDO || [];
let factoryListResponse = res.data.prodOutputMonitorShDO || [];
let targetListResponse = res.data.prodTargetMonitorDO || [];
let preDataDetail = []
let currentDataDetail = []
let targetDataDetail = []
if (prodOutputFtoListRes) {
for (const factory of prodOutputFtoListRes) {
console.log(factory);
currentDataDetail[0] = factory.chipInput
}
}
if (preFtoData) {
for (const factory of preFtoData) {
console.log(factory);
// const fId = this.getPreFactoryId(factory);
// const preFId = getPreFactoryId(factory);
// if (fId) {
preDataDetail[0] = factory.previousYearChipInput
// }
// if (preFId) {
// ftoInvest.previous[fId] = factory.previousYearChipInput;
// }
}
}
if (preData && preData[0] != null) {
for (const factory of preData) {
if (factory.previousGlassType === 0) {
preDataDetail[1] = factory.previousYearOutputNumber
} else if (factory.previousGlassType === 1) {
preDataDetail[2] = factory.previousYearOutputNumber
} else if (factory.previousYearOutputNumber === 2) {
currentDataDetail[3] = factory.outputNumber
}
}
}
if (targetListResponse && targetListResponse[0] != null) {
for (const factory of targetListResponse) {
targetDataDetail[0] = factory.ftoInput
// if (factory.previousGlassType === 0) {
targetDataDetail[1] = factory.chipYield
// } else if (factory.previousGlassType === 1) {
targetDataDetail[2] = factory.componentYield
targetDataDetail[3] = factory.bipvProductoutput
// }
}
}
// console.log('ftoInvest',ftoInvest)
if (factoryListResponse && factoryListResponse[0] != null) {
for (const factory of factoryListResponse) {
// targetDataDetail[0] = factory.ftoInput
if (factory.glassType === 0) {
currentDataDetail[1] = factory.outputNumber
} else if (factory.glassType === 1) {
currentDataDetail[2] = factory.outputNumber
} else if (factory.glassType === 2) {
currentDataDetail[3] = factory.outputNumber
}
}
}
this.factoryData.preDataDetail = preDataDetail
this.factoryData.currentDataDetail = currentDataDetail
this.factoryData.targetDataDetail = targetDataDetail
});
},
},
};
</script>
<style lang="scss" scoped>
.factory-layout {
padding: 16px;
background: url(../../../assets/images/copilot-bg.png) 0 0 / 100% 100% no-repeat;
position: absolute;
height: calc(100% + 38px);
left: -16px;
top: -8px;
width: calc(100% + 30px);
z-index: 1001;
color: #fff;
display: flex;
flex-direction: column;
gap: 8px;
.factory-section {
flex: 1;
display: flex;
flex-direction: column;
gap: 16px;
.flex {
display: flex;
gap: 16px;
flex: 1;
}
.top>div,
.bottom>div {
height: 100%;
}
}
.factory-footer {
/** position: absolute;
bottom: 10px; **/
height: 10px;
width: 100%;
color: rgb(80, 80, 80);
user-select: none;
font-size: 14px;
letter-spacing: 1px;
display: grid;
place-content: center;
}
}
</style>

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