Compare commits

..

291 Commits

Author SHA1 Message Date
1c7c10205e Merge pull request 'projects/mesxc-dy' (#379) from projects/mesxc-dy into projects/mesxc-test
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #379
2024-04-29 17:00:48 +08:00
helloDy
74003e9d89 Merge branch 'projects/mesxc-test' into projects/mesxc-dy 2024-04-29 16:58:15 +08:00
helloDy
cb72e2b68a bug 2024-04-29 16:57:45 +08:00
025b061ec2 Merge pull request 'projects/mesxc-dy' (#378) from projects/mesxc-dy into projects/mesxc-test
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #378
2024-04-29 09:04:59 +08:00
helloDy
f2912eaee1 merge 2024-04-28 17:10:28 +08:00
helloDy
8025d00709 原片时间,bug 2024-04-28 17:04:22 +08:00
60edd8f2c4 Merge pull request 'projects/mesxc-zjl' (#377) from projects/mesxc-zjl into projects/mesxc-test
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #377
2024-04-27 10:46:40 +08:00
c0214c9eb7 24包装 2024-04-27 10:45:20 +08:00
da85e5211a Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-26 16:44:55 +08:00
23afb0db0d 质量样式 2024-04-26 16:44:01 +08:00
d0adf3a63e Merge pull request '报表确认, bug' (#376) from projects/mesxc-dy into projects/mesxc-test
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #376
2024-04-26 16:40:31 +08:00
helloDy
b81c95f796 报表确认, bug 2024-04-26 16:14:47 +08:00
e7f21456a3 Merge pull request 'projects/mesxc-zhp' (#375) from projects/mesxc-zhp into projects/mesxc-test
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #375
2024-04-26 13:59:41 +08:00
‘937886381’
1537b1be58 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-26 10:51:48 +08:00
‘937886381’
b2304941a4 修改bug 2024-04-26 10:51:24 +08:00
14b2a49053 Merge pull request 'projects/mesxc-dy' (#374) from projects/mesxc-dy into projects/mesxc-test
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #374
2024-04-26 10:39:55 +08:00
helloDy
6adac714f0 time 2024-04-26 10:36:29 +08:00
helloDy
0349f3cde0 Merge branch 'projects/mesxc-test' into projects/mesxc-dy 2024-04-26 10:16:38 +08:00
helloDy
4cafa78908 原片追溯,报表日期 2024-04-26 10:16:07 +08:00
61ef172534 Merge pull request 'projects/mesxc-zhp' (#373) from projects/mesxc-zhp into projects/mesxc-test
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #373
2024-04-26 10:15:45 +08:00
‘937886381’
19d913a49e Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-26 09:58:48 +08:00
‘937886381’
70c3fd44d6 修改bug 2024-04-26 09:58:14 +08:00
78d6f0bb23 Merge pull request 'projects/mesxc-zhp' (#372) from projects/mesxc-zhp into projects/mesxc-test
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #372
2024-04-26 09:54:08 +08:00
‘937886381’
cf51eff0b7 修改bug 2024-04-26 09:52:37 +08:00
‘937886381’
539dddf217 修改bug 2024-04-26 09:51:31 +08:00
‘937886381’
317d01934b Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-26 09:28:46 +08:00
‘937886381’
cdfe5c9c1b 修改bug 2024-04-26 09:28:24 +08:00
c1ea5157a5 Merge pull request 'projects/mesxc-zjl' (#371) from projects/mesxc-zjl into projects/mesxc-test
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #371
2024-04-26 08:56:39 +08:00
41ceefc20e Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-26 08:51:25 +08:00
54425859b5 报表 2024-04-26 08:50:32 +08:00
a2a4f8dccd Merge pull request 'projects/mesxc-zhp' (#370) from projects/mesxc-zhp into projects/mesxc-test
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #370
2024-04-26 08:49:53 +08:00
‘937886381’
fd3b054108 修改bug 2024-04-26 08:42:24 +08:00
‘937886381’
dacae0cbd8 修改bug 2024-04-26 08:32:32 +08:00
‘937886381’
be83c8196e 修改bug 2024-04-25 18:50:58 +08:00
‘937886381’
ef3f5d3fe7 修改bug 2024-04-25 17:14:16 +08:00
‘937886381’
ec550f22ec 修改bug 2024-04-25 17:08:59 +08:00
‘937886381’
60633ac581 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-25 17:03:24 +08:00
‘937886381’
9351b82d11 修改bug 2024-04-25 17:02:52 +08:00
5e4227ba25 Merge pull request 'projects/mesxc-zjl' (#369) from projects/mesxc-zjl into projects/mesxc-test
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #369
2024-04-25 14:50:30 +08:00
82f63dc4ff Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-25 14:49:08 +08:00
9a29185410 1 2024-04-25 14:46:32 +08:00
43e824f958 Merge pull request 'projects/mesxc-dy' (#368) from projects/mesxc-dy into projects/mesxc-test
Some checks are pending
continuous-integration/drone/push Build is running
Reviewed-on: #368
2024-04-25 14:45:40 +08:00
helloDy
de831b339f Merge branch 'projects/mesxc-test' into projects/mesxc-dy 2024-04-25 14:44:05 +08:00
helloDy
f0105c377c bug and 原片 2024-04-25 14:43:29 +08:00
3ba5574669 Merge pull request 'projects/mesxc-zhp' (#367) from projects/mesxc-zhp into projects/mesxc-test
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #367
2024-04-25 14:21:29 +08:00
‘937886381’
082988d6d7 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-25 13:57:11 +08:00
‘937886381’
7acb861919 修改bug 2024-04-25 13:56:49 +08:00
c41153a946 Merge pull request 'projects/mesxc-zjl' (#366) from projects/mesxc-zjl into projects/mesxc-test
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #366
2024-04-25 11:09:31 +08:00
6d658d9212 Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-25 11:08:15 +08:00
bf4bab2f3c 烟气隐藏 2024-04-25 11:06:16 +08:00
20f0efa413 Merge pull request 'projects/mesxc-zhp' (#365) from projects/mesxc-zhp into projects/mesxc-test
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #365
2024-04-25 10:58:01 +08:00
‘937886381’
c48f81b1d9 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-25 10:19:25 +08:00
‘937886381’
7233720c2e 修改bug 2024-04-25 10:19:02 +08:00
6a491ff498 Merge pull request 'projects/mesxc-zhp' (#364) from projects/mesxc-zhp into projects/mesxc-test
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #364
2024-04-25 10:08:47 +08:00
‘937886381’
be607e4bf3 解决冲突 2024-04-25 10:07:19 +08:00
‘937886381’
87ef42e277 修改bug 2024-04-25 10:05:41 +08:00
aa65a7e97e Merge pull request 'projects/mesxc-dy' (#363) from projects/mesxc-dy into projects/mesxc-test
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #363
2024-04-25 10:01:22 +08:00
helloDy
b8d26c87d8 月报年报 2024-04-25 09:57:13 +08:00
b89f510e61 Merge pull request '1' (#362) from projects/mesxc-zjl into projects/mesxc-test
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #362
2024-04-25 09:13:09 +08:00
helloDy
0e60f426bc Merge branch 'projects/mesxc-test' into projects/mesxc-dy 2024-04-25 09:11:00 +08:00
helloDy
21f4879394 date 2024-04-25 09:10:28 +08:00
067cd4765e 1 2024-04-25 09:04:29 +08:00
3c4fe6daaa Merge pull request 'projects/mesxc-dy' (#361) from projects/mesxc-dy into projects/mesxc-test
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #361
2024-04-25 08:42:57 +08:00
helloDy
e24f9c1079 Merge branch 'projects/mesxc-test' into projects/mesxc-dy 2024-04-25 08:40:38 +08:00
helloDy
61567ce86a 生产数据汇总 2024-04-25 08:40:08 +08:00
2ee66714ca Merge pull request '修改' (#360) from projects/mesxc-zjl into projects/mesxc-test
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #360
2024-04-24 17:06:02 +08:00
ab5867c4fd 修改 2024-04-24 17:05:19 +08:00
shr
9a53391999 👷 添加自动构建发布配置
Some checks failed
continuous-integration/drone/push Build is failing
2024-04-24 16:03:10 +08:00
ec0c09a674 Merge pull request 'projects/mesxc-zhp' (#358) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #358
2024-04-24 14:54:40 +08:00
‘937886381’
90e9b179eb Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-24 14:52:32 +08:00
‘937886381’
8e2b332c7b 修改bug 2024-04-24 14:52:01 +08:00
f37a12d2e1 Merge pull request '修改bug' (#357) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #357
2024-04-24 14:38:13 +08:00
cb19872012 Merge pull request 'projects/mesxc-zhp' (#356) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #356
2024-04-24 14:37:05 +08:00
‘937886381’
8ba79185d4 修改bug 2024-04-24 14:36:45 +08:00
‘937886381’
104cda5a41 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-24 14:34:08 +08:00
‘937886381’
151c5708c4 修改bug 2024-04-24 14:33:46 +08:00
837735b7e8 Merge pull request 'projects/mesxc-zhp' (#355) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #355
2024-04-24 14:25:03 +08:00
‘937886381’
e00a08385f Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-24 14:23:47 +08:00
‘937886381’
a8c3d2c585 修改bug 2024-04-24 14:23:13 +08:00
eb097e77bd Merge pull request 'projects/mesxc-zhp' (#354) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #354
2024-04-24 13:50:44 +08:00
‘937886381’
30eecb8bd1 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-24 13:49:44 +08:00
‘937886381’
f4a6229170 修改bug 2024-04-24 13:49:23 +08:00
ab593bff20 Merge pull request 'projects/mesxc-zjl' (#353) from projects/mesxc-zjl into projects/mesxc-test
Reviewed-on: #353
2024-04-24 13:32:26 +08:00
4b01dd3ec3 merge test 2024-04-24 13:31:55 +08:00
ed3ea7dde8 Merge pull request 'projects/mesxc-dy' (#352) from projects/mesxc-dy into projects/mesxc-test
Reviewed-on: #352
2024-04-24 13:30:39 +08:00
1d9e272f99 驾驶舱 2024-04-24 13:30:06 +08:00
helloDy
43c9153777 冲突 2024-04-23 17:25:39 +08:00
helloDy
c6d504583b 生产数据汇总表 2024-04-23 17:23:54 +08:00
‘937886381’
22f3c87f02 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-23 16:47:49 +08:00
‘937886381’
1f54c9179d 修改bug 2024-04-23 16:47:27 +08:00
f7247f5161 Merge pull request 'projects/mesxc-zhp' (#351) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #351
2024-04-23 16:28:30 +08:00
‘937886381’
c8856f34b5 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-23 16:19:23 +08:00
‘937886381’
42c42abc08 新增报表 2024-04-23 16:19:01 +08:00
0fffed9b0e Merge pull request 'projects/mesxc-zhp' (#350) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #350
2024-04-23 15:26:03 +08:00
‘937886381’
d251daa3f5 修改bug 2024-04-23 15:23:43 +08:00
‘937886381’
ed5120ca97 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-23 15:09:42 +08:00
‘937886381’
becf34d089 修改bug 2024-04-23 15:09:07 +08:00
f0d64de77b Merge pull request 'projects/mesxc-zjl' (#349) from projects/mesxc-zjl into projects/mesxc-test
Reviewed-on: #349
2024-04-23 14:44:04 +08:00
56819176b3 Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-23 14:43:32 +08:00
d302179f6f Merge pull request 'projects/mesxc-zhp' (#348) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #348
2024-04-23 14:42:19 +08:00
8c117fae8e 报表 2024-04-23 14:42:02 +08:00
‘937886381’
b6cf7b2ddc 剞劂冲突 2024-04-23 13:53:33 +08:00
‘937886381’
2f98b42bd2 新增报表 2024-04-23 13:52:10 +08:00
fb8ae9226a Merge pull request 'projects/mesxc-zjl' (#347) from projects/mesxc-zjl into projects/mesxc-test
Reviewed-on: #347
2024-04-23 09:13:51 +08:00
3d3763c4ef merge test 2024-04-23 09:13:29 +08:00
ea675b9dea Merge pull request 'projects/mesxc-zhp' (#346) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #346
2024-04-23 09:11:45 +08:00
bda065e4be 报表 2024-04-23 09:11:14 +08:00
‘937886381’
5ea4c219ed 新增报表 2024-04-22 17:14:59 +08:00
helloDy
16186667da merge 2024-04-22 15:20:56 +08:00
helloDy
c7cd6e7b1e 部门换接口 2024-04-22 15:19:35 +08:00
‘937886381’
29c3a9fb72 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-22 08:55:20 +08:00
‘937886381’
1e1313d090 修改bug 2024-04-22 08:54:55 +08:00
d0eb1d84c8 Merge pull request 'projects/mesxc-zhp' (#344) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #344
2024-04-19 17:02:23 +08:00
‘937886381’
445d8f4818 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-19 17:01:17 +08:00
‘937886381’
46ce982cfc 新增报表 2024-04-19 16:59:47 +08:00
391e06a382 Merge pull request 'projects/mesxc-zjl' (#342) from projects/mesxc-zjl into projects/mesxc-test
Reviewed-on: #342
2024-04-19 11:11:19 +08:00
72e1b4e8f9 Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-19 11:10:38 +08:00
b41ba04cb4 Merge pull request 'projects/mesxc-zhp' (#341) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #341
2024-04-19 11:09:12 +08:00
‘937886381’
4482ce0433 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-19 11:07:43 +08:00
‘937886381’
ecf6745c8a 报表新增 2024-04-19 11:07:14 +08:00
c9128ce946 包装40% 2024-04-19 11:03:50 +08:00
ba08175de8 Merge pull request 'projects/mesxc-zhp' (#340) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #340
2024-04-17 16:36:22 +08:00
‘937886381’
22f8322baf Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-17 16:16:37 +08:00
‘937886381’
6f8abc9758 修改ui 2024-04-17 16:15:59 +08:00
59d53b60c7 Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-17 13:23:20 +08:00
d448280782 test 2024-04-16 15:29:39 +08:00
0337b54202 Merge pull request 'projects/mesxc-zhp' (#339) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #339
2024-04-16 14:07:17 +08:00
‘937886381’
9dec81e0b2 修改ui 2024-04-16 14:04:43 +08:00
‘937886381’
64de2c50b6 修改bug 2024-04-16 13:52:38 +08:00
‘937886381’
bd0f9e24fd Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-16 13:46:08 +08:00
‘937886381’
f3043ee11f 修改ui 2024-04-16 13:45:38 +08:00
5584a47575 Merge pull request 'projects/mesxc-zjl' (#337) from projects/mesxc-zjl into projects/mesxc-test
Reviewed-on: #337
2024-04-15 14:59:29 +08:00
b0078cb099 1 2024-04-15 14:49:28 +08:00
e5acd497b5 Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-15 09:35:46 +08:00
6b452dce36 能源bug 2024-04-15 09:35:00 +08:00
aacf87f6d3 Merge pull request 'projects/mesxc-zhp' (#336) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #336
2024-04-15 09:31:35 +08:00
‘937886381’
bfa17e422d Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-15 09:29:29 +08:00
‘937886381’
e25f872589 修改ui 2024-04-15 09:28:49 +08:00
83b834d2fc Merge pull request 'projects/mesxc-zjl' (#335) from projects/mesxc-zjl into projects/mesxc-test
Reviewed-on: #335
2024-04-12 17:02:46 +08:00
1b2c16fcdb Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-12 17:01:59 +08:00
475ec35ec5 1 2024-04-12 16:59:34 +08:00
1328da9616 Merge pull request 'projects/mesxc-lb' (#334) from projects/mesxc-lb into projects/mesxc-test
Reviewed-on: #334
2024-04-12 16:50:11 +08:00
lb
92b9ec7da7 Merge branch 'projects/mesxc-test' into projects/mesxc-lb 2024-04-12 16:46:20 +08:00
c1af47db81 Merge pull request 'projects/mesxc-zhp' (#333) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #333
2024-04-12 16:44:38 +08:00
lb
15afbcd612 bugfix 特殊设备权限 2024-04-12 16:40:15 +08:00
‘937886381’
dabbc6b63a 修改bug 2024-04-12 15:27:01 +08:00
‘937886381’
cfab3353d3 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-12 15:18:43 +08:00
‘937886381’
2298fc56b6 修改bug 2024-04-12 15:17:21 +08:00
bb77d0f8c6 Merge pull request 'projects/mesxc-zhp' (#332) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #332
2024-04-12 14:58:10 +08:00
‘937886381’
e8938a62eb 解决冲突 2024-04-12 14:31:56 +08:00
‘937886381’
2a599d96b3 修改bug 2024-04-12 14:30:11 +08:00
‘937886381’
6050eb4df5 修改bug 2024-04-12 14:27:51 +08:00
lb
02c3b3db0d Merge branch 'projects/mesxc-test' into projects/mesxc-lb 2024-04-12 13:53:50 +08:00
3308fcbef9 Merge pull request 'projects/mesxc-zjl' (#331) from projects/mesxc-zjl into projects/mesxc-test
Reviewed-on: #331
2024-04-12 11:21:05 +08:00
cb7135bad5 merge test 2024-04-12 11:16:15 +08:00
4a56f92961 Merge pull request 'projects/mesxc-dy' (#330) from projects/mesxc-dy into projects/mesxc-test
Reviewed-on: #330
2024-04-12 11:10:01 +08:00
helloDy
8f11c2f47c Merge branch 'projects/mesxc-test' into projects/mesxc-dy 2024-04-12 11:05:44 +08:00
helloDy
b41dc9593c 权限22 2024-04-12 11:05:11 +08:00
862fe20760 能源bug 2024-04-12 08:56:32 +08:00
1ed409a98e Merge pull request 'projects/mesxc-zhp' (#329) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #329
2024-04-11 16:55:43 +08:00
68e738cf12 Merge pull request 'projects/mesxc-dy' (#328) from projects/mesxc-dy into projects/mesxc-test
Reviewed-on: #328
2024-04-11 16:55:03 +08:00
‘937886381’
4866198a98 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-11 16:54:49 +08:00
‘937886381’
49df8a72bd 修改bug 2024-04-11 16:54:22 +08:00
helloDy
087af452de Merge branch 'projects/mesxc-test' into projects/mesxc-dy 2024-04-11 16:54:02 +08:00
helloDy
63a753d7d6 权限 2024-04-11 16:49:48 +08:00
b1cdf083dd Merge pull request 'projects/mesxc-zjl' (#327) from projects/mesxc-zjl into projects/mesxc-test
Reviewed-on: #327
2024-04-11 15:37:55 +08:00
673ddcb996 Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-11 15:36:54 +08:00
a9e60dbe82 Merge pull request 'projects/mesxc-zhp' (#326) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #326
2024-04-11 15:28:36 +08:00
‘937886381’
92d197a513 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-11 15:27:11 +08:00
‘937886381’
e7f440a142 修改bug 2024-04-11 15:26:51 +08:00
5d3622bf62 权限 2024-04-11 15:22:09 +08:00
5ccb9297e1 4.11 2024-04-11 11:18:08 +08:00
ce528f18b6 Merge pull request 'projects/mesxc-zhp' (#325) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #325
2024-04-11 11:16:10 +08:00
‘937886381’
024060182e Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-11 11:04:14 +08:00
‘937886381’
4f111a95d6 修改看板 2024-04-11 11:03:48 +08:00
8fc6b73179 Merge pull request 'projects/mesxc-zjl' (#324) from projects/mesxc-zjl into projects/mesxc-test
Reviewed-on: #324
2024-04-10 17:39:29 +08:00
7f504e5cdd Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-10 17:37:50 +08:00
7c5d8bde0b 能源权限 2024-04-10 17:36:37 +08:00
‘937886381’
0b1761e83c Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-10 16:52:56 +08:00
‘937886381’
cafa156d72 更改需求 2024-04-10 16:52:18 +08:00
ed46ed7d09 Merge pull request 'projects/mesxc-zhp' (#323) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #323
2024-04-10 16:26:37 +08:00
‘937886381’
f89c6dfe14 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-10 16:12:23 +08:00
‘937886381’
a3b2eae33f 深加工新需求 2024-04-10 16:11:29 +08:00
e70ff40554 Merge pull request '修改成本新的权限字段' (#322) from projects/mesxc-zwq into projects/mesxc-test
Reviewed-on: #322
2024-04-10 14:49:44 +08:00
zwq
d3d93acd0f 修改成本新的权限字段 2024-04-10 14:48:37 +08:00
93236f9828 移除部分监听 2024-04-10 14:17:30 +08:00
‘937886381’
fef8824844 修改bug 2024-04-09 16:05:28 +08:00
a4fceeb981 Merge pull request 'projects/mesxc-zjl' (#321) from projects/mesxc-zjl into projects/mesxc-test
Reviewed-on: #321
2024-04-09 13:09:55 +08:00
84468cc883 Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-09 13:06:21 +08:00
ea04d55fc1 驾驶舱 2024-04-09 13:04:40 +08:00
ef1078360a Merge pull request '更新成本' (#319) from projects/mesxc-zwq into projects/mesxc-test
Reviewed-on: #319
2024-04-09 11:06:14 +08:00
zwq
60f6c3a8fe 更新成本 2024-04-09 11:05:37 +08:00
a4b340ac5d Merge pull request 'projects/mesxc-dy' (#318) from projects/mesxc-dy into projects/mesxc-test
Reviewed-on: #318
2024-04-09 08:18:01 +08:00
helloDy
2592551e66 Merge branch 'projects/mesxc-test' into projects/mesxc-dy 2024-04-08 17:03:21 +08:00
helloDy
1fde96e677 工单bug,改动 2024-04-08 17:02:55 +08:00
0b16e1fe0d Merge pull request '驾驶舱修改' (#317) from projects/mesxc-zjl into projects/mesxc-test
Reviewed-on: #317
2024-04-08 16:39:30 +08:00
abcec3bcdc Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-08 16:38:59 +08:00
bdd14eec70 驾驶舱修改 2024-04-08 16:38:12 +08:00
44e7e219a4 Merge pull request 'projects/mesxc-zhp' (#316) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #316
2024-04-08 16:37:26 +08:00
‘937886381’
ec51beb8ea Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-08 15:14:37 +08:00
‘937886381’
433618e71d 修改bug 2024-04-08 15:13:52 +08:00
812b72f10d Merge pull request 'projects/mesxc-zhp' (#315) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #315
2024-04-08 15:11:34 +08:00
‘937886381’
05f10ab51d Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-08 14:49:46 +08:00
‘937886381’
e7828fd277 修改bug 2024-04-08 14:49:20 +08:00
58457487d1 Merge pull request 'projects/mesxc-zhp' (#314) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #314
2024-04-08 14:09:52 +08:00
‘937886381’
6c54c223c5 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-08 13:55:56 +08:00
‘937886381’
b2cc509f8e 权限 2024-04-08 13:55:22 +08:00
b6236e89b1 Merge pull request '1' (#313) from projects/mesxc-zjl into projects/mesxc-test
Reviewed-on: #313
2024-04-08 12:26:34 +08:00
cbc7cbc574 1 2024-04-08 12:25:44 +08:00
b5b952e1cc Merge pull request 'projects/mesxc-zjl' (#312) from projects/mesxc-zjl into projects/mesxc-test
Reviewed-on: #312
2024-04-08 10:44:09 +08:00
33ed9f15fa Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-08 10:42:42 +08:00
c85c6e4323 能源 2024-04-08 10:41:43 +08:00
30d22b34e1 Merge pull request '成本按钮权限' (#311) from projects/mesxc-zwq into projects/mesxc-test
Reviewed-on: #311
2024-04-08 09:05:52 +08:00
zwq
3d3fa2ccee 成本按钮权限 2024-04-08 09:05:10 +08:00
f960ece594 Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-07 16:14:52 +08:00
949675b3a2 1 2024-04-07 16:13:57 +08:00
f52815abe6 Merge pull request 'projects/mesxc-zhp' (#310) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #310
2024-04-07 16:09:32 +08:00
‘937886381’
ac4cea0c7e Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-07 16:07:30 +08:00
‘937886381’
93fea84c79 修改bug 2024-04-07 16:07:04 +08:00
a06682de3f Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-07 15:41:17 +08:00
e1773dae03 1 2024-04-07 15:39:26 +08:00
f6d866907c Merge pull request 'projects/mesxc-zjl' (#309) from projects/mesxc-zjl into projects/mesxc-test
Reviewed-on: #309
2024-04-07 12:19:50 +08:00
7fe8d7e72c 能源手动抄表 2024-04-07 12:18:52 +08:00
1e4a33a703 Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-07 08:40:39 +08:00
d1ad913bab Merge pull request 'projects/mesxc-zhp' (#308) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #308
2024-04-03 18:14:55 +08:00
‘937886381’
38edf00925 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-03 18:13:55 +08:00
‘937886381’
bf231f7157 修改ui 2024-04-03 18:13:31 +08:00
04e2471a54 Merge pull request 'projects/mesxc-zhp' (#307) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #307
2024-04-03 17:37:34 +08:00
‘937886381’
9e2ce5f636 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-03 17:20:40 +08:00
‘937886381’
8a54c046d9 修改ui 2024-04-03 17:20:14 +08:00
3fa702cc12 Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-03 16:45:18 +08:00
8ebff703ee Merge pull request 'projects/mesxc-zhp' (#306) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #306
2024-04-03 16:36:41 +08:00
‘937886381’
02e267e647 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-03 16:34:39 +08:00
‘937886381’
a6ffba4cf8 修改bug 2024-04-03 16:34:15 +08:00
3de4d5c5f2 Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-03 16:33:32 +08:00
c6c2d1c3b1 Merge pull request 'projects/mesxc-zhp' (#305) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #305
2024-04-03 16:31:31 +08:00
‘937886381’
1bbd749094 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-03 16:30:35 +08:00
‘937886381’
073b4b8e20 修改bug 2024-04-03 16:30:09 +08:00
3ec82a6a41 Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-03 16:27:32 +08:00
7c83268e0c 能源类型 2024-04-03 16:05:27 +08:00
49cb1e6877 Merge pull request 'projects/mesxc-zhp' (#304) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #304
2024-04-03 16:04:07 +08:00
‘937886381’
481dde003a Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-03 16:01:37 +08:00
‘937886381’
43e54e8ee7 修改bug 2024-04-03 16:01:11 +08:00
28dbe075a4 Merge pull request 'projects/mesxc-dy' (#303) from projects/mesxc-dy into projects/mesxc-test
Reviewed-on: #303
2024-04-03 15:11:41 +08:00
helloDy
4571786780 merge 2024-04-03 11:22:32 +08:00
helloDy
21cef13168 table chart 2024-04-03 11:21:37 +08:00
5f5e0ffc69 Merge pull request '1' (#302) from projects/mesxc-zjl into projects/mesxc-test
Reviewed-on: #302
2024-04-03 09:02:11 +08:00
4d0841bd32 1 2024-04-03 09:01:43 +08:00
b6d3b17300 Merge pull request 'projects/mesxc-zjl' (#301) from projects/mesxc-zjl into projects/mesxc-test
Reviewed-on: #301
2024-04-02 16:56:20 +08:00
dad71db912 Merge branch 'projects/mesxc-test' into projects/mesxc-zjl 2024-04-02 16:55:29 +08:00
94c7f803cc 能源需求修改 2024-04-02 16:54:36 +08:00
0dae8cd16d Merge pull request 'projects/mesxc-zhp' (#300) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #300
2024-04-02 15:03:51 +08:00
‘937886381’
1fd547893f 修改bug 2024-04-02 15:01:56 +08:00
‘937886381’
ad5812df96 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-02 14:56:28 +08:00
‘937886381’
c01106e389 修改bug 2024-04-02 14:56:02 +08:00
021182e873 Merge pull request 'projects/mesxc-zhp' (#298) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #298
2024-04-02 13:57:53 +08:00
‘937886381’
71834ef906 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-02 13:56:55 +08:00
‘937886381’
412ec6ab0c 修改bug 2024-04-02 13:56:23 +08:00
9aca4874c1 Merge pull request 'projects/mesxc-zhp' (#297) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #297
2024-04-02 09:50:34 +08:00
‘937886381’
c9d25e5e88 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-02 09:48:24 +08:00
‘937886381’
610090c2a0 修改bug 2024-04-02 09:47:52 +08:00
83917eaf4a Merge pull request 'projects/mesxc-zhp' (#296) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #296
2024-04-01 09:31:29 +08:00
‘937886381’
d64e9b9535 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-04-01 09:26:16 +08:00
‘937886381’
b0f44c2332 修改ui 2024-04-01 09:25:54 +08:00
8ae9efe4bd Merge pull request 'projects/mesxc-zhp' (#295) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #295
2024-03-29 17:07:44 +08:00
‘937886381’
15358fd7e2 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-03-29 17:02:11 +08:00
‘937886381’
dfabc9ed23 修改ui 2024-03-29 17:01:51 +08:00
78f6165cfc Merge pull request 'projects/mesxc-zhp' (#294) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #294
2024-03-29 17:01:37 +08:00
‘937886381’
7944824ffe Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-03-29 16:59:36 +08:00
984cf2e7d5 Merge pull request 'projects/mesxc-lb' (#293) from projects/mesxc-lb into projects/mesxc-test
Reviewed-on: #293
2024-03-29 16:58:46 +08:00
‘937886381’
07bc6aab69 Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-03-29 16:56:44 +08:00
‘937886381’
7a14b2846a 修改bug 2024-03-29 16:56:21 +08:00
lb
db7d4745dd Merge branch 'projects/mesxc-test' into projects/mesxc-lb 2024-03-29 16:55:52 +08:00
lb
6b99175574 update again 2024-03-29 16:30:37 +08:00
helloDy
34aeb029b5 Merge branch 'projects/mesxc-test' into projects/mesxc-dy 2024-03-29 14:38:26 +08:00
helloDy
caf614ca35 操作 2024-03-29 14:14:21 +08:00
b8f9d3626f Merge pull request 'projects/mesxc-zhp' (#292) from projects/mesxc-zhp into projects/mesxc-test
Reviewed-on: #292
2024-03-29 09:57:09 +08:00
‘937886381’
c8913f192c Merge branch 'projects/mesxc-test' into projects/mesxc-zhp 2024-03-29 09:51:47 +08:00
‘937886381’
0fa651fccf 修改bug 2024-03-29 09:51:19 +08:00
gtz
33782e189c add_infra_job_log_route 2024-03-28 18:57:44 +08:00
gtz
ee828ec4a7 're_infra' 2024-03-28 18:40:27 +08:00
gtz
e75d2f1810 Merge branch 'projects/mesxc-test' of git.picaiba.com:mt-fe-group/yudao-dev into projects/mesxc-test 2024-03-28 18:04:33 +08:00
gtz
ff9ee438ae 1 2024-03-28 18:04:26 +08:00
gtz
cb9456358f Merge branch 'projects/mesxc-test' of git.picaiba.com:mt-fe-group/yudao-dev into projects/mesxc-test 2024-03-27 10:13:57 +08:00
gtz
23334b5017 1 2024-03-27 10:13:53 +08:00
gtz
63e9100368 Merge branch 'projects/mesxc-test' of git.picaiba.com:mt-fe-group/yudao-dev into projects/mesxc-test 2024-03-26 10:36:02 +08:00
gtz
2e5e423a38 Merge branch 'projects/mesxc-test' of git.picaiba.com:mt-fe-group/yudao-dev into projects/mesxc-test 2024-03-25 17:45:38 +08:00
gtz
3b8c8b047b 1 2024-03-25 17:45:34 +08:00
gtz
d9b354f0c4 Merge branch 'projects/mesxc-test' of git.picaiba.com:mt-fe-group/yudao-dev into projects/mesxc-test 2024-03-24 15:45:29 +08:00
gtz
783cb0c3fe Merge branch 'projects/mesxc-test' of git.picaiba.com:mt-fe-group/yudao-dev into projects/mesxc-test 2024-03-01 11:52:49 +08:00
gtz
17f31863f9 1 2024-03-01 11:52:42 +08:00
324 changed files with 38959 additions and 16643 deletions

View File

@@ -1,3 +1,3 @@
.dockerignore
dist
#dist
node_modules

59
.drone.yml Normal file
View File

@@ -0,0 +1,59 @@
---
kind: pipeline
type: docker
name: default
steps:
- name: build
image: node:16-alpine
pull: if_not_exists
environment:
NODE_ENV: ""
commands:
#- yarn install --frozen-lockfile
- yarn install
- env ${NODE_ENV} yarn build:prod
- name: publish
image: docker:dind
pull: if_not_exists
volumes:
- name: dockersock
path: /var/run/docker.sock
- name: dockerconfig
path: /root/.docker
commands:
- docker build -t hub.kszny.picaiba.com/kszny/xcac-ui ./
- docker push hub.kszny.picaiba.com/kszny/xcac-ui
depends_on:
- build
- name: deploy
image: appleboy/drone-ssh
pull: if-not-exists
settings:
host:
- 172.24.145.74
username: root
password: Root@123
port: 22
command_timeout: 2m
script:
- docker pull hub.kszny.picaiba.com/kszny/xcac-ui
- docker run --rm -v /data/www/xcac:/tmp hub.kszny.picaiba.com/kszny/xcac-ui sh -c "rm -rf /tmp/* && mv -f /html /tmp"
depends_on:
- publish
volumes:
- name: dockersock
host:
path: /var/run/docker.sock
- name: dockerconfig
host:
path: /root/.docker
trigger:
branch:
- projects/mesxc-test
event:
- push

View File

@@ -1,7 +1,7 @@
###
# @Author: Do not edit
# @Date: 2023-08-29 09:40:39
# @LastEditTime: 2024-03-25 15:59:53
# @Author: zhp
# @Date: 2024-04-12 14:30:48
# @LastEditTime: 2024-04-25 10:07:02
# @LastEditors: zhp
# @Description:
###
@@ -12,24 +12,19 @@ ENV = 'development'
VUE_APP_TITLE = MES系统
# 芋道管理系统/开发环境
# VUE_APP_BASE_API = 'http://100.64.0.26:48082'
# VUE_APP_BASE_API = 'http://10.70.2.2:8080'
# VUE_APP_BASE_API = 'http://192.168.1.20:48080'
# VUE_APP_BASE_API = 'http://192.168.2.173:48080'
# VUE_APP_BASE_API = 'http://192.168.1.49:48082'
# VUE_APP_BASE_API = 'http://192.168.1.8:48082'
# VUE_APP_BASE_API = 'http://192.168.4.159:48080'
# VUE_APP_BASE_API = 'http://192.168.1.104:48082'
VUE_APP_BASE_API = 'http://192.168.0.33:48082'
# VUE_APP_BASE_API = 'http://192.168.1.62:48082'
# VUE_APP_BASE_API = 'http://192.168.1.78:48082'
# VUE_APP_BASE_API = 'http://192.168.1.47:48082'
# socket地址
# VUE_APP_BASE_API = 'http://192.168.1.104:48082'
# VUE_APP_BASE_API = 'http://10.70.2.2:8080'
# 积木报表指向地址
VUE_APP_JIMU_API = 'http://192.168.1.101:48082'
# socket地址(现场)
VUE_APP_Socket_API = 'ws://10.70.2.2:8080'
# socket地址(公司线上)
# VUE_APP_Socket_API = 'ws://192.168.0.33:48082'
# socket dcs地址(只有现场)
VUE_APP_Socket_Dcs_API = 'ws://10.70.180.10:8081'
# 积木报表指向地址
VUE_APP_JIMU_API = 'http://10.70.2.22:8080'
# 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true

View File

@@ -1,11 +1,4 @@
###
# @Author: zhp
# @Date: 2023-11-07 19:11:40
# @LastEditTime: 2023-11-16 16:40:59
# @LastEditors: zhp
# @Description:
###
# 生产环境配置
# 生产环境配置(许昌现场)
ENV = 'production'
# 页面标题

View File

@@ -1,4 +1,4 @@
# 生产环境配置
# 公司线上环境33服务器
ENV = 'production'
# 页面标题
@@ -7,15 +7,12 @@ VUE_APP_TITLE = MES系统
# 芋道管理系统/生产环境
VUE_APP_BASE_API = '/prod-api'
# dcs地址
VUE_APP_Socket_Dcs_API = 'ws://10.70.180.10:8081'
# socket地址
VUE_APP_Socket_API = 'ws://10.70.2.2:8080'
# 积木报表指向地址
VUE_APP_JIMU_API = 'http://192.168.0.33:48082'
# socket地址
VUE_APP_Socket_API = 'ws://192.168.0.33:48082'
# dcs地址只有现场的
VUE_APP_Socket_Dcs_API = 'ws://10.70.180.10:8081'
# 根据服务器或域名修改

View File

@@ -1,21 +1,3 @@
FROM node:16-alpine as build-stage
WORKDIR /admim
COPY .npmrc package.json yarn.lock ./
RUN --mount=type=cache,id=yarn-store,target=/root/.yarn-store \
yarn install --frozen-lockfile
COPY . .
ARG NODE_ENV=""
RUN env ${NODE_ENV} yarn build:prod
## -- stage: dist => nginx --
FROM nginx:alpine
ENV TZ=Asia/Shanghai
COPY ./nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=build-stage /admim/dist /usr/share/nginx/html
EXPOSE 80
FROM busybox
LABEL maintainer thomas.hairong@gmail.com
COPY dist /html/

View File

@@ -50,7 +50,7 @@
"benz-amr-recorder": "^1.1.5",
"bpmn-js-token-simulation": "0.10.0",
"clipboard": "2.0.8",
"code-brick-zj": "^1.0.5",
"code-brick-zj": "^1.1.0",
"core-js": "^3.26.0",
"crypto-js": "^4.0.0",
"diagram-js": "^12.3.0",

View File

@@ -34,4 +34,22 @@ export function getQoq(data) {
method: 'post',
data: data
})
}
// 获取能源设备树
export function getTree() {
return request({
url: '/analysis/energy-analysis/getTree',
method: 'get'
})
}
// 导出(走势分析)
export function exportTrend(data) {
return request({
url: '/analysis/energy-analysis/exportTrend',
method: 'post',
responseType: 'blob',
data: data
})
}

View File

@@ -1,7 +1,7 @@
/*
* @Author: Do not edit
* @Date: 2023-10-21 11:50:46
* @LastEditTime: 2023-10-30 14:37:28
* @LastEditTime: 2024-04-19 17:13:24
* @LastEditors: DY
* @Description:
*/
@@ -65,4 +65,13 @@ export function getCoreDepartmentList(query) {
method: 'get',
params: query
})
}
}
// 设备获得所有列表
export function getDepartmentList(query) {
return request({
url: '/system/dept/list-all-simple',
method: 'get',
params: query
})
}

View File

@@ -53,4 +53,28 @@ export function energyQuantityManualExport(data) {
data: data,
responseType: 'blob'
})
}
// 获得能源表名配置分页
export function energyTablePage(data) {
return request({
url: '/base/energy-table/page',
method: 'post',
data: data
})
}
// 获得能源表名配置
export function energyTableGet(query) {
return request({
url: '/base/energy-table/get',
method: 'get',
params: query
})
}
// 更新能源表名配置
export function energyTableUpdate(data) {
return request({
url: '/base/energy-table/update',
method: 'put',
data: data
})
}

View File

@@ -68,3 +68,4 @@ export function exportEnergyTypeExcel(query) {
responseType: 'blob'
})
}

View File

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

View File

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

View File

@@ -0,0 +1,20 @@
import request from '@/utils/request'
// 获得API 访问日志分页
export function getApiAccessLogPage(query) {
return request({
url: '/infra/api-access-log/page',
method: 'get',
params: query
})
}
// 导出API 访问日志 Excel
export function exportApiAccessLogExcel(query) {
return request({
url: '/infra/api-access-log/export-excel',
method: 'get',
params: query,
responseType: 'blob'
})
}

View File

@@ -0,0 +1,28 @@
import request from '@/utils/request'
// 更新 API 错误日志的处理状态
export function updateApiErrorLogProcess(id, processStatus) {
return request({
url: '/infra/api-error-log/update-status?id=' + id + '&processStatus=' + processStatus,
method: 'put',
})
}
// 获得API 错误日志分页
export function getApiErrorLogPage(query) {
return request({
url: '/infra/api-error-log/page',
method: 'get',
params: query
})
}
// 导出API 错误日志 Excel
export function exportApiErrorLogExcel(query) {
return request({
url: '/infra/api-error-log/export-excel',
method: 'get',
params: query,
responseType: 'blob'
})
}

90
src/api/infra/codegen.js Normal file
View File

@@ -0,0 +1,90 @@
import request from '@/utils/request'
// 获得表定义分页
export function getCodegenTablePage(query) {
return request({
url: '/infra/codegen/table/page',
method: 'get',
params: query
})
}
// 获得表和字段的明细
export function getCodegenDetail(tableId) {
return request({
url: '/infra/codegen/detail?tableId=' + tableId,
method: 'get',
})
}
// 修改代码生成信息
export function updateCodegen(data) {
return request({
url: '/infra/codegen/update',
method: 'put',
data: data
})
}
// 基于数据库的表结构,同步数据库的表和字段定义
export function syncCodegenFromDB(tableId) {
return request({
url: '/infra/codegen/sync-from-db?tableId=' + tableId,
method: 'put'
})
}
// 基于 SQL 建表语句,同步数据库的表和字段定义
export function syncCodegenFromSQL(tableId, sql) {
return request({
url: '/infra/codegen/sync-from-sql?tableId=' + tableId,
method: 'put',
headers:{
'Content-type': 'application/x-www-form-urlencoded'
},
data: 'tableId=' + tableId + "&sql=" + sql,
})
}
// 预览生成代码
export function previewCodegen(tableId) {
return request({
url: '/infra/codegen/preview?tableId=' + tableId,
method: 'get',
})
}
// 下载生成代码
export function downloadCodegen(tableId) {
return request({
url: '/infra/codegen/download?tableId=' + tableId,
method: 'get',
responseType: 'blob'
})
}
// 获得表定义分页
export function getSchemaTableList(query) {
return request({
url: '/infra/codegen/db/table/list',
method: 'get',
params: query
})
}
// 基于数据库的表结构,创建代码生成器的表定义
export function createCodegenList(data) {
return request({
url: '/infra/codegen/create-list',
method: 'post',
data: data
})
}
// 删除数据库的表和字段定义
export function deleteCodegen(tableId) {
return request({
url: '/infra/codegen/delete?tableId=' + tableId,
method: 'delete'
})
}

62
src/api/infra/config.js Normal file
View File

@@ -0,0 +1,62 @@
import request from '@/utils/request'
// 查询参数列表
export function listConfig(query) {
return request({
url: '/infra/config/page',
method: 'get',
params: query
})
}
// 查询参数详细
export function getConfig(configId) {
return request({
url: '/infra/config/get?id=' + configId,
method: 'get'
})
}
// 根据参数键名查询参数值
export function getConfigKey(configKey) {
return request({
url: '/infra/config/get-value-by-key?key=' + configKey,
method: 'get'
})
}
// 新增参数配置
export function addConfig(data) {
return request({
url: '/infra/config/create',
method: 'post',
data: data
})
}
// 修改参数配置
export function updateConfig(data) {
return request({
url: '/infra/config/update',
method: 'put',
data: data
})
}
// 删除参数配置
export function delConfig(configId) {
return request({
url: '/infra/config/delete?id=' + configId,
method: 'delete'
})
}
// 导出参数
export function exportConfig(query) {
return request({
url: '/infra/config/export',
method: 'get',
params: query,
responseType: 'blob'
})
}

View File

@@ -0,0 +1,43 @@
import request from '@/utils/request'
// 创建数据源配置
export function createDataSourceConfig(data) {
return request({
url: '/infra/data-source-config/create',
method: 'post',
data: data
})
}
// 更新数据源配置
export function updateDataSourceConfig(data) {
return request({
url: '/infra/data-source-config/update',
method: 'put',
data: data
})
}
// 删除数据源配置
export function deleteDataSourceConfig(id) {
return request({
url: '/infra/data-source-config/delete?id=' + id,
method: 'delete'
})
}
// 获得数据源配置
export function getDataSourceConfig(id) {
return request({
url: '/infra/data-source-config/get?id=' + id,
method: 'get'
})
}
// 获得数据源配置列表
export function getDataSourceConfigList() {
return request({
url: '/infra/data-source-config/list',
method: 'get',
})
}

26
src/api/infra/dbDoc.js Normal file
View File

@@ -0,0 +1,26 @@
// 导出参数
import request from "@/utils/request";
export function exportHtml() {
return request({
url: '/infra/db-doc/export-html',
method: 'get',
responseType: 'blob'
})
}
export function exportWord() {
return request({
url: '/infra/db-doc/export-word',
method: 'get',
responseType: 'blob'
})
}
export function exportMarkdown() {
return request({
url: '/infra/db-doc/export-markdown',
method: 'get',
responseType: 'blob'
})
}

18
src/api/infra/file.js Normal file
View File

@@ -0,0 +1,18 @@
import request from '@/utils/request'
// 删除文件
export function deleteFile(id) {
return request({
url: '/infra/file/delete?id=' + id,
method: 'delete'
})
}
// 获得文件分页
export function getFilePage(query) {
return request({
url: '/infra/file/page',
method: 'get',
params: query
})
}

View File

@@ -0,0 +1,59 @@
import request from '@/utils/request'
// 创建文件配置
export function createFileConfig(data) {
return request({
url: '/infra/file-config/create',
method: 'post',
data: data
})
}
// 更新文件配置
export function updateFileConfig(data) {
return request({
url: '/infra/file-config/update',
method: 'put',
data: data
})
}
// 更新文件配置为主配置
export function updateFileConfigMaster(id) {
return request({
url: '/infra/file-config/update-master?id=' + id,
method: 'put'
})
}
// 删除文件配置
export function deleteFileConfig(id) {
return request({
url: '/infra/file-config/delete?id=' + id,
method: 'delete'
})
}
// 获得文件配置
export function getFileConfig(id) {
return request({
url: '/infra/file-config/get?id=' + id,
method: 'get'
})
}
// 获得文件配置分页
export function getFileConfigPage(query) {
return request({
url: '/infra/file-config/page',
method: 'get',
params: query
})
}
export function testFileConfig(id) {
return request({
url: '/infra/file-config/test?id=' + id,
method: 'get'
})
}

82
src/api/infra/job.js Normal file
View File

@@ -0,0 +1,82 @@
import request from '@/utils/request'
// 查询定时任务调度列表
export function listJob(query) {
return request({
url: '/infra/job/page',
method: 'get',
params: query
})
}
// 查询定时任务调度详细
export function getJob(jobId) {
return request({
url: '/infra/job/get?id=' + jobId,
method: 'get'
})
}
// 新增定时任务调度
export function addJob(data) {
return request({
url: '/infra/job/create',
method: 'post',
data: data
})
}
// 修改定时任务调度
export function updateJob(data) {
return request({
url: '/infra/job/update',
method: 'put',
data: data
})
}
// 删除定时任务调度
export function delJob(jobId) {
return request({
url: '/infra/job/delete?id=' + jobId,
method: 'delete'
})
}
// 导出定时任务调度
export function exportJob(query) {
return request({
url: '/infra/job/export-excel',
method: 'get',
params: query,
responseType: 'blob'
})
}
// 任务状态修改
export function updateJobStatus(jobId, status) {
return request({
url: '/infra/job/update-status',
method: 'put',
headers:{
'Content-type': 'application/x-www-form-urlencoded'
},
data: 'id=' + jobId + "&status=" + status,
})
}
// 定时任务立即执行一次
export function runJob(jobId) {
return request({
url: '/infra/job/trigger?id=' + jobId,
method: 'put'
})
}
// 获得定时任务的下 n 次执行时间
export function getJobNextTimes(jobId) {
return request({
url: '/infra/job/get_next_times?id=' + jobId,
method: 'get'
})
}

28
src/api/infra/jobLog.js Normal file
View File

@@ -0,0 +1,28 @@
import request from '@/utils/request'
// 获得定时任务
export function getJobLog(id) {
return request({
url: '/infra/job-log/get?id=' + id,
method: 'get'
})
}
// 获得定时任务分页
export function getJobLogPage(query) {
return request({
url: '/infra/job-log/page',
method: 'get',
params: query
})
}
// 导出定时任务 Excel
export function exportJobLogExcel(query) {
return request({
url: '/infra/job-log/export-excel',
method: 'get',
params: query,
responseType: 'blob'
})
}

9
src/api/infra/redis.js Normal file
View File

@@ -0,0 +1,9 @@
import request from '@/utils/request'
// 查询缓存详细
export function getCache() {
return request({
url: '/infra/redis/get-monitor-info',
method: 'get'
})
}

54
src/api/infra/testDemo.js Normal file
View File

@@ -0,0 +1,54 @@
import request from '@/utils/request'
// 创建字典类型
export function createTestDemo(data) {
return request({
url: '/infra/test-demo/create',
method: 'post',
data: data
})
}
// 更新字典类型
export function updateTestDemo(data) {
return request({
url: '/infra/test-demo/update',
method: 'put',
data: data
})
}
// 删除字典类型
export function deleteTestDemo(id) {
return request({
url: '/infra/test-demo/delete?id=' + id,
method: 'delete'
})
}
// 获得字典类型
export function getTestDemo(id) {
return request({
url: '/infra/test-demo/get?id=' + id,
method: 'get'
})
}
// 获得字典类型分页
export function getTestDemoPage(query) {
return request({
url: '/infra/test-demo/page',
method: 'get',
params: query
})
}
// 导出字典类型 Excel
export function exportTestDemoExcel(query) {
return request({
url: '/infra/test-demo/export-excel',
method: 'get',
params: query,
responseType: 'blob'
})
}

View File

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

View File

@@ -1,8 +1,8 @@
/*
* @Author: zhp
* @Date: 2023-10-31 10:55:20
* @LastEditTime: 2023-12-06 14:09:14
* @LastEditors: zhp
* @LastEditTime: 2024-04-25 15:28:44
* @LastEditors: DY
* @Description:
*/
import request from '@/utils/request'
@@ -34,11 +34,11 @@ export function exportEnergyPlcExcel(query) {
})
}
export function getOriginalGlassRetrace(query) {
export function getOriginalGlassRetrace(data) {
return request({
url: '/base/original-glass-statistics/originalGlassRetrace',
method: 'get',
params: query,
method: 'post',
data
})
}

View File

@@ -0,0 +1,45 @@
import request from '@/utils/request'
// 原片工段数据
export function originalSection(data) {
return request({
url: '/extend/customized-reports/originalSection',
method: 'post',
data: data
})
}
// 原片产线数据
export function getOriginalLine(query) {
return request({
url: '/extend/customized-reports/getOriginalLine',
method: 'get',
params: query
})
}
// 深加工产线数据
export function getProcessingLine(query) {
return request({
url: '/extend/customized-reports/getProcessingLine',
method: 'get',
params: query
})
}
// 深加工工段数据
export function processing(data) {
return request({
url: '/extend/customized-reports/processing',
method: 'post',
data: data
})
}
// isra数据记录
export function israData(data) {
return request({
url: '/extend/customized-reports/isra',
method: 'post',
data: data
})
}

View File

@@ -1,7 +1,7 @@
/*
* @Author: Do not edit
* @Date: 2023-12-08 10:26:48
* @LastEditTime: 2023-12-13 17:16:00
* @LastEditTime: 2024-04-24 16:31:37
* @LastEditors: DY
* @Description:
*/
@@ -59,3 +59,39 @@ export function exportGlasscExcel(query) {
responseType: 'blob'
})
}
// 生产月报查询--冷端生产线
export function productionMonthY(data) {
return request({
url: '/extend/customized-reports/productionMonthY',
method: 'post',
data: data
})
}
// 生产月报查询--深加工生产线
export function productionMonthD(data) {
return request({
url: '/extend/customized-reports/productionMonthD',
method: 'post',
data: data
})
}
// 生产年报查询--冷端生产线
export function productionYearY(data) {
return request({
url: '/extend/customized-reports/productionYearY',
method: 'post',
data: data
})
}
// 生产年报查询--冷端生产线
export function productionYearD(data) {
return request({
url: '/extend/customized-reports/productionYearD',
method: 'post',
data: data
})
}

View File

@@ -0,0 +1,96 @@
/*
* @Author: zhp
* @Date: 2024-04-18 09:27:54
* @LastEditTime: 2024-04-23 15:16:12
* @LastEditors: zhp
* @Description:
*/
import request from '@/utils/request'
// 更新质量检测类型基础
export function getOriginalData(data) {
return request({
url: 'extend/customized-reports/original',
method: 'post',
data: data
})
}
export function getIngredientData(data) {
return request({
url: 'extend/customized-reports/materialCost',
method: 'post',
data: data
})
}
export function getCuttingtData(data) {
return request({
url: 'extend/customized-reports/cutting',
method: 'post',
data: data
})
}
export function getAutoDailyData(data) {
return request({
url: 'base/report-auto-daily/listAll',
method: 'post',
data: data
})
}
export function getQualityRecordReport(data) {
return request({
url: 'base/quality-inspection-record/qualityRecordReport',
method: 'post',
data: data
})
}
export function getProductChildData(data) {
return request({
url: 'base/report-auto-ydaily-det/list',
method: 'post',
data: data
})
}
export function updateAutoDailyData(data) {
return request({
url: 'base/report-auto-daily/update',
method: 'put',
data: data
})
}
export function getCWSectionList(query) {
return request({
url: 'base/core-production-line/listAll',
method: 'get',
params: query
})
}
export function getCuttingReportDataList(data) {
return request({
url: 'extend/customized-reports/cuttingReport',
method: 'post',
data: data
})
}
export function getProcessingLineDataList(data) {
return request({
url: 'extend/customized-reports/getProcessingLine',
method: 'get',
data: data
})
}
export function getOriginalLineDataList(data) {
return request({
url: 'extend/customized-reports/getOriginalLine',
method: 'get',
data: data
})
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 141 KiB

View File

@@ -0,0 +1,138 @@
<!--
filename: index.vue
author: liubin
date: 2024-04-02 09:49:36
description:
-->
<template>
<!-- 按钮切换 -->
<div
v-if="buttonMode"
class="button-nav">
<button
v-for="m in menus"
:key="m"
@click="currentMenu = m"
:data-text="m"
:class="[m === currentMenu ? 'active' : '']"></button>
</div>
<!-- 标签切换 -->
<div
v-else
class="custom-tabs"
style="height: 100%; width: 100%">
<el-tabs
class="tag-nav"
v-model="currentMenu"
style="height: 100%">
<el-tab-pane
v-for="(m, idx) in menus"
:key="m"
:label="idx == 0 ? `\u2002${m}\u2002` : `\u3000${m}\u3000`"
:name="m">
<slot :name="`tab${idx + 1}`"></slot>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
export default {
name: 'ButtonNav',
props: {
menus: {
type: Array,
required: true,
default: () => [],
validator: (val) => {
return val.length > 0;
},
},
buttonMode: {
type: Boolean,
default: true,
},
},
data() {
return {
currentMenu: '',
};
},
created() {
this.currentMenu = this.menus[0];
},
watch: {
currentMenu(val) {
this.$emit('change', val);
},
},
};
</script>
<style scoped lang="scss">
.button-nav {
width: 100%;
// padding: 12px 0;
display: flex;
gap: 12px;
* {
user-select: none;
}
button {
cursor: pointer;
appearance: none;
outline: none;
border: none;
background: #fff;
border-radius: 8px;
padding: 20px;
color: #888;
letter-spacing: 2px;
flex: 1;
box-sizing: padding-box;
position: relative;
&::after {
content: attr(data-text);
position: absolute;
top: 10px;
left: 50%;
font-size: 18px;
font-weight: 500;
transform: translate(-50%);
}
&.active {
color: #111;
border-bottom: 4px solid #0b58ff;
}
}
}
</style>
<style scoped>
.custom-tabs >>> .el-tabs__header {
margin-bottom: 8px;
display: inline-block;
/* transform: translateY(-12px); */
}
.custom-tabs >>> .el-tabs__item {
padding-left: 0px !important;
padding-right: 0px !important;
line-height: 36px !important;
height: 36px;
}
.custom-tabs >>> .el-tabs__content {
height: calc(100% - 42px);
}
.custom-tabs >>> .el-tab-pane {
box-sizing: border-box;
height: 100%;
padding: 20px;
border: 10px solid #f002;
}
</style>

View File

@@ -0,0 +1,160 @@
<template>
<el-form size="small">
<el-form-item>
<el-radio v-model='radioValue' :label="1">
允许的通配符[, - * ? / L W]
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="2">
不指定
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="3">
周期从
<el-input-number v-model='cycle01' :min="1" :max="30" /> -
<el-input-number v-model='cycle02' :min="cycle01 ? cycle01 + 1 : 2" :max="31" />
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="4">
<el-input-number v-model='average01' :min="1" :max="30" /> 号开始
<el-input-number v-model='average02' :min="1" :max="31 - average01 || 1" /> 日执行一次
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="5">
每月
<el-input-number v-model='workday' :min="1" :max="31" /> 号最近的那个工作日
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="6">
本月最后一天
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="7">
指定
<el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%">
<el-option v-for="item in 31" :key="item" :value="item">{{item}}</el-option>
</el-select>
</el-radio>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
radioValue: 1,
workday: 1,
cycle01: 1,
cycle02: 2,
average01: 1,
average02: 1,
checkboxList: [],
checkNum: this.$options.propsData.check
}
},
name: 'crontab-day',
props: ['check', 'cron'],
methods: {
// 单选按钮值变化时
radioChange() {
('day rachange');
if (this.radioValue !== 2 && this.cron.week !== '?') {
this.$emit('update', 'week', '?', 'day')
}
switch (this.radioValue) {
case 1:
this.$emit('update', 'day', '*');
break;
case 2:
this.$emit('update', 'day', '?');
break;
case 3:
this.$emit('update', 'day', this.cycleTotal);
break;
case 4:
this.$emit('update', 'day', this.averageTotal);
break;
case 5:
this.$emit('update', 'day', this.workday + 'W');
break;
case 6:
this.$emit('update', 'day', 'L');
break;
case 7:
this.$emit('update', 'day', this.checkboxString);
break;
}
('day rachange end');
},
// 周期两个值变化时
cycleChange() {
if (this.radioValue === '3') {
this.$emit('update', 'day', this.cycleTotal);
}
},
// 平均两个值变化时
averageChange() {
if (this.radioValue === '4') {
this.$emit('update', 'day', this.averageTotal);
}
},
// 最近工作日值变化时
workdayChange() {
if (this.radioValue === '5') {
this.$emit('update', 'day', this.workdayCheck + 'W');
}
},
// checkbox值变化时
checkboxChange() {
if (this.radioValue === '7') {
this.$emit('update', 'day', this.checkboxString);
}
}
},
watch: {
'radioValue': 'radioChange',
'cycleTotal': 'cycleChange',
'averageTotal': 'averageChange',
'workdayCheck': 'workdayChange',
'checkboxString': 'checkboxChange',
},
computed: {
// 计算两个周期值
cycleTotal: function () {
const cycle01 = this.checkNum(this.cycle01, 1, 30)
const cycle02 = this.checkNum(this.cycle02, cycle01 ? cycle01 + 1 : 2, 31, 31)
return cycle01 + '-' + cycle02;
},
// 计算平均用到的值
averageTotal: function () {
const average01 = this.checkNum(this.average01, 1, 30)
const average02 = this.checkNum(this.average02, 1, 31 - average01 || 0)
return average01 + '/' + average02;
},
// 计算工作日格式
workdayCheck: function () {
return this.checkNum(this.workday, 1, 31);
},
// 计算勾选的checkbox值合集
checkboxString: function () {
let str = this.checkboxList.join();
return str === '' ? '*' : str;
}
}
}
</script>

View File

@@ -0,0 +1,114 @@
<template>
<el-form size="small">
<el-form-item>
<el-radio v-model='radioValue' :label="1">
小时允许的通配符[, - * /]
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="2">
周期从
<el-input-number v-model='cycle01' :min="0" :max="22" /> -
<el-input-number v-model='cycle02' :min="cycle01 ? cycle01 + 1 : 1" :max="23" /> 小时
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="3">
<el-input-number v-model='average01' :min="0" :max="22" /> 小时开始
<el-input-number v-model='average02' :min="1" :max="23 - average01 || 0" /> 小时执行一次
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="4">
指定
<el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%">
<el-option v-for="item in 24" :key="item" :value="item-1">{{item-1}}</el-option>
</el-select>
</el-radio>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
radioValue: 1,
cycle01: 0,
cycle02: 1,
average01: 0,
average02: 1,
checkboxList: [],
checkNum: this.$options.propsData.check
}
},
name: 'crontab-hour',
props: ['check', 'cron'],
methods: {
// 单选按钮值变化时
radioChange() {
switch (this.radioValue) {
case 1:
this.$emit('update', 'hour', '*')
break;
case 2:
this.$emit('update', 'hour', this.cycleTotal);
break;
case 3:
this.$emit('update', 'hour', this.averageTotal);
break;
case 4:
this.$emit('update', 'hour', this.checkboxString);
break;
}
},
// 周期两个值变化时
cycleChange() {
if (this.radioValue === '2') {
this.$emit('update', 'hour', this.cycleTotal);
}
},
// 平均两个值变化时
averageChange() {
if (this.radioValue === '3') {
this.$emit('update', 'hour', this.averageTotal);
}
},
// checkbox值变化时
checkboxChange() {
if (this.radioValue === '4') {
this.$emit('update', 'hour', this.checkboxString);
}
}
},
watch: {
'radioValue': 'radioChange',
'cycleTotal': 'cycleChange',
'averageTotal': 'averageChange',
'checkboxString': 'checkboxChange'
},
computed: {
// 计算两个周期值
cycleTotal: function () {
const cycle01 = this.checkNum(this.cycle01, 0, 22)
const cycle02 = this.checkNum(this.cycle02, cycle01 ? cycle01 + 1 : 1, 23)
return cycle01 + '-' + cycle02;
},
// 计算平均用到的值
averageTotal: function () {
const average01 = this.checkNum(this.average01, 0, 22)
const average02 = this.checkNum(this.average02, 1, 23 - average01 || 0)
return average01 + '/' + average02;
},
// 计算勾选的checkbox值合集
checkboxString: function () {
let str = this.checkboxList.join();
return str === '' ? '*' : str;
}
}
}
</script>

View File

@@ -0,0 +1,430 @@
<template>
<div>
<el-tabs type="border-card">
<el-tab-pane label="秒" v-if="shouldHide('second')">
<CrontabSecond
@update="updateCrontabValue"
:check="checkNumber"
:cron="crontabValueObj"
ref="cronsecond"
/>
</el-tab-pane>
<el-tab-pane label="分钟" v-if="shouldHide('min')">
<CrontabMin
@update="updateCrontabValue"
:check="checkNumber"
:cron="crontabValueObj"
ref="cronmin"
/>
</el-tab-pane>
<el-tab-pane label="小时" v-if="shouldHide('hour')">
<CrontabHour
@update="updateCrontabValue"
:check="checkNumber"
:cron="crontabValueObj"
ref="cronhour"
/>
</el-tab-pane>
<el-tab-pane label="日" v-if="shouldHide('day')">
<CrontabDay
@update="updateCrontabValue"
:check="checkNumber"
:cron="crontabValueObj"
ref="cronday"
/>
</el-tab-pane>
<el-tab-pane label="月" v-if="shouldHide('month')">
<CrontabMonth
@update="updateCrontabValue"
:check="checkNumber"
:cron="crontabValueObj"
ref="cronmonth"
/>
</el-tab-pane>
<el-tab-pane label="周" v-if="shouldHide('week')">
<CrontabWeek
@update="updateCrontabValue"
:check="checkNumber"
:cron="crontabValueObj"
ref="cronweek"
/>
</el-tab-pane>
<el-tab-pane label="年" v-if="shouldHide('year')">
<CrontabYear
@update="updateCrontabValue"
:check="checkNumber"
:cron="crontabValueObj"
ref="cronyear"
/>
</el-tab-pane>
</el-tabs>
<div class="popup-main">
<div class="popup-result">
<p class="title">时间表达式</p>
<table>
<thead>
<th v-for="item of tabTitles" width="40" :key="item">{{item}}</th>
<th>Cron 表达式</th>
</thead>
<tbody>
<td>
<span>{{crontabValueObj.second}}</span>
</td>
<td>
<span>{{crontabValueObj.min}}</span>
</td>
<td>
<span>{{crontabValueObj.hour}}</span>
</td>
<td>
<span>{{crontabValueObj.day}}</span>
</td>
<td>
<span>{{crontabValueObj.month}}</span>
</td>
<td>
<span>{{crontabValueObj.week}}</span>
</td>
<td>
<span>{{crontabValueObj.year}}</span>
</td>
<td>
<span>{{crontabValueString}}</span>
</td>
</tbody>
</table>
</div>
<CrontabResult :ex="crontabValueString"></CrontabResult>
<div class="pop_btn">
<el-button size="small" type="primary" @click="submitFill">确定</el-button>
<el-button size="small" type="warning" @click="clearCron">重置</el-button>
<el-button size="small" @click="hidePopup">取消</el-button>
</div>
</div>
</div>
</template>
<script>
import CrontabSecond from "./second.vue";
import CrontabMin from "./min.vue";
import CrontabHour from "./hour.vue";
import CrontabDay from "./day.vue";
import CrontabMonth from "./month.vue";
import CrontabWeek from "./week.vue";
import CrontabYear from "./year.vue";
import CrontabResult from "./result.vue";
export default {
data() {
return {
tabTitles: ["秒", "分钟", "小时", "日", "月", "周", "年"],
tabActive: 0,
myindex: 0,
crontabValueObj: {
second: "*",
min: "*",
hour: "*",
day: "*",
month: "*",
week: "?",
year: "",
},
};
},
name: "vcrontab",
props: ["expression", "hideComponent"],
methods: {
shouldHide(key) {
return !(this.hideComponent && this.hideComponent.includes(key));
},
resolveExp() {
// 反解析 表达式
if (this.expression) {
let arr = this.expression.split(" ");
if (arr.length >= 6) {
//6 位以上是合法表达式
let obj = {
second: arr[0],
min: arr[1],
hour: arr[2],
day: arr[3],
month: arr[4],
week: arr[5],
year: arr[6] ? arr[6] : "",
};
this.crontabValueObj = {
...obj,
};
for (let i in obj) {
if (obj[i]) this.changeRadio(i, obj[i]);
}
}
} else {
// 没有传入的表达式 则还原
this.clearCron();
}
},
// tab切换值
tabCheck(index) {
this.tabActive = index;
},
// 由子组件触发,更改表达式组成的字段值
updateCrontabValue(name, value, from) {
"updateCrontabValue", name, value, from;
this.crontabValueObj[name] = value;
if (from && from !== name) {
console.log(`来自组件 ${from} 改变了 ${name} ${value}`);
this.changeRadio(name, value);
}
},
// 赋值到组件
changeRadio(name, value) {
let arr = ["second", "min", "hour", "month"],
refName = "cron" + name,
insValue;
if (!this.$refs[refName]) return;
if (arr.includes(name)) {
if (value === "*") {
insValue = 1;
} else if (value.indexOf("-") > -1) {
let indexArr = value.split("-");
isNaN(indexArr[0])
? (this.$refs[refName].cycle01 = 0)
: (this.$refs[refName].cycle01 = indexArr[0]);
this.$refs[refName].cycle02 = indexArr[1];
insValue = 2;
} else if (value.indexOf("/") > -1) {
let indexArr = value.split("/");
isNaN(indexArr[0])
? (this.$refs[refName].average01 = 0)
: (this.$refs[refName].average01 = indexArr[0]);
this.$refs[refName].average02 = indexArr[1];
insValue = 3;
} else {
insValue = 4;
this.$refs[refName].checkboxList = value.split(",");
}
} else if (name === "day") {
if (value === "*") {
insValue = 1;
} else if (value === "?") {
insValue = 2;
} else if (value.indexOf("-") > -1) {
let indexArr = value.split("-");
isNaN(indexArr[0])
? (this.$refs[refName].cycle01 = 0)
: (this.$refs[refName].cycle01 = indexArr[0]);
this.$refs[refName].cycle02 = indexArr[1];
insValue = 3;
} else if (value.indexOf("/") > -1) {
let indexArr = value.split("/");
isNaN(indexArr[0])
? (this.$refs[refName].average01 = 0)
: (this.$refs[refName].average01 = indexArr[0]);
this.$refs[refName].average02 = indexArr[1];
insValue = 4;
} else if (value.indexOf("W") > -1) {
let indexArr = value.split("W");
isNaN(indexArr[0])
? (this.$refs[refName].workday = 0)
: (this.$refs[refName].workday = indexArr[0]);
insValue = 5;
} else if (value === "L") {
insValue = 6;
} else {
this.$refs[refName].checkboxList = value.split(",");
insValue = 7;
}
} else if (name === "week") {
if (value === "*") {
insValue = 1;
} else if (value === "?") {
insValue = 2;
} else if (value.indexOf("-") > -1) {
let indexArr = value.split("-");
isNaN(indexArr[0])
? (this.$refs[refName].cycle01 = 0)
: (this.$refs[refName].cycle01 = indexArr[0]);
this.$refs[refName].cycle02 = indexArr[1];
insValue = 3;
} else if (value.indexOf("#") > -1) {
let indexArr = value.split("#");
isNaN(indexArr[0])
? (this.$refs[refName].average01 = 1)
: (this.$refs[refName].average01 = indexArr[0]);
this.$refs[refName].average02 = indexArr[1];
insValue = 4;
} else if (value.indexOf("L") > -1) {
let indexArr = value.split("L");
isNaN(indexArr[0])
? (this.$refs[refName].weekday = 1)
: (this.$refs[refName].weekday = indexArr[0]);
insValue = 5;
} else {
this.$refs[refName].checkboxList = value.split(",");
insValue = 6;
}
} else if (name === "year") {
if (value === "") {
insValue = 1;
} else if (value === "*") {
insValue = 2;
} else if (value.indexOf("-") > -1) {
insValue = 3;
} else if (value.indexOf("/") > -1) {
insValue = 4;
} else {
this.$refs[refName].checkboxList = value.split(",");
insValue = 5;
}
}
this.$refs[refName].radioValue = insValue;
},
// 表单选项的子组件校验数字格式(通过-props传递
checkNumber(value, minLimit, maxLimit) {
// 检查必须为整数
value = Math.floor(value);
if (value < minLimit) {
value = minLimit;
} else if (value > maxLimit) {
value = maxLimit;
}
return value;
},
// 隐藏弹窗
hidePopup() {
this.$emit("hide");
},
// 填充表达式
submitFill() {
this.$emit("fill", this.crontabValueString);
this.hidePopup();
},
clearCron() {
// 还原选择项
("准备还原");
this.crontabValueObj = {
second: "*",
min: "*",
hour: "*",
day: "*",
month: "*",
week: "?",
year: "",
};
for (let j in this.crontabValueObj) {
this.changeRadio(j, this.crontabValueObj[j]);
}
},
},
computed: {
crontabValueString: function() {
let obj = this.crontabValueObj;
let str =
obj.second +
" " +
obj.min +
" " +
obj.hour +
" " +
obj.day +
" " +
obj.month +
" " +
obj.week +
(obj.year === "" ? "" : " " + obj.year);
return str;
},
},
components: {
CrontabSecond,
CrontabMin,
CrontabHour,
CrontabDay,
CrontabMonth,
CrontabWeek,
CrontabYear,
CrontabResult,
},
watch: {
expression: "resolveExp",
hideComponent(value) {
// 隐藏部分组件
},
},
mounted: function() {
this.resolveExp();
},
};
</script>
<style scoped>
.pop_btn {
text-align: center;
margin-top: 20px;
}
.popup-main {
position: relative;
margin: 10px auto;
background: #fff;
border-radius: 5px;
font-size: 12px;
overflow: hidden;
}
.popup-title {
overflow: hidden;
line-height: 34px;
padding-top: 6px;
background: #f2f2f2;
}
.popup-result {
box-sizing: border-box;
line-height: 24px;
margin: 25px auto;
padding: 15px 10px 10px;
border: 1px solid #ccc;
position: relative;
}
.popup-result .title {
position: absolute;
top: -28px;
left: 50%;
width: 140px;
font-size: 14px;
margin-left: -70px;
text-align: center;
line-height: 30px;
background: #fff;
}
.popup-result table {
text-align: center;
width: 100%;
margin: 0 auto;
}
.popup-result table span {
display: block;
width: 100%;
font-family: arial;
line-height: 30px;
height: 30px;
white-space: nowrap;
overflow: hidden;
border: 1px solid #e8e8e8;
}
.popup-result-scroll {
font-size: 12px;
line-height: 24px;
height: 10em;
overflow-y: auto;
}
</style>

View File

@@ -0,0 +1,116 @@
<template>
<el-form size="small">
<el-form-item>
<el-radio v-model='radioValue' :label="1">
分钟允许的通配符[, - * /]
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="2">
周期从
<el-input-number v-model='cycle01' :min="0" :max="58" /> -
<el-input-number v-model='cycle02' :min="cycle01 ? cycle01 + 1 : 1" :max="59" /> 分钟
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="3">
<el-input-number v-model='average01' :min="0" :max="58" /> 分钟开始
<el-input-number v-model='average02' :min="1" :max="59 - average01 || 0" /> 分钟执行一次
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="4">
指定
<el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%">
<el-option v-for="item in 60" :key="item" :value="item-1">{{item-1}}</el-option>
</el-select>
</el-radio>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
radioValue: 1,
cycle01: 1,
cycle02: 2,
average01: 0,
average02: 1,
checkboxList: [],
checkNum: this.$options.propsData.check
}
},
name: 'crontab-min',
props: ['check', 'cron'],
methods: {
// 单选按钮值变化时
radioChange() {
switch (this.radioValue) {
case 1:
this.$emit('update', 'min', '*', 'min');
break;
case 2:
this.$emit('update', 'min', this.cycleTotal, 'min');
break;
case 3:
this.$emit('update', 'min', this.averageTotal, 'min');
break;
case 4:
this.$emit('update', 'min', this.checkboxString, 'min');
break;
}
},
// 周期两个值变化时
cycleChange() {
if (this.radioValue === '2') {
this.$emit('update', 'min', this.cycleTotal, 'min');
}
},
// 平均两个值变化时
averageChange() {
if (this.radioValue === '3') {
this.$emit('update', 'min', this.averageTotal, 'min');
}
},
// checkbox值变化时
checkboxChange() {
if (this.radioValue === '4') {
this.$emit('update', 'min', this.checkboxString, 'min');
}
},
},
watch: {
'radioValue': 'radioChange',
'cycleTotal': 'cycleChange',
'averageTotal': 'averageChange',
'checkboxString': 'checkboxChange',
},
computed: {
// 计算两个周期值
cycleTotal: function () {
const cycle01 = this.checkNum(this.cycle01, 0, 58)
const cycle02 = this.checkNum(this.cycle02, cycle01 ? cycle01 + 1 : 1, 59)
return cycle01 + '-' + cycle02;
},
// 计算平均用到的值
averageTotal: function () {
const average01 = this.checkNum(this.average01, 0, 58)
const average02 = this.checkNum(this.average02, 1, 59 - average01 || 0)
return average01 + '/' + average02;
},
// 计算勾选的checkbox值合集
checkboxString: function () {
let str = this.checkboxList.join();
return str === '' ? '*' : str;
}
}
}
</script>

View File

@@ -0,0 +1,114 @@
<template>
<el-form size='small'>
<el-form-item>
<el-radio v-model='radioValue' :label="1">
允许的通配符[, - * /]
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="2">
周期从
<el-input-number v-model='cycle01' :min="1" :max="11" /> -
<el-input-number v-model='cycle02' :min="cycle01 ? cycle01 + 1 : 2" :max="12" />
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="3">
<el-input-number v-model='average01' :min="1" :max="11" /> 月开始
<el-input-number v-model='average02' :min="1" :max="12 - average01 || 0" /> 月月执行一次
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="4">
指定
<el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%">
<el-option v-for="item in 12" :key="item" :value="item">{{item}}</el-option>
</el-select>
</el-radio>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
radioValue: 1,
cycle01: 1,
cycle02: 2,
average01: 1,
average02: 1,
checkboxList: [],
checkNum: this.check
}
},
name: 'crontab-month',
props: ['check', 'cron'],
methods: {
// 单选按钮值变化时
radioChange() {
switch (this.radioValue) {
case 1:
this.$emit('update', 'month', '*');
break;
case 2:
this.$emit('update', 'month', this.cycleTotal);
break;
case 3:
this.$emit('update', 'month', this.averageTotal);
break;
case 4:
this.$emit('update', 'month', this.checkboxString);
break;
}
},
// 周期两个值变化时
cycleChange() {
if (this.radioValue === '2') {
this.$emit('update', 'month', this.cycleTotal);
}
},
// 平均两个值变化时
averageChange() {
if (this.radioValue === '3') {
this.$emit('update', 'month', this.averageTotal);
}
},
// checkbox值变化时
checkboxChange() {
if (this.radioValue === '4') {
this.$emit('update', 'month', this.checkboxString);
}
}
},
watch: {
'radioValue': 'radioChange',
'cycleTotal': 'cycleChange',
'averageTotal': 'averageChange',
'checkboxString': 'checkboxChange'
},
computed: {
// 计算两个周期值
cycleTotal: function () {
const cycle01 = this.checkNum(this.cycle01, 1, 11)
const cycle02 = this.checkNum(this.cycle02, cycle01 ? cycle01 + 1 : 2, 12)
return cycle01 + '-' + cycle02;
},
// 计算平均用到的值
averageTotal: function () {
const average01 = this.checkNum(this.average01, 1, 11)
const average02 = this.checkNum(this.average02, 1, 12 - average01 || 0)
return average01 + '/' + average02;
},
// 计算勾选的checkbox值合集
checkboxString: function () {
let str = this.checkboxList.join();
return str === '' ? '*' : str;
}
}
}
</script>

View File

@@ -0,0 +1,559 @@
<template>
<div class="popup-result">
<p class="title">最近5次运行时间</p>
<ul class="popup-result-scroll">
<template v-if='isShow'>
<li v-for='item in resultList' :key="item">{{item}}</li>
</template>
<li v-else>计算结果中...</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
dayRule: '',
dayRuleSup: '',
dateArr: [],
resultList: [],
isShow: false
}
},
name: 'crontab-result',
methods: {
// 表达式值变化时,开始去计算结果
expressionChange() {
// 计算开始-隐藏结果
this.isShow = false;
// 获取规则数组[0秒、1分、2时、3日、4月、5星期、6年]
let ruleArr = this.$options.propsData.ex.split(' ');
// 用于记录进入循环的次数
let nums = 0;
// 用于暂时存符号时间规则结果的数组
let resultArr = [];
// 获取当前时间精确至[年、月、日、时、分、秒]
let nTime = new Date();
let nYear = nTime.getFullYear();
let nMonth = nTime.getMonth() + 1;
let nDay = nTime.getDate();
let nHour = nTime.getHours();
let nMin = nTime.getMinutes();
let nSecond = nTime.getSeconds();
// 根据规则获取到近100年可能年数组、月数组等等
this.getSecondArr(ruleArr[0]);
this.getMinArr(ruleArr[1]);
this.getHourArr(ruleArr[2]);
this.getDayArr(ruleArr[3]);
this.getMonthArr(ruleArr[4]);
this.getWeekArr(ruleArr[5]);
this.getYearArr(ruleArr[6], nYear);
// 将获取到的数组赋值-方便使用
let sDate = this.dateArr[0];
let mDate = this.dateArr[1];
let hDate = this.dateArr[2];
let DDate = this.dateArr[3];
let MDate = this.dateArr[4];
let YDate = this.dateArr[5];
// 获取当前时间在数组中的索引
let sIdx = this.getIndex(sDate, nSecond);
let mIdx = this.getIndex(mDate, nMin);
let hIdx = this.getIndex(hDate, nHour);
let DIdx = this.getIndex(DDate, nDay);
let MIdx = this.getIndex(MDate, nMonth);
let YIdx = this.getIndex(YDate, nYear);
// 重置月日时分秒的函数(后面用的比较多)
const resetSecond = function () {
sIdx = 0;
nSecond = sDate[sIdx]
}
const resetMin = function () {
mIdx = 0;
nMin = mDate[mIdx]
resetSecond();
}
const resetHour = function () {
hIdx = 0;
nHour = hDate[hIdx]
resetMin();
}
const resetDay = function () {
DIdx = 0;
nDay = DDate[DIdx]
resetHour();
}
const resetMonth = function () {
MIdx = 0;
nMonth = MDate[MIdx]
resetDay();
}
// 如果当前年份不为数组中当前值
if (nYear !== YDate[YIdx]) {
resetMonth();
}
// 如果当前月份不为数组中当前值
if (nMonth !== MDate[MIdx]) {
resetDay();
}
// 如果当前“日”不为数组中当前值
if (nDay !== DDate[DIdx]) {
resetHour();
}
// 如果当前“时”不为数组中当前值
if (nHour !== hDate[hIdx]) {
resetMin();
}
// 如果当前“分”不为数组中当前值
if (nMin !== mDate[mIdx]) {
resetSecond();
}
// 循环年份数组
goYear: for (let Yi = YIdx; Yi < YDate.length; Yi++) {
let YY = YDate[Yi];
// 如果到达最大值时
if (nMonth > MDate[MDate.length - 1]) {
resetMonth();
continue;
}
// 循环月份数组
goMonth: for (let Mi = MIdx; Mi < MDate.length; Mi++) {
// 赋值、方便后面运算
let MM = MDate[Mi];
MM = MM < 10 ? '0' + MM : MM;
// 如果到达最大值时
if (nDay > DDate[DDate.length - 1]) {
resetDay();
if (Mi === MDate.length - 1) {
resetMonth();
continue goYear;
}
continue;
}
// 循环日期数组
goDay: for (let Di = DIdx; Di < DDate.length; Di++) {
// 赋值、方便后面运算
let DD = DDate[Di];
let thisDD = DD < 10 ? '0' + DD : DD;
// 如果到达最大值时
if (nHour > hDate[hDate.length - 1]) {
resetHour();
if (Di === DDate.length - 1) {
resetDay();
if (Mi === MDate.length - 1) {
resetMonth();
continue goYear;
}
continue goMonth;
}
continue;
}
// 判断日期的合法性,不合法的话也是跳出当前循环
if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true && this.dayRule !== 'workDay' && this.dayRule !== 'lastWeek' && this.dayRule !== 'lastDay') {
resetDay();
continue goMonth;
}
// 如果日期规则中有值时
if (this.dayRule === 'lastDay') {
// 如果不是合法日期则需要将前将日期调到合法日期即月末最后一天
if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
while (DD > 0 && this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
DD--;
thisDD = DD < 10 ? '0' + DD : DD;
}
}
} else if (this.dayRule === 'workDay') {
// 校验并调整如果是2月30号这种日期传进来时需调整至正常月底
if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
while (DD > 0 && this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
DD--;
thisDD = DD < 10 ? '0' + DD : DD;
}
}
// 获取达到条件的日期是星期X
let thisWeek = this.formatDate(new Date(YY + '-' + MM + '-' + thisDD + ' 00:00:00'), 'week');
// 当星期日时
if (thisWeek === 1) {
// 先找下一个日,并判断是否为月底
DD++;
thisDD = DD < 10 ? '0' + DD : DD;
// 判断下一日已经不是合法日期
if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
DD -= 3;
}
} else if (thisWeek === 7) {
// 当星期6时只需判断不是1号就可进行操作
if (this.dayRuleSup !== 1) {
DD--;
} else {
DD += 2;
}
}
} else if (this.dayRule === 'weekDay') {
// 如果指定了是星期几
// 获取当前日期是属于星期几
let thisWeek = this.formatDate(new Date(YY + '-' + MM + '-' + DD + ' 00:00:00'), 'week');
// 校验当前星期是否在星期池dayRuleSup
if (this.dayRuleSup.indexOf(thisWeek) < 0) {
// 如果到达最大值时
if (Di === DDate.length - 1) {
resetDay();
if (Mi === MDate.length - 1) {
resetMonth();
continue goYear;
}
continue goMonth;
}
continue;
}
} else if (this.dayRule === 'assWeek') {
// 如果指定了是第几周的星期几
// 获取每月1号是属于星期几
let thisWeek = this.formatDate(new Date(YY + '-' + MM + '-' + DD + ' 00:00:00'), 'week');
if (this.dayRuleSup[1] >= thisWeek) {
DD = (this.dayRuleSup[0] - 1) * 7 + this.dayRuleSup[1] - thisWeek + 1;
} else {
DD = this.dayRuleSup[0] * 7 + this.dayRuleSup[1] - thisWeek + 1;
}
} else if (this.dayRule === 'lastWeek') {
// 如果指定了每月最后一个星期几
// 校验并调整如果是2月30号这种日期传进来时需调整至正常月底
if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
while (DD > 0 && this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) {
DD--;
thisDD = DD < 10 ? '0' + DD : DD;
}
}
// 获取月末最后一天是星期几
let thisWeek = this.formatDate(new Date(YY + '-' + MM + '-' + thisDD + ' 00:00:00'), 'week');
// 找到要求中最近的那个星期几
if (this.dayRuleSup < thisWeek) {
DD -= thisWeek - this.dayRuleSup;
} else if (this.dayRuleSup > thisWeek) {
DD -= 7 - (this.dayRuleSup - thisWeek)
}
}
// 判断时间值是否小于10置换成“05”这种格式
DD = DD < 10 ? '0' + DD : DD;
// 循环“时”数组
goHour: for (let hi = hIdx; hi < hDate.length; hi++) {
let hh = hDate[hi] < 10 ? '0' + hDate[hi] : hDate[hi]
// 如果到达最大值时
if (nMin > mDate[mDate.length - 1]) {
resetMin();
if (hi === hDate.length - 1) {
resetHour();
if (Di === DDate.length - 1) {
resetDay();
if (Mi === MDate.length - 1) {
resetMonth();
continue goYear;
}
continue goMonth;
}
continue goDay;
}
continue;
}
// 循环"分"数组
goMin: for (let mi = mIdx; mi < mDate.length; mi++) {
let mm = mDate[mi] < 10 ? '0' + mDate[mi] : mDate[mi];
// 如果到达最大值时
if (nSecond > sDate[sDate.length - 1]) {
resetSecond();
if (mi === mDate.length - 1) {
resetMin();
if (hi === hDate.length - 1) {
resetHour();
if (Di === DDate.length - 1) {
resetDay();
if (Mi === MDate.length - 1) {
resetMonth();
continue goYear;
}
continue goMonth;
}
continue goDay;
}
continue goHour;
}
continue;
}
// 循环"秒"数组
goSecond: for (let si = sIdx; si <= sDate.length - 1; si++) {
let ss = sDate[si] < 10 ? '0' + sDate[si] : sDate[si];
// 添加当前时间(时间合法性在日期循环时已经判断)
if (MM !== '00' && DD !== '00') {
resultArr.push(YY + '-' + MM + '-' + DD + ' ' + hh + ':' + mm + ':' + ss)
nums++;
}
// 如果条数满了就退出循环
if (nums === 5) break goYear;
// 如果到达最大值时
if (si === sDate.length - 1) {
resetSecond();
if (mi === mDate.length - 1) {
resetMin();
if (hi === hDate.length - 1) {
resetHour();
if (Di === DDate.length - 1) {
resetDay();
if (Mi === MDate.length - 1) {
resetMonth();
continue goYear;
}
continue goMonth;
}
continue goDay;
}
continue goHour;
}
continue goMin;
}
} //goSecond
} //goMin
}//goHour
}//goDay
}//goMonth
}
// 判断100年内的结果条数
if (resultArr.length === 0) {
this.resultList = ['没有达到条件的结果!'];
} else {
this.resultList = resultArr;
if (resultArr.length !== 5) {
this.resultList.push('最近100年内只有上面' + resultArr.length + '条结果!')
}
}
// 计算完成-显示结果
this.isShow = true;
},
// 用于计算某位数字在数组中的索引
getIndex(arr, value) {
if (value <= arr[0] || value > arr[arr.length - 1]) {
return 0;
} else {
for (let i = 0; i < arr.length - 1; i++) {
if (value > arr[i] && value <= arr[i + 1]) {
return i + 1;
}
}
}
},
// 获取"年"数组
getYearArr(rule, year) {
this.dateArr[5] = this.getOrderArr(year, year + 100);
if (rule !== undefined) {
if (rule.indexOf('-') >= 0) {
this.dateArr[5] = this.getCycleArr(rule, year + 100, false)
} else if (rule.indexOf('/') >= 0) {
this.dateArr[5] = this.getAverageArr(rule, year + 100)
} else if (rule !== '*') {
this.dateArr[5] = this.getAssignArr(rule)
}
}
},
// 获取"月"数组
getMonthArr(rule) {
this.dateArr[4] = this.getOrderArr(1, 12);
if (rule.indexOf('-') >= 0) {
this.dateArr[4] = this.getCycleArr(rule, 12, false)
} else if (rule.indexOf('/') >= 0) {
this.dateArr[4] = this.getAverageArr(rule, 12)
} else if (rule !== '*') {
this.dateArr[4] = this.getAssignArr(rule)
}
},
// 获取"日"数组-主要为日期规则
getWeekArr(rule) {
// 只有当日期规则的两个值均为“”时则表达日期是有选项的
if (this.dayRule === '' && this.dayRuleSup === '') {
if (rule.indexOf('-') >= 0) {
this.dayRule = 'weekDay';
this.dayRuleSup = this.getCycleArr(rule, 7, false)
} else if (rule.indexOf('#') >= 0) {
this.dayRule = 'assWeek';
let matchRule = rule.match(/[0-9]/g);
this.dayRuleSup = [Number(matchRule[1]), Number(matchRule[0])];
this.dateArr[3] = [1];
if (this.dayRuleSup[1] === 7) {
this.dayRuleSup[1] = 0;
}
} else if (rule.indexOf('L') >= 0) {
this.dayRule = 'lastWeek';
this.dayRuleSup = Number(rule.match(/[0-9]{1,2}/g)[0]);
this.dateArr[3] = [31];
if (this.dayRuleSup === 7) {
this.dayRuleSup = 0;
}
} else if (rule !== '*' && rule !== '?') {
this.dayRule = 'weekDay';
this.dayRuleSup = this.getAssignArr(rule)
}
}
},
// 获取"日"数组-少量为日期规则
getDayArr(rule) {
this.dateArr[3] = this.getOrderArr(1, 31);
this.dayRule = '';
this.dayRuleSup = '';
if (rule.indexOf('-') >= 0) {
this.dateArr[3] = this.getCycleArr(rule, 31, false)
this.dayRuleSup = 'null';
} else if (rule.indexOf('/') >= 0) {
this.dateArr[3] = this.getAverageArr(rule, 31)
this.dayRuleSup = 'null';
} else if (rule.indexOf('W') >= 0) {
this.dayRule = 'workDay';
this.dayRuleSup = Number(rule.match(/[0-9]{1,2}/g)[0]);
this.dateArr[3] = [this.dayRuleSup];
} else if (rule.indexOf('L') >= 0) {
this.dayRule = 'lastDay';
this.dayRuleSup = 'null';
this.dateArr[3] = [31];
} else if (rule !== '*' && rule !== '?') {
this.dateArr[3] = this.getAssignArr(rule)
this.dayRuleSup = 'null';
} else if (rule === '*') {
this.dayRuleSup = 'null';
}
},
// 获取"时"数组
getHourArr(rule) {
this.dateArr[2] = this.getOrderArr(0, 23);
if (rule.indexOf('-') >= 0) {
this.dateArr[2] = this.getCycleArr(rule, 24, true)
} else if (rule.indexOf('/') >= 0) {
this.dateArr[2] = this.getAverageArr(rule, 23)
} else if (rule !== '*') {
this.dateArr[2] = this.getAssignArr(rule)
}
},
// 获取"分"数组
getMinArr(rule) {
this.dateArr[1] = this.getOrderArr(0, 59);
if (rule.indexOf('-') >= 0) {
this.dateArr[1] = this.getCycleArr(rule, 60, true)
} else if (rule.indexOf('/') >= 0) {
this.dateArr[1] = this.getAverageArr(rule, 59)
} else if (rule !== '*') {
this.dateArr[1] = this.getAssignArr(rule)
}
},
// 获取"秒"数组
getSecondArr(rule) {
this.dateArr[0] = this.getOrderArr(0, 59);
if (rule.indexOf('-') >= 0) {
this.dateArr[0] = this.getCycleArr(rule, 60, true)
} else if (rule.indexOf('/') >= 0) {
this.dateArr[0] = this.getAverageArr(rule, 59)
} else if (rule !== '*') {
this.dateArr[0] = this.getAssignArr(rule)
}
},
// 根据传进来的min-max返回一个顺序的数组
getOrderArr(min, max) {
let arr = [];
for (let i = min; i <= max; i++) {
arr.push(i);
}
return arr;
},
// 根据规则中指定的零散值返回一个数组
getAssignArr(rule) {
let arr = [];
let assiginArr = rule.split(',');
for (let i = 0; i < assiginArr.length; i++) {
arr[i] = Number(assiginArr[i])
}
arr.sort(this.compare)
return arr;
},
// 根据一定算术规则计算返回一个数组
getAverageArr(rule, limit) {
let arr = [];
let agArr = rule.split('/');
let min = Number(agArr[0]);
let step = Number(agArr[1]);
while (min <= limit) {
arr.push(min);
min += step;
}
return arr;
},
// 根据规则返回一个具有周期性的数组
getCycleArr(rule, limit, status) {
// status--表示是否从0开始则从1开始
let arr = [];
let cycleArr = rule.split('-');
let min = Number(cycleArr[0]);
let max = Number(cycleArr[1]);
if (min > max) {
max += limit;
}
for (let i = min; i <= max; i++) {
let add = 0;
if (status === false && i % limit === 0) {
add = limit;
}
arr.push(Math.round(i % limit + add))
}
arr.sort(this.compare)
return arr;
},
// 比较数字大小用于Array.sort
compare(value1, value2) {
if (value2 - value1 > 0) {
return -1;
} else {
return 1;
}
},
// 格式化日期格式如2017-9-19 18:04:33
formatDate(value, type) {
// 计算日期相关值
let time = typeof value == 'number' ? new Date(value) : value;
let Y = time.getFullYear();
let M = time.getMonth() + 1;
let D = time.getDate();
let h = time.getHours();
let m = time.getMinutes();
let s = time.getSeconds();
let week = time.getDay();
// 如果传递了type的话
if (type === undefined) {
return Y + '-' + (M < 10 ? '0' + M : M) + '-' + (D < 10 ? '0' + D : D) + ' ' + (h < 10 ? '0' + h : h) + ':' + (m < 10 ? '0' + m : m) + ':' + (s < 10 ? '0' + s : s);
} else if (type === 'week') {
// 在quartz中 1为星期日
return week + 1;
}
},
// 检查日期是否存在
checkDate(value) {
let time = new Date(value);
let format = this.formatDate(time)
return value === format;
}
},
watch: {
'ex': 'expressionChange'
},
props: ['ex'],
mounted: function () {
// 初始化 获取一次结果
this.expressionChange();
}
}
</script>

View File

@@ -0,0 +1,117 @@
<template>
<el-form size="small">
<el-form-item>
<el-radio v-model='radioValue' :label="1">
允许的通配符[, - * /]
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="2">
周期从
<el-input-number v-model='cycle01' :min="0" :max="58" /> -
<el-input-number v-model='cycle02' :min="cycle01 ? cycle01 + 1 : 1" :max="59" />
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="3">
<el-input-number v-model='average01' :min="0" :max="58" /> 秒开始
<el-input-number v-model='average02' :min="1" :max="59 - average01 || 0" /> 秒执行一次
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="4">
指定
<el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%">
<el-option v-for="item in 60" :key="item" :value="item-1">{{item-1}}</el-option>
</el-select>
</el-radio>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
radioValue: 1,
cycle01: 1,
cycle02: 2,
average01: 0,
average02: 1,
checkboxList: [],
checkNum: this.$options.propsData.check
}
},
name: 'crontab-second',
props: ['check', 'radioParent'],
methods: {
// 单选按钮值变化时
radioChange() {
switch (this.radioValue) {
case 1:
this.$emit('update', 'second', '*', 'second');
break;
case 2:
this.$emit('update', 'second', this.cycleTotal);
break;
case 3:
this.$emit('update', 'second', this.averageTotal);
break;
case 4:
this.$emit('update', 'second', this.checkboxString);
break;
}
},
// 周期两个值变化时
cycleChange() {
if (this.radioValue === '2') {
this.$emit('update', 'second', this.cycleTotal);
}
},
// 平均两个值变化时
averageChange() {
if (this.radioValue === '3') {
this.$emit('update', 'second', this.averageTotal);
}
},
// checkbox值变化时
checkboxChange() {
if (this.radioValue === '4') {
this.$emit('update', 'second', this.checkboxString);
}
}
},
watch: {
'radioValue': 'radioChange',
'cycleTotal': 'cycleChange',
'averageTotal': 'averageChange',
'checkboxString': 'checkboxChange',
radioParent() {
this.radioValue = this.radioParent
}
},
computed: {
// 计算两个周期值
cycleTotal: function () {
const cycle01 = this.checkNum(this.cycle01, 0, 58)
const cycle02 = this.checkNum(this.cycle02, cycle01 ? cycle01 + 1 : 1, 59)
return cycle01 + '-' + cycle02;
},
// 计算平均用到的值
averageTotal: function () {
const average01 = this.checkNum(this.average01, 0, 58)
const average02 = this.checkNum(this.average02, 1, 59 - average01 || 0)
return average01 + '/' + average02;
},
// 计算勾选的checkbox值合集
checkboxString: function () {
let str = this.checkboxList.join();
return str === '' ? '*' : str;
}
}
}
</script>

View File

@@ -0,0 +1,202 @@
<template>
<el-form size='small'>
<el-form-item>
<el-radio v-model='radioValue' :label="1">
允许的通配符[, - * ? / L #]
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="2">
不指定
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="3">
周期从星期
<el-select clearable v-model="cycle01">
<el-option
v-for="(item,index) of weekList"
:key="index"
:label="item.value"
:value="item.key"
:disabled="item.key === 1"
>{{item.value}}</el-option>
</el-select>
-
<el-select clearable v-model="cycle02">
<el-option
v-for="(item,index) of weekList"
:key="index"
:label="item.value"
:value="item.key"
:disabled="item.key < cycle01 && item.key !== 1"
>{{item.value}}</el-option>
</el-select>
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="4">
<el-input-number v-model='average01' :min="1" :max="4" /> 周的星期
<el-select clearable v-model="average02">
<el-option v-for="(item,index) of weekList" :key="index" :label="item.value" :value="item.key">{{item.value}}</el-option>
</el-select>
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="5">
本月最后一个星期
<el-select clearable v-model="weekday">
<el-option v-for="(item,index) of weekList" :key="index" :label="item.value" :value="item.key">{{item.value}}</el-option>
</el-select>
</el-radio>
</el-form-item>
<el-form-item>
<el-radio v-model='radioValue' :label="6">
指定
<el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%">
<el-option v-for="(item,index) of weekList" :key="index" :label="item.value" :value="String(item.key)">{{item.value}}</el-option>
</el-select>
</el-radio>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
radioValue: 2,
weekday: 2,
cycle01: 2,
cycle02: 3,
average01: 1,
average02: 2,
checkboxList: [],
weekList: [
{
key: 2,
value: '星期一'
},
{
key: 3,
value: '星期二'
},
{
key: 4,
value: '星期三'
},
{
key: 5,
value: '星期四'
},
{
key: 6,
value: '星期五'
},
{
key: 7,
value: '星期六'
},
{
key: 1,
value: '星期日'
}
],
checkNum: this.$options.propsData.check
}
},
name: 'crontab-week',
props: ['check', 'cron'],
methods: {
// 单选按钮值变化时
radioChange() {
if (this.radioValue !== 2 && this.cron.day !== '?') {
this.$emit('update', 'day', '?', 'week');
}
switch (this.radioValue) {
case 1:
this.$emit('update', 'week', '*');
break;
case 2:
this.$emit('update', 'week', '?');
break;
case 3:
this.$emit('update', 'week', this.cycleTotal);
break;
case 4:
this.$emit('update', 'week', this.averageTotal);
break;
case 5:
this.$emit('update', 'week', this.weekdayCheck + 'L');
break;
case 6:
this.$emit('update', 'week', this.checkboxString);
break;
}
},
// 周期两个值变化时
cycleChange() {
if (this.radioValue === '3') {
this.$emit('update', 'week', this.cycleTotal);
}
},
// 平均两个值变化时
averageChange() {
if (this.radioValue === '4') {
this.$emit('update', 'week', this.averageTotal);
}
},
// 最近工作日值变化时
weekdayChange() {
if (this.radioValue === '5') {
this.$emit('update', 'week', this.weekday + 'L');
}
},
// checkbox值变化时
checkboxChange() {
if (this.radioValue === '6') {
this.$emit('update', 'week', this.checkboxString);
}
},
},
watch: {
'radioValue': 'radioChange',
'cycleTotal': 'cycleChange',
'averageTotal': 'averageChange',
'weekdayCheck': 'weekdayChange',
'checkboxString': 'checkboxChange',
},
computed: {
// 计算两个周期值
cycleTotal: function () {
this.cycle01 = this.checkNum(this.cycle01, 1, 7)
this.cycle02 = this.checkNum(this.cycle02, 1, 7)
return this.cycle01 + '-' + this.cycle02;
},
// 计算平均用到的值
averageTotal: function () {
this.average01 = this.checkNum(this.average01, 1, 4)
this.average02 = this.checkNum(this.average02, 1, 7)
return this.average02 + '#' + this.average01;
},
// 最近的工作日(格式)
weekdayCheck: function () {
this.weekday = this.checkNum(this.weekday, 1, 7)
return this.weekday;
},
// 计算勾选的checkbox值合集
checkboxString: function () {
let str = this.checkboxList.join();
return str === '' ? '*' : str;
}
}
}
</script>

View File

@@ -0,0 +1,131 @@
<template>
<el-form size="small">
<el-form-item>
<el-radio :label="1" v-model='radioValue'>
不填允许的通配符[, - * /]
</el-radio>
</el-form-item>
<el-form-item>
<el-radio :label="2" v-model='radioValue'>
每年
</el-radio>
</el-form-item>
<el-form-item>
<el-radio :label="3" v-model='radioValue'>
周期从
<el-input-number v-model='cycle01' :min='fullYear' :max="2098" /> -
<el-input-number v-model='cycle02' :min="cycle01 ? cycle01 + 1 : fullYear + 1" :max="2099" />
</el-radio>
</el-form-item>
<el-form-item>
<el-radio :label="4" v-model='radioValue'>
<el-input-number v-model='average01' :min='fullYear' :max="2098"/> 年开始
<el-input-number v-model='average02' :min="1" :max="2099 - average01 || fullYear" /> 年执行一次
</el-radio>
</el-form-item>
<el-form-item>
<el-radio :label="5" v-model='radioValue'>
指定
<el-select clearable v-model="checkboxList" placeholder="可多选" multiple>
<el-option v-for="item in 9" :key="item" :value="item - 1 + fullYear" :label="item -1 + fullYear" />
</el-select>
</el-radio>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
fullYear: 0,
radioValue: 1,
cycle01: 0,
cycle02: 0,
average01: 0,
average02: 1,
checkboxList: [],
checkNum: this.$options.propsData.check
}
},
name: 'crontab-year',
props: ['check', 'month', 'cron'],
methods: {
// 单选按钮值变化时
radioChange() {
switch (this.radioValue) {
case 1:
this.$emit('update', 'year', '');
break;
case 2:
this.$emit('update', 'year', '*');
break;
case 3:
this.$emit('update', 'year', this.cycleTotal);
break;
case 4:
this.$emit('update', 'year', this.averageTotal);
break;
case 5:
this.$emit('update', 'year', this.checkboxString);
break;
}
},
// 周期两个值变化时
cycleChange() {
if (this.radioValue === '3') {
this.$emit('update', 'year', this.cycleTotal);
}
},
// 平均两个值变化时
averageChange() {
if (this.radioValue === '4') {
this.$emit('update', 'year', this.averageTotal);
}
},
// checkbox值变化时
checkboxChange() {
if (this.radioValue === '5') {
this.$emit('update', 'year', this.checkboxString);
}
}
},
watch: {
'radioValue': 'radioChange',
'cycleTotal': 'cycleChange',
'averageTotal': 'averageChange',
'checkboxString': 'checkboxChange'
},
computed: {
// 计算两个周期值
cycleTotal: function () {
const cycle01 = this.checkNum(this.cycle01, this.fullYear, 2098)
const cycle02 = this.checkNum(this.cycle02, cycle01 ? cycle01 + 1 : this.fullYear + 1, 2099)
return cycle01 + '-' + cycle02;
},
// 计算平均用到的值
averageTotal: function () {
const average01 = this.checkNum(this.average01, this.fullYear, 2098)
const average02 = this.checkNum(this.average02, 1, 2099 - average01 || this.fullYear)
return average01 + '/' + average02;
},
// 计算勾选的checkbox值合集
checkboxString: function () {
let str = this.checkboxList.join();
return str;
}
},
mounted: function () {
// 仅获取当前年份
this.fullYear = Number(new Date().getFullYear());
this.cycle01 = this.fullYear
this.average01 = this.fullYear
}
}
</script>

View File

@@ -12,7 +12,7 @@
:label-width="`${labelWidth}px`"
:size="size"
:label-position="labelPosition"
v-loading="formLoading">
v-loading="0 && formLoading">
<el-row :gutter="20" v-for="(row, rindex) in rows" :key="rindex">
<el-col v-for="col in row" :key="col.label" :span="24 / row.length">
<el-form-item :label="col.label" :prop="col.prop" :rules="col.rules">

View File

@@ -0,0 +1,630 @@
// 表单属性【右面板】
export const formConf = {
formRef: 'elForm',
formModel: 'formData',
size: 'medium',
labelPosition: 'right',
labelWidth: 100,
formRules: 'rules',
gutter: 15,
disabled: false,
span: 24,
formBtns: true
}
// 输入型组件 【左面板】
export const inputComponents = [
{
// 组件的自定义配置
__config__: {
label: '单行文本',
labelWidth: null,
showLabel: true,
changeTag: true,
tag: 'el-input',
tagIcon: 'input',
defaultValue: undefined,
required: true,
layout: 'colFormItem',
span: 24,
document: 'https://element.eleme.cn/#/zh-CN/component/input',
// 正则校验规则
regList: []
},
// 组件的插槽属性
__slot__: {
prepend: '',
append: ''
},
// 其余的为可直接写在组件标签上的属性
placeholder: '请输入',
style: { width: '100%' },
clearable: true,
'prefix-icon': '',
'suffix-icon': '',
maxlength: null,
'show-word-limit': false,
readonly: false,
disabled: false
},
{
__config__: {
label: '多行文本',
labelWidth: null,
showLabel: true,
tag: 'el-input',
tagIcon: 'textarea',
defaultValue: undefined,
required: true,
layout: 'colFormItem',
span: 24,
regList: [],
changeTag: true,
document: 'https://element.eleme.cn/#/zh-CN/component/input'
},
type: 'textarea',
placeholder: '请输入',
autosize: {
minRows: 4,
maxRows: 4
},
style: { width: '100%' },
maxlength: null,
'show-word-limit': false,
readonly: false,
disabled: false
},
{
__config__: {
label: '密码',
showLabel: true,
labelWidth: null,
changeTag: true,
tag: 'el-input',
tagIcon: 'password',
defaultValue: undefined,
layout: 'colFormItem',
span: 24,
required: true,
regList: [],
document: 'https://element.eleme.cn/#/zh-CN/component/input'
},
__slot__: {
prepend: '',
append: ''
},
placeholder: '请输入',
'show-password': true,
style: { width: '100%' },
clearable: true,
'prefix-icon': '',
'suffix-icon': '',
maxlength: null,
'show-word-limit': false,
readonly: false,
disabled: false
},
{
__config__: {
label: '计数器',
showLabel: true,
changeTag: true,
labelWidth: null,
tag: 'el-input-number',
tagIcon: 'number',
defaultValue: undefined,
span: 24,
layout: 'colFormItem',
required: true,
regList: [],
document: 'https://element.eleme.cn/#/zh-CN/component/input-number'
},
placeholder: '',
min: undefined,
max: undefined,
step: 1,
'step-strictly': false,
precision: undefined,
'controls-position': '',
disabled: false
},
{
__config__: {
label: '编辑器',
showLabel: true,
changeTag: true,
labelWidth: null,
tag: 'tinymce',
tagIcon: 'rich-text',
defaultValue: null,
span: 24,
layout: 'colFormItem',
required: true,
regList: [],
document: 'http://tinymce.ax-z.cn'
},
placeholder: '请输入',
height: 300, // 编辑器高度
branding: false // 隐藏右下角品牌烙印
}
]
// 选择型组件 【左面板】
export const selectComponents = [
{
__config__: {
label: '下拉选择',
showLabel: true,
labelWidth: null,
tag: 'el-select',
tagIcon: 'select',
layout: 'colFormItem',
span: 24,
required: true,
regList: [],
changeTag: true,
document: 'https://element.eleme.cn/#/zh-CN/component/select'
},
__slot__: {
options: [{
label: '选项一',
value: 1
}, {
label: '选项二',
value: 2
}]
},
placeholder: '请选择',
style: { width: '100%' },
clearable: true,
disabled: false,
filterable: false,
multiple: false
},
{
__config__: {
label: '级联选择',
url: 'https://www.fastmock.site/mock/f8d7a54fb1e60561e2f720d5a810009d/fg/cascaderList',
method: 'get',
dataPath: 'list',
dataConsumer: 'options',
showLabel: true,
labelWidth: null,
tag: 'el-cascader',
tagIcon: 'cascader',
layout: 'colFormItem',
defaultValue: [],
dataType: 'dynamic',
span: 24,
required: true,
regList: [],
changeTag: true,
document: 'https://element.eleme.cn/#/zh-CN/component/cascader'
},
options: [{
id: 1,
value: 1,
label: '选项1',
children: [{
id: 2,
value: 2,
label: '选项1-1'
}]
}],
placeholder: '请选择',
style: { width: '100%' },
props: {
props: {
multiple: false,
label: 'label',
value: 'value',
children: 'children'
}
},
'show-all-levels': true,
disabled: false,
clearable: true,
filterable: false,
separator: '/'
},
{
__config__: {
label: '单选框组',
labelWidth: null,
showLabel: true,
tag: 'el-radio-group',
tagIcon: 'radio',
changeTag: true,
defaultValue: undefined,
layout: 'colFormItem',
span: 24,
optionType: 'default',
regList: [],
required: true,
border: false,
document: 'https://element.eleme.cn/#/zh-CN/component/radio'
},
__slot__: {
options: [{
label: '选项一',
value: 1
}, {
label: '选项二',
value: 2
}]
},
style: {},
size: 'medium',
disabled: false
},
{
__config__: {
label: '多选框组',
tag: 'el-checkbox-group',
tagIcon: 'checkbox',
defaultValue: [],
span: 24,
showLabel: true,
labelWidth: null,
layout: 'colFormItem',
optionType: 'default',
required: true,
regList: [],
changeTag: true,
border: false,
document: 'https://element.eleme.cn/#/zh-CN/component/checkbox'
},
__slot__: {
options: [{
label: '选项一',
value: 1
}, {
label: '选项二',
value: 2
}]
},
style: {},
size: 'medium',
min: null,
max: null,
disabled: false
},
{
__config__: {
label: '开关',
tag: 'el-switch',
tagIcon: 'switch',
defaultValue: false,
span: 24,
showLabel: true,
labelWidth: null,
layout: 'colFormItem',
required: true,
regList: [],
changeTag: true,
document: 'https://element.eleme.cn/#/zh-CN/component/switch'
},
style: {},
disabled: false,
'active-text': '',
'inactive-text': '',
'active-color': null,
'inactive-color': null,
'active-value': true,
'inactive-value': false
},
{
__config__: {
label: '滑块',
tag: 'el-slider',
tagIcon: 'slider',
defaultValue: null,
span: 24,
showLabel: true,
layout: 'colFormItem',
labelWidth: null,
required: true,
regList: [],
changeTag: true,
document: 'https://element.eleme.cn/#/zh-CN/component/slider'
},
disabled: false,
min: 0,
max: 100,
step: 1,
'show-stops': false,
range: false
},
{
__config__: {
label: '时间选择',
tag: 'el-time-picker',
tagIcon: 'time',
defaultValue: null,
span: 24,
showLabel: true,
layout: 'colFormItem',
labelWidth: null,
required: true,
regList: [],
changeTag: true,
document: 'https://element.eleme.cn/#/zh-CN/component/time-picker'
},
placeholder: '请选择',
style: { width: '100%' },
disabled: false,
clearable: true,
'picker-options': {
selectableRange: '00:00:00-23:59:59'
},
format: 'HH:mm:ss',
'value-format': 'HH:mm:ss'
},
{
__config__: {
label: '时间范围',
tag: 'el-time-picker',
tagIcon: 'time-range',
span: 24,
showLabel: true,
labelWidth: null,
layout: 'colFormItem',
defaultValue: null,
required: true,
regList: [],
changeTag: true,
document: 'https://element.eleme.cn/#/zh-CN/component/time-picker'
},
style: { width: '100%' },
disabled: false,
clearable: true,
'is-range': true,
'range-separator': '至',
'start-placeholder': '开始时间',
'end-placeholder': '结束时间',
format: 'HH:mm:ss',
'value-format': 'HH:mm:ss'
},
{
__config__: {
label: '日期选择',
tag: 'el-date-picker',
tagIcon: 'date',
defaultValue: null,
showLabel: true,
labelWidth: null,
span: 24,
layout: 'colFormItem',
required: true,
regList: [],
changeTag: true,
document: 'https://element.eleme.cn/#/zh-CN/component/date-picker'
},
placeholder: '请选择',
type: 'date',
style: { width: '100%' },
disabled: false,
clearable: true,
format: 'yyyy-MM-dd',
'value-format': 'yyyy-MM-dd',
readonly: false
},
{
__config__: {
label: '日期范围',
tag: 'el-date-picker',
tagIcon: 'date-range',
defaultValue: null,
span: 24,
showLabel: true,
labelWidth: null,
required: true,
layout: 'colFormItem',
regList: [],
changeTag: true,
document: 'https://element.eleme.cn/#/zh-CN/component/date-picker'
},
style: { width: '100%' },
type: 'daterange',
'range-separator': '至',
'start-placeholder': '开始日期',
'end-placeholder': '结束日期',
disabled: false,
clearable: true,
format: 'yyyy-MM-dd',
'value-format': 'yyyy-MM-dd',
readonly: false
},
{
__config__: {
label: '评分',
tag: 'el-rate',
tagIcon: 'rate',
defaultValue: 0,
span: 24,
showLabel: true,
labelWidth: null,
layout: 'colFormItem',
required: true,
regList: [],
changeTag: true,
document: 'https://element.eleme.cn/#/zh-CN/component/rate'
},
style: {},
max: 5,
'allow-half': false,
'show-text': false,
'show-score': false,
disabled: false
},
{
__config__: {
label: '颜色选择',
tag: 'el-color-picker',
tagIcon: 'color',
span: 24,
defaultValue: null,
showLabel: true,
labelWidth: null,
layout: 'colFormItem',
required: true,
regList: [],
changeTag: true,
document: 'https://element.eleme.cn/#/zh-CN/component/color-picker'
},
'show-alpha': false,
'color-format': '',
disabled: false,
size: 'medium'
},
{
__config__: {
label: '上传',
tag: 'el-upload',
tagIcon: 'upload',
layout: 'colFormItem',
defaultValue: null,
showLabel: true,
labelWidth: null,
required: true,
span: 24,
showTip: false,
buttonText: '点击上传',
regList: [],
changeTag: true,
fileSize: 2,
sizeUnit: 'MB',
document: 'https://element.eleme.cn/#/zh-CN/component/upload'
},
__slot__: {
'list-type': true
},
// action: process.env.VUE_APP_BASE_API + "/admin-api/infra/file/upload", // 请求地址
action: '/infra/file/upload', // 请求地址
disabled: false,
accept: '',
name: 'file',
'auto-upload': true,
'list-type': 'text',
multiple: false
}
]
// 布局型组件 【左面板】
export const layoutComponents = [
{
__config__: {
layout: 'rowFormItem',
tagIcon: 'row',
label: '行容器',
layoutTree: true,
document: 'https://element.eleme.cn/#/zh-CN/component/layout#row-attributes'
},
type: 'default',
justify: 'start',
align: 'top'
},
{
__config__: {
label: '按钮',
showLabel: true,
changeTag: true,
labelWidth: null,
tag: 'el-button',
tagIcon: 'button',
span: 24,
layout: 'colFormItem',
document: 'https://element.eleme.cn/#/zh-CN/component/button'
},
__slot__: {
default: '主要按钮'
},
type: 'primary',
icon: 'el-icon-search',
round: false,
size: 'medium',
plain: false,
circle: false,
disabled: false
},
{
__config__: {
layout: 'colFormItem',
tagIcon: 'table',
tag: 'el-table',
document: 'https://element.eleme.cn/#/zh-CN/component/table',
span: 24,
formId: 101,
renderKey: 1595761764203,
componentName: 'row101',
showLabel: true,
changeTag: true,
labelWidth: null,
label: '表格[开发中]',
dataType: 'dynamic',
method: 'get',
dataPath: 'list',
dataConsumer: 'data',
url: 'https://www.fastmock.site/mock/f8d7a54fb1e60561e2f720d5a810009d/fg/tableData',
children: [{
__config__: {
layout: 'raw',
tag: 'el-table-column',
renderKey: 15957617660153
},
prop: 'date',
label: '日期'
}, {
__config__: {
layout: 'raw',
tag: 'el-table-column',
renderKey: 15957617660152
},
prop: 'address',
label: '地址'
}, {
__config__: {
layout: 'raw',
tag: 'el-table-column',
renderKey: 15957617660151
},
prop: 'name',
label: '名称'
}, {
__config__: {
layout: 'raw',
tag: 'el-table-column',
renderKey: 1595774496335,
children: [
{
__config__: {
label: '按钮',
tag: 'el-button',
tagIcon: 'button',
layout: 'raw',
renderKey: 1595779809901
},
__slot__: {
default: '主要按钮'
},
type: 'primary',
icon: 'el-icon-search',
round: false,
size: 'medium'
}
]
},
label: '操作'
}]
},
data: [],
directives: [{
name: 'loading',
value: true
}],
border: true,
type: 'default',
justify: 'start',
align: 'top'
}
]

View File

@@ -0,0 +1,18 @@
const styles = {
'el-rate': '.el-rate{display: inline-block; vertical-align: text-top;}',
'el-upload': '.el-upload__tip{line-height: 1.2;}'
}
function addCss(cssList, el) {
const css = styles[el.__config__.tag]
css && cssList.indexOf(css) === -1 && cssList.push(css)
if (el.__config__.children) {
el.__config__.children.forEach(el2 => addCss(cssList, el2))
}
}
export function makeUpCss(conf) {
const cssList = []
conf.fields.forEach(el => addCss(cssList, el))
return cssList.join('\n')
}

View File

@@ -0,0 +1,37 @@
export default [
{
__config__: {
label: '单行文本',
labelWidth: null,
showLabel: true,
changeTag: true,
tag: 'el-input',
tagIcon: 'input',
defaultValue: undefined,
required: true,
layout: 'colFormItem',
span: 24,
document: 'https://element.eleme.cn/#/zh-CN/component/input',
// 正则校验规则
regList: [{
pattern: '/^1(3|4|5|7|8|9)\\d{9}$/',
message: '手机号格式错误'
}]
},
// 组件的插槽属性
__slot__: {
prepend: '',
append: ''
},
__vModel__: 'mobile',
placeholder: '请输入手机号',
style: { width: '100%' },
clearable: true,
'prefix-icon': 'el-icon-mobile',
'suffix-icon': '',
maxlength: 11,
'show-word-limit': true,
readonly: false,
disabled: false
}
]

View File

@@ -0,0 +1,399 @@
/* eslint-disable max-len */
import ruleTrigger from './ruleTrigger'
let confGlobal
let someSpanIsNot24
export function dialogWrapper(str) {
return `<el-dialog v-bind="$attrs" v-on="$listeners" @open="onOpen" @close="onClose" title="Dialog Titile">
${str}
<div slot="footer">
<el-button @click="close">取消</el-button>
<el-button type="primary" @click="handelConfirm">确定</el-button>
</div>
</el-dialog>`
}
export function vueTemplate(str) {
return `<template>
<div>
${str}
</div>
</template>`
}
export function vueScript(str) {
return `<script>
${str}
</script>`
}
export function cssStyle(cssStr) {
return `<style>
${cssStr}
</style>`
}
function buildFormTemplate(scheme, child, type) {
let labelPosition = ''
if (scheme.labelPosition !== 'right') {
labelPosition = `label-position="${scheme.labelPosition}"`
}
const disabled = scheme.disabled ? `:disabled="${scheme.disabled}"` : ''
let str = `<el-form ref="${scheme.formRef}" :model="${scheme.formModel}" :rules="${scheme.formRules}" size="${scheme.size}" ${disabled} label-width="${scheme.labelWidth}px" ${labelPosition}>
${child}
${buildFromBtns(scheme, type)}
</el-form>`
if (someSpanIsNot24) {
str = `<el-row :gutter="${scheme.gutter}">
${str}
</el-row>`
}
return str
}
function buildFromBtns(scheme, type) {
let str = ''
if (scheme.formBtns && type === 'file') {
str = `<el-form-item size="large">
<el-button type="primary" @click="submitForm">提交</el-button>
<el-button @click="resetForm">重置</el-button>
</el-form-item>`
if (someSpanIsNot24) {
str = `<el-col :span="24">
${str}
</el-col>`
}
}
return str
}
// span不为24的用el-col包裹
function colWrapper(scheme, str) {
if (someSpanIsNot24 || scheme.__config__.span !== 24) {
return `<el-col :span="${scheme.__config__.span}">
${str}
</el-col>`
}
return str
}
const layouts = {
colFormItem(scheme) {
const config = scheme.__config__
let labelWidth = ''
let label = `label="${config.label}"`
if (config.labelWidth && config.labelWidth !== confGlobal.labelWidth) {
labelWidth = `label-width="${config.labelWidth}px"`
}
if (config.showLabel === false) {
labelWidth = 'label-width="0"'
label = ''
}
const required = !ruleTrigger[config.tag] && config.required ? 'required' : ''
const tagDom = tags[config.tag] ? tags[config.tag](scheme) : null
let str = `<el-form-item ${labelWidth} ${label} prop="${scheme.__vModel__}" ${required}>
${tagDom}
</el-form-item>`
str = colWrapper(scheme, str)
return str
},
rowFormItem(scheme) {
const config = scheme.__config__
const type = scheme.type === 'default' ? '' : `type="${scheme.type}"`
const justify = scheme.type === 'default' ? '' : `justify="${scheme.justify}"`
const align = scheme.type === 'default' ? '' : `align="${scheme.align}"`
const gutter = scheme.gutter ? `:gutter="${scheme.gutter}"` : ''
const children = config.children.map(el => layouts[el.__config__.layout](el))
let str = `<el-row ${type} ${justify} ${align} ${gutter}>
${children.join('\n')}
</el-row>`
str = colWrapper(scheme, str)
return str
}
}
const tags = {
'el-button': el => {
const {
tag, disabled
} = attrBuilder(el)
const type = el.type ? `type="${el.type}"` : ''
const icon = el.icon ? `icon="${el.icon}"` : ''
const round = el.round ? 'round' : ''
const size = el.size ? `size="${el.size}"` : ''
const plain = el.plain ? 'plain' : ''
const circle = el.circle ? 'circle' : ''
let child = buildElButtonChild(el)
if (child) child = `\n${child}\n` // 换行
return `<${tag} ${type} ${icon} ${round} ${size} ${plain} ${disabled} ${circle}>${child}</${tag}>`
},
'el-input': el => {
const {
tag, disabled, vModel, clearable, placeholder, width
} = attrBuilder(el)
const maxlength = el.maxlength ? `:maxlength="${el.maxlength}"` : ''
const showWordLimit = el['show-word-limit'] ? 'show-word-limit' : ''
const readonly = el.readonly ? 'readonly' : ''
const prefixIcon = el['prefix-icon'] ? `prefix-icon='${el['prefix-icon']}'` : ''
const suffixIcon = el['suffix-icon'] ? `suffix-icon='${el['suffix-icon']}'` : ''
const showPassword = el['show-password'] ? 'show-password' : ''
const type = el.type ? `type="${el.type}"` : ''
const autosize = el.autosize && el.autosize.minRows
? `:autosize="{minRows: ${el.autosize.minRows}, maxRows: ${el.autosize.maxRows}}"`
: ''
let child = buildElInputChild(el)
if (child) child = `\n${child}\n` // 换行
return `<${tag} ${vModel} ${type} ${placeholder} ${maxlength} ${showWordLimit} ${readonly} ${disabled} ${clearable} ${prefixIcon} ${suffixIcon} ${showPassword} ${autosize} ${width}>${child}</${tag}>`
},
'el-input-number': el => {
const {
tag, disabled, vModel, placeholder
} = attrBuilder(el)
const controlsPosition = el['controls-position'] ? `controls-position=${el['controls-position']}` : ''
const min = el.min ? `:min='${el.min}'` : ''
const max = el.max ? `:max='${el.max}'` : ''
const step = el.step ? `:step='${el.step}'` : ''
const stepStrictly = el['step-strictly'] ? 'step-strictly' : ''
const precision = el.precision ? `:precision='${el.precision}'` : ''
return `<${tag} ${vModel} ${placeholder} ${step} ${stepStrictly} ${precision} ${controlsPosition} ${min} ${max} ${disabled}></${tag}>`
},
'el-select': el => {
const {
tag, disabled, vModel, clearable, placeholder, width
} = attrBuilder(el)
const filterable = el.filterable ? 'filterable' : ''
const multiple = el.multiple ? 'multiple' : ''
let child = buildElSelectChild(el)
if (child) child = `\n${child}\n` // 换行
return `<${tag} ${vModel} ${placeholder} ${disabled} ${multiple} ${filterable} ${clearable} ${width}>${child}</${tag}>`
},
'el-radio-group': el => {
const { tag, disabled, vModel } = attrBuilder(el)
const size = `size="${el.size}"`
let child = buildElRadioGroupChild(el)
if (child) child = `\n${child}\n` // 换行
return `<${tag} ${vModel} ${size} ${disabled}>${child}</${tag}>`
},
'el-checkbox-group': el => {
const { tag, disabled, vModel } = attrBuilder(el)
const size = `size="${el.size}"`
const min = el.min ? `:min="${el.min}"` : ''
const max = el.max ? `:max="${el.max}"` : ''
let child = buildElCheckboxGroupChild(el)
if (child) child = `\n${child}\n` // 换行
return `<${tag} ${vModel} ${min} ${max} ${size} ${disabled}>${child}</${tag}>`
},
'el-switch': el => {
const { tag, disabled, vModel } = attrBuilder(el)
const activeText = el['active-text'] ? `active-text="${el['active-text']}"` : ''
const inactiveText = el['inactive-text'] ? `inactive-text="${el['inactive-text']}"` : ''
const activeColor = el['active-color'] ? `active-color="${el['active-color']}"` : ''
const inactiveColor = el['inactive-color'] ? `inactive-color="${el['inactive-color']}"` : ''
const activeValue = el['active-value'] !== true ? `:active-value='${JSON.stringify(el['active-value'])}'` : ''
const inactiveValue = el['inactive-value'] !== false ? `:inactive-value='${JSON.stringify(el['inactive-value'])}'` : ''
return `<${tag} ${vModel} ${activeText} ${inactiveText} ${activeColor} ${inactiveColor} ${activeValue} ${inactiveValue} ${disabled}></${tag}>`
},
'el-cascader': el => {
const {
tag, disabled, vModel, clearable, placeholder, width
} = attrBuilder(el)
const options = el.options ? `:options="${el.__vModel__}Options"` : ''
const props = el.props ? `:props="${el.__vModel__}Props"` : ''
const showAllLevels = el['show-all-levels'] ? '' : ':show-all-levels="false"'
const filterable = el.filterable ? 'filterable' : ''
const separator = el.separator === '/' ? '' : `separator="${el.separator}"`
return `<${tag} ${vModel} ${options} ${props} ${width} ${showAllLevels} ${placeholder} ${separator} ${filterable} ${clearable} ${disabled}></${tag}>`
},
'el-slider': el => {
const { tag, disabled, vModel } = attrBuilder(el)
const min = el.min ? `:min='${el.min}'` : ''
const max = el.max ? `:max='${el.max}'` : ''
const step = el.step ? `:step='${el.step}'` : ''
const range = el.range ? 'range' : ''
const showStops = el['show-stops'] ? `:show-stops="${el['show-stops']}"` : ''
return `<${tag} ${min} ${max} ${step} ${vModel} ${range} ${showStops} ${disabled}></${tag}>`
},
'el-time-picker': el => {
const {
tag, disabled, vModel, clearable, placeholder, width
} = attrBuilder(el)
const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : ''
const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : ''
const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : ''
const isRange = el['is-range'] ? 'is-range' : ''
const format = el.format ? `format="${el.format}"` : ''
const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : ''
const pickerOptions = el['picker-options'] ? `:picker-options='${JSON.stringify(el['picker-options'])}'` : ''
return `<${tag} ${vModel} ${isRange} ${format} ${valueFormat} ${pickerOptions} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${disabled}></${tag}>`
},
'el-date-picker': el => {
const {
tag, disabled, vModel, clearable, placeholder, width
} = attrBuilder(el)
const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : ''
const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : ''
const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : ''
const format = el.format ? `format="${el.format}"` : ''
const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : ''
const type = el.type === 'date' ? '' : `type="${el.type}"`
const readonly = el.readonly ? 'readonly' : ''
return `<${tag} ${type} ${vModel} ${format} ${valueFormat} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${readonly} ${disabled}></${tag}>`
},
'el-rate': el => {
const { tag, disabled, vModel } = attrBuilder(el)
const max = el.max ? `:max='${el.max}'` : ''
const allowHalf = el['allow-half'] ? 'allow-half' : ''
const showText = el['show-text'] ? 'show-text' : ''
const showScore = el['show-score'] ? 'show-score' : ''
return `<${tag} ${vModel} ${max} ${allowHalf} ${showText} ${showScore} ${disabled}></${tag}>`
},
'el-color-picker': el => {
const { tag, disabled, vModel } = attrBuilder(el)
const size = `size="${el.size}"`
const showAlpha = el['show-alpha'] ? 'show-alpha' : ''
const colorFormat = el['color-format'] ? `color-format="${el['color-format']}"` : ''
return `<${tag} ${vModel} ${size} ${showAlpha} ${colorFormat} ${disabled}></${tag}>`
},
'el-upload': el => {
const { tag } = el.__config__
const disabled = el.disabled ? ':disabled=\'true\'' : ''
const action = el.action ? `:action="${el.__vModel__}Action"` : ''
const multiple = el.multiple ? 'multiple' : ''
const listType = el['list-type'] !== 'text' ? `list-type="${el['list-type']}"` : ''
const accept = el.accept ? `accept="${el.accept}"` : ''
const name = el.name !== 'file' ? `name="${el.name}"` : ''
const autoUpload = el['auto-upload'] === false ? ':auto-upload="false"' : ''
const beforeUpload = `:before-upload="${el.__vModel__}BeforeUpload"`
const fileList = `:file-list="${el.__vModel__}fileList"`
const ref = `ref="${el.__vModel__}"`
let child = buildElUploadChild(el)
if (child) child = `\n${child}\n` // 换行
return `<${tag} ${ref} ${fileList} ${action} ${autoUpload} ${multiple} ${beforeUpload} ${listType} ${accept} ${name} ${disabled}>${child}</${tag}>`
},
tinymce: el => {
const { tag, vModel, placeholder } = attrBuilder(el)
const height = el.height ? `:height="${el.height}"` : ''
const branding = el.branding ? `:branding="${el.branding}"` : ''
return `<${tag} ${vModel} ${placeholder} ${height} ${branding}></${tag}>`
}
}
function attrBuilder(el) {
return {
tag: el.__config__.tag,
vModel: `v-model="${confGlobal.formModel}.${el.__vModel__}"`,
clearable: el.clearable ? 'clearable' : '',
placeholder: el.placeholder ? `placeholder="${el.placeholder}"` : '',
width: el.style && el.style.width ? ':style="{width: \'100%\'}"' : '',
disabled: el.disabled ? ':disabled=\'true\'' : ''
}
}
// el-buttin 子级
function buildElButtonChild(scheme) {
const children = []
const slot = scheme.__slot__ || {}
if (slot.default) {
children.push(slot.default)
}
return children.join('\n')
}
// el-input 子级
function buildElInputChild(scheme) {
const children = []
const slot = scheme.__slot__
if (slot && slot.prepend) {
children.push(`<template slot="prepend">${slot.prepend}</template>`)
}
if (slot && slot.append) {
children.push(`<template slot="append">${slot.append}</template>`)
}
return children.join('\n')
}
// el-select 子级
function buildElSelectChild(scheme) {
const children = []
const slot = scheme.__slot__
if (slot && slot.options && slot.options.length) {
children.push(`<el-option v-for="(item, index) in ${scheme.__vModel__}Options" :key="index" :label="item.label" :value="item.value" :disabled="item.disabled"></el-option>`)
}
return children.join('\n')
}
// el-radio-group 子级
function buildElRadioGroupChild(scheme) {
const children = []
const slot = scheme.__slot__
const config = scheme.__config__
if (slot && slot.options && slot.options.length) {
const tag = config.optionType === 'button' ? 'el-radio-button' : 'el-radio'
const border = config.border ? 'border' : ''
children.push(`<${tag} v-for="(item, index) in ${scheme.__vModel__}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}</${tag}>`)
}
return children.join('\n')
}
// el-checkbox-group 子级
function buildElCheckboxGroupChild(scheme) {
const children = []
const slot = scheme.__slot__
const config = scheme.__config__
if (slot && slot.options && slot.options.length) {
const tag = config.optionType === 'button' ? 'el-checkbox-button' : 'el-checkbox'
const border = config.border ? 'border' : ''
children.push(`<${tag} v-for="(item, index) in ${scheme.__vModel__}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}</${tag}>`)
}
return children.join('\n')
}
// el-upload 子级
function buildElUploadChild(scheme) {
const list = []
const config = scheme.__config__
if (scheme['list-type'] === 'picture-card') list.push('<i class="el-icon-plus"></i>')
else list.push(`<el-button size="small" type="primary" icon="el-icon-upload">${config.buttonText}</el-button>`)
if (config.showTip) list.push(`<div slot="tip" class="el-upload__tip">只能上传不超过 ${config.fileSize}${config.sizeUnit}${scheme.accept}文件</div>`)
return list.join('\n')
}
/**
* 组装html代码。【入口函数】
* @param {Object} formConfig 整个表单配置
* @param {String} type 生成类型,文件或弹窗等
*/
export function makeUpHtml(formConfig, type) {
const htmlList = []
confGlobal = formConfig
// 判断布局是否都沾满了24个栅格以备后续简化代码结构
someSpanIsNot24 = formConfig.fields.some(item => item.__config__.span !== 24)
// 遍历渲染每个组件成html
formConfig.fields.forEach(el => {
htmlList.push(layouts[el.__config__.layout](el))
})
const htmlStr = htmlList.join('\n')
// 将组件代码放进form标签
let temp = buildFormTemplate(formConfig, htmlStr, type)
// dialog标签包裹代码
if (type === 'dialog') {
temp = dialogWrapper(temp)
}
confGlobal = null
return temp
}

View File

@@ -0,0 +1,271 @@
import { isArray } from 'util'
import { exportDefault, titleCase, deepClone } from '@/utils'
import ruleTrigger from './ruleTrigger'
const units = {
KB: '1024',
MB: '1024 / 1024',
GB: '1024 / 1024 / 1024'
}
let confGlobal
const inheritAttrs = {
file: '',
dialog: 'inheritAttrs: false,'
}
/**
* 组装js 【入口函数】
* @param {Object} formConfig 整个表单配置
* @param {String} type 生成类型,文件或弹窗等
*/
export function makeUpJs(formConfig, type) {
confGlobal = formConfig = deepClone(formConfig)
const dataList = []
const ruleList = []
const optionsList = []
const propsList = []
const methodList = mixinMethod(type)
const uploadVarList = []
const created = []
formConfig.fields.forEach(el => {
buildAttributes(el, dataList, ruleList, optionsList, methodList, propsList, uploadVarList, created)
})
const script = buildexport(
formConfig,
type,
dataList.join('\n'),
ruleList.join('\n'),
optionsList.join('\n'),
uploadVarList.join('\n'),
propsList.join('\n'),
methodList.join('\n'),
created.join('\n')
)
confGlobal = null
return script
}
// 构建组件属性
function buildAttributes(scheme, dataList, ruleList, optionsList, methodList, propsList, uploadVarList, created) {
const config = scheme.__config__
const slot = scheme.__slot__
buildData(scheme, dataList)
buildRules(scheme, ruleList)
// 特殊处理options属性
if (scheme.options || (slot && slot.options && slot.options.length)) {
buildOptions(scheme, optionsList)
if (config.dataType === 'dynamic') {
const model = `${scheme.__vModel__}Options`
const options = titleCase(model)
const methodName = `get${options}`
buildOptionMethod(methodName, model, methodList, scheme)
callInCreated(methodName, created)
}
}
// 处理props
if (scheme.props && scheme.props.props) {
buildProps(scheme, propsList)
}
// 处理el-upload的action
if (scheme.action && config.tag === 'el-upload') {
uploadVarList.push(
`${scheme.__vModel__}Action: '${scheme.action}',
${scheme.__vModel__}fileList: [],`
)
methodList.push(buildBeforeUpload(scheme))
// 非自动上传时,生成手动上传的函数
if (!scheme['auto-upload']) {
methodList.push(buildSubmitUpload(scheme))
}
}
// 构建子级组件属性
if (config.children) {
config.children.forEach(item => {
buildAttributes(item, dataList, ruleList, optionsList, methodList, propsList, uploadVarList, created)
})
}
}
// 在Created调用函数
function callInCreated(methodName, created) {
created.push(`this.${methodName}()`)
}
// 混入处理函数
function mixinMethod(type) {
const list = []; const
minxins = {
file: confGlobal.formBtns ? {
submitForm: `submitForm() {
this.$refs['${confGlobal.formRef}'].validate(valid => {
if(!valid) return
// TODO 提交表单
})
},`,
resetForm: `resetForm() {
this.$refs['${confGlobal.formRef}'].resetFields()
},`
} : null,
dialog: {
onOpen: 'onOpen() {},',
onClose: `onClose() {
this.$refs['${confGlobal.formRef}'].resetFields()
},`,
close: `close() {
this.$emit('update:visible', false)
},`,
handelConfirm: `handelConfirm() {
this.$refs['${confGlobal.formRef}'].validate(valid => {
if(!valid) return
this.close()
})
},`
}
}
const methods = minxins[type]
if (methods) {
Object.keys(methods).forEach(key => {
list.push(methods[key])
})
}
return list
}
// 构建data
function buildData(scheme, dataList) {
const config = scheme.__config__
if (scheme.__vModel__ === undefined) return
const defaultValue = JSON.stringify(config.defaultValue)
dataList.push(`${scheme.__vModel__}: ${defaultValue},`)
}
// 构建校验规则
function buildRules(scheme, ruleList) {
const config = scheme.__config__
if (scheme.__vModel__ === undefined) return
const rules = []
if (ruleTrigger[config.tag]) {
if (config.required) {
const type = isArray(config.defaultValue) ? 'type: \'array\',' : ''
let message = isArray(config.defaultValue) ? `请至少选择一个${config.label}` : scheme.placeholder
if (message === undefined) message = `${config.label}不能为空`
rules.push(`{ required: true, ${type} message: '${message}', trigger: '${ruleTrigger[config.tag]}' }`)
}
if (config.regList && isArray(config.regList)) {
config.regList.forEach(item => {
if (item.pattern) {
rules.push(
`{ pattern: ${eval(item.pattern)}, message: '${item.message}', trigger: '${ruleTrigger[config.tag]}' }`
)
}
})
}
ruleList.push(`${scheme.__vModel__}: [${rules.join(',')}],`)
}
}
// 构建options
function buildOptions(scheme, optionsList) {
if (scheme.__vModel__ === undefined) return
// el-cascader直接有options属性其他组件都是定义在slot中所以有两处判断
let { options } = scheme
if (!options) options = scheme.__slot__.options
if (scheme.__config__.dataType === 'dynamic') { options = [] }
const str = `${scheme.__vModel__}Options: ${JSON.stringify(options)},`
optionsList.push(str)
}
function buildProps(scheme, propsList) {
const str = `${scheme.__vModel__}Props: ${JSON.stringify(scheme.props.props)},`
propsList.push(str)
}
// el-upload的BeforeUpload
function buildBeforeUpload(scheme) {
const config = scheme.__config__
const unitNum = units[config.sizeUnit]; let rightSizeCode = ''; let acceptCode = ''; const
returnList = []
if (config.fileSize) {
rightSizeCode = `let isRightSize = file.size / ${unitNum} < ${config.fileSize}
if(!isRightSize){
this.$message.error('文件大小超过 ${config.fileSize}${config.sizeUnit}')
}`
returnList.push('isRightSize')
}
if (scheme.accept) {
acceptCode = `let isAccept = new RegExp('${scheme.accept}').test(file.type)
if(!isAccept){
this.$message.error('应该选择${scheme.accept}类型的文件')
}`
returnList.push('isAccept')
}
const str = `${scheme.__vModel__}BeforeUpload(file) {
${rightSizeCode}
${acceptCode}
return ${returnList.join('&&')}
},`
return returnList.length ? str : ''
}
// el-upload的submit
function buildSubmitUpload(scheme) {
const str = `submitUpload() {
this.$refs['${scheme.__vModel__}'].submit()
},`
return str
}
function buildOptionMethod(methodName, model, methodList, scheme) {
const config = scheme.__config__
const str = `${methodName}() {
// 注意this.$axios是通过Vue.prototype.$axios = axios挂载产生的
this.$axios({
method: '${config.method}',
url: '${config.url}'
}).then(resp => {
var { data } = resp
this.${model} = data.${config.dataPath}
})
},`
methodList.push(str)
}
// js整体拼接
function buildexport(conf, type, data, rules, selectOptions, uploadVar, props, methods, created) {
const str = `${exportDefault}{
${inheritAttrs[type]}
components: {},
props: [],
data () {
return {
${conf.formModel}: {
${data}
},
${conf.formRules}: {
${rules}
},
${uploadVar}
${selectOptions}
${props}
}
},
computed: {},
watch: {},
created () {
${created}
},
mounted () {},
methods: {
${methods}
}
}`
return str
}

View File

@@ -0,0 +1,16 @@
/**
* 用于生成表单校验,指定正则规则的触发方式。
* 未在此处声明无触发方式的组件将不生成rule
*/
export default {
'el-input': 'blur',
'el-input-number': 'blur',
'el-select': 'change',
'el-radio-group': 'change',
'el-checkbox-group': 'change',
'el-cascader': 'change',
'el-time-picker': 'change',
'el-date-picker': 'change',
'el-rate': 'change',
tinymce: 'blur'
}

View File

@@ -0,0 +1,3 @@
## 简介
富文本编辑器tinymce的一个vue版本封装。使用cdn动态脚本引入的方式加载。

View File

@@ -0,0 +1,8 @@
/* eslint-disable max-len */
export const plugins = [
'advlist anchor autolink autosave code codesample directionality emoticons fullscreen hr image imagetools insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textpattern visualblocks visualchars wordcount'
]
export const toolbar = [
'code searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote removeformat subscript superscript codesample hr bullist numlist link image charmap preview anchor pagebreak insertdatetime media table emoticons forecolor backcolor fullscreen'
]

View File

@@ -0,0 +1,38 @@
<template>
<div>
<Tinymce v-model="defaultValue" :height="300" placeholder="在这里输入文字" />
</div>
</template>
<script>
import Tinymce from '../index.vue'
export default {
components: {
Tinymce
},
props: {
},
data() {
return {
defaultValue: '<p>配置文档参阅http://tinymce.ax-z.cn</p>'
}
},
computed: {
},
watch: {
},
created() {
},
mounted() {
},
methods: {
}
}
</script>

View File

@@ -0,0 +1,3 @@
import Index from './index.vue'
export default Index

View File

@@ -0,0 +1,88 @@
<template>
<textarea :id="tinymceId" style="visibility: hidden" />
</template>
<script>
import loadTinymce from '@/utils/loadTinymce'
import { plugins, toolbar } from './config'
import { debounce } from 'throttle-debounce'
let num = 1
export default {
props: {
id: {
type: String,
default: () => {
num === 10000 && (num = 1)
return `tinymce${+new Date()}${num++}`
}
},
value: {
default: ''
}
},
data() {
return {
tinymceId: this.id
}
},
mounted() {
loadTinymce(tinymce => {
// eslint-disable-next-line global-require
require('./zh_CN')
let conf = {
selector: `#${this.tinymceId}`,
language: 'zh_CN',
menubar: 'file edit insert view format table',
plugins,
toolbar,
height: 300,
branding: false,
object_resizing: false,
end_container_on_empty_block: true,
powerpaste_word_import: 'clean',
code_dialog_height: 450,
code_dialog_width: 1000,
advlist_bullet_styles: 'square',
advlist_number_styles: 'default',
default_link_target: '_blank',
link_title: false,
nonbreaking_force_tab: true
}
conf = Object.assign(conf, this.$attrs)
conf.init_instance_callback = editor => {
if (this.value) editor.setContent(this.value)
this.vModel(editor)
}
tinymce.init(conf)
})
},
destroyed() {
this.destroyTinymce()
},
methods: {
vModel(editor) {
// 控制连续写入时setContent的触发频率
const debounceSetContent = debounce(250, editor.setContent)
this.$watch('value', (val, prevVal) => {
if (editor && val !== prevVal && val !== editor.getContent()) {
if (typeof val !== 'string') val = val.toString()
debounceSetContent.call(editor, val)
}
})
editor.on('change keyup undo redo', () => {
this.$emit('input', editor.getContent())
})
},
destroyTinymce() {
if (!window.tinymce) return
const tinymce = window.tinymce.get(this.tinymceId)
if (tinymce) {
tinymce.destroy()
}
}
}
}
</script>

View File

@@ -0,0 +1,28 @@
{
"name": "form-gen-tinymce",
"version": "1.0.0",
"description": "富文本编辑器tinymce的一个vue版本封装。使用cdn动态脚本引入的方式加载。",
"main": "lib/form-gen-tinymce.umd.js",
"directories": {
"example": "example"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/JakHuang/form-generator.git"
},
"keywords": [
"tinymce-vue"
],
"dependencies": {
"throttle-debounce": "^2.1.0"
},
"author": "jakHuang",
"license": "MIT",
"bugs": {
"url": "https://github.com/JakHuang/form-generator/issues"
},
"homepage": "https://github.com/JakHuang/form-generator/blob/dev/src/components/tinymce"
}

View File

@@ -0,0 +1,420 @@
/* eslint-disable */
tinymce.addI18n('zh_CN',{
"Redo": "\u91cd\u505a",
"Undo": "\u64a4\u9500",
"Cut": "\u526a\u5207",
"Copy": "\u590d\u5236",
"Paste": "\u7c98\u8d34",
"Select all": "\u5168\u9009",
"New document": "\u65b0\u6587\u4ef6",
"Ok": "\u786e\u5b9a",
"Cancel": "\u53d6\u6d88",
"Visual aids": "\u7f51\u683c\u7ebf",
"Bold": "\u7c97\u4f53",
"Italic": "\u659c\u4f53",
"Underline": "\u4e0b\u5212\u7ebf",
"Strikethrough": "\u5220\u9664\u7ebf",
"Superscript": "\u4e0a\u6807",
"Subscript": "\u4e0b\u6807",
"Clear formatting": "\u6e05\u9664\u683c\u5f0f",
"Align left": "\u5de6\u8fb9\u5bf9\u9f50",
"Align center": "\u4e2d\u95f4\u5bf9\u9f50",
"Align right": "\u53f3\u8fb9\u5bf9\u9f50",
"Justify": "\u4e24\u7aef\u5bf9\u9f50",
"Bullet list": "\u9879\u76ee\u7b26\u53f7",
"Numbered list": "\u7f16\u53f7\u5217\u8868",
"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb",
"Increase indent": "\u589e\u52a0\u7f29\u8fdb",
"Close": "\u5173\u95ed",
"Formats": "\u683c\u5f0f",
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u6253\u5f00\u526a\u8d34\u677f\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u7b49\u5feb\u6377\u952e\u3002",
"Headers": "\u6807\u9898",
"Header 1": "\u6807\u98981",
"Header 2": "\u6807\u98982",
"Header 3": "\u6807\u98983",
"Header 4": "\u6807\u98984",
"Header 5": "\u6807\u98985",
"Header 6": "\u6807\u98986",
"Headings": "\u6807\u9898",
"Heading 1": "\u6807\u98981",
"Heading 2": "\u6807\u98982",
"Heading 3": "\u6807\u98983",
"Heading 4": "\u6807\u98984",
"Heading 5": "\u6807\u98985",
"Heading 6": "\u6807\u98986",
"Preformatted": "\u9884\u5148\u683c\u5f0f\u5316\u7684",
"Div": "Div",
"Pre": "Pre",
"Code": "\u4ee3\u7801",
"Paragraph": "\u6bb5\u843d",
"Blockquote": "\u5f15\u6587\u533a\u5757",
"Inline": "\u6587\u672c",
"Blocks": "\u57fa\u5757",
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002",
"Fonts": "\u5b57\u4f53",
"Font Sizes": "\u5b57\u53f7",
"Class": "\u7c7b\u578b",
"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf",
"OR": "\u6216",
"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64",
"Upload": "\u4e0a\u4f20",
"Block": "\u5757",
"Align": "\u5bf9\u9f50",
"Default": "\u9ed8\u8ba4",
"Circle": "\u7a7a\u5fc3\u5706",
"Disc": "\u5b9e\u5fc3\u5706",
"Square": "\u65b9\u5757",
"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd",
"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd",
"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd",
"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd",
"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd",
"Anchor...": "\u951a\u70b9...",
"Name": "\u540d\u79f0",
"Id": "\u6807\u8bc6\u7b26",
"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002",
"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f",
"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f",
"Special character...": "\u7279\u6b8a\u5b57\u7b26...",
"Source code": "\u6e90\u4ee3\u7801",
"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b",
"Language": "\u8bed\u8a00",
"Code sample...": "\u793a\u4f8b\u4ee3\u7801...",
"Color Picker": "\u9009\u8272\u5668",
"R": "R",
"G": "G",
"B": "B",
"Left to right": "\u4ece\u5de6\u5230\u53f3",
"Right to left": "\u4ece\u53f3\u5230\u5de6",
"Emoticons...": "\u8868\u60c5\u7b26\u53f7...",
"Metadata and Document Properties": "\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027",
"Title": "\u6807\u9898",
"Keywords": "\u5173\u952e\u8bcd",
"Description": "\u63cf\u8ff0",
"Robots": "\u673a\u5668\u4eba",
"Author": "\u4f5c\u8005",
"Encoding": "\u7f16\u7801",
"Fullscreen": "\u5168\u5c4f",
"Action": "\u64cd\u4f5c",
"Shortcut": "\u5feb\u6377\u952e",
"Help": "\u5e2e\u52a9",
"Address": "\u5730\u5740",
"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f",
"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f",
"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84",
"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355",
"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):",
"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a",
"Learn more...": "\u4e86\u89e3\u66f4\u591a...",
"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}",
"Plugins": "\u63d2\u4ef6",
"Handy Shortcuts": "\u5feb\u6377\u952e",
"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf",
"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247",
"Image description": "\u56fe\u7247\u63cf\u8ff0",
"Source": "\u5730\u5740",
"Dimensions": "\u5927\u5c0f",
"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4",
"General": "\u666e\u901a",
"Advanced": "\u9ad8\u7ea7",
"Style": "\u6837\u5f0f",
"Vertical space": "\u5782\u76f4\u8fb9\u8ddd",
"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd",
"Border": "\u8fb9\u6846",
"Insert image": "\u63d2\u5165\u56fe\u7247",
"Image...": "\u56fe\u7247...",
"Image list": "\u56fe\u7247\u5217\u8868",
"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c",
"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c",
"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c",
"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c",
"Edit image": "\u7f16\u8f91\u56fe\u7247",
"Image options": "\u56fe\u7247\u9009\u9879",
"Zoom in": "\u653e\u5927",
"Zoom out": "\u7f29\u5c0f",
"Crop": "\u88c1\u526a",
"Resize": "\u8c03\u6574\u5927\u5c0f",
"Orientation": "\u65b9\u5411",
"Brightness": "\u4eae\u5ea6",
"Sharpen": "\u9510\u5316",
"Contrast": "\u5bf9\u6bd4\u5ea6",
"Color levels": "\u989c\u8272\u5c42\u6b21",
"Gamma": "\u4f3d\u9a6c\u503c",
"Invert": "\u53cd\u8f6c",
"Apply": "\u5e94\u7528",
"Back": "\u540e\u9000",
"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4",
"Date\/time": "\u65e5\u671f\/\u65f6\u95f4",
"Insert\/Edit Link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5",
"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5",
"Text to display": "\u663e\u793a\u6587\u5b57",
"Url": "\u5730\u5740",
"Open link in...": "\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...",
"Current window": "\u5f53\u524d\u7a97\u53e3",
"None": "\u65e0",
"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00",
"Remove link": "\u5220\u9664\u94fe\u63a5",
"Anchors": "\u951a\u70b9",
"Link...": "\u94fe\u63a5...",
"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5",
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f",
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f",
"Link list": "\u94fe\u63a5\u5217\u8868",
"Insert video": "\u63d2\u5165\u89c6\u9891",
"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891",
"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53",
"Alternative source": "\u955c\u50cf",
"Alternative source URL": "\u66ff\u4ee3\u6765\u6e90\u7f51\u5740",
"Media poster (Image URL)": "\u5c01\u9762(\u56fe\u7247\u5730\u5740)",
"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:",
"Embed": "\u5185\u5d4c",
"Media...": "\u591a\u5a92\u4f53...",
"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c",
"Page break": "\u5206\u9875\u7b26",
"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c",
"Preview": "\u9884\u89c8",
"Print...": "\u6253\u5370...",
"Save": "\u4fdd\u5b58",
"Find": "\u67e5\u627e",
"Replace with": "\u66ff\u6362\u4e3a",
"Replace": "\u66ff\u6362",
"Replace all": "\u5168\u90e8\u66ff\u6362",
"Previous": "\u4e0a\u4e00\u4e2a",
"Next": "\u4e0b\u4e00\u4e2a",
"Find and replace...": "\u67e5\u627e\u5e76\u66ff\u6362...",
"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.",
"Match case": "\u533a\u5206\u5927\u5c0f\u5199",
"Find whole words only": "\u5168\u5b57\u5339\u914d",
"Spell check": "\u62fc\u5199\u68c0\u67e5",
"Ignore": "\u5ffd\u7565",
"Ignore all": "\u5168\u90e8\u5ffd\u7565",
"Finish": "\u5b8c\u6210",
"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178",
"Insert table": "\u63d2\u5165\u8868\u683c",
"Table properties": "\u8868\u683c\u5c5e\u6027",
"Delete table": "\u5220\u9664\u8868\u683c",
"Cell": "\u5355\u5143\u683c",
"Row": "\u884c",
"Column": "\u5217",
"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027",
"Merge cells": "\u5408\u5e76\u5355\u5143\u683c",
"Split cell": "\u62c6\u5206\u5355\u5143\u683c",
"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165",
"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165",
"Delete row": "\u5220\u9664\u884c",
"Row properties": "\u884c\u5c5e\u6027",
"Cut row": "\u526a\u5207\u884c",
"Copy row": "\u590d\u5236\u884c",
"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9",
"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9",
"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165",
"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165",
"Delete column": "\u5220\u9664\u5217",
"Cols": "\u5217",
"Rows": "\u884c",
"Width": "\u5bbd",
"Height": "\u9ad8",
"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd",
"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd",
"Show caption": "\u663e\u793a\u6807\u9898",
"Left": "\u5de6\u5bf9\u9f50",
"Center": "\u5c45\u4e2d",
"Right": "\u53f3\u5bf9\u9f50",
"Cell type": "\u5355\u5143\u683c\u7c7b\u578b",
"Scope": "\u8303\u56f4",
"Alignment": "\u5bf9\u9f50\u65b9\u5f0f",
"H Align": "\u6c34\u5e73\u5bf9\u9f50",
"V Align": "\u5782\u76f4\u5bf9\u9f50",
"Top": "\u9876\u90e8\u5bf9\u9f50",
"Middle": "\u5782\u76f4\u5c45\u4e2d",
"Bottom": "\u5e95\u90e8\u5bf9\u9f50",
"Header cell": "\u8868\u5934\u5355\u5143\u683c",
"Row group": "\u884c\u7ec4",
"Column group": "\u5217\u7ec4",
"Row type": "\u884c\u7c7b\u578b",
"Header": "\u8868\u5934",
"Body": "\u8868\u4f53",
"Footer": "\u8868\u5c3e",
"Border color": "\u8fb9\u6846\u989c\u8272",
"Insert template...": "\u63d2\u5165\u6a21\u677f...",
"Templates": "\u6a21\u677f",
"Template": "\u6a21\u677f",
"Text color": "\u6587\u5b57\u989c\u8272",
"Background color": "\u80cc\u666f\u8272",
"Custom...": "\u81ea\u5b9a\u4e49...",
"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272",
"No color": "\u65e0",
"Remove color": "\u79fb\u9664\u989c\u8272",
"Table of Contents": "\u5185\u5bb9\u5217\u8868",
"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846",
"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26",
"Word count": "\u5b57\u6570",
"Count": "\u8ba1\u6570",
"Document": "\u6587\u6863",
"Selection": "\u9009\u62e9",
"Words": "\u5355\u8bcd",
"Words: {0}": "\u5b57\u6570\uff1a{0}",
"{0} words": "{0} \u5b57",
"File": "\u6587\u4ef6",
"Edit": "\u7f16\u8f91",
"Insert": "\u63d2\u5165",
"View": "\u89c6\u56fe",
"Format": "\u683c\u5f0f",
"Table": "\u8868\u683c",
"Tools": "\u5de5\u5177",
"Powered by {0}": "\u7531{0}\u9a71\u52a8",
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9",
"Image title": "\u56fe\u7247\u6807\u9898",
"Border width": "\u8fb9\u6846\u5bbd\u5ea6",
"Border style": "\u8fb9\u6846\u6837\u5f0f",
"Error": "\u9519\u8bef",
"Warn": "\u8b66\u544a",
"Valid": "\u6709\u6548",
"To open the popup, press Shift+Enter": "\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846",
"Rich Text Area. Press ALT-0 for help.": "\u7f16\u8f91\u533a\u3002\u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9\u3002",
"System Font": "\u7cfb\u7edf\u5b57\u4f53",
"Failed to upload image: {0}": "\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}",
"Failed to load plugin: {0} from url {1}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} \u6765\u81ea\u94fe\u63a5 {1}",
"Failed to load plugin url: {0}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25 \u94fe\u63a5: {0}",
"Failed to initialize plugin: {0}": "\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}",
"example": "\u793a\u4f8b",
"Search": "\u641c\u7d22",
"All": "\u5168\u90e8",
"Currency": "\u8d27\u5e01",
"Text": "\u6587\u5b57",
"Quotations": "\u5f15\u7528",
"Mathematical": "\u6570\u5b66",
"Extended Latin": "\u62c9\u4e01\u8bed\u6269\u5145",
"Symbols": "\u7b26\u53f7",
"Arrows": "\u7bad\u5934",
"User Defined": "\u81ea\u5b9a\u4e49",
"dollar sign": "\u7f8e\u5143\u7b26\u53f7",
"currency sign": "\u8d27\u5e01\u7b26\u53f7",
"euro-currency sign": "\u6b27\u5143\u7b26\u53f7",
"colon sign": "\u5192\u53f7",
"cruzeiro sign": "\u514b\u9c81\u8d5b\u7f57\u5e01\u7b26\u53f7",
"french franc sign": "\u6cd5\u90ce\u7b26\u53f7",
"lira sign": "\u91cc\u62c9\u7b26\u53f7",
"mill sign": "\u5bc6\u5c14\u7b26\u53f7",
"naira sign": "\u5948\u62c9\u7b26\u53f7",
"peseta sign": "\u6bd4\u585e\u5854\u7b26\u53f7",
"rupee sign": "\u5362\u6bd4\u7b26\u53f7",
"won sign": "\u97e9\u5143\u7b26\u53f7",
"new sheqel sign": "\u65b0\u8c22\u514b\u5c14\u7b26\u53f7",
"dong sign": "\u8d8a\u5357\u76fe\u7b26\u53f7",
"kip sign": "\u8001\u631d\u57fa\u666e\u7b26\u53f7",
"tugrik sign": "\u56fe\u683c\u91cc\u514b\u7b26\u53f7",
"drachma sign": "\u5fb7\u62c9\u514b\u9a6c\u7b26\u53f7",
"german penny symbol": "\u5fb7\u56fd\u4fbf\u58eb\u7b26\u53f7",
"peso sign": "\u6bd4\u7d22\u7b26\u53f7",
"guarani sign": "\u74dc\u62c9\u5c3c\u7b26\u53f7",
"austral sign": "\u6fb3\u5143\u7b26\u53f7",
"hryvnia sign": "\u683c\u91cc\u592b\u5c3c\u4e9a\u7b26\u53f7",
"cedi sign": "\u585e\u5730\u7b26\u53f7",
"livre tournois sign": "\u91cc\u5f17\u5f17\u5c14\u7b26\u53f7",
"spesmilo sign": "spesmilo\u7b26\u53f7",
"tenge sign": "\u575a\u6208\u7b26\u53f7",
"indian rupee sign": "\u5370\u5ea6\u5362\u6bd4",
"turkish lira sign": "\u571f\u8033\u5176\u91cc\u62c9",
"nordic mark sign": "\u5317\u6b27\u9a6c\u514b",
"manat sign": "\u9a6c\u7eb3\u7279\u7b26\u53f7",
"ruble sign": "\u5362\u5e03\u7b26\u53f7",
"yen character": "\u65e5\u5143\u5b57\u6837",
"yuan character": "\u4eba\u6c11\u5e01\u5143\u5b57\u6837",
"yuan character, in hong kong and taiwan": "\u5143\u5b57\u6837\uff08\u6e2f\u53f0\u5730\u533a\uff09",
"yen\/yuan character variant one": "\u5143\u5b57\u6837\uff08\u5927\u5199\uff09",
"Loading emoticons...": "\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7...",
"Could not load emoticons": "\u4e0d\u80fd\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7",
"People": "\u4eba\u7c7b",
"Animals and Nature": "\u52a8\u7269\u548c\u81ea\u7136",
"Food and Drink": "\u98df\u7269\u548c\u996e\u54c1",
"Activity": "\u6d3b\u52a8",
"Travel and Places": "\u65c5\u6e38\u548c\u5730\u70b9",
"Objects": "\u7269\u4ef6",
"Flags": "\u65d7\u5e1c",
"Characters": "\u5b57\u7b26",
"Characters (no spaces)": "\u5b57\u7b26(\u65e0\u7a7a\u683c)",
"{0} characters": "{0} \u4e2a\u5b57\u7b26",
"Error: Form submit field collision.": "\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002",
"Error: No form element found.": "\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002",
"Update": "\u66f4\u65b0",
"Color swatch": "\u989c\u8272\u6837\u672c",
"Turquoise": "\u9752\u7eff\u8272",
"Green": "\u7eff\u8272",
"Blue": "\u84dd\u8272",
"Purple": "\u7d2b\u8272",
"Navy Blue": "\u6d77\u519b\u84dd",
"Dark Turquoise": "\u6df1\u84dd\u7eff\u8272",
"Dark Green": "\u6df1\u7eff\u8272",
"Medium Blue": "\u4e2d\u84dd\u8272",
"Medium Purple": "\u4e2d\u7d2b\u8272",
"Midnight Blue": "\u6df1\u84dd\u8272",
"Yellow": "\u9ec4\u8272",
"Orange": "\u6a59\u8272",
"Red": "\u7ea2\u8272",
"Light Gray": "\u6d45\u7070\u8272",
"Gray": "\u7070\u8272",
"Dark Yellow": "\u6697\u9ec4\u8272",
"Dark Orange": "\u6df1\u6a59\u8272",
"Dark Red": "\u6df1\u7ea2\u8272",
"Medium Gray": "\u4e2d\u7070\u8272",
"Dark Gray": "\u6df1\u7070\u8272",
"Light Green": "\u6d45\u7eff\u8272",
"Light Yellow": "\u6d45\u9ec4\u8272",
"Light Red": "\u6d45\u7ea2\u8272",
"Light Purple": "\u6d45\u7d2b\u8272",
"Light Blue": "\u6d45\u84dd\u8272",
"Dark Purple": "\u6df1\u7d2b\u8272",
"Dark Blue": "\u6df1\u84dd\u8272",
"Black": "\u9ed1\u8272",
"White": "\u767d\u8272",
"Switch to or from fullscreen mode": "\u5207\u6362\u5168\u5c4f\u6a21\u5f0f",
"Open help dialog": "\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846",
"history": "\u5386\u53f2",
"styles": "\u6837\u5f0f",
"formatting": "\u683c\u5f0f\u5316",
"alignment": "\u5bf9\u9f50",
"indentation": "\u7f29\u8fdb",
"permanent pen": "\u8bb0\u53f7\u7b14",
"comments": "\u5907\u6ce8",
"Format Painter": "\u683c\u5f0f\u5237",
"Insert\/edit iframe": "\u63d2\u5165\/\u7f16\u8f91\u6846\u67b6",
"Capitalization": "\u5927\u5199",
"lowercase": "\u5c0f\u5199",
"UPPERCASE": "\u5927\u5199",
"Title Case": "\u9996\u5b57\u6bcd\u5927\u5199",
"Permanent Pen Properties": "\u6c38\u4e45\u7b14\u5c5e\u6027",
"Permanent pen properties...": "\u6c38\u4e45\u7b14\u5c5e\u6027...",
"Font": "\u5b57\u4f53",
"Size": "\u5b57\u53f7",
"More...": "\u66f4\u591a...",
"Spellcheck Language": "\u62fc\u5199\u68c0\u67e5\u8bed\u8a00",
"Select...": "\u9009\u62e9...",
"Preferences": "\u9996\u9009\u9879",
"Yes": "\u662f",
"No": "\u5426",
"Keyboard Navigation": "\u952e\u76d8\u6307\u5f15",
"Version": "\u7248\u672c",
"Anchor": "\u951a\u70b9",
"Special character": "\u7279\u6b8a\u7b26\u53f7",
"Code sample": "\u4ee3\u7801\u793a\u4f8b",
"Color": "\u989c\u8272",
"Emoticons": "\u8868\u60c5",
"Document properties": "\u6587\u6863\u5c5e\u6027",
"Image": "\u56fe\u7247",
"Insert link": "\u63d2\u5165\u94fe\u63a5",
"Target": "\u6253\u5f00\u65b9\u5f0f",
"Link": "\u94fe\u63a5",
"Poster": "\u5c01\u9762",
"Media": "\u5a92\u4f53",
"Print": "\u6253\u5370",
"Prev": "\u4e0a\u4e00\u4e2a",
"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362",
"Whole words": "\u5168\u5b57\u5339\u914d",
"Spellcheck": "\u62fc\u5199\u68c0\u67e5",
"Caption": "\u6807\u9898",
"Insert template": "\u63d2\u5165\u6a21\u677f"
});

View File

@@ -5,6 +5,7 @@ export default {
};
},
created() {
this.tableH = this?.heightNum ? this.tableHeight(this.heightNum) : this.tableHeight(260);
window.addEventListener('resize', this._setTableHeight);
},
destroyed() {
@@ -12,7 +13,8 @@ export default {
},
methods: {
_setTableHeight() {
this.tableH = this.tableHeight(260);
this.tableH = this?.heightNum ? this.tableHeight(this.heightNum) : this.tableHeight(260);
// this.tableH = this.tableHeight(260);
},
},
};

View File

@@ -32,6 +32,7 @@ const actions = {
}
// 处理 dictValue 层级
dictDataMap[dictData.dictType].push({
id: dictData.id,
value: dictData.value,
label: dictData.label,
colorType: dictData.colorType,

View File

@@ -97,6 +97,8 @@ export const DICT_TYPE = {
TABLE_NAME: 'table_name',
METHOD: 'method',
PUSH: 'push',
ENERGY_TYPE: 'energy_type',
// ============== ORDER - 订单模块 =============
ORDER_STATUS: 'order_status',
@@ -117,7 +119,7 @@ export const DICT_TYPE = {
// ============== GROUP - 班组模块 =============
WORK_SHOP: 'workshop',
// ============== GROUP - 质量模块 =============
// ============== GROUP - 质量模块 =============
MATERIAL_GRADE: 'material_grade'
}

View File

@@ -0,0 +1,28 @@
import loadScript from './loadScript'
import ELEMENT from 'element-ui'
import pluginsConfig from './pluginsConfig'
let beautifierObj
export default function loadBeautifier(cb) {
const { beautifierUrl } = pluginsConfig
if (beautifierObj) {
cb(beautifierObj)
return
}
const loading = ELEMENT.Loading.service({
fullscreen: true,
lock: true,
text: '格式化资源加载中...',
spinner: 'el-icon-loading',
background: 'rgba(255, 255, 255, 0.5)'
})
loadScript(beautifierUrl, () => {
loading.close()
// eslint-disable-next-line no-undef
beautifierObj = beautifier
cb(beautifierObj)
})
}

40
src/utils/loadMonaco.js Normal file
View File

@@ -0,0 +1,40 @@
import loadScript from './loadScript'
import ELEMENT from 'element-ui'
import pluginsConfig from './pluginsConfig'
// monaco-editor单例
let monacoEidtor
/**
* 动态加载monaco-editor cdn资源
* @param {Function} cb 回调,必填
*/
export default function loadMonaco(cb) {
if (monacoEidtor) {
cb(monacoEidtor)
return
}
const { monacoEditorUrl: vs } = pluginsConfig
// 使用element ui实现加载提示
const loading = ELEMENT.Loading.service({
fullscreen: true,
lock: true,
text: '编辑器资源初始化中...',
spinner: 'el-icon-loading',
background: 'rgba(255, 255, 255, 0.5)'
})
!window.require && (window.require = {})
!window.require.paths && (window.require.paths = {})
window.require.paths.vs = vs
loadScript(`${vs}/loader.js`, () => {
window.require(['vs/editor/editor.main'], () => {
loading.close()
monacoEidtor = window.monaco
cb(monacoEidtor)
})
})
}

60
src/utils/loadScript.js Normal file
View File

@@ -0,0 +1,60 @@
const callbacks = {}
/**
* 加载一个远程脚本
* @param {String} src 一个远程脚本
* @param {Function} callback 回调
*/
function loadScript(src, callback) {
const existingScript = document.getElementById(src)
const cb = callback || (() => {})
if (!existingScript) {
callbacks[src] = []
const $script = document.createElement('script')
$script.src = src
$script.id = src
$script.async = 1
document.body.appendChild($script)
const onEnd = 'onload' in $script ? stdOnEnd.bind($script) : ieOnEnd.bind($script)
onEnd($script)
}
callbacks[src].push(cb)
function stdOnEnd(script) {
script.onload = () => {
this.onerror = this.onload = null
callbacks[src].forEach(item => {
item(null, script)
})
delete callbacks[src]
}
script.onerror = () => {
this.onerror = this.onload = null
cb(new Error(`Failed to load ${src}`), script)
}
}
function ieOnEnd(script) {
script.onreadystatechange = () => {
if (this.readyState !== 'complete' && this.readyState !== 'loaded') return
this.onreadystatechange = null
callbacks[src].forEach(item => {
item(null, script)
})
delete callbacks[src]
}
}
}
/**
* 顺序加载一组远程脚本
* @param {Array} list 一组远程脚本
* @param {Function} cb 回调
*/
export function loadScriptQueue(list, cb) {
const first = list.shift()
list.length ? loadScript(first, () => loadScriptQueue(list, cb)) : loadScript(first, cb)
}
export default loadScript

29
src/utils/loadTinymce.js Normal file
View File

@@ -0,0 +1,29 @@
import loadScript from './loadScript'
import ELEMENT from 'element-ui'
import pluginsConfig from './pluginsConfig'
let tinymceObj
export default function loadTinymce(cb) {
const { tinymceUrl } = pluginsConfig
if (tinymceObj) {
cb(tinymceObj)
return
}
const loading = ELEMENT.Loading.service({
fullscreen: true,
lock: true,
text: '富文本资源加载中...',
spinner: 'el-icon-loading',
background: 'rgba(255, 255, 255, 0.5)'
})
loadScript(tinymceUrl, () => {
loading.close()
// eslint-disable-next-line no-undef
tinymceObj = tinymce
cb(tinymceObj)
})
}

View File

@@ -0,0 +1,13 @@
const CDN = 'https://lib.baomitu.com/' // CDN Homepage: https://cdn.baomitu.com/
const publicPath = process.env.BASE_URL
function splicingPluginUrl(PluginName, version, fileName) {
return `${CDN}${PluginName}/${version}/${fileName}`
}
export default {
beautifierUrl: splicingPluginUrl('js-beautify', '1.13.5', 'beautifier.min.js'),
// monacoEditorUrl: splicingPluginUrl('monaco-editor', '0.19.3', 'min/vs'), // 使用 monaco-editor CDN 链接
monacoEditorUrl: `${publicPath}libs/monaco-editor/vs`, // 使用 monaco-editor 本地代码
tinymceUrl: splicingPluginUrl('tinymce', '5.7.0', 'tinymce.min.js')
}

View File

@@ -2,7 +2,7 @@
* @Author: zwq
* @Date: 2021-07-19 15:18:30
* @LastEditors: zhp
* @LastEditTime: 2024-03-28 15:28:07
* @LastEditTime: 2024-04-03 10:54:53
* @Description:
-->
<template>
@@ -16,11 +16,11 @@
许昌安彩AGV原片周转看板
<h3 class="unit">单位河南汇融数字科技有限公司</h3>
<h3 class="time">{{ times }}</h3>
<el-button type="text" class="title-button" :style="{ right: 18 + 'px', top: 26 + 'px', fontSize: '32px' }"
<!-- <el-button type="text" class="title-button" :style="{ right: 18 + 'px', top: 26 + 'px', fontSize: '32px' }"
@click="changeFullScreen">
<svg-icon width="32" height="32" v-if="isFullScreen" icon-class="unFullScreenView" />
<svg-icon width="32" height="32" v-else icon-class="fullScreenView" />
</el-button>
</el-button> -->
</el-row>
<el-row class="container-main flex-col" type="flex">
<el-row :style="{ padding: '0 ' + 9 + 'px' }" :gutter="15 * beilv" type="flex" class="flex-1">
@@ -34,14 +34,16 @@
<el-col :style="{ margin: 8 + 'px' + ' 0' }" :span="12">
<base-container :beilv="1" :size="'eqStatus'" :title="'周转进度'" :title-icon="'order'" :back="'energy'">
<div class="order" style="width:100%; overflow: hidden scroll;height: 350px;">
<el-row v-for="op in orderProcessList" :key="op.id" style="margin-bottom: 1em">
<p v-if="op.outRate === 1" class="now-secondary-title" style="color:#4679FD">
<el-row v-for="op in orderProcessList" :key="op.id" style="margin-bottom: .5em">
<!-- <p v-if="op.outRate === 1" class="now-secondary-title"
style="font-size: 14px; opacity: calc(.6);color:#4679FD">
<i class="el-icon-check" />
{{ op.name }}
</p>
<p v-else class="now-secondary-title">{{ op.name }}</p>
<el-progress :stroke-width="10" define-back-color="rgba(32, 57, 96, 1)" text-color="white"
:percentage="op.outRate * 100" class="custom-progress-bar" />
</p> -->
<!-- <p class="now-secondary-title">{{ op.name }}</p> -->
<p class="now-secondary-title" style="font-size: 14px;opacity: calc(.6);">{{ op.name }}</p>
<el-progress style="width: 935px;" text-color="rgba(255, 255, 255, .6)" :stroke-width="10"
define-back-color="rgba(32, 57, 96, 1)" :percentage="op.outRate * 100" class="custom-progress-bar" />
</el-row>
</div>
</base-container>
@@ -496,7 +498,7 @@ export default {
seconds = "0" + seconds;
}
//拼接格式化当前时间
this.times = year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds;
this.times = year + "." + month + "." + day + " " + hours + ":" + minutes + ":" + seconds;
},
windowWidth(value) {
this.clientWidth = value
@@ -530,11 +532,6 @@ export default {
</script>
<style lang="scss" scoped>
.visual-container {
width: 1920px;
height: 1080px;
@@ -556,7 +553,7 @@ export default {
top: 25px;
color: rgba(255, 255, 255, 0.80);
font-size: 20px;
letter-spacing: 0px;
letter-spacing: 1px;
}
.time {
position: absolute;
@@ -564,7 +561,7 @@ export default {
top: 25px;
color: rgba(255, 255, 255, 0.80);
font-size: 20px;
letter-spacing: 0px;
letter-spacing: .72px;
}
.title-button {
color: #00fff0;
@@ -607,6 +604,14 @@ export default {
::v-deep .el-progress-bar__inner {
background-color: unset;
background-image: linear-gradient(to right, #4573fe, #47f8dc);
}
::v-deep .el-progress__text {
width: 50px;
margin-top: -70px;
margin-left: 834px;
text-align: right;
// background-color: unset;
// background-image: linear-gradient(to right, #4573fe, #47f8dc);
}
.visual-select {
position: absolute;

View File

@@ -1,7 +1,7 @@
<!--
* @Author: zhp
* @Date: 2024-01-29 16:50:26
* @LastEditTime: 2024-03-28 16:35:49
* @LastEditTime: 2024-04-25 09:03:50
* @LastEditors: zhp
* @Description:
-->
@@ -17,11 +17,11 @@
许昌安彩冷端看板
<h3 class="unit">单位河南汇融数字科技有限公司</h3>
<h3 class="time">{{ times }}</h3>
<el-button type="text" class="title-button" :style="{ right: 18 + 'px', top: 26 + 'px',fontSize:'32px'}"
<!-- <el-button type="text" class="title-button" :style="{ right: 18 + 'px', top: 26 + 'px',fontSize:'32px'}"
@click="changeFullScreen">
<svg-icon width="32" height="32" v-if="isFullScreen" icon-class="unFullScreenView" />
<svg-icon width="32" height="32" v-else icon-class="fullScreenView" />
</el-button>
</el-button> -->
</el-row>
<el-row class="container-main flex-col" type="flex">
<el-row :style="{ padding: '0 ' + 9 + 'px' }" :gutter="15" type="flex" class="flex-1">
@@ -34,19 +34,27 @@
</el-col>
<el-col :style="{ margin: 8 + 'px' + ' 0' }" :span="8">
<base-container :no-content-padding="true" :title="'产量及良率统计'" :size="'small'"
<base-container :show-time="true" :no-content-padding="true" :title="'产量及良率统计'" :size="'small'"
:title-icon="'energyMonitoring'">
<!-- <div style="width: 45%;position: absolute; top: 3em; right: 3em;">
<top-radio-group />
</div> -->
<!-- 像下面这样表格里的limit值也许可以用js动态计算出来 -->
<div v-if="coldDetData" class="myLegend">
<div class=" barCircleLegend"></div>
<div class=" barCircle"></div>
<h4 class="barText">产线良品率</h4>
<div class="barLegend"></div>
<h4 class="barCircleText">产线产量</h4>
</div>
<double-y-chart ref="productChart" :id="'doubleYChart'" :name-list="cxNameList" :data-list="cxDataList"
:height="359" :show-legend="true" />
</base-container>
</el-col>
<el-col :style="{ margin: 8 + 'px' + ' 0' }" :span="8">
<base-container :no-content-padding="true" :title="'ISRA 缺陷数据'" :size="'small'" :title-icon="'scrap'">
<base-container :show-time="true" :no-content-padding="true" :title="'ISRA 缺陷数据'" :size="'small'"
:title-icon="'scrap'">
<!-- <base-table1 :page="1" :limit="999" :show-index="false" :table-config="ISRATableProps"
:table-data="ISRAList" /> -->
<ISRAChart ref="ISRAChart" />
@@ -57,18 +65,18 @@
<el-row :style="{ padding: '0 ' + 9 + 'px' }" :gutter="10" type="flex" class="flex-1">
<el-col :style="{ margin: 8 + 'px' + ' 0' }" :span="12">
<base-container :no-content-padding="true" :height="256" :title="'废片 缺陷数据'" :size="'eqStatus'"
:title-icon="'scrap'">
<base-container :show-time="true" :no-content-padding="true" :height="256" :title="'废片 缺陷数据'"
:size="'eqStatus'" :title-icon="'scrap'">
<!-- <div style="width: 45%;position: absolute; top: 3em; right: 3em;">
<top-radio-group />
</div> -->
<!-- <el-row :gutter="9"> -->
<!-- <el-col :style="{ margin: 8 + 'px' + ' 0' }" :span="24"> -->
<pile-bar-chart style="margin-bottom: -15px" ref="firstPileChart" :height="90" />
<second-pile-bar-chart style="margin-bottom: -15px" id=" 'second' " ref="secondPileChart" :height="90" />
<third-pile-bar-chart style="margin-bottom: -15px" id=" 'third' " ref="thirdPileChart" :height="90" />
<fourth-pile-bar-chart style="margin-bottom: -15px" id=" 'fourth' " ref="fourthPileChart" :height="90" />
<fifth-pile-bar-chart style="margin-bottom: -15px" id=" 'fifth' " ref="fifthPileChart" :height="100" />
<pile-bar-chart id=" 'one' " style="margin-top: -5px;" ref="firstPileChart" :height="80" />
<second-pile-bar-chart id=" 'second' " ref="secondPileChart" :height="90" />
<third-pile-bar-chart id=" 'third' " ref="thirdPileChart" :height="90" />
<fourth-pile-bar-chart id=" 'fourth' " ref="fourthPileChart" :height="90" />
<fifth-pile-bar-chart style="margin-top: -5px;" id=" 'fifth' " ref="fifthPileChart" :height="90" />
<!-- <pile-bar-chart ref="secondPileChart"
:height="90" />
<pile-bar-chart ref="thirdPileChart"
@@ -91,7 +99,8 @@
</base-container>
</el-col>
<el-col :style="{ margin: 8 + 'px' + ' 0' }" :span="14">
<base-container :height="318 + 338 + 16" :size="'eqStatus'" :title="'设备状态监控'" :title-icon="'eqMonitoring'">
<base-container :show-time="false" :height="318 + 338 + 16" :size="'eqStatus'" :title="'设备状态监控'"
:title-icon="'eqMonitoring'">
<!-- <div style="width: 45%;position: absolute; top: 3em; right: 3em;">
<top-radio-group />
</div> -->
@@ -244,6 +253,7 @@ export default {
funWs: undefined,
SJGws: undefined,
funWsData: {},
coldDetData:[],
SJGWsData: {},
cxNameList:[],
cxDataList:[],
@@ -302,6 +312,7 @@ export default {
window.location.reload()
}, 86400000)
// this.getData()
// this.getReaiData()
},
destroyed() {
this.CutWebsocketClose()
@@ -314,85 +325,7 @@ export default {
}
},
mounted() {
let nameList = []
let nameWasteList = []
let topNameList = []
let productList = []
let wasteList = []
let yieldList = []
// let sumAreaList = []
// let yieldList = []
// this.cutTableDataList =
let coldDetData = [
{
"first": 0.8834,
"lineName": "Y61",
"product": 0.8834,
"productArea": 35069.28,
"second": 0,
'sumArea': 38400,
'wastArea': 3330.72,
"yield": 0.9133
},
{
"first": 0.847,
"lineName": "Y62",
"product": 0.847,
"productArea": 26765.46,
"second": 0,
'sumArea': 1111111,
'wastArea': 22222,
"yield": 0.9133
},
{
"first": 0.8668,
"lineName": "Y63",
"product": 0.8668,
"productArea": 26448.46,
"second": 0,
'sumArea': 1111111,
'wastArea': 22222,
"yield": 0.9133
},
{
"first": 0.9064,
"lineName": "Y64",
"product": 0.9064,
"productArea": 26667.32,
"second": 0,
'sumArea': 1111111,
'wastArea': 22222,
"yield": 0.9133
},
{
"first": 0.8838,
"lineName": "Y65",
"product": 0.8838,
"productArea": 26554.32,
"second": 0,
'sumArea': 1111111,
'wastArea': 22222,
"yield": 0.9133
}
]
coldDetData.forEach((ele, index) => {
nameList.push(ele.lineName)
topNameList.push('产线: ' + ele.lineName + ' ' + '总面积:' + ele.sumArea)
productList.push(ele.productArea)
wasteList.push(ele.wastArea)
nameWasteList.push('缺陷面积:' + ele.wastArea)
yieldList.push({
name: '良品',
yield:ele.yield
})
// sumAreaList.push(ele.sumArea)
// yieldList.push((ele.yield * 100).toFixed(3))
})
this.$refs.firstPileChart.initChart(nameList, [topNameList[0]], [nameWasteList[0]], [productList[0]], [wasteList[0]])
this.$refs.secondPileChart.initChart(nameList, [topNameList[1]], [nameWasteList[1]], [productList[1]], [wasteList[1]])
this.$refs.thirdPileChart.initChart(nameList, [topNameList[2]], [nameWasteList[2]], [productList[2]], [wasteList[2]])
this.$refs.fourthPileChart.initChart(nameList, [topNameList[3]], [nameWasteList[3]], [productList[3]], [wasteList[3]])
this.$refs.fifthPileChart.initChart(nameList, [topNameList[4]], [nameWasteList[4]], [productList[4]], [wasteList[4]])
this.getProductData()
// this.$refs.productChart.initChart(nameList, yieldList, sumAreaList)
this.getTimes()
// console.log(moment(this.logoutTime - 28800000).format('HH:mm:ss'));
@@ -414,6 +347,131 @@ export default {
}
},
methods: {
getProductData() {
let nameList = []
let nameWasteList = []
let topNameList = []
let productList = []
let wasteList = []
let yieldList = []
let sumAreaList = []
// let yieldList = []
// this.cutTableDataList =
this.coldDetData = [
{
"first": 0.8834,
"lineName": "Y61",
"product": 0.8834,
"productArea": 35069.28,
"second": 0,
'sumArea': 38400,
'wastArea': 3330.72,
"yield": 0.9133
},
{
"first": 0.847,
"lineName": "Y62",
"product": 0.847,
"productArea": 26765.46,
"second": 0,
'sumArea': 1111111,
'wastArea': 22222,
"yield": 0.9133
},
{
"first": 0.8668,
"lineName": "Y63",
"product": 0.8668,
"productArea": 26448.46,
"second": 0,
'sumArea': 1111111,
'wastArea': 22222,
"yield": 0.9133
},
{
"first": 0.9064,
"lineName": "Y64",
"product": 0.9064,
"productArea": 26667.32,
"second": 0,
'sumArea': 1111111,
'wastArea': 22222,
"yield": 0.9133
},
{
"first": 0.8838,
"lineName": "Y65",
"product": 0.8838,
"productArea": 26554.32,
"second": 0,
'sumArea': 1111111,
'wastArea': 22222,
"yield": 0.9133
}
]
this.coldDetData.forEach((ele, index) => {
nameList.push(ele.lineName)
topNameList.push('产线: ' + ele.lineName + ' ' + '总面积:' + ele.sumArea + '㎡')
productList.push(ele.productArea)
wasteList.push(ele.wastArea)
nameWasteList.push('缺陷面积:' + this.NumFormat(ele.wastArea) + '㎡')
// yieldList.push({
// name: '良品',
// yield:ele.yield
// })
sumAreaList.push(ele.sumArea)
yieldList.push((ele.yield * 100).toFixed(0))
})
this.$nextTick(() => {
this.$refs.productChart.initChart(nameList, yieldList, sumAreaList)
this.$refs.firstPileChart.initChart(nameList, [topNameList[0]], [nameWasteList[0]], [productList[0]], [wasteList[0]])
this.$refs.secondPileChart.initChart(nameList, [topNameList[1]], [nameWasteList[1]], [productList[1]], [wasteList[1]])
this.$refs.thirdPileChart.initChart(nameList, [topNameList[2]], [nameWasteList[2]], [productList[2]], [wasteList[2]])
this.$refs.fourthPileChart.initChart(nameList, [topNameList[3]], [nameWasteList[3]], [productList[3]], [wasteList[3]])
this.$refs.fifthPileChart.initChart(nameList, [topNameList[4]], [nameWasteList[4]], [productList[4]], [wasteList[4]])
})
},
// getReaiData() {
// let detData = [
// {
// name: '1',
// run: '运行',
// },
// {
// name: '2',
// run: '未运行',
// },
// {
// name: '3',
// run: '运行',
// },
// {
// name: '4',
// run: '未运行',
// },
// {
// name: '1',
// run: '运行',
// },
// ]
// let arr = []
// let index = 0
// for (let i in detData) {
// index++,
// arr.push([
// `<span style="color:rgba(255,255,255,0.5)" >${index || ''}
// </span>`,
// // `<span style="color:rgba(255,255,255,0.5)" >${i || ''}
// // </span>`,
// `<span style="color:rgba(255,255,255,0.5)">${i || ''}</span>`,
// `<span style="color:rgba(255,255,255,0.5)"><div style="${detData[i] == '运行' ? 'box-shadow: 0px 0px 2px 1px #2760FF;width:6px;height:6px;border-radius: 50%;background-color: #2760FF;float:left;margin:10px 10px 0 0 ' : 'box-shadow: 0px 0px 2px 1px #FFBD02;width:6px;height:6px;border-radius: 50%; background-color: #FFBD02;float:left;margin:10px 10px 0 0 '}"></div> ${detData[i] || ''}</span>`,
// ])
// }
// // this.$nextTick(() => {
// this.annealFunConfig.data = arr
// this.$refs['annealFunScrollBoard'].updateRows(arr)
// // })
// },
// getData() {
// let detData = [
// {
@@ -444,8 +502,10 @@ export default {
// `<span style="color:rgba(255,255,255,0.5)">${item.name || ''}</span>`,
// `<span style="color:rgba(255,255,255,0.5)"><div style="${item.run == '运行' ? 'box-shadow: 0px 0px 2px 1px #2760FF;width:6px;height:6px;border-radius: 50%;background-color: #2760FF;float:left;margin:10px 10px 0 0 ' : 'box-shadow: 0px 0px 2px 1px #FFBD02;width:6px;height:6px;border-radius: 50%; background-color: #FFBD02;float:left;margin:10px 10px 0 0 '}"></div> ${item.run || ''}</span>`,
// ])
// // this.$nextTick(() => {
// this.realEqConfig.data = this.realEqList
// this.$refs['realEqScrollBoard'].updateRows(this.realEqList)
// // })
// },
CutWebsocketClose(e) {
this.Cutws.ws.onclose = (event) => { console.log(event );}
@@ -495,7 +555,7 @@ export default {
seconds = "0" + seconds;
}
//拼接格式化当前时间
this.times = year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds;
this.times = year + "." + month + "." + day + " " + hours + ":" + minutes + ":" + seconds;
},
SJGInitWebSocket() {
let date = new Date().valueOf()
@@ -525,10 +585,9 @@ export default {
])
}
this.realEqConfig.data = this.realEqList
this.$nextTick(() => {
// this.$nextTick(() => {
this.$refs['realEqScrollBoard'].updateRows(this.realEqList)
})
// })
};
// if (typeof (WebSocket) === 'undefined') {
// alert('您的浏览器不支持WebSocket')
@@ -560,43 +619,52 @@ export default {
this.cutWsData = event?.data ? JSON.parse(event?.data) : {}
if (this.cutWsData.type === 'cutting' && this.cutWsData.name === 'table') {
let cutArr = this.cutWsData.productHourData.map((item, index) => [
`<span style="color:rgba(255,255,255,0.7)" >${index + 1 || ''}
`<span style="color:rgba(255,255,255,0.5)" >${index + 1 || ''}
</span>`,
`<span style="color:rgba(255,255,255,0.7)" >${item.lineName || ''}
`<span style="color:rgba(255,255,255,0.5)" >${item.lineName || ''}
</span>`,
`<span style="color:rgba(255,255,255,0.7)">${this.formatTime(item.time) || ''}</span>`,
`<span style="color:rgba(255,255,255,0.7)">${this.getSize(item.size) || ''}</span>`,
`<span style="color:rgba(255,255,255,0.7)">${item.productArea + '㎡' || ''}</span>`,
`<span style="color:rgba(255,255,255,0.7)">${item.wasteArea + '㎡' || ''}</span>`,
`<div style = "${(item.product * 100).toFixed(2) > 91 ? 'display:block;color:#00FFF7' : 'display:none;'}">${(item.product * 100).toFixed(2) + '%' || ''}</div>
<div style = "${(item.product * 100).toFixed(2) < 91 ? 'display:block; color:rgba(255, 209, 96, 1)' : 'display:none;'}">${(item.product * 100).toFixed(2) + '%' || ''}</div>`
`<span style="color:rgba(255,255,255,0.5)">${this.formatTime(item.time) || ''}</span>`,
`<span style="color:rgba(255,255,255,0.5)">${this.getSize(item.size) || ''}</span>`,
`<span style="color:rgba(255,255,255,0.5)">${this.NumFormat(item.productArea) + '㎡' || ''}</span>`,
`<span style="color:rgba(255,255,255,0.5)">${this.NumFormat(item.wasteArea) + '㎡' || ''}</span>`,
`<div style = "${(item.product * 100).toFixed(0) >= 91 ? 'display:block;color:#00FFF7' : 'display:none;'}">${(item.product * 100).toFixed(0) + '%' || ''}</div>
<div style = "${(item.product * 100).toFixed(0) <= 91 ? 'display:block; color:rgba(255, 209, 96, 1)' : 'display:none;'}">${(item.product * 100).toFixed(2) + '%' || ''}</div>`
])
this.cutConfig.data = cutArr
this.$refs['cutScrollBoard'].updateRows(cutArr)
// this.$nextTick(() => {
this.$refs['cutScrollBoard'].updateRows(cutArr)
// })
// this.cutConfig.data = cutArr
// this.$refs['cutScrollBoard'].updateRows(cutArr)
} else if (this.cutWsData.type === 'cutting' && this.cutWsData.name === 'chart' && this.cutWsData.dateType === 'day') {
let nameList = []
let nameWasteList = []
let topNameList = []
let productList = []
let wasteList = []
let sumAreaList = []
let yieldList = []
// this.cutTableDataList =
this.cutWsData.coldDetData.forEach((ele, index) => {
nameList.push(ele.lineName)
topNameList.push('产线: ' + ele.lineName + ' ' + '总面积:' + ele.sumArea)
productList.push(ele.productArea)
wasteList.push(ele.wastArea)
nameWasteList.push('缺陷面积:' + ele.wastArea)
sumAreaList.push(ele.sumArea)
yieldList.push(parseFloat((ele.yield * 100).toFixed(3)))
})
this.$refs.firstPileChart.initChart(nameList, [topNameList[0]], [nameWasteList[0]], [productList[0]], [wasteList[0]])
this.$refs.secondPileChart.initChart(nameList, [topNameList[1]], [nameWasteList[1]], [productList[1]], [wasteList[1]])
this.$refs.thirdPileChart.initChart(nameList, [topNameList[0]], [nameWasteList[0]], [productList[0]], [wasteList[0]])
this.$refs.fourthPileChart.initChart(nameList, [topNameList[0]], [nameWasteList[0]], [productList[0]], [wasteList[0]])
this.$refs.fifthPileChart.initChart(nameList, [topNameList[0]], [nameWasteList[0]], [productList[0]], [wasteList[0]])
this.$refs.productChart.initChart(nameList, yieldList, sumAreaList)
if (this.cutWsData.coldDetData.length !== 0) {
let nameList = []
let nameWasteList = []
let topNameList = []
let productList = []
let wasteList = []
let sumAreaList = []
let yieldList = []
this.coldDetData = this.cutWsData.coldDetData
// this.cutTableDataList =
this.cutWsData.coldDetData.forEach((ele, index) => {
nameList.push(ele.lineName)
topNameList.push('产线: ' + ele.lineName + ' ' + '总面积:' + ele.sumArea + '㎡')
productList.push(ele.productArea)
wasteList.push(ele.wastArea)
nameWasteList.push('缺陷面积:' + this.NumFormat(ele.wastArea) + '㎡')
sumAreaList.push(ele.sumArea)
yieldList.push(parseFloat((ele.yield * 100).toFixed(2)))
})
this.$nextTick(() => {
this.$refs.firstPileChart.initChart(nameList, [topNameList[0]], [nameWasteList[0]], [productList[0]], [wasteList[0]])
this.$refs.secondPileChart.initChart(nameList, [topNameList[1]], [nameWasteList[1]], [productList[1]], [wasteList[1]])
this.$refs.thirdPileChart.initChart(nameList, [topNameList[2]], [nameWasteList[2]], [productList[2]], [wasteList[2]])
this.$refs.fourthPileChart.initChart(nameList, [topNameList[3]], [nameWasteList[3]], [productList[3]], [wasteList[3]])
this.$refs.fifthPileChart.initChart(nameList, [topNameList[4]], [nameWasteList[4]], [productList[4]], [wasteList[4]])
this.$refs.productChart.initChart(nameList, yieldList, sumAreaList)
})
}
}
};
// if (typeof (WebSocket) === 'undefined') {
@@ -632,17 +700,18 @@ export default {
for (let i in this.funWsData.data.annealFanInfo) {
index++,
arr.push([
`
<span style="color:rgba(255,255,255,0.5)" >${index || ''}
`<span style="color:rgba(255,255,255,0.5)" >${index || ''}
</span>`,
`<span style="color:rgba(255,255,255,0.5)" >${i || ''}
</span>`,
`<span style="color:rgba(255,255,255,0.5)">${item.name || ''}</span>`,
`<span style="color:rgba(255,255,255,0.5)"><div style="${item.run == '运行' ? 'box-shadow: 0px 0px 2px 1px #2760FF;width:6px;height:6px;border-radius: 50%;background-color: #2760FF;float:left;margin:10px 10px 0 0 ' : 'box-shadow: 0px 0px 2px 1px #FFBD02;width:6px;height:6px;border-radius: 50%; background-color: #FFBD02;float:left;margin:10px 10px 0 0 '}"></div> ${item.run || ''}</span>`,
// `<span style="color:rgba(255,255,255,0.5)" >${i || ''}
// </span>`,
`<span style="color:rgba(255,255,255,0.5)">${i || ''}</span>`,
`<span style="color:rgba(255,255,255,0.5)"><div style="${this.funWsData.data.annealFanInfo[i] == '运行' ? 'box-shadow: 0px 0px 2px 1px #2760FF;width:6px;height:6px;border-radius: 50%;background-color: #2760FF;float:left;margin:10px 10px 0 0 ' : 'box-shadow: 0px 0px 2px 1px #FFBD02;width:6px;height:6px;border-radius: 50%; background-color: #FFBD02;float:left;margin:10px 10px 0 0 '}"></div> ${this.funWsData.data.annealFanInfo[i] || ''}</span>`,
])
}
this.annealFunConfig.data = arr
this.$refs['annealFunScrollBoard'].updateRows(arr)
// this.$nextTick(() => {
this.$refs['annealFunScrollBoard'].updateRows(arr)
// })
}
if (this.funWsData.type === 'FanInfo') {
let arr = []
@@ -650,14 +719,16 @@ export default {
for (let i in this.funWsData.data.fanInfo) {
index++,
arr.push([
`<span style="color:rgba(255,255,255,0.5)" >${index || ''}</span>`,
`<span style="color:rgba(255,255,255,0.5)" >${i || ''}</span>`,
`<span style="color:rgba(255,255,255,0.5)">${item.name || ''}</span>`,
`<span style="color:rgba(255,255,255,0.5)"><div style="${item.run == '运行' ? 'box-shadow: 0px 0px 2px 1px #2760FF;width:6px;height:6px;border-radius: 50%;background-color: #2760FF;float:left;margin:10px 10px 0 0 ' : 'box-shadow: 0px 0px 2px 1px #FFBD02;width:6px;height:6px;border-radius: 50%; background-color: #FFBD02;float:left;margin:10px 10px 0 0 '}"></div> ${item.run || ''}</span>`,
`<span style="color:rgba(255,255,255,0.5)" >${index || ''}
</span>`,
`<span style="color:rgba(255,255,255,0.5)">${i || ''}</span>`,
`<span style="color:rgba(255,255,255,0.5)"><div style="${this.funWsData.data.fanInfo[i] == '运行' ? 'box-shadow: 0px 0px 2px 1px #2760FF;width:6px;height:6px;border-radius: 50%;background-color: #2760FF;float:left;margin:10px 10px 0 0 ' : 'box-shadow: 0px 0px 2px 1px #FFBD02;width:6px;height:6px;border-radius: 50%; background-color: #FFBD02;float:left;margin:10px 10px 0 0 '}"></div> ${this.funWsData.data.fanInfo[i] || ''}</span>`,
])
}
this.funConfig.data = arr
this.$refs['funScrollBoard'].updateRows(arr)
// this.$nextTick(() => {
this.$refs['funScrollBoard'].updateRows(arr)
// })
}
};
// if (typeof (WebSocket) === 'undefined') {
@@ -678,6 +749,25 @@ export default {
// this.funWebsocket.onclose = this.funWebsocketClose
// }
},
NumFormat(value) {
if (!value) return '0.00'
value = value.toFixed(2)
var intPart = Math.trunc(value) // 获取整数部分
// var intPartFormat = intPart.toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,') // 将整数部分逢三一断
var floatPart = '.00' // 预定义小数部分
var value2Array = value.split('.')
// =2表示数据有小数位
if (value2Array.length === 2) {
floatPart = value2Array[1].toString() // 拿到小数部分
if (floatPart.length === 1) {
return intPart + '.' + floatPart + '0'
} else {
return intPart + '.' + floatPart
}
} else {
return intPart + floatPart
}
},
// funWebsocketOnOpen() {
// console.log('socket连接成功')
// this.SJGWebsocket.onmessage()
@@ -772,7 +862,47 @@ export default {
</script>
<style lang="scss" scoped>
.myLegend{
position: absolute;
top: -20px;
right: 20px;
font-size: 12px;
color: rgba(255,255,255,.6);
.barLegend{
// float: left;
background: linear-gradient(#9DD5FF, #1295FF);
width: 10px;
height: 10px;
display: inline-block;
margin-right: 5px;
border-radius: 30%;
}
.barText{
// float: right;
display: inline-block;
margin-right: 10px;
}
.barCircleLegend{
width: 15px;
height: 1px;
background-color: rgba(255, 209, 96, 1);
position: absolute;
left: -4.1715px;
top: 21.7px;
}
.barCircle{
width: 6px;
height: 6px;
border-radius: 50%;
background-color: rgba(255, 209, 96, 1);
display: inline-block;
margin-right: 10px;
margin-bottom: 1.7px;
}
.barCircleText{
display: inline-block;
}
}
.visual-container {
width: 1920px;
height: 1080px;
@@ -794,7 +924,7 @@ export default {
top: 25px;
color: rgba(255, 255, 255, 0.80);
font-size: 20px;
letter-spacing: 0px;
letter-spacing: 1px;
}
.time {
@@ -803,7 +933,7 @@ export default {
color: rgba(255, 255, 255, 0.80);
top: 25px;
font-size: 20px;
letter-spacing: 0px;
letter-spacing: .72px;
}
.title-button {

View File

@@ -1,7 +1,7 @@
<!--
* @Author: zhp
* @Date: 2024-01-29 13:45:56
* @LastEditTime: 2024-03-13 08:58:01
* @LastEditTime: 2024-04-24 15:48:32
* @LastEditors: zhp
* @Description:
-->
@@ -13,6 +13,7 @@
</template>
<script>
import { position } from '@antv/x6-common/lib/dom/position';
import * as echarts from 'echarts';
// import resize from './../mixins/resize'
// import NotMsg from './../components/NotMsg'
@@ -26,7 +27,7 @@ export default {
return {
chart: null,
// notMsg:true,
colors:['#2760ff', '#518eec', '#0ee8e4', '#ddb523'],
colors: ['#2760ff', '#518eec', '#49FBD6', '#ddb523'],
chartData: []
};
},
@@ -45,8 +46,49 @@ export default {
this.$emit('emitFun')
}
}
},
methods: {
},
mounted() {
this.chartData = [
{
name: '0904褶皱/严重',
num: 1112,
yield: 0.97,
},
{
name: '0904褶皱/严重',
num: 1112,
yield: 0.97,
},
{
name: '0904褶皱/严重',
num: 1112,
yield: 0.97,
},
{
name: '0904褶皱/严重',
num: 1112,
yield: 0.97,
}
]
this.updateChart()
},
methods: {
getEqualNewlineString(params, length) {
let text = ''
let count = Math.ceil(params.length / length) // 向上取整数
// 一行展示length个
if (count > 1) {
for (let z = 1; z <= count; z++) {
text += params.substr((z - 1) * length, length)
if (z < count) {
text += '\n'
}
}
} else {
text += params.substr(0, length)
}
return text
},
updateChart() {
console.log('update')
let num = 0
@@ -71,7 +113,7 @@ export default {
color:this.colors,
title:{
text: num,
subtext: '总数',
subtext: '总数/个',
top: '32%',
left: '49%',
textAlign: 'center',
@@ -83,45 +125,77 @@ export default {
fontSize: 20,
color: '#fff00',
},
},
legend: {
bottom: '10%',
left: 'center',
itemWidth: 12,
itemHeight:12,
icon: 'rect',
textStyle: {
color: '#fff'
},
data:this.chartData && this.chartData.length > 0 && this.chartData.map((item,index)=>({
name:item.name,
itemStyle:{
color: this.colors[index%4]
}
}))
},
},
grid: {
left: '1%',
right: '1%',
bottom: '0',
containLabel: true
},
// legend: {
// bottom: '10%',
// left: 'center',
// itemWidth: 12,
// itemHeight:12,
// icon: 'roundRect',
// textStyle: {
// color: '#fff'
// },
// data:this.chartData && this.chartData.length > 0 && this.chartData.map((item,index)=>({
// name:item.name,
// itemStyle:{
// color: this.colors[index%4]
// }
// }))
// },
series:[{
name: 'ISRA缺陷检测',
type: 'pie',
type: 'pie',
// position:outerHeight,
center: ['50%', '40%'],
radius: ['45%', '70%'],
avoidLabelOverlap: true,
label: {
show: false
label: {
show: true,
normal: {
alignTo: 'labelLine',
margin: 10,
edgeDistance: 10,
lineHeight: 16,
// 各分区的提示内容
// params: 即下面传入的data数组,通过自定义函数,展示你想要的内容和格式
formatter: function (params) {
console.log(params);
return ;
},
formatter: (params) => {
//调用自定义显示格式
return this.getEqualNewlineString(params.value + " | " + params.percent.toFixed(0) + "%");
},
textStyle: { // 提示文字的样式
// color: '#595959',
fontSize: 16
}
}
},
labelLine: {
show: true,
show: true,
length: 25,
length2: 10,
},
data: this.chartData && this.chartData.length > 0 && this.chartData.map((item, index) => ({
name:item.name,
value: item.num,
value: item.num,
label: {
color: this.colors[index % 4]
},
itemStyle:{
color:{
type: 'linear',
x: 1,
y: 1,
x: 0,
y: 0,
x2: 0,
y2: 0,
y2: 1,
global: false,
colorStops:[
{offset: 0,color: this.colors[index%4]},
@@ -145,15 +219,19 @@ export default {
.isra-chart {
width: 100%;
height: 100%;
position: absolute;
top: 7%;
}
.isra-chart-tooltip {
background: #0a2b4f77 !important;
border: none !important;
backdrop-filter: blur(12px);
}
.isra-chart-tooltip * {
color: #fff !important;
}
</style>
<style>
.isra-chart-tooltip {
background: #0a2b4f77 !important;
border: none !important;
backdrop-filter: blur(12px);
}
.isra-chart-tooltip * {
color: #fff !important;
}
</style>

View File

@@ -2,7 +2,7 @@
* @Author: zwq
* @Date: 2022-01-21 14:43:06
* @LastEditors: zhp
* @LastEditTime: 2024-03-28 16:45:24
* @LastEditTime: 2024-04-03 16:33:24
* @Description:
-->
<template>
@@ -85,7 +85,6 @@ export default {
defaultConfig: {
// 默认的legend配置
legend: {
orient: 'vertical',
left: '75%',
bottom: 0,
itemHeight: 10,
@@ -158,6 +157,9 @@ export default {
methods: {
initChart() {
this.chart = echarts.init(document.getElementById(this.id))
this.$nextTick(() => {
this.chart.resize();
});
this.chart.setOption({
title: this.showCenterTitle
? {
@@ -194,7 +196,7 @@ export default {
// 默认配置
...this.defaultConfig.legend,
// 外部传入配置
...this.legendConfig
// ...this.legendConfig
},
color: this.barColor,
series: [

View File

@@ -2,7 +2,7 @@
* @Author: gtz
* @Date: 2022-01-19 15:58:17
* @LastEditors: zhp
* @LastEditTime: 2024-03-27 10:26:35
* @LastEditTime: 2024-04-22 09:41:21
* @Description: file content
* @FilePath: \mt-bus-fe\src\views\OperationalOverview\components\baseContainer\index.vue
-->
@@ -30,7 +30,7 @@
<!-- <span v-if="showTime" style="font-size: 20px;color:#52FFF8;margin-left: 10px;margin-top: 2px;">
{{ time2 +'-'+ time }}
</span> -->
<span style="font-size: 20px;color:#52FFF8;margin-left: 10px;margin-top: 2px;">
<span v-if="showTime" style="font-size: 20px;color:#52FFF8;margin-left: 10px;margin-top: 2px;">
{{ startTime + '-' + endTime }}
</span>
</div>
@@ -56,6 +56,10 @@ export default {
type: Boolean,
default: true
},
showTime: {
type: Boolean,
default: true
},
noPadding: {
type: Boolean,
default: false
@@ -164,7 +168,7 @@ export default {
width: 100%;
// background-color: rgba($color: #061027, $alpha: 0.15);
position: relative;
opacity: calc(.8);
// opacity: calc(.8);
// border: 2px solid;
// background: url('../../../../assets/img/energy.png') no-repeat;
// background-size: 100% 100%;
@@ -274,6 +278,8 @@ export default {
width: 100%;
color: #ffffff;
font-size: 24px;
font-weight: normal;
letter-spacing: .8px;
padding: 0.67em 0.67em 0.3em 0.67em;
display: flex;
}

View File

@@ -2,13 +2,13 @@
<!--
* @Author: zhp
* @Date: 2023-09-21 09:06:28
* @LastEditTime: 2024-03-25 18:34:58
* @LastEditTime: 2024-04-23 15:34:56
* @LastEditors: zhp
* @Description:
-->
<template>
<div>
<div :id="id" class="productChart" :style="{ height: '390px', width: width }" />
<div :id="id" class="coldProductChart" :style="{ height: '390px', width: width }" />
</div>
</template>
@@ -71,9 +71,9 @@ export default {
mounted() {
console.log('mounted')
console.log('borderRadius: ', this.borderRadius)
// this.$nextTick(() => {
// this.initChart()
// })
this.$el.addEventListener('resize', () => {
console.log('resziing.....');
});
},
beforeDestroy() {
if (!this.chart) {
@@ -83,6 +83,9 @@ export default {
this.chart = null
},
methods: {
// getNumLength(num) {
// return num.toString().length;
// },
initChart(nameList, passRateList, outputNumList) {
console.log(nameList, passRateList)
let series= [
@@ -97,11 +100,12 @@ export default {
{ offset: 0.3, color: '#1295FF' }
]),
label: {
show: true, //开启显示
show: false, //开启显示
position: 'top', //在上方显示
textStyle: { //数值样式
color: '#ced1d5',
fontSize: 12
color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色
fontSize: 12,
fontWight: 'bolder'
}
},
}
@@ -114,6 +118,7 @@ export default {
name: '产线良品率',
symbol: 'circle', //变为实心圆
type: 'line',
// symbolSize: 7,
yAxisIndex: 0,
areaStyle: {
opacity: 0.8,
@@ -141,9 +146,21 @@ export default {
]
// const colors = ['#5470C6', '#91CC75', '#EE6666']
this.chart = echarts.init(document.getElementById(this.id))
let isFinished = false //标记 isFinished
this.chart.on('finished', _ => {
if (!isFinished) {
console.log('我只执行一次')
isFinished = true
// this.isLoading = false //关闭loading
this.chart.resize() //重新渲染charts大小
}
console.log(113, 'finished')
})
this.chart.setOption({
// color: colors,
tooltip: {
trigger: 'item',
className: "isra-chart-tooltip",
trigger: 'axis',
axisPointer: {
type: 'cross'
@@ -151,38 +168,50 @@ export default {
},
grid: {
left: "3%",
right: "5%",
right: "10%",
bottom: "3%",
containLabel: true
},
legend: {
itemWidth: 10,
itemHeight: 10,
top: '20',
// right: '20px',
data: ['产线产量', '产线良品率'],
textStyle: {
fontSize: 12 * this.beilv,
color: '#ced1d5'
}
},
// legend: {
// itemWidth: 10,
// itemHeight: 10,
// top: '5',
// right: '20px',
// data: [
// // { icon: 'rect', name: '直接访问' },
// { icon: 'roundRect', name: '产线产量' },
// // {
// // icon: 'circle', name: '产线良品率',
// // itemWidth: 7,
// // itemHeight: 7,
// // },
// ],
// textStyle: {
// fontSize: 12 * this.beilv,
// color: '#ced1d5'
// }
// },
xAxis: {
axisTick: {
show: false
},
type: 'category',
axisLine: {
lineStyle: {
type: 'solid',
color: '#213259', // 左边线的颜色
color: '#25528f', // 左边线的颜色
width: '1' // 坐标线的宽度
}
},
axisLabel: {
textStyle: {
align: 'center',
color: 'rgba(255,255,255,0.5)' // 坐标值得具体的颜色
}
},
splitLine: {
lineStyle: {
color: '#213259'
color: '#25528f'
}
},
data: nameList
@@ -192,18 +221,21 @@ export default {
// },
yAxis: [
{
min: function() { // 取最小值向下取整为最小刻度
min: function () { // 取最小值向下取整为最小刻度
return 0
},
max: function(value) { // 取最大值向上取整为最大刻度
return Math.ceil(value.max)
max: function (value) { // 取最大值向上取整为最大刻度
},
scale: true,
type: 'value',
name: '良品率/%',
max: 100,//最大值
min: 0,//最小值
interval: 20,//间隔
nameTextStyle: {// y轴上方单位的颜色
color: '#fff',
color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色
align: "left",
padding: [0, 0, 0, 8]
},
position: 'right',
alignTicks: true,
@@ -211,19 +243,20 @@ export default {
show: true,
lineStyle: {
type: 'solid',
color: '#213259', // 左边线的颜色
color: '#25528f', // 左边线的颜色
width: '1' // 坐标线的宽度
}
},
axisLabel: {
textStyle: {
color: '#ced1d5', // 坐标值得具体的颜色
formatter: '{value}%'
color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色
formatter: '{value}%',
align:'left',
}
},
splitLine: {
lineStyle: {
color: '#213259'
color: '#25528f'
}
}
// type: 'value'
@@ -235,19 +268,25 @@ export default {
// },
},
{
min: function() { // 取最小值向下取整为最小刻度
min: function () { // 取最小值向下取整为最小刻度
return 0
},
max: function(value) { // 取最大值向上取整为最大刻度
return Math.ceil(value.max)
max: function (value) { // 取最大值向上取整为最大刻度
// console.log(value.max.toString().length)
// String(value.max)[0]
// for
// return String(value.max)[0] +
},
minInterval: 5,//间隔
scale: true,
type: 'value',
name: '产量/㎡', // y轴上方的单位
nameTextStyle: {
color: "#fff",
color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色
// fontSize: 10,
align: "right",
padding:[0,4,0,0]
},
position: 'left',
alignTicks: true,
@@ -255,19 +294,21 @@ export default {
show: true,
lineStyle: {
type: 'solid',
color: '#213259', // 左边线的颜色
color: '#25528f', // 左边线的颜色
width: '1' // 坐标线的宽度
}
},
axisLabel: {
// padding: [0, 20, 0, 0],
textStyle: {
margin: 60,
color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色
formatter: '{value} 片'
}
},
splitLine: {
lineStyle: {
color: '#213259'
color: '#25528f'
}
}
// type: 'value'
@@ -286,7 +327,16 @@ export default {
}
</script>
<style>
.productChart{
.coldProductChart{
top: -10px;
}
.isra-chart-tooltip {
background: #0a2b4f77 !important;
border: none !important;
backdrop-filter: blur(12px);
}
.isra-chart-tooltip * {
color: #fff !important;
}
</style>

View File

@@ -1,7 +1,7 @@
<!--
* @Author: zhp
* @Date: 2023-09-21 09:06:28
* @LastEditTime: 2024-03-28 16:31:20
* @LastEditTime: 2024-04-23 15:36:35
* @LastEditors: zhp
* @Description:
-->
@@ -105,8 +105,9 @@ export default {
show: true, //开启显示
position: 'top', //在上方显示
textStyle: { //数值样式
color: '#ced1d5',
fontSize: 12
color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色
fontSize: 12,
fontWight:'bolder'
}
},
}
@@ -142,7 +143,7 @@ export default {
}
},
// data: passRateList
data: []
data: passRateList
}
]
// const colors = ['#5470C6', '#91CC75', '#EE6666']
@@ -161,24 +162,30 @@ export default {
this.chart.setOption({
// color: colors,
tooltip: {
trigger: 'item',
className: "isra-chart-tooltip",
trigger: 'axis',
axisPointer: {
type: 'cross'
}
},
grid: { top: 90, right: 60, bottom: 20, left: 20, containLabel: true },
legend: {
itemWidth: 10,
itemHeight: 10,
top: '0%',
right: '20px',
data: ['产线产量', '产线良品率'],
textStyle: {
fontSize: 12 * this.beilv,
color: '#ced1d5'
}
},
grid: { top: 70, right: 20, bottom: 10, left: 10, containLabel: true },
// legend: {
// itemWidth: 10,
// itemHeight: 10,
// top: '2%',
// right: '30px',
// data: ['产线良品率', '产线产量'],
// textStyle: {
// fontSize: 12 * this.beilv,
// color: '#ced1d5',
// fontWight: 'bolder'
// }
// },
xAxis: {
axisTick: {
show: false
},
type: 'category',
axisLine: {
lineStyle: {
@@ -187,8 +194,11 @@ export default {
width: '1' // 坐标线的宽度
}
},
textStyle: {
fontWight: 'bolder'
},
axisLabel: {
color: "#fff",
color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色
fontSize: 12,
// formatter: '{value}'
// textStyle: {
@@ -207,18 +217,21 @@ export default {
// },
yAxis: [
{
// min: function() { // 取最小值向下取整为最小刻度
// return 0
// },
// max: function(value) { // 取最大值向上取整为最大刻度
// return Math.ceil(value.max)
// },
min: function () { // 取最小值向下取整为最小刻度
return 0
},
max: function (value) { // 取最大值向上取整为最大刻度
},
scale: true,
type: 'value',
name: '良品率/%',
max: 100,//最大值
min: 0,//最小值
interval: 20,//间隔
nameTextStyle: {// y轴上方单位的颜色
color: '#fff',
color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色
align: "left",
padding: [0, 0, 0, 2]
},
position: 'right',
alignTicks: true,
@@ -231,7 +244,7 @@ export default {
}
},
axisLabel: {
color: "#fff",
color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色
fontSize: 12,
// formatter: '{value}'
formatter: '{value}%'
@@ -251,18 +264,24 @@ export default {
// },
},
{
// min: function() { // 取最小值向下取整为最小刻度
// return 0
// },
// max: function(value) { // 取最大值向上取整为最大刻度
// return Math.ceil(value.max)
// },
min: function () { // 取最小值向下取整为最小刻度
return 0
},
max: function (value) { // 取最大值向上取整为最大刻度
// console.log(value.max.toString().length)
// String(value.max)[0]
// for
// return String(value.max)[0] +
},
minInterval: 5,//间隔
scale: true,
type: 'value',
name: '产量/片', // y轴上方的单位
nameTextStyle: {
color: "#fff",
color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色
// fontSize: 10,
padding: [0, 4, 0, 0],
align: "right",
},
// position: 'left',
@@ -278,7 +297,7 @@ export default {
axisLabel: {
// textStyle: {
// color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色
color: "#fff",
color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色
// show: true,
lineStyle: {
color: "#25528f",
@@ -314,4 +333,13 @@ export default {
width: 100%;
top: -30px;
}
.isra-chart-tooltip {
background: #0a2b4f77 !important;
border: none !important;
backdrop-filter: blur(12px);
}
.isra-chart-tooltip * {
color: #fff !important;
}
</style>

View File

@@ -111,8 +111,9 @@ export default {
show: true, //开启显示
position: 'top', //在上方显示
textStyle: { //数值样式
color: '#ced1d5',
fontSize: 12
color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色
fontSize: 12,
fontWeight: 'normal'
}
},
}
@@ -127,12 +128,14 @@ export default {
this.chart.setOption({
tooltip: {
trigger: 'axis',
trigger: 'item',
className: "isra-chart-tooltip",
axisPointer: {
// 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
}
},
grid: { top: 90, right: 60, bottom: 20, left: 30, containLabel: true },
grid: { top: 70, right: 40, bottom: 10, left: 40, containLabel: true },
// legend: {
// itemWidth: 10,
// itemHeight: 10,
@@ -144,6 +147,9 @@ export default {
// }
// },
xAxis: {
axisTick: {
show: false
},
type: 'category',
axisLine: {
lineStyle: {
@@ -152,8 +158,11 @@ export default {
width: '1' // 坐标线的宽度
}
},
textStyle: {
fontWeight: 'bolder'
},
axisLabel: {
color: "#fff",
color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色
fontSize: 12,
// formatter: '{value}'
},
@@ -167,13 +176,13 @@ export default {
yAxis: {
name: '单位kwh',
nameTextStyle: {
color: '#fff',
fontSize: 10,
color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色
fontSize: 12,
align: 'right',
},
type: 'value',
axisLabel: {
color: "#fff",
color: 'rgba(255,255,255,0.5)', // 坐标值得具体的颜色
fontSize: 12,
// formatter: '{value}/kwh'
},
@@ -219,4 +228,13 @@ export default {
width: 100%;
top: -30px;
}
.isra-chart-tooltip {
background: #0a2b4f77 !important;
border: none !important;
backdrop-filter: blur(12px);
}
.isra-chart-tooltip * {
color: #fff !important;
}
</style>

View File

@@ -1,13 +1,13 @@
<!--
* @Author: zhp
* @Date: 2023-12-27 13:54:52
* @LastEditTime: 2024-03-28 16:30:14
* @LastEditTime: 2024-04-19 15:43:08
* @LastEditors: zhp
* @Description:
-->
<template>
<div>
<div :id="id" class="productChart" :style="{ height: height + 'px', width: width }" />
<div :id="id" :style="{ height:'75px', width: width }" />
</div>
</template>
@@ -71,7 +71,10 @@ export default {
}
},
mounted() {
console.log('mounted')
// console.log('mounted')
window.addEventListener('resize', () => {
this.resize()
})
// console.log('borderRadius: ', this.borderRadius)
// console.log('33333', this.dataList)
// let arr = []
@@ -91,12 +94,21 @@ export default {
this.chart = null
},
methods: {
resize() {
this.chart.resize({
width: 'auto',
height: 90
});;
},
initChart(nameList, topNameList, nameWasteList, passRateList, wasteList) {
let rawData = []
let colors = ['#0fdedb', '#2359ec']
if (topNameList.length === 0 && nameWasteList.length === 0 && passRateList === 0 && wasteList === 0) {
return
} else {
let rawData = []
let colors = ['#0fdedb', '#2359ec']
rawData.push(passRateList, wasteList)
const totalData = [];
// if (rawData.length != 0 && raw,Data,length != 0) {
const totalData = [];
// if (rawData.length != 0 && raw,Data,length != 0) {
for (let i = 0; i < rawData[0].length; ++i) {
let sum = 0;
for (let j = 0; j < rawData.length; ++j) {
@@ -104,134 +116,156 @@ export default {
}
totalData.push(sum);
}
// }
console.log('total', totalData)
this.chart = echarts.init(document.getElementById(this.id))
const series = [
'良品',
'废品',
// 'Affiliate Ad',
// 'Video Ad',
// 'Search Engine'
].map((name, sid) => {
// console.log(sid)
return {
name,
type: 'bar',
stack: 'total',
barWidth: 12,
// label: {
// show: true,
// formatter: (params) => Math.round(params.value * 1000) / 10 + '%'
// },
color:colors[sid],
data: rawData.length != 0 ? rawData[sid].map((d, did) =>
totalData[did] <= 0 ? 0 : d / totalData[did]
) : []
};
});
// this.charts.resize({
// //width: width,
// //height: height,
// // es6解构
// width,
// height
// })
this.chart.setOption({
legend: {
formatter: function (name) {
//通过name获取到数组对象中的单个对象
let singleData = series.filter(function (item) {
return item.name == name
})
return name + parseFloat((singleData[0].data * 100).toFixed(3)) + '%'
},
itemWidth: 12,
itemHeight: 12,
bottom: '20',
left: '20',
icon: 'rect',
textStyle: {
color: '#ffffff'
// }
// rawData[1].map((d, did) =>
// console.log((d / totalData[did]).toFixed(3))
// // totalData[did] <= 0 ? 0 : d / totalData[did]
// )
console.log('total', totalData)
const series = [
'良品',
'废品',
// 'Affiliate Ad',
// 'Video Ad',
// 'Search Engine'
].map((name, sid) => {
// console.log(sid)
return {
name,
type: 'bar',
stack: 'total',
barWidth: 12,
// label: {
// show: true,
// formatter: (params) => Math.round(params.value * 1000) / 10 + '%'
// },
color: colors[sid],
data: rawData.length != 0 ? rawData[sid].map((d, did) =>
totalData[did] <= 0 ? 0 : (d / totalData[did]).toFixed(4)
) : []
};
});
// this.charts.resize({
// //width: width,
// //height: height,
// // es6解构
// width,
// height
// })
this.chart = echarts.init(document.getElementById(this.id))
let isFinished = false //标记 isFinished
this.chart.on('finished', _ => {
if (!isFinished) {
console.log('我只执行一次')
isFinished = true
// this.isLoading = false //关闭loading
this.chart.resize() //重新渲染charts大小
}
},
grid: {
top:'0',
left: '3%',
right: '4%',
// bottom: '3%',
width: 'auto',
height: '95',
containLabel: true
},
yAxis: [
{
type: 'category',
inverse: true,
splitLine: {
show: false
console.log(113, 'finished')
})
this.chart.setOption({
legend: {
formatter: function (name) {
//通过name获取到数组对象中的单个对象
let singleData = series.filter(function (item) {
return item.name == name
})
return name + parseFloat((singleData[0].data * 100).toFixed(2)) + '%'
},
axisTick: {
show: false
},
axisLine: {
show: false
},
axisLabel: {
show: true,
inside: true,
interval: 0, //横轴信息全部显
splitNumber: 50,
// boundaryGap: [20, 20],
textStyle: {
color: '#ffffff',
verticalAlign: 'bottom',
fontSize: 12,
align: 'left',
padding: [0, 0, 10, -5]
}
},
data: topNameList
itemWidth: 12,
itemHeight: 12,
bottom: '20',
left: '20',
icon: 'roundRect',
textStyle: {
color: 'rgba(255,255,255,.9)',
fontSize: 12,
}
},
{
type: 'category',
inverse: true,
splitLine: {
show: false
grid: {
top: '0',
left: '3%',
right: '4%',
// bottom: '3%',
width: 'auto',
height: '95',
containLabel: true
},
yAxis: [
{
type: 'category',
inverse: true,
splitLine: {
show: false
},
axisTick: {
show: false
},
axisLine: {
show: false
},
axisLabel: {
show: true,
inside: true,
interval: 0, //横轴信息全部显
splitNumber: 50,
// boundaryGap: [20, 20],
textStyle: {
color: 'rgba(255,255,255,.9)',
verticalAlign: 'bottom',
fontSize: 16,
align: 'left',
padding: [0, 0, 10, -5]
}
},
data: topNameList
},
axisTick: {
show: false
},
axisLine: {
show: false
},
axisLabel: {
show: true,
inside: true,
interval: 0, //横轴信息全部显
splitNumber: 50,
// boundaryGap: [20, 20],
textStyle: {
color: '#ffffff',
verticalAlign: 'bottom',
fontSize: 12,
align: 'right',
padding: [0, 0, 10, -5]
}
},
data: nameWasteList
}
],
xAxis: {
// max: 120,
show: false,
},
series:series
})
this.chart.resize({
width: 'auto',
height: 90
});;
{
type: 'category',
inverse: true,
splitLine: {
show: false
},
axisTick: {
show: false
},
axisLine: {
show: false
},
axisLabel: {
show: true,
inside: true,
interval: 0, //横轴信息全部显
splitNumber: 50,
// boundaryGap: [20, 20],
textStyle: {
color: 'rgba(255,255,255,.9)',
verticalAlign: 'bottom',
fontSize: 16,
align: 'right',
padding: [0, 0, 10, -5]
}
},
data: nameWasteList
}
],
xAxis: {
// max: 120,
show: false,
},
series: series
})
this.$nextTick(() => {
setTimeout(() => {
this.resize()
}, 1000);
})
}
// this.chart.resize({
// width: 'auto',
// height: 90
// });;
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -9,7 +9,8 @@
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-data="tableData">
:table-data="tableData"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
@@ -33,38 +34,49 @@ import {
getcoreAlarmLogPage
} from '@/api/base/coreAlarmLog';
import {DICT_TYPE, getDictDatas, publicFormatter } from "@/utils/dict";
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
prop: 'alarmTime',
label: '报警时间',
filter: parseTime
filter: parseTime,
width: 150,
showOverflowtooltip: true
},
{
prop: 'alarmSource',
label: '报警来源'
label: '报警来源',
width: 200,
showOverflowtooltip: true
},
{
prop: 'alarmType',
label: '报警类型'
label: '报警类型',
width: 180,
showOverflowtooltip: true
},
{
prop: 'alarmGrade',
label: '报警级别',
filter: publicFormatter(DICT_TYPE.EQU_ALARM_LEVEL)
filter: publicFormatter(DICT_TYPE.EQU_ALARM_LEVEL),
width: 120,
showOverflowtooltip: true
},
{
prop: 'alarmReason',
label: '报警原因'
label: '报警原因',
showOverflowtooltip: true
},
{
prop: 'alarmContent',
label: '报警详细'
label: '报警详细',
showOverflowtooltip: true
}
];
export default {
mixins: [basicPage],
mixins: [basicPage, tableHeightMixin],
data() {
return {
urlOptions: {
@@ -74,7 +86,7 @@ export default {
tableBtn: [].filter((v)=>v),
tableData: [],
listQuery: {
pageSize: 10,
pageSize: 20,
pageNo: 1,
total: 0,
alarmSource: undefined,

View File

@@ -2,7 +2,7 @@
* @Author: zwq
* @Date: 2021-11-18 14:16:25
* @LastEditors: DY
* @LastEditTime: 2024-03-20 16:20:39
* @LastEditTime: 2024-04-02 16:46:17
* @Description:
-->
<template>
@@ -96,7 +96,7 @@ export default {
dataRule: {
code: [{ required: true, message: "客户编号不能为空", trigger: "blur" }],
name: [{ required: true, message: "客户名称不能为空", trigger: "blur" }],
contact: [{ required: true, message: "联系人不能为空", trigger: "blur" }],
// contact: [{ required: true, message: "联系人不能为空", trigger: "blur" }],
telephone: [
{ required: false, trigger: "blur", message: "手机号不能为空" },
{

View File

@@ -9,7 +9,8 @@
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-data="tableData">
:table-data="tableData"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
@@ -45,41 +46,56 @@ import {
getCustomerPage,
deleteCustomer
} from '@/api/base/coreCustomer';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
prop: 'createTime',
label: '添加时间',
filter: parseTime
filter: parseTime,
width: 150,
showOverflowtooltip: true
},
{
prop: 'name',
label: '客户名称'
label: '客户名称',
width: 150,
showOverflowtooltip: true
},
{
prop: 'code',
label: '客户编码'
label: '客户编码',
width: 150,
showOverflowtooltip: true
},
{
prop: 'contact',
label: '联系人'
label: '联系人',
width: 120,
showOverflowtooltip: true
},
{
prop: 'telephone',
label: '联系电话'
label: '联系电话',
width: 150,
showOverflowtooltip: true
},
{
prop: 'address',
label: '地址'
label: '地址',
width: 150,
showOverflowtooltip: true
},
{
prop: 'remark',
label: '备注'
label: '备注',
minWidth: 150,
showOverflowtooltip: true
},
];
export default {
mixins: [basicPage],
mixins: [basicPage, tableHeightMixin],
data() {
return {
urlOptions: {
@@ -122,7 +138,7 @@ export default {
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermi('base:core-customer:create') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:core-customer:create') ? 'button' : '',

View File

@@ -9,7 +9,8 @@
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-data="tableData">
:table-data="tableData"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
@@ -45,6 +46,7 @@ import {
getCoreDepartmentPage,
deleteCoreDepartment
} from '@/api/base/coreDepartment';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
@@ -71,7 +73,7 @@ const tableProps = [
];
export default {
mixins: [basicPage],
mixins: [basicPage, tableHeightMixin],
data() {
return {
urlOptions: {
@@ -108,7 +110,7 @@ export default {
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermi('base:core-department:create') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:core-department:create') ? 'button' : '',

View File

@@ -64,8 +64,8 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="进日期" prop="enterTime" :rules="[]">
<el-date-picker v-model="form.enterTime" :disabled="disabled" type="datetime" placeholder="请选择进日期"
<el-form-item label="进日期" prop="enterTime" :rules="[]">
<el-date-picker v-model="form.enterTime" :disabled="disabled" type="datetime" placeholder="请选择进日期"
value-format="timestamp"></el-date-picker>
</el-form-item>
</el-col>

View File

@@ -12,7 +12,8 @@
:page="queryParams.pageNo"
:limit="queryParams.pageSize"
:table-data="list"
@emitFun="handleEmitFun">
@emitFun="handleEmitFun"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
@@ -78,7 +79,7 @@
queryParams: {
equipmentId: form.id,
pageNo: 1,
pageSize: 10,
pageSize: 20,
},
tableBtn: [
this.$auth.hasPermi('base:core-equipment-attr:update')
@@ -118,6 +119,7 @@ import {
} from '@/api/base/equipment';
import Editor from '@/components/Editor';
import AssetsUpload from './components/AssetsUpload.vue';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
export default {
name: 'Equipment',
@@ -125,7 +127,7 @@ export default {
Editor,
EquipmentDrawer,
},
mixins: [basicPageMixin],
mixins: [basicPageMixin, tableHeightMixin],
data() {
return {
searchBarKeys: ['name', 'code'],
@@ -154,11 +156,11 @@ export default {
prop: 'createTime',
label: '添加时间',
fixed: true,
width: 180,
minWidth: 180,
filter: (val) => moment(val).format('yyyy-MM-DD HH:mm:ss'),
},
{ prop: 'name', label: '设备名称' },
{ width: 256, prop: 'code', label: '设备编码' },
{ prop: 'name', label: '设备名称', minWidth: 180, showOverflowtooltip: true },
{ minWidth: 250, prop: 'code', label: '设备编码' },
{ prop: 'equipmentTypeName', label: '设备类型' },
{ prop: 'enName', label: '英文名称' },
{ prop: 'abbr', label: '缩写' },
@@ -209,7 +211,7 @@ export default {
color: 'primary',
},
{
type: 'separate',
type: (this.$auth.hasPermi('base:core-equipment:export') || this.$auth.hasPermi('base:core-equipment:create')) ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:core-equipment:export')
@@ -484,7 +486,7 @@ export default {
// 查询参数
queryParams: {
pageNo: 1,
pageSize: 10,
pageSize: 20,
code: '',
name: '',
special: false

View File

@@ -12,7 +12,8 @@
:page="queryParams.pageNo"
:limit="queryParams.pageSize"
:table-data="list"
@emitFun="handleEmitFun">
@emitFun="handleEmitFun"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
@@ -51,13 +52,13 @@
import moment from 'moment';
import basicPageMixin from '@/mixins/lb/basicPageMixin';
import DialogForm from './dialogForm.vue';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
// import { getAccessToken } from '@/utils/auth';
export default {
name: 'EquipmentLineBind',
components: { DialogForm },
mixins: [basicPageMixin],
mixins: [basicPageMixin, tableHeightMixin],
data() {
return {
basePath: '/base/core-equipment-bind-section',
@@ -81,12 +82,13 @@ export default {
prop: 'createTime',
label: '添加时间',
fixed: true,
width: 180,
width: 150,
showOverflowtooltip: true,
filter: (val) => moment(val).format('yyyy-MM-DD HH:mm:ss'),
},
{ prop: 'productionLineName', label: '产线名称' },
{ prop: 'workshopSectionName', label: '工段名称' },
{ prop: 'equipmentName', label: '设备名称' },
{ prop: 'productionLineName', label: '产线名称', width: 120, showOverflowtooltip: true },
{ prop: 'workshopSectionName', label: '工段名称', width: 120, showOverflowtooltip: true },
{ prop: 'equipmentName', label: '设备名称', width: 150, showOverflowtooltip: true },
{ prop: 'sort', label: '工段中排序' },
{
prop: 'lineDataType',
@@ -124,7 +126,8 @@ export default {
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermi('base:core-equipment-bind-section:create')
? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:core-equipment-bind-section:create')
@@ -236,7 +239,7 @@ export default {
// 查询参数
queryParams: {
pageNo: 1,
pageSize: 10,
pageSize: 20,
equipmentName: null,
productionLineId: null,
},

View File

@@ -12,7 +12,8 @@
:page="queryParams.pageNo"
:limit="queryParams.pageSize"
:table-data="list"
@emitFun="handleEmitFun">
@emitFun="handleEmitFun"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
@@ -50,6 +51,7 @@
<script>
import moment from 'moment';
import basicPageMixin from '@/mixins/lb/basicPageMixin';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
import {
createEquipmentType,
@@ -65,7 +67,7 @@ import {
export default {
name: 'EquipmentType',
components: {},
mixins: [basicPageMixin],
mixins: [basicPageMixin, tableHeightMixin],
data() {
return {
searchBarKeys: ['name'],
@@ -88,7 +90,7 @@ export default {
prop: 'createTime',
label: '添加时间',
fixed: true,
width: 180,
minWidth: 180,
filter: (val) => moment(val).format('yyyy-MM-DD HH:mm:ss'),
},
{ prop: 'name', label: '类型名称' },
@@ -109,7 +111,8 @@ export default {
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermi('base:core-equipment-type:create')
? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:core-equipment-type:create')
@@ -171,7 +174,7 @@ export default {
// 查询参数
queryParams: {
pageNo: 1,
pageSize: 10,
pageSize: 20,
name: '',
},
// 表单参数

View File

@@ -9,7 +9,8 @@
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-data="tableData">
:table-data="tableData"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
@@ -43,38 +44,51 @@ import basicPage from '../../core/mixins/basic-page';
import { parseTime } from '../../core/mixins/code-filter';
import { getHotMaterialPage, deleteHotMaterial } from '@/api/base/coreHotMaterial';
import { publicFormatter } from "@/utils/dict";
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
prop: 'createTime',
label: '添加时间',
filter: parseTime
filter: parseTime,
width: 180,
showOverflowtooltip: true
},
{
prop: 'name',
label: '原料名称'
label: '原料名称',
minWidth: 250,
showOverflowtooltip: true
},
{
prop: 'code',
label: '原料编码'
label: '原料编码',
width: 250,
showOverflowtooltip: true
},
{
prop: 'unit',
label: '单位',
filter: publicFormatter('unit_dict')
filter: publicFormatter('unit_dict'),
width: 90,
showOverflowtooltip: true
},
{
prop: 'dailyCost',
label: '每日消耗量'
label: '每日消耗量',
width: 120,
showOverflowtooltip: true
},
{
prop: 'remark',
label: '备注'
label: '备注',
width: 120,
showOverflowtooltip: true
},
];
export default {
mixins: [basicPage],
mixins: [basicPage, tableHeightMixin],
data() {
return {
urlOptions: {
@@ -123,7 +137,7 @@ export default {
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermi('base:core-hot-material-check:create') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:core-hot-material-check:create') ? 'button' : '',

View File

@@ -9,7 +9,8 @@
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-data="tableData">
:table-data="tableData"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
@@ -45,6 +46,7 @@ import {
getCoreMajorPage,
deleteCoreMajor
} from '@/api/base/coreMajor';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
@@ -71,7 +73,7 @@ const tableProps = [
];
export default {
mixins: [basicPage],
mixins: [basicPage, tableHeightMixin],
data() {
return {
urlOptions: {
@@ -108,7 +110,7 @@ export default {
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermi('base:core-major:create') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:core-major:create') ? 'button' : '',

View File

@@ -2,15 +2,17 @@
* @Author: zwq
* @Date: 2021-11-18 14:16:25
* @LastEditors: DY
* @LastEditTime: 2024-03-13 13:54:01
* @LastEditTime: 2024-03-27 13:47:24
* @Description:
-->
<template>
<el-drawer
:visible.sync="visible"
:show-close="false"
:wrapper-closable="isdetail"
:wrapper-closable="true"
class="drawer"
:before-close="beforeClose"
@closed="$emit('destroy')"
size="60%">
<small-title slot="title" :no-padding="true">
{{ isdetail ? '详情' : !dataForm.id ? '新增' : '编辑' }}
@@ -262,6 +264,15 @@ export default {
},
mounted() {},
methods: {
beforeClose(done) {
if (!this.isdetail) {
this.$confirm('确认关闭?')
.then(_ => {
done();
})
.catch(_ => {});
}
},
clearArea() {
this.$set(this.dataForm, 'area', 0)
this.$set(this.dataForm, 'weight', 0)

View File

@@ -9,11 +9,12 @@
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-data="tableData">
:table-data="tableData"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="120"
:Width="120"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick" />
@@ -26,7 +27,8 @@
<add-or-update
v-if="addOrUpdateVisible"
ref="addOrUpdate"
@refreshDataList="getDataList" />
@refreshDataList="getDataList"
@destroy="addOrUpdateVisible = false" />
</div>
</template>
@@ -39,43 +41,58 @@ import {
getCoreProductPage,
deleteCoreProduct
} from '@/api/base/coreProduct';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
prop: 'createTime',
label: '添加时间',
filter: parseTime
filter: parseTime,
minWidth: 150,
showOverflowtooltip: true
},
{
prop: 'name',
label: '产品名称'
label: '产品名称',
minWidth: 150,
showOverflowtooltip: true
},
{
prop: 'code',
label: '产品编码'
label: '产品编码',
minWidth: 190,
showOverflowtooltip: true
},
{
prop: 'productType',
label: '产品类型',
filter: publicFormatter('product_type')
filter: publicFormatter('product_type'),
minWidth: 180,
showOverflowtooltip: true
},
{
prop: 'specifications',
label: '规格'
label: '规格',
minWidth: 150,
showOverflowtooltip: true
},
{
prop: 'unit',
label: '单位',
filter: publicFormatter('unit_dict')
filter: publicFormatter('unit_dict'),
minWidth: 90,
showOverflowtooltip: true
},
{
prop: 'remark',
label: '备注',
minWidth: 120,
showOverflowtooltip: true
},
];
export default {
mixins: [basicPage],
mixins: [basicPage, tableHeightMixin],
data() {
return {
urlOptions: {
@@ -124,7 +141,7 @@ export default {
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermi('base:core-product:create') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:core-product:create') ? 'button' : '',

View File

@@ -9,11 +9,12 @@
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-data="tableData">
:table-data="tableData"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="120"
:minWidth="120"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick" />
@@ -29,7 +30,7 @@
@cancel="handleCancel"
@confirm="handleConfirm"
:before-close="handleCancel"
width="50%">
minWidth="50%">
<add-or-update
ref="addOrUpdate"
@refreshDataList="successSubmit"></add-or-update>
@@ -48,34 +49,47 @@ import {
import { getStatus } from '@/api/core/base/productionLine';
import codeFilter from '../../core/mixins/code-filter';
import { publicFormatter } from '@/utils/dict';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
prop: 'createTime',
label: '添加时间',
filter: parseTime
filter: parseTime,
minWidth: 150,
showOverflowtooltip: true
},
{
prop: 'factoryName',
label: '工厂'
label: '工厂',
minWidth: 150,
showOverflowtooltip: true
},
{
prop: 'roomNameDict',
label: '车间名称',
filter: publicFormatter('workshop')
filter: publicFormatter('workshop'),
minWidth: 120,
showOverflowtooltip: true
},
{
prop: 'name',
label: '产线名称'
label: '产线名称',
minWidth: 120,
showOverflowtooltip: true
},
{
prop: 'code',
label: '产线编码'
label: '产线编码',
minWidth: 150,
showOverflowtooltip: true
},
{
prop: 'enabled',
label: '当前状态',
filter: codeFilter('lineStatus')
filter: codeFilter('lineStatus'),
minWidth: 120,
showOverflowtooltip: true
},
// {
// prop: 'tvalue',
@@ -83,16 +97,20 @@ const tableProps = [
// },
{
prop: 'description',
label: '描述'
label: '描述',
minWidth: 120,
showOverflowtooltip: true
},
{
prop: 'remark',
label: '备注'
label: '备注',
minWidth: 120,
showOverflowtooltip: true
}
];
export default {
mixins: [basicPage],
mixins: [basicPage, tableHeightMixin],
data() {
return {
urlOptions: {
@@ -129,7 +147,7 @@ export default {
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermi('base:core-production-line:create') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:core-production-line:create') ? 'button' : '',

View File

@@ -2,7 +2,7 @@
* @Author: zwq
* @Date: 2021-11-18 14:16:25
* @LastEditors: DY
* @LastEditTime: 2023-11-22 10:27:43
* @LastEditTime: 2024-04-02 16:46:49
* @Description:
-->
<template>
@@ -79,7 +79,7 @@ export default {
dataRule: {
code: [{ required: true, message: "供应商编号不能为空", trigger: "blur" }],
name: [{ required: true, message: "供应商名称不能为空", trigger: "blur" }],
contact: [{ required: true, message: "联系人不能为空", trigger: "blur" }],
// contact: [{ required: true, message: "联系人不能为空", trigger: "blur" }],
telephone: [
{ required: false, trigger: "blur", message: "手机号不能为空" },
{

View File

@@ -9,7 +9,8 @@
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-data="tableData">
:table-data="tableData"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
@@ -45,41 +46,56 @@ import {
getCoreSupplierPage,
deleteCoreSupplier
} from '@/api/base/coreSupplier';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
prop: 'createTime',
label: '添加时间',
filter: parseTime
filter: parseTime,
width: 150,
showOverflowtooltip: true
},
{
prop: 'code',
label: '供应商编码'
label: '供应商编码',
width: 150,
showOverflowtooltip: true
},
{
prop: 'name',
label: '供应商名称'
label: '供应商名称',
width: 180,
showOverflowtooltip: true
},
{
prop: 'contact',
label: '联系人'
label: '联系人',
width: 180,
showOverflowtooltip: true
},
{
prop: 'telephone',
label: '联系电话'
label: '联系电话',
width: 150,
showOverflowtooltip: true
},
{
prop: 'address',
label: '地址'
label: '地址',
width: 180,
showOverflowtooltip: true
},
{
prop: 'remark',
label: '备注'
label: '备注',
minWidth: 90,
showOverflowtooltip: true
},
];
export default {
mixins: [basicPage],
mixins: [basicPage, tableHeightMixin],
data() {
return {
urlOptions: {
@@ -116,7 +132,7 @@ export default {
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermi('base:core-supplier:create') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:core-supplier:create') ? 'button' : '',

View File

@@ -2,7 +2,7 @@
* @Author: zwq
* @Date: 2021-11-18 14:16:25
* @LastEditors: DY
* @LastEditTime: 2024-03-22 08:53:20
* @LastEditTime: 2024-04-08 10:21:46
* @Description:
-->
<template>
@@ -214,7 +214,9 @@ export default {
actualQuantity: this.dataForm.actualQuantity
}).then(response => {
this.$modal.msgSuccess("操作成功!工单状态稍后将会更新!");
this.saveData(tempList)
if (tempList.length > 0) {
this.saveData(tempList)
}
this.visible = false;
this.$emit("refreshDataList");
});

View File

@@ -2,7 +2,7 @@
* @Author: zwq
* @Date: 2021-11-18 14:16:25
* @LastEditors: DY
* @LastEditTime: 2024-03-21 16:52:46
* @LastEditTime: 2024-04-10 16:16:31
* @Description:
-->
<template>
@@ -182,7 +182,8 @@
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-data="orderList">
:table-data="orderList"
:max-height="tableH">
<method-btn
v-if="!isdetail"
slot="handleBtn"
@@ -200,23 +201,26 @@
@pagination="getList" /> -->
</div>
<div class="card" style="padding-bottom: 16px;">
<div class="boxTitle">
<span class="blueTitle"></span>
<span>预计用料信息</span>
<div v-if="$auth.hasPermiAnd(['base:material-product-bom-det:query', 'extend:process-flow:query'])">
<div class="card" style="padding-bottom: 16px;">
<div class="boxTitle">
<span class="blueTitle"></span>
<span>预计用料信息</span>
</div>
<base-table
:table-props="tableProps1"
:page="listQuery1.pageNo"
:limit="listQuery1.pageSize"
:table-data="materialList"
:max-height="tableH" />
<!-- <pagination
v-show="listQuery1.total > 0"
:total="listQuery1.total"
:page.sync="listQuery1.pageNo"
:limit.sync="listQuery1.pageSize"
:page-sizes="[5, 10, 15]"
@pagination="getList" /> -->
</div>
<base-table
:table-props="tableProps1"
:page="listQuery1.pageNo"
:limit="listQuery1.pageSize"
:table-data="materialList" />
<!-- <pagination
v-show="listQuery1.total > 0"
:total="listQuery1.total"
:page.sync="listQuery1.pageNo"
:limit.sync="listQuery1.pageSize"
:page-sizes="[5, 10, 15]"
@pagination="getList" /> -->
</div>
<!-- <div class="drawer-body__footer">
@@ -235,6 +239,7 @@ import SmallTitle from './SmallTitle';
import { publicFormatter } from "@/utils/dict";
import { parseTime } from '@/utils/ruoyi'
import topTabVue from '../../order/base/orderManage/components/topTab.vue';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableBtn = [
{
@@ -292,9 +297,11 @@ const tableProps1 = [
];
export default {
mixins: [tableHeightMixin],
components: { SmallTitle, topTabVue },
data() {
return {
heightNum: 380,
tableBtn,
tableProps,
tableProps1,
@@ -455,8 +462,8 @@ export default {
// this.listQuery.total = response.data.total;
});
// 获取预使用原料列表
console.log()
if (this.dataForm.id) {
console.log('111我看看', this.dataForm.materialMethod)
if (this.dataForm.id && this.$auth.hasPermiAnd(['base:material-product-bom-det:query', 'extend:process-flow:query'])) {
if (this.dataForm.materialMethod === 1) {
// 产品
getlistByProductId({

View File

@@ -9,7 +9,8 @@
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-data="tableData">
:table-data="tableData"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
@@ -62,7 +63,7 @@ import {
getCoreWOList
} from '@/api/base/coreWorkOrder';
import { publicFormatter } from '@/utils/dict';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
@@ -132,7 +133,7 @@ const tableProps = [
];
export default {
mixins: [basicPage],
mixins: [basicPage, tableHeightMixin],
components: {
AddWorkOrder,
AddOrUpdate,
@@ -156,92 +157,105 @@ export default {
// showTip: '预使用原料信息'
// }
// : undefined,
{
type: 'active',
btnName: '激活',
showParam: {
type: '|',
data: [
{
name: 'status',
type: 'equal',
value: 1
},
{
name: 'status',
type: 'equal',
value: 3
}
]
this.$auth.hasPermi(`base:core-work-order:update`)
? {
type: 'active',
btnName: '激活',
showParam: {
type: '|',
data: [
{
name: 'status',
type: 'equal',
value: 1
},
{
name: 'status',
type: 'equal',
value: 3
}
]
}
}
},
{
type: 'pause',
btnName: '暂停',
showParam: {
type: '|',
data: [
{
name: 'status',
type: 'equal',
value: 2
}
]
: undefined,
this.$auth.hasPermi(`base:core-work-order:update`)
? {
type: 'pause',
btnName: '暂停',
showParam: {
type: '|',
data: [
{
name: 'status',
type: 'equal',
value: 2
}
]
}
}
},
{
type: 'nullify',
btnName: '作废',
showParam: {
type: '|',
data: [
{
name: 'status',
type: 'equal',
value: 1
}
]
: undefined,
this.$auth.hasPermi(`base:core-work-order:update`)
? {
type: 'nullify',
btnName: '作废',
showParam: {
type: '|',
data: [
{
name: 'status',
type: 'equal',
value: 1
}
]
}
}
},
{
type: 'finish',
btnName: '完成',
showParam: {
type: '|',
data: [
{
name: 'status',
type: 'equal',
value: 2
},
{
name: 'status',
type: 'equal',
value: 3
}
]
: undefined,
this.$auth.hasPermi(`base:core-work-order:update`)
? {
type: 'finish',
btnName: '完成',
showParam: {
type: '|',
data: [
{
name: 'status',
type: 'equal',
value: 2
},
{
name: 'status',
type: 'equal',
value: 3
}
]
}
}
},
{
type: 'stop',
btnName: '终止',
showParam: {
type: '|',
data: [
{
name: 'status',
type: 'equal',
value: 2
},
{
name: 'status',
type: 'equal',
value: 3
}
]
: undefined,
this.$auth.hasPermi(`base:core-work-order:update`)
? {
type: 'stop',
btnName: '终止',
showParam: {
type: '|',
data: [
{
name: 'status',
type: 'equal',
value: 2
},
{
name: 'status',
type: 'equal',
value: 3
}
]
}
}
},
this.$auth.hasPermi(`base:core-work-order:detail`)
: undefined,
this.$auth.hasPermiAnd([
'base:core-work-order:query',
'base:order:query'
])
? {
type: 'detail',
btnName: '查看详情',

View File

@@ -9,7 +9,8 @@
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-data="tableData">
:table-data="tableData"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
@@ -46,20 +47,27 @@ import {
deleteCoreWorker
} from '@/api/base/coreWorker';
import moment from 'moment';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
prop: 'createTime',
label: '创建时间',
filter: parseTime
filter: parseTime,
width: 150,
showOverflowtooltip: true
},
{
prop: 'name',
label: '姓名'
label: '姓名',
width: 120,
showOverflowtooltip: true
},
{
prop: 'code',
label: '员工号'
label: '员工号',
width: 150,
showOverflowtooltip: true
},
{
prop: 'sex',
@@ -70,32 +78,44 @@ const tableProps = [
prop: 'entryTime',
label: '入职时间',
filter: (val) => val ? moment(val).format('yyyy-MM-DD') : '',
width: 120,
showOverflowtooltip: true
},
{
prop: 'telephone',
label: '联系电话'
label: '联系电话',
width: 150,
showOverflowtooltip: true
},
{
prop: 'status',
label: '状态',
filter: (val) => ['', '在职', '离职'][val]
filter: (val) => ['', '在职', '离职'][val],
width: 120,
showOverflowtooltip: true
},
{
prop: 'departmentName',
label: '部门'
label: '部门',
width: 120,
showOverflowtooltip: true
},
{
prop: 'majorName',
label: '专业'
label: '专业',
width: 150,
showOverflowtooltip: true
},
{
prop: 'remark',
label: '备注'
label: '备注',
width: 150,
showOverflowtooltip: true
},
];
export default {
mixins: [basicPage],
mixins: [basicPage, tableHeightMixin],
data() {
return {
urlOptions: {
@@ -143,7 +163,7 @@ export default {
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermi('base:core-worker:create') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:core-worker:create') ? 'button' : '',

View File

@@ -9,7 +9,8 @@
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-data="tableData">
:table-data="tableData"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
@@ -45,6 +46,7 @@ import {
getCWSectionPage,
deleteCWSection
} from '@/api/base/coreWorkshopSection';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
@@ -70,12 +72,13 @@ const tableProps = [
},
{
prop: 'remark',
label: '备注'
label: '备注',
showOverflowtooltip: true
},
];
export default {
mixins: [basicPage],
mixins: [basicPage, tableHeightMixin],
data() {
return {
urlOptions: {
@@ -112,7 +115,7 @@ export default {
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermi('base:core-workshop-section:create') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:core-workshop-section:create') ? 'button' : '',

View File

@@ -1,19 +1,24 @@
<template>
<el-drawer :visible.sync="drawer" :append-to-body="true" size="80%" >
<small-title slot="title" :no-padding="true">
<!-- <template v-for="demo in demoList"> -->
<!-- <el-button :key="demo.name" :type="demo.name === curDemo ? 'primary' : ' '" @click="curDemo = demo.name"> -->
<!-- {{ $t('module.packingManage.printModelDesign') }} -->
模板设计
<!-- </el-button> -->
<!-- </template> -->
</small-title>
<el-card>
<el-row style="margin-bottom: 10px">
<el-col :span="4">
<!-- 模板选择 -->
<el-drawer
:visible.sync="drawer"
:append-to-body="true"
size="80%">
<small-title
slot="title"
:no-padding="true">
<!-- <template v-for="demo in demoList"> -->
<!-- <el-button :key="demo.name" :type="demo.name === curDemo ? 'primary' : ' '" @click="curDemo = demo.name"> -->
<!-- {{ $t('module.packingManage.printModelDesign') }} -->
模板设计
<!-- </el-button> -->
<!-- </template> -->
</small-title>
<el-card>
<el-row style="margin-bottom: 10px">
<!-- <el-col :span="4"> -->
<!-- 模板选择 -->
<!-- <el-select
<!-- <el-select
v-model="mode"
filterable
:default-value="0"
@@ -25,393 +30,469 @@
{{ opt.name }}
</el-option>
</el-select> -->
</el-col>
<el-col :span="20">
<!-- 纸张设置 -->
<el-button-group style="margin:0 10px">
<el-button v-for="(value,type) in paperTypes" :key="type" :type="curPaperType === type ? 'primary' : ' '"
@click="setPaper(type,value)">
{{ type }}
</el-button>
</el-button-group>
<el-input-number style="margin:0 10px" :value="scaleValue " :precision="2" :step="0.1" :min="scaleMin"
:max="scaleMax" @change="changeScale" />
<el-popover v-model="paperPopVisible" placement="bottom" width="300" title="设置纸张宽高(mm)">
<div style="display: flex;align-items: center;justify-content: space-between;margin-bottom: 10px">
<el-input v-model="paperWidth" type="number" style=" width: 100px; text-align: center" place="宽mm" />~
<el-input v-model="paperHeight" type="number" style=" width: 100px; text-align: center" place="高mm" />
</div>
<div>
<el-button type="primary" style="width: 100%" size="mini" @click="otherPaper">确定</el-button>
</div>
<el-button slot="reference" type="primary" style="margin:0 10px">自定义宽高</el-button>
</el-popover>
<!-- </el-col> -->
<el-col :span="24">
<!-- 纸张设置 -->
<el-button-group style="margin: 0 10px">
<el-button
v-for="(value, type) in paperTypes"
:key="type"
:type="curPaperType === type ? 'primary' : ' '"
@click="setPaper(type, value)">
{{ type }}
</el-button>
</el-button-group>
<el-input-number
style="margin: 0 10px; width: 140px"
:value="scaleValue"
:precision="2"
:step="0.1"
:min="scaleMin"
:max="scaleMax"
@change="changeScale" />
<el-popover
v-model="paperPopVisible"
placement="bottom"
width="300"
title="设置纸张宽高(mm)">
<div
style="
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 10px;
">
<el-input
v-model="paperWidth"
type="number"
style="width: 100px; text-align: center"
place="宽mm" />
~
<el-input
v-model="paperHeight"
type="number"
style="width: 100px; text-align: center"
place="高mm" />
</div>
<div>
<el-button
type="primary"
style="width: 100%"
size="mini"
@click="otherPaper">
确定
</el-button>
</div>
<el-button
slot="reference"
type="primary"
style="margin: 0 10px">
自定义宽高
</el-button>
</el-popover>
<!-- <a-button-group>-->
<!-- <template v-for="(value,type) in paperTypes">-->
<!-- <a-button :type="curPaperType === type ? 'primary' : 'info'" @click="setPaper(type,value)" :key="type">-->
<!-- {{ type }}-->
<!-- </a-button>-->
<!-- </template>-->
<!-- <a-popover v-model="paperPopVisible" title="设置纸张宽高(mm)" trigger="click">-->
<!-- <div slot="content">-->
<!-- <a-input-group compact style="margin: 10px 10px">-->
<!-- <a-input type="number" v-model="paperWidth" style=" width: 100px; text-align: center"-->
<!-- placeholder="宽(mm)"/>-->
<!-- <a-input style=" width: 30px; border-left: 0; pointer-events: none; backgroundColor: #fff"-->
<!-- placeholder="~" disabled-->
<!-- />-->
<!-- <a-input type="number" v-model="paperHeight" style="width: 100px; text-align: center; border-left: 0"-->
<!-- placeholder="高(mm)"/>-->
<!-- </a-input-group>-->
<!-- <a-button type="primary" style="width: 100%" @click="otherPaper">确定</a-button>-->
<!-- </div>-->
<!-- <a-button :type="'other'==curPaperType?'primary':''">自定义纸张</a-button>-->
<!-- </a-popover>-->
<!-- </a-button-group>-->
<!-- <a-button-group>-->
<!-- <template v-for="(value,type) in paperTypes">-->
<!-- <a-button :type="curPaperType === type ? 'primary' : 'info'" @click="setPaper(type,value)" :key="type">-->
<!-- {{ type }}-->
<!-- </a-button>-->
<!-- </template>-->
<!-- <a-popover v-model="paperPopVisible" title="设置纸张宽高(mm)" trigger="click">-->
<!-- <div slot="content">-->
<!-- <a-input-group compact style="margin: 10px 10px">-->
<!-- <a-input type="number" v-model="paperWidth" style=" width: 100px; text-align: center"-->
<!-- placeholder="宽(mm)"/>-->
<!-- <a-input style=" width: 30px; border-left: 0; pointer-events: none; backgroundColor: #fff"-->
<!-- placeholder="~" disabled-->
<!-- />-->
<!-- <a-input type="number" v-model="paperHeight" style="width: 100px; text-align: center; border-left: 0"-->
<!-- placeholder="高(mm)"/>-->
<!-- </a-input-group>-->
<!-- <a-button type="primary" style="width: 100%" @click="otherPaper">确定</a-button>-->
<!-- </div>-->
<!-- <a-button :type="'other'==curPaperType?'primary':''">自定义纸张</a-button>-->
<!-- </a-popover>-->
<!-- </a-button-group>-->
<!-- 预览/打印 -->
<el-button-group>
<el-button type="primary" icon="redo" @click="rotatePaper()">旋转</el-button>
<el-button type="primary" icon="el-icon-view" @click="preView">
预览
</el-button>
<!-- <el-button type="primary" icon="el-icon-printer" @click="print">
<!-- 预览/打印 -->
<el-button-group>
<el-button
type="primary"
icon="redo"
@click="rotatePaper()">
旋转
</el-button>
<el-button
type="primary"
icon="el-icon-view"
@click="preView">
预览
</el-button>
<!-- <el-button type="primary" icon="el-icon-printer" @click="print">
直接打印
</el-button> -->
<el-button type="primary" icon="el-icon-s-management" @click="save">
保存
</el-button>
<el-button type="danger" icon="el-icon-delete" @click="clearPaper">
清空
</el-button>
</el-button-group>
<!-- 保存/清空 -->
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="4">
<el-card style="height: 100vh">
<el-row>
<el-col :span="24" class="rect-printElement-types hiprintEpContainer" />
</el-row>
</el-card>
</el-col>
<el-col :span="16">
<el-card class="card-design">
<div id="hiprint-printTemplate" class="hiprint-printTemplate" />
</el-card>
</el-col>
<el-col :span="4" class="params_setting_container">
<el-card>
<el-row class="hinnn-layout-sider">
<div id="PrintElementOptionSetting" />
</el-row>
</el-card>
</el-col>
</el-row>
<!-- 预览 -->
<print-preview ref="preView" />
</el-card>
</el-drawer>
<el-button
type="primary"
icon="el-icon-s-management"
@click="save">
保存
</el-button>
<el-button
type="danger"
icon="el-icon-delete"
@click="clearPaper">
清空
</el-button>
</el-button-group>
<!-- 保存/清空 -->
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="4">
<el-card style="height: 100vh">
<el-row>
<el-col
:span="24"
class="rect-printElement-types hiprintEpContainer" />
</el-row>
</el-card>
</el-col>
<el-col :span="16">
<el-card class="card-design">
<div
id="hiprint-printTemplate"
class="hiprint-printTemplate" />
</el-card>
</el-col>
<el-col
:span="4"
class="params_setting_container">
<el-card>
<el-row class="hinnn-layout-sider">
<div id="PrintElementOptionSetting" />
</el-row>
</el-card>
</el-col>
</el-row>
<!-- 预览 -->
<print-preview ref="preView" />
</el-card>
</el-drawer>
</template>
<script>
import printPreview from './preview'
import { MessageBox } from 'element-ui'
import { hiprint } from 'vue-plugin-hiprint'
import providers from './providers'
import printPreview from './preview';
import { MessageBox } from 'element-ui';
import { hiprint } from 'vue-plugin-hiprint';
import providers from './providers';
// import printData from './print-data'
import $ from 'jquery'
import SmallTitle from './SmallTitle.vue'
let hiprintTemplate = null
import $ from 'jquery';
import SmallTitle from './SmallTitle.vue';
let hiprintTemplate = null;
export default {
name: 'PrintCustom',
components: { printPreview, SmallTitle },
// props: {
// modelData: {
// type: String,
// default: ''
// }
// },
data() {
return {
// paperPopVisible: false,
// 模板选择
mode: 0,
template: null,
modeList: [],
// 当前纸张
curPaper: {
// type: 'other',
// width: 220,
// height: 80
},
printData:{},
drawer: false,
// 纸张类型
paperTypes: {
'A3': {
width: 420,
height: 296.6
},
'A4': {
width: 210,
height: 297
},
'A5': {
width: 210,
height: 147.6
},
'B3': {
width: 500,
height: 352.6
},
'B4': {
width: 250,
height: 352.6
},
'B5': {
width: 250,
height: 175.6
}
},
scaleValue: 1,
scaleMax: 5,
scaleMin: 0.5,
// 自定义纸张
paperPopVisible: false,
paperWidth: '210',
paperHeight: '297'
}
},
computed: {
curPaperType() {
let type = 'other'
const types = this.paperTypes
for (const key in types) {
const item = types[key]
const { width, height } = this.curPaper
if (item.width === width && item.height === height) {
type = key
}
}
return type
}
},
created() {
// $('.hiprintEpContainer').empty()
},
destroyed () {
$('.hiprintEpContainer').empty()
console.log(11111)
},
methods: {
// handleClose() {
// $('.hiprintEpContainer').empty()
// },
closed() {
$('.hiprintEpContainer').empty()
$('.hiprint-printTemplate').empty()
},
init(data) {
this.drawer = true
this.modelData = data
this.modeList = providers.map((e) => {
return { type: e.type, name: e.name, value: e.value }
})
this.changeMode()
},
changeMode() {
// hiprintTemplate.clear()
// console.log(this.modelData)
this.$nextTick(() => {
const { mode } = this
const provider = providers[mode]
hiprint.init({
providers: [provider.f]
})
name: 'PrintCustom',
components: { printPreview, SmallTitle },
// props: {
// modelData: {
// type: String,
// default: ''
// }
// },
data() {
return {
// paperPopVisible: false,
// 模板选择
mode: 0,
template: null,
modeList: [],
// 当前纸张
curPaper: {
// type: 'other',
// width: 220,
// height: 80
},
printData: {},
drawer: false,
// 纸张类型
paperTypes: {
A3: {
width: 420,
height: 296.6,
},
A4: {
width: 210,
height: 297,
},
A5: {
width: 210,
height: 147.6,
},
A6: {
width: 95,
height: 125,
},
B3: {
width: 500,
height: 352.6,
},
B4: {
width: 250,
height: 352.6,
},
B5: {
width: 250,
height: 175.6,
},
},
scaleValue: 1,
scaleMax: 5,
scaleMin: 0.5,
// 自定义纸张
paperPopVisible: false,
paperWidth: '210',
paperHeight: '297',
};
},
computed: {
curPaperType() {
let type = 'other';
const types = this.paperTypes;
for (const key in types) {
const item = types[key];
const { width, height } = this.curPaper;
if (item.width === width && item.height === height) {
type = key;
}
}
return type;
},
},
created() {
// $('.hiprintEpContainer').empty()
},
destroyed() {
$('.hiprintEpContainer').empty();
console.log(11111);
},
methods: {
// handleClose() {
// $('.hiprintEpContainer').empty()
// },
closed() {
$('.hiprintEpContainer').empty();
$('.hiprint-printTemplate').empty();
},
init(data) {
this.drawer = true;
this.modelData = data;
this.modeList = providers.map((e) => {
return { type: e.type, name: e.name, value: e.value };
});
this.changeMode();
},
changeMode() {
// hiprintTemplate.clear()
// console.log(this.modelData)
this.$nextTick(() => {
const { mode } = this;
const provider = providers[mode];
hiprint.init({
providers: [provider.f],
});
// $('#hiprint-printTemplate').empty()
// console.log(JSON.parse(this.modelData))
hiprint.setConfig()
// 替换配置
hiprint.setConfig({
movingDistance: 2.5,
text: {
supportOptions: [
{
name: 'styler',
hidden: true
},
{
name: 'formatter',
hidden: true
}
]
}
})
// $('#hiprint-printTemplate').empty()
// console.log(JSON.parse(this.modelData))
hiprint.setConfig();
// 替换配置
hiprint.setConfig({
movingDistance: 2.5,
text: {
supportOptions: [
{
name: 'styler',
hidden: true,
},
{
name: 'formatter',
hidden: true,
},
],
},
});
// console.log(this.modelData)
// console.log($('#hiprint-printTemplate').empty())
// if () {
// console.log(this.modelData);
// $('.hiprintEpContainer').empty()
// hiprint.PrintElementTypeManager.build('.hiprintEpContainer', provider.value)
// $('.hiprint-printTemplate').empty()
// hiprintTemplate = new hiprint.PrintTemplate({
// template: JSON.parse(this.modelData),
// settingContainer: '#PrintElementOptionSetting',
// paginationContainer: '.hiprint-printPagination'
// })
// } else {
$('.hiprintEpContainer').empty()
console.log(this.modelData || {});
hiprint.PrintElementTypeManager.build('.hiprintEpContainer', provider.value)
$('.hiprint-printTemplate').empty()
// const templates = this.$ls.get('KEY_TEMPLATES', {})
const template = provider.value
// console.log(template)
if (this.modelData) {
hiprintTemplate = new hiprint.PrintTemplate({
template: JSON.parse(this.modelData),
settingContainer: '#PrintElementOptionSetting',
paginationContainer: '.hiprint-printPagination'
})
} else {
hiprintTemplate = new hiprint.PrintTemplate({
template:{},
settingContainer: '#PrintElementOptionSetting',
paginationContainer: '.hiprint-printPagination'
})
}
// }
hiprintTemplate.design('#hiprint-printTemplate')
// console.log(hiprintTemplate)
console.log(hiprintTemplate);
// hiprintTemplate.design('#hiprint-printTemplate', { grid: true })
// 获取当前放大比例, 当zoom时传true 才会有
this.scaleValue = hiprintTemplate.editingPanel.scale || 1
// this.scaleValue = hiprintTemplate.editingPanel.scale || 1
})
},
/**
* 设置纸张大小
* @param type [A3, A4, A5, B3, B4, B5, other]
* @param value {width,height} mm
*/
setPaper(type, value) {
try {
if (Object.keys(this.paperTypes).includes(type)) {
this.curPaper = { type: type, width: value.width, height: value.height }
hiprintTemplate.setPaper(value.width, value.height)
} else {
this.curPaper = { type: 'other', width: value.width, height: value.height }
hiprintTemplate.setPaper(value.width, value.height)
}
} catch (error) {
this.$message.error(`操作失败: ${error}`)
}
},
changeScale(currentValue, oldValue) {
let big = false
currentValue <= oldValue ? big = false : big = true
let scaleValue = this.scaleValue
if (big) {
scaleValue += 0.1
if (scaleValue > this.scaleMax) scaleValue = 5
} else {
scaleValue -= 0.1
if (scaleValue < this.scaleMin) scaleValue = 0.5
}
if (hiprintTemplate) {
// scaleValue: 放大缩小值, false: 不保存(不传也一样), 如果传 true, 打印时也会放大
hiprintTemplate.zoom(scaleValue)
this.scaleValue = scaleValue
}
},
clearPaper() {
MessageBox.confirm('是否确认清空模板信息?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
try {
hiprintTemplate.clear()
} catch (error) {
this.$message.error(`操作失败: ${error}`)
}
}).catch((err) => {
console.log(err)
})
},
otherPaper() {
const value = {}
value.width = this.paperWidth
value.height = this.paperHeight
this.paperPopVisible = false
this.setPaper('other', value)
},
rotatePaper() {
if (hiprintTemplate) {
hiprintTemplate.rotatePaper()
}
},
preView() {
const { width } = this.curPaper
this.$refs.preView.show(hiprintTemplate, this.printData, width)
},
print() {
// if (window.hiwebSocket.opened) {
const printerList = hiprintTemplate.getPrinterList()
console.log(printerList)
hiprintTemplate.print2(this.printData, { printer: '', title: '预览打印' })
// return
// }
// this.$message.error('客户端未连接,无法直接打印')
},
save() {
// console.log(hiprintTemplate.getJson())
const { mode } = this
const provider = providers[mode]
// console.log(hiprintTemplate.getJson())
this.setTemplate({
name: provider.value,
json: hiprintTemplate.getJson()
})
},
setTemplate(payload) {
// const templates = this.$ls.get('KEY_TEMPLATES', {})
// console.log(payload.json)
// templates[payload.name] = payload.json
// this.$ls.set('KEY_TEMPLATES', templates)
this.$message.info('保存成功')
// console.log(JSON.stringify(payload.json))
this.drawer = false
this.$emit('saveData', payload.json)
$('.hiprintEpContainer').empty()
// this.$parent.$parent.getModelData(payload.json)
}
}
}
// console.log(this.modelData)
// console.log($('#hiprint-printTemplate').empty())
// if () {
// console.log(this.modelData);
// $('.hiprintEpContainer').empty()
// hiprint.PrintElementTypeManager.build('.hiprintEpContainer', provider.value)
// $('.hiprint-printTemplate').empty()
// hiprintTemplate = new hiprint.PrintTemplate({
// template: JSON.parse(this.modelData),
// settingContainer: '#PrintElementOptionSetting',
// paginationContainer: '.hiprint-printPagination'
// })
// } else {
$('.hiprintEpContainer').empty();
console.log(this.modelData || {});
hiprint.PrintElementTypeManager.build(
'.hiprintEpContainer',
provider.value
);
$('.hiprint-printTemplate').empty();
// const templates = this.$ls.get('KEY_TEMPLATES', {})
const template = provider.value;
// console.log(template)
if (this.modelData) {
hiprintTemplate = new hiprint.PrintTemplate({
template: JSON.parse(this.modelData),
settingContainer: '#PrintElementOptionSetting',
paginationContainer: '.hiprint-printPagination',
});
} else {
hiprintTemplate = new hiprint.PrintTemplate({
template: {},
settingContainer: '#PrintElementOptionSetting',
paginationContainer: '.hiprint-printPagination',
});
}
// }
hiprintTemplate.design('#hiprint-printTemplate');
// console.log(hiprintTemplate)
console.log(hiprintTemplate);
// hiprintTemplate.design('#hiprint-printTemplate', { grid: true })
// 获取当前放大比例, 当zoom时传true 才会有
this.scaleValue = hiprintTemplate.editingPanel.scale || 1;
// this.scaleValue = hiprintTemplate.editingPanel.scale || 1
});
},
/**
* 设置纸张大小
* @param type [A3, A4, A5, B3, B4, B5, other]
* @param value {width,height} mm
*/
setPaper(type, value) {
try {
if (Object.keys(this.paperTypes).includes(type)) {
this.curPaper = {
type: type,
width: value.width,
height: value.height,
};
hiprintTemplate.setPaper(value.width, value.height);
} else {
this.curPaper = {
type: 'other',
width: value.width,
height: value.height,
};
hiprintTemplate.setPaper(value.width, value.height);
}
} catch (error) {
this.$message.error(`操作失败: ${error}`);
}
},
changeScale(currentValue, oldValue) {
let big = false;
currentValue <= oldValue ? (big = false) : (big = true);
let scaleValue = this.scaleValue;
if (big) {
scaleValue += 0.1;
if (scaleValue > this.scaleMax) scaleValue = 5;
} else {
scaleValue -= 0.1;
if (scaleValue < this.scaleMin) scaleValue = 0.5;
}
if (hiprintTemplate) {
// scaleValue: 放大缩小值, false: 不保存(不传也一样), 如果传 true, 打印时也会放大
hiprintTemplate.zoom(scaleValue);
this.scaleValue = scaleValue;
}
},
clearPaper() {
MessageBox.confirm('是否确认清空模板信息?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
try {
hiprintTemplate.clear();
} catch (error) {
this.$message.error(`操作失败: ${error}`);
}
})
.catch((err) => {
console.log(err);
});
},
otherPaper() {
const value = {};
value.width = this.paperWidth;
value.height = this.paperHeight;
this.paperPopVisible = false;
this.setPaper('other', value);
},
rotatePaper() {
if (hiprintTemplate) {
hiprintTemplate.rotatePaper();
}
},
preView() {
const { width } = this.curPaper;
this.$refs.preView.show(hiprintTemplate, this.printData, width);
},
print() {
// if (window.hiwebSocket.opened) {
const printerList = hiprintTemplate.getPrinterList();
console.log(printerList);
hiprintTemplate.print2(this.printData, {
printer: '',
title: '预览打印',
});
// return
// }
// this.$message.error('客户端未连接,无法直接打印')
},
save() {
// console.log(hiprintTemplate.getJson())
const { mode } = this;
const provider = providers[mode];
// console.log(hiprintTemplate.getJson())
this.setTemplate({
name: provider.value,
json: hiprintTemplate.getJson(),
});
},
setTemplate(payload) {
// const templates = this.$ls.get('KEY_TEMPLATES', {})
// console.log(payload.json)
// templates[payload.name] = payload.json
// this.$ls.set('KEY_TEMPLATES', templates)
this.$message.info('保存成功');
// console.log(JSON.stringify(payload.json))
this.drawer = false;
this.$emit('saveData', payload.json);
$('.hiprintEpContainer').empty();
// this.$parent.$parent.getModelData(payload.json)
},
},
};
</script>
<style lang="scss" scoped>
// build 拖拽
::v-deep .hiprint-printElement-type >li>ul>li>a {
padding: 4px 4px;
color: #1296db;
line-height: 1;
height: auto;
text-overflow: ellipsis;
::v-deep .hiprint-printElement-type > li > ul > li > a {
padding: 4px 4px;
color: #1296db;
line-height: 1;
height: auto;
text-overflow: ellipsis;
}
// 设计容器
.card-design {
// overflow: hidden;
overflow-x: auto;
overflow-y: auto;
// overflow: hidden;
overflow-x: auto;
overflow-y: auto;
}
</style>

View File

@@ -2,7 +2,7 @@
* @Author: zwq
* @Date: 2021-11-18 14:16:25
* @LastEditors: DY
* @LastEditTime: 2024-03-21 15:21:32
* @LastEditTime: 2024-04-11 16:22:19
* @Description:
-->
<template>
@@ -121,15 +121,15 @@
</el-row>
</el-form>
</div>
<div class="attr-list" v-if="idAttrShow">
<div class="attr-list" v-if="idAttrShow && this.$auth.hasPermi('base:material-attr:query')">
<small-title
style="margin: 16px 0; padding-left: 8px"
:no-padding="true">
物料属性
</small-title>
<div v-if="!isdetail" class="action_btn">
<div v-if="!isdetail && this.$auth.hasPermi('base:material-attr:create')" class="action_btn">
<template>
<span style="display: inline-block;">
<el-button type="text" @click="addNew()" icon="el-icon-plus">新增</el-button>
@@ -182,16 +182,23 @@ import { parseTime } from '../../core/mixins/code-filter';
import attrAdd from './attr-add';
import { getDictDatas } from "@/utils/dict";
const tableBtn = [
{
type: 'edit',
btnName: '编辑',
},
{
type: 'delete',
btnName: '删除',
},
];
// const tableBtn = [
// this.$auth.hasPermiAnd([
// 'base:material-attr:create',
// 'base:material-attr:update'
// ]) ?
// {
// type: 'edit',
// btnName: '编辑',
// }
// : undefined,
// this.$auth.hasPermi('base:material-attr:delete') ?
// {
// type: 'delete',
// btnName: '删除',
// }
// : undefined,
// ];
const tableProps = [
{
prop: 'createTime',
@@ -213,7 +220,23 @@ export default {
components: { SmallTitle, attrAdd },
data() {
return {
tableBtn,
tableBtn: [
this.$auth.hasPermiAnd([
'base:material-attr:create',
'base:material-attr:update'
]) ?
{
type: 'edit',
btnName: '编辑',
}
: undefined,
this.$auth.hasPermi('base:material-attr:delete') ?
{
type: 'delete',
btnName: '删除',
}
: undefined,
],
tableProps,
addOrUpdateVisible: false,
urlOptions: {

View File

@@ -9,7 +9,8 @@
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-data="tableData">
:table-data="tableData"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
@@ -40,6 +41,7 @@ import {
} from '@/api/base/material';
import { listData } from "@/api/system/dict/data";
import { publicFormatter } from '@/utils/dict';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
@@ -75,7 +77,7 @@ const tableProps = [
];
export default {
mixins: [basicPage],
mixins: [basicPage, tableHeightMixin],
data() {
return {
urlOptions: {
@@ -132,7 +134,7 @@ export default {
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermi('base:material:create') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:material:create') ? 'button' : '',

View File

@@ -2,7 +2,7 @@
* @Author: zwq
* @Date: 2021-11-18 14:16:25
* @LastEditors: DY
* @LastEditTime: 2024-03-21 14:39:52
* @LastEditTime: 2024-04-11 16:44:41
* @Description:
-->
<template>
@@ -56,14 +56,14 @@
</el-row>
</el-form>
</div>
<div class="attr-list" v-if="idAttrShow">
<div class="attr-list" v-if="idAttrShow && $auth.hasPermiAnd(['base:material-product-bom:query', 'base:material-product-bom-det:query'])">
<small-title
style="margin: 16px 0; padding-left: 8px"
:no-padding="true">
BOM明细
</small-title>
<div v-if="!isdetail" class="action_btn">
<div v-if="!isdetail && $auth.hasPermi('base:material-product-bom:create')" class="action_btn">
<template>
<span style="display: inline-block;">
<el-button type="text" @click="addNew()" icon="el-icon-plus">添加</el-button>
@@ -116,16 +116,16 @@ import { parseTime } from '../../core/mixins/code-filter';
import attrAdd from './attr-add';
import { publicFormatter } from '@/utils/dict';
const tableBtn = [
{
type: 'edit',
btnName: '编辑',
},
{
type: 'delete',
btnName: '删除',
},
];
// const tableBtn = [
// {
// type: 'edit',
// btnName: '编辑',
// },
// {
// type: 'delete',
// btnName: '删除',
// },
// ];
const tableProps = [
{
prop: 'createTime',
@@ -160,7 +160,24 @@ export default {
components: { SmallTitle, attrAdd },
data() {
return {
tableBtn,
tableBtn: [
this.$auth.hasPermiAnd([
'base:material-product-bom:update',
'base:material-product-bom-det:create',
'base:material-product-bom-det:update'
]) ?
{
type: 'edit',
btnName: '编辑',
}
: undefined,
this.$auth.hasPermi('base:material-product-bom:delete') ?
{
type: 'delete',
btnName: '删除',
}
: undefined,
],
tableProps,
addOrUpdateVisible: false,
urlOptions: {

View File

@@ -9,7 +9,8 @@
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-data="tableData">
:table-data="tableData"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
@@ -38,6 +39,7 @@ import {
getMaterialPBPage,
deleteMaterialPB
} from '@/api/base/materialProductBom';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
@@ -55,7 +57,7 @@ const tableProps = [
];
export default {
mixins: [basicPage],
mixins: [basicPage, tableHeightMixin],
components: {
AddOrUpdate,
},
@@ -108,7 +110,7 @@ export default {
color: 'primary',
},
{
type: 'separate',
type: this.$auth.hasPermi('base:material:create') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:material:create') ? 'button' : '',

View File

@@ -2,38 +2,21 @@
* @Author: zwq
* @Date: 2023-08-01 14:55:51
* @LastEditors: zhp
* @LastEditTime: 2024-02-28 10:38:34
* @LastEditTime: 2024-04-10 16:34:40
* @Description:
-->
<template>
<div class="app-container">
<search-bar
:formConfigs="formConfig"
ref="searchBarForm"
@headBtnClick="buttonClick" />
<base-table
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-data="tableData">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="120"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick" />
</base-table>
<pagination
:limit.sync="listQuery.pageSize"
:page.sync="listQuery.pageNo"
:total="listQuery.total"
@pagination="getDataList" />
<add-or-update
v-if="addOrUpdateVisible"
ref="addOrUpdate"
@refreshDataList="getDataList" />
</div>
<div class="app-container">
<search-bar :formConfigs="formConfig" ref="searchBarForm" @headBtnClick="buttonClick" />
<base-table :max-height="tableH" :table-props="tableProps" :page="listQuery.pageNo" :limit="listQuery.pageSize"
:table-data="tableData">
<method-btn v-if="tableBtn.length" slot="handleBtn" :width="120" label="操作" :method-list="tableBtn"
@clickBtn="handleClick" />
</base-table>
<pagination :limit.sync="listQuery.pageSize" :page.sync="listQuery.pageNo" :total="listQuery.total"
@pagination="getDataList" />
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList" />
</div>
</template>
<script>
@@ -41,6 +24,7 @@ import AddOrUpdate from './add-or-updata';
// import unitDict from './unitDict';
import basicPage from '../mixins/basic-page';
import { parseTime } from '../mixins/code-filter';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
import {
getPackingModel,
} from '@/api/base/printModel.js'
@@ -91,7 +75,7 @@ const tableProps = [
];
export default {
mixins: [basicPage],
mixins: [basicPage, tableHeightMixin],
data() {
return {
urlOptions: {
@@ -144,7 +128,7 @@ export default {
param: 'createTime',
},
{
type: 'button',
type: this.$auth.hasPermi('base:packaging-print-log:query') ? 'button' : '',
btnName: '搜索',
name: 'search',
color: 'primary',
@@ -157,8 +141,8 @@ export default {
// btnName: '重置',
// name: 'reset',
// },
{
type: 'separate',
{
type: this.$auth.hasPermi('base:packaging-print-log:create') ? 'separate' : '',
},
{
type: this.$auth.hasPermi('base:packaging-print-log:create') ? 'button' : '',
@@ -314,7 +298,7 @@ export default {
switch (val.btnName) {
case 'search':
this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10;
this.listQuery.pageSize = 20;
this.listQuery.workOrderId = val.workOrderId;
if (val.createTime && val.createTime.length != 0) {
this.listQuery.createTime = val.createTime
@@ -329,7 +313,7 @@ export default {
case 'reset':
this.$refs.searchBarForm.resetForm();
this.listQuery = {
pageSize: 10,
pageSize: 20,
pageNo: 1,
total: 1,
};

View File

@@ -0,0 +1,45 @@
<template>
<div class="tableInner">
<el-input
v-if="list.isEdit"
type="number"
v-model="list[itemProp]"
@blur="changeInput" />
<span v-else>{{ list[itemProp] }}</span>
</div>
</template>
<script>
export default {
name: 'InputArea',
props: {
injectData: {
type: Object,
default: () => ({}),
},
itemProp: {
type: String,
},
},
data() {
return {
list: {},
};
},
mounted() {
this.initData();
},
watch: {
injectData() {
this.initData();
},
},
methods: {
initData() {
this.list = this.injectData;
},
changeInput() {
this.$emit('emitData', this.list);
},
},
};
</script>

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