mirror of
https://gitee.com/ThingsGateway/ThingsGateway.git
synced 2025-10-23 20:13:22 +08:00
Compare commits
791 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
211a8e093e | ||
|
|
84010a51d6 | ||
|
|
e9700ea19b | ||
|
|
e81ec68072 | ||
|
|
6096e97708 | ||
|
|
6f302b66b4 | ||
|
|
b6e41890f7 | ||
|
|
be5332a048 | ||
|
|
4d72aeb0cd | ||
|
|
c7c3c35100 | ||
|
|
2f0df3c552 | ||
|
|
e6effcd921 | ||
|
|
cd462b9523 | ||
|
|
7e2e17d38b | ||
|
|
665d616a06 | ||
|
|
ced90f5bb9 | ||
|
|
ca0ddb6cb4 | ||
|
|
3d733813e1 | ||
|
|
45ddc0b154 | ||
|
|
87294497f3 | ||
|
|
5f45f9c0d0 | ||
|
|
7f78c06793 | ||
|
|
8ea5b7eebc | ||
|
|
e49cd511af | ||
|
|
15c88646df | ||
|
|
f47919543d | ||
|
|
a95291d9cd | ||
|
|
033deb3d29 | ||
|
|
923994c1f4 | ||
|
|
3d45b839b4 | ||
|
|
55d1efa212 | ||
|
|
21d794a0e5 | ||
|
|
614022a78c | ||
|
|
c00688e23a | ||
|
|
5c69917d19 | ||
|
|
6a5eb75b6c | ||
|
|
727c55eaa2 | ||
|
|
9b03173ec5 | ||
|
|
ab95855d6d | ||
|
|
bb84594c6b | ||
|
|
97392c76b1 | ||
|
|
53aec2b306 | ||
|
|
a0a381dc63 | ||
|
|
4fa95edeec | ||
|
|
b944f1d70e | ||
|
|
0f1a5d0085 | ||
|
|
e7e10222e7 | ||
|
|
87c4fda588 | ||
|
|
0ff820de6f | ||
|
|
0dcf55e6d9 | ||
|
|
a69842c910 | ||
|
|
318f635e4d | ||
|
|
abf0d72316 | ||
|
|
5cd89c8844 | ||
|
|
501c1af38c | ||
|
|
8526e130d9 | ||
|
|
76fd08eade | ||
|
|
bfe48ae9d2 | ||
|
|
8547cdba7c | ||
|
|
00d0cd631d | ||
|
|
04460d13cd | ||
|
|
a17a15e5d7 | ||
|
|
bfe2465658 | ||
|
|
4568987785 | ||
|
|
c0e5a1419d | ||
|
|
23ac7ab748 | ||
|
|
5622dc74a8 | ||
|
|
528986f4f0 | ||
|
|
e6b8ff3f91 | ||
|
|
3fc3c5296f | ||
|
|
f4f2a14a31 | ||
|
|
fa3f464cb6 | ||
|
|
bed20538ae | ||
|
|
3da461c6e6 | ||
|
|
9c73e8452a | ||
|
|
750dab69d3 | ||
|
|
702d0da47c | ||
|
|
3a955b1e53 | ||
|
|
d408bd93e8 | ||
|
|
63fd9eb1de | ||
|
|
4718ab6ddf | ||
|
|
affd4b3a26 | ||
|
|
6a660dbcda | ||
|
|
5ff3af8b48 | ||
|
|
9d49070f93 | ||
|
|
5b3994a1dd | ||
|
|
bb1e62c580 | ||
|
|
29cc776908 | ||
|
|
d2ef60b2ec | ||
|
|
41ea496d41 | ||
|
|
c69bb38929 | ||
|
|
23b3f8494e | ||
|
|
0ff94eec1b | ||
|
|
f67a638565 | ||
|
|
778cf71c61 | ||
|
|
e2da083b48 | ||
|
|
dcc48c0d4b | ||
|
|
2446b4a591 | ||
|
|
a973d633c8 | ||
|
|
c3b11e6e0f | ||
|
|
44bec2d99e | ||
|
|
0d59d0a3f6 | ||
|
|
ddc8372b09 | ||
|
|
ea7325f4e0 | ||
|
|
6048f95415 | ||
|
|
5682705b8d | ||
|
|
6c3b82607d | ||
|
|
486c9f4ebf | ||
|
|
7c8adebf2d | ||
|
|
ce98bb0dc1 | ||
|
|
60b49a4296 | ||
|
|
5d0a2ffae0 | ||
|
|
bbcf7c722a | ||
|
|
66574eec6d | ||
|
|
305df3a42c | ||
|
|
323c6f4270 | ||
|
|
c056b2b14c | ||
|
|
02ebb07fd8 | ||
|
|
59db0890c3 | ||
|
|
3ea0d9ed3a | ||
|
|
0371d11dd5 | ||
|
|
12f1ebaee9 | ||
|
|
5202cc22d1 | ||
|
|
07a34bdcbf | ||
|
|
27806da4be | ||
|
|
a15dd1a3ce | ||
|
|
6cc7451c7c | ||
|
|
652aeee782 | ||
|
|
8e1e887b8f | ||
|
|
6601a2de64 | ||
|
|
75a42ffc32 | ||
|
|
8a80a52f5f | ||
|
|
b373a434ba | ||
|
|
cd78fdafe6 | ||
|
|
7a1b4c6db7 | ||
|
|
f2c7664033 | ||
|
|
12b295f067 | ||
|
|
3ee46da40f | ||
|
|
beadaa7212 | ||
|
|
16ef09426f | ||
|
|
b8c1f1f5a9 | ||
|
|
e027b5cbd6 | ||
|
|
bf1bd73ad1 | ||
|
|
86fc95119a | ||
|
|
b3a76ea17b | ||
|
|
bababd9d53 | ||
|
|
8cd5180531 | ||
|
|
f1ccbade8c | ||
|
|
a66f4b0417 | ||
|
|
ff495b2261 | ||
|
|
90e5824212 | ||
|
|
3d64021062 | ||
|
|
fb8ed7428d | ||
|
|
bdc273c10a | ||
|
|
2d96cffdc7 | ||
|
|
4356fccbcd | ||
|
|
a169fd4ce7 | ||
|
|
dcd418139e | ||
|
|
0cac2062d3 | ||
|
|
854c5d4ade | ||
|
|
0f96c6ec84 | ||
|
|
b219bd66c1 | ||
|
|
cb52f2c0b3 | ||
|
|
d3273e03ef | ||
|
|
afbfd963f3 | ||
|
|
2cd101c5f3 | ||
|
|
b10bc24dee | ||
|
|
51a23df861 | ||
|
|
03a0a9dad9 | ||
|
|
362c0affbe | ||
|
|
d5b523479f | ||
|
|
7719b8f6d7 | ||
|
|
3656c0d524 | ||
|
|
8b9e0dd6ea | ||
|
|
b3921b1037 | ||
|
|
d7d96e5dbf | ||
|
|
3934395b7b | ||
|
|
04fbe9a529 | ||
|
|
badd6dd9a2 | ||
|
|
059082456d | ||
|
|
405b68e22f | ||
|
|
c90bf6692c | ||
|
|
b5ea5d0cc5 | ||
|
|
243617a1e1 | ||
|
|
9e703edd59 | ||
|
|
d6c2cf2810 | ||
|
|
ae7811acfa | ||
|
|
e55731c099 | ||
|
|
9df5c74da4 | ||
|
|
8b75f9f785 | ||
|
|
bf12428cf4 | ||
|
|
b551df978b | ||
|
|
c91d85d2f0 | ||
|
|
965237fa1f | ||
|
|
24cd9afc06 | ||
|
|
602fdefebd | ||
|
|
7e7818aa17 | ||
|
|
27a6023a6a | ||
|
|
3861879900 | ||
|
|
807eeb8351 | ||
|
|
045fa53d58 | ||
|
|
69d405ece7 | ||
|
|
d3dc4d0c5b | ||
|
|
7beba1188e | ||
|
|
9779ebe12c | ||
|
|
f72cfaa093 | ||
|
|
cf8ccafb4a | ||
|
|
7fe281b0b8 | ||
|
|
5f70e9574f | ||
|
|
4be51923ba | ||
|
|
a72c78f4a4 | ||
|
|
b4d32a6de1 | ||
|
|
8a6b2d5daa | ||
|
|
bebadeef14 | ||
|
|
3551be67f0 | ||
|
|
1103950b25 | ||
|
|
9d06e01cec | ||
|
|
24be946b7e | ||
|
|
f56d2fc60f | ||
|
|
9f8356f409 | ||
|
|
8e6345d938 | ||
|
|
0eac78bd1c | ||
|
|
21db2502d0 | ||
|
|
38c3492123 | ||
|
|
6376bff476 | ||
|
|
38495a3ebc | ||
|
|
cf00897be2 | ||
|
|
da640f24ec | ||
|
|
ed6a777c42 | ||
|
|
81af4485d3 | ||
|
|
94d8f0237d | ||
|
|
c5e579dd38 | ||
|
|
7865e76ee2 | ||
|
|
4d37212cc0 | ||
|
|
9ca43f0bb4 | ||
|
|
fe8d262175 | ||
|
|
493d6e7165 | ||
|
|
17b630bcd8 | ||
|
|
018c5ad3b4 | ||
|
|
a14b4da977 | ||
|
|
01b4597cc7 | ||
|
|
0b083ccc1c | ||
|
|
ca22cb0eae | ||
|
|
bcbb8e5f8c | ||
|
|
bea286cdd4 | ||
|
|
892d2ee8d2 | ||
|
|
7440608c14 | ||
|
|
6246f0295b | ||
|
|
53c39d9b43 | ||
|
|
9a50b60031 | ||
|
|
fd74527320 | ||
|
|
f91fb522ac | ||
|
|
7019c02b18 | ||
|
|
94f8422b9b | ||
|
|
b25c01567a | ||
|
|
b9329885de | ||
|
|
ac88c4cff9 | ||
|
|
9674f2d238 | ||
|
|
38c9ecb6f1 | ||
|
|
be9e9cdd5a | ||
|
|
afdaf07446 | ||
|
|
5caaf10225 | ||
|
|
daffc3a776 | ||
|
|
34c9748ce5 | ||
|
|
f17acbf4d1 | ||
|
|
229f56ce2f | ||
|
|
0847bedc51 | ||
|
|
9e4546c305 | ||
|
|
97b01bf26a | ||
|
|
e7011628d0 | ||
|
|
044ffdecbd | ||
|
|
1a06a3543b | ||
|
|
5fedc0bf1e | ||
|
|
7a881f867e | ||
|
|
dfe73a6cfb | ||
|
|
45d0fb27ad | ||
|
|
31890af61d | ||
|
|
a54b3ecc15 | ||
|
|
c37cd1bd51 | ||
|
|
0e3ee89cbf | ||
|
|
a049176c14 | ||
|
|
5ef2b0089e | ||
|
|
1cc4899593 | ||
|
|
26d1390be9 | ||
|
|
dc65584fb3 | ||
|
|
b3d5a708d5 | ||
|
|
904a5d296b | ||
|
|
cc82e6a47a | ||
|
|
a9d02ec854 | ||
|
|
6b5a2d3767 | ||
|
|
10d9060b94 | ||
|
|
8441839c01 | ||
|
|
b669f5838f | ||
|
|
1a942f9ce1 | ||
|
|
ae840758f7 | ||
|
|
082c08e5f9 | ||
|
|
74a43557ab | ||
|
|
184271789d | ||
|
|
fa61b0cad8 | ||
|
|
7b197a90d1 | ||
|
|
62384af2f6 | ||
|
|
b466202a1a | ||
|
|
7ab38c18d8 | ||
|
|
39841ee43e | ||
|
|
e419800d98 | ||
|
|
63c99ab69a | ||
|
|
e2a8fd2279 | ||
|
|
bbde520471 | ||
|
|
45fb12f98e | ||
|
|
4be3dcce50 | ||
|
|
d12a41c769 | ||
|
|
ed9a58c9ed | ||
|
|
4389cea5a1 | ||
|
|
d24854920b | ||
|
|
9902443bee | ||
|
|
8040b2ef16 | ||
|
|
4533680b10 | ||
|
|
3b28175135 | ||
|
|
8e22812265 | ||
|
|
409bc91b9e | ||
|
|
61fe543a2a | ||
|
|
8a949a7e64 | ||
|
|
b0dc9fb97a | ||
|
|
83114d1002 | ||
|
|
94a25a903f | ||
|
|
4f402f9e55 | ||
|
|
27bb2e3dcc | ||
|
|
66cc52f6ec | ||
|
|
ed1367b116 | ||
|
|
5c055352e4 | ||
|
|
8dcff5ada1 | ||
|
|
4b8b23d7d5 | ||
|
|
e576f6aed3 | ||
|
|
97ab04da91 | ||
|
|
c6361bb36e | ||
|
|
b0b3dc225d | ||
|
|
9cbaba192a | ||
|
|
f511598e13 | ||
|
|
5ffff3b7aa | ||
|
|
24c4fa1c4f | ||
|
|
7f312c1273 | ||
|
|
ef5c226c81 | ||
|
|
3f029cf799 | ||
|
|
5bf64a8bec | ||
|
|
89f9c537f8 | ||
|
|
e8d7f57818 | ||
|
|
9b42fa78e7 | ||
|
|
96d98e8f39 | ||
|
|
1f3a281e78 | ||
|
|
dab4b66ee0 | ||
|
|
64dd192ddb | ||
|
|
b0a5c383d0 | ||
|
|
4836cc99eb | ||
|
|
ba33873354 | ||
|
|
12c838cab0 | ||
|
|
a83a1c83a7 | ||
|
|
2234f47170 | ||
|
|
4bae1b17fc | ||
|
|
6a7a0e0fa6 | ||
|
|
bff987c55f | ||
|
|
e467006913 | ||
|
|
1d646d4a6d | ||
|
|
70bd4936a1 | ||
|
|
5ae7add6d2 | ||
|
|
02b206ce7c | ||
|
|
2ea626a567 | ||
|
|
653909ec11 | ||
|
|
1d7c148eaf | ||
|
|
94a7e130ca | ||
|
|
609abacdf0 | ||
|
|
033ff2e49a | ||
|
|
00a9bf0641 | ||
|
|
100f322456 | ||
|
|
2251e08d30 | ||
|
|
14e9beef53 | ||
|
|
c7cce23d54 | ||
|
|
7becf32352 | ||
|
|
741eda9f4e | ||
|
|
473f51481c | ||
|
|
684f9bd11b | ||
|
|
b4b7f0c360 | ||
|
|
cf42d02628 | ||
|
|
cc9a9eab7b | ||
|
|
784d6abc9b | ||
|
|
0eafc07184 | ||
|
|
7e9499bd2e | ||
|
|
d01a52aa95 | ||
|
|
6bcd492980 | ||
|
|
96b15da04b | ||
|
|
e0f1801693 | ||
|
|
d195ad85c5 | ||
|
|
773f7b6c1b | ||
|
|
40f29fe399 | ||
|
|
b19eb117c1 | ||
|
|
f930ba5eff | ||
|
|
fbbda6c230 | ||
|
|
47db4968e5 | ||
|
|
1aff2e518c | ||
|
|
24134ca49e | ||
|
|
aadbe05a5e | ||
|
|
18eddf4700 | ||
|
|
0869ba7e70 | ||
|
|
cba5db1c53 | ||
|
|
0aa5430e23 | ||
|
|
88a91828cb | ||
|
|
27af89f5fe | ||
|
|
6f6d483bfe | ||
|
|
915072c191 | ||
|
|
76077b92ae | ||
|
|
f0d1a527a5 | ||
|
|
fdb2a96d1c | ||
|
|
849e3ac187 | ||
|
|
5c4cf21c59 | ||
|
|
40ee3e5d9b | ||
|
|
77a7cc034e | ||
|
|
82b7881765 | ||
|
|
3515775267 | ||
|
|
10e12aa1c1 | ||
|
|
7fb4e62aa3 | ||
|
|
2605eaa614 | ||
|
|
8e97b4820d | ||
|
|
89af4cdb68 | ||
|
|
6099c1a25a | ||
|
|
fd23758aea | ||
|
|
8ad0b89db1 | ||
|
|
e7dffa3ff4 | ||
|
|
2772b5d2e2 | ||
|
|
df6d9b5f70 | ||
|
|
c9622d6d57 | ||
|
|
1f0b7c3c7e | ||
|
|
c12245037e | ||
|
|
fe6d2a50a5 | ||
|
|
7be84950f8 | ||
|
|
ba212da222 | ||
|
|
122b833256 | ||
|
|
7c73479041 | ||
|
|
151f2e99ae | ||
|
|
da367e813f | ||
|
|
9143dfe336 | ||
|
|
29914d6a72 | ||
|
|
0dbef72a97 | ||
|
|
3bb118bfe1 | ||
|
|
85ce3be077 | ||
|
|
064c2bf0a8 | ||
|
|
c96d06ccc5 | ||
|
|
a658dbb753 | ||
|
|
bf5d5b629e | ||
|
|
241d576519 | ||
|
|
7807e9bdd0 | ||
|
|
fcbf15fed6 | ||
|
|
cd90a11209 | ||
|
|
ff65707ea2 | ||
|
|
b16026070c | ||
|
|
1b5fbf86d8 | ||
|
|
5eb1be8101 | ||
|
|
6a863cd26a | ||
|
|
87ebb7b6c7 | ||
|
|
1233a74307 | ||
|
|
221890acfb | ||
|
|
687c7e766e | ||
|
|
ba22c407d3 | ||
|
|
a8b9ed56b5 | ||
|
|
3004869e19 | ||
|
|
1145853fe1 | ||
|
|
f1617a25b1 | ||
|
|
932be558d9 | ||
|
|
ee3a37d3b9 | ||
|
|
5ac412a582 | ||
|
|
1625290bc3 | ||
|
|
1ec169ad49 | ||
|
|
53be552e44 | ||
|
|
d3a75d46b9 | ||
|
|
256512c961 | ||
|
|
5c12ac5bcc | ||
|
|
02a2bcb113 | ||
|
|
1f0a01c725 | ||
|
|
6ea164ede1 | ||
|
|
65bae85ecc | ||
|
|
2fd7dcf4d0 | ||
|
|
aa3bbbe038 | ||
|
|
6cb09a6f95 | ||
|
|
45868f05d3 | ||
|
|
aac7401e20 | ||
|
|
c2fc290edd | ||
|
|
330357fc36 | ||
|
|
f4a3d6a64e | ||
|
|
2e0963ec81 | ||
|
|
897cb6e62a | ||
|
|
80868bd48e | ||
|
|
b3df78c56f | ||
|
|
783a4259e3 | ||
|
|
fcf19b8dc8 | ||
|
|
1f9f89817d | ||
|
|
7b94da7d85 | ||
|
|
164406f6c2 | ||
|
|
90ef2adc6b | ||
|
|
d65f10f88b | ||
|
|
dca0ece9e0 | ||
|
|
baabc155c8 | ||
|
|
7eb94412d6 | ||
|
|
0fc8b24f85 | ||
|
|
88f6ef5b96 | ||
|
|
7442483419 | ||
|
|
9c61933c04 | ||
|
|
2b36a99720 | ||
|
|
c2cfc42ba4 | ||
|
|
4f32704e08 | ||
|
|
fccf43685f | ||
|
|
39135d81ad | ||
|
|
ff4b10681e | ||
|
|
10b7908fc2 | ||
|
|
31790da8c6 | ||
|
|
4621201c47 | ||
|
|
692ac31dbf | ||
|
|
ed1d163d55 | ||
|
|
e931c9040c | ||
|
|
f23cb48ea4 | ||
|
|
c3b2b6b07b | ||
|
|
f89bf590ba | ||
|
|
fea17dc00b | ||
|
|
dbb1069920 | ||
|
|
afc4ccfaa9 | ||
|
|
38d55a1c07 | ||
|
|
5fca29f103 | ||
|
|
78f34b2ca4 | ||
|
|
8e8028e809 | ||
|
|
8dc70687f8 | ||
|
|
fa22f9ee64 | ||
|
|
b33c0d3f81 | ||
|
|
339009add4 | ||
|
|
798c823c4b | ||
|
|
14ad86f2a3 | ||
|
|
a3a714dc17 | ||
|
|
e8d8b0d41d | ||
|
|
17daad8f89 | ||
|
|
e178263b3b | ||
|
|
4febbc261e | ||
|
|
ef3a6942fd | ||
|
|
f8ac2be62b | ||
|
|
25447c34e5 | ||
|
|
37cdf8fd48 | ||
|
|
ac8e7dc959 | ||
|
|
8293382840 | ||
|
|
d85a3e7743 | ||
|
|
f3f5ffb5c8 | ||
|
|
99e6702c62 | ||
|
|
e143c25078 | ||
|
|
3fb67972be | ||
|
|
61c04d4e09 | ||
|
|
b22f728958 | ||
|
|
112be7e383 | ||
|
|
6a7f83fed5 | ||
|
|
4b9698a735 | ||
|
|
ec3d203a6d | ||
|
|
e77b8f5475 | ||
|
|
da8bbd321f | ||
|
|
98fd011def | ||
|
|
9dccbc5316 | ||
|
|
03fa26daf9 | ||
|
|
fbc41e3895 | ||
|
|
f1a6d0c02c | ||
|
|
67f6bb7155 | ||
|
|
86282f596c | ||
|
|
e0f24c795c | ||
|
|
7d44ed860c | ||
|
|
091094a24c | ||
|
|
ba18ee518c | ||
|
|
513a031691 | ||
|
|
cc79de1106 | ||
|
|
bd90e8efb2 | ||
|
|
4bd88ff11d | ||
|
|
d27ee61292 | ||
|
|
0c20b3345f | ||
|
|
0f3c8c7193 | ||
|
|
16761ec605 | ||
|
|
1069440cda | ||
|
|
60f5702f17 | ||
|
|
ee70133e47 | ||
|
|
06a9fdeb2e | ||
|
|
f14bd62004 | ||
|
|
67cbaf22b7 | ||
|
|
60b166dba2 | ||
|
|
66e1647ede | ||
|
|
a1a35c00a5 | ||
|
|
b02e3361c4 | ||
|
|
2b9ceaa25a | ||
|
|
109b5a9755 | ||
|
|
cc4df86c10 | ||
|
|
e93532c395 | ||
|
|
6ff688326a | ||
|
|
eda5d2872f | ||
|
|
dc88394f5f | ||
|
|
ec85c9a2c6 | ||
|
|
1341638556 | ||
|
|
4875dfee11 | ||
|
|
d834ba8bd4 | ||
|
|
6191067771 | ||
|
|
6c3a571163 | ||
|
|
5efb07e10e | ||
|
|
b25ec18ce6 | ||
|
|
f3cd281241 | ||
|
|
58b93cbf4c | ||
|
|
57fc0349ff | ||
|
|
d0a2cea772 | ||
|
|
58d5801fb5 | ||
|
|
e5f2e59798 | ||
|
|
1166921057 | ||
|
|
aeb49576f2 | ||
|
|
7ef1fecef8 | ||
|
|
fd630373b5 | ||
|
|
d365d8f170 | ||
|
|
dfa5e1172f | ||
|
|
daf195898a | ||
|
|
c61c0a39cf | ||
|
|
6137e6baa5 | ||
|
|
fd16fd9ffe | ||
|
|
2b8bd5f2cc | ||
|
|
d312c2e9e7 | ||
|
|
578b0d2268 | ||
|
|
ffb41b0109 | ||
|
|
c63fb5d796 | ||
|
|
8caee732e8 | ||
|
|
df5381adce | ||
|
|
f34836b7fa | ||
|
|
44b459883a | ||
|
|
14a8592ae3 | ||
|
|
787d0dce4a | ||
|
|
8be05ff93d | ||
|
|
3014af565c | ||
|
|
315252bdc4 | ||
|
|
c36c3b4607 | ||
|
|
7d5e939bab | ||
|
|
f75c9d1eed | ||
|
|
38cb9855ea | ||
|
|
ed8b56d624 | ||
|
|
bca48b13ae | ||
|
|
29426edb05 | ||
|
|
33a2dc687f | ||
|
|
e2398a21b2 | ||
|
|
f19530276e | ||
|
|
2b9b92a78c | ||
|
|
99c55dac10 | ||
|
|
25667e46f9 | ||
|
|
2f4e8f2399 | ||
|
|
9169183769 | ||
|
|
c420f50831 | ||
|
|
c6c9279ef4 | ||
|
|
c125e2991d | ||
|
|
5348b19d6a | ||
|
|
afd426daac | ||
|
|
202c511cfa | ||
|
|
651eb295a4 | ||
|
|
d798aaed33 | ||
|
|
63ef347cc9 | ||
|
|
3139b2d5a0 | ||
|
|
2c80bbb244 | ||
|
|
af06755ada | ||
|
|
97d6dbaa6c | ||
|
|
74cf82a1c7 | ||
|
|
74634889ab | ||
|
|
dbe30fcd77 | ||
|
|
24a7f3a320 | ||
|
|
d3650f1145 | ||
|
|
4801db9050 | ||
|
|
6445281658 | ||
|
|
87719f5938 | ||
|
|
5ba1ec433b | ||
|
|
7c5b382458 | ||
|
|
8960426128 | ||
|
|
e1d47d5a92 | ||
|
|
9407c272aa | ||
|
|
bccbd7b400 | ||
|
|
a24dc010ec | ||
|
|
c5e5d50fb8 | ||
|
|
be1c520320 | ||
|
|
3d18d0f893 | ||
|
|
c3351a38a6 | ||
|
|
0b86340a8d | ||
|
|
829371b032 | ||
|
|
b342207bc7 | ||
|
|
58f4fdced3 | ||
|
|
253844cbcf | ||
|
|
e2e2b9ffb4 | ||
|
|
2568042f5f | ||
|
|
722edf4b9a | ||
|
|
e406d364e4 | ||
|
|
31c37f41b2 | ||
|
|
6cd879bbc5 | ||
|
|
b7974050fe | ||
|
|
e9c9d0816e | ||
|
|
a437692e1a | ||
|
|
2a14d2f3c8 | ||
|
|
559e2d1889 | ||
|
|
a1aa919f80 | ||
|
|
cbccb27a5a | ||
|
|
bbad36d576 | ||
|
|
df6c9d55b5 | ||
|
|
36a1d9c364 | ||
|
|
1f3681d5ac | ||
|
|
0159f8e53f | ||
|
|
0432be64fc | ||
|
|
481e062961 | ||
|
|
72b8abdeb6 | ||
|
|
7ec3ee41d1 | ||
|
|
b765fa4769 | ||
|
|
06685b162e | ||
|
|
7bcad7c424 | ||
|
|
6e054b3cc6 | ||
|
|
e643f6b0f8 | ||
|
|
e44c0f85c2 | ||
|
|
ea66e968eb | ||
|
|
f7e73d804e | ||
|
|
2ff4df56a1 | ||
|
|
346c45fe0c | ||
|
|
f98b42a36e | ||
|
|
f77a0a266c | ||
|
|
0be672788f | ||
|
|
e2e3d11d42 | ||
|
|
bb127bb567 | ||
|
|
8eb4f89db8 | ||
|
|
4a87ea3e70 | ||
|
|
61115fce99 | ||
|
|
4f31120394 | ||
|
|
b085cd65ce | ||
|
|
f76ec0721a | ||
|
|
ef3944fbbf | ||
|
|
b158fbc0d8 | ||
|
|
68f2d66e97 | ||
|
|
0cdd1735bd | ||
|
|
70f5ead20b | ||
|
|
574e5616f8 | ||
|
|
94fa810590 | ||
|
|
37f69da701 | ||
|
|
f2f8448ade | ||
|
|
b357d3fff2 | ||
|
|
b417194905 | ||
|
|
d8741da20a | ||
|
|
c469be9a62 | ||
|
|
ff4eb339ef | ||
|
|
78489383c0 | ||
|
|
f67c1b415f | ||
|
|
570c16d921 | ||
|
|
c8bc60568a | ||
|
|
73de3ba856 | ||
|
|
6a69be8537 | ||
|
|
3ee381d505 | ||
|
|
7ce744e2e4 | ||
|
|
b81d21c991 | ||
|
|
e9fe0992c6 | ||
|
|
d5ef9018fa | ||
|
|
c2737a7c51 | ||
|
|
4b6d8733c6 | ||
|
|
f22a3e0955 | ||
|
|
4b8144a2f7 | ||
|
|
abac52e23c | ||
|
|
9aa089313e | ||
|
|
b18f2c481a | ||
|
|
ec83b9f77b | ||
|
|
fad5495e02 | ||
|
|
70dec1171e | ||
|
|
0673a6fce3 | ||
|
|
8f525b1407 | ||
|
|
e83a991a4b | ||
|
|
c000432a52 | ||
|
|
c06d2d6927 | ||
|
|
aa29653a8f | ||
|
|
3f7e4ad486 | ||
|
|
0eab546b2f | ||
|
|
8830d216d1 | ||
|
|
9fa1e3d449 | ||
|
|
fe5dce7159 | ||
|
|
952fa31548 | ||
|
|
cc058ccc61 | ||
|
|
bc26ed9701 | ||
|
|
26135fc1a0 | ||
|
|
0bd14672ff | ||
|
|
7c7150cde8 | ||
|
|
b08282b0c1 | ||
|
|
3bf6e1befc | ||
|
|
52692371ac | ||
|
|
159ac1d8bb | ||
|
|
7f1ffdbc79 | ||
|
|
5fe64931dc | ||
|
|
ee67855b48 | ||
|
|
594a97f43f | ||
|
|
7fb435a8b4 | ||
|
|
01e74d6116 | ||
|
|
b321d75b39 | ||
|
|
1e47a45723 | ||
|
|
88c609e5ef | ||
|
|
775d1a424e |
20
framework/Directory.Build.props
Normal file
20
framework/Directory.Build.props
Normal file
@@ -0,0 +1,20 @@
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<TargetFrameworks>net6.0;net8.0;</TargetFrameworks>
|
||||
<Version>4.0.0.7</Version>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<Authors>Diego</Authors>
|
||||
<Product>ThingsGateway</Product>
|
||||
<Copyright>© 2023-present Diego</Copyright>
|
||||
<RepositoryUrl>https://gitee.com/diego2098/ThingsGateway</RepositoryUrl>
|
||||
<SignAssembly>True</SignAssembly>
|
||||
<DelaySign>False</DelaySign>
|
||||
<SatelliteResourceLanguages>zh-Hans</SatelliteResourceLanguages>
|
||||
<GenerateDocumentationFile>False</GenerateDocumentationFile>
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
|
||||
</Project>
|
||||
@@ -82,6 +82,7 @@ EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "解决方案项", "解决方案项", "{97B23D8B-C6C0-4746-A21F-C7B49354B284}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
..\.gitignore = ..\.gitignore
|
||||
Directory.Build.props = Directory.Build.props
|
||||
..\README.md = ..\README.md
|
||||
EndProjectSection
|
||||
EndProject
|
||||
|
||||
@@ -1,17 +1,7 @@
|
||||
<Project>
|
||||
<Import Project="$(SolutionDir)\Directory.Build.props" />
|
||||
<PropertyGroup>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<TargetFrameworks>net6.0;net8.0;</TargetFrameworks>
|
||||
<Version>4.0.0.4</Version>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Authors>Diego</Authors>
|
||||
<Product>ThingsGateway</Product>
|
||||
<Copyright>© 2023-present Diego</Copyright>
|
||||
<RepositoryUrl>https://gitee.com/diego2098/ThingsGateway</RepositoryUrl>
|
||||
<SignAssembly>True</SignAssembly>
|
||||
<DelaySign>False</DelaySign>
|
||||
<SatelliteResourceLanguages>zh-Hans</SatelliteResourceLanguages>
|
||||
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
|
||||
@@ -27,12 +27,12 @@ namespace ThingsGateway.Admin.ApiController;
|
||||
[Route("Swagger")]
|
||||
public class SwaggerController : IDynamicApiController, IScoped
|
||||
{
|
||||
private readonly ConfigService _configService;
|
||||
private readonly IConfigService _configService;
|
||||
/// <summary>
|
||||
/// <inheritdoc cref="SwaggerController"/>
|
||||
/// </summary>
|
||||
/// <param name="sysConfigService"></param>
|
||||
public SwaggerController(ConfigService sysConfigService)
|
||||
public SwaggerController(IConfigService sysConfigService)
|
||||
{
|
||||
_configService = sysConfigService;
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
Swagger登录授权服务
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:ThingsGateway.Admin.ApiController.SwaggerController.#ctor(ThingsGateway.Admin.Application.ConfigService)">
|
||||
<member name="M:ThingsGateway.Admin.ApiController.SwaggerController.#ctor(ThingsGateway.Admin.Application.IConfigService)">
|
||||
<summary>
|
||||
<inheritdoc cref="T:ThingsGateway.Admin.ApiController.SwaggerController"/>
|
||||
</summary>
|
||||
|
||||
@@ -96,7 +96,7 @@ public class OperDispatchProxy : AspectDispatchProxy, IDispatchProxy
|
||||
/// <exception cref="NotImplementedException"></exception>
|
||||
public override async Task InvokeAsync(MethodInfo method, object[] args)
|
||||
{
|
||||
var desc = method.GetActualCustomAttribute<OperDescAttribute>(Target);
|
||||
var desc = method.GetActualCustomAttribute<OperDescAttribute>(Target, true);
|
||||
if (desc == null)
|
||||
{
|
||||
var task = method.Invoke(Target, args) as Task;
|
||||
@@ -134,7 +134,7 @@ public class OperDispatchProxy : AspectDispatchProxy, IDispatchProxy
|
||||
/// <exception cref="NotImplementedException"></exception>
|
||||
public override async Task<T> InvokeAsyncT<T>(MethodInfo method, object[] args)
|
||||
{
|
||||
var desc = method.GetActualCustomAttribute<OperDescAttribute>(Target);
|
||||
var desc = method.GetActualCustomAttribute<OperDescAttribute>(Target, true);
|
||||
if (desc == null)
|
||||
{
|
||||
var taskT = method.Invoke(Target, args) as Task<T>;
|
||||
|
||||
@@ -83,7 +83,7 @@ public class OpenApiSessionService : DbRepository<OpenApiUser>, IOpenApiSessionS
|
||||
var verificatInfos = await _verificatService.GetVerificatIdAsync(it.Id);
|
||||
if (verificatInfos != null)
|
||||
{
|
||||
OpenApiSessionService.GetVerificatInfos(ref verificatInfos);//获取剩余时间
|
||||
GetVerificatInfos(ref verificatInfos);//获取剩余时间
|
||||
it.VerificatCount = verificatInfos.Count;//令牌数量
|
||||
it.VerificatSignList = verificatInfos;//令牌列表
|
||||
}
|
||||
|
||||
@@ -73,7 +73,7 @@ public class SessionService : DbRepository<SysUser>, ISessionService
|
||||
var verificatInfos = await _verificatService.GetVerificatIdAsync(it.Id);
|
||||
if (verificatInfos != null)
|
||||
{
|
||||
SessionService.GetVerificatInfos(ref verificatInfos);//获取剩余时间
|
||||
GetVerificatInfos(ref verificatInfos);//获取剩余时间
|
||||
it.VerificatCount = verificatInfos.Count;//令牌数量
|
||||
it.VerificatSignList = verificatInfos;//令牌列表
|
||||
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
//------------------------------------------------------------------------------
|
||||
#endregion
|
||||
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
using ThingsGateway.Foundation.Extension.String;
|
||||
|
||||
namespace ThingsGateway.Admin.Application;
|
||||
@@ -34,7 +36,8 @@ public class SeedDataUtil
|
||||
if (!string.IsNullOrEmpty(dataString))//如果有内容
|
||||
{
|
||||
//字段没有数据的替换成null
|
||||
dataString = dataString.Replace("\"\"", "null");
|
||||
dataString = Regex.Replace(dataString, "\\\"[^\"]+?\\\": \\\"\\\"", match => match.Value.Replace("\"\"", "null"));
|
||||
//dataString = dataString.Replace("\"\"", "null");
|
||||
//将json字符串转为实体,这里extjson可以正常转换为字符串
|
||||
var seedDataRecord = Newtonsoft.Json.JsonConvert.DeserializeObject<SeedDataRecords<T>>(dataString);
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ namespace ThingsGateway.Admin.Blazor
|
||||
{
|
||||
try
|
||||
{
|
||||
var data = await _serviceScope.ServiceProvider.GetService<UserCenterService>().GetLoginDefaultRazorAsync(UserManager.UserId);
|
||||
var data = await _serviceScope.ServiceProvider.GetService<IUserCenterService>().GetLoginDefaultRazorAsync(UserManager.UserId);
|
||||
var sameLevelMenus = await _serviceScope.ServiceProvider.GetService<IResourceService>().GetaMenuAndSpaListAsync();
|
||||
if (NavigationManager.ToAbsoluteUri(NavigationManager.Uri).AbsolutePath == "/Login" || NavigationManager.ToAbsoluteUri(NavigationManager.Uri).AbsolutePath == "/")
|
||||
NavigationManager.NavigateTo(sameLevelMenus.FirstOrDefault(a => a.Id == data)?.Component ?? "index", true);
|
||||
|
||||
@@ -39,26 +39,26 @@ public partial class Config
|
||||
}
|
||||
private async Task AddCallAsync(ConfigAddInput input)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<ConfigService>().AddAsync(input);
|
||||
await _serviceScope.ServiceProvider.GetService<IConfigService>().AddAsync(input);
|
||||
}
|
||||
|
||||
private async Task DeleteCallAsync(IEnumerable<SysConfig> sysConfigs)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<ConfigService>().DeleteAsync(sysConfigs.Select(a => a.Id).ToArray());
|
||||
await _serviceScope.ServiceProvider.GetService<IConfigService>().DeleteAsync(sysConfigs.Select(a => a.Id).ToArray());
|
||||
}
|
||||
private async Task EditCallAsync(ConfigEditInput sysConfigs)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<ConfigService>().EditAsync(sysConfigs);
|
||||
await _serviceScope.ServiceProvider.GetService<IConfigService>().EditAsync(sysConfigs);
|
||||
}
|
||||
|
||||
private async Task OnSaveAsync()
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<ConfigService>().EditBatchAsync(_sysConfig);
|
||||
await _serviceScope.ServiceProvider.GetService<IConfigService>().EditBatchAsync(_sysConfig);
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
await PopupService.EnqueueSnackbarAsync("成功", AlertTypes.Success);
|
||||
}
|
||||
private async Task<ISqlSugarPagedList<SysConfig>> QueryCallAsync(ConfigPageInput input)
|
||||
{
|
||||
return await _serviceScope.ServiceProvider.GetService<ConfigService>().PageAsync(input);
|
||||
return await _serviceScope.ServiceProvider.GetService<IConfigService>().PageAsync(input);
|
||||
}
|
||||
}
|
||||
@@ -45,23 +45,23 @@ public partial class Menu
|
||||
private async Task AddCallAsync(MenuAddInput input)
|
||||
{
|
||||
input.ParentId = _search.ParentId;
|
||||
await _serviceScope.ServiceProvider.GetService<MenuService>().AddAsync(input);
|
||||
await _serviceScope.ServiceProvider.GetService<IMenuService>().AddAsync(input);
|
||||
await NavChangeAsync();
|
||||
}
|
||||
private async Task ButtonAddCallAsync(ButtonAddInput input)
|
||||
{
|
||||
input.ParentId = _buttonParentId;
|
||||
await _serviceScope.ServiceProvider.GetService<ButtonService>().AddAsync(input);
|
||||
await _serviceScope.ServiceProvider.GetService<IButtonService>().AddAsync(input);
|
||||
}
|
||||
|
||||
private async Task ButtonDeleteCallAsync(IEnumerable<SysResource> input)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<ButtonService>().DeleteAsync(input.Select(a => a.Id).ToArray());
|
||||
await _serviceScope.ServiceProvider.GetService<IButtonService>().DeleteAsync(input.Select(a => a.Id).ToArray());
|
||||
}
|
||||
|
||||
private async Task ButtonEditCallAsync(ButtonEditInput input)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<ButtonService>().EditAsync(input);
|
||||
await _serviceScope.ServiceProvider.GetService<IButtonService>().EditAsync(input);
|
||||
|
||||
}
|
||||
|
||||
@@ -85,7 +85,7 @@ public partial class Menu
|
||||
private async Task<ISqlSugarPagedList<SysResource>> ButtonQueryCallAsync(ButtonPageInput input)
|
||||
{
|
||||
input.ParentId = _buttonParentId;
|
||||
var data = await _serviceScope.ServiceProvider.GetService<ButtonService>().PageAsync(input);
|
||||
var data = await _serviceScope.ServiceProvider.GetService<IButtonService>().PageAsync(input);
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -96,13 +96,13 @@ public partial class Menu
|
||||
|
||||
private async Task DeleteCallAsync(IEnumerable<SysResource> input)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<MenuService>().DeleteAsync(input.Select(a => a.Id).ToArray());
|
||||
await _serviceScope.ServiceProvider.GetService<IMenuService>().DeleteAsync(input.Select(a => a.Id).ToArray());
|
||||
await NavChangeAsync();
|
||||
|
||||
}
|
||||
private async Task EditCallAsync(MenuEditInput input)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<MenuService>().EditAsync(input);
|
||||
await _serviceScope.ServiceProvider.GetService<IMenuService>().EditAsync(input);
|
||||
await NavChangeAsync();
|
||||
|
||||
}
|
||||
@@ -123,7 +123,7 @@ public partial class Menu
|
||||
}
|
||||
private async Task<ISqlSugarPagedList<SysResource>> QueryCallAsync(MenuPageInput input)
|
||||
{
|
||||
var data = await _serviceScope.ServiceProvider.GetService<MenuService>().TreeAsync(input);
|
||||
var data = await _serviceScope.ServiceProvider.GetService<IMenuService>().TreeAsync(input);
|
||||
return data.ToPagedList(input);
|
||||
}
|
||||
|
||||
|
||||
@@ -32,13 +32,13 @@ public partial class OpenApiSession
|
||||
var confirm = await PopupService.OpenConfirmDialogAsync("警告", "确定 ?");
|
||||
if (confirm)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<OpenApiSessionService>().ExitSessionAsync(id);
|
||||
await _serviceScope.ServiceProvider.GetService<IOpenApiSessionService>().ExitSessionAsync(id);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<ISqlSugarPagedList<OpenApiSessionOutput>> SessionQueryCallAsync(OpenApiSessionPageInput input)
|
||||
{
|
||||
return await _serviceScope.ServiceProvider.GetService<OpenApiSessionService>().PageAsync(input);
|
||||
return await _serviceScope.ServiceProvider.GetService<IOpenApiSessionService>().PageAsync(input);
|
||||
}
|
||||
|
||||
private async Task ShowVerificatListAsync(List<VerificatInfo> verificatInfos)
|
||||
@@ -56,7 +56,7 @@ public partial class OpenApiSession
|
||||
VerificatIds = verificats.Select(it => it.Id).ToList(),
|
||||
Id = verificats.First().UserId
|
||||
};
|
||||
await _serviceScope.ServiceProvider.GetService<OpenApiSessionService>().ExitVerificatAsync(send);
|
||||
await _serviceScope.ServiceProvider.GetService<IOpenApiSessionService>().ExitVerificatAsync(send);
|
||||
_verificatInfos.RemoveWhere(it => send.VerificatIds.Contains(it.Id));
|
||||
}
|
||||
|
||||
|
||||
@@ -32,17 +32,17 @@ public partial class OpenApiUserR
|
||||
|
||||
private async Task AddCallAsync(OpenApiUserAddInput input)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<OpenApiUserService>().AddAsync(input);
|
||||
await _serviceScope.ServiceProvider.GetService<IOpenApiUserService>().AddAsync(input);
|
||||
}
|
||||
|
||||
private async Task DeleteCallAsync(IEnumerable<OpenApiUser> users)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<OpenApiUserService>().DeleteAsync(users.Select(a => a.Id).ToArray());
|
||||
await _serviceScope.ServiceProvider.GetService<IOpenApiUserService>().DeleteAsync(users.Select(a => a.Id).ToArray());
|
||||
}
|
||||
|
||||
private async Task EditCallAsync(OpenApiUserEditInput users)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<OpenApiUserService>().EditAsync(users);
|
||||
await _serviceScope.ServiceProvider.GetService<IOpenApiUserService>().EditAsync(users);
|
||||
}
|
||||
|
||||
private List<OpenApiPermissionTreeSelector> GetRouters()
|
||||
@@ -58,7 +58,7 @@ public partial class OpenApiUserR
|
||||
OpenApiUserGrantPermissionInput userGrantRoleInput = new();
|
||||
userGrantRoleInput.Id = _choiceUserId;
|
||||
userGrantRoleInput.PermissionList = _rolesChoice.Select(it => it.ApiRoute).ToList();
|
||||
await _serviceScope.ServiceProvider.GetService<OpenApiUserService>().GrantRoleAsync(userGrantRoleInput);
|
||||
await _serviceScope.ServiceProvider.GetService<IOpenApiUserService>().GrantRoleAsync(userGrantRoleInput);
|
||||
_isShowRoles = false;
|
||||
await _datatable?.QueryClickAsync();
|
||||
}
|
||||
@@ -70,7 +70,7 @@ public partial class OpenApiUserR
|
||||
}
|
||||
private async Task<ISqlSugarPagedList<OpenApiUser>> QueryCallAsync(OpenApiUserPageInput input)
|
||||
{
|
||||
return await _serviceScope.ServiceProvider.GetService<OpenApiUserService>().PageAsync(input);
|
||||
return await _serviceScope.ServiceProvider.GetService<IOpenApiUserService>().PageAsync(input);
|
||||
}
|
||||
|
||||
private async Task UserStatusChangeAsync(OpenApiUser context, bool enable)
|
||||
@@ -78,9 +78,9 @@ public partial class OpenApiUserR
|
||||
try
|
||||
{
|
||||
if (enable)
|
||||
await _serviceScope.ServiceProvider.GetService<OpenApiUserService>().EnableUserAsync(context.Id);
|
||||
await _serviceScope.ServiceProvider.GetService<IOpenApiUserService>().EnableUserAsync(context.Id);
|
||||
else
|
||||
await _serviceScope.ServiceProvider.GetService<OpenApiUserService>().DisableUserAsync(context.Id);
|
||||
await _serviceScope.ServiceProvider.GetService<IOpenApiUserService>().DisableUserAsync(context.Id);
|
||||
}
|
||||
finally
|
||||
{
|
||||
|
||||
@@ -47,7 +47,7 @@ public partial class Oplog
|
||||
var confirm = await PopupService.OpenConfirmDialogAsync("删除", "确定 ?");
|
||||
if (confirm)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<OperateLogService>().DeleteAsync(_categoryFilters.Select(it => it.Value).ToArray());
|
||||
await _serviceScope.ServiceProvider.GetService<IOperateLogService>().DeleteAsync(_categoryFilters.Select(it => it.Value).ToArray());
|
||||
await _datatable?.QueryClickAsync();
|
||||
}
|
||||
}
|
||||
@@ -68,6 +68,6 @@ public partial class Oplog
|
||||
input.Account = _search.Account;
|
||||
input.Category = _search.Category;
|
||||
input.ExeStatus = _search.ExeStatus;
|
||||
return await _serviceScope.ServiceProvider.GetService<OperateLogService>().PageAsync(input);
|
||||
return await _serviceScope.ServiceProvider.GetService<IOperateLogService>().PageAsync(input);
|
||||
}
|
||||
}
|
||||
@@ -41,17 +41,17 @@ public partial class Role
|
||||
|
||||
private async Task AddCallAsync(RoleAddInput input)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<RoleService>().AddAsync(input);
|
||||
await _serviceScope.ServiceProvider.GetService<IRoleService>().AddAsync(input);
|
||||
}
|
||||
private async Task DeleteCallAsync(IEnumerable<SysRole> sysRoles)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<RoleService>().DeleteAsync(sysRoles.Select(a => a.Id).ToArray());
|
||||
await _serviceScope.ServiceProvider.GetService<IRoleService>().DeleteAsync(sysRoles.Select(a => a.Id).ToArray());
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
}
|
||||
|
||||
private async Task EditCallAsync(RoleEditInput input)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<RoleService>().EditAsync(input);
|
||||
await _serviceScope.ServiceProvider.GetService<IRoleService>().EditAsync(input);
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
}
|
||||
private async Task OnRoleHasResuorcesSaveAsync(ModalActionEventArgs args)
|
||||
@@ -62,7 +62,7 @@ public partial class Role
|
||||
var data = new List<SysResource>();
|
||||
userGrantRoleInput.Id = _choiceRoleId;
|
||||
userGrantRoleInput.GrantInfoList = _roleHasResuorces;
|
||||
await _serviceScope.ServiceProvider.GetService<RoleService>().GrantResourceAsync(userGrantRoleInput);
|
||||
await _serviceScope.ServiceProvider.GetService<IRoleService>().GrantResourceAsync(userGrantRoleInput);
|
||||
_isShowResuorces = false;
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -79,7 +79,7 @@ public partial class Role
|
||||
GrantUserInput userGrantRoleInput = new();
|
||||
userGrantRoleInput.Id = _choiceRoleId;
|
||||
userGrantRoleInput.GrantInfoList = _usersChoice.Select(it => it.Id).ToList();
|
||||
await _serviceScope.ServiceProvider.GetService<RoleService>().GrantUserAsync(userGrantRoleInput);
|
||||
await _serviceScope.ServiceProvider.GetService<IRoleService>().GrantUserAsync(userGrantRoleInput);
|
||||
_isShowUsers = false;
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -92,19 +92,19 @@ public partial class Role
|
||||
|
||||
private async Task<ISqlSugarPagedList<SysRole>> QueryCallAsync(RolePageInput input)
|
||||
{
|
||||
return await _serviceScope.ServiceProvider.GetService<RoleService>().PageAsync(input);
|
||||
return await _serviceScope.ServiceProvider.GetService<IRoleService>().PageAsync(input);
|
||||
}
|
||||
|
||||
private async Task ResuorceInitAsync()
|
||||
{
|
||||
_resTreeSelectors = (await _serviceScope.ServiceProvider.GetService<ResourceService>().GetRoleGrantResourceMenusAsync());
|
||||
_roleHasResuorces = (await _serviceScope.ServiceProvider.GetService<RoleService>().OwnResourceAsync(_choiceRoleId))?.GrantInfoList;
|
||||
_roleHasResuorces = (await _serviceScope.ServiceProvider.GetService<IRoleService>().OwnResourceAsync(_choiceRoleId))?.GrantInfoList;
|
||||
}
|
||||
|
||||
private async Task<List<UserSelectorOutput>> UserInitAsync()
|
||||
{
|
||||
_allUsers = await _serviceScope.ServiceProvider.GetService<SysUserService>().UserSelectorAsync(_searchKey);
|
||||
var data = await _serviceScope.ServiceProvider.GetService<RoleService>().OwnUserAsync(_choiceRoleId);
|
||||
_allUsers = await _serviceScope.ServiceProvider.GetService<ISysUserService>().UserSelectorAsync(_searchKey);
|
||||
var data = await _serviceScope.ServiceProvider.GetService<IRoleService>().OwnUserAsync(_choiceRoleId);
|
||||
_usersChoice = _allUsers.Where(a => data.Contains(a.Id)).ToList();
|
||||
return _allUsers;
|
||||
}
|
||||
|
||||
@@ -37,14 +37,14 @@ public partial class Session
|
||||
var confirm = await PopupService.OpenConfirmDialogAsync("警告", "确定 ?");
|
||||
if (confirm)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<SessionService>().ExitSessionAsync(id);
|
||||
await _serviceScope.ServiceProvider.GetService<ISessionService>().ExitSessionAsync(id);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private async Task<ISqlSugarPagedList<SessionOutput>> SessionQueryCallAsync(SessionPageInput input)
|
||||
{
|
||||
return await _serviceScope.ServiceProvider.GetService<SessionService>().PageAsync(input);
|
||||
return await _serviceScope.ServiceProvider.GetService<ISessionService>().PageAsync(input);
|
||||
}
|
||||
|
||||
private async Task ShowVerificatListAsync(List<VerificatInfo> verificatInfos)
|
||||
@@ -62,7 +62,7 @@ public partial class Session
|
||||
VerificatIds = verificats.Select(it => it.Id).ToList(),
|
||||
Id = verificats.First().UserId
|
||||
};
|
||||
await _serviceScope.ServiceProvider.GetService<SessionService>().ExitVerificatAsync(send);
|
||||
await _serviceScope.ServiceProvider.GetService<ISessionService>().ExitVerificatAsync(send);
|
||||
_verificatInfos.RemoveWhere(it => send.VerificatIds.Contains(it.Id));
|
||||
}
|
||||
|
||||
|
||||
@@ -28,23 +28,23 @@ public partial class Spa
|
||||
|
||||
private async Task AddCallAsync(SpaAddInput input)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<SpaService>().AddAsync(input);
|
||||
await _serviceScope.ServiceProvider.GetService<ISpaService>().AddAsync(input);
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
}
|
||||
private async Task DeleteCallAsync(IEnumerable<SysResource> input)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<SpaService>().DeleteAsync(input.Select(a => a.Id).ToArray());
|
||||
await _serviceScope.ServiceProvider.GetService<ISpaService>().DeleteAsync(input.Select(a => a.Id).ToArray());
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
}
|
||||
|
||||
private async Task EditCallAsync(SpaEditInput input)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<SpaService>().EditAsync(input);
|
||||
await _serviceScope.ServiceProvider.GetService<ISpaService>().EditAsync(input);
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
}
|
||||
|
||||
private async Task<ISqlSugarPagedList<SysResource>> QueryCallAsync(SpaPageInput input)
|
||||
{
|
||||
return await _serviceScope.ServiceProvider.GetService<SpaService>().PageAsync(input);
|
||||
return await _serviceScope.ServiceProvider.GetService<ISpaService>().PageAsync(input);
|
||||
}
|
||||
}
|
||||
@@ -35,17 +35,17 @@ public partial class User
|
||||
|
||||
private async Task AddCallAsync(UserAddInput input)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<SysUserService>().AddAsync(input);
|
||||
await _serviceScope.ServiceProvider.GetService<ISysUserService>().AddAsync(input);
|
||||
}
|
||||
private async Task DeleteCallAsync(IEnumerable<SysUser> users)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<SysUserService>().DeleteAsync(users.Select(a => a.Id).ToArray());
|
||||
await _serviceScope.ServiceProvider.GetService<ISysUserService>().DeleteAsync(users.Select(a => a.Id).ToArray());
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
}
|
||||
|
||||
private async Task EditCallAsync(UserEditInput users)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<SysUserService>().EditAsync(users);
|
||||
await _serviceScope.ServiceProvider.GetService<ISysUserService>().EditAsync(users);
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ public partial class User
|
||||
UserGrantRoleInput userGrantRoleInput = new();
|
||||
userGrantRoleInput.Id = _choiceUserId;
|
||||
userGrantRoleInput.RoleIdList = _rolesChoice.Select(it => it.Id).ToList();
|
||||
await _serviceScope.ServiceProvider.GetService<SysUserService>().GrantRoleAsync(userGrantRoleInput);
|
||||
await _serviceScope.ServiceProvider.GetService<ISysUserService>().GrantRoleAsync(userGrantRoleInput);
|
||||
_isShowRoles = false;
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -68,20 +68,20 @@ public partial class User
|
||||
}
|
||||
private async Task<ISqlSugarPagedList<SysUser>> QueryCallAsync(UserPageInput input)
|
||||
{
|
||||
return await _serviceScope.ServiceProvider.GetService<SysUserService>().PageAsync(input);
|
||||
return await _serviceScope.ServiceProvider.GetService<ISysUserService>().PageAsync(input);
|
||||
}
|
||||
|
||||
private async Task ResetPasswordAsync(SysUser sysUser)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<SysUserService>().ResetPasswordAsync(sysUser.Id);
|
||||
await _serviceScope.ServiceProvider.GetService<ISysUserService>().ResetPasswordAsync(sysUser.Id);
|
||||
await PopupService.EnqueueSnackbarAsync(new("成功", AlertTypes.Success));
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
}
|
||||
|
||||
private async Task RoleInitAsync()
|
||||
{
|
||||
_allRoles = await _serviceScope.ServiceProvider.GetService<RoleService>().RoleSelectorAsync();
|
||||
var data = await _serviceScope.ServiceProvider.GetService<RoleService>().GetRoleIdListByUserIdAsync(_choiceUserId);
|
||||
_allRoles = await _serviceScope.ServiceProvider.GetService<IRoleService>().RoleSelectorAsync();
|
||||
var data = await _serviceScope.ServiceProvider.GetService<IRoleService>().GetRoleIdListByUserIdAsync(_choiceUserId);
|
||||
_rolesChoice = _allRoles.Where(a => data.Contains(a.Id)).ToList();
|
||||
}
|
||||
private async Task UserStatusChangeAsync(SysUser context, bool enable)
|
||||
@@ -89,9 +89,9 @@ public partial class User
|
||||
try
|
||||
{
|
||||
if (enable)
|
||||
await _serviceScope.ServiceProvider.GetService<SysUserService>().EnableUserAsync(context.Id);
|
||||
await _serviceScope.ServiceProvider.GetService<ISysUserService>().EnableUserAsync(context.Id);
|
||||
else
|
||||
await _serviceScope.ServiceProvider.GetService<SysUserService>().DisableUserAsync(context.Id);
|
||||
await _serviceScope.ServiceProvider.GetService<ISysUserService>().DisableUserAsync(context.Id);
|
||||
}
|
||||
finally
|
||||
{
|
||||
|
||||
@@ -44,14 +44,14 @@ public partial class UserCenter
|
||||
|
||||
async Task OnDefaultRazorSaveAsync()
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<UserCenterService>().UpdateUserDefaultRazorAsync(UserManager.UserId, _defaultMenuId);
|
||||
await _serviceScope.ServiceProvider.GetService<IUserCenterService>().UpdateUserDefaultRazorAsync(UserManager.UserId, _defaultMenuId);
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
await PopupService.EnqueueSnackbarAsync("成功", AlertTypes.Success);
|
||||
}
|
||||
|
||||
async Task OnShortcutSaveAsync()
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<UserCenterService>().UpdateWorkbenchAsync(_menusChoice);
|
||||
await _serviceScope.ServiceProvider.GetService<IUserCenterService>().UpdateWorkbenchAsync(_menusChoice);
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
await PopupService.EnqueueSnackbarAsync("成功", AlertTypes.Success);
|
||||
}
|
||||
@@ -62,7 +62,7 @@ public partial class UserCenter
|
||||
{
|
||||
//验证成功,操作业务
|
||||
_passwordInfoInput.Id = UserResoures.CurrentUser.Id;
|
||||
await _serviceScope.ServiceProvider.GetService<UserCenterService>().EditPasswordAsync(_passwordInfoInput);
|
||||
await _serviceScope.ServiceProvider.GetService<IUserCenterService>().EditPasswordAsync(_passwordInfoInput);
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
await PopupService.EnqueueSnackbarAsync("成功,将重新登录", AlertTypes.Success);
|
||||
await Task.Delay(2000);
|
||||
@@ -72,7 +72,7 @@ public partial class UserCenter
|
||||
|
||||
async Task OnUpdateUserInfoAsync()
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<UserCenterService>().UpdateUserInfoAsync(_updateInfoInput);
|
||||
await _serviceScope.ServiceProvider.GetService<IUserCenterService>().UpdateUserInfoAsync(_updateInfoInput);
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
await PopupService.EnqueueSnackbarAsync("成功", AlertTypes.Success);
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ public partial class Vislog
|
||||
var confirm = await PopupService.OpenConfirmDialogAsync("删除", "确定 ?");
|
||||
if (confirm)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<VisitLogService>().DeleteAsync(_categoryFilters.Select(it => it.Value).ToArray());
|
||||
await _serviceScope.ServiceProvider.GetService<IVisitLogService>().DeleteAsync(_categoryFilters.Select(it => it.Value).ToArray());
|
||||
await _datatable?.QueryClickAsync();
|
||||
}
|
||||
}
|
||||
@@ -74,7 +74,7 @@ public partial class Vislog
|
||||
|
||||
private async Task<ISqlSugarPagedList<SysVisitLog>> QueryCallAsync(VisitLogPageInput input)
|
||||
{
|
||||
var data = await _serviceScope.ServiceProvider.GetService<VisitLogService>().PageAsync(input);
|
||||
var data = await _serviceScope.ServiceProvider.GetService<IVisitLogService>().PageAsync(input);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@@ -107,8 +107,8 @@ public partial class Login
|
||||
{
|
||||
await PopupService.EnqueueSnackbarAsync(new("登录成功", AlertTypes.Success));
|
||||
await Task.Delay(500);
|
||||
var userId = await _serviceScope.ServiceProvider.GetService<SysUserService>().GetIdByAccountAsync(_loginModel.Account);
|
||||
var data = await _serviceScope.ServiceProvider.GetService<UserCenterService>().GetLoginDefaultRazorAsync(userId);
|
||||
var userId = await _serviceScope.ServiceProvider.GetService<ISysUserService>().GetIdByAccountAsync(_loginModel.Account);
|
||||
var data = await _serviceScope.ServiceProvider.GetService<IUserCenterService>().GetLoginDefaultRazorAsync(userId);
|
||||
var sameLevelMenus = await _serviceScope.ServiceProvider.GetService<ResourceService>().GetaMenuAndSpaListAsync();
|
||||
if (_NavigationManager.ToAbsoluteUri(_NavigationManager.Uri).AbsolutePath == "/Login" || _NavigationManager.ToAbsoluteUri(_NavigationManager.Uri).AbsolutePath == "/")
|
||||
await _ajaxService.GotoAsync(sameLevelMenus.FirstOrDefault(a => a.Id == data)?.Component ?? "index");
|
||||
|
||||
@@ -16,7 +16,7 @@ using ThingsGateway.Foundation.Extension.String;
|
||||
|
||||
namespace ThingsGateway.Admin.Blazor;
|
||||
|
||||
public partial class MainLayout
|
||||
public partial class MainLayout : IDisposable
|
||||
{
|
||||
private List<SysResource> _breadcrumbSysResources = new();
|
||||
private string _configCopyRight = "";
|
||||
@@ -43,16 +43,23 @@ public partial class MainLayout
|
||||
private IServiceScopeFactory _serviceScopeFactory { get; set; }
|
||||
[Inject]
|
||||
private UserResoures _userResoures { get; set; }
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_serviceScope.Dispose();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 页面刷新
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task StateHasChangedAsync()
|
||||
{
|
||||
_configCopyRight = (await _serviceScope.ServiceProvider.GetService<IConfigService>().GetByConfigKeyAsync(ConfigConst.SYS_CONFIGBASEDEFAULT, ConfigConst.CONFIG_COPYRIGHT)).ConfigValue;
|
||||
_configTitle = (await _serviceScope.ServiceProvider.GetService<IConfigService>().GetByConfigKeyAsync(ConfigConst.SYS_CONFIGBASEDEFAULT, ConfigConst.CONFIG_TITLE)).ConfigValue;
|
||||
_configCopyRightUrl = (await _serviceScope.ServiceProvider.GetService<IConfigService>().GetByConfigKeyAsync(ConfigConst.SYS_CONFIGBASEDEFAULT, ConfigConst.CONFIG_COPYRIGHT_URL)).ConfigValue;
|
||||
_configPageTab = (await _serviceScope.ServiceProvider.GetService<IConfigService>().GetByConfigKeyAsync(ConfigConst.SYS_CONFIGBASEDEFAULT, ConfigConst.CONFIG_PAGETAB)).ConfigValue.ToBool(true);
|
||||
var configService = _serviceScope.ServiceProvider.GetService<IConfigService>();
|
||||
_configCopyRight = (await configService.GetByConfigKeyAsync(ConfigConst.SYS_CONFIGBASEDEFAULT, ConfigConst.CONFIG_COPYRIGHT)).ConfigValue;
|
||||
_configTitle = (await configService.GetByConfigKeyAsync(ConfigConst.SYS_CONFIGBASEDEFAULT, ConfigConst.CONFIG_TITLE)).ConfigValue;
|
||||
_configCopyRightUrl = (await configService.GetByConfigKeyAsync(ConfigConst.SYS_CONFIGBASEDEFAULT, ConfigConst.CONFIG_COPYRIGHT_URL)).ConfigValue;
|
||||
_configPageTab = (await configService.GetByConfigKeyAsync(ConfigConst.SYS_CONFIGBASEDEFAULT, ConfigConst.CONFIG_PAGETAB)).ConfigValue.ToBool(true);
|
||||
|
||||
await _userResoures.InitUserAsync();
|
||||
await _userResoures.InitMenuAsync();
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.1.5" />
|
||||
<PackageReference Include="SqlSugarCore" Version="5.1.4.123" />
|
||||
<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.1.8" />
|
||||
<PackageReference Include="SqlSugarCore" Version="5.1.4.122" />
|
||||
<PackageReference Include="UAParser" Version="3.1.47" />
|
||||
<PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -56,6 +56,7 @@ public abstract class BaseComponentBase : ComponentBase, IDisposable
|
||||
/// </summary>
|
||||
public virtual void Dispose()
|
||||
{
|
||||
_serviceScope.Dispose();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Furion.Pure" Version="4.9.1.5" />
|
||||
<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.1.5" />
|
||||
<PackageReference Include="Furion.Pure" Version="4.9.1.8" />
|
||||
<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.1.8" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -1,14 +1,7 @@
|
||||
<Project>
|
||||
<Import Project="$(SolutionDir)\Directory.Build.props" />
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0;net8.0;</TargetFrameworks>
|
||||
<Version>4.0.0.4</Version>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<Authors>Diego</Authors>
|
||||
<Product>ThingsGateway</Product>
|
||||
<Copyright>© 2023-present Diego</Copyright>
|
||||
<RepositoryUrl>https://gitee.com/diego2098/ThingsGateway</RepositoryUrl>
|
||||
<SatelliteResourceLanguages>zh-Hans</SatelliteResourceLanguages>
|
||||
<GenerateDocumentationFile>False</GenerateDocumentationFile>
|
||||
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
|
||||
@@ -12,6 +12,9 @@
|
||||
|
||||
using Microsoft.AspNetCore.Components;
|
||||
|
||||
using ThingsGateway.Components;
|
||||
|
||||
|
||||
namespace ThingsGateway.Foundation.Demo;
|
||||
using LogLevel = Microsoft.Extensions.Logging.LogLevel;
|
||||
/// <summary>
|
||||
|
||||
@@ -40,7 +40,9 @@
|
||||
Dense>
|
||||
</MSelect>
|
||||
|
||||
<MCheckbox Class="ma-1" Style="max-width:200px" Label=@(_plc.Description(x => x.IsRtu)) Dense HideDetails="@("auto")" @bind-Value=@_plc.IsRtu></MCheckbox>
|
||||
<MCheckbox Class="ma-1" Style="max-width:200px" Label=@(_plc.Description(x => x.IsCheckMessageId)) Dense HideDetails="@("auto")" @bind-Value=@_plc.IsCheckMessageId></MCheckbox>
|
||||
<MCheckbox Class="ma-1" Style="max-width:200px" Label=@(_plc.Description(x => x.Crc16CheckEnable)) Dense HideDetails="@("auto")" @bind-Value=@_plc.Crc16CheckEnable></MCheckbox>
|
||||
|
||||
}
|
||||
</MRow>
|
||||
@@ -13,9 +13,9 @@
|
||||
namespace ThingsGateway.Foundation.Demo;
|
||||
|
||||
/// <summary>
|
||||
/// ModbusTcpDtuDebugPage
|
||||
/// ModbusDtuDebugPage
|
||||
/// </summary>
|
||||
public partial class ModbusTcpDtuDebugPage
|
||||
public partial class ModbusDtuDebugPage
|
||||
{
|
||||
/// <summary>
|
||||
/// TcpServerPage
|
||||
@@ -23,7 +23,7 @@ public partial class ModbusTcpDtuDebugPage
|
||||
private TcpServerPage _tcpServerPage;
|
||||
private DriverDebugUIPage _driverDebugUIPage;
|
||||
|
||||
private ThingsGateway.Foundation.Adapter.Modbus.ModbusTcpDtu _plc;
|
||||
private ThingsGateway.Foundation.Adapter.Modbus.ModbusDtu _plc;
|
||||
|
||||
/// <summary>
|
||||
/// <inheritdoc/>
|
||||
@@ -70,7 +70,7 @@ public partial class ModbusTcpDtuDebugPage
|
||||
|
||||
if (_tcpServerPage != null)
|
||||
_tcpServerPage.LogAction = _driverDebugUIPage.LogOut;
|
||||
_plc = new ThingsGateway.Foundation.Adapter.Modbus.ModbusTcpDtu(_tcpServerPage.GetTcpServer());
|
||||
_plc = new ThingsGateway.Foundation.Adapter.Modbus.ModbusDtu(_tcpServerPage.GetTcpServer());
|
||||
_driverDebugUIPage.Plc = _plc;
|
||||
//载入配置
|
||||
StateHasChanged();
|
||||
@@ -20,8 +20,6 @@ using Microsoft.JSInterop;
|
||||
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
using System.Collections.Generic;
|
||||
|
||||
using ThingsGateway.Foundation.Adapter.OPCDA;
|
||||
using ThingsGateway.Foundation.Adapter.OPCDA.Da;
|
||||
|
||||
@@ -45,6 +43,7 @@ public partial class OPCDAClientDebugPage : IDisposable
|
||||
{
|
||||
_plc.SafeDispose();
|
||||
opcDAClientPage.SafeDispose();
|
||||
base.Dispose();
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
@@ -105,7 +104,7 @@ public partial class OPCDAClientDebugPage : IDisposable
|
||||
await PopupService.EnqueueSnackbarAsync("无可用变量", AlertTypes.Warning);
|
||||
return;
|
||||
}
|
||||
await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().AddAsync(data?.Item1);
|
||||
await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().AddAsync(data?.Item1);
|
||||
await _serviceScope.ServiceProvider.GetService<VariableService>().AddBatchAsync(data?.Item2);
|
||||
await PopupService.EnqueueSnackbarAsync("成功", AlertTypes.Success);
|
||||
}
|
||||
@@ -151,7 +150,7 @@ public partial class OPCDAClientDebugPage : IDisposable
|
||||
/// <returns></returns>
|
||||
public async Task DownDeviceExportAsync(CollectDevice data)
|
||||
{
|
||||
using var memoryStream = await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().ExportFileAsync(new List<CollectDevice>() { data });
|
||||
using var memoryStream = await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().ExportFileAsync(new List<CollectDevice>() { data });
|
||||
using var streamRef = new DotNetStreamReference(stream: memoryStream);
|
||||
JSObjectReference ??= await JSRuntime.LoadModuleAsync("js/downloadFileFromStream");
|
||||
await JSObjectReference.InvokeVoidAsync("downloadFileFromStream", $"设备导出{DateTimeExtensions.CurrentDateTime.ToFileDateTimeFormat()}.xlsx", streamRef);
|
||||
|
||||
@@ -96,7 +96,7 @@ public partial class OPCUAClientDebugPage
|
||||
await PopupService.EnqueueSnackbarAsync("无可用变量", AlertTypes.Warning);
|
||||
return;
|
||||
}
|
||||
await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().AddAsync(data.Item1);
|
||||
await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().AddAsync(data.Item1);
|
||||
await _serviceScope.ServiceProvider.GetService<VariableService>().AddBatchAsync(data.Item2);
|
||||
await PopupService.EnqueueSnackbarAsync("成功", AlertTypes.Success);
|
||||
}
|
||||
@@ -141,7 +141,7 @@ public partial class OPCUAClientDebugPage
|
||||
/// <returns></returns>
|
||||
public async Task DownDeviceExportAsync(CollectDevice data)
|
||||
{
|
||||
using var memoryStream = await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().ExportFileAsync(new List<CollectDevice>() { data });
|
||||
using var memoryStream = await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().ExportFileAsync(new List<CollectDevice>() { data });
|
||||
using var streamRef = new DotNetStreamReference(stream: memoryStream);
|
||||
JSObjectReference ??= await JSRuntime.LoadModuleAsync("js/downloadFileFromStream");
|
||||
await JSObjectReference.InvokeVoidAsync("downloadFileFromStream", $"设备导出{DateTimeExtensions.CurrentDateTime.ToFileDateTimeFormat()}.xlsx", streamRef);
|
||||
|
||||
@@ -1,20 +1,14 @@
|
||||
<Project>
|
||||
<Import Project="$(SolutionDir)\Directory.Build.props" />
|
||||
<!--如果编译net45报错无支持,用一下方法添加net45包-->
|
||||
<!--VS顶部菜单栏 -> 视图 -> 其他 -> 程序包控制台
|
||||
Install-Package Microsoft.NETFramework.ReferenceAssemblies.net45
|
||||
-->
|
||||
<PropertyGroup>
|
||||
<Version>4.0.0.4</Version>
|
||||
<GenerateDocumentationFile>True</GenerateDocumentationFile>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<TargetFrameworks>net45;netstandard2.0;net6.0;net8.0;</TargetFrameworks>
|
||||
<Description>
|
||||
ThingsGateway.Foundation是工业设备通讯类库,归属于ThingsGateway边缘网关项目,说明文档:https://diego2098.gitee.io/thingsgateway-docs/
|
||||
</Description>
|
||||
<Authors>Diego</Authors>
|
||||
<Product>ThingsGateway</Product>
|
||||
<Copyright>© 2023-present Diego</Copyright>
|
||||
<RepositoryUrl>https://gitee.com/diego2098/ThingsGateway</RepositoryUrl>
|
||||
<PublishRepositoryUrl>true</PublishRepositoryUrl>
|
||||
<EmbedUntrackedSource>true</EmbedUntrackedSource>
|
||||
<EmbedAllSources>true</EmbedAllSources>
|
||||
@@ -26,17 +20,11 @@
|
||||
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
|
||||
<PackageProjectUrl>https://diego2098.gitee.io/thingsgateway-docs/</PackageProjectUrl>
|
||||
<PackageTags>ThingsGateway;Diego;dotNET China;Blazor;设备采集;边缘网关</PackageTags>
|
||||
<SignAssembly>True</SignAssembly>
|
||||
<DelaySign>False</DelaySign>
|
||||
<SatelliteResourceLanguages>zh-Hans</SatelliteResourceLanguages>
|
||||
<PackageOutputPath>..\..\nupkgs</PackageOutputPath>
|
||||
<AssemblyOriginatorKeyFile>..\..\..\snks/ThingsGateway.snk</AssemblyOriginatorKeyFile>
|
||||
<GenerateDocumentationFile>True</GenerateDocumentationFile>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
<ItemGroup>
|
||||
<None Include="..\..\..\README.md" Pack="true" PackagePath="\" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -106,7 +106,7 @@ public class DLT645_2007 : ReadWriteDevicesSerialSessionBase, IDLT645_2007
|
||||
public override OperResult Write(string address, bool[] value, CancellationToken cancellationToken = default) => Write(address, value.ToString(), cancellationToken);
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override Task<OperResult> WriteAsync(string address, byte[] value, CancellationToken cancellationToken = default) => throw new NotImplementedException();
|
||||
public override Task<OperResult> WriteAsync(string address, byte[] value, CancellationToken cancellationToken = default) => Task.FromResult(new OperResult());
|
||||
/// <inheritdoc/>
|
||||
public override Task<OperResult> WriteAsync(string address, uint value, CancellationToken cancellationToken = default) => WriteAsync(address, value.ToString(), cancellationToken);
|
||||
/// <inheritdoc/>
|
||||
@@ -125,7 +125,7 @@ public class DLT645_2007 : ReadWriteDevicesSerialSessionBase, IDLT645_2007
|
||||
public override Task<OperResult> WriteAsync(string address, int value, CancellationToken cancellationToken = default) => WriteAsync(address, value.ToString(), cancellationToken);
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override Task<OperResult> WriteAsync(string address, bool[] value, CancellationToken cancellationToken = default) => throw new NotImplementedException();
|
||||
public override Task<OperResult> WriteAsync(string address, bool[] value, CancellationToken cancellationToken = default) => Task.FromResult(new OperResult());
|
||||
|
||||
|
||||
#region 其他方法
|
||||
|
||||
@@ -106,7 +106,7 @@ public class DLT645_2007OverTcp : ReadWriteDevicesTcpClientBase, IDLT645_2007
|
||||
public override OperResult Write(string address, bool[] value, CancellationToken cancellationToken = default) => Write(address, value.ToString(), cancellationToken);
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override Task<OperResult> WriteAsync(string address, byte[] value, CancellationToken cancellationToken = default) => throw new NotImplementedException();
|
||||
public override Task<OperResult> WriteAsync(string address, byte[] value, CancellationToken cancellationToken = default) => Task.FromResult(new OperResult());
|
||||
/// <inheritdoc/>
|
||||
public override Task<OperResult> WriteAsync(string address, uint value, CancellationToken cancellationToken = default) => WriteAsync(address, value.ToString(), cancellationToken);
|
||||
/// <inheritdoc/>
|
||||
@@ -125,7 +125,7 @@ public class DLT645_2007OverTcp : ReadWriteDevicesTcpClientBase, IDLT645_2007
|
||||
public override Task<OperResult> WriteAsync(string address, int value, CancellationToken cancellationToken = default) => WriteAsync(address, value.ToString(), cancellationToken);
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override Task<OperResult> WriteAsync(string address, bool[] value, CancellationToken cancellationToken = default) => throw new NotImplementedException();
|
||||
public override Task<OperResult> WriteAsync(string address, bool[] value, CancellationToken cancellationToken = default) => Task.FromResult(new OperResult());
|
||||
|
||||
|
||||
#region 其他方法
|
||||
|
||||
@@ -14,14 +14,14 @@ using System.ComponentModel;
|
||||
|
||||
namespace ThingsGateway.Foundation.Adapter.Modbus;
|
||||
/// <inheritdoc/>
|
||||
public class ModbusTcpDtu : ReadWriteDevicesTcpServerBase
|
||||
public class ModbusDtu : ReadWriteDevicesTcpServerBase
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public ModbusTcpDtu(TcpService tcpService) : base(tcpService)
|
||||
public ModbusDtu(TcpService tcpService) : base(tcpService)
|
||||
{
|
||||
ThingsGatewayBitConverter = new ThingsGatewayBitConverter(EndianType.Big);
|
||||
RegisterByteLength = 2;
|
||||
ModbusTcpDtuPlugin modbusTcpSalvePlugin = new ModbusTcpDtuPlugin();
|
||||
ModbusDtuPlugin modbusTcpSalvePlugin = new ModbusDtuPlugin();
|
||||
tcpService.Config.ConfigurePlugins(a =>
|
||||
{
|
||||
a.Add(modbusTcpSalvePlugin);
|
||||
@@ -35,6 +35,18 @@ public class ModbusTcpDtu : ReadWriteDevicesTcpServerBase
|
||||
[Description("检测事务标识符")]
|
||||
public bool IsCheckMessageId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否Rtu格式
|
||||
/// </summary>
|
||||
[Description("是否Rtu格式")]
|
||||
public bool IsRtu { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Crc校验
|
||||
/// </summary>
|
||||
[Description("Crc校验")]
|
||||
public bool Crc16CheckEnable { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// 站号
|
||||
/// </summary>
|
||||
@@ -92,23 +104,49 @@ public class ModbusTcpDtu : ReadWriteDevicesTcpServerBase
|
||||
{
|
||||
if (socketClient != default)
|
||||
{
|
||||
ModbusTcpDataHandleAdapter dataHandleAdapter = new()
|
||||
{
|
||||
IsCheckMessageId = IsCheckMessageId,
|
||||
CacheTimeout = TimeSpan.FromMilliseconds(CacheTimeout)
|
||||
};
|
||||
socketClient.SetDataHandlingAdapter(dataHandleAdapter);
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var item in TcpService.GetClients())
|
||||
if (!IsRtu)
|
||||
{
|
||||
ModbusTcpDataHandleAdapter dataHandleAdapter = new()
|
||||
{
|
||||
IsCheckMessageId = IsCheckMessageId,
|
||||
CacheTimeout = TimeSpan.FromMilliseconds(CacheTimeout)
|
||||
};
|
||||
item.SetDataHandlingAdapter(dataHandleAdapter);
|
||||
socketClient.SetDataHandlingAdapter(dataHandleAdapter);
|
||||
}
|
||||
else
|
||||
{
|
||||
ModbusRtuDataHandleAdapter dataHandleAdapter = new()
|
||||
{
|
||||
Crc16CheckEnable = Crc16CheckEnable,
|
||||
CacheTimeout = TimeSpan.FromMilliseconds(CacheTimeout)
|
||||
};
|
||||
socketClient.SetDataHandlingAdapter(dataHandleAdapter);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//只适配第一个
|
||||
var item = TcpService.GetClients().FirstOrDefault();
|
||||
if (item != null)
|
||||
{
|
||||
if (!IsRtu)
|
||||
{
|
||||
ModbusTcpDataHandleAdapter dataHandleAdapter = new()
|
||||
{
|
||||
IsCheckMessageId = IsCheckMessageId,
|
||||
CacheTimeout = TimeSpan.FromMilliseconds(CacheTimeout)
|
||||
};
|
||||
item.SetDataHandlingAdapter(dataHandleAdapter);
|
||||
}
|
||||
else
|
||||
{
|
||||
ModbusRtuDataHandleAdapter dataHandleAdapter = new()
|
||||
{
|
||||
Crc16CheckEnable = Crc16CheckEnable,
|
||||
CacheTimeout = TimeSpan.FromMilliseconds(CacheTimeout)
|
||||
};
|
||||
item.SetDataHandlingAdapter(dataHandleAdapter);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -187,7 +225,7 @@ public class ModbusTcpDtu : ReadWriteDevicesTcpServerBase
|
||||
if (TcpService.TryGetSocketClient($"ID={id}", out var client))
|
||||
{
|
||||
SetDataAdapter(client);
|
||||
return SendThenReturn<ModbusTcpMessage>(command, cancellationToken, client);
|
||||
return SendThenReturn<MessageBase>(command, cancellationToken, client);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -200,7 +238,7 @@ public class ModbusTcpDtu : ReadWriteDevicesTcpServerBase
|
||||
if (TcpService.TryGetSocketClient($"ID={id}", out var client))
|
||||
{
|
||||
SetDataAdapter(client);
|
||||
return await SendThenReturnAsync<ModbusTcpMessage>(command, cancellationToken, client);
|
||||
return await SendThenReturnAsync<MessageBase>(command, cancellationToken, client);
|
||||
}
|
||||
else if (TcpService.SocketClients.Count == 1)
|
||||
{
|
||||
@@ -208,13 +246,13 @@ public class ModbusTcpDtu : ReadWriteDevicesTcpServerBase
|
||||
if (client1 != null)
|
||||
{
|
||||
SetDataAdapter(client1);
|
||||
return await SendThenReturnAsync<ModbusTcpMessage>(command, cancellationToken, client1);
|
||||
return await SendThenReturnAsync<MessageBase>(command, cancellationToken, client1);
|
||||
}
|
||||
}
|
||||
return new OperResult<byte[]>("客户端未连接");
|
||||
}
|
||||
|
||||
internal class ModbusTcpDtuPlugin : PluginBase, ITcpReceivingPlugin
|
||||
internal class ModbusDtuPlugin : PluginBase, ITcpReceivingPlugin
|
||||
{
|
||||
public async Task OnTcpReceiving(ITcpClientBase client, ByteBlockEventArgs e)
|
||||
{
|
||||
@@ -134,21 +134,19 @@ internal class ModbusHelper
|
||||
|
||||
if (response[1] >= 0x80)//错误码
|
||||
return new OperResult<byte[], FilterResult>(GetDescriptionByErrorCode(response[2])) { Content2 = FilterResult.Success };
|
||||
if (response[1] <= 0x05)
|
||||
if (response[1] <= 0x04)
|
||||
{
|
||||
if ((response.Length < response[2] + 5))
|
||||
return new OperResult<byte[], FilterResult>("数据长度不足" + response.ToHexString()) { Content2 = FilterResult.Cache };
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((response.Length < 8))
|
||||
return new OperResult<byte[], FilterResult>("数据长度不足" + response.ToHexString()) { Content2 = FilterResult.Cache };
|
||||
|
||||
}
|
||||
|
||||
|
||||
var data = response.SelectMiddle(0, response[2] != 0 ? response[2] + 5 : 8);
|
||||
var data = response.SelectMiddle(0, response[1] <= 0x04 ? response[2] != 0 ? response[2] + 5 : 8 : 8);
|
||||
if (crcCheck && !CRC16Utils.CheckCRC16(data))
|
||||
return new OperResult<byte[], FilterResult>("Crc校验失败" + DataTransUtil.ByteToHexString(data, ' ')) { Content2 = FilterResult.Success };
|
||||
return GetModbusData(send, data.RemoveLast(2));
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace ThingsGateway.Foundation.Adapter.Modbus;
|
||||
/// </summary>
|
||||
internal class ModbusTcpDataHandleAdapter : ReadWriteDevicesSingleStreamDataHandleAdapter<ModbusTcpMessage>
|
||||
{
|
||||
private readonly IncrementCount easyIncrementCount = new(ushort.MaxValue);
|
||||
private readonly IncrementCount _incrementCount = new(ushort.MaxValue);
|
||||
|
||||
/// <summary>
|
||||
/// 检测事务标识符
|
||||
@@ -39,7 +39,7 @@ internal class ModbusTcpDataHandleAdapter : ReadWriteDevicesSingleStreamDataHand
|
||||
/// <inheritdoc/>
|
||||
public override byte[] PackCommand(byte[] command)
|
||||
{
|
||||
return ModbusHelper.AddModbusTcpHead(command, (ushort)easyIncrementCount.GetCurrentValue());
|
||||
return ModbusHelper.AddModbusTcpHead(command, (ushort)_incrementCount.GetCurrentValue());
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
|
||||
@@ -18,7 +18,7 @@ namespace ThingsGateway.Foundation.Adapter.Modbus;
|
||||
/// </summary>
|
||||
internal class ModbusUdpDataHandleAdapter : ReadWriteDevicesUdpDataHandleAdapter<ModbusTcpMessage>
|
||||
{
|
||||
private readonly IncrementCount easyIncrementCount = new(ushort.MaxValue);
|
||||
private readonly IncrementCount _incrementCount = new(ushort.MaxValue);
|
||||
|
||||
/// <summary>
|
||||
/// 检测事务标识符
|
||||
@@ -38,7 +38,7 @@ internal class ModbusUdpDataHandleAdapter : ReadWriteDevicesUdpDataHandleAdapter
|
||||
/// <inheritdoc/>
|
||||
public override byte[] PackCommand(byte[] command)
|
||||
{
|
||||
return ModbusHelper.AddModbusTcpHead(command, (ushort)easyIncrementCount.GetCurrentValue());
|
||||
return ModbusHelper.AddModbusTcpHead(command, (ushort)_incrementCount.GetCurrentValue());
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
|
||||
@@ -143,7 +143,7 @@ public interface IReadWrite : IDisposable
|
||||
/// <param name="cancellationToken">取消令箭</param>
|
||||
/// <param name="senderClient">传入改参数时,将新建等待线程</param>
|
||||
/// <returns></returns>
|
||||
T SendThenReturn<T>(byte[] command, CancellationToken cancellationToken, ISenderClient senderClient = default) where T : OperResult<byte[]>, new();
|
||||
T SendThenReturn<T>(byte[] command, CancellationToken cancellationToken, ISenderClient senderClient = default) where T : OperResult<byte[]>;
|
||||
|
||||
/// <summary>
|
||||
/// 异步发送并返回结果
|
||||
@@ -153,7 +153,7 @@ public interface IReadWrite : IDisposable
|
||||
/// <param name="cancellationToken">取消令箭</param>
|
||||
/// <param name="senderClient">传入改参数时,将新建等待线程</param>
|
||||
/// <returns></returns>
|
||||
Task<T> SendThenReturnAsync<T>(byte[] command, CancellationToken cancellationToken, ISenderClient senderClient = default) where T : OperResult<byte[]>, new();
|
||||
Task<T> SendThenReturnAsync<T>(byte[] command, CancellationToken cancellationToken, ISenderClient senderClient = default) where T : OperResult<byte[]>;
|
||||
|
||||
/// <summary>
|
||||
/// 发送获取数据
|
||||
|
||||
@@ -148,7 +148,7 @@ public abstract class ReadWriteDevicesBase : IReadWrite
|
||||
public abstract void Send(byte[] command, string id = default);
|
||||
|
||||
/// <inheritdoc/>
|
||||
public virtual T SendThenReturn<T>(byte[] command, CancellationToken cancellationToken, ISenderClient senderClient = default) where T : OperResult<byte[]>, new()
|
||||
public virtual T SendThenReturn<T>(byte[] command, CancellationToken cancellationToken, ISenderClient senderClient = default) where T : OperResult<byte[]>
|
||||
{
|
||||
var item = command;
|
||||
if (FrameTime != 0)
|
||||
@@ -157,7 +157,7 @@ public abstract class ReadWriteDevicesBase : IReadWrite
|
||||
return (T)result.RequestInfo;
|
||||
}
|
||||
/// <inheritdoc/>
|
||||
public virtual async Task<T> SendThenReturnAsync<T>(byte[] command, CancellationToken cancellationToken, ISenderClient senderClient = default) where T : OperResult<byte[]>, new()
|
||||
public virtual async Task<T> SendThenReturnAsync<T>(byte[] command, CancellationToken cancellationToken, ISenderClient senderClient = default) where T : OperResult<byte[]>
|
||||
{
|
||||
var item = command;
|
||||
await Task.Delay(FrameTime, cancellationToken);
|
||||
|
||||
@@ -69,7 +69,7 @@ public abstract class ReadWriteDevicesUdpSessionBase : ReadWriteDevicesBase
|
||||
/// <inheritdoc/>
|
||||
public override string ToString()
|
||||
{
|
||||
return UdpSession.RemoteIPHost.ToString();
|
||||
return UdpSession.RemoteIPHost?.ToString();
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
|
||||
@@ -29,6 +29,7 @@ public abstract class ReadWriteDevicesSingleStreamDataHandleAdapter<TRequest> :
|
||||
public ReadWriteDevicesSingleStreamDataHandleAdapter()
|
||||
{
|
||||
Request = GetInstance();
|
||||
CacheTimeoutEnable = true;
|
||||
}
|
||||
/// <inheritdoc/>
|
||||
public override bool CanSendRequestInfo => false;
|
||||
|
||||
@@ -53,7 +53,7 @@ public abstract class ReadWriteDevicesUdpDataHandleAdapter<TRequest> : UdpDataHa
|
||||
/// <inheritdoc/>
|
||||
public override string ToString()
|
||||
{
|
||||
return (Owner as UdpSession)?.RemoteIPHost.ToString();
|
||||
return (Owner as UdpSession)?.RemoteIPHost?.ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -83,11 +83,11 @@ public abstract class ReadWriteDevicesUdpDataHandleAdapter<TRequest> : UdpDataHa
|
||||
var allBytes = byteBlock.ToArray(0, byteBlock.Len);
|
||||
Logger?.Trace($"{FoundationConst.LogMessageHeader}{ToString()}- 接收:{(IsHexData ? allBytes.ToHexString(' ') : Encoding.UTF8.GetString(allBytes))}");
|
||||
|
||||
if (Request?.SendBytes == null)
|
||||
{
|
||||
GoReceived(remoteEndPoint, byteBlock, null);
|
||||
return;
|
||||
}
|
||||
//if (Request?.SendBytes == null)
|
||||
//{
|
||||
// GoReceived(remoteEndPoint, byteBlock, null);
|
||||
// return;
|
||||
//}
|
||||
byte[] header = new byte[] { };
|
||||
if (Request.HeadBytesLength > 0)
|
||||
{
|
||||
|
||||
@@ -421,6 +421,74 @@ public static class StringExtensions
|
||||
{
|
||||
return value.IsNullOrEmpty() ? defaultValue : ushort.TryParse(value, out var n) ? n : defaultValue;
|
||||
}
|
||||
/// <summary>
|
||||
/// ToDouble
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static double ToDouble(this object value, double defaultValue = 0)
|
||||
{
|
||||
if (value is Double d)
|
||||
{
|
||||
return Double.IsNaN(d) ? defaultValue : (Double)d;
|
||||
}
|
||||
var str = value?.ToString();
|
||||
if (str.IsNullOrEmpty())
|
||||
{
|
||||
return (double)defaultValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (value is bool boolValue)
|
||||
{
|
||||
return boolValue ? 1 : 0;
|
||||
}
|
||||
return (double)(double.TryParse(str, out var n) ? n : defaultValue);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ToDecimal
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static decimal ToDecimal(this object value, int defaultValue = 0)
|
||||
{
|
||||
if (value is Double d)
|
||||
{
|
||||
return Double.IsNaN(d) ? defaultValue : (Decimal)d;
|
||||
}
|
||||
var str = value?.ToString();
|
||||
if (str.IsNullOrEmpty())
|
||||
{
|
||||
return defaultValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (value is bool boolValue)
|
||||
{
|
||||
return boolValue ? 1 : 0;
|
||||
}
|
||||
return Decimal.TryParse(str, out var n) ? n : defaultValue;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// ToInt
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static int ToInt(this object value, int defaultValue = 0)
|
||||
{
|
||||
if (value == null || value.ToString().IsNullOrEmpty())
|
||||
{
|
||||
return defaultValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (value is bool boolValue)
|
||||
{
|
||||
return boolValue ? 1 : 0;
|
||||
}
|
||||
return int.TryParse(value.ToString(), out int n) ? n : defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 用 正则表达式 判断字符是不是汉字
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Condition="'$(TargetFramework)'=='net45'">
|
||||
|
||||
@@ -51,9 +51,9 @@ namespace ThingsGateway.Foundation.Sockets
|
||||
/// </summary>
|
||||
/// <param name="config"></param>
|
||||
/// <returns></returns>
|
||||
public static HttpClient BuildWithHttpClient(this TouchSocketConfig config)
|
||||
public static Http.HttpClient BuildWithHttpClient(this TouchSocketConfig config)
|
||||
{
|
||||
return BuildWithHttpClient<HttpClient>(config);
|
||||
return BuildWithHttpClient<Http.HttpClient>(config);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -43,26 +43,25 @@ namespace ThingsGateway.Foundation.Http
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 静态文件缓存。
|
||||
/// </summary>
|
||||
public FileCachePool FileCache { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 提供文件扩展名和MIME类型之间的映射。
|
||||
/// </summary>
|
||||
public IContentTypeProvider ContentTypeProvider { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 设置提供文件扩展名和MIME类型之间的映射。
|
||||
/// 静态文件缓存。
|
||||
/// </summary>
|
||||
/// <param name="provider"></param>
|
||||
/// <returns></returns>
|
||||
public HttpStaticPagePlugin SetContentTypeProvider(IContentTypeProvider provider)
|
||||
{
|
||||
this.ContentTypeProvider = provider ?? throw new ArgumentNullException(nameof(provider));
|
||||
return this;
|
||||
}
|
||||
public FileCachePool FileCache { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 重新导航。
|
||||
/// </summary>
|
||||
public Func<HttpRequest, Task<string>> NavigateAction { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 在响应之前调用
|
||||
/// </summary>
|
||||
public Func<HttpContext, Task> ResponseAction { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 添加静态
|
||||
@@ -76,7 +75,33 @@ namespace ThingsGateway.Foundation.Http
|
||||
timeout ??= TimeSpan.FromHours(1);
|
||||
this.FileCache.InsertPath(path, prefix, filter, timeout.Value, null);
|
||||
}
|
||||
/// <inheritdoc/>
|
||||
public async Task OnHttpRequest(IHttpSocketClient client, HttpContextEventArgs e)
|
||||
{
|
||||
var url = await this.NavigateAction.Invoke(e.Context.Request);
|
||||
if (this.FileCache.Find(url, out var data))
|
||||
{
|
||||
var response = e.Context.Response;
|
||||
response.SetStatus();
|
||||
if (this.ContentTypeProvider?.TryGetContentType(url, out var result) != true)
|
||||
{
|
||||
result = HttpTools.GetContentTypeFromExtension(url);
|
||||
}
|
||||
response.ContentType = result;
|
||||
response.SetContent(data);
|
||||
if (this.ResponseAction != null)
|
||||
{
|
||||
await this.ResponseAction.Invoke(e.Context);
|
||||
}
|
||||
|
||||
await response.AnswerAsync();
|
||||
e.Handled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
await e.InvokeNext();
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Clear static content cache
|
||||
/// </summary>
|
||||
@@ -84,20 +109,23 @@ namespace ThingsGateway.Foundation.Http
|
||||
{
|
||||
this.FileCache.Clear();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重新导航
|
||||
/// Remove static content cache
|
||||
/// </summary>
|
||||
public Func<HttpRequest, Task<string>> NavigateAction { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 设定重新导航
|
||||
/// </summary>
|
||||
/// <param name="func"></param>
|
||||
/// <returns></returns>
|
||||
public HttpStaticPagePlugin SetNavigateAction(Func<HttpRequest, Task<string>> func)
|
||||
/// <param name="path">Static content path</param>
|
||||
public void RemoveFolder(string path)
|
||||
{
|
||||
this.NavigateAction = func;
|
||||
this.FileCache.RemovePath(path);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置提供文件扩展名和MIME类型之间的映射。
|
||||
/// </summary>
|
||||
/// <param name="provider"></param>
|
||||
/// <returns></returns>
|
||||
public HttpStaticPagePlugin SetContentTypeProvider(IContentTypeProvider provider)
|
||||
{
|
||||
this.ContentTypeProvider = provider ?? throw new ArgumentNullException(nameof(provider));
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -115,35 +143,30 @@ namespace ThingsGateway.Foundation.Http
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public async Task OnHttpRequest(IHttpSocketClient client, HttpContextEventArgs e)
|
||||
/// <summary>
|
||||
/// 在响应之前调用。
|
||||
/// </summary>
|
||||
/// <param name="func"></param>
|
||||
/// <returns></returns>
|
||||
public HttpStaticPagePlugin SetResponseAction(Func<HttpContext, Task> func)
|
||||
{
|
||||
var url = await this.NavigateAction.Invoke(e.Context.Request);
|
||||
if (this.FileCache.Find(url, out var data))
|
||||
{
|
||||
e.Context.Response.SetStatus();
|
||||
if (this.ContentTypeProvider?.TryGetContentType(url, out var result) != true)
|
||||
{
|
||||
result = HttpTools.GetContentTypeFromExtension(url);
|
||||
}
|
||||
e.Context.Response.ContentType = result;
|
||||
e.Context.Response.SetContentLength(data.Length)
|
||||
.WriteContent(data);
|
||||
e.Handled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
await e.InvokeNext();
|
||||
}
|
||||
this.ResponseAction = func;
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Remove static content cache
|
||||
/// 在响应之前调用。
|
||||
/// </summary>
|
||||
/// <param name="path">Static content path</param>
|
||||
public void RemoveFolder(string path)
|
||||
/// <param name="action"></param>
|
||||
/// <returns></returns>
|
||||
public HttpStaticPagePlugin SetResponseAction(Action<HttpContext> action)
|
||||
{
|
||||
this.FileCache.RemovePath(path);
|
||||
this.ResponseAction = (response) =>
|
||||
{
|
||||
action.Invoke(response);
|
||||
return EasyTask.CompletedTask;
|
||||
};
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -40,6 +40,14 @@ namespace ThingsGateway.Foundation.Sockets
|
||||
{
|
||||
this.Protocol = Protocol.Tcp;
|
||||
}
|
||||
/// <summary>
|
||||
/// <inheritdoc/>
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{nameof(SocketClient)}:{IP}:{Port}";
|
||||
}
|
||||
|
||||
#region 变量
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@ namespace ThingsGateway.Foundation.WebApi.Swagger
|
||||
var bytes = new byte[stream.Length];
|
||||
stream.Read(bytes, 0, bytes.Length);
|
||||
var prefix = this.Prefix.IsNullOrEmpty() ? "/" : (this.Prefix.StartsWith("/") ? this.Prefix : $"/{this.Prefix}");
|
||||
var name = item.Replace("ThingsGateway.Foundation.ThingsGateway.Foundation.WebApi.Swagger.api.", string.Empty);
|
||||
var name = item.Replace("ThingsGateway.Foundation.TouchSocket.WebApi.Swagger.api.", string.Empty);
|
||||
if (name == "openapi.json")
|
||||
{
|
||||
try
|
||||
|
||||
@@ -342,11 +342,11 @@ namespace ThingsGateway.Foundation.WebApi
|
||||
var client = (IHttpSocketClient)sender;
|
||||
var e = (HttpContextEventArgs)args;
|
||||
|
||||
if (e.Context.Request.Method == HttpMethod.Get)
|
||||
if (e.Context.Request.Method == Http.HttpMethod.Get)
|
||||
{
|
||||
return this.OnHttpGet(client, e);
|
||||
}
|
||||
else if (e.Context.Request.Method == HttpMethod.Post)
|
||||
else if (e.Context.Request.Method == Http.HttpMethod.Post)
|
||||
{
|
||||
return this.OnHttpPost(client, e);
|
||||
}
|
||||
|
||||
@@ -1,16 +1,7 @@
|
||||
<Project>
|
||||
<Import Project="$(SolutionDir)\Directory.Build.props" />
|
||||
<PropertyGroup>
|
||||
<Version>4.0.0.4</Version>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<TargetFrameworks>net6.0;net8.0;</TargetFrameworks>
|
||||
<Authors>Diego</Authors>
|
||||
<Product>ThingsGateway</Product>
|
||||
<Copyright>© 2023-present Diego</Copyright>
|
||||
<RepositoryUrl>https://gitee.com/diego2098/ThingsGateway</RepositoryUrl>
|
||||
<SignAssembly>True</SignAssembly>
|
||||
<DelaySign>False</DelaySign>
|
||||
<SatelliteResourceLanguages>zh-Hans</SatelliteResourceLanguages>
|
||||
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
|
||||
@@ -30,14 +30,14 @@ public class CollectDbInfoControler : IDynamicApiController
|
||||
{
|
||||
readonly IServiceScope _serviceScope;
|
||||
/// <inheritdoc cref="CollectDbInfoControler"/>
|
||||
public CollectDbInfoControler(IServiceScopeFactory scopeFactory, VariableService variableService, CollectDeviceService collectDeviceService)
|
||||
public CollectDbInfoControler(IServiceScopeFactory scopeFactory, VariableService variableService, ICollectDeviceService collectDeviceService)
|
||||
{
|
||||
_serviceScope = scopeFactory.CreateScope();
|
||||
_variableService = variableService;
|
||||
_collectDeviceService = collectDeviceService;
|
||||
}
|
||||
|
||||
CollectDeviceService _collectDeviceService { get; set; }
|
||||
ICollectDeviceService _collectDeviceService { get; set; }
|
||||
VariableService _variableService { get; set; }
|
||||
/// <summary>
|
||||
/// 获取采集设备信息
|
||||
|
||||
@@ -23,9 +23,9 @@ namespace ThingsGateway.Gateway.ApiController;
|
||||
public class FileController : IDynamicApiController
|
||||
{
|
||||
private readonly IBackendLogService _backendLogService;
|
||||
private readonly CollectDeviceService _collectDeviceService;
|
||||
private readonly ICollectDeviceService _collectDeviceService;
|
||||
private readonly IRpcLogService _rpcLogService;
|
||||
private readonly UploadDeviceService _uploadDeviceService;
|
||||
private readonly IUploadDeviceService _uploadDeviceService;
|
||||
private readonly VariableService _variableService;
|
||||
/// <summary>
|
||||
/// <inheritdoc cref="FileController"/>
|
||||
@@ -33,8 +33,8 @@ public class FileController : IDynamicApiController
|
||||
public FileController(
|
||||
IRpcLogService rpcLogService,
|
||||
IBackendLogService backendLogService,
|
||||
CollectDeviceService collectDeviceService,
|
||||
UploadDeviceService uploadDeviceService,
|
||||
ICollectDeviceService collectDeviceService,
|
||||
IUploadDeviceService uploadDeviceService,
|
||||
VariableService variableService
|
||||
)
|
||||
{
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
采集设备
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:ThingsGateway.Gateway.ApiController.CollectDbInfoControler.#ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory,ThingsGateway.Gateway.Application.VariableService,ThingsGateway.Gateway.Application.CollectDeviceService)">
|
||||
<member name="M:ThingsGateway.Gateway.ApiController.CollectDbInfoControler.#ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory,ThingsGateway.Gateway.Application.VariableService,ThingsGateway.Gateway.Application.ICollectDeviceService)">
|
||||
<inheritdoc cref="T:ThingsGateway.Gateway.ApiController.CollectDbInfoControler"/>
|
||||
</member>
|
||||
<member name="M:ThingsGateway.Gateway.ApiController.CollectDbInfoControler.GetCollectDeviceList(ThingsGateway.Gateway.Application.DevicePageInput)">
|
||||
@@ -29,7 +29,7 @@
|
||||
文件下载
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:ThingsGateway.Gateway.ApiController.FileController.#ctor(ThingsGateway.Gateway.Application.IRpcLogService,ThingsGateway.Gateway.Application.IBackendLogService,ThingsGateway.Gateway.Application.CollectDeviceService,ThingsGateway.Gateway.Application.UploadDeviceService,ThingsGateway.Gateway.Application.VariableService)">
|
||||
<member name="M:ThingsGateway.Gateway.ApiController.FileController.#ctor(ThingsGateway.Gateway.Application.IRpcLogService,ThingsGateway.Gateway.Application.IBackendLogService,ThingsGateway.Gateway.Application.ICollectDeviceService,ThingsGateway.Gateway.Application.IUploadDeviceService,ThingsGateway.Gateway.Application.VariableService)">
|
||||
<summary>
|
||||
<inheritdoc cref="T:ThingsGateway.Gateway.ApiController.FileController"/>
|
||||
</summary>
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
//------------------------------------------------------------------------------
|
||||
#endregion
|
||||
|
||||
using Mapster;
|
||||
|
||||
using System.ComponentModel;
|
||||
|
||||
using ThingsGateway.Gateway.Core.Extensions;
|
||||
@@ -48,6 +50,7 @@ public class DeviceVariableRunTime : DeviceVariable, IDeviceVariableRunTime
|
||||
/// </summary>
|
||||
[Newtonsoft.Json.JsonIgnore]
|
||||
[System.Text.Json.Serialization.JsonIgnore]
|
||||
[AdaptIgnore]
|
||||
[Description("采集设备")]
|
||||
public CollectDeviceRunTime CollectDeviceRunTime { get; set; }
|
||||
|
||||
|
||||
@@ -43,14 +43,16 @@ public abstract class CollectBase : DriverBase
|
||||
|
||||
public override async Task AfterStopAsync()
|
||||
{
|
||||
await base.AfterStopAsync();
|
||||
//去除全局设备变量
|
||||
lock (_globalDeviceData.CollectDevices)
|
||||
{
|
||||
_globalDeviceData.CollectDevices.RemoveWhere(it => it.Id == DeviceId);
|
||||
}
|
||||
await base.AfterStopAsync();
|
||||
}
|
||||
|
||||
|
||||
|
||||
public override void Init(DeviceRunTime device)
|
||||
{
|
||||
base.Init(device);
|
||||
@@ -83,7 +85,7 @@ public abstract class CollectBase : DriverBase
|
||||
public virtual async Task<Dictionary<string, OperResult>> WriteValuesAsync(Dictionary<DeviceVariableRunTime, JToken> writeInfoLists, CancellationToken cancellationToken)
|
||||
{
|
||||
if (_readWrite == null)
|
||||
throw new("未初始化成功");
|
||||
throw new($"无法写入数据,{nameof(_readWrite)}为null");
|
||||
Dictionary<string, OperResult> operResults = new();
|
||||
foreach (var writeInfo in writeInfoLists)
|
||||
{
|
||||
@@ -165,7 +167,7 @@ public abstract class CollectBase : DriverBase
|
||||
|
||||
if (!string.IsNullOrEmpty(methodResult.MethodStr))
|
||||
{
|
||||
string[] strs = methodResult.MethodStr?.Trim()?.TrimEnd(';').Split(';');
|
||||
string[] strs = methodResult.MethodStr?.Trim()?.TrimEnd(',').Split(',');
|
||||
try
|
||||
{
|
||||
int index = 0;
|
||||
@@ -233,7 +235,7 @@ public abstract class CollectBase : DriverBase
|
||||
var readErrorCount = 0;
|
||||
var readResult = await ReadSourceAsync(deviceVariableSourceRead, cancellationToken);
|
||||
|
||||
while (readResult != null && !readResult.IsSuccess && readErrorCount < 3)
|
||||
while (readResult != null && !readResult.IsSuccess && readErrorCount < DriverPropertys.RetryCount)
|
||||
{
|
||||
readErrorCount++;
|
||||
LogMessage?.Trace($"{DeviceName} - 采集[{deviceVariableSourceRead?.Address} - {deviceVariableSourceRead?.Length}] 数据失败 - {readResult?.Message}");
|
||||
@@ -285,7 +287,7 @@ public abstract class CollectBase : DriverBase
|
||||
var readErrorCount = 0;
|
||||
var readResult = await InvokeMethodAsync(deviceVariableMethodRead, cancellationToken);
|
||||
|
||||
while (readResult != null && !readResult.IsSuccess && readErrorCount < 3)
|
||||
while (readResult != null && !readResult.IsSuccess && readErrorCount < DriverPropertys.RetryCount)
|
||||
{
|
||||
readErrorCount++;
|
||||
LogMessage?.Trace($"{DeviceName} - 执行方法[{deviceVariableMethodRead.MethodInfo.Name}] - 失败 - {readResult?.Message}");
|
||||
@@ -363,8 +365,8 @@ public abstract class CollectBase : DriverBase
|
||||
|
||||
if (!string.IsNullOrEmpty(deviceVariableMethodSource.MethodStr) || !string.IsNullOrEmpty(value))
|
||||
{
|
||||
var strs1 = deviceVariableMethodSource.MethodStr?.Trim()?.TrimEnd(';').Split(';') ?? Array.Empty<string>();
|
||||
var strs2 = value?.Trim()?.TrimEnd(';').Split(';') ?? Array.Empty<string>();
|
||||
var strs1 = deviceVariableMethodSource.MethodStr?.Trim()?.TrimEnd(',').Split(',') ?? Array.Empty<string>();
|
||||
var strs2 = value?.Trim()?.TrimEnd(',').Split(',') ?? Array.Empty<string>();
|
||||
//通过分号分割,并且合并参数
|
||||
var strs = GenericExtensions.SpliceArray(strs1, strs2);
|
||||
int index = 0;
|
||||
|
||||
@@ -139,7 +139,11 @@ public class DeviceThread
|
||||
var result = await device.ExecuteAsync(stoppingToken);
|
||||
if (result == ThreadRunReturn.None)
|
||||
{
|
||||
await Task.Delay(CycleInterval, stoppingToken);
|
||||
//4.0.0.7版本添加离线恢复的间隔时间
|
||||
if (device.CurrentDevice.DeviceStatus == DeviceStatusEnum.OffLine && device is not UpLoadBase)
|
||||
await Task.Delay(Math.Min(device.DriverPropertys.ReIntervalTime, DeviceWorker.CheckIntervalTime / 2) * 1000 - CycleInterval, stoppingToken);
|
||||
else
|
||||
await Task.Delay(CycleInterval, stoppingToken);
|
||||
}
|
||||
else if (result == ThreadRunReturn.Continue)
|
||||
{
|
||||
|
||||
@@ -275,7 +275,7 @@ public abstract class DriverBase : DisposableObject
|
||||
{
|
||||
LogMessage?.LogError(ex, $"插件执行{nameof(ExecuteAsync)}方法失败");
|
||||
CurrentDevice.SetDeviceStatus(null, CurrentDevice.ErrorCount + 1, ex.Message);
|
||||
return ThreadRunReturn.Continue;
|
||||
return ThreadRunReturn.None;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -33,6 +33,17 @@ public abstract class VariablePropertyBase
|
||||
/// </summary>
|
||||
public abstract class DriverPropertyBase
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 离线后恢复运行的间隔时间 /s,默认300s
|
||||
/// </summary>
|
||||
[DeviceProperty("离线恢复间隔", "离线后恢复运行的间隔时间s,默认300s,最大3600s")]
|
||||
public virtual int ReIntervalTime { get; set; } = 300;
|
||||
/// <summary>
|
||||
/// 失败重试次数,默认3
|
||||
/// </summary>
|
||||
[DeviceProperty("失败重试次数", "失败重试次数,默认3")]
|
||||
public virtual int RetryCount { get; set; } = 3;
|
||||
#region 共享通道配置
|
||||
|
||||
/// <summary>
|
||||
@@ -87,4 +98,22 @@ public abstract class DriverPropertyBase
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 插件配置项
|
||||
/// <para></para>
|
||||
/// 约定:
|
||||
/// 如果需要密码输入,属性名称中需包含Password字符串
|
||||
/// <br></br>
|
||||
/// 使用<see cref="DevicePropertyAttribute"/> 标识所需的配置属性
|
||||
/// </summary>
|
||||
public abstract class UpDriverPropertyBase : DriverPropertyBase
|
||||
{
|
||||
|
||||
public override int ReIntervalTime { get; set; } = 300;
|
||||
|
||||
public override int RetryCount { get; set; } = 3;
|
||||
|
||||
}
|
||||
@@ -15,7 +15,7 @@ namespace ThingsGateway.Gateway.Application;
|
||||
/// <summary>
|
||||
/// <inheritdoc/>
|
||||
/// </summary>
|
||||
public class UploadPropertyWithCache : DriverPropertyBase
|
||||
public class UploadPropertyWithCache : UpDriverPropertyBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 线程循环间隔
|
||||
|
||||
@@ -15,7 +15,7 @@ namespace ThingsGateway.Gateway.Application;
|
||||
/// <summary>
|
||||
/// <inheritdoc/>
|
||||
/// </summary>
|
||||
public class UploadPropertyWithCacheT : DriverPropertyBase
|
||||
public class UploadPropertyWithCacheT : UpDriverPropertyBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 线程循环间隔
|
||||
|
||||
@@ -24,8 +24,10 @@ using Yitter.IdGenerator;
|
||||
namespace ThingsGateway.Gateway.Application;
|
||||
|
||||
[Injection(Proxy = typeof(OperDispatchProxy))]
|
||||
public class CollectDeviceService : DeviceService<CollectDevice>, ITransient
|
||||
public class CollectDeviceService : DeviceService<CollectDevice>, ITransient, ICollectDeviceService
|
||||
{
|
||||
protected override string DeviceSheetName => ExportHelpers.CollectDeviceSheetName;
|
||||
|
||||
public CollectDeviceService(IServiceScopeFactory serviceScopeFactory, IFileService fileService) : base(serviceScopeFactory, fileService)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
//------------------------------------------------------------------------------
|
||||
#endregion
|
||||
|
||||
using Furion.DependencyInjection;
|
||||
using Furion.FriendlyException;
|
||||
|
||||
using Mapster;
|
||||
@@ -31,12 +30,11 @@ using Yitter.IdGenerator;
|
||||
|
||||
namespace ThingsGateway.Gateway.Application;
|
||||
|
||||
[Injection(Proxy = typeof(OperDispatchProxy))]
|
||||
public abstract class DeviceService<T> : DbRepository<T> where T : Device, new()
|
||||
public abstract class DeviceService<T> : DbRepository<T>, IDeviceService<T> where T : Device, new()
|
||||
{
|
||||
protected readonly IFileService _fileService;
|
||||
protected readonly IServiceScope _serviceScope;
|
||||
/// <inheritdoc cref="CollectDeviceService"/>
|
||||
/// <inheritdoc cref="ICollectDeviceService"/>
|
||||
public DeviceService(
|
||||
IServiceScopeFactory serviceScopeFactory,
|
||||
IFileService fileService
|
||||
@@ -206,7 +204,7 @@ public abstract class DeviceService<T> : DbRepository<T> where T : Device, new()
|
||||
var data = await query.ToListAsync();
|
||||
return await ExportFileAsync(data);
|
||||
}
|
||||
|
||||
protected abstract string DeviceSheetName { get; }
|
||||
/// <inheritdoc/>
|
||||
[OperDesc("导出采集设备表", IsRecordPar = false)]
|
||||
public async Task<MemoryStream> ExportFileAsync(List<T> devDatas = null)
|
||||
@@ -235,8 +233,8 @@ public abstract class DeviceService<T> : DbRepository<T> where T : Device, new()
|
||||
}
|
||||
deviceDicts.TryGetValue(devData.RedundantDeviceId, out var redundantDevice);
|
||||
|
||||
//设备实体没有包含插件名称,手动插入
|
||||
devExport.Add(ExportHelpers.PluginName, devData.PluginName);
|
||||
////设备实体没有包含插件名称,手动插入
|
||||
//devExport.Add(ExportHelpers.PluginName, devData.PluginName);
|
||||
//设备实体没有包含冗余设备名称,手动插入
|
||||
devExport.Add(ExportHelpers.RedundantDeviceName, redundantDevice?.Name);
|
||||
|
||||
@@ -277,7 +275,7 @@ public abstract class DeviceService<T> : DbRepository<T> where T : Device, new()
|
||||
}
|
||||
|
||||
//添加设备页
|
||||
sheets.Add(ExportHelpers.CollectDeviceSheetName, devExports);
|
||||
sheets.Add(DeviceSheetName, devExports);
|
||||
|
||||
|
||||
//添加插件属性页
|
||||
@@ -321,7 +319,7 @@ public abstract class DeviceService<T> : DbRepository<T> where T : Device, new()
|
||||
var collectDevices = new List<T>();
|
||||
foreach (var item in input)
|
||||
{
|
||||
if (item.Key == ExportHelpers.CollectDeviceSheetName)
|
||||
if (item.Key == DeviceSheetName)
|
||||
{
|
||||
var collectDeviceImports = ((ImportPreviewOutput<T>)item.Value).Data;
|
||||
collectDevices = collectDeviceImports.Values.Adapt<List<T>>();
|
||||
@@ -362,7 +360,7 @@ public abstract class DeviceService<T> : DbRepository<T> where T : Device, new()
|
||||
//单页数据
|
||||
var rows = stream.Query(useHeaderRow: true, sheetName: sheetName).Cast<IDictionary<string, object>>();
|
||||
#region 采集设备sheet
|
||||
if (sheetName == ExportHelpers.CollectDeviceSheetName)
|
||||
if (sheetName == DeviceSheetName)
|
||||
{
|
||||
int row = 1;
|
||||
ImportPreviewOutput<T> importPreviewOutput = new();
|
||||
@@ -376,22 +374,22 @@ public abstract class DeviceService<T> : DbRepository<T> where T : Device, new()
|
||||
{
|
||||
var device = ((ExpandoObject)item).ConvertToEntity<T>(true);
|
||||
#region 特殊转化名称
|
||||
//转化插件名称
|
||||
var hasPlugin = item.TryGetValue(ExportHelpers.PluginName, out var pluginObj);
|
||||
////转化插件名称
|
||||
//var hasPlugin = item.TryGetValue(ExportHelpers.PluginName, out var pluginObj);
|
||||
|
||||
if (pluginObj == null || !driverPluginFullNameDict.TryGetValue(pluginObj.ToString(), out var plugin))
|
||||
{
|
||||
//找不到对应的插件
|
||||
importPreviewOutput.HasError = true;
|
||||
importPreviewOutput.Results.Add((row++, false, $"{ExportHelpers.PluginName}不存在"));
|
||||
return;
|
||||
}
|
||||
//if (pluginObj == null || !driverPluginFullNameDict.TryGetValue(pluginObj.ToString(), out var plugin))
|
||||
//{
|
||||
// //找不到对应的插件
|
||||
// importPreviewOutput.HasError = true;
|
||||
// importPreviewOutput.Results.Add((row++, false, $"{ExportHelpers.PluginName}不存在"));
|
||||
// return;
|
||||
//}
|
||||
//转化冗余设备名称
|
||||
var hasRedundant = item.TryGetValue(ExportHelpers.PluginName, out var redundantObj);
|
||||
var hasRedundant = item.TryGetValue(ExportHelpers.RedundantDeviceName, out var redundantObj);
|
||||
|
||||
#endregion
|
||||
//设备ID、冗余设备ID都需要手动补录
|
||||
if (hasRedundant && deviceDicts.TryGetValue(redundantObj.ToString(), out var rendundantDevice))
|
||||
if (hasRedundant && redundantObj != null && deviceDicts.TryGetValue(redundantObj.ToString(), out var rendundantDevice))
|
||||
{
|
||||
device.RedundantDeviceId = rendundantDevice.Id;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
|
||||
namespace ThingsGateway.Gateway.Application
|
||||
{
|
||||
public interface ICollectDeviceService : IDeviceService<CollectDevice>
|
||||
{
|
||||
Task CopyDevAndVarAsync(IEnumerable<CollectDevice> input);
|
||||
Task EditsAsync(List<CollectDevice> input);
|
||||
Task<IEnumerable<DeviceRunTime>> GetDeviceRuntimeAsync(long devId = 0);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
using Microsoft.AspNetCore.Components.Forms;
|
||||
|
||||
namespace ThingsGateway.Gateway.Application
|
||||
{
|
||||
public interface IDeviceService<T> where T : Device, new()
|
||||
{
|
||||
Task AddAsync(T input);
|
||||
Task CopyDevAsync(IEnumerable<T> input);
|
||||
Task DeleteAsync(params long[] input);
|
||||
Task EditAsync(DeviceEditInput input);
|
||||
Task<MemoryStream> ExportFileAsync(List<T> devDatas = null);
|
||||
Task<MemoryStream> ExportFileAsync(DeviceInput input);
|
||||
List<T> GetCacheList(bool isMapster);
|
||||
T GetDeviceById(long Id);
|
||||
long? GetIdByName(string name);
|
||||
string GetNameById(long id);
|
||||
List<DeviceTree> GetTree();
|
||||
Task ImportAsync(Dictionary<string, ImportPreviewOutputBase> input);
|
||||
Task<SqlSugarPagedList<T>> PageAsync(DevicePageInput input);
|
||||
Task<Dictionary<string, ImportPreviewOutputBase>> PreviewAsync(IBrowserFile file);
|
||||
Task<Dictionary<string, ImportPreviewOutputBase>> PreviewAsync(MemoryStream stream);
|
||||
void RemoveCache();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
|
||||
namespace ThingsGateway.Gateway.Application
|
||||
{
|
||||
public interface IUploadDeviceService : IDeviceService<Device>
|
||||
{
|
||||
Task EditsAsync(List<Device> input);
|
||||
IEnumerable<DeviceRunTime> GetDeviceRuntime(long devId = 0);
|
||||
}
|
||||
}
|
||||
@@ -19,8 +19,9 @@ using Microsoft.Extensions.DependencyInjection;
|
||||
namespace ThingsGateway.Gateway.Application;
|
||||
|
||||
[Injection(Proxy = typeof(OperDispatchProxy))]
|
||||
public class UploadDeviceService : DeviceService<Device>, ITransient
|
||||
public class UploadDeviceService : DeviceService<Device>, ITransient, IUploadDeviceService
|
||||
{
|
||||
protected override string DeviceSheetName => ExportHelpers.UploadDeviceSheetName;
|
||||
public UploadDeviceService(IServiceScopeFactory serviceScopeFactory, IFileService fileService) : base(serviceScopeFactory, fileService)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -173,7 +173,7 @@ public class DriverPluginService : ISingleton
|
||||
|
||||
}
|
||||
return plugins;
|
||||
}, false);
|
||||
}, true);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@@ -270,9 +270,9 @@ public class DriverPluginService : ISingleton
|
||||
static T GetCustomAttributeRecursive<T>(PropertyInfo property) where T : Attribute
|
||||
{
|
||||
var attribute = property.GetCustomAttribute<T>(false);
|
||||
if (attribute == null && property.DeclaringType.BaseType != null)
|
||||
if (attribute == null && property.ReflectedType.BaseType != null && property.ReflectedType != typeof(UpDriverPropertyBase))
|
||||
{
|
||||
var baseProperty = property.DeclaringType.BaseType.GetProperties().FirstOrDefault(p => p.Name == property.Name);
|
||||
var baseProperty = property.ReflectedType.BaseType.GetProperties().FirstOrDefault(p => p.Name == property.Name);
|
||||
if (baseProperty != null)
|
||||
{
|
||||
attribute = GetCustomAttributeRecursive<T>(baseProperty);
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
using Furion.DependencyInjection;
|
||||
|
||||
using Microsoft.AspNetCore.Components.Forms;
|
||||
|
||||
namespace ThingsGateway.Gateway.Application;
|
||||
|
||||
public interface IVariableService : ITransient
|
||||
{
|
||||
Task AddAsync(DeviceVariable input);
|
||||
Task AddBatchAsync(List<DeviceVariable> input);
|
||||
Task ClearDeviceVariableAsync();
|
||||
Task DeleteAsync(params long[] input);
|
||||
void DeleteVariableFromCache();
|
||||
Task EditAsync(DeviceVariable input);
|
||||
Task<MemoryStream> ExportFileAsync(List<DeviceVariable> deviceVariables = null, string deviceName = null);
|
||||
Task<MemoryStream> ExportFileAsync(VariableInput input);
|
||||
Task<List<DeviceVariableRunTime>> GetDeviceVariableRuntimeAsync(long devId = 0);
|
||||
Task<List<DeviceVariableRunTime>> GetMemoryVariableRuntimeAsync();
|
||||
Task ImportAsync(Dictionary<string, ImportPreviewOutputBase> input);
|
||||
Task<SqlSugarPagedList<DeviceVariable>> PageAsync(VariablePageInput input);
|
||||
Task<Dictionary<string, ImportPreviewOutputBase>> PreviewAsync(IBrowserFile file);
|
||||
Task<Dictionary<string, ImportPreviewOutputBase>> PreviewAsync(MemoryStream stream, List<CollectDevice> memCollectDevices = null, List<Device> memUploadDevices = null);
|
||||
}
|
||||
@@ -32,18 +32,18 @@ namespace ThingsGateway.Gateway.Application;
|
||||
|
||||
/// <inheritdoc cref="VariableService"/>
|
||||
[Injection(Proxy = typeof(OperDispatchProxy))]
|
||||
public class VariableService : DbRepository<DeviceVariable>, ITransient
|
||||
public class VariableService : DbRepository<DeviceVariable>, IVariableService
|
||||
{
|
||||
private readonly CollectDeviceService _collectDeviceService;
|
||||
private readonly UploadDeviceService _uploadDeviceService;
|
||||
private readonly ICollectDeviceService _collectDeviceService;
|
||||
private readonly IUploadDeviceService _uploadDeviceService;
|
||||
private readonly FileService _fileService;
|
||||
private readonly IServiceScope _serviceScope;
|
||||
|
||||
/// <inheritdoc cref="VariableService"/>
|
||||
public VariableService(
|
||||
CollectDeviceService collectDeviceService,
|
||||
ICollectDeviceService collectDeviceService,
|
||||
FileService fileService,
|
||||
UploadDeviceService uploadDeviceService,
|
||||
IUploadDeviceService uploadDeviceService,
|
||||
IServiceScopeFactory scopeFactory)
|
||||
{
|
||||
_serviceScope = scopeFactory.CreateScope();
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
using System.Reflection;
|
||||
|
||||
namespace ThingsGateway.Gateway.Application;
|
||||
|
||||
/// <summary>
|
||||
@@ -42,6 +44,9 @@ public class Startup : AppStartup
|
||||
services.AddHostedService<CollectDeviceWorker>();
|
||||
services.AddHostedService<AlarmWorker>();
|
||||
services.AddHostedService<UploadDeviceWorker>();
|
||||
|
||||
ThingsGateway.Core.TypeExtensions.DefaultFuncs.Add(a => a.GetCustomAttribute<VariablePropertyAttribute>()?.Description);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -8,13 +8,21 @@
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<!--kafka在某些系统中出现无法动态加载资源的情况,需要手动拷贝到主程序下,所以这里直接引用native内容,发布会自动生成-->
|
||||
<PackageReference Include="Confluent.Kafka" Version="2.3.0">
|
||||
<Private>false</Private>
|
||||
<CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies>
|
||||
<IncludeAssets> native; </IncludeAssets>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="LiteDB" Version="5.0.17" />
|
||||
<PackageReference Include="Hardware.Info" Version="100.0.0" />
|
||||
<PackageReference Include="CS-Script" Version="4.8.8" />
|
||||
<PackageReference Include="Hardware.Info" Version="100.0.0.1" />
|
||||
<PackageReference Include="CodingSeb.ExpressionEvaluator" Version="1.4.40" />
|
||||
<PackageReference Include="CS-Script" Version="4.8.10" />
|
||||
<!--CS-Script与Furion冲突,直接安装覆盖版本-->
|
||||
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.7.0" />
|
||||
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.8.0" />
|
||||
<PackageReference Include="SqlSugar.TDengineCore" Version="3.4.0" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace ThingsGateway.Gateway.Application;
|
||||
/// </summary>
|
||||
public class CollectDeviceWorker : DeviceWorker
|
||||
{
|
||||
|
||||
private GlobalDeviceData _globalDeviceData;
|
||||
public CollectDeviceWorker(IServiceScopeFactory serviceScopeFactory, IHostApplicationLifetime appLifetime) : base(serviceScopeFactory, appLifetime)
|
||||
{
|
||||
_logger = _serviceScope.ServiceProvider.GetService<ILoggerFactory>().CreateLogger("南向设备服务");
|
||||
@@ -49,6 +49,10 @@ public class CollectDeviceWorker : DeviceWorker
|
||||
await StopOtherHostService();
|
||||
//停止全部采集线程
|
||||
await RemoveAllDeviceThreadAsync();
|
||||
|
||||
//清空内存列表
|
||||
_globalDeviceData.CollectDevices.Clear();
|
||||
|
||||
//创建全部采集线程
|
||||
await CreatAllDeviceThreadsAsync();
|
||||
//开始其他后台服务
|
||||
@@ -101,7 +105,7 @@ public class CollectDeviceWorker : DeviceWorker
|
||||
if (!_stoppingToken.IsCancellationRequested)
|
||||
{
|
||||
_logger.LogInformation("正在获取南向设备组态信息");
|
||||
var collectDeviceRunTimes = (await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetDeviceRuntimeAsync());
|
||||
var collectDeviceRunTimes = (await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetDeviceRuntimeAsync());
|
||||
_logger.LogInformation("获取南向设备组态信息完成");
|
||||
foreach (var collectDeviceRunTime in collectDeviceRunTimes.Where(a => !collectDeviceRunTimes.Any(b => a.Id == b.RedundantDeviceId && b.IsRedundant)))
|
||||
{
|
||||
@@ -125,7 +129,7 @@ public class CollectDeviceWorker : DeviceWorker
|
||||
|
||||
protected override async Task<IEnumerable<DeviceRunTime>> GetDeviceRunTimeAsync(long devId)
|
||||
{
|
||||
return await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetDeviceRuntimeAsync(devId);
|
||||
return await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetDeviceRuntimeAsync(devId);
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -139,7 +143,7 @@ public class CollectDeviceWorker : DeviceWorker
|
||||
/// <returns></returns>
|
||||
public List<string> GetDeviceMethods(long devId)
|
||||
{
|
||||
var pluginName = _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetDeviceById(devId).PluginName;
|
||||
var pluginName = _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetDeviceById(devId).PluginName;
|
||||
var driverBase = _driverPluginService.GetDriver(pluginName);
|
||||
var Propertys = _driverPluginService.GetDriverMethodInfo(driverBase);
|
||||
driverBase?.SafeDispose();
|
||||
@@ -158,7 +162,7 @@ public class CollectDeviceWorker : DeviceWorker
|
||||
var Propertys = _driverPluginService.GetDriverProperties(driverBase);
|
||||
if (devId != 0)
|
||||
{
|
||||
var collectDevice = _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetDeviceById(devId);
|
||||
var collectDevice = _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetDeviceById(devId);
|
||||
collectDevice?.DevicePropertys?.ForEach(it =>
|
||||
{
|
||||
var dependencyProperty = Propertys.FirstOrDefault(a => a.PropertyName == it.PropertyName);
|
||||
@@ -197,10 +201,13 @@ public class CollectDeviceWorker : DeviceWorker
|
||||
{
|
||||
await _easyLock?.WaitAsync();
|
||||
_driverPluginService = _serviceScope.ServiceProvider.GetService<DriverPluginService>();
|
||||
_globalDeviceData = _serviceScope.ServiceProvider.GetService<GlobalDeviceData>();
|
||||
//重启采集线程,会启动其他后台服务
|
||||
await RestartDeviceThreadAsync();
|
||||
await WhileExecuteAsync(stoppingToken);
|
||||
}
|
||||
|
||||
|
||||
protected virtual async Task WhileExecuteAsync(CancellationToken stoppingToken)
|
||||
{
|
||||
while (!stoppingToken.IsCancellationRequested)
|
||||
@@ -224,17 +231,17 @@ public class CollectDeviceWorker : DeviceWorker
|
||||
|
||||
if (driverBase.CurrentDevice.DeviceStatus == DeviceStatusEnum.OffLine)
|
||||
{
|
||||
if (driverBase.CurrentDevice.IsRedundant && _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetCacheList(false).Any(a => a.Id == driverBase.CurrentDevice.RedundantDeviceId))
|
||||
if (driverBase.CurrentDevice.IsRedundant && _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetCacheList(false).Any(a => a.Id == driverBase.CurrentDevice.RedundantDeviceId))
|
||||
{
|
||||
await DeviceRedundantThreadAsync(driverBase.CurrentDevice.Id);
|
||||
}
|
||||
}
|
||||
|
||||
//超过30分钟,或者(初始化失败并超过10分钟)会重启
|
||||
|
||||
if (
|
||||
(driverBase.CurrentDevice.ActiveTime != DateTime.MinValue &&
|
||||
driverBase.CurrentDevice.ActiveTime.AddMinutes(30) <= DateTimeExtensions.CurrentDateTime)
|
||||
|| (driverBase.IsInitSuccess == false && driverBase.CurrentDevice.ActiveTime.AddMinutes(10) <= DateTimeExtensions.CurrentDateTime)
|
||||
driverBase.CurrentDevice.ActiveTime.AddSeconds(CheckIntervalTime) <= DateTimeExtensions.CurrentDateTime)
|
||||
|| (driverBase.IsInitSuccess == false && driverBase.CurrentDevice.ActiveTime.AddMinutes(CheckIntervalTime) <= DateTimeExtensions.CurrentDateTime)
|
||||
)
|
||||
{
|
||||
//如果线程处于暂停状态,跳过
|
||||
|
||||
@@ -49,7 +49,7 @@ public abstract class DeviceWorker : BackgroundService
|
||||
/// </summary>
|
||||
public List<DriverBase> DriverBases => _deviceThreads
|
||||
.Where(a => a.DriverBases.Any(b => b.CurrentDevice != null))
|
||||
.SelectMany(a => a.DriverBases).ToList();
|
||||
.SelectMany(a => a.DriverBases).OrderByDescending(a => a.CurrentDevice.DeviceStatus).ToList();
|
||||
|
||||
/// <summary>
|
||||
/// 设备子线程列表
|
||||
@@ -381,7 +381,10 @@ public abstract class DeviceWorker : BackgroundService
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 线程检查时间,120分钟
|
||||
/// </summary>
|
||||
public const int CheckIntervalTime = 7200;
|
||||
protected abstract Task StartOtherHostService();
|
||||
protected abstract Task StopOtherHostService();
|
||||
|
||||
|
||||
@@ -100,7 +100,7 @@ public class UploadDeviceWorker : DeviceWorker
|
||||
if (!_stoppingToken.IsCancellationRequested)
|
||||
{
|
||||
_logger.LogInformation("正在获取北向设备组态信息");
|
||||
var deviceRunTimes = (_serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetDeviceRuntime());
|
||||
var deviceRunTimes = (_serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetDeviceRuntime());
|
||||
_logger.LogInformation("获取北向设备组态信息完成");
|
||||
foreach (var uploadDeviceRunTime in deviceRunTimes.Where(a => !deviceRunTimes.Any(b => a.Id == b.RedundantDeviceId && b.IsRedundant)))
|
||||
{
|
||||
@@ -135,7 +135,7 @@ public class UploadDeviceWorker : DeviceWorker
|
||||
/// <returns></returns>
|
||||
public List<string> GetDeviceMethods(long devId)
|
||||
{
|
||||
var pluginName = _serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetDeviceById(devId).PluginName;
|
||||
var pluginName = _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetDeviceById(devId).PluginName;
|
||||
var driverBase = _driverPluginService.GetDriver(pluginName);
|
||||
var Propertys = _driverPluginService.GetDriverMethodInfo(driverBase);
|
||||
driverBase?.SafeDispose();
|
||||
@@ -154,7 +154,7 @@ public class UploadDeviceWorker : DeviceWorker
|
||||
var Propertys = _driverPluginService.GetDriverProperties(driverBase);
|
||||
if (devId != 0)
|
||||
{
|
||||
var uploadDevice = _serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetDeviceById(devId);
|
||||
var uploadDevice = _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetDeviceById(devId);
|
||||
uploadDevice?.DevicePropertys?.ForEach(it =>
|
||||
{
|
||||
var dependencyProperty = Propertys.FirstOrDefault(a => a.PropertyName == it.PropertyName);
|
||||
@@ -237,7 +237,7 @@ public class UploadDeviceWorker : DeviceWorker
|
||||
|
||||
if (driverBase.CurrentDevice.DeviceStatus == DeviceStatusEnum.OffLine)
|
||||
{
|
||||
if (driverBase.CurrentDevice.IsRedundant && _serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetCacheList(false).Any(a => a.Id == driverBase.CurrentDevice.RedundantDeviceId))
|
||||
if (driverBase.CurrentDevice.IsRedundant && _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetCacheList(false).Any(a => a.Id == driverBase.CurrentDevice.RedundantDeviceId))
|
||||
{
|
||||
await DeviceRedundantThreadAsync(driverBase.CurrentDevice.Id);
|
||||
}
|
||||
@@ -245,11 +245,11 @@ public class UploadDeviceWorker : DeviceWorker
|
||||
|
||||
|
||||
|
||||
//超过30分钟,或者(初始化失败并超过10分钟)会重启
|
||||
|
||||
if (
|
||||
(driverBase.CurrentDevice.ActiveTime != DateTime.MinValue &&
|
||||
driverBase.CurrentDevice.ActiveTime.AddMinutes(30) <= DateTimeExtensions.CurrentDateTime)
|
||||
|| (driverBase.IsInitSuccess == false && driverBase.CurrentDevice.ActiveTime.AddMinutes(10) <= DateTimeExtensions.CurrentDateTime)
|
||||
driverBase.CurrentDevice.ActiveTime.AddMinutes(CheckIntervalTime) <= DateTimeExtensions.CurrentDateTime)
|
||||
|| (driverBase.IsInitSuccess == false && driverBase.CurrentDevice.ActiveTime.AddMinutes(CheckIntervalTime) <= DateTimeExtensions.CurrentDateTime)
|
||||
)
|
||||
{
|
||||
//如果线程处于暂停状态,跳过
|
||||
@@ -307,7 +307,7 @@ public class UploadDeviceWorker : DeviceWorker
|
||||
|
||||
protected override Task<IEnumerable<DeviceRunTime>> GetDeviceRunTimeAsync(long devId)
|
||||
{
|
||||
return Task.FromResult(_serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetDeviceRuntime(devId));
|
||||
return Task.FromResult(_serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetDeviceRuntime(devId));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -34,7 +34,7 @@ public partial class BackendLogPage
|
||||
var confirm = await PopupService.OpenConfirmDialogAsync("删除", "确定 ?");
|
||||
if (confirm)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<BackendLogService>().DeleteAsync();
|
||||
await _serviceScope.ServiceProvider.GetService<IBackendLogService>().DeleteAsync();
|
||||
await _datatable?.QueryClickAsync();
|
||||
}
|
||||
}
|
||||
@@ -46,7 +46,7 @@ public partial class BackendLogPage
|
||||
|
||||
private async Task<ISqlSugarPagedList<BackendLog>> QueryCallAsync(BackendLogPageInput input)
|
||||
{
|
||||
var data = await _serviceScope.ServiceProvider.GetService<BackendLogService>().PageAsync(input);
|
||||
var data = await _serviceScope.ServiceProvider.GetService<IBackendLogService>().PageAsync(input);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@@ -35,7 +35,7 @@ public partial class CollectDevicePage : BaseComponentBase
|
||||
List<CollectDevice> _devices = new();
|
||||
List<DriverPlugin> _driverPlugins;
|
||||
ImportExcel _importExcel;
|
||||
string _searchName;
|
||||
//string _searchName;
|
||||
[Inject]
|
||||
AjaxService _ajaxService { get; set; }
|
||||
[Inject]
|
||||
@@ -62,18 +62,18 @@ public partial class CollectDevicePage : BaseComponentBase
|
||||
return;
|
||||
}
|
||||
}
|
||||
data ??= _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetCacheList(true);
|
||||
data ??= _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetCacheList(true);
|
||||
foreach (var device in data)
|
||||
{
|
||||
device.DevicePropertys = GetDriverProperties(device.PluginName, device.Id);
|
||||
}
|
||||
await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().EditsAsync(data);
|
||||
await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().EditsAsync(data);
|
||||
await PopupService.EnqueueSnackbarAsync("刷新成功", AlertTypes.Success);
|
||||
|
||||
}
|
||||
private async Task AddCallAsync(DeviceAddInput input)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().AddAsync(input);
|
||||
await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().AddAsync(input);
|
||||
Refresh();
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
}
|
||||
@@ -85,7 +85,7 @@ public partial class CollectDevicePage : BaseComponentBase
|
||||
return;
|
||||
}
|
||||
|
||||
await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().CopyDevAndVarAsync(data);
|
||||
await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().CopyDevAndVarAsync(data);
|
||||
await DatatableQueryAsync();
|
||||
await PopupService.EnqueueSnackbarAsync("复制成功", AlertTypes.Success);
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
@@ -99,7 +99,7 @@ public partial class CollectDevicePage : BaseComponentBase
|
||||
return;
|
||||
}
|
||||
|
||||
await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().CopyDevAsync(data);
|
||||
await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().CopyDevAsync(data);
|
||||
await DatatableQueryAsync();
|
||||
await PopupService.EnqueueSnackbarAsync("复制成功", AlertTypes.Success);
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
@@ -112,14 +112,14 @@ public partial class CollectDevicePage : BaseComponentBase
|
||||
|
||||
private async Task DeleteCallAsync(IEnumerable<CollectDevice> input)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().DeleteAsync(input.Select(a => a.Id).ToArray());
|
||||
await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().DeleteAsync(input.Select(a => a.Id).ToArray());
|
||||
Refresh();
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
}
|
||||
|
||||
Task<Dictionary<string, ImportPreviewOutputBase>> DeviceImportAsync(IBrowserFile file)
|
||||
{
|
||||
return _serviceScope.ServiceProvider.GetService<CollectDeviceService>().PreviewAsync(file);
|
||||
return _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().PreviewAsync(file);
|
||||
}
|
||||
|
||||
async Task DownExportAsync(DevicePageInput input = null)
|
||||
@@ -148,8 +148,8 @@ public partial class CollectDevicePage : BaseComponentBase
|
||||
|
||||
private async Task EditCallAsync(DeviceEditInput input)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().EditAsync(input);
|
||||
_devices = _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetCacheList(true);
|
||||
await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().EditAsync(input);
|
||||
_devices = _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetCacheList(true);
|
||||
_deviceGroups = _devices?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList();
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
}
|
||||
@@ -161,19 +161,19 @@ public partial class CollectDevicePage : BaseComponentBase
|
||||
|
||||
private async Task<ISqlSugarPagedList<CollectDevice>> QueryCallAsync(DevicePageInput input)
|
||||
{
|
||||
var data = await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().PageAsync(input);
|
||||
var data = await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().PageAsync(input);
|
||||
return data;
|
||||
}
|
||||
|
||||
private void Refresh()
|
||||
{
|
||||
_devices = _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetCacheList(true);
|
||||
_devices = _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetCacheList(true);
|
||||
_deviceGroups = _devices?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList();
|
||||
}
|
||||
|
||||
async Task SaveDeviceImportAsync(Dictionary<string, ImportPreviewOutputBase> data)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().ImportAsync(data);
|
||||
await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().ImportAsync(data);
|
||||
await DatatableQueryAsync();
|
||||
_importExcel.IsShowImport = false;
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
|
||||
<MCard Class="ma-2" Style=@($"height: calc(100vh - {BlazorResourceConst.DefaultHeight + 80}px );")>
|
||||
<MCardTitle>
|
||||
<MTextField Dense Style="max-width:200px;" HideDetails=@("auto") Class="mx-2 my-1" @bind-Value="_collectDeviceGroupSearchName"
|
||||
<MTextField Dense Style="max-width:200px;" HideDetails=@("auto") Class="mx-2 my-1" @bind-Value="_collectDeviceSearchName"
|
||||
Outlined Label=@typeof(CollectDevice).GetDescription(nameof(CollectDevice.DeviceGroup)) />
|
||||
</MCardTitle>
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
}
|
||||
} )
|
||||
Items="_collectDeviceGroups" ItemText="r=>r" ItemChildren="r=>null"
|
||||
Search="@_collectDeviceGroupSearchName"
|
||||
Search="@_collectDeviceSearchName"
|
||||
Activatable ItemKey=@(r=>r)>
|
||||
<LabelContent>
|
||||
<span title=@context.Item>
|
||||
@@ -77,10 +77,10 @@
|
||||
<MCol Md=5 Cols="12">
|
||||
<MCard Height=@($"calc(100vh - {BlazorResourceConst.DefaultHeight + 80}px; )") Style="overflow-y:auto;" Flat Class="ml-2 my-4">
|
||||
|
||||
<MTextField Dense Style="max-width:200px;" HideDetails=@("auto") Class="mx-2 my-1" @bind-Value="_collectDeviceGroupSearchName"
|
||||
Outlined Label=@typeof(CollectDevice).GetDescription(nameof(CollectDevice.DeviceGroup)) />
|
||||
<MTextField Dense Style="max-width:200px;" HideDetails=@("auto") Class="mx-2 my-1" @bind-Value="_collectDeviceSearchName"
|
||||
Outlined Label=@typeof(CollectDevice).GetDescription(nameof(CollectDevice.Name)) />
|
||||
|
||||
<MVirtualScroll Context="item" Height=@($"calc(100vh - {BlazorResourceConst.DefaultHeight+140}px)") OverscanCount=2 ItemSize="60" Items="_collectDriverBases.WhereIF(!_collectDeviceGroupSearchName.IsNullOrEmpty(),a=>a.CurrentDevice.DeviceGroup==_collectDeviceGroupSearchName).ToList()">
|
||||
<MVirtualScroll Context="item" Height=@($"calc(100vh - {BlazorResourceConst.DefaultHeight+140}px)") OverscanCount=2 ItemSize="60" Items="_collectDriverBases.WhereIF(!_collectDeviceSearchName.IsNullOrEmpty(),a=>a.CurrentDevice.Name.Contains(_collectDeviceSearchName)).ToList()">
|
||||
|
||||
<ItemContent>
|
||||
@if (item.CurrentDevice != null)
|
||||
@@ -255,7 +255,7 @@
|
||||
@* <MCol Md=2 Cols="12">
|
||||
<MCard Class="ma-2" Style=@($"height: calc(100vh - {BlazorResourceConst.DefaultHeight + 80}px); )")>
|
||||
<MCardTitle>
|
||||
<MTextField Dense Style="max-width:200px;" HideDetails=@("auto") Class="mx-2 my-1" @bind-Value="_uploadDeviceGroupSearchName"
|
||||
<MTextField Dense Style="max-width:200px;" HideDetails=@("auto") Class="mx-2 my-1" @bind-Value="_uploadDeviceSearchName"
|
||||
Outlined Label=@typeof(Device).GetDescription(nameof(Device.DeviceGroup)) />
|
||||
</MCardTitle>
|
||||
<MTreeview Style=@($"height: calc(100vh - {BlazorResourceConst.DefaultHeight+240}px);overflow-y:auto") Dense TItem="string" TKey="string" ActiveChanged=@(async a=>
|
||||
@@ -267,7 +267,7 @@
|
||||
}
|
||||
} )
|
||||
Items="_uploadDeviceGroups" ItemText="r=>r" ItemChildren="r=>null"
|
||||
Search="@_uploadDeviceGroupSearchName"
|
||||
Search="@_uploadDeviceSearchName"
|
||||
Activatable ItemKey=@(r=>r)>
|
||||
<LabelContent>
|
||||
<span title=@context.Item>
|
||||
@@ -279,10 +279,10 @@
|
||||
</MCol> *@
|
||||
<MCol Md=5 Cols="12">
|
||||
<MCard Height=@($"calc(100vh - {BlazorResourceConst.DefaultHeight+80}px)") Style="overflow-y:auto;" Flat Class="ml-2 my-4">
|
||||
<MTextField Dense Style="max-width:200px;" HideDetails=@("auto") Class="mx-2 my-1" @bind-Value="_uploadDeviceGroupSearchName"
|
||||
Outlined Label=@typeof(CollectDevice).GetDescription(nameof(CollectDevice.DeviceGroup)) />
|
||||
<MTextField Dense Style="max-width:200px;" HideDetails=@("auto") Class="mx-2 my-1" @bind-Value="_uploadDeviceSearchName"
|
||||
Outlined Label=@typeof(CollectDevice).GetDescription(nameof(CollectDevice.Name)) />
|
||||
|
||||
<MVirtualScroll Context="item" Height=@($"calc(100vh - {BlazorResourceConst.DefaultHeight+140}px)") OverscanCount=2 ItemSize="60" Items="_uploadDriverBases.WhereIF(!_uploadDeviceGroupSearchName.IsNullOrEmpty(),a=>a.CurrentDevice.DeviceGroup==_uploadDeviceGroupSearchName).ToList()">
|
||||
<MVirtualScroll Context="item" Height=@($"calc(100vh - {BlazorResourceConst.DefaultHeight+140}px)") OverscanCount=2 ItemSize="60" Items="_uploadDriverBases.WhereIF(!_uploadDeviceSearchName.IsNullOrEmpty(),a=>a.CurrentDevice.Name.Contains(_uploadDeviceSearchName)).ToList()">
|
||||
|
||||
<ItemContent>
|
||||
@if (item.CurrentDevice != null)
|
||||
|
||||
@@ -12,8 +12,6 @@
|
||||
|
||||
using BlazorComponent;
|
||||
|
||||
using Mapster;
|
||||
|
||||
using Masa.Blazor;
|
||||
|
||||
using Microsoft.AspNetCore.Components;
|
||||
@@ -30,10 +28,11 @@ namespace ThingsGateway.Gateway.Blazor;
|
||||
public partial class DeviceStatusPage : IDisposable
|
||||
{
|
||||
readonly PeriodicTimer _periodicTimer = new(TimeSpan.FromSeconds(3));
|
||||
private string _collectDeviceGroup;
|
||||
private bool _isShowDetailUI;
|
||||
List<string> _collectDeviceGroups = new();
|
||||
string _collectDeviceGroupSearchName;
|
||||
//List<string> _collectDeviceGroups = new();
|
||||
//string _collectDeviceGroupSearchName;
|
||||
//private string _collectDeviceSearchName;
|
||||
string _collectDeviceSearchName;
|
||||
List<CollectBase> _collectDriverBases = new();
|
||||
CollectBase _collectDriverItem;
|
||||
BootstrapDynamicComponent _driverComponent;
|
||||
@@ -42,9 +41,10 @@ public partial class DeviceStatusPage : IDisposable
|
||||
bool _isAllRestart;
|
||||
bool _isRestart;
|
||||
StringNumber _tabNumber;
|
||||
private string _uploadDeviceGroup;
|
||||
List<string> _uploadDeviceGroups = new();
|
||||
string _uploadDeviceGroupSearchName;
|
||||
//private string _uploadDeviceSearchName;
|
||||
//List<string> _uploadDeviceGroups = new();
|
||||
//string _uploadDeviceGroupSearchName;
|
||||
string _uploadDeviceSearchName;
|
||||
List<DriverBase> _uploadDriverBases = new();
|
||||
DriverBase _uploadDriverItem;
|
||||
AlarmWorker _alarmWorker { get; set; }
|
||||
@@ -121,8 +121,8 @@ public partial class DeviceStatusPage : IDisposable
|
||||
|
||||
void CollectDeviceQuery()
|
||||
{
|
||||
_collectDeviceGroups = _globalDeviceData.CollectDevices.Adapt<List<CollectDevice>>()?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList() ?? new();
|
||||
_collectDriverBases = _collectDeviceWorker?.DriverBases?.WhereIF(!_collectDeviceGroup.IsNullOrEmpty(), a => a.CurrentDevice?.DeviceGroup == _collectDeviceGroup).Select(a => (CollectBase)a).ToList() ?? new();
|
||||
//_collectDeviceGroups = _globalDeviceData.CollectDevices?.Select(a => a.DeviceGroup)?.Where(a => !a.IsNullOrEmpty()).Distinct()?.ToList() ?? new();
|
||||
_collectDriverBases = _collectDeviceWorker?.DriverBases?.WhereIF(!_collectDeviceSearchName.IsNullOrEmpty(), a => a.CurrentDevice?.Name.Contains(_collectDeviceSearchName) == true).Select(a => (CollectBase)a).ToList() ?? new();
|
||||
}
|
||||
async Task DeviceRedundantThreadAsync(long devId)
|
||||
{
|
||||
@@ -207,10 +207,6 @@ public partial class DeviceStatusPage : IDisposable
|
||||
{
|
||||
try
|
||||
{
|
||||
{
|
||||
_collectDeviceGroups = _globalDeviceData.CollectDevices.Adapt<List<CollectDevice>>()?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList() ?? new();
|
||||
_collectDriverBases = _collectDeviceWorker?.DriverBases?.WhereIF(!_collectDeviceGroup.IsNullOrEmpty(), a => a.CurrentDevice?.DeviceGroup == _collectDeviceGroup).Select(a => (CollectBase)a).ToList() ?? new();
|
||||
}
|
||||
if (_collectDriverBases?.FirstOrDefault()?.CurrentDevice == null || _collectDeviceWorker?.DriverBases.Count != _collectDriverBases.Count)
|
||||
{
|
||||
CollectDeviceQuery();
|
||||
@@ -248,8 +244,8 @@ public partial class DeviceStatusPage : IDisposable
|
||||
|
||||
void UploadDeviceQuery()
|
||||
{
|
||||
_uploadDeviceGroups = _uploadDeviceWorker.DriverBases.Select(a => a.CurrentDevice)?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList() ?? new();
|
||||
_uploadDriverBases = _uploadDeviceWorker?.DriverBases?.WhereIF(!_uploadDeviceGroup.IsNullOrEmpty(), a => a.CurrentDevice?.DeviceGroup == _uploadDeviceGroup).ToList() ?? new();
|
||||
//_uploadDeviceGroups = _uploadDeviceWorker.DriverBases.Select(a => a.CurrentDevice)?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList() ?? new();
|
||||
_uploadDriverBases = _uploadDeviceWorker?.DriverBases?.WhereIF(!_uploadDeviceSearchName.IsNullOrEmpty(), a => a.CurrentDevice?.Name.Contains(_uploadDeviceSearchName) == true).ToList() ?? new();
|
||||
}
|
||||
async Task UpRestartAsync(long devId)
|
||||
{
|
||||
|
||||
@@ -161,7 +161,7 @@ else
|
||||
case nameof(context.Item.DeviceId):
|
||||
<span title=@context.Value>
|
||||
@(
|
||||
_serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetNameById(context.Item.DeviceId)
|
||||
_serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetNameById(context.Item.DeviceId)
|
||||
)
|
||||
</span>
|
||||
break;
|
||||
@@ -193,7 +193,7 @@ else
|
||||
</td>
|
||||
<td class="text-start ">
|
||||
<div style="word-break:break-all; white-space:pre-wrap;">
|
||||
@(_serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetNameById(context.Item2.ToLong()))
|
||||
@(_serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetNameById(context.Item2.ToLong()))
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -32,7 +32,7 @@ public partial class DeviceVariablePage
|
||||
|
||||
ImportExcel _importExcel;
|
||||
Dictionary<long, List<string>> _otherMethods = new();
|
||||
string _searchName;
|
||||
//string _searchName;
|
||||
|
||||
List<Device> _uploadDevices = new();
|
||||
|
||||
@@ -46,9 +46,9 @@ public partial class DeviceVariablePage
|
||||
/// <returns></returns>
|
||||
protected override async Task OnParametersSetAsync()
|
||||
{
|
||||
_collectDevices = _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetCacheList(true);
|
||||
_uploadDevices = _serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetCacheList(true);
|
||||
_deviceGroups = _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetTree();
|
||||
_collectDevices = _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetCacheList(true);
|
||||
_uploadDevices = _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetCacheList(true);
|
||||
_deviceGroups = _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetTree();
|
||||
await base.OnParametersSetAsync();
|
||||
}
|
||||
|
||||
|
||||
@@ -135,7 +135,7 @@ else
|
||||
</td>
|
||||
<td class="text-start ">
|
||||
<div style="word-break:break-all; white-space:pre-wrap;">
|
||||
@(_serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetNameById(context.Item2.ToLong()))
|
||||
@(_serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetNameById(context.Item2.ToLong()))
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -34,7 +34,7 @@ public partial class DeviceVariableRunTimePage
|
||||
private IAppDataTable _datatable;
|
||||
private List<DeviceTree> _deviceGroups = new();
|
||||
private EventCallback<string> _onWrite;
|
||||
private string _searchName;
|
||||
//private string _searchName;
|
||||
/// <summary>
|
||||
/// 设备名称
|
||||
/// </summary>
|
||||
@@ -140,7 +140,7 @@ public partial class DeviceVariableRunTimePage
|
||||
|
||||
private async Task<ISqlSugarPagedList<DeviceVariableRunTime>> QueryCallAsync(VariablePageInput input)
|
||||
{
|
||||
var uploadDevId = _serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetIdByName(input.UploadDeviceName);
|
||||
var uploadDevId = _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetIdByName(input.UploadDeviceName);
|
||||
var data = _globalDeviceData.AllVariables
|
||||
.WhereIF(!input.DeviceName.IsNullOrEmpty(), a => a.DeviceName == input.DeviceName)
|
||||
.WhereIF(!input.Name.IsNullOrEmpty(), a => a.Name.Contains(input.Name))
|
||||
|
||||
@@ -32,7 +32,7 @@ public partial class RpcLogPage
|
||||
var confirm = await PopupService.OpenConfirmDialogAsync("删除", "确定 ?");
|
||||
if (confirm)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<RpcLogService>().DeleteAsync();
|
||||
await _serviceScope.ServiceProvider.GetService<IRpcLogService>().DeleteAsync();
|
||||
await _datatable?.QueryClickAsync();
|
||||
}
|
||||
}
|
||||
@@ -50,7 +50,7 @@ public partial class RpcLogPage
|
||||
|
||||
private async Task<ISqlSugarPagedList<RpcLog>> QueryCallAsync(RpcLogPageInput input)
|
||||
{
|
||||
var data = await _serviceScope.ServiceProvider.GetService<RpcLogService>().PageAsync(input);
|
||||
var data = await _serviceScope.ServiceProvider.GetService<IRpcLogService>().PageAsync(input);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@@ -35,7 +35,7 @@ public partial class UploadDevicePage
|
||||
List<Device> _devices = new();
|
||||
List<DriverPlugin> _driverPlugins;
|
||||
ImportExcel _importExcel;
|
||||
string _searchName;
|
||||
//string _searchName;
|
||||
[Inject]
|
||||
AjaxService _ajaxService { get; set; }
|
||||
[Inject]
|
||||
@@ -54,7 +54,7 @@ public partial class UploadDevicePage
|
||||
|
||||
private async Task AddCallAsync(DeviceAddInput input)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<UploadDeviceService>().AddAsync(input);
|
||||
await _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().AddAsync(input);
|
||||
Refresh();
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
}
|
||||
@@ -68,12 +68,12 @@ public partial class UploadDevicePage
|
||||
return;
|
||||
}
|
||||
}
|
||||
data ??= _serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetCacheList(true);
|
||||
data ??= _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetCacheList(true);
|
||||
foreach (var device in data)
|
||||
{
|
||||
device.DevicePropertys = GetDriverProperties(device.PluginName, device.Id);
|
||||
}
|
||||
await _serviceScope.ServiceProvider.GetService<UploadDeviceService>().EditsAsync(data);
|
||||
await _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().EditsAsync(data);
|
||||
await PopupService.EnqueueSnackbarAsync("刷新成功", AlertTypes.Success);
|
||||
|
||||
}
|
||||
@@ -85,7 +85,7 @@ public partial class UploadDevicePage
|
||||
return;
|
||||
}
|
||||
|
||||
await _serviceScope.ServiceProvider.GetService<UploadDeviceService>().CopyDevAsync(data);
|
||||
await _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().CopyDevAsync(data);
|
||||
await DatatableQueryAsync();
|
||||
await PopupService.EnqueueSnackbarAsync("复制成功", AlertTypes.Success);
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
@@ -98,14 +98,14 @@ public partial class UploadDevicePage
|
||||
|
||||
private async Task DeleteCallAsync(IEnumerable<Device> input)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<UploadDeviceService>().DeleteAsync(input.Select(a => a.Id).ToArray());
|
||||
await _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().DeleteAsync(input.Select(a => a.Id).ToArray());
|
||||
Refresh();
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
}
|
||||
|
||||
Task<Dictionary<string, ImportPreviewOutputBase>> DeviceImportAsync(IBrowserFile file)
|
||||
{
|
||||
return _serviceScope.ServiceProvider.GetService<UploadDeviceService>().PreviewAsync(file);
|
||||
return _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().PreviewAsync(file);
|
||||
}
|
||||
|
||||
async Task DownExportAsync(DevicePageInput input = null)
|
||||
@@ -134,8 +134,8 @@ public partial class UploadDevicePage
|
||||
|
||||
private async Task EditCallAsync(DeviceEditInput input)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<UploadDeviceService>().EditAsync(input);
|
||||
_devices = _serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetCacheList(true);
|
||||
await _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().EditAsync(input);
|
||||
_devices = _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetCacheList(true);
|
||||
_deviceGroups = _devices?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList();
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
}
|
||||
@@ -147,19 +147,19 @@ public partial class UploadDevicePage
|
||||
|
||||
private async Task<ISqlSugarPagedList<Device>> QueryCallAsync(DevicePageInput input)
|
||||
{
|
||||
var data = await _serviceScope.ServiceProvider.GetService<UploadDeviceService>().PageAsync(input);
|
||||
var data = await _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().PageAsync(input);
|
||||
return data;
|
||||
}
|
||||
|
||||
private void Refresh()
|
||||
{
|
||||
_devices = _serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetCacheList(true);
|
||||
_devices = _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetCacheList(true);
|
||||
_deviceGroups = _devices?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList();
|
||||
}
|
||||
|
||||
async Task SaveDeviceImportAsync(Dictionary<string, ImportPreviewOutputBase> data)
|
||||
{
|
||||
await _serviceScope.ServiceProvider.GetService<UploadDeviceService>().ImportAsync(data);
|
||||
await _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().ImportAsync(data);
|
||||
await DatatableQueryAsync();
|
||||
_importExcel.IsShowImport = false;
|
||||
await _mainLayout.StateHasChangedAsync();
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\admin\ThingsGateway.Admin.Blazor\ThingsGateway.Admin.Blazor.csproj" />
|
||||
<ProjectReference Include="..\..\admin\ThingsGateway.Components\ThingsGateway.Components.csproj" />
|
||||
<ProjectReference Include="..\ThingsGateway.Gateway.Application\ThingsGateway.Gateway.Application.csproj" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="CodingSeb.ExpressionEvaluator" Version="1.4.40" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\admin\ThingsGateway.Admin.Core\ThingsGateway.Admin.Core.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -1,16 +1,6 @@
|
||||
<Project>
|
||||
<Import Project="$(SolutionDir)\Directory.Build.props" />
|
||||
<PropertyGroup>
|
||||
<Version>4.0.0.4</Version>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<TargetFrameworks>net6.0;net8.0;</TargetFrameworks>
|
||||
<Authors>Diego</Authors>
|
||||
<Product>ThingsGateway</Product>
|
||||
<Copyright>© 2023-present Diego</Copyright>
|
||||
<RepositoryUrl>https://gitee.com/diego2098/ThingsGateway</RepositoryUrl>
|
||||
<SignAssembly>True</SignAssembly>
|
||||
<DelaySign>False</DelaySign>
|
||||
<SatelliteResourceLanguages>zh-Hans</SatelliteResourceLanguages>
|
||||
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
@@ -71,8 +71,8 @@ public class DLT645_2007OverTcpProperty : DriverPropertyBase
|
||||
/// <summary>
|
||||
/// 组包缓存超时ms
|
||||
/// </summary>
|
||||
[DeviceProperty("组包缓存超时", "某些设备性能较弱,报文间需要间隔较长时间,可以设置更长的组包缓存,默认1s")]
|
||||
public int CacheTimeout { get; set; } = 1;
|
||||
[DeviceProperty("组包缓存超时", "某些设备性能较弱,报文间需要间隔较长时间,可以设置更长的组包缓存,默认1000ms")]
|
||||
public int CacheTimeout { get; set; } = 1000;
|
||||
/// <summary>
|
||||
/// 共享链路
|
||||
/// </summary>
|
||||
|
||||
@@ -12,14 +12,10 @@
|
||||
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\DriverDebugUIPage.razor.cs" Link="DebugPage\DriverDebugUIPage.razor.cs" />
|
||||
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\SerialSessionPage.razor.cs" Link="DebugPage\SerialSessionPage.razor.cs" />
|
||||
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\TcpClientPage.razor.cs" Link="DebugPage\TcpClientPage.razor.cs" />
|
||||
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\TcpServerPage.razor.cs" Link="DebugPage\TcpServerPage.razor.cs" />
|
||||
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\UdpSessionPage.razor.cs" Link="DebugPage\UdpSessionPage.razor.cs" />
|
||||
|
||||
<Content Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\DriverDebugUIPage.razor" Link="DebugPage\DriverDebugUIPage.razor" />
|
||||
<Content Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\SerialSessionPage.razor" Link="DebugPage\SerialSessionPage.razor" />
|
||||
<Content Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\TcpClientPage.razor" Link="DebugPage\TcpClientPage.razor" />
|
||||
<Content Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\TcpServerPage.razor" Link="DebugPage\TcpServerPage.razor" />
|
||||
<Content Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\UdpSessionPage.razor" Link="DebugPage\UdpSessionPage.razor" />
|
||||
|
||||
</ItemGroup>
|
||||
|
||||
@@ -30,7 +26,7 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
<ProjectReference Include="..\..\gateway\ThingsGateway.Gateway.Blazor\ThingsGateway.Gateway.Blazor.csproj" >
|
||||
<ProjectReference Include="..\..\gateway\ThingsGateway.Gateway.Blazor\ThingsGateway.Gateway.Blazor.csproj">
|
||||
<Private>false</Private>
|
||||
<CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies>
|
||||
<ExcludeAssets>runtime</ExcludeAssets>
|
||||
|
||||
@@ -69,18 +69,19 @@ public partial class KafkaProducer : UpLoadBaseWithCacheT<DeviceData, VariableDa
|
||||
|
||||
#region Kafka 生产者
|
||||
|
||||
Enum.TryParse<SecurityProtocol>(_driverPropertys.SecurityProtocol, out var SecurityProtocol);
|
||||
Enum.TryParse<SaslMechanism>(_driverPropertys.SaslMechanism, out var SaslMechanism);
|
||||
|
||||
//1、生产者配置
|
||||
producerconfig = new ProducerConfig
|
||||
{
|
||||
BootstrapServers = _driverPropertys.BootStrapServers,
|
||||
SecurityProtocol = SecurityProtocol,
|
||||
SaslMechanism = SaslMechanism,
|
||||
SaslUsername = _driverPropertys.SaslUsername,
|
||||
SaslPassword = _driverPropertys.SaslPassword,
|
||||
SecurityProtocol = _driverPropertys.SecurityProtocol,
|
||||
SaslMechanism = _driverPropertys.SaslMechanism,
|
||||
|
||||
};
|
||||
if (!string.IsNullOrEmpty(_driverPropertys.SaslUsername))
|
||||
producerconfig.SaslUsername = _driverPropertys.SaslUsername;
|
||||
if (!string.IsNullOrEmpty(_driverPropertys.SaslPassword))
|
||||
producerconfig.SaslPassword = _driverPropertys.SaslPassword;
|
||||
|
||||
//2、创建生产者
|
||||
producerBuilder = new ProducerBuilder<Null, string>(producerconfig);
|
||||
@@ -123,7 +124,14 @@ public partial class KafkaProducer : UpLoadBaseWithCacheT<DeviceData, VariableDa
|
||||
osStr += RuntimeInformation.ProcessArchitecture.ToString().ToLower();
|
||||
|
||||
var pathToLibrd = System.IO.Path.Combine(Directory, "runtimes", osStr, "native", $"librdkafka{fileEx}");
|
||||
Library.Load(pathToLibrd);
|
||||
try
|
||||
{
|
||||
Library.Load(pathToLibrd);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogMessage.LogError(ex, $"加载dll失败:{pathToLibrd}");
|
||||
}
|
||||
}
|
||||
producer = producerBuilder.Build();
|
||||
}
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
//------------------------------------------------------------------------------
|
||||
#endregion
|
||||
|
||||
using Confluent.Kafka;
|
||||
|
||||
namespace ThingsGateway.Plugin.Kafka;
|
||||
|
||||
/// <summary>
|
||||
@@ -53,12 +55,10 @@ public class KafkaProducerProperty : UploadPropertyWithCacheT
|
||||
/// </summary>
|
||||
[DeviceProperty("密码", "")]
|
||||
public string SaslPassword { get; set; } = "none";
|
||||
[DeviceProperty("SecurityProtocol", "")]
|
||||
public string SecurityProtocol { get; set; } = "SaslPlaintext";
|
||||
[DeviceProperty("SaslMechanism", "")]
|
||||
public string SaslMechanism { get; set; } = "Plain";
|
||||
|
||||
|
||||
[DeviceProperty("SecurityProtocol", "Plaintext, Ssl, SaslPlaintext, SaslSsl")]
|
||||
public SecurityProtocol SecurityProtocol { get; set; } = SecurityProtocol.Plaintext;
|
||||
[DeviceProperty("SaslMechanism", " Gssapi, Plain, ScramSha256, ScramSha512, OAuthBearer")]
|
||||
public SaslMechanism SaslMechanism { get; set; } = SaslMechanism.Plain;
|
||||
|
||||
/// <summary>
|
||||
/// 设备实体脚本
|
||||
|
||||
@@ -17,14 +17,14 @@ namespace ThingsGateway.Plugin.Modbus;
|
||||
/// <summary>
|
||||
/// <inheritdoc/>
|
||||
/// </summary>
|
||||
public class ModbusTcpDtu : CollectBase
|
||||
public class ModbusDtu : CollectBase
|
||||
{
|
||||
private readonly ModbusTcpDtuProperty _driverPropertys = new();
|
||||
private readonly ModbusDtuProperty _driverPropertys = new();
|
||||
|
||||
private ThingsGateway.Foundation.Adapter.Modbus.ModbusTcpDtu _plc;
|
||||
private ThingsGateway.Foundation.Adapter.Modbus.ModbusDtu _plc;
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override Type DriverDebugUIType => typeof(ModbusTcpDtuDebugPage);
|
||||
public override Type DriverDebugUIType => typeof(ModbusDtuDebugPage);
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override DriverPropertyBase DriverPropertys => _driverPropertys;
|
||||
@@ -45,13 +45,15 @@ public class ModbusTcpDtu : CollectBase
|
||||
var client1 = new TcpService();
|
||||
((TcpService)client1).Setup(FoundataionConfig);
|
||||
//载入配置
|
||||
_plc = new((TcpService)client)
|
||||
_plc = new((TcpService)client1)
|
||||
{
|
||||
DataFormat = _driverPropertys.DataFormat,
|
||||
FrameTime = _driverPropertys.FrameTime,
|
||||
CacheTimeout = _driverPropertys.CacheTimeout,
|
||||
Station = _driverPropertys.Station,
|
||||
TimeOut = _driverPropertys.TimeOut,
|
||||
IsRtu = _driverPropertys.IsRtu,
|
||||
Crc16CheckEnable = _driverPropertys.Crc16CheckEnable,
|
||||
IsCheckMessageId = _driverPropertys.MessageIdCheckEnable
|
||||
};
|
||||
base.Init(client);
|
||||
@@ -14,7 +14,7 @@ namespace ThingsGateway.Plugin.Modbus;
|
||||
/// <summary>
|
||||
/// <inheritdoc/>
|
||||
/// </summary>
|
||||
public class ModbusTcpDtuProperty : DriverPropertyBase
|
||||
public class ModbusDtuProperty : DriverPropertyBase
|
||||
{
|
||||
/// <summary>
|
||||
/// IP
|
||||
@@ -61,6 +61,19 @@ public class ModbusTcpDtuProperty : DriverPropertyBase
|
||||
/// </summary>
|
||||
[DeviceProperty("连接标识检测", "")]
|
||||
public bool MessageIdCheckEnable { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否Rtu格式
|
||||
/// </summary>
|
||||
[DeviceProperty("是否Rtu格式")]
|
||||
public bool IsRtu { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Crc校验
|
||||
/// </summary>
|
||||
[DeviceProperty("Crc校验")]
|
||||
public bool Crc16CheckEnable { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// 共享链路
|
||||
/// </summary>
|
||||
@@ -16,7 +16,7 @@ namespace ThingsGateway.Plugin.Modbus;
|
||||
/// <summary>
|
||||
/// <inheritdoc/>
|
||||
/// </summary>
|
||||
public class ModbusSerialServerProperty : DriverPropertyBase
|
||||
public class ModbusSerialServerProperty : UpDriverPropertyBase
|
||||
{
|
||||
/// <summary>
|
||||
/// COM口
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace ThingsGateway.Plugin.Modbus;
|
||||
/// <summary>
|
||||
/// <inheritdoc/>
|
||||
/// </summary>
|
||||
public class ModbusTcpServerProperty : DriverPropertyBase
|
||||
public class ModbusTcpServerProperty : UpDriverPropertyBase
|
||||
{
|
||||
/// <summary>
|
||||
/// IP
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
<Compile Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusRtuOverUdpDebugPage.razor.cs" Link="Page\ModbusRtuOverUdpDebugPage.razor.cs" />
|
||||
<Compile Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusSerialServerDebugPage.razor.cs" Link="Page\ModbusSerialServerDebugPage.razor.cs" />
|
||||
<Compile Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusTcpDebugPage.razor.cs" Link="Page\ModbusTcpDebugPage.razor.cs" />
|
||||
<Compile Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusTcpDtuDebugPage.razor.cs" Link="Page\ModbusTcpDtuDebugPage.razor.cs" />
|
||||
<Compile Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusDtuDebugPage.razor.cs" Link="Page\ModbusDtuDebugPage.razor.cs" />
|
||||
<Compile Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusTcpServerDebugPage.razor.cs" Link="Page\ModbusTcpServerDebugPage.razor.cs" />
|
||||
<Compile Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusUdpDebugPage.razor.cs" Link="Page\ModbusUdpDebugPage.razor.cs" />
|
||||
<Content Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusRtuDebugPage.razor" Link="Page\ModbusRtuDebugPage.razor" />
|
||||
@@ -43,7 +43,7 @@
|
||||
<Content Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusRtuOverUdpDebugPage.razor" Link="Page\ModbusRtuOverUdpDebugPage.razor" />
|
||||
<Content Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusSerialServerDebugPage.razor" Link="Page\ModbusSerialServerDebugPage.razor" />
|
||||
<Content Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusTcpDebugPage.razor" Link="Page\ModbusTcpDebugPage.razor" />
|
||||
<Content Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusTcpDtuDebugPage.razor" Link="Page\ModbusTcpDtuDebugPage.razor" />
|
||||
<Content Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusDtuDebugPage.razor" Link="Page\ModbusDtuDebugPage.razor" />
|
||||
<Content Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusTcpServerDebugPage.razor" Link="Page\ModbusTcpServerDebugPage.razor" />
|
||||
<Content Include="..\..\demo\ThingsGateway.Foundation.Demo.Rcl\Pages\Modbus\ModbusUdpDebugPage.razor" Link="Page\ModbusUdpDebugPage.razor" />
|
||||
</ItemGroup>
|
||||
@@ -51,7 +51,7 @@
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
<ProjectReference Include="..\..\gateway\ThingsGateway.Gateway.Blazor\ThingsGateway.Gateway.Blazor.csproj" >
|
||||
<ProjectReference Include="..\..\gateway\ThingsGateway.Gateway.Blazor\ThingsGateway.Gateway.Blazor.csproj">
|
||||
<Private>false</Private>
|
||||
<CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies>
|
||||
<ExcludeAssets>runtime</ExcludeAssets>
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace ThingsGateway.Plugin.Mqtt;
|
||||
/// <summary>
|
||||
/// <inheritdoc/>
|
||||
/// </summary>
|
||||
public class MqttServerProperty : DriverPropertyBase
|
||||
public class MqttServerProperty : UpDriverPropertyBase
|
||||
{
|
||||
[DeviceProperty("是否选择全部变量", "")] public bool IsAllVariable { get; set; } = false;
|
||||
|
||||
|
||||
@@ -12,16 +12,8 @@
|
||||
<ItemGroup>
|
||||
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\DriverDebugUIBase.cs" Link="DebugPage\DriverDebugUIBase.cs" />
|
||||
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\DriverDebugUIPage.razor.cs" Link="DebugPage\DriverDebugUIPage.razor.cs" />
|
||||
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\SerialSessionPage.razor.cs" Link="DebugPage\SerialSessionPage.razor.cs" />
|
||||
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\TcpClientPage.razor.cs" Link="DebugPage\TcpClientPage.razor.cs" />
|
||||
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\TcpServerPage.razor.cs" Link="DebugPage\TcpServerPage.razor.cs" />
|
||||
<Compile Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\UdpSessionPage.razor.cs" Link="DebugPage\UdpSessionPage.razor.cs" />
|
||||
|
||||
<Content Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\DriverDebugUIPage.razor" Link="DebugPage\DriverDebugUIPage.razor" />
|
||||
<Content Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\SerialSessionPage.razor" Link="DebugPage\SerialSessionPage.razor" />
|
||||
<Content Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\TcpClientPage.razor" Link="DebugPage\TcpClientPage.razor" />
|
||||
<Content Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\TcpServerPage.razor" Link="DebugPage\TcpServerPage.razor" />
|
||||
<Content Include="..\..\Demo\ThingsGateway.Foundation.Demo.Rcl\Components\DebugPage\UdpSessionPage.razor" Link="DebugPage\UdpSessionPage.razor" />
|
||||
|
||||
</ItemGroup>
|
||||
|
||||
@@ -45,7 +37,7 @@
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
<ProjectReference Include="..\..\gateway\ThingsGateway.Gateway.Blazor\ThingsGateway.Gateway.Blazor.csproj" >
|
||||
<ProjectReference Include="..\..\gateway\ThingsGateway.Gateway.Blazor\ThingsGateway.Gateway.Blazor.csproj">
|
||||
<Private>false</Private>
|
||||
<CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies>
|
||||
<ExcludeAssets>runtime</ExcludeAssets>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user