mirror of
				https://gitee.com/ThingsGateway/ThingsGateway.git
				synced 2025-10-31 07:33:58 +08:00 
			
		
		
		
	Compare commits
	
		
			746 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 7cbf289b50 | ||
|   | 4097da79a5 | ||
|   | 91b7ae554f | ||
|   | 3121aa2542 | ||
|   | 4bf895e6e1 | ||
|   | 0c5489e920 | ||
|   | d63c3aaa80 | ||
|   | 4f188ea6cc | ||
|   | acb17018ae | ||
|   | 2affe2988d | ||
|   | 4174dd2206 | ||
|   | e1c492f238 | ||
|   | fb08e34fa3 | ||
|   | a1793a0afe | ||
|   | 4da9763b49 | ||
|   | 81e0918bd0 | ||
|   | c1e064f06d | ||
|   | 1c52be8b47 | ||
|   | bcd82055ca | ||
|   | c47d95d170 | ||
|   | 3e62f1ad51 | ||
|   | 8dcae973ef | ||
|   | 4cf35f7294 | ||
|   | 94c77d151b | ||
|   | 7f600e2b4b | ||
|   | c809d0ba87 | ||
|   | 50f038ec89 | ||
|   | 9199a255a2 | ||
|   | d324537b47 | ||
|   | d0c05685f7 | ||
|   | 1063c930b5 | ||
|   | 79cbd44366 | ||
|   | 7fdac1c5cb | ||
|   | 0c0cf72ebb | ||
|   | 8e2fe175ed | ||
|   | d1cff037c9 | ||
|   | fc88a2fafa | ||
|   | 45fcceb056 | ||
|   | 7043477038 | ||
|   | 7dd685cf54 | ||
|   | 5f5e4969c0 | ||
|   | 8a53fd19e9 | ||
|   | baf4714c36 | ||
|   | 7ba9ac7a5b | ||
|   | 85b8f26e8e | ||
|   | 594a0f1410 | ||
|   | d317d757d7 | ||
|   | fdf0ba6318 | ||
|   | 15bf7de5fa | ||
|   | d3402b058e | ||
|   | e7dfdd4031 | ||
|   | b2dd7b6364 | ||
|   | 9bd6d9abbf | ||
|   | cd14428fea | ||
|   | 19d9f03c2b | ||
|   | 0d57e72bbf | ||
|   | 329516a61b | ||
|   | d566869589 | ||
|   | 9cb8d8e6c7 | ||
|   | 9de3c57e5d | ||
|   | f32ff92b0b | ||
|   | 88d71e271e | ||
|   | fd9c14612a | ||
|   | e26e5a160f | ||
|   | b836bfed22 | ||
|   | a4b598c6d0 | ||
|   | c9ab755839 | ||
|   | 9920edba53 | ||
|   | 12bd7280d1 | ||
|   | d30ea7f63b | ||
|   | ebd3390db6 | ||
|   | 9a374a9ebc | ||
|   | b1bc22cb08 | ||
|   | 4930d53890 | ||
|   | c31327b5bc | ||
|   | 3f2aa1f1e1 | ||
|   | 6e78c00a96 | ||
|   | c27dde085e | ||
|   | d26cc308c0 | ||
|   | fb1efdf290 | ||
|   | 3c99f2a472 | ||
|   | affe9a44e0 | ||
|   | 43730fa519 | ||
|   | d39aa22b09 | ||
|   | e232a6b6ea | ||
|   | 71ebb36fe9 | ||
|   | 78a0b86327 | ||
|   | 2636c16a97 | ||
|   | fd77c0242d | ||
|   | e74819a900 | ||
|   | 9b7f696c9b | ||
|   | 0230d614e7 | ||
|   | 252d99ad78 | ||
|   | 1ffc200350 | ||
|   | 807d89b2b2 | ||
|   | 4013afa1f1 | ||
|   | a580927ceb | ||
|   | bf2cf52034 | ||
|   | 81bb8b7c31 | ||
|   | a825007fb5 | ||
|   | 988124d96a | ||
|   | f0de815296 | ||
|   | 0e2d58c887 | ||
|   | b155382626 | ||
|   | f362d740af | ||
|   | 4a85e31a4f | ||
|   | 302c270ad5 | ||
|   | 3c1517d0f3 | ||
|   | f9fb222044 | ||
|   | e8edc02ba3 | ||
|   | 95a44e3053 | ||
|   | 74a9fe9a87 | ||
|   | 4d03f9ea1a | ||
|   | 67c96ca991 | ||
|   | 88fb793c68 | ||
|   | d6d02d8cc5 | ||
|   | c5a3f8e2e3 | ||
|   | 27e8653a1a | ||
|   | 863beda82c | ||
|   | bac84c3ecd | ||
|   | 2fca2ad9f8 | ||
|   | dd75286fe0 | ||
|   | 7f91792cf1 | ||
|   | 0e0ccad311 | ||
|   | 0691f72e67 | ||
|   | 7e38a51720 | ||
|   | 34ca8243a3 | ||
|   | 112fea7632 | ||
|   | 378763e4ee | ||
|   | 517bd0394d | ||
|   | 70adb97fb5 | ||
|   | 623d44cabe | ||
|   | 0d479ca00b | ||
|   | 8bc49ef437 | ||
|   | f83fcec786 | ||
|   | 93690ce40d | ||
|   | f82c5f2f27 | ||
|   | a83c1c3899 | ||
|   | 91d6aed109 | ||
|   | db8f8fe51d | ||
|   | 4596004b17 | ||
|   | d5540906cb | ||
|   | 90796a979d | ||
|   | 2190a87772 | ||
|   | c5953b83f8 | ||
|   | 24bc60abf0 | ||
|   | 31eee6b009 | ||
|   | c5da565a8f | ||
|   | 947cd712e1 | ||
|   | edc208f96b | ||
|   | 1fb0296ee7 | ||
|   | 6488d3df87 | ||
|   | 56189d78e0 | ||
|   | bff18127b8 | ||
|   | 363206e0ba | ||
|   | fd3e378501 | ||
|   | 4ba2fe4c9d | ||
|   | 2c499626ad | ||
|   | 2b581a03c3 | ||
|   | 450c15210a | ||
|   | 65fed8cc93 | ||
|   | 4b64771ea2 | ||
|   | f39977a6ff | ||
|   | 933b535caa | ||
|   | 8abc5d2f20 | ||
|   | d8783cd994 | ||
|   | d5d087feb5 | ||
|   | 6ba3399df7 | ||
|   | 65124b3aa8 | ||
|   | 98597f4726 | ||
|   | e7981f0d8e | ||
|   | cf654427c3 | ||
|   | ff2f628282 | ||
|   | ae818ca265 | ||
|   | 0f2aed458e | ||
|   | d486c44ff6 | ||
|   | ca7b9980bf | ||
|   | 3c71e6a8e3 | ||
|   | 542442864c | ||
|   | 5edb64fa85 | ||
|   | 8dc1c898a3 | ||
|   | 1ed35726b0 | ||
|   | 27fae9ebaa | ||
|   | b103f25c94 | ||
|   | abff450274 | ||
|   | c260736a11 | ||
|   | 166ac2307a | ||
|   | b21a4e1a4d | ||
|   | f7dc943fa3 | ||
|   | bfbd2693ec | ||
|   | 819e71c993 | ||
|   | 9fd0b489a2 | ||
|   | f5fe9f8dae | ||
|   | f9ffc18145 | ||
|   | 08db5b983a | ||
|   | 5b3b4c8c50 | ||
|   | 73f914ffc4 | ||
|   | d6bdd73ed6 | ||
|   | 7370ee7349 | ||
|   | 4574596bac | ||
|   | 4d16855e36 | ||
|   | 13a0d4d282 | ||
|   | b9cd06b829 | ||
|   | 5b460e8fa2 | ||
|   | 41087edf17 | ||
|   | 2afcc38e38 | ||
|   | e59ccce25f | ||
|   | d7425890e8 | ||
|   | a989a837fb | ||
|   | db1221da50 | ||
|   | cf794569ed | ||
|   | 51e5bbab0d | ||
|   | 2c197ed2b2 | ||
|   | d8fc6665b3 | ||
|   | c671a79822 | ||
|   | 9d93ce4c41 | ||
|   | a6d99fe227 | ||
|   | 923b8bca31 | ||
|   | e2c30d1c88 | ||
|   | b6d9f2a04e | ||
|   | 57306ea664 | ||
|   | cd7f3fd02f | ||
|   | 0482e077a8 | ||
|   | 5f986a45ca | ||
|   | ca7b49c0d5 | ||
|   | 52dd555e6c | ||
|   | 579b1a59f9 | ||
|   | 5299c5c4be | ||
|   | f7756bccef | ||
|   | a6b874d160 | ||
|   | 3e5fb3ddcf | ||
|   | 5e6bcb12d3 | ||
|   | 14303f1429 | ||
|   | 96711ba022 | ||
|   | cbfc0fdbdc | ||
|   | 6e81886c0e | ||
|   | 2d976bc132 | ||
|   | 57f6a476af | ||
|   | 8491ed296e | ||
|   | cd1288afdc | ||
|   | ec6c830cb0 | ||
|   | 2f86ccc4bf | ||
|   | 8ca445aec0 | ||
|   | 1e1f27c8a5 | ||
|   | 2b84bde367 | ||
|   | b52e58551d | ||
|   | 9aceed00bf | ||
|   | 58814f7f74 | ||
|   | 6a70ef9f31 | ||
|   | 82cc4ca500 | ||
|   | 4567fa04ed | ||
|   | 8b98b5d818 | ||
|   | 176d0351af | ||
|   | d63dc3384b | ||
|   | 1ccd704e30 | ||
|   | f5d23dbe79 | ||
|   | 75bfe53ac3 | ||
|   | 3308f916dd | ||
|   | e7140279ca | ||
|   | 1034719f5e | ||
|   | 2c00043a7f | ||
|   | 65c695d9ce | ||
|   | 57253fe46a | ||
|   | 4e5c443440 | ||
|   | 0b3b73d8ec | ||
|   | 921eabc134 | ||
|   | 0faa428751 | ||
|   | f71a2fdd63 | ||
|   | 4eb9ed8aba | ||
|   | d7b549abb8 | ||
|   | 95d723c578 | ||
|   | 2fcd853e86 | ||
|   | 07eef7c812 | ||
|   | b01e0757fa | ||
|   | 32844a20c6 | ||
|   | 5b6532c601 | ||
|   | 2c5b4b4027 | ||
|   | 72d7ecf195 | ||
|   | 2cfa6b4306 | ||
|   | 6f6ffde0ab | ||
|   | 1694739a16 | ||
|   | 95d1e8bfca | ||
|   | 60dec08e3c | ||
|   | a99d71be93 | ||
|   | f1331b6a0c | ||
|   | 10d66b642b | ||
|   | cd2310e4a8 | ||
|   | 1b399cf6b0 | ||
|   | 877445bc0a | ||
|   | 9a5b345bde | ||
|   | fc9e8ea7b3 | ||
|   | 32be6fcfc1 | ||
|   | 49847236c2 | ||
|   | d8424443e6 | ||
|   | f3b571ec3f | ||
|   | 99318bb5d7 | ||
|   | 1aa154c9aa | ||
|   | c65d8a445b | ||
|   | 80f4f85570 | ||
|   | 5beee43a6b | ||
|   | 8d6ae203a0 | ||
|   | 4353479a5c | ||
|   | 34d7687f9e | ||
|   | b1dc3cf4af | ||
|   | 6a58b95933 | ||
|   | d3badfd02b | ||
|   | 0098be057b | ||
|   | 6f972aa515 | ||
|   | 7407ba6313 | ||
|   | 1c79de207b | ||
|   | 257c79db92 | ||
|   | 9d1934a308 | ||
|   | d70f959902 | ||
|   | e4d810222f | ||
|   | bc1af4ae07 | ||
|   | 6e688ef43f | ||
|   | f0fe1b23dc | ||
|   | aaf2006401 | ||
|   | b821e26935 | ||
|   | 7ae4287157 | ||
|   | c6fcc38a65 | ||
|   | ab2d5c8853 | ||
|   | 5e557ff0bc | ||
|   | 918ca449a1 | ||
|   | 8e73368008 | ||
|   | f3c1faf672 | ||
|   | d6df04dd6a | ||
|   | b1b9e51ab6 | ||
|   | e49d4770ac | ||
|   | 8fa1075511 | ||
|   | 9a70169b94 | ||
|   | fefb928237 | ||
|   | ad7e700d0d | ||
|   | 1699c69147 | ||
|   | 1695f7cece | ||
|   | 052c27f907 | ||
|   | dc46c32b30 | ||
|   | fa63349bb2 | ||
|   | ffe26448a6 | ||
|   | 4af51e8a84 | ||
|   | 1e453cf5a5 | ||
|   | 591282b87d | ||
|   | e87528d520 | ||
|   | d79eb0411d | ||
|   | ac1e0a4cf7 | ||
|   | 9525eab130 | ||
|   | 89b317496c | ||
|   | 13be91e78b | ||
|   | f68c1437f3 | ||
|   | 4c64c969bb | ||
|   | b4bf3b5138 | ||
|   | 083bc4b400 | ||
|   | e8683c5bcc | ||
|   | 80e0d1de91 | ||
|   | dbe841037e | ||
|   | bdd537c33c | ||
|   | c0c3846094 | ||
|   | 9e8710e7d2 | ||
|   | 475553fdf6 | ||
|   | 9d570f5b45 | ||
|   | af7fafd34f | ||
|   | d43130f4fc | ||
|   | 7500194620 | ||
|   | eb27c29144 | ||
|   | 43260b3e24 | ||
|   | f80713f0aa | ||
|   | 0c4bdc7ad1 | ||
|   | 811cff7bd0 | ||
|   | 30269aa75c | ||
|   | e345ef7083 | ||
|   | f559c9b8f7 | ||
|   | f4af0916b2 | ||
|   | f15f14f28d | ||
|   | 834f44f58d | ||
|   | b36f45dcf4 | ||
|   | 11ba21c9a8 | ||
|   | b045557ce1 | ||
|   | 0dd251a3f6 | ||
|   | 793acb1725 | ||
|   | 921243e8bd | ||
|   | bd9d7a90d9 | ||
|   | cc444a4cea | ||
|   | 38ca1fa168 | ||
|   | 7a552b87ec | ||
|   | 36923d3190 | ||
|   | a9d3017123 | ||
|   | 313acd4976 | ||
|   | a4c91bb268 | ||
|   | f9b566984b | ||
|   | 8dd261854d | ||
|   | 7351e62d87 | ||
|   | 0593ae720b | ||
|   | a0a7b08e08 | ||
|   | 9a3bc6b8b3 | ||
|   | 5acae17f71 | ||
|   | f1e5b76ef2 | ||
|   | 53c628fde9 | ||
|   | baca0a70c0 | ||
|   | 3e8d0af404 | ||
|   | cf9a91d9d5 | ||
|   | 02b9e282c6 | ||
|   | 9ce87f235f | ||
|   | e329bea1b2 | ||
|   | 8086e7b54d | ||
|   | f7a875606e | ||
|   | 196eaf85f4 | ||
|   | 876a55668e | ||
|   | 05bd21bdd5 | ||
|   | fb51a08cc6 | ||
|   | dd83d7f4d3 | ||
|   | 842a56f7ce | ||
|   | 9246a6e797 | ||
|   | 8ad693f717 | ||
|   | f4c2ee7cc4 | ||
|   | 6043441faa | ||
|   | 4a065c3710 | ||
|   | 0ef800bdd7 | ||
|   | 56eaa1910d | ||
|   | 201788e286 | ||
|   | 506e0f144f | ||
|   | 72f68bfdd9 | ||
|   | 2f9869b11d | ||
|   | 8ffcf6498c | ||
|   | d224ae1923 | ||
|   | fed2063a19 | ||
|   | db2810cdd7 | ||
|   | 4f1a6781ef | ||
|   | beffa5d5a4 | ||
|   | 7a20f1de07 | ||
|   | cd25cf726b | ||
|   | d6b1bc3842 | ||
|   | a4385fb9bb | ||
|   | 7045f2b8ea | ||
|   | 07ca1a4de8 | ||
|   | 24f289e692 | ||
|   | 01bcdaae2d | ||
|   | 55890008d1 | ||
|   | 5ab9b01879 | ||
|   | e4abb333b3 | ||
|   | 09f476c745 | ||
|   | 8806e68dce | ||
|   | 2ef1e25cd8 | ||
|   | 10e7f202aa | ||
|   | ccd7000c09 | ||
|   | 8ee7b798cf | ||
|   | 7733cf5bf0 | ||
|   | a05ce86dd7 | ||
|   | 91f51c32e8 | ||
|   | f910202bba | ||
|   | 6d77194a8f | ||
|   | 9deb89c15f | ||
|   | 4b62a092b4 | ||
|   | 81c8f626f9 | ||
|   | 3e846c42fb | ||
|   | 63ad7fd766 | ||
|   | 9ff1e9aa34 | ||
|   | 8d162b6f3d | ||
|   | 9844d10bef | ||
|   | b908fa8489 | ||
|   | 15a10643a7 | ||
|   | 299617aca1 | ||
|   | 45647d697a | ||
|   | 48f5105d38 | ||
|   | fe1c741d68 | ||
|   | fa42cc1f00 | ||
|   | 42cf5e7a81 | ||
|   | 47905e1aa1 | ||
|   | 9a8e907df3 | ||
|   | 106fe85582 | ||
|   | 4b3571bd57 | ||
|   | 96b537401a | ||
|   | 721c9eb057 | ||
|   | 51701bf6d6 | ||
|   | dbde68bd56 | ||
|   | ad2c9f585a | ||
|   | 562093c468 | ||
|   | b0295584a3 | ||
|   | 208c54de98 | ||
|   | 63e2d941a1 | ||
|   | 3956838e9c | ||
|   | abeee58bb0 | ||
|   | d5b1b49722 | ||
|   | 564ed03ff8 | ||
|   | 70db4c76b4 | ||
|   | d059f7975b | ||
|   | 4e74e6dc2d | ||
|   | b6deb96658 | ||
|   | 3839e966be | ||
|   | 3dd035849c | ||
|   | 3d6532b5d6 | ||
|   | bf7c175ee7 | ||
|   | f84af35ed6 | ||
|   | 99063b3eb1 | ||
|   | 3bec18f28d | ||
|   | 15de7a7894 | ||
|   | e20e04e677 | ||
|   | 5fc6ae2835 | ||
|   | 7d281b8c96 | ||
|   | 4880b801a7 | ||
|   | 74e354456a | ||
|   | af2e03aa36 | ||
|   | d8fa660ab6 | ||
|   | 1a62d48297 | ||
|   | 7ba01be13d | ||
|   | 1a83d64db7 | ||
|   | 5b53014c40 | ||
|   | 83685340af | ||
|   | 31e0cc4dec | ||
|   | 56b87fc1f5 | ||
|   | 6b956a2dd7 | ||
|   | 1937623d7d | ||
|   | 3b60b10945 | ||
|   | 7173acd350 | ||
|   | 6310d87338 | ||
|   | 49a1ed7c18 | ||
|   | d426e280d9 | ||
|   | 6154fb29f1 | ||
|   | 97d48ef9d6 | ||
|   | 88992625c4 | ||
|   | bc6eb44218 | ||
|   | cf9ccd799d | ||
|   | ffa0e4e771 | ||
|   | 60fa9c196c | ||
|   | df860d22fb | ||
|   | cb46ff326c | ||
|   | f277a853ef | ||
|   | 9ae34f67c3 | ||
|   | c9223218cc | ||
|   | c0dd645aba | ||
|   | 2e948eb5b6 | ||
|   | c3276889cf | ||
|   | a76ca8282d | ||
|   | 8ce6b8362f | ||
|   | 842fb12f05 | ||
|   | d63e1511af | ||
|   | 278783b8e0 | ||
|   | d24e3c922d | ||
|   | 1d02cd2283 | ||
|   | 8edeb82a87 | ||
|   | 146e9279de | ||
|   | 47105f50a9 | ||
|   | 16c9c80f37 | ||
|   | 8e7e4bc95a | ||
|   | 0aa3d2f930 | ||
|   | ce77755a1e | ||
|   | 0f31f20c87 | ||
|   | ee6da2aaa5 | ||
|   | a35f087cd9 | ||
|   | 6e029b44dd | ||
|   | 973c0cff34 | ||
|   | 2027eea6ac | ||
|   | 2f43692f33 | ||
|   | 6d24992f88 | ||
|   | b4388a58d6 | ||
|   | 158aa05fac | ||
|   | f2731bf55e | ||
|   | 7304e99fce | ||
|   | 02700b83eb | ||
|   | 676b25acf9 | ||
|   | 556359ea2d | ||
|   | b72923e0f5 | ||
|   | 115ac9f75e | ||
|   | 32e36f6708 | ||
|   | d949b7a4f9 | ||
|   | eae1171ff5 | ||
|   | 76a1b75a51 | ||
|   | 8882c0daea | ||
|   | 07ebc16d59 | ||
|   | 0ceb109964 | ||
|   | 118b0d0038 | ||
|   | 5e87067792 | ||
|   | c946a252e8 | ||
|   | f9ad2ba1dd | ||
|   | 0d0ecd33bd | ||
|   | e4b98fd05b | ||
|   | 95a5933303 | ||
|   | da3b55fa64 | ||
|   | fbbabfb90e | ||
|   | f13da6830d | ||
|   | f560a8e2f8 | ||
|   | 56f1139c2f | ||
|   | 773bdfc1e2 | ||
|   | f449666628 | ||
|   | 3f282de0ab | ||
|   | 440dd8d22f | ||
|   | dcff9de2f7 | ||
|   | a192866543 | ||
|   | 10081416de | ||
|   | e2bed618f9 | ||
|   | 03ab1f3823 | ||
|   | ac8aeb63d9 | ||
|   | 2e16d822fa | ||
|   | e407d873fa | ||
|   | fd712a1dbe | ||
|   | e9028b40ce | ||
|   | c9da3dee7c | ||
|   | c8c224e202 | ||
|   | f34559daaf | ||
|   | 9fefbf4c27 | ||
|   | 1af9fd73ea | ||
|   | 75ef394eff | ||
|   | ec6cc2c63e | ||
|   | 06bc2e192b | ||
|   | 78701ec7c1 | ||
|   | c925fab7e4 | ||
|   | 42fd72c164 | ||
|   | 7fd160e1a2 | ||
|   | 97a0d940eb | ||
|   | efaa099d81 | ||
|   | 47864a804b | ||
|   | 91136c0e43 | ||
|   | 28c3b1bd61 | ||
|   | 551352bc40 | ||
|   | e73c24c925 | ||
|   | 7ec4c286cc | ||
|   | 6705e2ec4b | ||
|   | 6f0373063b | ||
|   | f64eef60b5 | ||
|   | 89546bf86b | ||
|   | 793678feca | ||
|   | 923cc3019a | ||
|   | 10eb98a5f6 | ||
|   | bd9e89d8dd | ||
|   | 1926b4ce73 | ||
|   | 4ef3062d74 | ||
|   | abb6e0f60f | ||
|   | f204d8d84e | ||
|   | fa301656f1 | ||
|   | 7e1221028f | ||
|   | 41308cb2dd | ||
|   | 130600521c | ||
|   | cd57548a48 | ||
|   | efacc99f76 | ||
|   | f0d236e172 | ||
|   | a8118bd8c6 | ||
|   | 0e58f2ef53 | ||
|   | f4b22b3a0c | ||
|   | df5bd281c7 | ||
|   | a3f23837ce | ||
|   | 612d989b97 | ||
|   | 42c01ee9a2 | ||
|   | 14074db591 | ||
|   | 43dfdd7942 | ||
|   | f397b97ccf | ||
|   | 95f8716144 | ||
|   | 17ba472b2e | ||
|   | 42d82571ab | ||
|   | 9119a28141 | ||
|   | a32263d838 | ||
|   | 208ae2bb88 | ||
|   | 4d85462a85 | ||
|   | f601aa9ca0 | ||
|   | 8aee3ad455 | ||
|   | 6a2a1e9561 | ||
|   | 5f8786c9dc | ||
|   | 73f1d3eead | ||
|   | 2bf21bb3c3 | ||
|   | f80f0dbb11 | ||
|   | 37518c70c4 | ||
|   | e5951b5bef | ||
|   | ab320bd90b | ||
|   | 7bd36b5371 | ||
|   | b882b0f2bc | ||
|   | 38d7ae73cc | ||
|   | 4527c6ee5d | ||
|   | 85829e70c1 | ||
|   | 256c08d82a | ||
|   | c2ce03c047 | ||
|   | f2af19e198 | ||
|   | 930b7c092d | ||
|   | 00757c69c6 | ||
|   | 55f267d0fc | ||
|   | 6b96aff6e8 | ||
|   | 32b773a8fa | ||
|   | 03089adad6 | ||
|   | 4a1fe746ab | ||
|   | aa52c05d2c | ||
|   | 26407a43e7 | ||
|   | a02934bf19 | ||
|   | 09c65fba09 | ||
|   | 4305c727d0 | ||
|   | 188339897f | ||
|   | 4ecff9a707 | ||
|   | 355aed49c6 | ||
|   | 4717b6b0f0 | ||
|   | 45ebe9048d | ||
|   | b2170c49a3 | ||
|   | dc2f4d6115 | ||
|   | 1eb132440f | ||
|   | a464bbc37a | ||
|   | ed995697c2 | ||
|   | 163cd84c7b | ||
|   | 293d7cc292 | ||
|   | 5de1b4e74c | ||
|   | 7b474975da | ||
|   | beab51516b | ||
|   | fe8685a50c | ||
|   | f9af5d0885 | ||
|   | e8136a9720 | ||
|   | 531e5d4556 | ||
|   | e66255963a | ||
|   | 246aac8ee4 | ||
|   | 23cfeff685 | ||
|   | a5e7e0d126 | ||
|   | 5bebc30ba0 | ||
|   | 0e7057f5b9 | ||
|   | 7c6c365ba4 | ||
|   | 424c9bb0c5 | ||
|   | 9d0f26594c | ||
|   | 99c17de079 | ||
|   | b1e3dd0af6 | ||
|   | 261cb89530 | ||
|   | ff6773ba37 | ||
|   | bdfbbfcbbd | ||
|   | 0c4cd56758 | ||
|   | 4a36658321 | ||
|   | 7aae938685 | ||
|   | 3723401e7a | ||
|   | 70631366a9 | ||
|   | 0e40bbda3e | ||
|   | e9aa475398 | ||
|   | 8d2a811184 | ||
|   | dd7f5b6700 | ||
|   | a4f6277737 | ||
|   | c2bfaacbb7 | ||
|   | a17cbfa2d4 | ||
|   | fb9a101555 | ||
|   | e319cf0200 | ||
|   | 0a8395ef6a | ||
|   | 38df5e01be | ||
|   | ebd891a868 | ||
|   | 4ab2395cbe | ||
|   | 5f1f989fc9 | ||
|   | 44b709eee3 | ||
|   | d0d7726597 | ||
|   | 054c342aeb | ||
|   | c79c33baf7 | ||
|   | 23b00e35b2 | ||
|   | fe51079266 | ||
|   | 0791b0bbee | ||
|   | dbf04c8eeb | ||
|   | 6204256df8 | ||
|   | 93cc8c2327 | ||
|   | 68a2e5bbbc | ||
|   | 72792153f2 | ||
|   | 88b6ef1897 | 
| @@ -1,20 +0,0 @@ | ||||
| <Project> | ||||
| 	<PropertyGroup> | ||||
| 		 | ||||
| 		<ImplicitUsings>enable</ImplicitUsings> | ||||
| 		<TargetFrameworks>net6.0;net8.0;</TargetFrameworks> | ||||
| 		<Version>4.0.0.6</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> | ||||
| @@ -1,101 +0,0 @@ | ||||
|  | ||||
| Microsoft Visual Studio Solution File, Format Version 12.00 | ||||
| # Visual Studio Version 17 | ||||
| VisualStudioVersion = 17.6.33927.249 | ||||
| MinimumVisualStudioVersion = 10.0.40219.1 | ||||
| Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "admin", "admin", "{4E66C22C-0636-4949-BF6A-9E3BBE1550BA}" | ||||
| 	ProjectSection(SolutionItems) = preProject | ||||
| 		admin\Directory.Build.props = admin\Directory.Build.props | ||||
| 	EndProjectSection | ||||
| EndProject | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ThingsGateway.Components", "admin\ThingsGateway.Components\ThingsGateway.Components.csproj", "{0A891D8E-23B3-46AD-8D30-565EE5004F93}" | ||||
| EndProject | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ThingsGateway.Core", "admin\ThingsGateway.Core\ThingsGateway.Core.csproj", "{A712EAEE-94F2-4F01-8C1C-2EC802280DD7}" | ||||
| EndProject | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ThingsGateway.Admin.Core", "admin\ThingsGateway.Admin.Core\ThingsGateway.Admin.Core.csproj", "{5DA3D2BD-6768-4479-B52F-49E022EFF310}" | ||||
| EndProject | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ThingsGateway.Admin.Blazor", "admin\ThingsGateway.Admin.Blazor\ThingsGateway.Admin.Blazor.csproj", "{8DD5DF98-7FDE-4B49-8661-AEB44D923CFE}" | ||||
| EndProject | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ThingsGateway.Admin.Application", "admin\ThingsGateway.Admin.Application\ThingsGateway.Admin.Application.csproj", "{D6685A42-2712-417A-92C5-5EFF90B9FA94}" | ||||
| EndProject | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ThingsGateway.Admin.ApiController", "admin\ThingsGateway.Admin.ApiController\ThingsGateway.Admin.ApiController.csproj", "{0D17D801-6DAA-4FD1-9A99-F9F07FA6BA88}" | ||||
| EndProject | ||||
| Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "web", "web", "{F0C9A8CB-231B-45E0-B91B-4FEF7EF47197}" | ||||
| 	ProjectSection(SolutionItems) = preProject | ||||
| 		web\Directory.Build.props = web\Directory.Build.props | ||||
| 	EndProjectSection | ||||
| EndProject | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ThingsGateway.Web.Core", "web\ThingsGateway.Web.Core\ThingsGateway.Web.Core.csproj", "{D37EC028-EA46-4510-8261-6E780A906314}" | ||||
| EndProject | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ThingsGateway.Web.Entry", "web\ThingsGateway.Web.Entry\ThingsGateway.Web.Entry.csproj", "{C5F662EB-991F-438D-BF61-EF87E7371C04}" | ||||
| EndProject | ||||
| Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "解决方案项", "解决方案项", "{97B23D8B-C6C0-4746-A21F-C7B49354B284}" | ||||
| 	ProjectSection(SolutionItems) = preProject | ||||
| 		..\.gitignore = ..\.gitignore | ||||
| 	EndProjectSection | ||||
| EndProject | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ThingsGateway.Foundation", "foundation\ThingsGateway.Foundation\ThingsGateway.Foundation.csproj", "{6961511A-8787-42AF-827D-B630B2AF4791}" | ||||
| EndProject | ||||
| Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "foundation", "foundation", "{268A1A81-2685-47E1-9986-5934A58A31A4}" | ||||
| EndProject | ||||
| Global | ||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| 		Debug|Any CPU = Debug|Any CPU | ||||
| 		Release|Any CPU = Release|Any CPU | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||
| 		{0A891D8E-23B3-46AD-8D30-565EE5004F93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||
| 		{0A891D8E-23B3-46AD-8D30-565EE5004F93}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
| 		{0A891D8E-23B3-46AD-8D30-565EE5004F93}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{0A891D8E-23B3-46AD-8D30-565EE5004F93}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{A712EAEE-94F2-4F01-8C1C-2EC802280DD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||
| 		{A712EAEE-94F2-4F01-8C1C-2EC802280DD7}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
| 		{A712EAEE-94F2-4F01-8C1C-2EC802280DD7}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{A712EAEE-94F2-4F01-8C1C-2EC802280DD7}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{5DA3D2BD-6768-4479-B52F-49E022EFF310}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||
| 		{5DA3D2BD-6768-4479-B52F-49E022EFF310}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
| 		{5DA3D2BD-6768-4479-B52F-49E022EFF310}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{5DA3D2BD-6768-4479-B52F-49E022EFF310}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{8DD5DF98-7FDE-4B49-8661-AEB44D923CFE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||
| 		{8DD5DF98-7FDE-4B49-8661-AEB44D923CFE}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
| 		{8DD5DF98-7FDE-4B49-8661-AEB44D923CFE}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{8DD5DF98-7FDE-4B49-8661-AEB44D923CFE}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{D6685A42-2712-417A-92C5-5EFF90B9FA94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||
| 		{D6685A42-2712-417A-92C5-5EFF90B9FA94}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
| 		{D6685A42-2712-417A-92C5-5EFF90B9FA94}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{D6685A42-2712-417A-92C5-5EFF90B9FA94}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{0D17D801-6DAA-4FD1-9A99-F9F07FA6BA88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||
| 		{0D17D801-6DAA-4FD1-9A99-F9F07FA6BA88}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
| 		{0D17D801-6DAA-4FD1-9A99-F9F07FA6BA88}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{0D17D801-6DAA-4FD1-9A99-F9F07FA6BA88}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{D37EC028-EA46-4510-8261-6E780A906314}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||
| 		{D37EC028-EA46-4510-8261-6E780A906314}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
| 		{D37EC028-EA46-4510-8261-6E780A906314}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{D37EC028-EA46-4510-8261-6E780A906314}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{C5F662EB-991F-438D-BF61-EF87E7371C04}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||
| 		{C5F662EB-991F-438D-BF61-EF87E7371C04}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
| 		{C5F662EB-991F-438D-BF61-EF87E7371C04}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{C5F662EB-991F-438D-BF61-EF87E7371C04}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{6961511A-8787-42AF-827D-B630B2AF4791}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||
| 		{6961511A-8787-42AF-827D-B630B2AF4791}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
| 		{6961511A-8787-42AF-827D-B630B2AF4791}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{6961511A-8787-42AF-827D-B630B2AF4791}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(SolutionProperties) = preSolution | ||||
| 		HideSolutionNode = FALSE | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(NestedProjects) = preSolution | ||||
| 		{0A891D8E-23B3-46AD-8D30-565EE5004F93} = {4E66C22C-0636-4949-BF6A-9E3BBE1550BA} | ||||
| 		{A712EAEE-94F2-4F01-8C1C-2EC802280DD7} = {4E66C22C-0636-4949-BF6A-9E3BBE1550BA} | ||||
| 		{5DA3D2BD-6768-4479-B52F-49E022EFF310} = {4E66C22C-0636-4949-BF6A-9E3BBE1550BA} | ||||
| 		{8DD5DF98-7FDE-4B49-8661-AEB44D923CFE} = {4E66C22C-0636-4949-BF6A-9E3BBE1550BA} | ||||
| 		{D6685A42-2712-417A-92C5-5EFF90B9FA94} = {4E66C22C-0636-4949-BF6A-9E3BBE1550BA} | ||||
| 		{0D17D801-6DAA-4FD1-9A99-F9F07FA6BA88} = {4E66C22C-0636-4949-BF6A-9E3BBE1550BA} | ||||
| 		{D37EC028-EA46-4510-8261-6E780A906314} = {F0C9A8CB-231B-45E0-B91B-4FEF7EF47197} | ||||
| 		{C5F662EB-991F-438D-BF61-EF87E7371C04} = {F0C9A8CB-231B-45E0-B91B-4FEF7EF47197} | ||||
| 		{6961511A-8787-42AF-827D-B630B2AF4791} = {268A1A81-2685-47E1-9986-5934A58A31A4} | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ExtensibilityGlobals) = postSolution | ||||
| 		SolutionGuid = {C49B2D3E-6818-4E28-91B7-6E4E7E264BBB} | ||||
| 	EndGlobalSection | ||||
| EndGlobal | ||||
| @@ -82,7 +82,6 @@ EndProject | ||||
| Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "解决方案项", "解决方案项", "{97B23D8B-C6C0-4746-A21F-C7B49354B284}" | ||||
| 	ProjectSection(SolutionItems) = preProject | ||||
| 		..\.gitignore = ..\.gitignore | ||||
| 		..\README.md = ..\README.md | ||||
| 	EndProjectSection | ||||
| EndProject | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ThingsGateway.Plugin.Kafka", "plugin\ThingsGateway.Plugin.Kafka\ThingsGateway.Plugin.Kafka.csproj", "{E4B8B8E6-FAE7-43BA-9A51-33A3CD9FB825}" | ||||
|   | ||||
| @@ -1,7 +1,17 @@ | ||||
| <Project> | ||||
| 	<Import Project="$(SolutionDir)\Directory.Build.props" /> | ||||
| 	<PropertyGroup> | ||||
|  | ||||
| 		<ImplicitUsings>enable</ImplicitUsings> | ||||
| 		<TargetFrameworks>net6.0;net8.0;</TargetFrameworks> | ||||
| 		<Version>4.0.0.1</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 IConfigService _configService; | ||||
|     private readonly ConfigService _configService; | ||||
|     /// <summary> | ||||
|     /// <inheritdoc cref="SwaggerController"/> | ||||
|     /// </summary> | ||||
|     /// <param name="sysConfigService"></param> | ||||
|     public SwaggerController(IConfigService sysConfigService) | ||||
|     public SwaggerController(ConfigService sysConfigService) | ||||
|     { | ||||
|         _configService = sysConfigService; | ||||
|     } | ||||
|   | ||||
| @@ -79,7 +79,7 @@ | ||||
|             Swagger登录授权服务 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Admin.ApiController.SwaggerController.#ctor(ThingsGateway.Admin.Application.IConfigService)"> | ||||
|         <member name="M:ThingsGateway.Admin.ApiController.SwaggerController.#ctor(ThingsGateway.Admin.Application.ConfigService)"> | ||||
|             <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, true); | ||||
|         var desc = method.GetActualCustomAttribute<OperDescAttribute>(Target); | ||||
|         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, true); | ||||
|         var desc = method.GetActualCustomAttribute<OperDescAttribute>(Target); | ||||
|         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) | ||||
|                 { | ||||
|                     GetVerificatInfos(ref verificatInfos);//获取剩余时间 | ||||
|                     OpenApiSessionService.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) | ||||
|                   { | ||||
|                       GetVerificatInfos(ref verificatInfos);//获取剩余时间 | ||||
|                       SessionService.GetVerificatInfos(ref verificatInfos);//获取剩余时间 | ||||
|                       it.VerificatCount = verificatInfos.Count;//令牌数量 | ||||
|                       it.VerificatSignList = verificatInfos;//令牌列表 | ||||
|  | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
| 	<ItemGroup> | ||||
| 		<ProjectReference Include="..\ThingsGateway.Admin.Core\ThingsGateway.Admin.Core.csproj" /> | ||||
| 		<PackageReference Include="MiniExcel" Version="1.31.2" /> | ||||
| 		<PackageReference Include="System.Linq.Dynamic.Core" Version="1.3.7" /> | ||||
| 		<PackageReference Include="System.Linq.Dynamic.Core" Version="1.3.5" /> | ||||
| 	</ItemGroup> | ||||
|  | ||||
| </Project> | ||||
| @@ -37,7 +37,7 @@ namespace ThingsGateway.Admin.Blazor | ||||
|             { | ||||
|                 try | ||||
|                 { | ||||
|                     var data = await _serviceScope.ServiceProvider.GetService<IUserCenterService>().GetLoginDefaultRazorAsync(UserManager.UserId); | ||||
|                     var data = await _serviceScope.ServiceProvider.GetService<UserCenterService>().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<IConfigService>().AddAsync(input); | ||||
|         await _serviceScope.ServiceProvider.GetService<ConfigService>().AddAsync(input); | ||||
|     } | ||||
|  | ||||
|     private async Task DeleteCallAsync(IEnumerable<SysConfig> sysConfigs) | ||||
|     { | ||||
|         await _serviceScope.ServiceProvider.GetService<IConfigService>().DeleteAsync(sysConfigs.Select(a => a.Id).ToArray()); | ||||
|         await _serviceScope.ServiceProvider.GetService<ConfigService>().DeleteAsync(sysConfigs.Select(a => a.Id).ToArray()); | ||||
|     } | ||||
|     private async Task EditCallAsync(ConfigEditInput sysConfigs) | ||||
|     { | ||||
|         await _serviceScope.ServiceProvider.GetService<IConfigService>().EditAsync(sysConfigs); | ||||
|         await _serviceScope.ServiceProvider.GetService<ConfigService>().EditAsync(sysConfigs); | ||||
|     } | ||||
|  | ||||
|     private async Task OnSaveAsync() | ||||
|     { | ||||
|         await _serviceScope.ServiceProvider.GetService<IConfigService>().EditBatchAsync(_sysConfig); | ||||
|         await _serviceScope.ServiceProvider.GetService<ConfigService>().EditBatchAsync(_sysConfig); | ||||
|         await _mainLayout.StateHasChangedAsync(); | ||||
|         await PopupService.EnqueueSnackbarAsync("成功", AlertTypes.Success); | ||||
|     } | ||||
|     private async Task<ISqlSugarPagedList<SysConfig>> QueryCallAsync(ConfigPageInput input) | ||||
|     { | ||||
|         return await _serviceScope.ServiceProvider.GetService<IConfigService>().PageAsync(input); | ||||
|         return await _serviceScope.ServiceProvider.GetService<ConfigService>().PageAsync(input); | ||||
|     } | ||||
| } | ||||
| @@ -45,23 +45,23 @@ public partial class Menu | ||||
|     private async Task AddCallAsync(MenuAddInput input) | ||||
|     { | ||||
|         input.ParentId = _search.ParentId; | ||||
|         await _serviceScope.ServiceProvider.GetService<IMenuService>().AddAsync(input); | ||||
|         await _serviceScope.ServiceProvider.GetService<MenuService>().AddAsync(input); | ||||
|         await NavChangeAsync(); | ||||
|     } | ||||
|     private async Task ButtonAddCallAsync(ButtonAddInput input) | ||||
|     { | ||||
|         input.ParentId = _buttonParentId; | ||||
|         await _serviceScope.ServiceProvider.GetService<IButtonService>().AddAsync(input); | ||||
|         await _serviceScope.ServiceProvider.GetService<ButtonService>().AddAsync(input); | ||||
|     } | ||||
|  | ||||
|     private async Task ButtonDeleteCallAsync(IEnumerable<SysResource> input) | ||||
|     { | ||||
|         await _serviceScope.ServiceProvider.GetService<IButtonService>().DeleteAsync(input.Select(a => a.Id).ToArray()); | ||||
|         await _serviceScope.ServiceProvider.GetService<ButtonService>().DeleteAsync(input.Select(a => a.Id).ToArray()); | ||||
|     } | ||||
|  | ||||
|     private async Task ButtonEditCallAsync(ButtonEditInput input) | ||||
|     { | ||||
|         await _serviceScope.ServiceProvider.GetService<IButtonService>().EditAsync(input); | ||||
|         await _serviceScope.ServiceProvider.GetService<ButtonService>().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<IButtonService>().PageAsync(input); | ||||
|         var data = await _serviceScope.ServiceProvider.GetService<ButtonService>().PageAsync(input); | ||||
|         return data; | ||||
|     } | ||||
|  | ||||
| @@ -96,13 +96,13 @@ public partial class Menu | ||||
|  | ||||
|     private async Task DeleteCallAsync(IEnumerable<SysResource> input) | ||||
|     { | ||||
|         await _serviceScope.ServiceProvider.GetService<IMenuService>().DeleteAsync(input.Select(a => a.Id).ToArray()); | ||||
|         await _serviceScope.ServiceProvider.GetService<MenuService>().DeleteAsync(input.Select(a => a.Id).ToArray()); | ||||
|         await NavChangeAsync(); | ||||
|  | ||||
|     } | ||||
|     private async Task EditCallAsync(MenuEditInput input) | ||||
|     { | ||||
|         await _serviceScope.ServiceProvider.GetService<IMenuService>().EditAsync(input); | ||||
|         await _serviceScope.ServiceProvider.GetService<MenuService>().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<IMenuService>().TreeAsync(input); | ||||
|         var data = await _serviceScope.ServiceProvider.GetService<MenuService>().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<IOpenApiSessionService>().ExitSessionAsync(id); | ||||
|             await _serviceScope.ServiceProvider.GetService<OpenApiSessionService>().ExitSessionAsync(id); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private async Task<ISqlSugarPagedList<OpenApiSessionOutput>> SessionQueryCallAsync(OpenApiSessionPageInput input) | ||||
|     { | ||||
|         return await _serviceScope.ServiceProvider.GetService<IOpenApiSessionService>().PageAsync(input); | ||||
|         return await _serviceScope.ServiceProvider.GetService<OpenApiSessionService>().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<IOpenApiSessionService>().ExitVerificatAsync(send); | ||||
|         await _serviceScope.ServiceProvider.GetService<OpenApiSessionService>().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<IOpenApiUserService>().AddAsync(input); | ||||
|         await _serviceScope.ServiceProvider.GetService<OpenApiUserService>().AddAsync(input); | ||||
|     } | ||||
|  | ||||
|     private async Task DeleteCallAsync(IEnumerable<OpenApiUser> users) | ||||
|     { | ||||
|         await _serviceScope.ServiceProvider.GetService<IOpenApiUserService>().DeleteAsync(users.Select(a => a.Id).ToArray()); | ||||
|         await _serviceScope.ServiceProvider.GetService<OpenApiUserService>().DeleteAsync(users.Select(a => a.Id).ToArray()); | ||||
|     } | ||||
|  | ||||
|     private async Task EditCallAsync(OpenApiUserEditInput users) | ||||
|     { | ||||
|         await _serviceScope.ServiceProvider.GetService<IOpenApiUserService>().EditAsync(users); | ||||
|         await _serviceScope.ServiceProvider.GetService<OpenApiUserService>().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<IOpenApiUserService>().GrantRoleAsync(userGrantRoleInput); | ||||
|             await _serviceScope.ServiceProvider.GetService<OpenApiUserService>().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<IOpenApiUserService>().PageAsync(input); | ||||
|         return await _serviceScope.ServiceProvider.GetService<OpenApiUserService>().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<IOpenApiUserService>().EnableUserAsync(context.Id); | ||||
|                 await _serviceScope.ServiceProvider.GetService<OpenApiUserService>().EnableUserAsync(context.Id); | ||||
|             else | ||||
|                 await _serviceScope.ServiceProvider.GetService<IOpenApiUserService>().DisableUserAsync(context.Id); | ||||
|                 await _serviceScope.ServiceProvider.GetService<OpenApiUserService>().DisableUserAsync(context.Id); | ||||
|         } | ||||
|         finally | ||||
|         { | ||||
|   | ||||
| @@ -47,7 +47,7 @@ public partial class Oplog | ||||
|         var confirm = await PopupService.OpenConfirmDialogAsync("删除", "确定 ?"); | ||||
|         if (confirm) | ||||
|         { | ||||
|             await _serviceScope.ServiceProvider.GetService<IOperateLogService>().DeleteAsync(_categoryFilters.Select(it => it.Value).ToArray()); | ||||
|             await _serviceScope.ServiceProvider.GetService<OperateLogService>().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<IOperateLogService>().PageAsync(input); | ||||
|         return await _serviceScope.ServiceProvider.GetService<OperateLogService>().PageAsync(input); | ||||
|     } | ||||
| } | ||||
| @@ -41,17 +41,17 @@ public partial class Role | ||||
|  | ||||
|     private async Task AddCallAsync(RoleAddInput input) | ||||
|     { | ||||
|         await _serviceScope.ServiceProvider.GetService<IRoleService>().AddAsync(input); | ||||
|         await _serviceScope.ServiceProvider.GetService<RoleService>().AddAsync(input); | ||||
|     } | ||||
|     private async Task DeleteCallAsync(IEnumerable<SysRole> sysRoles) | ||||
|     { | ||||
|         await _serviceScope.ServiceProvider.GetService<IRoleService>().DeleteAsync(sysRoles.Select(a => a.Id).ToArray()); | ||||
|         await _serviceScope.ServiceProvider.GetService<RoleService>().DeleteAsync(sysRoles.Select(a => a.Id).ToArray()); | ||||
|         await _mainLayout.StateHasChangedAsync(); | ||||
|     } | ||||
|  | ||||
|     private async Task EditCallAsync(RoleEditInput input) | ||||
|     { | ||||
|         await _serviceScope.ServiceProvider.GetService<IRoleService>().EditAsync(input); | ||||
|         await _serviceScope.ServiceProvider.GetService<RoleService>().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<IRoleService>().GrantResourceAsync(userGrantRoleInput); | ||||
|             await _serviceScope.ServiceProvider.GetService<RoleService>().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<IRoleService>().GrantUserAsync(userGrantRoleInput); | ||||
|             await _serviceScope.ServiceProvider.GetService<RoleService>().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<IRoleService>().PageAsync(input); | ||||
|         return await _serviceScope.ServiceProvider.GetService<RoleService>().PageAsync(input); | ||||
|     } | ||||
|  | ||||
|     private async Task ResuorceInitAsync() | ||||
|     { | ||||
|         _resTreeSelectors = (await _serviceScope.ServiceProvider.GetService<ResourceService>().GetRoleGrantResourceMenusAsync()); | ||||
|         _roleHasResuorces = (await _serviceScope.ServiceProvider.GetService<IRoleService>().OwnResourceAsync(_choiceRoleId))?.GrantInfoList; | ||||
|         _roleHasResuorces = (await _serviceScope.ServiceProvider.GetService<RoleService>().OwnResourceAsync(_choiceRoleId))?.GrantInfoList; | ||||
|     } | ||||
|  | ||||
|     private async Task<List<UserSelectorOutput>> UserInitAsync() | ||||
|     { | ||||
|         _allUsers = await _serviceScope.ServiceProvider.GetService<ISysUserService>().UserSelectorAsync(_searchKey); | ||||
|         var data = await _serviceScope.ServiceProvider.GetService<IRoleService>().OwnUserAsync(_choiceRoleId); | ||||
|         _allUsers = await _serviceScope.ServiceProvider.GetService<SysUserService>().UserSelectorAsync(_searchKey); | ||||
|         var data = await _serviceScope.ServiceProvider.GetService<RoleService>().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<ISessionService>().ExitSessionAsync(id); | ||||
|             await _serviceScope.ServiceProvider.GetService<SessionService>().ExitSessionAsync(id); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|  | ||||
|     private async Task<ISqlSugarPagedList<SessionOutput>> SessionQueryCallAsync(SessionPageInput input) | ||||
|     { | ||||
|         return await _serviceScope.ServiceProvider.GetService<ISessionService>().PageAsync(input); | ||||
|         return await _serviceScope.ServiceProvider.GetService<SessionService>().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<ISessionService>().ExitVerificatAsync(send); | ||||
|         await _serviceScope.ServiceProvider.GetService<SessionService>().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<ISpaService>().AddAsync(input); | ||||
|         await _serviceScope.ServiceProvider.GetService<SpaService>().AddAsync(input); | ||||
|         await _mainLayout.StateHasChangedAsync(); | ||||
|     } | ||||
|     private async Task DeleteCallAsync(IEnumerable<SysResource> input) | ||||
|     { | ||||
|         await _serviceScope.ServiceProvider.GetService<ISpaService>().DeleteAsync(input.Select(a => a.Id).ToArray()); | ||||
|         await _serviceScope.ServiceProvider.GetService<SpaService>().DeleteAsync(input.Select(a => a.Id).ToArray()); | ||||
|         await _mainLayout.StateHasChangedAsync(); | ||||
|     } | ||||
|  | ||||
|     private async Task EditCallAsync(SpaEditInput input) | ||||
|     { | ||||
|         await _serviceScope.ServiceProvider.GetService<ISpaService>().EditAsync(input); | ||||
|         await _serviceScope.ServiceProvider.GetService<SpaService>().EditAsync(input); | ||||
|         await _mainLayout.StateHasChangedAsync(); | ||||
|     } | ||||
|  | ||||
|     private async Task<ISqlSugarPagedList<SysResource>> QueryCallAsync(SpaPageInput input) | ||||
|     { | ||||
|         return await _serviceScope.ServiceProvider.GetService<ISpaService>().PageAsync(input); | ||||
|         return await _serviceScope.ServiceProvider.GetService<SpaService>().PageAsync(input); | ||||
|     } | ||||
| } | ||||
| @@ -35,17 +35,17 @@ public partial class User | ||||
|  | ||||
|     private async Task AddCallAsync(UserAddInput input) | ||||
|     { | ||||
|         await _serviceScope.ServiceProvider.GetService<ISysUserService>().AddAsync(input); | ||||
|         await _serviceScope.ServiceProvider.GetService<SysUserService>().AddAsync(input); | ||||
|     } | ||||
|     private async Task DeleteCallAsync(IEnumerable<SysUser> users) | ||||
|     { | ||||
|         await _serviceScope.ServiceProvider.GetService<ISysUserService>().DeleteAsync(users.Select(a => a.Id).ToArray()); | ||||
|         await _serviceScope.ServiceProvider.GetService<SysUserService>().DeleteAsync(users.Select(a => a.Id).ToArray()); | ||||
|         await _mainLayout.StateHasChangedAsync(); | ||||
|     } | ||||
|  | ||||
|     private async Task EditCallAsync(UserEditInput users) | ||||
|     { | ||||
|         await _serviceScope.ServiceProvider.GetService<ISysUserService>().EditAsync(users); | ||||
|         await _serviceScope.ServiceProvider.GetService<SysUserService>().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<ISysUserService>().GrantRoleAsync(userGrantRoleInput); | ||||
|             await _serviceScope.ServiceProvider.GetService<SysUserService>().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<ISysUserService>().PageAsync(input); | ||||
|         return await _serviceScope.ServiceProvider.GetService<SysUserService>().PageAsync(input); | ||||
|     } | ||||
|  | ||||
|     private async Task ResetPasswordAsync(SysUser sysUser) | ||||
|     { | ||||
|         await _serviceScope.ServiceProvider.GetService<ISysUserService>().ResetPasswordAsync(sysUser.Id); | ||||
|         await _serviceScope.ServiceProvider.GetService<SysUserService>().ResetPasswordAsync(sysUser.Id); | ||||
|         await PopupService.EnqueueSnackbarAsync(new("成功", AlertTypes.Success)); | ||||
|         await _mainLayout.StateHasChangedAsync(); | ||||
|     } | ||||
|  | ||||
|     private async Task RoleInitAsync() | ||||
|     { | ||||
|         _allRoles = await _serviceScope.ServiceProvider.GetService<IRoleService>().RoleSelectorAsync(); | ||||
|         var data = await _serviceScope.ServiceProvider.GetService<IRoleService>().GetRoleIdListByUserIdAsync(_choiceUserId); | ||||
|         _allRoles = await _serviceScope.ServiceProvider.GetService<RoleService>().RoleSelectorAsync(); | ||||
|         var data = await _serviceScope.ServiceProvider.GetService<RoleService>().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<ISysUserService>().EnableUserAsync(context.Id); | ||||
|                 await _serviceScope.ServiceProvider.GetService<SysUserService>().EnableUserAsync(context.Id); | ||||
|             else | ||||
|                 await _serviceScope.ServiceProvider.GetService<ISysUserService>().DisableUserAsync(context.Id); | ||||
|                 await _serviceScope.ServiceProvider.GetService<SysUserService>().DisableUserAsync(context.Id); | ||||
|         } | ||||
|         finally | ||||
|         { | ||||
|   | ||||
| @@ -44,14 +44,14 @@ public partial class UserCenter | ||||
|  | ||||
|     async Task OnDefaultRazorSaveAsync() | ||||
|     { | ||||
|         await _serviceScope.ServiceProvider.GetService<IUserCenterService>().UpdateUserDefaultRazorAsync(UserManager.UserId, _defaultMenuId); | ||||
|         await _serviceScope.ServiceProvider.GetService<UserCenterService>().UpdateUserDefaultRazorAsync(UserManager.UserId, _defaultMenuId); | ||||
|         await _mainLayout.StateHasChangedAsync(); | ||||
|         await PopupService.EnqueueSnackbarAsync("成功", AlertTypes.Success); | ||||
|     } | ||||
|  | ||||
|     async Task OnShortcutSaveAsync() | ||||
|     { | ||||
|         await _serviceScope.ServiceProvider.GetService<IUserCenterService>().UpdateWorkbenchAsync(_menusChoice); | ||||
|         await _serviceScope.ServiceProvider.GetService<UserCenterService>().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<IUserCenterService>().EditPasswordAsync(_passwordInfoInput); | ||||
|             await _serviceScope.ServiceProvider.GetService<UserCenterService>().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<IUserCenterService>().UpdateUserInfoAsync(_updateInfoInput); | ||||
|         await _serviceScope.ServiceProvider.GetService<UserCenterService>().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<IVisitLogService>().DeleteAsync(_categoryFilters.Select(it => it.Value).ToArray()); | ||||
|             await _serviceScope.ServiceProvider.GetService<VisitLogService>().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<IVisitLogService>().PageAsync(input); | ||||
|         var data = await _serviceScope.ServiceProvider.GetService<VisitLogService>().PageAsync(input); | ||||
|         return data; | ||||
|     } | ||||
| } | ||||
| @@ -1,12 +1,12 @@ | ||||
| #region copyright | ||||
| #region copyright | ||||
| //------------------------------------------------------------------------------ | ||||
| //  此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充 | ||||
| //  此代码版权(除特别声明外的代码)归作者本人Diego所有 | ||||
| //  源代码使用协议遵循本仓库的开源协议及附加协议 | ||||
| //  Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway | ||||
| //  Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway | ||||
| //  使用文档:https://diego2098.gitee.io/thingsgateway-docs/ | ||||
| //  QQ群:605534569 | ||||
| //  <EFBFBD>˴<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊȫ<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD>ֶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ||||
| //  <EFBFBD>˴<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD>룩<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߱<EFBFBD><EFBFBD><EFBFBD>Diego<EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ||||
| //  Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD><EFBFBD>ֿ<EFBFBD><EFBFBD>Ŀ<EFBFBD>ԴЭ<EFBFBD>鼰<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD> | ||||
| //  GiteeԴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֿ⣺https://gitee.com/diego2098/ThingsGateway | ||||
| //  GithubԴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֿ⣺https://github.com/kimdiego2098/ThingsGateway | ||||
| //  ʹ<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD>https://diego2098.gitee.io/thingsgateway-docs/ | ||||
| //  QQȺ<EFBFBD><EFBFBD>605534569 | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| @@ -16,7 +16,8 @@ using Masa.Blazor.Presets; | ||||
|  | ||||
| using Microsoft.AspNetCore.Components.Web; | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using Microsoft.Extensions.Hosting; | ||||
|  | ||||
| using System.Diagnostics; | ||||
|  | ||||
| using ThingsGateway.Foundation.Extension.String; | ||||
|  | ||||
| @@ -43,7 +44,7 @@ public partial class Login | ||||
|     /// <inheritdoc/> | ||||
|     protected override async Task OnParametersSetAsync() | ||||
|     { | ||||
|         if (App.WebHostEnvironment.IsDevelopment()) | ||||
|         if (Debugger.IsAttached) | ||||
|         { | ||||
|             _loginModel.Account = "superAdmin"; | ||||
|             _password = "111111"; | ||||
| @@ -53,7 +54,7 @@ public partial class Login | ||||
|         _configTitle = (await _serviceScope.ServiceProvider.GetService<IConfigService>().GetByConfigKeyAsync(ConfigConst.SYS_CONFIGBASEDEFAULT, ConfigConst.CONFIG_TITLE))?.ConfigValue; | ||||
|         _configRemark = (await _serviceScope.ServiceProvider.GetService<IConfigService>().GetByConfigKeyAsync(ConfigConst.SYS_CONFIGBASEDEFAULT, ConfigConst.CONFIG_REMARK))?.ConfigValue; | ||||
|         _showCaptcha = (await _serviceScope.ServiceProvider.GetService<IConfigService>().GetByConfigKeyAsync(ConfigConst.SYS_CONFIGBASEDEFAULT, ConfigConst.CONFIG_CAPTCHA_OPEN))?.ConfigValue?.ToBool(false) == true; | ||||
|         _welcome = "欢迎使用" + _configTitle + "!"; | ||||
|         _welcome = "<EFBFBD><EFBFBD>ӭʹ<EFBFBD><EFBFBD>" + _configTitle + "!"; | ||||
|         await base.OnParametersSetAsync(); | ||||
|     } | ||||
|  | ||||
| @@ -101,14 +102,14 @@ public partial class Login | ||||
|                     await _captcha.RefreshCode(); | ||||
|                 } | ||||
|  | ||||
|                 await PopupService.EnqueueSnackbarAsync(new("登录错误" + ": " + ret.Msg.ToString(), AlertTypes.Error)); | ||||
|                 await PopupService.EnqueueSnackbarAsync(new("<EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" + ": " + ret.Msg.ToString(), AlertTypes.Error)); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 await PopupService.EnqueueSnackbarAsync(new("登录成功", AlertTypes.Success)); | ||||
|                 await PopupService.EnqueueSnackbarAsync(new("<EFBFBD><EFBFBD>¼<EFBFBD>ɹ<EFBFBD>", AlertTypes.Success)); | ||||
|                 await Task.Delay(500); | ||||
|                 var userId = await _serviceScope.ServiceProvider.GetService<ISysUserService>().GetIdByAccountAsync(_loginModel.Account); | ||||
|                 var data = await _serviceScope.ServiceProvider.GetService<IUserCenterService>().GetLoginDefaultRazorAsync(userId); | ||||
|                 var userId = await _serviceScope.ServiceProvider.GetService<SysUserService>().GetIdByAccountAsync(_loginModel.Account); | ||||
|                 var data = await _serviceScope.ServiceProvider.GetService<UserCenterService>().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"); | ||||
| @@ -123,7 +124,7 @@ public partial class Login | ||||
|                 await _captcha.RefreshCode(); | ||||
|             } | ||||
|  | ||||
|             await PopupService.EnqueueSnackbarAsync(new("登录错误", AlertTypes.Error)); | ||||
|             await PopupService.EnqueueSnackbarAsync(new("<EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", AlertTypes.Error)); | ||||
|         } | ||||
|     } | ||||
|     private async Task<string> RefreshCode() | ||||
|   | ||||
| @@ -1,12 +1,12 @@ | ||||
| #region copyright | ||||
| #region copyright | ||||
| //------------------------------------------------------------------------------ | ||||
| //  此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充 | ||||
| //  此代码版权(除特别声明外的代码)归作者本人Diego所有 | ||||
| //  源代码使用协议遵循本仓库的开源协议及附加协议 | ||||
| //  Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway | ||||
| //  Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway | ||||
| //  使用文档:https://diego2098.gitee.io/thingsgateway-docs/ | ||||
| //  QQ群:605534569 | ||||
| //  <EFBFBD>˴<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊȫ<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD>ֶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ||||
| //  <EFBFBD>˴<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD>룩<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߱<EFBFBD><EFBFBD><EFBFBD>Diego<EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ||||
| //  Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD><EFBFBD>ֿ<EFBFBD><EFBFBD>Ŀ<EFBFBD>ԴЭ<EFBFBD>鼰<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD> | ||||
| //  GiteeԴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֿ⣺https://gitee.com/diego2098/ThingsGateway | ||||
| //  GithubԴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֿ⣺https://github.com/kimdiego2098/ThingsGateway | ||||
| //  ʹ<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD>https://diego2098.gitee.io/thingsgateway-docs/ | ||||
| //  QQȺ<EFBFBD><EFBFBD>605534569 | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| @@ -16,7 +16,7 @@ using ThingsGateway.Foundation.Extension.String; | ||||
|  | ||||
| namespace ThingsGateway.Admin.Blazor; | ||||
|  | ||||
| public partial class MainLayout : IDisposable | ||||
| public partial class MainLayout | ||||
| { | ||||
|     private List<SysResource> _breadcrumbSysResources = new(); | ||||
|     private string _configCopyRight = ""; | ||||
| @@ -43,23 +43,16 @@ public partial class MainLayout : IDisposable | ||||
|     private IServiceScopeFactory _serviceScopeFactory { get; set; } | ||||
|     [Inject] | ||||
|     private UserResoures _userResoures { get; set; } | ||||
|  | ||||
|     public void Dispose() | ||||
|     { | ||||
|         _serviceScope.Dispose(); | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 页面刷新 | ||||
|     /// ҳ<EFBFBD><EFBFBD>ˢ<EFBFBD><EFBFBD> | ||||
|     /// </summary> | ||||
|     /// <returns></returns> | ||||
|     public async Task StateHasChangedAsync() | ||||
|     { | ||||
|         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); | ||||
|         _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); | ||||
|  | ||||
|         await _userResoures.InitUserAsync(); | ||||
|         await _userResoures.InitMenuAsync(); | ||||
|   | ||||
| @@ -5,8 +5,8 @@ | ||||
| 	</PropertyGroup> | ||||
|  | ||||
| 	<ItemGroup> | ||||
| 		<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.1.7" /> | ||||
| 		<PackageReference Include="SqlSugarCore" Version="5.1.4.124" /> | ||||
| 		<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.1.4" /> | ||||
| 		<PackageReference Include="SqlSugarCore" Version="5.1.4.117" /> | ||||
| 		<PackageReference Include="UAParser" Version="3.1.47" /> | ||||
| 		<PackageReference Include="Yitter.IdGenerator" Version="1.0.14" /> | ||||
| 	</ItemGroup> | ||||
|   | ||||
| @@ -56,7 +56,6 @@ 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.7" /> | ||||
| 		<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.1.7" /> | ||||
| 		<PackageReference Include="Furion.Pure" Version="4.9.1.4" /> | ||||
| 		<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.1.4" /> | ||||
| 		<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> | ||||
| 	</ItemGroup> | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,14 @@ | ||||
| <Project> | ||||
| 	<Import Project="$(SolutionDir)\Directory.Build.props" /> | ||||
| 	<PropertyGroup> | ||||
|  | ||||
| 		<TargetFrameworks>net6.0;net8.0;</TargetFrameworks> | ||||
| 		<Version>4.0.0.1</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,9 +12,6 @@ | ||||
|  | ||||
| using Microsoft.AspNetCore.Components; | ||||
|  | ||||
| using ThingsGateway.Components; | ||||
|  | ||||
|  | ||||
| namespace ThingsGateway.Foundation.Demo; | ||||
| using LogLevel = Microsoft.Extensions.Logging.LogLevel; | ||||
| /// <summary> | ||||
|   | ||||
| @@ -20,6 +20,8 @@ using Microsoft.JSInterop; | ||||
|  | ||||
| using Newtonsoft.Json.Linq; | ||||
|  | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| using ThingsGateway.Foundation.Adapter.OPCDA; | ||||
| using ThingsGateway.Foundation.Adapter.OPCDA.Da; | ||||
|  | ||||
| @@ -43,7 +45,6 @@ public partial class OPCDAClientDebugPage : IDisposable | ||||
|     { | ||||
|         _plc.SafeDispose(); | ||||
|         opcDAClientPage.SafeDispose(); | ||||
|         base.Dispose(); | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
| @@ -104,7 +105,7 @@ public partial class OPCDAClientDebugPage : IDisposable | ||||
|                     await PopupService.EnqueueSnackbarAsync("无可用变量", AlertTypes.Warning); | ||||
|                     return; | ||||
|                 } | ||||
|                 await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().AddAsync(data?.Item1); | ||||
|                 await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().AddAsync(data?.Item1); | ||||
|                 await _serviceScope.ServiceProvider.GetService<VariableService>().AddBatchAsync(data?.Item2); | ||||
|                 await PopupService.EnqueueSnackbarAsync("成功", AlertTypes.Success); | ||||
|             } | ||||
| @@ -150,7 +151,7 @@ public partial class OPCDAClientDebugPage : IDisposable | ||||
|     /// <returns></returns> | ||||
|     public async Task DownDeviceExportAsync(CollectDevice data) | ||||
|     { | ||||
|         using var memoryStream = await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().ExportFileAsync(new List<CollectDevice>() { data }); | ||||
|         using var memoryStream = await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().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<ICollectDeviceService>().AddAsync(data.Item1); | ||||
|             await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().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<ICollectDeviceService>().ExportFileAsync(new List<CollectDevice>() { data }); | ||||
|         using var memoryStream = await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().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,14 +1,16 @@ | ||||
| <Project> | ||||
| 	<Import Project="$(SolutionDir)\Directory.Build.props" /> | ||||
| 	<!--如果编译net45报错无支持,用一下方法添加net45包--> | ||||
| 	<!--VS顶部菜单栏 -> 视图 -> 其他 -> 程序包控制台 | ||||
| 	Install-Package Microsoft.NETFramework.ReferenceAssemblies.net45 | ||||
| 	--> | ||||
| 	<PropertyGroup> | ||||
| 		<Version>4.0.0.1</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> | ||||
| @@ -20,11 +22,17 @@ | ||||
| 		<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) => Task.FromResult(new OperResult()); | ||||
|     public override Task<OperResult> WriteAsync(string address, byte[] value, CancellationToken cancellationToken = default) => throw new NotImplementedException(); | ||||
|     /// <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) => Task.FromResult(new OperResult()); | ||||
|     public override Task<OperResult> WriteAsync(string address, bool[] value, CancellationToken cancellationToken = default) => throw new NotImplementedException(); | ||||
|  | ||||
|  | ||||
|     #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) => Task.FromResult(new OperResult()); | ||||
|     public override Task<OperResult> WriteAsync(string address, byte[] value, CancellationToken cancellationToken = default) => throw new NotImplementedException(); | ||||
|     /// <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) => Task.FromResult(new OperResult()); | ||||
|     public override Task<OperResult> WriteAsync(string address, bool[] value, CancellationToken cancellationToken = default) => throw new NotImplementedException(); | ||||
|  | ||||
|  | ||||
|     #region 其他方法 | ||||
|   | ||||
| @@ -134,19 +134,21 @@ internal class ModbusHelper | ||||
|  | ||||
|         if (response[1] >= 0x80)//错误码 | ||||
|             return new OperResult<byte[], FilterResult>(GetDescriptionByErrorCode(response[2])) { Content2 = FilterResult.Success }; | ||||
|         if (response[1] <= 0x04) | ||||
|         if (response[1] <= 0x05) | ||||
|         { | ||||
|             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[1] <= 0x04 ? response[2] != 0 ? response[2] + 5 : 8 : 8); | ||||
|         var data = response.SelectMiddle(0, response[2] != 0 ? response[2] + 5 : 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 _incrementCount = new(ushort.MaxValue); | ||||
|     private readonly IncrementCount easyIncrementCount = new(ushort.MaxValue); | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 检测事务标识符 | ||||
| @@ -39,7 +39,7 @@ internal class ModbusTcpDataHandleAdapter : ReadWriteDevicesSingleStreamDataHand | ||||
|     /// <inheritdoc/> | ||||
|     public override byte[] PackCommand(byte[] command) | ||||
|     { | ||||
|         return ModbusHelper.AddModbusTcpHead(command, (ushort)_incrementCount.GetCurrentValue()); | ||||
|         return ModbusHelper.AddModbusTcpHead(command, (ushort)easyIncrementCount.GetCurrentValue()); | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|   | ||||
| @@ -18,7 +18,7 @@ namespace ThingsGateway.Foundation.Adapter.Modbus; | ||||
| /// </summary> | ||||
| internal class ModbusUdpDataHandleAdapter : ReadWriteDevicesUdpDataHandleAdapter<ModbusTcpMessage> | ||||
| { | ||||
|     private readonly IncrementCount _incrementCount = new(ushort.MaxValue); | ||||
|     private readonly IncrementCount easyIncrementCount = new(ushort.MaxValue); | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 检测事务标识符 | ||||
| @@ -38,7 +38,7 @@ internal class ModbusUdpDataHandleAdapter : ReadWriteDevicesUdpDataHandleAdapter | ||||
|     /// <inheritdoc/> | ||||
|     public override byte[] PackCommand(byte[] command) | ||||
|     { | ||||
|         return ModbusHelper.AddModbusTcpHead(command, (ushort)_incrementCount.GetCurrentValue()); | ||||
|         return ModbusHelper.AddModbusTcpHead(command, (ushort)easyIncrementCount.GetCurrentValue()); | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|   | ||||
| @@ -69,7 +69,7 @@ public abstract class ReadWriteDevicesUdpSessionBase : ReadWriteDevicesBase | ||||
|     /// <inheritdoc/> | ||||
|     public override string ToString() | ||||
|     { | ||||
|         return UdpSession.RemoteIPHost?.ToString(); | ||||
|         return UdpSession.RemoteIPHost.ToString(); | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|   | ||||
| @@ -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,74 +421,6 @@ 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> | ||||
|     /// 用 正则表达式 判断字符是不是汉字 | ||||
|   | ||||
| @@ -1,7 +1,10 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
|  | ||||
| 	<PropertyGroup> | ||||
| 		<TargetFrameworks>net45;netstandard2.0;net6.0;net8.0;</TargetFrameworks> | ||||
| 	</PropertyGroup> | ||||
| 	<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 Http.HttpClient BuildWithHttpClient(this TouchSocketConfig config) | ||||
|         public static HttpClient BuildWithHttpClient(this TouchSocketConfig config) | ||||
|         { | ||||
|             return BuildWithHttpClient<Http.HttpClient>(config); | ||||
|             return BuildWithHttpClient<HttpClient>(config); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|   | ||||
| @@ -40,14 +40,6 @@ namespace ThingsGateway.Foundation.Sockets | ||||
|         { | ||||
|             this.Protocol = Protocol.Tcp; | ||||
|         } | ||||
|         /// <summary> | ||||
|         /// <inheritdoc/> | ||||
|         /// </summary> | ||||
|         /// <returns></returns> | ||||
|         public override string ToString() | ||||
|         { | ||||
|             return $"{nameof(SocketClient)}:{IP}:{Port}"; | ||||
|         } | ||||
|  | ||||
|         #region 变量 | ||||
|  | ||||
|   | ||||
| @@ -608,7 +608,6 @@ namespace ThingsGateway.Foundation.Sockets | ||||
|                         this.OnAccepted(e); | ||||
|                     } | ||||
|                 } | ||||
|                 catch (ObjectDisposedException) { } | ||||
|                 catch (Exception ex) | ||||
|                 { | ||||
|                     this.Logger.Exception(ex); | ||||
|   | ||||
| @@ -186,6 +186,10 @@ namespace ThingsGateway.Foundation.Sockets | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
|                 return new(); | ||||
|             } | ||||
|             finally | ||||
|             { | ||||
|                 this.m_cancellationTokenSource = null; | ||||
|   | ||||
| @@ -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.TouchSocket.WebApi.Swagger.api.", string.Empty); | ||||
|                     var name = item.Replace("ThingsGateway.Foundation.ThingsGateway.Foundation.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 == Http.HttpMethod.Get) | ||||
|             if (e.Context.Request.Method == HttpMethod.Get) | ||||
|             { | ||||
|                 return this.OnHttpGet(client, e); | ||||
|             } | ||||
|             else if (e.Context.Request.Method == Http.HttpMethod.Post) | ||||
|             else if (e.Context.Request.Method == HttpMethod.Post) | ||||
|             { | ||||
|                 return this.OnHttpPost(client, e); | ||||
|             } | ||||
|   | ||||
| @@ -1,7 +1,16 @@ | ||||
| <Project> | ||||
| 	<Import Project="$(SolutionDir)\Directory.Build.props" /> | ||||
| 	<PropertyGroup> | ||||
|  | ||||
| 		<Version>4.0.0.1</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, ICollectDeviceService collectDeviceService) | ||||
|     public CollectDbInfoControler(IServiceScopeFactory scopeFactory, VariableService variableService, CollectDeviceService collectDeviceService) | ||||
|     { | ||||
|         _serviceScope = scopeFactory.CreateScope(); | ||||
|         _variableService = variableService; | ||||
|         _collectDeviceService = collectDeviceService; | ||||
|     } | ||||
|  | ||||
|     ICollectDeviceService _collectDeviceService { get; set; } | ||||
|     CollectDeviceService _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 ICollectDeviceService _collectDeviceService; | ||||
|     private readonly CollectDeviceService _collectDeviceService; | ||||
|     private readonly IRpcLogService _rpcLogService; | ||||
|     private readonly IUploadDeviceService _uploadDeviceService; | ||||
|     private readonly UploadDeviceService _uploadDeviceService; | ||||
|     private readonly VariableService _variableService; | ||||
|     /// <summary> | ||||
|     /// <inheritdoc cref="FileController"/> | ||||
| @@ -33,8 +33,8 @@ public class FileController : IDynamicApiController | ||||
|     public FileController( | ||||
|         IRpcLogService rpcLogService, | ||||
|         IBackendLogService backendLogService, | ||||
|         ICollectDeviceService collectDeviceService, | ||||
|         IUploadDeviceService uploadDeviceService, | ||||
|         CollectDeviceService collectDeviceService, | ||||
|         UploadDeviceService 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.ICollectDeviceService)"> | ||||
|         <member name="M:ThingsGateway.Gateway.ApiController.CollectDbInfoControler.#ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory,ThingsGateway.Gateway.Application.VariableService,ThingsGateway.Gateway.Application.CollectDeviceService)"> | ||||
|             <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.ICollectDeviceService,ThingsGateway.Gateway.Application.IUploadDeviceService,ThingsGateway.Gateway.Application.VariableService)"> | ||||
|         <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)"> | ||||
|             <summary> | ||||
|             <inheritdoc cref="T:ThingsGateway.Gateway.ApiController.FileController"/> | ||||
|             </summary> | ||||
|   | ||||
| @@ -43,16 +43,14 @@ 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); | ||||
| @@ -85,7 +83,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($"无法写入数据,{nameof(_readWrite)}为null"); | ||||
|             throw new("未初始化成功"); | ||||
|         Dictionary<string, OperResult> operResults = new(); | ||||
|         foreach (var writeInfo in writeInfoLists) | ||||
|         { | ||||
|   | ||||
| @@ -173,7 +173,7 @@ public class DriverPluginService : ISingleton | ||||
| 
 | ||||
|                 } | ||||
|                 return plugins; | ||||
|             }, true); | ||||
|             }, false); | ||||
|             return data; | ||||
|         } | ||||
|     } | ||||
| @@ -317,7 +317,7 @@ public class DriverPluginService : ISingleton | ||||
|         var data = _serviceScope.ServiceProvider.GetService<MemoryCache>().GetOrCreate($"{nameof(GetDriverVariableProperties)}", cacheKey, c => | ||||
|         { | ||||
|             var data = driver.VariablePropertys?.GetType().GetProperties()?.SelectMany(it => | ||||
|     new[] { new { memberInfo = it, attribute = GetCustomAttributeRecursive<VariablePropertyAttribute>(it) } }) | ||||
|     new[] { new { memberInfo = it, attribute = GetCustomAttributeRecursive<DevicePropertyAttribute>(it) } }) | ||||
|     ?.Where(x => x.attribute != null).ToList() | ||||
|       ?.SelectMany(it => new[] | ||||
|       { | ||||
| @@ -109,8 +109,8 @@ public abstract class UpLoadBaseWithCacheT<DeviceT, VariableT> : UpLoadBase | ||||
|                 CurrentDevice.DeviceVariableRunTimes.ForEach(a => { a.VariableValueChange += VariableValueChange; }); | ||||
|         } | ||||
|  | ||||
|         if (_uploadPropertyWithCache.CycleInterval <= 50) _uploadPropertyWithCache.CycleInterval = 50; | ||||
|         if (_uploadPropertyWithCache.UploadInterval <= 100) _uploadPropertyWithCache.UploadInterval = 100; | ||||
|         if (_uploadPropertyWithCache.CycleInterval <= 100) _uploadPropertyWithCache.CycleInterval = 100; | ||||
|         if (_uploadPropertyWithCache.UploadInterval <= 1000) _uploadPropertyWithCache.UploadInterval = 1000; | ||||
|         _exVariableTimerTick = new(_uploadPropertyWithCache.UploadInterval); | ||||
|         _exDeviceTimerTick = new(_uploadPropertyWithCache.UploadInterval); | ||||
|     } | ||||
|   | ||||
| @@ -20,7 +20,7 @@ public class UploadPropertyWithCacheT : DriverPropertyBase | ||||
|     /// <summary> | ||||
|     /// 线程循环间隔 | ||||
|     /// </summary> | ||||
|     [DeviceProperty("线程循环间隔", "最小50ms")] | ||||
|     [DeviceProperty("线程循环间隔", "最小10ms")] | ||||
|     public virtual int CycleInterval { get; set; } = 1000; | ||||
|     /// <summary> | ||||
|     /// 内存队列最大条数 | ||||
| @@ -47,7 +47,7 @@ public class UploadPropertyWithCacheT : DriverPropertyBase | ||||
|     /// <summary> | ||||
|     /// 上传间隔时间 | ||||
|     /// </summary> | ||||
|     [DeviceProperty("上传间隔时间", "最小100ms")] | ||||
|     [DeviceProperty("上传间隔时间", "最小1000ms")] | ||||
|     public virtual int UploadInterval { get; set; } = 1000; | ||||
|  | ||||
|     [DeviceProperty("是否选择全部变量", "")] public bool IsAllVariable { get; set; } = false; | ||||
|   | ||||
| @@ -24,10 +24,8 @@ using Yitter.IdGenerator; | ||||
| namespace ThingsGateway.Gateway.Application; | ||||
|  | ||||
| [Injection(Proxy = typeof(OperDispatchProxy))] | ||||
| public class CollectDeviceService : DeviceService<CollectDevice>, ITransient, ICollectDeviceService | ||||
| public class CollectDeviceService : DeviceService<CollectDevice>, ITransient | ||||
| { | ||||
|     protected override string DeviceSheetName => ExportHelpers.CollectDeviceSheetName; | ||||
|  | ||||
|     public CollectDeviceService(IServiceScopeFactory serviceScopeFactory, IFileService fileService) : base(serviceScopeFactory, fileService) | ||||
|     { | ||||
|     } | ||||
| @@ -46,7 +44,7 @@ public class CollectDeviceService : DeviceService<CollectDevice>, ITransient, IC | ||||
|  | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|     [OperDesc("复制设备与变量", IsRecordPar = false)] | ||||
|     [OperDesc("复制设备与变量")] | ||||
|     public virtual async Task CopyDevAndVarAsync(IEnumerable<CollectDevice> input) | ||||
|     { | ||||
|         var variableService = _serviceScope.ServiceProvider.GetService<VariableService>(); | ||||
|   | ||||
| @@ -30,11 +30,11 @@ using Yitter.IdGenerator; | ||||
|  | ||||
| namespace ThingsGateway.Gateway.Application; | ||||
|  | ||||
| public abstract class DeviceService<T> : DbRepository<T>, IDeviceService<T> where T : Device, new() | ||||
| public abstract class DeviceService<T> : DbRepository<T> where T : Device, new() | ||||
| { | ||||
|     protected readonly IFileService _fileService; | ||||
|     protected readonly IServiceScope _serviceScope; | ||||
|     /// <inheritdoc cref="ICollectDeviceService"/> | ||||
|     /// <inheritdoc cref="CollectDeviceService"/> | ||||
|     public DeviceService( | ||||
|     IServiceScopeFactory serviceScopeFactory, | ||||
|     IFileService fileService | ||||
| @@ -204,7 +204,7 @@ public abstract class DeviceService<T> : DbRepository<T>, IDeviceService<T> wher | ||||
|         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) | ||||
| @@ -233,8 +233,8 @@ public abstract class DeviceService<T> : DbRepository<T>, IDeviceService<T> wher | ||||
|             } | ||||
|             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); | ||||
|  | ||||
| @@ -275,7 +275,7 @@ public abstract class DeviceService<T> : DbRepository<T>, IDeviceService<T> wher | ||||
|         } | ||||
|  | ||||
|         //添加设备页 | ||||
|         sheets.Add(DeviceSheetName, devExports); | ||||
|         sheets.Add(ExportHelpers.CollectDeviceSheetName, devExports); | ||||
|  | ||||
|  | ||||
|         //添加插件属性页 | ||||
| @@ -319,7 +319,7 @@ public abstract class DeviceService<T> : DbRepository<T>, IDeviceService<T> wher | ||||
|         var collectDevices = new List<T>(); | ||||
|         foreach (var item in input) | ||||
|         { | ||||
|             if (item.Key == DeviceSheetName) | ||||
|             if (item.Key == ExportHelpers.CollectDeviceSheetName) | ||||
|             { | ||||
|                 var collectDeviceImports = ((ImportPreviewOutput<T>)item.Value).Data; | ||||
|                 collectDevices = collectDeviceImports.Values.Adapt<List<T>>(); | ||||
| @@ -360,7 +360,7 @@ public abstract class DeviceService<T> : DbRepository<T>, IDeviceService<T> wher | ||||
|             //单页数据 | ||||
|             var rows = stream.Query(useHeaderRow: true, sheetName: sheetName).Cast<IDictionary<string, object>>(); | ||||
|             #region 采集设备sheet | ||||
|             if (sheetName == DeviceSheetName) | ||||
|             if (sheetName == ExportHelpers.CollectDeviceSheetName) | ||||
|             { | ||||
|                 int row = 1; | ||||
|                 ImportPreviewOutput<T> importPreviewOutput = new(); | ||||
| @@ -374,22 +374,22 @@ public abstract class DeviceService<T> : DbRepository<T>, IDeviceService<T> wher | ||||
|                     { | ||||
|                         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.RedundantDeviceName, out var redundantObj); | ||||
|                         var hasRedundant = item.TryGetValue(ExportHelpers.PluginName, out var redundantObj); | ||||
|  | ||||
|                         #endregion | ||||
|                         //设备ID、冗余设备ID都需要手动补录 | ||||
|                         if (hasRedundant && redundantObj != null && deviceDicts.TryGetValue(redundantObj.ToString(), out var rendundantDevice)) | ||||
|                         if (hasRedundant && deviceDicts.TryGetValue(redundantObj.ToString(), out var rendundantDevice)) | ||||
|                         { | ||||
|                             device.RedundantDeviceId = rendundantDevice.Id; | ||||
|                         } | ||||
|   | ||||
| @@ -1,10 +0,0 @@ | ||||
|  | ||||
| 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); | ||||
|     } | ||||
| } | ||||
| @@ -1,24 +0,0 @@ | ||||
| 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(); | ||||
|     } | ||||
| } | ||||
| @@ -1,9 +0,0 @@ | ||||
|  | ||||
| namespace ThingsGateway.Gateway.Application | ||||
| { | ||||
|     public interface IUploadDeviceService : IDeviceService<Device> | ||||
|     { | ||||
|         Task EditsAsync(List<Device> input); | ||||
|         IEnumerable<DeviceRunTime> GetDeviceRuntime(long devId = 0); | ||||
|     } | ||||
| } | ||||
| @@ -19,9 +19,8 @@ using Microsoft.Extensions.DependencyInjection; | ||||
| namespace ThingsGateway.Gateway.Application; | ||||
|  | ||||
| [Injection(Proxy = typeof(OperDispatchProxy))] | ||||
| public class UploadDeviceService : DeviceService<Device>, ITransient, IUploadDeviceService | ||||
| public class UploadDeviceService : DeviceService<Device>, ITransient | ||||
| { | ||||
|     protected override string DeviceSheetName => ExportHelpers.UploadDeviceSheetName; | ||||
|     public UploadDeviceService(IServiceScopeFactory serviceScopeFactory, IFileService fileService) : base(serviceScopeFactory, fileService) | ||||
|     { | ||||
|     } | ||||
|   | ||||
| @@ -1,23 +0,0 @@ | ||||
| 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>, IVariableService | ||||
| public class VariableService : DbRepository<DeviceVariable>, ITransient | ||||
| { | ||||
|     private readonly ICollectDeviceService _collectDeviceService; | ||||
|     private readonly IUploadDeviceService _uploadDeviceService; | ||||
|     private readonly CollectDeviceService _collectDeviceService; | ||||
|     private readonly UploadDeviceService _uploadDeviceService; | ||||
|     private readonly FileService _fileService; | ||||
|     private readonly IServiceScope _serviceScope; | ||||
|  | ||||
|     /// <inheritdoc cref="VariableService"/> | ||||
|     public VariableService( | ||||
|         ICollectDeviceService collectDeviceService, | ||||
|         CollectDeviceService collectDeviceService, | ||||
|         FileService fileService, | ||||
|         IUploadDeviceService uploadDeviceService, | ||||
|         UploadDeviceService uploadDeviceService, | ||||
|     IServiceScopeFactory scopeFactory) | ||||
|     { | ||||
|         _serviceScope = scopeFactory.CreateScope(); | ||||
|   | ||||
| @@ -12,8 +12,6 @@ | ||||
|  | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
|  | ||||
| using System.Reflection; | ||||
|  | ||||
| namespace ThingsGateway.Gateway.Application; | ||||
|  | ||||
| /// <summary> | ||||
| @@ -44,9 +42,6 @@ public class Startup : AppStartup | ||||
|         services.AddHostedService<CollectDeviceWorker>(); | ||||
|         services.AddHostedService<AlarmWorker>(); | ||||
|         services.AddHostedService<UploadDeviceWorker>(); | ||||
|  | ||||
|         ThingsGateway.Core.TypeExtensions.DefaultFuncs.Add(a => a.GetCustomAttribute<VariablePropertyAttribute>()?.Description); | ||||
|  | ||||
|     } | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -12,10 +12,11 @@ | ||||
| 	<ItemGroup> | ||||
| 		<PackageReference Include="LiteDB" Version="5.0.17" /> | ||||
| 		<PackageReference Include="Hardware.Info" Version="100.0.0" /> | ||||
| 		<PackageReference Include="CS-Script" Version="4.8.10" /> | ||||
| 		<PackageReference Include="CS-Script" Version="4.8.8" /> | ||||
| 		<!--CS-Script与Furion冲突,直接安装覆盖版本--> | ||||
| 		<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.8.0" /> | ||||
| 		<PackageReference Include="SqlSugar.TDengineCore" Version="3.4.0" /> | ||||
| 		<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.7.0" /> | ||||
| 		<PackageReference Include="MQTTnet" Version="4.3.1.873" /> | ||||
| 		<PackageReference Include="SqlSugar.TDengineCore" Version="3.2.0" /> | ||||
| 	</ItemGroup> | ||||
|  | ||||
| 	<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,10 +49,6 @@ public class CollectDeviceWorker : DeviceWorker | ||||
|             await StopOtherHostService(); | ||||
|             //停止全部采集线程 | ||||
|             await RemoveAllDeviceThreadAsync(); | ||||
|  | ||||
|             //清空内存列表 | ||||
|             _globalDeviceData.CollectDevices.Clear(); | ||||
|  | ||||
|             //创建全部采集线程 | ||||
|             await CreatAllDeviceThreadsAsync(); | ||||
|             //开始其他后台服务 | ||||
| @@ -105,7 +101,7 @@ public class CollectDeviceWorker : DeviceWorker | ||||
|         if (!_stoppingToken.IsCancellationRequested) | ||||
|         { | ||||
|             _logger.LogInformation("正在获取南向设备组态信息"); | ||||
|             var collectDeviceRunTimes = (await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetDeviceRuntimeAsync()); | ||||
|             var collectDeviceRunTimes = (await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetDeviceRuntimeAsync()); | ||||
|             _logger.LogInformation("获取南向设备组态信息完成"); | ||||
|             foreach (var collectDeviceRunTime in collectDeviceRunTimes.Where(a => !collectDeviceRunTimes.Any(b => a.Id == b.RedundantDeviceId && b.IsRedundant))) | ||||
|             { | ||||
| @@ -129,7 +125,7 @@ public class CollectDeviceWorker : DeviceWorker | ||||
|  | ||||
|     protected override async Task<IEnumerable<DeviceRunTime>> GetDeviceRunTimeAsync(long devId) | ||||
|     { | ||||
|         return await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetDeviceRuntimeAsync(devId); | ||||
|         return await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetDeviceRuntimeAsync(devId); | ||||
|     } | ||||
|  | ||||
|     #endregion | ||||
| @@ -143,7 +139,7 @@ public class CollectDeviceWorker : DeviceWorker | ||||
|     /// <returns></returns> | ||||
|     public List<string> GetDeviceMethods(long devId) | ||||
|     { | ||||
|         var pluginName = _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetDeviceById(devId).PluginName; | ||||
|         var pluginName = _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetDeviceById(devId).PluginName; | ||||
|         var driverBase = _driverPluginService.GetDriver(pluginName); | ||||
|         var Propertys = _driverPluginService.GetDriverMethodInfo(driverBase); | ||||
|         driverBase?.SafeDispose(); | ||||
| @@ -162,7 +158,7 @@ public class CollectDeviceWorker : DeviceWorker | ||||
|         var Propertys = _driverPluginService.GetDriverProperties(driverBase); | ||||
|         if (devId != 0) | ||||
|         { | ||||
|             var collectDevice = _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetDeviceById(devId); | ||||
|             var collectDevice = _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetDeviceById(devId); | ||||
|             collectDevice?.DevicePropertys?.ForEach(it => | ||||
|             { | ||||
|                 var dependencyProperty = Propertys.FirstOrDefault(a => a.PropertyName == it.PropertyName); | ||||
| @@ -201,7 +197,6 @@ public class CollectDeviceWorker : DeviceWorker | ||||
|     { | ||||
|         await _easyLock?.WaitAsync(); | ||||
|         _driverPluginService = _serviceScope.ServiceProvider.GetService<DriverPluginService>(); | ||||
|         _globalDeviceData = _serviceScope.ServiceProvider.GetService<GlobalDeviceData>(); | ||||
|         //重启采集线程,会启动其他后台服务 | ||||
|         await RestartDeviceThreadAsync(); | ||||
|         await WhileExecuteAsync(stoppingToken); | ||||
| @@ -229,7 +224,7 @@ public class CollectDeviceWorker : DeviceWorker | ||||
|  | ||||
|                             if (driverBase.CurrentDevice.DeviceStatus == DeviceStatusEnum.OffLine) | ||||
|                             { | ||||
|                                 if (driverBase.CurrentDevice.IsRedundant && _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetCacheList(false).Any(a => a.Id == driverBase.CurrentDevice.RedundantDeviceId)) | ||||
|                                 if (driverBase.CurrentDevice.IsRedundant && _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetCacheList(false).Any(a => a.Id == driverBase.CurrentDevice.RedundantDeviceId)) | ||||
|                                 { | ||||
|                                     await DeviceRedundantThreadAsync(driverBase.CurrentDevice.Id); | ||||
|                                 } | ||||
|   | ||||
| @@ -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).OrderByDescending(a => a.CurrentDevice.DeviceStatus).ToList(); | ||||
|         .SelectMany(a => a.DriverBases).ToList(); | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 设备子线程列表 | ||||
|   | ||||
| @@ -99,9 +99,9 @@ public class UploadDeviceWorker : DeviceWorker | ||||
|     { | ||||
|         if (!_stoppingToken.IsCancellationRequested) | ||||
|         { | ||||
|             _logger.LogInformation("正在获取北向设备组态信息"); | ||||
|             var deviceRunTimes = (_serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetDeviceRuntime()); | ||||
|             _logger.LogInformation("获取北向设备组态信息完成"); | ||||
|             _logger.LogInformation("正在获取北向组态信息"); | ||||
|             var deviceRunTimes = (_serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetDeviceRuntime()); | ||||
|             _logger.LogInformation("获取北向组态信息完成"); | ||||
|             foreach (var uploadDeviceRunTime in deviceRunTimes.Where(a => !deviceRunTimes.Any(b => a.Id == b.RedundantDeviceId && b.IsRedundant))) | ||||
|             { | ||||
|                 if (!_stoppingToken.IsCancellationRequested) | ||||
| @@ -135,7 +135,7 @@ public class UploadDeviceWorker : DeviceWorker | ||||
|     /// <returns></returns> | ||||
|     public List<string> GetDeviceMethods(long devId) | ||||
|     { | ||||
|         var pluginName = _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetDeviceById(devId).PluginName; | ||||
|         var pluginName = _serviceScope.ServiceProvider.GetService<UploadDeviceService>().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<IUploadDeviceService>().GetDeviceById(devId); | ||||
|             var uploadDevice = _serviceScope.ServiceProvider.GetService<UploadDeviceService>().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<IUploadDeviceService>().GetCacheList(false).Any(a => a.Id == driverBase.CurrentDevice.RedundantDeviceId)) | ||||
|                                 if (driverBase.CurrentDevice.IsRedundant && _serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetCacheList(false).Any(a => a.Id == driverBase.CurrentDevice.RedundantDeviceId)) | ||||
|                                 { | ||||
|                                     await DeviceRedundantThreadAsync(driverBase.CurrentDevice.Id); | ||||
|                                 } | ||||
| @@ -307,7 +307,7 @@ public class UploadDeviceWorker : DeviceWorker | ||||
|  | ||||
|     protected override Task<IEnumerable<DeviceRunTime>> GetDeviceRunTimeAsync(long devId) | ||||
|     { | ||||
|         return Task.FromResult(_serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetDeviceRuntime(devId)); | ||||
|         return Task.FromResult(_serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetDeviceRuntime(devId)); | ||||
|     } | ||||
|  | ||||
|     #endregion | ||||
|   | ||||
| @@ -1,12 +1,12 @@ | ||||
| #region copyright | ||||
| #region copyright | ||||
| //------------------------------------------------------------------------------ | ||||
| //  此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充 | ||||
| //  此代码版权(除特别声明外的代码)归作者本人Diego所有 | ||||
| //  源代码使用协议遵循本仓库的开源协议及附加协议 | ||||
| //  Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway | ||||
| //  Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway | ||||
| //  使用文档:https://diego2098.gitee.io/thingsgateway-docs/ | ||||
| //  QQ群:605534569 | ||||
| //  <EFBFBD>˴<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊȫ<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD>ֶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ||||
| //  <EFBFBD>˴<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD>룩<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߱<EFBFBD><EFBFBD><EFBFBD>Diego<EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ||||
| //  Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD><EFBFBD>ֿ<EFBFBD><EFBFBD>Ŀ<EFBFBD>ԴЭ<EFBFBD>鼰<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD> | ||||
| //  GiteeԴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֿ⣺https://gitee.com/diego2098/ThingsGateway | ||||
| //  GithubԴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֿ⣺https://github.com/kimdiego2098/ThingsGateway | ||||
| //  ʹ<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD>https://diego2098.gitee.io/thingsgateway-docs/ | ||||
| //  QQȺ<EFBFBD><EFBFBD>605534569 | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| @@ -32,7 +32,7 @@ namespace ThingsGateway.Gateway.Blazor | ||||
|             try | ||||
|             { | ||||
|                 await OnSaveAsync.InvokeAsync(Content); | ||||
|                 //await InvokeAsync(async () => await PopupService.EnqueueSnackbarAsync("成功", AlertTypes.Success)); | ||||
|                 //await InvokeAsync(async () => await PopupService.EnqueueSnackbarAsync("<EFBFBD>ɹ<EFBFBD>", AlertTypes.Success)); | ||||
|                 await ClosePopupAsync(); | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|   | ||||
| @@ -34,7 +34,7 @@ public partial class BackendLogPage | ||||
|         var confirm = await PopupService.OpenConfirmDialogAsync("删除", "确定 ?"); | ||||
|         if (confirm) | ||||
|         { | ||||
|             await _serviceScope.ServiceProvider.GetService<IBackendLogService>().DeleteAsync(); | ||||
|             await _serviceScope.ServiceProvider.GetService<BackendLogService>().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<IBackendLogService>().PageAsync(input); | ||||
|         var data = await _serviceScope.ServiceProvider.GetService<BackendLogService>().PageAsync(input); | ||||
|         return data; | ||||
|     } | ||||
| } | ||||
| @@ -29,7 +29,7 @@ | ||||
|  | ||||
| @layout MainLayout | ||||
| @using ThingsGateway.Admin.Core; | ||||
| @* @if (IsMobile) | ||||
| @if (IsMobile) | ||||
| { | ||||
|     @GetAppDataTable() | ||||
| } | ||||
| @@ -67,9 +67,7 @@ else | ||||
|             @GetAppDataTable() | ||||
|         </MCol> | ||||
|     </MRow> | ||||
| } *@ | ||||
|  | ||||
| @GetAppDataTable() | ||||
| } | ||||
|  | ||||
|  | ||||
| <ImportExcel @ref=_importExcel Import="SaveDeviceImportAsync" Preview="DeviceImportAsync" /> | ||||
|   | ||||
| @@ -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<ICollectDeviceService>().GetCacheList(true); | ||||
|         data ??= _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetCacheList(true); | ||||
|         foreach (var device in data) | ||||
|         { | ||||
|             device.DevicePropertys = GetDriverProperties(device.PluginName, device.Id); | ||||
|         } | ||||
|         await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().EditsAsync(data); | ||||
|         await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().EditsAsync(data); | ||||
|         await PopupService.EnqueueSnackbarAsync("刷新成功", AlertTypes.Success); | ||||
|  | ||||
|     } | ||||
|     private async Task AddCallAsync(DeviceAddInput input) | ||||
|     { | ||||
|         await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().AddAsync(input); | ||||
|         await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().AddAsync(input); | ||||
|         Refresh(); | ||||
|         await _mainLayout.StateHasChangedAsync(); | ||||
|     } | ||||
| @@ -85,7 +85,7 @@ public partial class CollectDevicePage : BaseComponentBase | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         await _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().CopyDevAndVarAsync(data); | ||||
|         await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().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<ICollectDeviceService>().CopyDevAsync(data); | ||||
|         await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().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<ICollectDeviceService>().DeleteAsync(input.Select(a => a.Id).ToArray()); | ||||
|         await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().DeleteAsync(input.Select(a => a.Id).ToArray()); | ||||
|         Refresh(); | ||||
|         await _mainLayout.StateHasChangedAsync(); | ||||
|     } | ||||
|  | ||||
|     Task<Dictionary<string, ImportPreviewOutputBase>> DeviceImportAsync(IBrowserFile file) | ||||
|     { | ||||
|         return _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().PreviewAsync(file); | ||||
|         return _serviceScope.ServiceProvider.GetService<CollectDeviceService>().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<ICollectDeviceService>().EditAsync(input); | ||||
|         _devices = _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetCacheList(true); | ||||
|         await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().EditAsync(input); | ||||
|         _devices = _serviceScope.ServiceProvider.GetService<CollectDeviceService>().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<ICollectDeviceService>().PageAsync(input); | ||||
|         var data = await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().PageAsync(input); | ||||
|         return data; | ||||
|     } | ||||
|  | ||||
|     private void Refresh() | ||||
|     { | ||||
|         _devices = _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetCacheList(true); | ||||
|         _devices = _serviceScope.ServiceProvider.GetService<CollectDeviceService>().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<ICollectDeviceService>().ImportAsync(data); | ||||
|         await _serviceScope.ServiceProvider.GetService<CollectDeviceService>().ImportAsync(data); | ||||
|         await DatatableQueryAsync(); | ||||
|         _importExcel.IsShowImport = false; | ||||
|         await _mainLayout.StateHasChangedAsync(); | ||||
|   | ||||
| @@ -19,7 +19,7 @@ | ||||
| @using Masa.Blazor.Presets; | ||||
| @using System.IO; | ||||
| @using Microsoft.AspNetCore.Authorization; | ||||
| @using SqlSugar; | ||||
|  | ||||
| @using ThingsGateway.Admin.Blazor; | ||||
| @using ThingsGateway.Admin.Core; | ||||
|  | ||||
| @@ -48,11 +48,11 @@ | ||||
|              @if (_tabNumber == 1) | ||||
|             { | ||||
|                 <MRow NoGutters> | ||||
| @*                  <MCol Md=2 Cols="12"> | ||||
|                  <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="_collectDeviceSearchName" | ||||
|                              <MTextField Dense Style="max-width:200px;" HideDetails=@("auto") Class="mx-2 my-1" @bind-Value="_collectDeviceGroupSearchName" | ||||
|                                             Outlined Label=@typeof(CollectDevice).GetDescription(nameof(CollectDevice.DeviceGroup)) /> | ||||
|                              </MCardTitle> | ||||
|  | ||||
| @@ -64,7 +64,7 @@ | ||||
|                                    } | ||||
|                                    } ) | ||||
|                                         Items="_collectDeviceGroups" ItemText="r=>r" ItemChildren="r=>null" | ||||
|                                         Search="@_collectDeviceSearchName" | ||||
|                                         Search="@_collectDeviceGroupSearchName" | ||||
|                                       Activatable ItemKey=@(r=>r)> | ||||
|                                  <LabelContent> | ||||
|                                      <span title=@context.Item> | ||||
| @@ -73,14 +73,12 @@ | ||||
|                                 </LabelContent> | ||||
|                             </MTreeview> | ||||
|                         </MCard> | ||||
|                     </MCol> *@ | ||||
|                     <MCol Md=5 Cols="12"> | ||||
|                     </MCol> | ||||
|                     <MCol Md=3 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="_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(!_collectDeviceSearchName.IsNullOrEmpty(),a=>a.CurrentDevice.Name.Contains(_collectDeviceSearchName)).ToList()"> | ||||
|                              <MVirtualScroll Context="item" Height=@($"calc(100vh - {BlazorResourceConst.DefaultHeight+100}px)") OverscanCount=2 ItemSize="60" Items="_collectDriverBases"> | ||||
|  | ||||
|                                  <ItemContent> | ||||
|                                      @if (item.CurrentDevice != null) | ||||
| @@ -252,10 +250,10 @@ | ||||
|             @if (_tabNumber == 2) | ||||
|             { | ||||
|                 <MRow> | ||||
| @*                     <MCol Md=2 Cols="12"> | ||||
|                     <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="_uploadDeviceSearchName" | ||||
|                                 <MTextField Dense Style="max-width:200px;" HideDetails=@("auto") Class="mx-2 my-1" @bind-Value="_uploadDeviceGroupSearchName" | ||||
|                                             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 +265,7 @@ | ||||
|                                    } | ||||
|                                    } ) | ||||
|                                         Items="_uploadDeviceGroups" ItemText="r=>r" ItemChildren="r=>null" | ||||
|                                         Search="@_uploadDeviceSearchName" | ||||
|                                         Search="@_uploadDeviceGroupSearchName" | ||||
|                                       Activatable ItemKey=@(r=>r)> | ||||
|                                  <LabelContent> | ||||
|                                      <span title=@context.Item> | ||||
| @@ -276,13 +274,11 @@ | ||||
|                                 </LabelContent> | ||||
|                             </MTreeview> | ||||
|                         </MCard> | ||||
|                     </MCol> *@ | ||||
|                     <MCol Md=5 Cols="12"> | ||||
|                     </MCol> | ||||
|                     <MCol Md=3 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="_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(!_uploadDeviceSearchName.IsNullOrEmpty(),a=>a.CurrentDevice.Name.Contains(_uploadDeviceSearchName)).ToList()"> | ||||
|                              <MVirtualScroll Context="item" Height=@($"calc(100vh - {BlazorResourceConst.DefaultHeight+100}px)") OverscanCount=2 ItemSize="60" Items="_uploadDriverBases"> | ||||
|  | ||||
|                                  <ItemContent> | ||||
|                                      @if (item.CurrentDevice != null) | ||||
|   | ||||
| @@ -12,6 +12,8 @@ | ||||
|  | ||||
| using BlazorComponent; | ||||
|  | ||||
| using Mapster; | ||||
|  | ||||
| using Masa.Blazor; | ||||
|  | ||||
| using Microsoft.AspNetCore.Components; | ||||
| @@ -28,11 +30,10 @@ 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; | ||||
|     //private string _collectDeviceSearchName; | ||||
|     string _collectDeviceSearchName; | ||||
|     List<string> _collectDeviceGroups = new(); | ||||
|     string _collectDeviceGroupSearchName; | ||||
|     List<CollectBase> _collectDriverBases = new(); | ||||
|     CollectBase _collectDriverItem; | ||||
|     BootstrapDynamicComponent _driverComponent; | ||||
| @@ -41,10 +42,9 @@ public partial class DeviceStatusPage : IDisposable | ||||
|     bool _isAllRestart; | ||||
|     bool _isRestart; | ||||
|     StringNumber _tabNumber; | ||||
|     //private string _uploadDeviceSearchName; | ||||
|     //List<string> _uploadDeviceGroups = new(); | ||||
|     //string _uploadDeviceGroupSearchName; | ||||
|     string _uploadDeviceSearchName; | ||||
|     private string _uploadDeviceGroup; | ||||
|     List<string> _uploadDeviceGroups = new(); | ||||
|     string _uploadDeviceGroupSearchName; | ||||
|     List<DriverBase> _uploadDriverBases = new(); | ||||
|     DriverBase _uploadDriverItem; | ||||
|     AlarmWorker _alarmWorker { get; set; } | ||||
| @@ -121,8 +121,8 @@ public partial class DeviceStatusPage : IDisposable | ||||
|  | ||||
|     void CollectDeviceQuery() | ||||
|     { | ||||
|         //_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(); | ||||
|         _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(); | ||||
|     } | ||||
|     async Task DeviceRedundantThreadAsync(long devId) | ||||
|     { | ||||
| @@ -207,6 +207,10 @@ 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(); | ||||
| @@ -244,8 +248,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(!_uploadDeviceSearchName.IsNullOrEmpty(), a => a.CurrentDevice?.Name.Contains(_uploadDeviceSearchName) == true).ToList() ?? new(); | ||||
|         _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(); | ||||
|     } | ||||
|     async Task UpRestartAsync(long devId) | ||||
|     { | ||||
|   | ||||
| @@ -30,7 +30,7 @@ | ||||
| @inject UserResoures UserResoures | ||||
| @layout MainLayout | ||||
|  | ||||
| @* @if (IsMobile) | ||||
| @if (IsMobile) | ||||
| { | ||||
|     @GetAppDataTable() | ||||
|  | ||||
| @@ -69,8 +69,7 @@ else | ||||
|  | ||||
|         </MCol> | ||||
|     </MRow> | ||||
| } *@ | ||||
| @GetAppDataTable() | ||||
| } | ||||
|  | ||||
| <ImportExcel @ref=_importExcel Import="SaveDeviceImportAsync" Preview="DeviceImportAsync" /> | ||||
|  | ||||
| @@ -161,7 +160,7 @@ else | ||||
|         case nameof(context.Item.DeviceId): | ||||
|             <span title=@context.Value> | ||||
|                 @( | ||||
|             _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetNameById(context.Item.DeviceId) | ||||
|             _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetNameById(context.Item.DeviceId) | ||||
|                 ) | ||||
|             </span> | ||||
|         break; | ||||
| @@ -193,7 +192,7 @@ else | ||||
|                     </td> | ||||
|                     <td class="text-start "> | ||||
|                         <div style="word-break:break-all; white-space:pre-wrap;"> | ||||
|                             @(_serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetNameById(context.Item2.ToLong())) | ||||
|                             @(_serviceScope.ServiceProvider.GetService<CollectDeviceService>().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<ICollectDeviceService>().GetCacheList(true); | ||||
|         _uploadDevices = _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetCacheList(true); | ||||
|         _deviceGroups = _serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetTree(); | ||||
|         _collectDevices = _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetCacheList(true); | ||||
|         _uploadDevices = _serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetCacheList(true); | ||||
|         _deviceGroups = _serviceScope.ServiceProvider.GetService<CollectDeviceService>().GetTree(); | ||||
|         await base.OnParametersSetAsync(); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -30,7 +30,7 @@ | ||||
| @inherits BaseComponentBase | ||||
| @inject UserResoures UserResoures | ||||
| @layout MainLayout | ||||
| @* @if (IsMobile) | ||||
| @if (IsMobile) | ||||
| { | ||||
|     @GetAppDataTable() | ||||
|  | ||||
| @@ -69,11 +69,7 @@ else | ||||
|             @GetAppDataTable() | ||||
|         </MCol> | ||||
|     </MRow> | ||||
| } *@ | ||||
|  | ||||
| @GetAppDataTable() | ||||
|  | ||||
|  | ||||
| } | ||||
| @code { | ||||
|     RenderFragment GetAppDataTable() | ||||
|     { | ||||
| @@ -135,7 +131,7 @@ else | ||||
|                             </td> | ||||
|                             <td class="text-start "> | ||||
|                                 <div style="word-break:break-all; white-space:pre-wrap;"> | ||||
|                                     @(_serviceScope.ServiceProvider.GetService<ICollectDeviceService>().GetNameById(context.Item2.ToLong())) | ||||
|                                     @(_serviceScope.ServiceProvider.GetService<CollectDeviceService>().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<IUploadDeviceService>().GetIdByName(input.UploadDeviceName); | ||||
|         var uploadDevId = _serviceScope.ServiceProvider.GetService<UploadDeviceService>().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<IRpcLogService>().DeleteAsync(); | ||||
|             await _serviceScope.ServiceProvider.GetService<RpcLogService>().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<IRpcLogService>().PageAsync(input); | ||||
|         var data = await _serviceScope.ServiceProvider.GetService<RpcLogService>().PageAsync(input); | ||||
|         return data; | ||||
|     } | ||||
| } | ||||
| @@ -29,7 +29,7 @@ | ||||
|  | ||||
| @layout MainLayout | ||||
| @using ThingsGateway.Admin.Core; | ||||
| @* @if (IsMobile) | ||||
| @if (IsMobile) | ||||
| { | ||||
|     @GetAppDataTable() | ||||
| } | ||||
| @@ -67,9 +67,8 @@ else | ||||
|             @GetAppDataTable() | ||||
|         </MCol> | ||||
|     </MRow> | ||||
| } *@ | ||||
| } | ||||
|  | ||||
| @GetAppDataTable() | ||||
|  | ||||
| <ImportExcel @ref=_importExcel Import="SaveDeviceImportAsync" Preview="DeviceImportAsync" /> | ||||
|  | ||||
|   | ||||
| @@ -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<IUploadDeviceService>().AddAsync(input); | ||||
|         await _serviceScope.ServiceProvider.GetService<UploadDeviceService>().AddAsync(input); | ||||
|         Refresh(); | ||||
|         await _mainLayout.StateHasChangedAsync(); | ||||
|     } | ||||
| @@ -68,12 +68,12 @@ public partial class UploadDevicePage | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|         data ??= _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetCacheList(true); | ||||
|         data ??= _serviceScope.ServiceProvider.GetService<UploadDeviceService>().GetCacheList(true); | ||||
|         foreach (var device in data) | ||||
|         { | ||||
|             device.DevicePropertys = GetDriverProperties(device.PluginName, device.Id); | ||||
|         } | ||||
|         await _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().EditsAsync(data); | ||||
|         await _serviceScope.ServiceProvider.GetService<UploadDeviceService>().EditsAsync(data); | ||||
|         await PopupService.EnqueueSnackbarAsync("刷新成功", AlertTypes.Success); | ||||
|  | ||||
|     } | ||||
| @@ -85,7 +85,7 @@ public partial class UploadDevicePage | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         await _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().CopyDevAsync(data); | ||||
|         await _serviceScope.ServiceProvider.GetService<UploadDeviceService>().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<IUploadDeviceService>().DeleteAsync(input.Select(a => a.Id).ToArray()); | ||||
|         await _serviceScope.ServiceProvider.GetService<UploadDeviceService>().DeleteAsync(input.Select(a => a.Id).ToArray()); | ||||
|         Refresh(); | ||||
|         await _mainLayout.StateHasChangedAsync(); | ||||
|     } | ||||
|  | ||||
|     Task<Dictionary<string, ImportPreviewOutputBase>> DeviceImportAsync(IBrowserFile file) | ||||
|     { | ||||
|         return _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().PreviewAsync(file); | ||||
|         return _serviceScope.ServiceProvider.GetService<UploadDeviceService>().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<IUploadDeviceService>().EditAsync(input); | ||||
|         _devices = _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetCacheList(true); | ||||
|         await _serviceScope.ServiceProvider.GetService<UploadDeviceService>().EditAsync(input); | ||||
|         _devices = _serviceScope.ServiceProvider.GetService<UploadDeviceService>().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<IUploadDeviceService>().PageAsync(input); | ||||
|         var data = await _serviceScope.ServiceProvider.GetService<UploadDeviceService>().PageAsync(input); | ||||
|         return data; | ||||
|     } | ||||
|  | ||||
|     private void Refresh() | ||||
|     { | ||||
|         _devices = _serviceScope.ServiceProvider.GetService<IUploadDeviceService>().GetCacheList(true); | ||||
|         _devices = _serviceScope.ServiceProvider.GetService<UploadDeviceService>().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<IUploadDeviceService>().ImportAsync(data); | ||||
|         await _serviceScope.ServiceProvider.GetService<UploadDeviceService>().ImportAsync(data); | ||||
|         await DatatableQueryAsync(); | ||||
|         _importExcel.IsShowImport = false; | ||||
|         await _mainLayout.StateHasChangedAsync(); | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
|  | ||||
|   <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,23 @@ | ||||
| <Project> | ||||
| 	<Import Project="$(SolutionDir)\Directory.Build.props" /> | ||||
| 	<PropertyGroup> | ||||
| 		<Version>4.0.0.1</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> | ||||
|  | ||||
| 	<!--<PropertyGroup> | ||||
| 		<EnableDynamicLoading>true</EnableDynamicLoading> | ||||
| 	</PropertyGroup>--> | ||||
|  | ||||
| 	<ItemGroup> | ||||
|  | ||||
| 		<ProjectReference Include="..\..\gateway\ThingsGateway.Gateway.Application\ThingsGateway.Gateway.Application.csproj" > | ||||
|   | ||||
| @@ -71,8 +71,8 @@ public class DLT645_2007OverTcpProperty : DriverPropertyBase | ||||
|     /// <summary> | ||||
|     /// 组包缓存超时ms | ||||
|     /// </summary> | ||||
|     [DeviceProperty("组包缓存超时", "某些设备性能较弱,报文间需要间隔较长时间,可以设置更长的组包缓存,默认1000ms")] | ||||
|     public int CacheTimeout { get; set; } = 1000; | ||||
|     [DeviceProperty("组包缓存超时", "某些设备性能较弱,报文间需要间隔较长时间,可以设置更长的组包缓存,默认1s")] | ||||
|     public int CacheTimeout { get; set; } = 1; | ||||
|     /// <summary> | ||||
|     /// 共享链路 | ||||
|     /// </summary> | ||||
|   | ||||
| @@ -12,10 +12,14 @@ | ||||
| 		<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> | ||||
|  | ||||
| @@ -26,7 +30,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> | ||||
|   | ||||
| @@ -16,6 +16,8 @@ using LiteDB; | ||||
|  | ||||
| using Microsoft.Extensions.Logging; | ||||
|  | ||||
| using MQTTnet.Diagnostics; | ||||
|  | ||||
| using System.Runtime.InteropServices; | ||||
|  | ||||
| using ThingsGateway.Foundation.Extension.ConcurrentQueue; | ||||
| @@ -69,19 +71,18 @@ 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 = _driverPropertys.SecurityProtocol, | ||||
|             SaslMechanism = _driverPropertys.SaslMechanism, | ||||
|  | ||||
|             SecurityProtocol = SecurityProtocol, | ||||
|             SaslMechanism = SaslMechanism, | ||||
|             SaslUsername = _driverPropertys.SaslUsername, | ||||
|             SaslPassword = _driverPropertys.SaslPassword, | ||||
|         }; | ||||
|         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); | ||||
|   | ||||
| @@ -10,8 +10,6 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| using Confluent.Kafka; | ||||
|  | ||||
| namespace ThingsGateway.Plugin.Kafka; | ||||
|  | ||||
| /// <summary> | ||||
| @@ -55,10 +53,12 @@ public class KafkaProducerProperty : UploadPropertyWithCacheT | ||||
|     /// </summary> | ||||
|     [DeviceProperty("密码", "")] | ||||
|     public string SaslPassword { get; set; } = "none"; | ||||
|     [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; | ||||
|     [DeviceProperty("SecurityProtocol", "")] | ||||
|     public string SecurityProtocol { get; set; } = "SaslPlaintext"; | ||||
|     [DeviceProperty("SaslMechanism", "")] | ||||
|     public string SaslMechanism { get; set; } = "Plain"; | ||||
|  | ||||
|  | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 设备实体脚本 | ||||
|   | ||||
| @@ -85,7 +85,7 @@ public class ModbusSerialServer : UpLoadBase | ||||
|  | ||||
|         var tags = CurrentDevice.DeviceVariableRunTimes | ||||
|             .Where(b => !string.IsNullOrEmpty( | ||||
|                 b.GetPropertyValue(DeviceId, nameof(_variablePropertys.ServiceAddress))?.Value)) | ||||
|                 b.GetPropertyValue(DeviceId, nameof(_variablePropertys.ServiceAddress)).Value)) | ||||
|             .ToList(); | ||||
|  | ||||
|         tags.ForEach(a => | ||||
|   | ||||
| @@ -45,7 +45,7 @@ public class ModbusTcpDtu : CollectBase | ||||
|         var client1 = new TcpService(); | ||||
|         ((TcpService)client1).Setup(FoundataionConfig); | ||||
|         //载入配置 | ||||
|         _plc = new((TcpService)client1) | ||||
|         _plc = new((TcpService)client) | ||||
|         { | ||||
|             DataFormat = _driverPropertys.DataFormat, | ||||
|             FrameTime = _driverPropertys.FrameTime, | ||||
|   | ||||
| @@ -64,7 +64,6 @@ public class ModbusTcpServer : UpLoadBase | ||||
|             iPHost = new IPHost($"{_driverPropertys.IP}:{_driverPropertys.Port}"); | ||||
|         } | ||||
|         FoundataionConfig.SetListenIPHosts(new IPHost[] { iPHost }); | ||||
|         FoundataionConfig.SetMaxCount(30000); | ||||
|         var service = new TcpService(); | ||||
|         service.Setup(FoundataionConfig); | ||||
|         //载入配置 | ||||
| @@ -79,7 +78,7 @@ public class ModbusTcpServer : UpLoadBase | ||||
|  | ||||
|         var tags = CurrentDevice.DeviceVariableRunTimes | ||||
|             .Where(b => !string.IsNullOrEmpty( | ||||
|                 b.GetPropertyValue(DeviceId, nameof(_variablePropertys.ServiceAddress))?.Value)) | ||||
|                 b.GetPropertyValue(DeviceId, nameof(_variablePropertys.ServiceAddress)).Value)) | ||||
|             .ToList(); | ||||
|  | ||||
|         tags.ForEach(a => | ||||
|   | ||||
| @@ -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> | ||||
|   | ||||
| @@ -112,7 +112,7 @@ public partial class IotSharpClient : UpLoadBaseWithCacheT<DeviceData, VariableD | ||||
|                         var tag = CurrentDevice.DeviceVariableRunTimes.FirstOrDefault(a => a.Name == item.Key); | ||||
|                         if (tag != null) | ||||
|                         { | ||||
|                             var rpcEnable = tag.GetPropertyValue(DeviceId, nameof(_variablePropertys.VariableRpcEnable))?.Value?.ToBool() == true && _driverPropertys.DeviceRpcEnable; | ||||
|                             var rpcEnable = tag.GetPropertyValue(DeviceId, nameof(_variablePropertys.VariableRpcEnable)).Value.ToBool(false) && _driverPropertys.DeviceRpcEnable; | ||||
|                             if (!rpcEnable) | ||||
|                             { | ||||
|                                 results.Add(item.Key, new OperResult("权限不足,变量不支持写入")); | ||||
|   | ||||
| @@ -69,20 +69,14 @@ public partial class MqttClient : UpLoadBaseWithCacheT<DeviceData, VariableData> | ||||
|     { | ||||
|         base.Init(client); | ||||
|         var mqttFactory = new MqttFactory(); | ||||
|         var mqttClientOptionsBuilder = mqttFactory.CreateClientOptionsBuilder() | ||||
|         _mqttClientOptions = mqttFactory.CreateClientOptionsBuilder() | ||||
|            .WithClientId(_driverPropertys.ConnectId) | ||||
|            .WithCredentials(_driverPropertys.UserName, _driverPropertys.Password)//账密 | ||||
|  | ||||
|            .WithTcpServer(_driverPropertys.IP, _driverPropertys.Port)//服务器 | ||||
|            .WithCleanSession(true) | ||||
|            .WithKeepAlivePeriod(TimeSpan.FromSeconds(120.0)) | ||||
|            .WithoutThrowOnNonSuccessfulConnectResponse(); | ||||
|         if (_driverPropertys.IsWebSocket) | ||||
|             _mqttClientOptions = mqttClientOptionsBuilder.WithWebSocketServer(a => a.WithUri(_driverPropertys.WebSocktUrl)) | ||||
|            .WithoutThrowOnNonSuccessfulConnectResponse() | ||||
|            .Build(); | ||||
|         else | ||||
|             _mqttClientOptions = mqttClientOptionsBuilder.WithTcpServer(_driverPropertys.IP, _driverPropertys.Port)//服务器 | ||||
|            .Build(); | ||||
|  | ||||
|         _mqttSubscribeOptions = mqttFactory.CreateSubscribeOptionsBuilder() | ||||
|             .WithTopicFilter( | ||||
|                 f => | ||||
|   | ||||
| @@ -134,7 +134,7 @@ public partial class MqttClient : UpLoadBaseWithCacheT<DeviceData, VariableData> | ||||
|                 var tag = CurrentDevice.DeviceVariableRunTimes.FirstOrDefault(a => a.Name == rpcData.Key); | ||||
|                 if (tag != null) | ||||
|                 { | ||||
|                     var rpcEnable = tag.GetPropertyValue(DeviceId, nameof(_variablePropertys.VariableRpcEnable))?.Value?.ToBool(); | ||||
|                     var rpcEnable = tag.GetPropertyValue(DeviceId, nameof(_variablePropertys.VariableRpcEnable)).Value.ToBool(); | ||||
|                     if (rpcEnable == true) | ||||
|                     { | ||||
|  | ||||
|   | ||||
| @@ -29,16 +29,6 @@ public class MqttClientProperty : UploadPropertyWithCacheT | ||||
|     [DeviceProperty("端口", "")] | ||||
|     public override int Port { get; set; } = 1883; | ||||
|     /// <summary> | ||||
|     /// 是否websocket连接 | ||||
|     /// </summary> | ||||
|     [DeviceProperty("是否WebSocket连接", "true=>websocket,flase=>tcp")] | ||||
|     public bool IsWebSocket { get; set; } = false; | ||||
|     /// <summary> | ||||
|     /// WebSocktUrl | ||||
|     /// </summary> | ||||
|     [DeviceProperty("WebSocktUrl", "")] | ||||
|     public string WebSocktUrl { get; set; } = "ws://127.0.0.1:8083/mqtt"; | ||||
|     /// <summary> | ||||
|     /// 账号 | ||||
|     /// </summary> | ||||
|     [DeviceProperty("账号", "")] | ||||
|   | ||||
| @@ -14,18 +14,15 @@ using Furion; | ||||
|  | ||||
| using Mapster; | ||||
|  | ||||
| using Microsoft.AspNetCore.Hosting; | ||||
| using Microsoft.Extensions.Configuration; | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using Microsoft.Extensions.Logging; | ||||
|  | ||||
| using MQTTnet; | ||||
| using MQTTnet.AspNetCore; | ||||
| using MQTTnet.Internal; | ||||
| using MQTTnet.Protocol; | ||||
| using MQTTnet.Server; | ||||
|  | ||||
| using System.Collections.Concurrent; | ||||
| using System.Net; | ||||
| using System.Text; | ||||
|  | ||||
| using ThingsGateway.Admin.Application; | ||||
| @@ -96,7 +93,6 @@ public class MqttServer : UpLoadBase | ||||
|             _mqttServer.InterceptingSubscriptionAsync -= MqttServer_InterceptingSubscriptionAsync; ; | ||||
|             _mqttServer?.SafeDispose(); | ||||
|         } | ||||
|         _webHost?.Dispose(); | ||||
|         _globalDeviceData?.AllVariables?.ForEach(a => a.VariableValueChange -= VariableValueChange); | ||||
|         _globalDeviceData?.CollectDevices?.ForEach(a => | ||||
|         { | ||||
| @@ -106,32 +102,16 @@ public class MqttServer : UpLoadBase | ||||
|         _collectVariableRunTimes.Clear(); | ||||
|         base.Dispose(disposing); | ||||
|     } | ||||
|     private IWebHost _webHost { get; set; } | ||||
|  | ||||
|     protected override void Init(ISenderClient client = null) | ||||
|     { | ||||
|         //var mqttFactory = new MqttFactory(); | ||||
|         //var mqttServerOptions = mqttFactory.CreateServerOptionsBuilder() | ||||
|         //    .WithDefaultEndpointBoundIPAddress(string.IsNullOrEmpty(_driverPropertys.IP) ? null : IPAddress.Parse(_driverPropertys.IP)) | ||||
|         //    .WithDefaultEndpointPort(_driverPropertys.Port) | ||||
|         //    .WithDefaultEndpoint() | ||||
|         //    .Build(); | ||||
|         //_mqttServer = mqttFactory.CreateMqttServer(mqttServerOptions); | ||||
|         var configuration = new ConfigurationBuilder() | ||||
|           .SetBasePath(Directory) | ||||
|           .Build(); | ||||
|         var webBuilder = new WebHostBuilder() | ||||
|      .UseKestrel( | ||||
|                              o => | ||||
|                              { | ||||
|                                  o.ListenAnyIP(_driverPropertys.Port, l => l.UseMqtt()); | ||||
|                                  o.ListenAnyIP(_driverPropertys.WebSocketPort); | ||||
|                              }); | ||||
|         webBuilder.UseStartup<MqttServerStartup>(); | ||||
|         _webHost = webBuilder.UseConfiguration(configuration) | ||||
|            .Build(); | ||||
|  | ||||
|  | ||||
|         _mqttServer = _webHost.Services.GetService<MqttHostedServer>(); | ||||
|         var mqttFactory = new MqttFactory(); | ||||
|         var mqttServerOptions = mqttFactory.CreateServerOptionsBuilder() | ||||
|             .WithDefaultEndpointBoundIPAddress(string.IsNullOrEmpty(_driverPropertys.IP) ? null : IPAddress.Parse(_driverPropertys.IP)) | ||||
|             .WithDefaultEndpointPort(_driverPropertys.Port) | ||||
|             .WithDefaultEndpoint() | ||||
|             .Build(); | ||||
|         _mqttServer = mqttFactory.CreateMqttServer(mqttServerOptions); | ||||
|  | ||||
|         CollectDevices.Where(a => CurrentDevice.DeviceVariableRunTimes.Select(b => b.DeviceId).Contains(a.Id)).ForEach(a => | ||||
|         { | ||||
| @@ -141,11 +121,11 @@ public class MqttServer : UpLoadBase | ||||
|         { | ||||
|             a.VariableValueChange += VariableValueChange; | ||||
|         }); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     protected override async Task ProtectedBeforStartAsync(CancellationToken cancellationToken) | ||||
|     { | ||||
|         _ = _webHost.StartAsync(cancellationToken); | ||||
|         if (_mqttServer != null) | ||||
|         { | ||||
|             _mqttServer.ValidatingConnectionAsync += MqttServer_ValidatingConnectionAsync; | ||||
| @@ -308,7 +288,7 @@ public class MqttServer : UpLoadBase | ||||
|                 var tag = CurrentDevice.DeviceVariableRunTimes.FirstOrDefault(a => a.Name == rpcData.Key); | ||||
|                 if (tag != null) | ||||
|                 { | ||||
|                     var rpcEnable = tag.GetPropertyValue(DeviceId, nameof(_variablePropertys.VariableRpcEnable))?.Value?.ToBool() == true; | ||||
|                     var rpcEnable = tag.GetPropertyValue(DeviceId, nameof(_variablePropertys.VariableRpcEnable)).Value.ToBool(false); | ||||
|                     if (!rpcEnable) | ||||
|                     { | ||||
|                         mqttRpcResult.Success = false; | ||||
|   | ||||
| @@ -17,18 +17,17 @@ namespace ThingsGateway.Plugin.Mqtt; | ||||
| public class MqttServerProperty : DriverPropertyBase | ||||
| { | ||||
|     [DeviceProperty("是否选择全部变量", "")] public bool IsAllVariable { get; set; } = false; | ||||
|  | ||||
|     /// <summary> | ||||
|     /// IP | ||||
|     /// </summary> | ||||
|     [DeviceProperty("IP", "留空则全部监听")] | ||||
|     public override string IP { get; set; } = ""; | ||||
|     /// <summary> | ||||
|     /// 端口 | ||||
|     /// </summary> | ||||
|     [DeviceProperty("端口", "")] | ||||
|     public override int Port { get; set; } = 1883; | ||||
|     /// <summary> | ||||
|     /// WebSocket端口 | ||||
|     /// </summary> | ||||
|     [DeviceProperty("WebSocket端口", "")] | ||||
|     public int WebSocketPort { get; set; } = 8083; | ||||
|     /// <summary> | ||||
|     /// 允许连接的ID(前缀) | ||||
|     /// </summary> | ||||
|     [DeviceProperty("允许连接的ID(前缀)", "")] | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user