Compare commits
	
		
			4987 Commits
		
	
	
		
			master
			...
			6b030791bb
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 6b030791bb | ||
|  | d0922c5309 | ||
|  | d46bb82086 | ||
|  | 1ead1b2e9a | ||
|  | c5f4f9b356 | ||
|  | 3fbde7f193 | ||
|  | e5abd1514b | ||
|  | 33ed4fe5d5 | ||
|  | 4051b31101 | ||
|  | 94b1788e8c | ||
|  | 7944a1a8e3 | ||
|  | 17b28025d8 | ||
|  | 0a6b77943f | ||
|  | a599566b20 | ||
|  | 1a7031342f | ||
|  | 516a8edb5e | ||
|  | f4e2100882 | ||
|  | 9f6998e042 | ||
|  | f730850d93 | ||
|  | 0ef83a945f | ||
|  | cbfd68f50c | ||
|  | 7762eb6d24 | ||
|  | db1a323921 | ||
|  | 1a61475f57 | ||
|  | 356e6438e0 | ||
|  | 5fe82a68ef | ||
|  | 9b6e02810a | ||
|  | f0a32ad868 | ||
|  | ce64bfd54d | ||
|  | a53d25fae2 | ||
|  | 08d5e0e4fd | ||
|  | b23f8325f4 | ||
|  | 0adb2b1486 | ||
|  | 38082397a9 | ||
|  | 4d527dc8ec | ||
|  | d90aca62e4 | ||
|  | 44f11be05c | ||
|  | 7a21ab3804 | ||
|  | 6bb4802f15 | ||
|  | cfc8f3c8e0 | ||
|  | 3f26b8b6df | ||
|  | 350ca644cf | ||
|  | 99b507657f | ||
|  | 2e93f1465f | ||
|  | 07a4d0637f | ||
|  | 66a721c1eb | ||
|  | 5efd2a1d3f | ||
|  | d0c447bb41 | ||
|  | ebc143a052 | ||
|  | 70b77669ab | ||
|  | 7393bcbc6e | ||
|  | 2abdab1b20 | ||
|  | d1a8800a9b | ||
|  | ced505b585 | ||
|  | 25010984f9 | ||
|  | 75d5971e42 | ||
|  | f5085b1cb3 | ||
|  | baa5c3124a | ||
|  | d1ae5ff2c7 | ||
|  | 962d2a4068 | ||
|  | 3adbb68466 | ||
|  | 7f086f8b83 | ||
|  | 95689baff9 | ||
|  | d39650eca5 | ||
|  | 4f44f50db5 | ||
|  | 27a2052241 | ||
|  | 072390dc13 | ||
|  | 385447d3b4 | ||
|  | 532ceeb5e7 | ||
|  | 2275590461 | ||
|  | d25b082eff | ||
|  | 6feaeb22bf | ||
|  | dad169496c | ||
|  | 3eef1eeb3c | ||
|  | f108a61293 | ||
|  | e1231d408c | ||
|  | c073c8d0bd | ||
|  | 437ae1425c | ||
|  | b6dcddac6f | ||
|  | e283d6a650 | ||
|  | 230f8c3b80 | ||
|  | 382be3d32f | ||
|  | a7c3b22f87 | ||
|  | 3585cceca8 | ||
|  | 908e65f136 | ||
|  | 7828af24fd | ||
|  | 185630ad2c | ||
|  | 67c4c8032e | ||
|  | 39ce5404c1 | ||
|  | 9f02c2d011 | ||
|  | 9d369e9a0f | ||
|  | 19a9486f48 | ||
|  | ab9ec446c7 | ||
|  | 0d3d8f23bb | ||
|  | 971742b392 | ||
|  | 63a425cf77 | ||
|  | e11d504f18 | ||
|  | 0e35945d4a | ||
|  | 0762067bec | ||
|  | 290ecb6823 | ||
|  | ee15427e88 | ||
|  | 06fa7b636e | ||
|  | 225c0088e1 | ||
|  | ae83152271 | ||
|  | b1c0beb8f6 | ||
|  | 4d96417661 | ||
|  | 711db33df3 | ||
|  | b7c0350134 | ||
|  | 9ff89c19f3 | ||
|  | 4684952973 | ||
|  | 4ead05b251 | ||
|  | cf62d2f508 | ||
|  | a894db0144 | ||
|  | a748a8b337 | ||
|  | 37a6cb3457 | ||
|  | 045449331f | ||
|  | 4c72bd2ac9 | ||
|  | b3942f5822 | ||
|  | 0b6bc910c4 | ||
|  | a4233d5f2c | ||
|  | 31c874e1ba | ||
|  | d40830188d | ||
|  | e789570a1b | ||
|  | 0de94d76ee | ||
|  | 536f579523 | ||
|  | c8d75ab72a | ||
|  | ad9676c040 | ||
|  | 29bd119ff4 | ||
|  | b07cca9bcf | ||
|  | 1c2364574d | ||
|  | 528082fc6b | ||
|  | 823c327894 | ||
|  | 39f6275e31 | ||
|  | 44d971998a | ||
|  | 6d7769e61a | ||
|  | afe1df98f3 | ||
|  | 97bd799b6d | ||
|  | 3316b73450 | ||
|  | eee06c837d | ||
|  | c4ae782195 | ||
|  | 2b22db2bf3 | ||
|  | 30cf69df04 | ||
|  | 54352ece58 | ||
|  | daffd10bce | ||
|  | a22b574614 | ||
|  | e3c79f232d | ||
|  | 1ae371cb30 | ||
|  | 96d24a8b22 | ||
|  | 34eb7320fa | ||
|  | 9fa56ad890 | ||
|  | 263dd9ea37 | ||
|  | 85de031db2 | ||
|  | a6f11e56a7 | ||
|  | 15f6dc6499 | ||
|  | b64b102682 | ||
|  | 576553e962 | ||
|  | ff5e2d4fe2 | ||
|  | 3f41df22a9 | ||
|  | 043aaf8399 | ||
|  | a5e0f3a6c5 | ||
|  | f9123942ca | ||
|  | b67e30ce25 | ||
|  | 5a2762a7c6 | ||
|  | c43a8992fd | ||
|  | 705a252618 | ||
|  | e2e957880b | ||
|  | 104f5d1049 | ||
|  | b3f11698f2 | ||
|  | 285e242e9e | ||
|  | 00b2dbb4a4 | ||
|  | 0b41291bf1 | ||
|  | f35c272a19 | ||
|  | 3a5af5777c | ||
|  | 2cbddaeb4a | ||
|  | e88658b1be | ||
|  | 8e73c39c47 | ||
|  | 119cd5bad9 | ||
|  | ddfdbf161a | ||
|  | 0940462d70 | ||
|  | 80978d3794 | ||
|  | 134b78189d | ||
|  | 0c9b5d522e | ||
|  | c663bd52fc | ||
|  | 573349f864 | ||
|  | 6a1d86b88a | ||
|  | c1bca77b3f | ||
|  | f962d9db1d | ||
|  | 78a3842e01 | ||
|  | e69b66d2aa | ||
|  | 85c6d365b1 | ||
|  | 1131f98b27 | ||
|  | 0188289e05 | ||
|  | 1ae490f744 | ||
|  | c842794d0d | ||
|  | f888c81508 | ||
|  | 6118304302 | ||
|  | 6b2906fb53 | ||
|  | 4e33b3ae02 | ||
|  | 688834a86e | ||
|  | df49e1f9dc | ||
|  | 4f36215dad | ||
|  | 5bc9f859f4 | ||
|  | 05d4acf5da | ||
|  | 755719e228 | ||
|  | 41d74a9d57 | ||
|  | 9ca1b4f161 | ||
|  | 0a5592594b | ||
|  | 2c39458e98 | ||
|  | aefe08d35e | ||
|  | 6de9346d01 | ||
|  | a02e0d575b | ||
|  | 358f77b13b | ||
|  | 494cc25c4d | ||
|  | cd314f3da7 | ||
|  | 065306e511 | ||
|  | 8b724e52b3 | ||
|  | 155366d92e | ||
|  | bcba8286cc | ||
|  | f007dc84e7 | ||
|  | cb4c7dd623 | ||
|  | 10b44698e1 | ||
|  | 83c782f3e6 | ||
|  | f8c75eab5b | ||
|  | d5b1190492 | ||
|  | 2bac43eeda | ||
|  | 77176e5bf5 | ||
|  | 891757c7eb | ||
|  | 47e31b127d | ||
|  | 6ad47f207a | ||
|  | 0ff3eaff97 | ||
|  | 7d4c79ce1a | ||
|  | 43e7f044f3 | ||
|  | efd05d3298 | ||
|  | e6c143881d | ||
|  | 5b2ccae4ae | ||
|  | de86b003fa | ||
|  | 70f8685b07 | ||
|  | df50f83ee2 | ||
|  | 8a2015da4c | ||
|  | 5ee3bfbc41 | ||
|  | f7c2d03428 | ||
|  | 4889f8bc09 | ||
|  | 1ea55c9e13 | ||
|  | 438cbaa978 | ||
|  | 6a295b67d8 | ||
|  | 3f389d2f43 | ||
|  | c3f46fcd50 | ||
|  | daa79e7b1b | ||
|  | 074f77fac0 | ||
|  | 1c27e3e574 | ||
|  | a4f430be3e | ||
|  | c6672bc712 | ||
|  | 5897590973 | ||
|  | 846ac803df | ||
|  | b066edd428 | ||
|  | 9015cd06c0 | ||
|  | 859a8198fe | ||
|  | 077cb2cad2 | ||
|  | bc1504cce5 | ||
|  | 4c01b277d2 | ||
|  | 01cd905669 | ||
|  | eac706bfcb | ||
|  | be9aa08cd9 | ||
|  | 1cac8ab8e0 | ||
|  | 4385ba2354 | ||
|  | 8707b6d48d | ||
|  | a10a09c979 | ||
|  | 4a563fbc78 | ||
|  | 4e790062c7 | ||
|  | 59a998ee70 | ||
|  | ed809fe9f4 | ||
|  | ec9bc40fe0 | ||
|  | fb3ded6877 | ||
|  | 870bc38f1c | ||
|  | 2a882cb3ee | ||
|  | 80b6a03999 | ||
|  | f1ba9f7409 | ||
|  | 740c6497f1 | ||
|  | 5cc073cb87 | ||
|  | 809ef180a9 | ||
|  | 3ebed172ac | ||
|  | 0220dc7f67 | ||
|  | 08cb8b1be8 | ||
|  | 9b7b1283a8 | ||
|  | a6af330500 | ||
|  | a9224b896b | ||
|  | 308c7f8ab0 | ||
|  | 916fae5c36 | ||
|  | 42aca4d540 | ||
|  | af5c7fb279 | ||
|  | 01c9853f9e | ||
|  | a52278552c | ||
|  | 1c9a736274 | ||
|  | dbb986688c | ||
|  | 0fd8a0e1fa | ||
|  | 60a4d6a1c8 | ||
|  | bad99f9383 | ||
|  | dc1eacdc7f | ||
|  | 9ecde574bc | ||
|  | a6362ee638 | ||
|  | c1e1ac4b8b | ||
|  | f8a7ffaca9 | ||
|  | a362764dad | ||
|  | fc468044c6 | ||
|  | 1e9fd39349 | ||
|  | dd3e60ee2f | ||
|  | ece1ef06c3 | ||
|  | 6683b51c2f | ||
|  | ff2d0a8315 | ||
|  | 541d090fa7 | ||
|  | 1f5b213ddd | ||
|  | 165ae97634 | ||
|  | f72c34e802 | ||
|  | 57db3819bb | ||
|  | d3d8e4f397 | ||
|  | 29e4d1ec4b | ||
|  | 388274ace5 | ||
|  | 6fc848d164 | ||
|  | 01b4f3abb8 | ||
|  | 7c34462adc | ||
|  | 77664107fa | ||
|  | 9c5f594a58 | ||
|  | 8a704eae3e | ||
|  | 09f9795cd8 | ||
|  | 0f1df0b87d | ||
|  | b5a07c699a | ||
|  | 61852f86ec | ||
|  | e2d5d29d0c | ||
|  | 23bfdb7ac5 | ||
|  | 172213cdc2 | ||
|  | 1e65208a4b | ||
|  | 7aa17bd31c | ||
|  | 205f17b706 | ||
|  | 2164d0f348 | ||
|  | 72d69e5c8f | ||
|  | 91fd641845 | ||
|  | ece292c45a | ||
|  | 6b59beba0d | ||
|  | aba3e33e70 | ||
|  | 5fd3ed4542 | ||
|  | c707186f48 | ||
|  | ebc5e3aeef | ||
|  | 52cbc12d20 | ||
|  | 00105f6a7d | ||
|  | 53bf64712e | ||
|  | 5ddb198c0e | ||
|  | 15e9f9d760 | ||
|  | 236404c5ba | ||
|  | 9b8f05e764 | ||
|  | 2dc62004e1 | ||
|  | a4c5517b09 | ||
|  | e1b9633ba4 | ||
|  | e73dd17908 | ||
|  | 54880a9562 | ||
|  | 2ff20d4fc5 | ||
|  | f719b71628 | ||
|  | 3e3f3349b4 | ||
|  | be8698382a | ||
|  | 463e545c19 | ||
|  | 210e410a26 | ||
|  | 4e051d9bee | ||
|  | 2796506449 | ||
|  | f0f7f75bf3 | ||
|  | 587b988ade | ||
|  | 8279b89ff5 | ||
|  | 2143da5dce | ||
|  | f095e344f5 | ||
|  | d59aef8a15 | ||
|  | ebf726afd5 | ||
|  | c0667636a5 | ||
|  | 892979ef1a | ||
|  | eca9fc8196 | ||
|  | 8566f8cd70 | ||
|  | f7976b6022 | ||
|  | d17ae463e8 | ||
|  | 927a091075 | ||
|  | b4234e30d8 | ||
|  | f2a513bd0e | ||
|  | 90e89cd60d | ||
|  | cd4a5621bb | ||
|  | 5c29d7ca5d | ||
|  | 18dd1937ce | ||
|  | c65f06acc0 | ||
|  | e7991254fa | ||
|  | 46ea63390e | ||
|  | 17990fe640 | ||
|  | 615f83861e | ||
|  | 428eb3319f | ||
|  | 91f3956508 | ||
|  | 5fa3d83f3e | ||
|  | d1c0c4a784 | ||
|  | 316e530943 | ||
|  | 692ffab0d9 | ||
|  | a293259fb9 | ||
|  | ea0ec60401 | ||
|  | 526af7828d | ||
|  | 3c9ac1b3d8 | ||
|  | 562a875219 | ||
|  | d21a9ba075 | ||
|  | 777411294c | ||
|  | 4dd5d85607 | ||
|  | 4476215d1c | ||
|  | fccdcf735f | ||
|  | 8c9db36978 | ||
|  | aded396bd1 | ||
|  | fa6553c4f6 | ||
|  | 180cc0778d | ||
|  | 840934372e | ||
|  | ec09a998f7 | ||
|  | 426f081cbc | ||
|  | 890af51f30 | ||
|  | 18fa7ac43f | ||
|  | 6b54d60ae0 | ||
|  | 4753245f74 | ||
|  | a1c2cef0d9 | ||
|  | 5423483f1c | ||
|  | a20fcb413a | ||
|  | f3e1580fef | ||
|  | cd708b373c | ||
|  | d025673c53 | ||
|  | a85f7b201c | ||
|  | 6dbe6365e8 | ||
|  | f909eae8c0 | ||
|  | 674ddb1fd6 | ||
|  | 7dfd1c8d6c | ||
|  | 7393eeb858 | ||
|  | 8f21db5ca3 | ||
|  | 7a0538dff0 | ||
|  | fdfbaad6d8 | ||
| e72f7c5e9f | |||
| bc50d76366 | |||
| fe7c6a5cb8 | |||
|  | 372f52e655 | ||
|  | 5d2a66b861 | ||
|  | b5523f5f40 | ||
|  | a4d4e3cea5 | ||
|  | f50bd497be | ||
|  | de918d48dc | ||
|  | d599972b7f | ||
|  | dee681d246 | ||
|  | 8990e921ae | ||
|  | 67fb697136 | ||
|  | f34d6bf108 | ||
|  | 570476b2aa | ||
|  | 0821d9b238 | ||
|  | c557433324 | ||
|  | 78d2c0ee21 | ||
|  | 03cd857bf3 | ||
|  | 5273f300ea | ||
|  | 4c220621b5 | ||
|  | e2c0e919d3 | ||
|  | bffb6d14e0 | ||
|  | 10b43594ca | ||
|  | c7b37d645d | ||
|  | bc17e11c47 | ||
|  | 0731de6926 | ||
|  | 9710e0aa00 | ||
|  | 59b4151e15 | ||
|  | d0a695e874 | ||
|  | ec55f48a63 | ||
|  | f69a6a75c8 | ||
|  | 6f688a058c | ||
|  | 9ea22ba66b | ||
|  | dbf63a0952 | ||
|  | 2de8bc681b | ||
|  | 1ba2d12376 | ||
|  | cb24b1560d | ||
|  | 5656d35d71 | ||
|  | 80734a0893 | ||
|  | 2335d43070 | ||
|  | 1a1ed43bd3 | ||
|  | 32500deaee | ||
|  | 5b56f03269 | ||
|  | f5dcdd3755 | ||
|  | 68d4f8ac1b | ||
|  | 4442b2c578 | ||
|  | 66d0f0c8ab | ||
|  | a65bb62369 | ||
|  | da02013346 | ||
|  | c30099b635 | ||
|  | 75f3efa38a | ||
|  | f9e74f8362 | ||
|  | 13b779ff3e | ||
|  | 8a1fa07e9b | ||
|  | 44a486fba6 | ||
|  | 99030da813 | ||
|  | 592981cdf8 | ||
|  | ca9e65f0cf | ||
|  | e21be6d018 | ||
|  | 28439149b3 | ||
|  | e259a3c411 | ||
|  | 124cb852aa | ||
|  | d3fc263f4e | ||
|  | f404055955 | ||
|  | 421d15e27e | ||
|  | 1994faf5b8 | ||
|  | 6cca359c2a | ||
|  | 304a64f65c | ||
|  | 717328223a | ||
|  | f1ed3b9b54 | ||
|  | 7b5cbdf010 | ||
|  | f1dd17b8f9 | ||
|  | 4e145e8435 | ||
|  | 066feca056 | ||
|  | 9414658842 | ||
|  | c494281257 | ||
|  | 0c940de38d | ||
|  | eaf7819d22 | ||
|  | 212413ae5f | ||
|  | 0e94cec311 | ||
|  | 9946553938 | ||
|  | 06eb7a30bf | ||
|  | f9684bb0c4 | ||
|  | bafa145712 | ||
|  | 1f884ac990 | ||
|  | 776539a32b | ||
|  | f82d7f58e7 | ||
|  | a42aa166d1 | ||
|  | 7232b894f7 | ||
|  | 4f3a5af06d | ||
|  | ac3ea74b87 | ||
|  | d18b879873 | ||
|  | 8d477fd6b5 | ||
|  | 4f446d5a09 | ||
|  | f77d943ba6 | ||
|  | 23d845f828 | ||
|  | f0c3ae6cd4 | ||
|  | 7ec939c54d | ||
|  | 619858e595 | ||
|  | 5e37673dba | ||
|  | e45d794128 | ||
|  | 74f31b61d2 | ||
|  | 30f8f09645 | ||
|  | 40860776a0 | ||
|  | ad0a91750c | ||
|  | 1aa2e264d7 | ||
|  | 7792ec186c | ||
|  | 60e9377f2e | ||
|  | 2f711f455a | ||
|  | 4943c4cd09 | ||
|  | c399e1a522 | ||
|  | 6975bf7608 | ||
|  | f01445678d | ||
|  | 059112abba | ||
|  | eaba5f7be7 | ||
|  | ffa8e336b6 | ||
|  | 10a67de2ba | ||
|  | 9316a8749e | ||
| b6f7aac2cd | |||
|  | 194c9e59df | ||
|  | 4fefcb8766 | ||
|  | ee78546e7a | ||
|  | 35aedab466 | ||
|  | 4574738593 | ||
|  | 7a0577b1c3 | ||
|  | 94300ec85c | ||
|  | 0256669afb | ||
|  | 42673696b4 | ||
|  | fdb5226b31 | ||
|  | 8f5b0a990e | ||
|  | 2e3671c1fa | ||
|  | 1819bdf1b9 | ||
|  | 37c81cb607 | ||
|  | d0a7759428 | ||
|  | cf6a8cf71f | ||
|  | d8efdc369c | ||
|  | d38355ba37 | ||
|  | 2603294bf9 | ||
|  | b4a8363efe | ||
|  | c84e0d288e | ||
|  | 6168d5d4b2 | ||
|  | d7e8fa64fd | ||
|  | 8f6917b10f | ||
|  | 312c17d985 | ||
|  | 15f9f4f9d3 | ||
|  | 94d27be493 | ||
|  | 47c74b5d0a | ||
|  | fb0b73be04 | ||
|  | 914fb11d48 | ||
|  | 950dd57d2d | ||
|  | 293737d8ac | ||
|  | 258bf54607 | ||
|  | 62a38d7d9e | ||
|  | bcfd770fc2 | ||
|  | 07cff62073 | ||
|  | 1312af0d5c | ||
|  | 791af1c397 | ||
|  | 3be2c18960 | ||
|  | aa4cdb88a2 | ||
|  | 4d45905531 | ||
|  | 4f4319150b | ||
|  | 7913e12144 | ||
|  | a0113a6770 | ||
|  | 088d91bb95 | ||
|  | bdd2e7f5ee | ||
|  | 81f9744633 | ||
|  | 5859210eb3 | ||
|  | a784c2c9b4 | ||
|  | 688437a068 | ||
|  | 843476a24b | ||
|  | df464eae89 | ||
|  | 22023aa887 | ||
|  | 5718b5bfa2 | ||
|  | 3ac80e3bbb | ||
|  | ed6b0695f2 | ||
|  | 1370593dd0 | ||
|  | acb6393f7d | ||
|  | 0aaa71aa29 | ||
|  | 0c3dab491f | ||
|  | 63d85b5c5b | ||
|  | 3473d09885 | ||
|  | 10ae557ad0 | ||
|  | 9307452a14 | ||
|  | a2519d82a2 | ||
|  | ec8da18298 | ||
|  | 91701965e9 | ||
|  | 86171587a0 | ||
|  | 6474d8d4a1 | ||
|  | dc45b610cc | ||
|  | a0afde54ff | ||
|  | 329aeecb34 | ||
|  | 1b4f7d95bf | ||
|  | 2221b11742 | ||
|  | 4e07ff289e | ||
|  | 542466d01a | ||
|  | b64f63ef9b | ||
|  | ff9491490c | ||
|  | 9e720dd808 | ||
|  | 985efd1a83 | ||
|  | 9251ab86e3 | ||
|  | 961950bf5e | ||
|  | ed390fafc2 | ||
|  | ddc099cffb | ||
|  | c66b661779 | ||
|  | 407b3ba2ac | ||
|  | d61c61d553 | ||
|  | eaadc9ae9c | ||
|  | 667e2af2df | ||
|  | 059df5fddf | ||
|  | 2d74465cf7 | ||
|  | 8b0650641e | ||
|  | c830b57f1f | ||
|  | f4b0e31858 | ||
|  | 24b7be6b32 | ||
|  | 5620d9aeb9 | ||
|  | 3cc973c3be | ||
|  | 2546cadadd | ||
|  | 1dd3a81607 | ||
|  | 67f1d0c45c | ||
|  | ba05fbda15 | ||
|  | 6ea2e37243 | ||
|  | cd33176a79 | ||
|  | 8d19706bac | ||
|  | ebb263cf2b | ||
|  | 00e02114cf | ||
|  | 5a64f7ac7d | ||
|  | d5f959707a | ||
|  | 4ec643dd1a | ||
|  | fd90613094 | ||
|  | 1420676c7c | ||
|  | b37a7b0d04 | ||
|  | 8c07c9a6cb | ||
|  | 189e7621ad | ||
|  | e55b5b8a8d | ||
|  | b7b1431b20 | ||
|  | f9b7833e47 | ||
|  | 82bd4af605 | ||
|  | da422ec320 | ||
|  | 8df77fb17a | ||
|  | 522b197279 | ||
|  | e49b4840e3 | ||
|  | ca7ad35d97 | ||
|  | 4ba346e72a | ||
|  | eed32e32a7 | ||
|  | 3ade163fbd | ||
|  | ab92982e71 | ||
|  | 6b7ff8e58c | ||
|  | 7be1dfd235 | ||
|  | 76f8830a0e | ||
|  | de994686f7 | ||
|  | 5b09630e62 | ||
|  | c776c1d733 | ||
|  | 21ed9dc914 | ||
|  | cec6ccc78a | ||
|  | 6f6dc79702 | ||
|  | 656b4be0c3 | ||
|  | e129575479 | ||
|  | 1b2348ef73 | ||
|  | 3a9377fe4b | ||
|  | d6d1b16a81 | ||
|  | 30b25883a8 | ||
|  | 872e7afdd3 | ||
|  | 4eeb00b093 | ||
|  | dec9937830 | ||
|  | c2a1ad2cd7 | ||
|  | 8dd48bc16c | ||
|  | 8aaf56e9e9 | ||
|  | 8224ebfb8a | ||
|  | fa551fe618 | ||
|  | 03272542b9 | ||
|  | 1c69fc8366 | ||
|  | 50541832cc | ||
|  | 39a344b054 | ||
|  | 54d49f0d14 | ||
|  | b235b5a3dc | ||
|  | 54b4c6f7c3 | ||
|  | 51aa329160 | ||
|  | 6c60c3439a | ||
|  | e725476603 | ||
|  | 1604efdecc | ||
|  | 7e1bf238a2 | ||
|  | c300e4072b | ||
|  | c0199b7b27 | ||
|  | 068f041b1b | ||
|  | 2a35b7611d | ||
|  | ec7048ac6b | ||
|  | 5a9a408bac | ||
|  | 449f315602 | ||
|  | d217c3a7d9 | ||
|  | 12c3076fbf | ||
|  | b2a6f5c09d | ||
|  | aeb7a68940 | ||
|  | adbf66aa00 | ||
|  | 20cd701073 | ||
|  | 8753f74791 | ||
|  | 39ad7e3a2f | ||
|  | e619acafd0 | ||
|  | 9332c73979 | ||
|  | de826faffd | ||
|  | 587b472194 | ||
|  | 7a67f0ebac | ||
|  | 74ddc88d00 | ||
|  | 87441df05d | ||
|  | 5b32a8d9f2 | ||
|  | 7075fed306 | ||
|  | 45083c459d | ||
|  | 390315d8fc | ||
|  | e22bee323c | ||
|  | f05e036bd0 | ||
|  | 27be7e63fc | ||
|  | 075beeb66b | ||
|  | a06537df58 | ||
|  | fc504404eb | ||
|  | 833b812a5f | ||
|  | 3dc9c0b86d | ||
|  | f146d3de01 | ||
|  | 0d772dd5d8 | ||
|  | a90f9be052 | ||
|  | 9038477862 | ||
|  | 468e05d75a | ||
|  | 673de90b92 | ||
|  | 4ce40daea1 | ||
|  | 21346a6798 | ||
|  | fa6f4a6d96 | ||
|  | 71f3bce5c7 | ||
|  | 6ac9c8e569 | ||
|  | cab95c1ae7 | ||
|  | 59b65f1745 | ||
|  | d1bc5a27ce | ||
|  | 28bb272ea4 | ||
|  | 97755bf7f9 | ||
|  | 2146056299 | ||
|  | 69e586d62b | ||
|  | be339c78ba | ||
|  | c8c1e558b1 | ||
|  | e03b0a203a | ||
|  | 6c88de497b | ||
|  | b8838d2171 | ||
|  | 17249c16fa | ||
|  | 8e167df7e3 | ||
|  | 378f4eba0b | ||
|  | ed4b58e215 | ||
|  | c99a9a1332 | ||
|  | f342e7d672 | ||
|  | 4f240ce79b | ||
|  | 3ef745acc6 | ||
|  | d767bd4326 | ||
|  | 36768dd5ca | ||
|  | 0b024f86c2 | ||
|  | 144d8be0d2 | ||
|  | ef371ae830 | ||
|  | 45a6e9f468 | ||
|  | d05b98d6e1 | ||
|  | 14cbefd125 | ||
|  | 046f0bf729 | ||
|  | 6b1c753d63 | ||
|  | 356ce8a63c | ||
|  | 3a27e68a90 | ||
|  | 6f414822de | ||
|  | 783bd0c4a3 | ||
|  | f140ef743d | ||
|  | e87f7305af | ||
|  | d076ac472c | ||
|  | 5949a8080b | ||
|  | 9a30b5aee0 | ||
|  | b1959edcd3 | ||
|  | 681088cb8d | ||
|  | 18009fdcb1 | ||
|  | 12712f55c8 | ||
|  | 2394a51cc0 | ||
|  | 9582d09ab7 | ||
|  | fce4725783 | ||
|  | 7d90a45cf6 | ||
|  | e3c3058a14 | ||
|  | 8b37b1236e | ||
|  | 20361ebe31 | ||
|  | d26ab93831 | ||
|  | d031e5d8e1 | ||
|  | 87f046d128 | ||
|  | 60b14432b6 | ||
|  | 9e5c080c4d | ||
|  | 3824243527 | ||
|  | 408fcffb29 | ||
|  | e416bd4b33 | ||
|  | 376cd60edd | ||
|  | 497db329be | ||
|  | f375ede115 | ||
|  | 406be50c27 | ||
|  | 2840952a41 | ||
|  | 4d843a9917 | ||
|  | 853dfc5988 | ||
|  | 437b348d06 | ||
|  | d143c6cc94 | ||
|  | 15ca20f906 | ||
|  | 0b2b613a7d | ||
|  | 8e0265232b | ||
|  | 0bc282c796 | ||
|  | 3acc7ef3d1 | ||
|  | 8f9d0d577f | ||
|  | ccf1be34be | ||
|  | 22c77339d2 | ||
|  | 7c71eb3cb8 | ||
|  | 3501165a3a | ||
|  | b42d1a0502 | ||
|  | cc1026765f | ||
|  | 16052ff00c | ||
|  | e983bd22a1 | ||
|  | b09cfd62a5 | ||
|  | 42b77e095c | ||
|  | a7e4c4528b | ||
|  | 852fa0346f | ||
|  | 295ff657e8 | ||
|  | 56b12271b8 | ||
|  | 80438a6ef2 | ||
|  | a3f6cde2da | ||
|  | 0f1e9d4815 | ||
|  | 7cee782996 | ||
|  | 129ea08723 | ||
|  | cf6b2ae087 | ||
|  | cc6719a677 | ||
|  | 76523d1c9f | ||
|  | 545f796578 | ||
|  | f2ff079d79 | ||
|  | f51879a8af | ||
|  | c6638f891d | ||
|  | 6c517b5f2f | ||
|  | 20d2cd8426 | ||
|  | 645b6c774f | ||
|  | ac9b240a0f | ||
|  | 0164aaa924 | ||
|  | 9c0330561c | ||
|  | 2575c256c4 | ||
|  | 543636c180 | ||
|  | 23383c28de | ||
|  | c616e57b4f | ||
|  | 4e5814b1a1 | ||
|  | 47779269b4 | ||
|  | fe62caea78 | ||
|  | 0dd726ced9 | ||
|  | 5549773805 | ||
|  | 56688f75d8 | ||
|  | e3a9f8032b | ||
|  | 06eaf1e59d | ||
|  | 5dba7c558f | ||
|  | 47a1f52cde | ||
|  | 38d79cc0e2 | ||
|  | f697a86440 | ||
|  | bcbdb81ad1 | ||
|  | a1dfc6483c | ||
|  | 358ad78f13 | ||
|  | 164fe19a4a | ||
|  | 9c45f25e8d | ||
|  | 8af3b1b9fb | ||
|  | 5f92126be4 | ||
|  | 8af5ea6f45 | ||
|  | cde4ef3ddf | ||
|  | 44b4685257 | ||
|  | b89581c900 | ||
|  | c18511ac01 | ||
|  | 6e1b0a0684 | ||
|  | 5b90115b80 | ||
|  | f4c3ad72c4 | ||
|  | 4eb960b16b | ||
|  | f2a7cafc76 | ||
|  | 96647bfa90 | ||
|  | 2d943d4399 | ||
|  | fc0f92a7de | ||
|  | 00340f1d21 | ||
|  | f59179e3bc | ||
|  | 27e6fe0eb2 | ||
|  | 107515e876 | ||
|  | 6a3cadf53d | ||
|  | feea70120c | ||
|  | 549d747a8c | ||
|  | 201076e0fe | ||
|  | 75d33443f0 | ||
|  | b5afda4cce | ||
|  | 7e40790569 | ||
|  | 507565de3d | ||
|  | ad2e5bccab | ||
|  | 077fc80264 | ||
|  | 7e0bc1ef61 | ||
|  | 4392aed3f6 | ||
|  | fe9b1cd542 | ||
|  | 99d9d36549 | ||
|  | 019e8262bb | ||
|  | e89d9d8716 | ||
|  | 6a828ff68c | ||
|  | 31c18321ae | ||
|  | 1763582623 | ||
|  | d0a194e41b | ||
|  | a020f4c097 | ||
|  | 5d8ab39041 | ||
|  | e78a89a112 | ||
|  | 3e440cfad9 | ||
|  | 0266acd77a | ||
|  | 97306a8dc0 | ||
|  | 2598239ccd | ||
|  | 9623b426b0 | ||
|  | 68d122e38d | ||
|  | d93a658666 | ||
|  | 88a2955788 | ||
|  | 2cfa55841a | ||
|  | 8c77493f7a | ||
|  | 2eedf9e7fc | ||
|  | cbda18f8e8 | ||
|  | ce7db89626 | ||
|  | be91cfe3b0 | ||
|  | 99368c5f86 | ||
|  | 38d5f9d753 | ||
|  | 4a6732d816 | ||
|  | 44ce4979d7 | ||
|  | ccd8cdf9ba | ||
|  | ba7987b7ff | ||
|  | 9af8a19922 | ||
|  | f47a481076 | ||
|  | 84096c9bde | ||
|  | 73b7c5222b | ||
|  | 6d435d32d7 | ||
|  | 1fec63c027 | ||
|  | 383fcd00b0 | ||
|  | 5bd534c170 | ||
|  | c71cb51e11 | ||
|  | a8ac7b14d4 | ||
|  | 291d068c66 | ||
|  | 57c1037871 | ||
|  | ca19697d1c | ||
|  | 6d037bbe8d | ||
|  | c3f80c5fa6 | ||
|  | 8b320ece34 | ||
|  | e6f2d1e599 | ||
|  | fbf2ac5d12 | ||
|  | ccdbbc8562 | ||
|  | 5181e9ec14 | ||
|  | c90cdf7678 | ||
|  | 57120ca85f | ||
|  | df27cbefec | ||
|  | 381eefb78f | ||
|  | 969785c47a | ||
|  | 02ae6b6280 | ||
|  | 568c560e61 | ||
|  | c9d6b0dd14 | ||
|  | 4d0954fad5 | ||
|  | 6ff5e64613 | ||
|  | 4100f0744d | ||
|  | 81d4c7c174 | ||
|  | 66ee9806cf | ||
|  | 09b9b308ff | ||
|  | 1e6c7109f3 | ||
|  | 17dc4d48a4 | ||
|  | 3d927d8e8d | ||
|  | 66addd9ebe | ||
|  | f92602a7c1 | ||
|  | ef06d88bd4 | ||
|  | 399180d2cf | ||
|  | 3ec7a262d4 | ||
|  | 8acfa11f94 | ||
|  | 14bee51dbd | ||
|  | 1934cfaafc | ||
|  | a20d1d893c | ||
|  | a29f7b4aae | ||
|  | c73dba2cf0 | ||
|  | d15a9ee20e | ||
|  | 56e330588f | ||
|  | c3ad840e0c | ||
|  | 46e5ac38dc | ||
|  | d662e2dc75 | ||
|  | 3361aa300b | ||
|  | 6741eb17d4 | ||
|  | 44e2c25f5b | ||
|  | e238a9e052 | ||
|  | 3087ca7ae9 | ||
|  | 64226da7cf | ||
|  | 0a5edffcf8 | ||
|  | 3e7ac24bd5 | ||
|  | 80d487a726 | ||
|  | 77cf1c1525 | ||
|  | 2248485801 | ||
|  | ed46bece45 | ||
|  | da858fbe35 | ||
|  | f2f3d5c8a7 | ||
|  | df160cbb2b | ||
|  | 6cd0602536 | ||
|  | 41a78266fe | ||
|  | ef639ba1c1 | ||
|  | 56b3240de7 | ||
|  | e80e0c61d9 | ||
|  | 4398d76a91 | ||
|  | c5784e268e | ||
|  | b6a55f5b9d | ||
|  | 7249809b09 | ||
|  | 892a308e0b | ||
|  | 0507cd9a89 | ||
|  | 60facb4d4d | ||
|  | d7ccdb3897 | ||
|  | 49ddfe9404 | ||
|  | e84f8b4c18 | ||
|  | 973ca20fb6 | ||
|  | 5b5fcd2a88 | ||
|  | 1f20801f2c | ||
|  | fe1a7c6ced | ||
|  | 6d14c00acc | ||
|  | f7cf905f93 | ||
|  | de3e4ef259 | ||
|  | 079f85eab9 | ||
|  | c241d613fe | ||
|  | f346e8289f | ||
|  | de018e95b5 | ||
|  | f5b9baac75 | ||
|  | 8e501b0f7e | ||
|  | 597189adb1 | ||
|  | 6d28ab9d12 | ||
|  | 1090dc13f1 | ||
|  | 8ae50f3852 | ||
|  | b098a4e294 | ||
|  | 89ffcc639a | ||
|  | 35105ddc05 | ||
|  | de42648740 | ||
|  | b1f62f868b | ||
|  | d026b4aa14 | ||
|  | 9a3eeca0cf | ||
|  | 16418ba1f5 | ||
|  | b5b530d1d7 | ||
|  | 9370e764bb | ||
|  | 4f4c4b1cb1 | ||
|  | b77c5cc7ee | ||
|  | 927747e95d | ||
|  | 30b25e56b8 | ||
|  | fff9891177 | ||
|  | 7086b7af99 | ||
|  | bbdc9c3983 | ||
|  | 11ca29b3f6 | ||
|  | b126053e09 | ||
|  | 4d7b5949c1 | ||
|  | 0f752889fd | ||
|  | aca3b38dab | ||
|  | 9c37fa0414 | ||
|  | 1481bf7fa0 | ||
|  | 181a4018be | ||
|  | 3724b25e4c | ||
|  | dfc9a1cb03 | ||
|  | 090d15dda1 | ||
|  | c3fa9b8d79 | ||
|  | 4f9c4c8d27 | ||
|  | a9959a8ed2 | ||
|  | fa9f36bca9 | ||
|  | 4d8fd26ddd | ||
|  | f5a65e98be | ||
|  | 5a4c1f9a61 | ||
|  | 605f8a33f6 | ||
|  | 090fceabbe | ||
|  | 53d9e5f558 | ||
|  | fb3206a9ec | ||
|  | 3bf5efdd64 | ||
|  | 14fc3eff94 | ||
|  | a1cb11b1d8 | ||
|  | 8beb2a3699 | ||
|  | 8b818e82b4 | ||
|  | deb5ef82e1 | ||
|  | 1fc632f097 | ||
|  | ada5ef8bfe | ||
|  | 7deff7e464 | ||
|  | 466192f7fd | ||
|  | cc74131f44 | ||
|  | 4f217788ca | ||
|  | a8557de4d6 | ||
|  | 69b2bd6b6f | ||
|  | bd5698a781 | ||
|  | 7539d38294 | ||
|  | 32f819f16a | ||
|  | cf19a1ee7b | ||
|  | c0b9078a0b | ||
|  | 09a161686c | ||
|  | c7a32d0319 | ||
|  | 5d42d5ad34 | ||
|  | c0a513a1a7 | ||
|  | d1fa008407 | ||
|  | 7d203cda5e | ||
|  | 1846715f47 | ||
|  | 7ee414725c | ||
|  | d0361418cf | ||
|  | b202caec7f | ||
|  | 4bed4bca66 | ||
|  | 61b11585b2 | ||
|  | 671d62d0cc | ||
|  | 33695de84f | ||
|  | 4b99f2768f | ||
|  | 6b4051b984 | ||
|  | a2747e7182 | ||
|  | b36a3661a0 | ||
|  | 8a7dc2e798 | ||
|  | 8c5e95859a | ||
|  | 908a11d268 | ||
|  | 2daeb761b1 | ||
|  | bb67491c2d | ||
|  | c5b3f6daa2 | ||
|  | 8eb675f4a4 | ||
|  | 6a9ca31b8f | ||
|  | f76f662aac | ||
|  | 12c6feb238 | ||
|  | de50f365af | ||
|  | 14575cbb33 | ||
|  | 4530440bd6 | ||
|  | fdbe251c3e | ||
|  | f4d7cebd8a | ||
|  | 113a7a174e | ||
|  | 693b85d0b0 | ||
|  | 9dd6790b2d | ||
|  | ca810d2da1 | ||
|  | da9b3b2add | ||
|  | 5b4443f41f | ||
|  | 4e54061671 | ||
|  | e594478f16 | ||
|  | 6f7903b9ce | ||
|  | ff55cd42ba | ||
|  | 36b34a190b | ||
|  | 18c0827f5a | ||
|  | d49d93b19d | ||
|  | 7ec58be72d | ||
|  | 9bc648f5b8 | ||
|  | 6be6b2626a | ||
|  | 1320479c39 | ||
|  | 84f5c26cd3 | ||
|  | a2fa56c2ad | ||
|  | 49c967885c | ||
|  | 40a62ead01 | ||
|  | 6b7e887ae8 | ||
|  | fb01e4f84f | ||
|  | 6d200ea43b | ||
|  | 8be74f75fd | ||
|  | 785ba26120 | ||
|  | a461c9add7 | ||
|  | 9ab6ed0f11 | ||
|  | e553c9c758 | ||
|  | 42eff40f48 | ||
|  | 87ae42f7fe | ||
|  | c37a19036a | ||
|  | 7d72023ad7 | ||
|  | c72eb9c40e | ||
|  | fd089d78ac | ||
|  | 5b49e3ef7c | ||
|  | 4d97436d14 | ||
|  | 442f0deccb | ||
|  | 483a4d585f | ||
|  | 1bd2bf44bb | ||
|  | 62c927746b | ||
|  | 1cb5b85483 | ||
|  | ea60eb2938 | ||
|  | 032b077bdc | ||
|  | 27b91ad6fa | ||
|  | 1971f36547 | ||
|  | 14cdb8bd31 | ||
|  | a3a847aff6 | ||
|  | 9084c6fd1b | ||
|  | a698ef19cb | ||
|  | 2cdfa358eb | ||
|  | ef91ed6254 | ||
|  | c9b5dc63af | ||
|  | f437e49ed2 | ||
|  | 1c64d0b827 | ||
|  | b48e60ea69 | ||
|  | 7330da14eb | ||
|  | 3823968e95 | ||
|  | a69319b9e4 | ||
|  | 895ca677cf | ||
|  | 481f3f13b3 | ||
|  | c55de2e7ea | ||
|  | 9aa6d8f180 | ||
|  | 29b9e8fdd0 | ||
|  | b106b798eb | ||
|  | f361599dc5 | ||
|  | e31ced26f9 | ||
|  | 416d4a3a45 | ||
|  | 930ce7bf70 | ||
|  | d6dc17553d | ||
|  | d64fab95f4 | ||
|  | 61d0e5b401 | ||
|  | dcf5c019b9 | ||
|  | b8dcf71057 | ||
|  | 25068e9f2d | ||
|  | eab6649474 | ||
|  | 16178ecbac | ||
|  | 3a1e6a51cf | ||
|  | c39e347b28 | ||
|  | 657f31b6bc | ||
|  | 6c2d460aa9 | ||
|  | eb0f04ebd7 | ||
|  | cf5e4e466e | ||
|  | a1677cab63 | ||
|  | 021c696120 | ||
|  | d5cd5e490b | ||
|  | 18d4919386 | ||
|  | 485a294fb4 | ||
|  | acfac42957 | ||
|  | 46dbf2e570 | ||
|  | c151ca3679 | ||
|  | aebf16936c | ||
|  | e420628475 | ||
|  | df940bc035 | ||
|  | c13334c38a | ||
|  | 4248e915b3 | ||
|  | 6cafe6f9c5 | ||
|  | b7563eebc8 | ||
|  | 8288b7d26a | ||
|  | 46f49f4686 | ||
|  | ec189139b6 | ||
|  | 4385d32cf6 | ||
|  | 0d309a158e | ||
|  | 89c406d802 | ||
|  | 75b7b01706 | ||
|  | b377e98dbe | ||
|  | ecda9aac4e | ||
|  | 7e545b7b99 | ||
|  | 9dbc8bccf3 | ||
|  | 5cfc275876 | ||
|  | f0dfc59828 | ||
|  | f3cf8360c2 | ||
|  | 5e7ef3d27a | ||
|  | dd4ab4ec0d | ||
|  | fdbe0c4c37 | ||
|  | 8b3f831bbd | ||
|  | 8309afbbd8 | ||
|  | 22e22185b5 | ||
|  | ad4772ce98 | ||
|  | 5d8088ce8c | ||
|  | cbde0e30f7 | ||
|  | 6c9d7f54d8 | ||
|  | 54f23228f8 | ||
|  | 1c557e3f63 | ||
|  | 70172e2a98 | ||
|  | 310a39cd3a | ||
|  | 27fe4304b6 | ||
|  | 4d15f1eb10 | ||
|  | 6c75e81cb7 | ||
|  | f86132fbb1 | ||
|  | a0c331fbd4 | ||
|  | 7422040057 | ||
|  | 3bbdc89d6b | ||
|  | 04caf5b569 | ||
|  | 5721938ea2 | ||
|  | 04a0f81129 | ||
|  | 1e7632abe7 | ||
|  | bd167224cb | ||
|  | 068ae16f50 | ||
|  | 3d74da20e0 | ||
|  | 9533b4b1ba | ||
|  | 86e53ab31d | ||
|  | 1731e68364 | ||
|  | f53c7b82ef | ||
|  | 08225b7e1f | ||
|  | ebf1802374 | ||
|  | c848ad8063 | ||
|  | 9e3fdd0922 | ||
|  | d0ed795da2 | ||
|  | c471549e0d | ||
|  | 42fb9cd0aa | ||
|  | e29c00477b | ||
|  | b6b5254c80 | ||
|  | 4e14121dbd | ||
|  | 06c5fc7af5 | ||
|  | e653f84891 | ||
|  | f497a3a658 | ||
|  | ac0baae856 | ||
|  | 7a042222db | ||
|  | 5ed957b628 | ||
|  | 0dda0201ba | ||
|  | da27eaee98 | ||
|  | 104e966604 | ||
|  | 7a7896b3f1 | ||
|  | 3da57e5351 | ||
|  | acf90b3d7d | ||
|  | d3b220ab50 | ||
|  | 8086251ef5 | ||
|  | a703350639 | ||
|  | e030c693b4 | ||
|  | 19f308ee52 | ||
|  | 2dadcfe4e6 | ||
|  | 3aeeed7951 | ||
|  | 39dacc0b20 | ||
|  | 3a01fa9011 | ||
|  | ffaf9e8aae | ||
|  | 4c65ce4df4 | ||
|  | d4f1c04f07 | ||
|  | c02b19f3eb | ||
|  | 86bbb552c5 | ||
|  | a19b770b9f | ||
|  | e2e2e34f74 | ||
|  | d2a2f5d702 | ||
|  | 9d1ebec018 | ||
|  | ae868f6525 | ||
|  | 99480dc8d3 | ||
|  | 81dbd135e2 | ||
|  | 6633182efe | ||
|  | 2129a8ad8b | ||
|  | 24d16e65d3 | ||
|  | 8f2ac6ed81 | ||
|  | b18e9ce7ae | ||
|  | 30dad1ee7d | ||
|  | cda8a68794 | ||
|  | 33831736a9 | ||
|  | a0170b974d | ||
|  | a009c8379a | ||
|  | d66ff0ede0 | ||
|  | ce1d5ccb5d | ||
|  | 361a857ccd | ||
|  | a024aa6931 | ||
|  | 20408bb71f | ||
|  | b16d4a8af9 | ||
|  | 8f3dc49a76 | ||
|  | 024efa9bcb | ||
|  | a6122f481d | ||
|  | f1b4729b63 | ||
|  | aebe3d75d7 | ||
|  | 05959f7e24 | ||
|  | 8614b5a369 | ||
|  | 7be3016bfa | ||
|  | 72d6e63edc | ||
|  | 7dca4813ed | ||
|  | ab11967a8e | ||
|  | 189186c988 | ||
|  | d1f6348ef3 | ||
|  | 328cff225d | ||
|  | fe682e7a2b | ||
|  | 0631d8ea2e | ||
|  | e995c30eea | ||
|  | 8d4fa0c81d | ||
|  | 3808155201 | ||
|  | 529e0ddccf | ||
|  | 106535fc01 | ||
|  | f053a06231 | ||
|  | 00d90dc8b7 | ||
|  | 999f6190dc | ||
|  | b4d4c3d46b | ||
|  | a63bc61f4a | ||
|  | d66760f9c2 | ||
|  | 76dfe48114 | ||
|  | 23fae77443 | ||
|  | 0e31e19472 | ||
|  | 8e09ea8efc | ||
|  | 0bd31e965d | ||
|  | 34e50b6406 | ||
|  | fb97afe39a | ||
|  | 8ad3292630 | ||
|  | 812e085795 | ||
|  | d0cafeea6d | ||
|  | 4a88944b9c | ||
|  | f3570acc61 | ||
|  | e210352339 | ||
|  | da6bbc2a40 | ||
|  | cada8f6972 | ||
|  | 663cb21eb2 | ||
|  | 8cd4546f9d | ||
|  | 4030225304 | ||
|  | 5b266397ee | ||
|  | b5bfc24916 | ||
|  | 3e9090c6a4 | ||
|  | 2147a1dea8 | ||
|  | a8f83afbf8 | ||
|  | c16559ea1e | ||
|  | 7c6a898bf0 | ||
|  | 84689f602b | ||
|  | e8d89279d6 | ||
|  | 789a5673e3 | ||
|  | cef67555bf | ||
|  | b30ce1c9a2 | ||
|  | 8615e4cb34 | ||
|  | f2d0a09dc8 | ||
|  | 7a04aba3f9 | ||
|  | bc2e68207f | ||
|  | fd9260cc74 | ||
|  | 6f0fbde825 | ||
|  | c8f6b546cb | ||
|  | 341643a87e | ||
|  | 452952670b | ||
|  | 54bcd5979a | ||
|  | 0770065a43 | ||
|  | 0b040a2192 | ||
|  | cc748e1c99 | ||
|  | 97b1cc0f8d | ||
|  | 8aa991ae07 | ||
|  | 5a43d51436 | ||
|  | 590dfcc348 | ||
|  | e2e347bd14 | ||
|  | 4e8a30948d | ||
|  | d61ad0c909 | ||
|  | 87a038b0ed | ||
|  | ebf652932a | ||
|  | 8bd754064e | ||
|  | 8bce4caa97 | ||
|  | acd7915be4 | ||
|  | 5f6e420460 | ||
|  | d8b1251dd8 | ||
|  | 495cea8064 | ||
|  | 89390fa3ff | ||
|  | a887fb8adf | ||
|  | ecd6a00c35 | ||
|  | e75b6b8459 | ||
|  | bc296e0cb9 | ||
|  | c87cff02f7 | ||
|  | 413219ac7a | ||
|  | b6189a2eda | ||
|  | 9c4423b8bc | ||
|  | 0ac5a99433 | ||
|  | 1b95c37826 | ||
|  | cec0cf34e4 | ||
|  | 152defa377 | ||
|  | 499a57880f | ||
|  | 0dbf18c751 | ||
|  | 6a91ea51c9 | ||
|  | 421c7ee0a5 | ||
|  | e08c522066 | ||
|  | 2d71a56011 | ||
|  | 50ab3b2edd | ||
|  | 230ce1822f | ||
|  | df8ef12198 | ||
|  | edfe9b2c2b | ||
|  | 448e057ae8 | ||
|  | b042f60e41 | ||
|  | 08a91c64db | ||
|  | f17509d6d7 | ||
|  | 021f60b7d7 | ||
|  | 6039674de8 | ||
|  | a4476570bd | ||
|  | 7df0f128a3 | ||
|  | 74e78c8e59 | ||
|  | 36f401b165 | ||
|  | 892cae075f | ||
|  | 30f19c6431 | ||
|  | c67611f204 | ||
|  | 0bed36e832 | ||
|  | e45ebaa025 | ||
|  | fcef2eb44b | ||
|  | 8ce27cbc55 | ||
|  | d121bb6a73 | ||
|  | e709e1e74f | ||
|  | a10971e126 | ||
|  | 04c47c0387 | ||
|  | 6a9ce60c47 | ||
|  | 93efa0608a | ||
|  | 7c8a9a28d7 | ||
|  | 47f0099020 | ||
|  | 1fb3f7cb5e | ||
|  | bf784f05ea | ||
|  | 8539bd5d75 | ||
|  | ff8665fbc4 | ||
|  | eee3818332 | ||
|  | 6be2744b49 | ||
|  | 46b9e57ed1 | ||
|  | d62b0bafac | ||
|  | bfef93c8a8 | ||
|  | e7d30c38cd | ||
|  | 780b520878 | ||
|  | c9f8b5939c | ||
|  | 2114486851 | ||
|  | 59061827f1 | ||
|  | 180e43924a | ||
|  | c3674e7e5a | ||
|  | 1218923012 | ||
|  | 0f7842c5c2 | ||
|  | b49521cf3a | ||
|  | 8a7e27b58f | ||
|  | 9493853fe4 | ||
|  | f8e91898af | ||
|  | 7036ed9bc8 | ||
|  | 68bdd92126 | ||
|  | 5bac0e1183 | ||
|  | d23eb73948 | ||
|  | 403dfeb725 | ||
|  | be1b24568a | ||
|  | 38a6ace8d2 | ||
|  | a1c7972f9d | ||
|  | 0222a26313 | ||
|  | 8564a6881e | ||
|  | 580fbf1366 | ||
|  | 567923139d | ||
|  | 3d7d4655f5 | ||
|  | b9afe898b3 | ||
|  | 4234539e65 | ||
|  | 4214ccd49c | ||
|  | dd0c6cf1ef | ||
|  | 8e293e0d9b | ||
| 01bb09da30 | |||
|  | 1e5085f4cc | ||
|  | 467a5d789b | ||
|  | 4c080b7b19 | ||
|  | 31e79f88a3 | ||
|  | bc26d3af46 | ||
|  | 81dee66f6c | ||
|  | 0cc8626866 | ||
|  | 7652208a74 | ||
|  | 1344fa92fe | ||
|  | 11e3bc06f0 | ||
| b2fde1c419 | |||
| 0c65313b35 | |||
|  | 28856c980c | ||
|  | 249917b3d9 | ||
|  | cea33b109f | ||
|  | 6302d125e8 | ||
|  | 0a0913d922 | ||
|  | 7aaf9cd6be | ||
|  | 093d46ee4e | ||
|  | d433c503e4 | ||
|  | 841c67b51d | ||
|  | 993db9585e | ||
|  | 870d2b27bc | ||
|  | d111a4b95c | ||
|  | 708a2193b0 | ||
|  | 670ceae73c | ||
|  | a17182c918 | ||
|  | f9e2fa0222 | ||
|  | bb07c913aa | ||
|  | 7e5b68818f | ||
|  | 695b30855e | ||
|  | 29db1a13cc | ||
|  | e977b079a8 | ||
|  | ea04b618cd | ||
|  | 6c237e8f2f | ||
|  | 5f355e47f1 | ||
|  | addb18b2ef | ||
|  | 4846762d37 | ||
|  | dff66dca3e | ||
|  | 89a7eb3441 | ||
|  | 609b6edbba | ||
|  | be3eca952d | ||
|  | 8fbf846ff9 | ||
|  | ddee2e82b3 | ||
|  | 8d52238a6f | ||
|  | ea5850fb70 | ||
|  | 6a58457c36 | ||
|  | 47596137ec | ||
|  | 124b588a66 | ||
|  | 4670ffee85 | ||
|  | 6a5078dbb7 | ||
|  | 2c89032a7e | ||
|  | bf508e8cb8 | ||
|  | d000c5f394 | ||
|  | c2badb66e2 | ||
|  | 8d3a4ad6c2 | ||
|  | 081effb3b3 | ||
|  | 12331f8970 | ||
|  | 4333cfa0ab | ||
|  | 93b364f049 | ||
|  | 27f208561e | ||
|  | 37893bb106 | ||
|  | 6a79f09476 | ||
|  | 377e1b8f93 | ||
|  | 561d24bade | ||
|  | 23b1b47a7d | ||
|  | fba1d515b2 | ||
|  | 35ad7b031d | ||
|  | 5f67f637d3 | ||
|  | ff75533025 | ||
|  | 6ddadfe53c | ||
|  | 182015e843 | ||
|  | 3f97c9e17e | ||
|  | 5320115e13 | ||
|  | f1f3e6fe5a | ||
|  | 7e5c3c78e6 | ||
|  | 0da7a3e74a | ||
|  | 996c5ab75a | ||
|  | b1d8a3c1ca | ||
|  | 9c4d0868cf | ||
|  | 2f30da9156 | ||
|  | e61cc019e8 | ||
|  | 0bed825f70 | ||
|  | ffeb1b182d | ||
|  | a6141078e0 | ||
|  | c68babb4d0 | ||
|  | 77159304aa | ||
|  | bddfa88823 | ||
|  | 5b41cd85e0 | ||
|  | deb90a8574 | ||
|  | a8547275bd | ||
|  | a10ec22c99 | ||
|  | be61bf2166 | ||
|  | d5f31cbe97 | ||
|  | 470cb4d398 | ||
|  | 982612a1e7 | ||
|  | 3d84a3afe7 | ||
|  | 2c49e28a58 | ||
|  | d5d7314af5 | ||
|  | 05453ed16d | ||
|  | 51185a43ee | ||
|  | e45f6ee040 | ||
|  | e3297fead4 | ||
|  | 543df34425 | ||
|  | 76ccc36824 | ||
|  | d0965fddfe | ||
|  | d4d662a201 | ||
|  | 40e2d71db4 | ||
|  | cd2f56db4f | ||
|  | 443ec1b082 | ||
|  | 46c6bc67ec | ||
|  | 18af0281b1 | ||
|  | b947d4236d | ||
|  | 1abd4c49b0 | ||
|  | a7072daf4a | ||
|  | 22f3a52a14 | ||
|  | cfcbef14c5 | ||
|  | 2193c950d9 | ||
|  | 5eeef42174 | ||
|  | 34e23beaeb | ||
|  | e419339c10 | ||
|  | ba6e3a0c95 | ||
|  | a6401b44b2 | ||
|  | 81e3a86776 | ||
|  | feb76e4d63 | ||
|  | 28ec0d0ef9 | ||
|  | 15fa0bfd38 | ||
|  | ce36a373eb | ||
|  | 38bc07f0fd | ||
|  | 9793ac502f | ||
|  | 00ee02ccb9 | ||
|  | 4cd0fa249c | ||
|  | 66c4ed2b79 | ||
|  | eda173a5a7 | ||
|  | e7006873ca | ||
|  | 1d0f10ddca | ||
|  | c81e461cb5 | ||
|  | a1f9f71d31 | ||
|  | 79eb498a83 | ||
|  | fb89cb1a8d | ||
|  | 90fa4f53f8 | ||
|  | ba22e5f039 | ||
|  | 894f3b7952 | ||
|  | 5aff9d6bc2 | ||
|  | 565d053224 | ||
|  | ee7f70734b | ||
|  | 7d3169b077 | ||
|  | fd33eb238d | ||
|  | 22494d28d3 | ||
|  | e95986c93a | ||
|  | a63e704b1e | ||
|  | 5aa5438dd6 | ||
|  | 7cc92ee011 | ||
|  | 642276cbdc | ||
|  | 039cfb5673 | ||
|  | a176ee54fa | ||
|  | 825c7210e2 | ||
|  | 14abc276c3 | ||
|  | a6b5c47251 | ||
|  | 26ad1124bf | ||
|  | b576a61551 | ||
|  | 275461a474 | ||
|  | d9e4901336 | ||
|  | 66ad57066a | ||
|  | af3ad4ff63 | ||
|  | 7850eb9bb9 | ||
|  | feaa79e1b1 | ||
|  | 904d6f8c49 | ||
|  | b6f0b27b9b | ||
|  | 9ca7094ee4 | ||
|  | c6487873b8 | ||
|  | a6e46660cc | ||
|  | 31f41cbff5 | ||
|  | 725c68ad18 | ||
|  | 2d62200297 | ||
|  | 29495c0ee3 | ||
|  | 554db4fe72 | ||
|  | 39707d88d5 | ||
|  | c42f6006b8 | ||
|  | b69b0e878a | ||
|  | a37da5cfd0 | ||
|  | 83210f5501 | ||
|  | 81a7a77f2c | ||
|  | 17463ed691 | ||
|  | 793c384d58 | ||
|  | 5595f0295d | ||
|  | 8a478fa108 | ||
|  | f14212d1a3 | ||
|  | 44e142d935 | ||
|  | 36a795c585 | ||
|  | d2aa32ee18 | ||
|  | 890d263017 | ||
|  | 4ff8f5c9e1 | ||
|  | 377c48d4a0 | ||
|  | c29791c904 | ||
|  | 489c36ac00 | ||
|  | fef2f1d781 | ||
|  | e3d316d374 | ||
|  | f7fc731773 | ||
|  | 94a6972bda | ||
|  | 838f61b16e | ||
|  | 1a9be3bc1a | ||
|  | 36a1e17314 | ||
|  | aa29336164 | ||
|  | e19b9bcc4a | ||
|  | 8fe8b65535 | ||
|  | 3277618a05 | ||
|  | 2833cd589a | ||
|  | 02e4b80ba1 | ||
|  | 5e9f44e5c4 | ||
|  | 8a830a53d9 | ||
|  | 30a77df14e | ||
|  | d707dea56b | ||
|  | 3aa20736a5 | ||
|  | c61941e6ba | ||
|  | 8b2c78636e | ||
|  | 36a4e6a533 | ||
|  | 7f5cb892af | ||
|  | e03f33a334 | ||
|  | 8379a5be40 | ||
|  | 79539038b7 | ||
|  | 7083bf34a6 | ||
|  | 992cf9a870 | ||
|  | 4db8bb7001 | ||
|  | bab8ba857e | ||
|  | 8f89d2355f | ||
|  | 5848c05c9c | ||
|  | 07fbf08f78 | ||
|  | 4185ce15ae | ||
|  | 2235f5411c | ||
|  | f47f9ad336 | ||
|  | dc91f5b104 | ||
|  | 372d69ea85 | ||
|  | b7647d87bc | ||
|  | 4d3f12785c | ||
|  | fde725abb2 | ||
|  | 0e09eea6cf | ||
|  | a6bad0cba2 | ||
|  | a271861fb1 | ||
|  | be0e713f5b | ||
|  | 3b5d99072a | ||
|  | ae15375d55 | ||
|  | d9082683cc | ||
|  | 4b31a9bbbc | ||
|  | 741460d55b | ||
|  | 9ca1f09fc5 | ||
|  | e270cb25ee | ||
|  | c8429cac20 | ||
|  | 7e51b443c2 | ||
|  | 09f9256f06 | ||
|  | 7f33c522ea | ||
|  | da8c1bdaf2 | ||
|  | 0f122aad76 | ||
|  | 7c19380b22 | ||
|  | 599c04ab62 | ||
|  | 0bafb6ad26 | ||
|  | dd764c99ff | ||
|  | 97fd249134 | ||
|  | 4a434b4009 | ||
|  | cc3af06617 | ||
|  | 01c48a1cd6 | ||
|  | f42b272636 | ||
|  | bebb4bbf04 | ||
|  | e8ff014598 | ||
|  | 240b1537da | ||
|  | c561494d7b | ||
|  | a4ce4af297 | ||
|  | 4d3c2ec149 | ||
|  | 3279bdb348 | ||
|  | 2d6094153e | ||
|  | fed26bc925 | ||
|  | 5f715dedb2 | ||
|  | 0028854ea5 | ||
|  | 632ae0c86c | ||
|  | fc017fcc5a | ||
|  | 8138515a4c | ||
|  | c2a4261ac4 | ||
|  | c17bdd2b2f | ||
|  | 66ec58a21e | ||
|  | 5f320d5a3b | ||
|  | 553b49eb13 | ||
|  | d3c4d69781 | ||
|  | 9b4b16fc57 | ||
|  | c91826f741 | ||
|  | 69e419d9cf | ||
|  | e20a06fa4f | ||
|  | a9ad0a47ae | ||
|  | 370f0093ff | ||
|  | 35ee47189f | ||
|  | 0314be9515 | ||
|  | 883ec09a0e | ||
|  | d12c7b2c5e | ||
|  | 02a4b50fc0 | ||
|  | 5030e55f84 | ||
|  | 5e27020f77 | ||
|  | dc13def187 | ||
|  | 4e9be55405 | ||
|  | 127c018d83 | ||
|  | 3835a9a470 | ||
|  | 28f52973f3 | ||
|  | 7a936f8a9f | ||
|  | 6b55a574d8 | ||
|  | 1182f5b3af | ||
|  | 6858e8eca6 | ||
|  | fe3e06e654 | ||
|  | 78e9e20a5d | ||
|  | 394975f4d5 | ||
|  | 57107ae4ad | ||
|  | b4ae677932 | ||
|  | 4ab84b7766 | ||
|  | 7f4607c3ba | ||
|  | 823e382748 | ||
|  | b1ae10b570 | ||
|  | 82baab5401 | ||
| 8bf6c57668 | |||
|  | 5e4bd93238 | ||
|  | 5f4aa6034f | ||
|  | 101d67ad48 | ||
|  | 7d2fded062 | ||
|  | a79a165d60 | ||
|  | ddd4bfc033 | ||
|  | ae1edfe384 | ||
|  | 44ffb4f607 | ||
|  | 060900ebc7 | ||
|  | 8673ab0197 | ||
|  | bc30cc3e03 | ||
|  | 0de2f5ecf4 | ||
|  | ee933c3460 | ||
|  | 243def0a2f | ||
|  | 991310f9b8 | ||
|  | 30b9a137c2 | ||
|  | 2320fcd462 | ||
|  | 288e652f93 | ||
|  | 9b845a04bf | ||
| 2362f194cf | |||
|  | 2bf45e799f | ||
|  | d28e02d004 | ||
|  | c7e7ab69ea | ||
|  | fe1639c89d | ||
| d1219caea7 | |||
| bdbff3c9bd | |||
|  | 68a7c57e0b | ||
| e968059ecd | |||
|  | c5f9f3f3b0 | ||
|  | cc96fa6d65 | ||
|  | 4ac0d0b7d8 | ||
|  | b4a5343ce6 | ||
|  | a07cd5f295 | ||
|  | e73c339a99 | ||
|  | 92b94b2289 | ||
|  | d7c406b0e9 | ||
|  | 6f8b6a01a1 | ||
|  | 9e4bcaa6a4 | ||
|  | df45607495 | ||
|  | 99fab7d22b | ||
|  | c3d404dcbf | ||
|  | 9fc84a5ebf | ||
|  | ffc48ff3fa | ||
|  | dea5786a85 | ||
|  | 851e7a1bbb | ||
|  | 6542952597 | ||
|  | c9cc263d52 | ||
|  | 2f54bd3054 | ||
|  | 34dd1da3f5 | ||
|  | 0cd43bc229 | ||
|  | ce5e2a3330 | ||
|  | 5ca7516c5e | ||
|  | d2961c2760 | ||
|  | 262897223b | ||
|  | 33034b6db2 | ||
|  | bb192c6e68 | ||
|  | 654cc3e644 | ||
|  | dc607c2c91 | ||
|  | ec06d22c00 | ||
|  | 74f7f7a340 | ||
|  | 9bf9905bf7 | ||
|  | 31d7c5b75d | ||
|  | 874851f6ee | ||
|  | eb8862ad1f | ||
|  | ecd5c5c4bd | ||
|  | 43565daed4 | ||
|  | 50631a3e36 | ||
|  | b2b85d4f2d | ||
|  | e7d1bd2af0 | ||
|  | 35498105ec | ||
|  | 13e503cc55 | ||
|  | 29dba7eab7 | ||
|  | d39f1d793b | ||
|  | 120e10d348 | ||
|  | 8e7a8488b3 | ||
|  | 8252fca39f | ||
|  | 32a02f04bd | ||
|  | b20b9bd30c | ||
|  | c48d86ee42 | ||
|  | 33107d6a6e | ||
|  | 9ce1c89d90 | ||
|  | a4311f7acd | ||
|  | 48cbeefa39 | ||
|  | 97520a33ea | ||
|  | 265ec48919 | ||
|  | c56e8127d7 | ||
|  | 8031358f60 | ||
|  | 10cea217bf | ||
|  | 4466f66584 | ||
|  | 2e9cd1c5a9 | ||
|  | 4b560896f6 | ||
|  | 6055ddb90f | ||
|  | 85ae4d8036 | ||
|  | 9383a41500 | ||
|  | f016cd338c | ||
|  | 3af39ca6a9 | ||
|  | 5089b071dd | ||
|  | 07ce838056 | ||
|  | 7e00aa30a9 | ||
|  | 8fa66aeed5 | ||
|  | 791c3a72fd | ||
|  | b09d4980c2 | ||
|  | 37d61417ad | ||
|  | 5f691befb0 | ||
|  | 33babd6b2f | ||
|  | 4e5c201cd2 | ||
|  | 309b1cdffa | ||
|  | 8bd0f97911 | ||
|  | c4caac27f7 | ||
|  | caa7c809ab | ||
|  | fc40512a8e | ||
|  | 73980d8dde | ||
|  | 5f46e2f3d0 | ||
|  | 965a3552c8 | ||
|  | d13d61a17d | ||
|  | 7f5fcdadb6 | ||
|  | 6021b64cd7 | ||
|  | dfbc0ee705 | ||
|  | b71845155e | ||
|  | ad01c3f8f7 | ||
|  | 37dfaf7a6d | ||
|  | c9ab9f853d | ||
|  | 062eb8eb5f | ||
|  | 7fb28c7fd4 | ||
|  | e79d98d623 | ||
|  | cb2d64f92a | ||
|  | 48dc4a3d33 | ||
|  | f1534ffc71 | ||
|  | 7edeb5124e | ||
|  | 7b085f916b | ||
|  | 7aef39843a | ||
|  | 4098093a1c | ||
|  | 3f87bffd17 | ||
|  | 14cd66cf13 | ||
|  | 5acb635f6b | ||
|  | 7d111f90e4 | ||
|  | cbc57959e3 | ||
|  | c56e28081a | ||
|  | 5237a6edbb | ||
|  | 4f5963697b | ||
|  | eae8459ca5 | ||
|  | 3efb7f43d2 | ||
|  | ee8dda577b | ||
|  | 87e7fa45ce | ||
|  | d6cdc715b5 | ||
|  | d04559427e | ||
|  | d11670366d | ||
|  | 3e393880b1 | ||
|  | 9c9146ca8c | ||
|  | 22174f431d | ||
|  | ea5e35d8b4 | ||
|  | e0b7c76b9a | ||
|  | 3284aaca02 | ||
|  | c9db239b23 | ||
|  | 8806c1357f | ||
|  | dbe55db84d | ||
|  | 9dbe2fde3f | ||
|  | e7301e6cb9 | ||
|  | a86f37ecfc | ||
|  | 531ab674f3 | ||
|  | 31cbb5d2bf | ||
|  | 96acf75571 | ||
|  | f09c27abb2 | ||
|  | ccea7494e6 | ||
|  | 856b27fd33 | ||
|  | 19b2ec07d9 | ||
|  | 19fde2b445 | ||
|  | 8c3c5f8876 | ||
|  | 042139091a | ||
|  | 1a318d4d2a | ||
|  | 225b2eb035 | ||
|  | a477039f7c | ||
|  | 1b63596355 | ||
|  | 69f4fe5f36 | ||
|  | 056730c338 | ||
|  | cb549dd492 | ||
|  | 0f8859cf3c | ||
|  | 1d4e69460a | ||
|  | bdf6459fd6 | ||
|  | 6e5657e446 | ||
|  | 1f41eb6acc | ||
|  | 9e80281542 | ||
|  | 26d1fbf8be | ||
|  | 75e646832b | ||
|  | a12ea7d641 | ||
|  | aeb4fcd452 | ||
|  | a62913ee6c | ||
|  | b1a8a70bdd | ||
|  | 549ef25edf | ||
|  | fd70858523 | ||
|  | 850dd34da9 | ||
|  | ee67948bc0 | ||
|  | 7561f7af27 | ||
|  | 6813e9d75b | ||
|  | ef51d99f66 | ||
|  | b482e6d691 | ||
|  | 91cbb0928b | ||
|  | 1e9ac9d65a | ||
|  | 2757dcf19c | ||
|  | f895172405 | ||
|  | a9351c58d3 | ||
|  | 0d5ae1bf0c | ||
|  | 84605fd1e7 | ||
|  | 9209ac9fae | ||
|  | e78cdbe81d | ||
|  | f178667db8 | ||
|  | fb0354221d | ||
|  | bda2b10c7f | ||
|  | 719a45a4c2 | ||
|  | 69eead6c28 | ||
|  | 40a2cb39b8 | ||
|  | 657dcea2a1 | ||
|  | 5d6d98abc2 | ||
|  | 0d3d163aec | ||
|  | a83b4746f9 | ||
|  | 458b41b5f6 | ||
|  | 3c04ca7c5a | ||
|  | 81d437399c | ||
|  | cc3fc6a8bd | ||
|  | bd41857962 | ||
|  | ff4f83959a | ||
|  | 46d5a004d4 | ||
|  | 3f49a771c5 | ||
|  | 9fddbc5e6a | ||
|  | d3036b3b89 | ||
|  | 1e59444e0e | ||
|  | 1fa3081b08 | ||
|  | ec1860cece | ||
|  | cc1dc9173d | ||
|  | 025eb8e865 | ||
|  | 3e5acf655e | ||
|  | bf31cb10da | ||
|  | ffcf343915 | ||
|  | 86e99e0c74 | ||
|  | f0e20994a2 | ||
|  | 9739073178 | ||
|  | 07f27ac44c | ||
|  | 281acb69be | ||
|  | 6bf1d00455 | ||
|  | 290bb93b49 | ||
|  | f7bf8f8f35 | ||
|  | d93ae197e3 | ||
|  | 2dee5e3b37 | ||
|  | 5d95afe99d | ||
|  | 9bb702549e | ||
|  | 5360102236 | ||
|  | e6cebd42b3 | ||
|  | 6f41acf447 | ||
|  | c7c8f1d72e | ||
|  | 8f8e8afa83 | ||
|  | 6fae11838c | ||
|  | 6577e406a4 | ||
|  | 53aeb4c43a | ||
|  | 8c85768a4d | ||
|  | f7de5fc391 | ||
|  | c0d80e528e | ||
|  | 361012c80e | ||
|  | 8832a8365c | ||
|  | fa2e1968bb | ||
|  | 91ac09a2e3 | ||
|  | f1b35354dc | ||
|  | 34694492b9 | ||
|  | b1b35b05cf | ||
|  | 1c8d53cec5 | ||
|  | 8efb289cc4 | ||
|  | b2ddce303f | ||
|  | ade9638c13 | ||
|  | c762999f67 | ||
|  | 026fd37a22 | ||
|  | 7691c392e4 | ||
|  | 32f8cbf995 | ||
|  | 2894dac5d8 | ||
|  | 99f086a75a | ||
|  | 6eac863f34 | ||
|  | e917c16c2c | ||
|  | bb3015f626 | ||
|  | a9e63cca54 | ||
|  | f753f534a4 | ||
|  | 046715d4b6 | ||
|  | cfb0177a45 | ||
|  | 12b3a48baa | ||
|  | e710fc4604 | ||
|  | edc371ed30 | ||
|  | 54f1356756 | ||
|  | e02fcd6a08 | ||
|  | 2ac19ef81f | ||
|  | 10d9d5ee65 | ||
|  | c8fd7fa5f2 | ||
|  | f9f2812344 | ||
|  | f9411b7278 | ||
|  | 2f01516cff | ||
|  | 1940a24a05 | ||
|  | 0a9ce48880 | ||
|  | 3bec4fc26d | ||
|  | d9499cae4a | ||
|  | a2207a781f | ||
|  | c3d761d05f | ||
|  | 4fd7e4ee2a | ||
|  | 9f9eb7d23a | ||
|  | ab3604d613 | ||
|  | f210317222 | ||
|  | 5a56b3be3f | ||
|  | 7c1aedd461 | ||
|  | 2a7dec2811 | ||
|  | 0530e553eb | ||
|  | 2b33f221d6 | ||
|  | 6c1167a98a | ||
|  | 464a12ad1e | ||
|  | f431ddb5f8 | ||
|  | 1295278175 | ||
|  | fe87373cfb | ||
|  | 30078c1755 | ||
|  | c11b74d689 | ||
|  | ac5400fb6c | ||
|  | 919612648a | ||
|  | c78b43c01c | ||
|  | bfd0b7767b | ||
|  | 0067f9ecbc | ||
|  | 3ede04c0c3 | ||
|  | 36f979a67a | ||
|  | 2f42c353e4 | ||
|  | 28d958ecc9 | ||
|  | 880a144cc1 | ||
|  | 7857bfab40 | ||
|  | 0303017f2b | ||
|  | ab4692b655 | ||
|  | b26eb2e1dc | ||
|  | 88e9c450b5 | ||
|  | 08c8fe0366 | ||
|  | 0284997d6a | ||
|  | b03ba3b988 | ||
|  | 298bae5301 | ||
|  | 39a4916939 | ||
|  | 77bd0c256f | ||
|  | 3ba14427a5 | ||
|  | ac869994a7 | ||
|  | 3f30a1cbd1 | ||
|  | 2421df4995 | ||
|  | 71261b4a82 | ||
|  | 9df5e447eb | ||
|  | 9b25a8fa0e | ||
|  | e898b55fa3 | ||
|  | f740372e71 | ||
|  | 8f73ddb063 | ||
|  | 90fed1bae2 | ||
|  | 4d5b7f3664 | ||
|  | cb7493c6c9 | ||
|  | 9c69aab95c | ||
|  | c228aaa7af | ||
|  | a8d4dede1d | ||
|  | b07607a932 | ||
|  | 962ea61fa5 | ||
|  | 57e8a411c2 | ||
|  | 2a48e816f4 | ||
|  | 97611a8dc8 | ||
|  | ce113372e8 | ||
|  | f204f3fff3 | ||
|  | aa9a3a92f1 | ||
|  | edddb02dfe | ||
|  | 407c1a8db0 | ||
|  | 7d265446c4 | ||
|  | 575606766f | ||
|  | 4a0f4535d0 | ||
|  | 06e75084bb | ||
|  | 89a22c82c9 | ||
|  | 1bbb14bf5d | ||
|  | b082164ff6 | ||
|  | 2a0b67be09 | ||
|  | e437812fd5 | ||
|  | fb0291ff99 | ||
|  | fd90a48b9c | ||
|  | ba1fdf332b | ||
|  | c1ca2fa181 | ||
|  | 8549f68fbd | ||
|  | b597eb5916 | ||
|  | 646902cc53 | ||
|  | 48535c313e | ||
|  | 368a490502 | ||
|  | 8f5cf47c75 | ||
|  | 3a4dabae4e | ||
|  | e608ab6204 | ||
|  | 45b4c5ad24 | ||
|  | a2d506a56d | ||
|  | d97f650fb5 | ||
|  | 4c6142d0b6 | ||
|  | 5ed1532762 | ||
|  | 368ec56181 | ||
|  | 65455afb58 | ||
|  | 21d32a888d | ||
|  | 8da835bd0b | ||
|  | 843a5b83c5 | ||
|  | a8347e622d | ||
|  | ef3c99e086 | ||
|  | 0acae3b222 | ||
|  | 73442de46c | ||
|  | 8a73e9cb2c | ||
|  | b13b8a0ded | ||
|  | 9c05b0d79c | ||
|  | 5dfa42880e | ||
|  | 9af93d42f7 | ||
|  | 58def567cd | ||
|  | b944c0f25f | ||
|  | 5e2fcdea28 | ||
|  | adee39f37f | ||
|  | d00b876181 | ||
|  | 039d65c94d | ||
|  | 39849cea5a | ||
|  | 2e13f43057 | ||
|  | aff79a6d5f | ||
|  | f90c7c2c6f | ||
|  | 7c49db0a33 | ||
|  | 5992e78365 | ||
|  | 71e7bb68ab | ||
|  | ff684ffe83 | ||
|  | 854fb197bb | ||
|  | 6716deb004 | ||
|  | b631420500 | ||
|  | 43527038aa | ||
|  | 419469b52d | ||
|  | b206dfa77f | ||
|  | 7ef87ef44f | ||
|  | 45432afb6f | ||
|  | 4daab388ab | ||
|  | a50e13a8df | ||
|  | dd662e8d22 | ||
|  | ece325a45e | ||
|  | f7de989f59 | ||
|  | 3be7075a08 | ||
|  | 2ca0518c98 | ||
|  | 60a8791e92 | ||
|  | 1f9295f1a7 | ||
|  | 769d69b8be | ||
|  | 6e12c5d4ce | ||
|  | fcda3b5e8e | ||
|  | d4692f883d | ||
|  | a08f2525ee | ||
|  | 5ad966a025 | ||
|  | b2f9169f9f | ||
|  | 54d4ebcd4d | ||
|  | c661413585 | ||
|  | 87739cf75e | ||
|  | 3ef31d3631 | ||
|  | 398e0890ba | ||
|  | b70bff5807 | ||
|  | 15f5d59794 | ||
|  | 25edd8b7df | ||
|  | 34ca42cfa3 | ||
|  | efd31eaaa5 | ||
|  | de4eccb8c8 | ||
|  | 7368889731 | ||
|  | 1c38847eff | ||
|  | e68efdd6fe | ||
|  | e0a0cea985 | ||
|  | 6d5eeb2174 | ||
|  | 4700c71a44 | ||
|  | 552c91eb23 | ||
|  | cf582b359a | ||
|  | 1ec38cb03d | ||
|  | 05129aa200 | ||
|  | 57abf72ecd | ||
|  | b0051271da | ||
|  | f46198b63f | ||
|  | d5246f6863 | ||
|  | eff73b831b | ||
|  | a804b82b06 | ||
|  | e16c1d6c85 | ||
|  | 0fc014b17b | ||
|  | 05aad4b68e | ||
|  | 653e441f55 | ||
|  | cf80182740 | ||
|  | 0c2ac4808a | ||
|  | ebce8b7025 | ||
|  | fc1e0812f5 | ||
|  | 81f3a4b35d | ||
|  | 3f1084a542 | ||
|  | 6f129181f3 | ||
|  | f6ab2c9306 | ||
|  | aed4f4bdc7 | ||
|  | 7a30018e52 | ||
|  | 95eb08e8c1 | ||
|  | 52d7c20639 | ||
|  | 9ea39b1386 | ||
|  | 3f713a8d15 | ||
|  | 6e98d28b88 | ||
|  | 36f4283374 | ||
|  | a9ae034fcd | ||
|  | ec379e6b72 | ||
|  | cae010c2fc | ||
|  | 1b9c231a08 | ||
|  | 8883aaceb1 | ||
|  | 85caf086b7 | ||
|  | db431af916 | ||
|  | 022a15cc9d | ||
|  | 6dfb287c9f | ||
|  | afeb2ffbec | ||
|  | 1d6f9d4928 | ||
|  | 7b11e728ff | ||
|  | 5ed578faa0 | ||
|  | 2e2c38848a | ||
|  | faffbaeafe | ||
|  | 617ef4b9c9 | ||
|  | efc537a45b | ||
|  | 9cf8ffc5c1 | ||
|  | 1ae777d0d5 | ||
|  | dd33829b39 | ||
|  | e2acdacf1f | ||
|  | db077cb9d5 | ||
|  | 8edddb8cda | ||
|  | f68fef4012 | ||
|  | 5a287a627a | ||
|  | 0aa51096a3 | ||
|  | 37c6f38354 | ||
|  | a863c70ea4 | ||
|  | 68b8c4f43d | ||
|  | 9f8f035b83 | ||
|  | 71bebd8048 | ||
|  | 4a75301322 | ||
|  | ec24628e02 | ||
|  | 7f51812208 | ||
|  | 9f5b6e10a3 | ||
|  | 7e918cbf4a | ||
|  | 422b809a08 | ||
|  | d34a69d143 | ||
|  | 3383deabd2 | ||
|  | e8b49517e2 | ||
|  | 6c99807d85 | ||
|  | b1d31708da | ||
|  | 6c44cf5a65 | ||
|  | 06f02e3435 | ||
|  | 564a4e57d8 | ||
|  | dd8e0b8f5f | ||
|  | f50166c297 | ||
|  | aea4f4e5c0 | ||
|  | 28968f7cbb | ||
|  | bc5408bfbc | ||
|  | 8a91728452 | ||
|  | 072c780824 | ||
|  | c0cbb61731 | ||
|  | 73355a8f07 | ||
|  | eef6c52ac5 | ||
|  | 70ddb69006 | ||
|  | 33a5d975ce | ||
|  | 72eae2fb4b | ||
|  | ee91eeb7c5 | ||
|  | e92613391f | ||
|  | bef847e128 | ||
|  | c85c6f85fa | ||
|  | 8f17c453e1 | ||
|  | 7b6640a42e | ||
|  | 4b2aee6d04 | ||
|  | 49426284fc | ||
|  | 2c7a536d28 | ||
|  | 6b9dd3d898 | ||
|  | da7691db33 | ||
|  | e4aa26de64 | ||
|  | d6b806bd02 | ||
|  | 61afcd2d98 | ||
|  | 183885134d | ||
|  | 981c6cf3f8 | ||
|  | 6a847bd991 | ||
|  | 99ee6f83f9 | ||
|  | 9454c5a1de | ||
|  | 4130d0ceb4 | ||
|  | be394a53c2 | ||
|  | d037a7d938 | ||
|  | bbdd34f0ec | ||
|  | c09ead4515 | ||
|  | 90293be2fa | ||
|  | 3d58a98b38 | ||
|  | fc395682d8 | ||
|  | 6ee02bb486 | ||
|  | 43a4d05d60 | ||
|  | 2760adc7b9 | ||
|  | de8d58766c | ||
|  | 9a56c2ee8a | ||
|  | 945d538bad | ||
|  | 4a5e04c2be | ||
|  | 7a0d77770d | ||
|  | 623fc73640 | ||
|  | ccf21dacb5 | ||
|  | 1744f27b75 | ||
|  | e3d8559ff6 | ||
|  | 7137263693 | ||
|  | 05baf15363 | ||
|  | 2b50fdf5a4 | ||
|  | b70e270475 | ||
|  | 80704876f0 | ||
|  | 57628dc429 | ||
|  | ded1bbfcb9 | ||
|  | ce1fd46b7e | ||
|  | 44ca30cbf3 | ||
|  | 3e69a37fa6 | ||
|  | eaa57ebec8 | ||
|  | dc4a9761e9 | ||
|  | fc695b80f7 | ||
|  | 1938c91e05 | ||
|  | d0ccae9c1a | ||
|  | 5bc00ec520 | ||
|  | 20b04d1789 | ||
|  | 5a9f0ae9d1 | ||
|  | a75d96561c | ||
|  | e86f473fc0 | ||
|  | 53aa333967 | ||
|  | d2f611623b | ||
|  | 8fa7e9c083 | ||
|  | ff973bf62f | ||
|  | d3c8292035 | ||
|  | c7718b024b | ||
|  | 7e52c337c3 | ||
|  | e5591db83a | ||
|  | 3c37b1b4ad | ||
|  | 0538342491 | ||
|  | af298ca17e | ||
|  | 883aca74e1 | ||
|  | c112e7cde8 | ||
|  | 64d2edd2cd | ||
|  | 100d75fec0 | ||
|  | d8fcd77b4f | ||
|  | 95d22d59f6 | ||
|  | f4fe01797d | ||
|  | f2b9834cb1 | ||
|  | 0d7c0a9671 | ||
|  | ccc6455274 | ||
|  | 083c1ff068 | ||
|  | 36dc08d8ab | ||
|  | be15c94417 | ||
|  | b42d755e9b | ||
|  | afa698cf72 | ||
|  | 8bebe9f661 | ||
|  | e1bc2c9c2e | ||
|  | 831faf4a34 | ||
|  | 07c7c267aa | ||
|  | 2650c69ff7 | ||
|  | d8db5ef7bb | ||
|  | 11d24d2f2c | ||
|  | 9de3f32d6c | ||
|  | ae1c7ce5eb | ||
|  | e8774de7d4 | ||
|  | df89da46f1 | ||
|  | 35ac06a05b | ||
|  | cef6c224ee | ||
|  | 6ac1f0a87a | ||
|  | ec729eb1e9 | ||
|  | 7590a5bcb2 | ||
|  | 7bbdaee6d3 | ||
|  | de190a9076 | ||
|  | efdb76ff0c | ||
|  | a0d348748c | ||
|  | 3c499a1f8d | ||
|  | df498efd2f | ||
|  | e445063afc | ||
|  | 6561f31e2d | ||
|  | 59542c73b3 | ||
|  | f0edad2b97 | ||
|  | 37e37540f8 | ||
|  | 8312807917 | ||
|  | b52c178051 | ||
|  | 8c0f9451b7 | ||
|  | 0a262cbb25 | ||
|  | e7fb16bd70 | ||
|  | 4bb6e3be77 | ||
|  | 41810a8b80 | ||
|  | 88296e0f3e | ||
|  | 425cb93e8d | ||
|  | 53ee346ba0 | ||
|  | fbfa584d55 | ||
|  | f18a7fd85c | ||
|  | e67a8c4ac2 | ||
|  | dbbd384221 | ||
|  | bca314e635 | ||
|  | 2d834a57d5 | ||
|  | 7b5841122e | ||
|  | 58ec778b3e | ||
|  | a8041026a9 | ||
|  | c04bcbf90e | ||
|  | 89b39916d7 | ||
|  | b388d03536 | ||
|  | e6c3c1c857 | ||
|  | 37df0942ff | ||
|  | 3f51798bc1 | ||
|  | 85e34eda3d | ||
|  | 329f7562db | ||
|  | a80efb09c0 | ||
|  | 122d12fec0 | ||
|  | 17bc8ad651 | ||
|  | 587028883a | ||
|  | 79bfd71a8e | ||
|  | 8aae3b84a5 | ||
|  | 238a6807ac | ||
|  | 49bd61c376 | ||
|  | 097b434712 | ||
|  | 392ffee1ea | ||
|  | 5dac5a8829 | ||
|  | 35e612d35c | ||
|  | 21fcd206db | ||
|  | dd81c894e0 | ||
|  | 3b7ee0c6cc | ||
|  | bdc0f0861f | ||
|  | a694d33a9c | ||
|  | a92123566d | ||
|  | 8fbdee3a22 | ||
|  | 583b210687 | ||
|  | 378c634c4a | ||
|  | 3f9deb61f0 | ||
|  | 154506ec6e | ||
|  | 320f9b9948 | ||
|  | 8b1669ccfc | ||
|  | 5eaada7828 | ||
|  | 6c3686232c | ||
|  | 34672ebfda | ||
|  | 371ec0c8dd | ||
|  | 7e974c8de3 | ||
|  | c153846191 | ||
|  | 13a56c373c | ||
|  | 91c4e94609 | ||
|  | 78d6d9d52d | ||
|  | 0df75a6dfa | ||
|  | 18d00de5fc | ||
|  | 1ff28c6969 | ||
|  | f49e5cd8a7 | ||
|  | 8a0a805af1 | ||
|  | a3da9bacb0 | ||
|  | c0de94aca9 | ||
|  | 7500bf286e | ||
|  | e3937d2ed6 | ||
|  | f3b799c56f | ||
|  | 0e250bbaba | ||
|  | 69b9001a99 | ||
|  | 0682de1644 | ||
|  | 70e455b88d | ||
|  | 9a575cff69 | ||
|  | d14371d7dc | ||
|  | b0bd16a53b | ||
|  | 00796025a6 | ||
|  | 59804f5891 | ||
|  | ac6d877af9 | ||
|  | e3824895b8 | ||
|  | ffe6dc3c8f | ||
|  | 492af31f57 | ||
|  | 302391894b | ||
|  | 16c4b2dfa7 | ||
|  | baed2d91b7 | ||
|  | f7964ebe60 | ||
|  | 960f5c4940 | ||
|  | c4214725be | ||
|  | 0ee41d9046 | ||
|  | dc9e2278cc | ||
|  | c3f7b017f5 | ||
|  | e2cae6f692 | ||
|  | e9f63c464f | ||
|  | ba2d83dd43 | ||
|  | 609eb457d8 | ||
|  | 9e85d12824 | ||
|  | 037547a1d4 | ||
|  | f641de929f | ||
|  | 322cd677b2 | ||
|  | 83722c8b7d | ||
|  | deed632085 | ||
|  | ef00fa435c | ||
|  | 1e5b01a446 | ||
|  | ad3e7b5f7e | ||
|  | 3fb0b4bec0 | ||
|  | ebcb37cdf6 | ||
|  | 82063280f7 | ||
|  | eddd56a0de | ||
|  | 84299df63e | ||
|  | 4e1cf8a814 | ||
|  | fc7f522524 | ||
|  | 418cc69634 | ||
|  | de53dfed54 | ||
|  | 40a73c2a34 | ||
|  | 040cef5028 | ||
|  | a275e873fa | ||
|  | cc06862696 | ||
|  | 2d76c3fee4 | ||
|  | 9961da1d25 | ||
|  | 7032ea6e4f | ||
|  | ab2207b109 | ||
|  | d7d6f12142 | ||
|  | 1f1dc5eec8 | ||
|  | cf2de900f0 | ||
|  | b0b3193457 | ||
|  | 6a39364b03 | ||
|  | 38d01b37fd | ||
|  | 98946c1e28 | ||
|  | ffc5682a36 | ||
|  | 347bd16bb1 | ||
|  | c3f6fbbffe | ||
|  | d5b104fefd | ||
|  | b879c1b0c4 | ||
|  | 23c5d65e0f | ||
|  | bad3028a83 | ||
|  | 86dbba831f | ||
|  | 52d60210c7 | ||
|  | 15eb67168f | ||
|  | c08514c60f | ||
|  | 1711b37750 | ||
|  | d5c1bfe913 | ||
|  | c4bee85e6f | ||
|  | 509379e704 | ||
|  | 84aa2f5f62 | ||
|  | 277029ad85 | ||
|  | 6861f7f754 | ||
|  | 5132d41b14 | ||
|  | 53f9434f53 | ||
|  | cb57ac7b48 | ||
|  | e404cc1417 | ||
|  | bcec48bdbf | ||
|  | 188d0ed258 | ||
|  | a9a466cca5 | ||
|  | ff8120d1b5 | ||
|  | e4707cb090 | ||
|  | 3d13fd5d54 | ||
|  | 54c79d94fb | ||
|  | bcabbb8a6a | ||
|  | 98f732a7cf | ||
|  | 9c47fb9a16 | ||
|  | 5ba4df87fb | ||
|  | 6b173f2c29 | ||
|  | 55da7871ee | ||
|  | bd67f05f91 | ||
|  | f871cefbad | ||
|  | 83b7bdef8d | ||
|  | 46124ecf9c | ||
|  | 97181c4e8d | ||
|  | bf1348fa63 | ||
|  | c5b2b233b2 | ||
|  | 36e189f569 | ||
|  | 43976b674a | ||
|  | c9c552bd4a | ||
|  | 7b0a7bf741 | ||
|  | 1c41f96f04 | ||
|  | bd228bcd91 | ||
|  | fbb9271966 | ||
|  | 6598c138c0 | ||
|  | 01a9997c86 | ||
|  | 605599efc4 | ||
|  | 25ca7f4027 | ||
|  | f28e915c4a | ||
|  | 3d386d76e4 | ||
|  | b001ef0bd5 | ||
|  | 73a26d8560 | ||
|  | fa37a9cfc0 | ||
|  | b33faf19f7 | ||
|  | 09d96a3c95 | ||
|  | eb2d76de61 | ||
|  | 4f6d6b9e77 | ||
|  | c0302ce05c | ||
|  | c06d38bb5f | ||
|  | 9bd1f380be | ||
|  | caeaccef37 | ||
|  | 9bd9a1375c | ||
|  | e2c7e81482 | ||
|  | c6f3552c56 | ||
|  | 215e13d19d | ||
|  | 5aead81caa | ||
|  | 37b470cc6c | ||
|  | 01fd644312 | ||
|  | cb3f7da491 | ||
|  | 1ce37c38af | ||
|  | f8dbd96dc2 | ||
|  | 61716196cd | ||
|  | 9bf8f4f754 | ||
|  | 8229258af4 | ||
|  | a12a2b2d72 | ||
|  | dc1075f865 | ||
|  | fe14f74288 | ||
|  | 75f2349e76 | ||
|  | c6a515554f | ||
|  | 4aa1d4259d | ||
|  | 5d9ea10cb0 | ||
|  | d1b6b69807 | ||
|  | 068af5e40e | ||
|  | 067410f636 | ||
|  | 8a7867d6ea | ||
|  | ab531d3b08 | ||
|  | 11ce529591 | ||
|  | bc1a226039 | ||
|  | 8934545c00 | ||
|  | a8056ae1ca | ||
|  | c4ca30768b | ||
|  | 1f4081e2bb | ||
|  | 8d4d986332 | ||
|  | 55cbd9c60c | ||
|  | 697b561cac | ||
|  | 868149e480 | ||
|  | 488e2298de | ||
|  | 5c60f1ffb7 | ||
|  | b957c92533 | ||
|  | 941b7c80d4 | ||
|  | 2ee8676c4e | ||
|  | 6b0852bbbc | ||
|  | 8eda688d37 | ||
|  | 6d90c17ed3 | ||
|  | 3b467c3e51 | ||
|  | 567bde994f | ||
|  | efd7d00fa9 | ||
|  | 8d245eea07 | ||
|  | 8e9db3ddf8 | ||
|  | 1dacec1de0 | ||
|  | f005576cb6 | ||
|  | a01f1cb547 | ||
|  | c9e74b7a8c | ||
|  | 3e03d087b2 | ||
|  | 3452420e52 | ||
|  | f321fc8986 | ||
|  | 59a4be64b5 | ||
|  | 22b51bf673 | ||
|  | 31d641fdab | ||
|  | 81b309fa1c | ||
|  | 9816eca8a2 | ||
|  | f75885415c | ||
|  | 2e90b6adf0 | ||
|  | 845db90a35 | ||
|  | 192277c870 | ||
|  | 53e318a27c | ||
|  | 4189b41a2f | ||
|  | d32f771452 | ||
|  | 1ddb0a1149 | ||
|  | 02a30ee546 | ||
|  | a1c0de83f0 | ||
|  | 875301eb1d | ||
|  | 8e352fa027 | ||
|  | 874e8fa677 | ||
|  | ce6b11f384 | ||
|  | ee64166f8c | ||
|  | f1fc975d79 | ||
|  | 988c3b4c91 | ||
|  | 068c039d47 | ||
|  | af109a9060 | ||
|  | f11e892232 | ||
|  | 0c279f3d2e | ||
|  | 2d2da59305 | ||
|  | f448d214b5 | ||
|  | d918bbe8b3 | ||
|  | edcd2c19f1 | ||
|  | ef38382da9 | ||
|  | e3b9eca251 | ||
|  | 41faad8172 | ||
|  | 8695290834 | ||
|  | 7d9ec29847 | ||
|  | efc1a5a0b0 | ||
|  | 5008d89ee4 | ||
|  | 8b8e5885a0 | ||
|  | f834d71ca5 | ||
|  | a701d94402 | ||
|  | 1a262d8859 | ||
|  | ef6009f0cc | ||
|  | aca483c7a0 | ||
|  | f1a289ca05 | ||
|  | c5e68bed86 | ||
|  | 6c8071aa83 | ||
|  | 6ac0b993ba | ||
|  | 0d18199cdf | ||
|  | b532e9ce90 | ||
|  | 2cb1dc69df | ||
|  | be079b0615 | ||
|  | d91e5ed550 | ||
|  | 20455c96d3 | ||
|  | f595909d73 | ||
|  | 0d77f909b8 | ||
|  | b87c13c233 | ||
|  | 11ff8c8405 | ||
|  | 791e4d829b | ||
|  | 201cc49865 | ||
|  | ea622b0378 | ||
|  | e66d26f195 | ||
|  | ab23f91b7c | ||
|  | 31231817b6 | ||
|  | 61ba2521e4 | ||
|  | d34889997b | ||
|  | e96726b8de | ||
|  | 84c679941c | ||
|  | f794bc6ab0 | ||
|  | 471d00b47c | ||
|  | fe44893e15 | ||
|  | b6cab0818c | ||
|  | 3bd3fb4950 | ||
|  | e0e0329cfe | ||
|  | 4abe2b7bf5 | ||
|  | ec70dc13bc | ||
|  | 19c20944e4 | ||
|  | e5d1e8eb55 | ||
|  | a1b4574bae | ||
|  | 720adb7e86 | ||
|  | b8c7e03f29 | ||
|  | 2a8d1f17a5 | ||
|  | 9d0047e071 | ||
|  | fb491446c7 | ||
|  | 3f4633677b | ||
|  | d7f0b63eb9 | ||
|  | 32eaae40d7 | ||
|  | 36f516c037 | ||
|  | 663ddc8386 | ||
|  | 253d90b15a | ||
|  | 94b86e2a0b | ||
|  | b3f0ed96e9 | ||
|  | 9e6532194f | ||
|  | c5e2bef011 | ||
|  | 4b3e287a5f | ||
|  | b89e7db2a2 | ||
|  | 0dcc74b567 | ||
|  | 5b128adddb | ||
|  | 17f59a1954 | ||
|  | 9b24504528 | ||
|  | aafcec25fb | ||
|  | 8f1c25043d | ||
|  | 26f5483182 | ||
|  | 4cd600d285 | ||
|  | ac1d17c216 | ||
|  | 4f62c5cb9d | ||
|  | 658a29853b | ||
|  | a35a78ef00 | ||
|  | 6d3fe01c99 | ||
|  | aa6579d040 | ||
|  | d57890c0a9 | ||
|  | cf99b2730a | ||
|  | 9997f732dc | ||
|  | 3329cd4bf1 | ||
|  | f16f3457dd | ||
|  | 2282183509 | ||
|  | 5cb525d9a2 | ||
|  | 7f82c5b4cf | ||
|  | f4d64555d0 | ||
|  | 7813ddb003 | ||
|  | 3eff2139dc | ||
|  | b5c85e0031 | ||
|  | 8d727d4f39 | ||
|  | b2002d5989 | ||
|  | 4f357b1dd4 | ||
|  | d85ab06f68 | ||
|  | f0099ecd92 | ||
|  | d5a20de52b | ||
|  | 7101bdff2c | ||
|  | 2831c8b5af | ||
|  | d896db5d4d | ||
|  | 59db5a1568 | ||
|  | 7dc3032824 | ||
|  | 28bba07f22 | ||
|  | 5da0f4b651 | ||
|  | 07fac1c94e | ||
|  | f1f8b2bf93 | ||
|  | f89deadcb2 | ||
|  | bd3ef507cc | ||
|  | 12c6d325ce | ||
|  | 7063fd5cd9 | ||
|  | e051460e31 | ||
|  | 4413821d1b | ||
|  | 0eb642a625 | ||
|  | 04beb515d0 | ||
|  | 5996377c2d | ||
|  | 74c47dcba0 | ||
|  | db07381bbd | ||
|  | a170cf7b1f | ||
|  | 156bdba217 | ||
|  | 34afcbf84e | ||
|  | aae17797b7 | ||
|  | 65e49790e8 | ||
|  | 0ab2a0f5b7 | ||
|  | d9e1f83d05 | ||
|  | cf18beb6dc | ||
|  | fe09fa4983 | ||
|  | 7a310007b1 | ||
|  | f5abfa0084 | ||
|  | d7b7de09f7 | ||
|  | c1131c0b54 | ||
|  | 2f05a88e56 | ||
|  | b804a7e5aa | ||
|  | 73080b55f8 | ||
|  | 5e5e0d9b57 | ||
|  | 552c6888e5 | ||
|  | d650dedcb6 | ||
|  | e85ef5ff6f | ||
|  | 2d53a8a31d | ||
|  | 12bb196de3 | ||
|  | a29a934e95 | ||
|  | 8aee36e808 | ||
|  | 0fa2950bb7 | ||
|  | 68e26624be | ||
|  | c29d493159 | ||
|  | 837c31abeb | ||
|  | 1836d989ca | ||
|  | d1c92c569f | ||
|  | d58b590200 | ||
|  | b5a0522fb9 | ||
|  | 62f92569b3 | ||
|  | 6d50374606 | ||
|  | 4b67e33ae9 | ||
|  | a5bc5689a3 | ||
|  | bd410a9559 | ||
|  | 351667a8a0 | ||
|  | 1c40a78bae | ||
|  | d388123410 | ||
|  | 2d307db6ce | ||
|  | 09974cb43b | ||
|  | ed9a206ad6 | ||
|  | 8317137068 | ||
|  | edda197051 | ||
|  | 5e91aee82e | ||
|  | 1bfe8afc8b | ||
|  | a6cd4d2578 | ||
|  | c6f7d4e449 | ||
|  | ea4f22c2b9 | ||
|  | a50c9ce240 | ||
|  | 0f03dc9d04 | ||
|  | 4b4baf4952 | ||
|  | baccd4505b | ||
|  | 7ee49a5367 | ||
|  | 6522a101ea | ||
|  | f114c9497a | ||
|  | 20c61297c6 | ||
|  | 2bf8c5d150 | ||
|  | 8b133291a4 | ||
|  | 980f8e1f5a | ||
|  | 0cec1b0a20 | ||
|  | 1e64e12d49 | ||
|  | f529e4bb32 | ||
|  | c8a3e74ae5 | ||
|  | a2fa966ccd | ||
|  | 7d0fd6b907 | ||
|  | 6b1797e36d | ||
|  | 9764c831d7 | ||
|  | 53bf46fac5 | ||
|  | fb8ea2a195 | ||
|  | cebe4ce80f | ||
|  | 031faeff50 | ||
|  | 422dcdc6be | ||
|  | 7d63ea0c19 | ||
|  | ad8f080643 | ||
|  | 44bd3c95c3 | ||
|  | 86451a245f | ||
|  | d12705b4f6 | ||
|  | 0e96395d98 | ||
|  | 5c7e2e4098 | ||
|  | b8401c34c9 | ||
|  | 92f8fd0af8 | ||
|  | e3626ea7ba | ||
|  | 7c3620eea1 | ||
|  | dd4b58312e | ||
|  | d87c947ca1 | ||
|  | 83580d9ef3 | ||
|  | 8db4f1bb30 | ||
|  | 2c1430b88a | ||
|  | 7a0d0322da | ||
|  | 67b9c61eef | ||
|  | 37ea4d4db6 | ||
|  | bcd90e0706 | ||
|  | 108c486240 | ||
|  | 489b39f9e6 | ||
|  | 6e3f72092c | ||
|  | 292b4720e3 | ||
|  | eb408e0bfb | ||
|  | 83a30fda7d | ||
|  | 88ac20bbcd | ||
|  | e73641d6de | ||
|  | d57fd8a7a2 | ||
|  | 62752263c0 | ||
|  | 2f5aba907e | ||
|  | 2a924caacd | ||
|  | 8eb0c51937 | ||
|  | 9693df6e26 | ||
|  | f8105d5422 | ||
|  | 2f351dbd68 | ||
|  | 7ee368e6db | ||
|  | a75c2d254f | ||
|  | 86b1349a46 | ||
|  | 5219ca9a3f | ||
|  | f67bdea66f | ||
|  | 7cf7d41c23 | ||
|  | d046ca1dd6 | ||
|  | e02aad528e | ||
|  | b0f0e693aa | ||
|  | 59d0a80043 | ||
|  | 0d5a9fed10 | ||
|  | 3e87d2afca | ||
|  | acb8bd9d1c | ||
|  | 52485cb63e | ||
|  | 8e31b662ce | ||
|  | a632cefb3b | ||
|  | 96b7c8bbeb | ||
|  | 9c61fde48d | ||
|  | 065e474c86 | ||
|  | 9e0f38c0e3 | ||
|  | 7dd7e6483c | ||
|  | 0dc6a67f9f | ||
|  | 4a3063bd8c | ||
|  | efb7ebeeee | ||
|  | 792d270446 | ||
|  | 59f8671e90 | ||
|  | da929c20a2 | ||
|  | 4be5825cf1 | ||
|  | e9d5e63a3e | ||
|  | cd76b41ba7 | ||
|  | 53daf5309b | ||
|  | 0b0b15fd55 | ||
|  | d8f13f09c5 | ||
|  | fc7067cff3 | ||
|  | 0ec77d5a48 | ||
|  | 9d36bbbf06 | ||
|  | 6a09277e2b | ||
|  | fa6ea7a9b3 | ||
|  | 1b55f8d643 | ||
|  | 4e3632e4b5 | ||
|  | de03942d0e | ||
|  | 6bfc039364 | ||
|  | 21e1fa71b8 | ||
|  | 4db8628b87 | ||
|  | b784d81020 | ||
|  | 62b5ff4458 | ||
|  | 324edf7569 | ||
|  | c17cebfe2a | ||
|  | 33e38db789 | ||
|  | 1c2381c9b1 | ||
|  | 071bd9daf5 | ||
|  | 5d2c1279d8 | ||
|  | bb7406c7c9 | ||
|  | 36ccc9ace2 | ||
|  | d8c652762a | ||
|  | 10ded04b7d | ||
|  | 9587b1acfe | ||
|  | a08aca7afe | ||
|  | 7a0ae3143b | ||
|  | b29ddfc2fc | ||
|  | 555a888ab7 | ||
|  | 27afc15796 | ||
|  | d601b1d4c2 | ||
|  | 844fad5301 | ||
|  | 1c9490427b | ||
|  | f80c5a3b41 | ||
|  | fbd7680927 | ||
|  | 392ba406bc | ||
|  | 0e15dca25b | ||
|  | d53bc8fe20 | ||
|  | 3d1e68b29d | ||
|  | 2c00ad961c | ||
|  | 6ecad30626 | ||
|  | 9ccf4e2a3b | ||
|  | 6de41e883a | ||
|  | 584eec0e78 | ||
|  | 3624b48511 | ||
|  | 47ce4ba424 | ||
|  | 39f5bcbd5a | ||
|  | d7568eb799 | ||
|  | 0f3276ceca | ||
|  | ef6855c3a6 | ||
|  | fdf441c8e8 | ||
|  | d4bb5d2de0 | ||
|  | bc1f9ba4cb | ||
|  | 024cb5831b | ||
|  | 84bf07717a | ||
|  | cc211cd22b | ||
|  | b117cf9d51 | ||
|  | 8341473672 | ||
|  | d021781d75 | ||
|  | 059da71d6d | ||
|  | 52c62f7955 | ||
|  | 352ae43faa | ||
|  | 361792c48d | ||
|  | 2b248b0177 | ||
|  | d923fd5420 | ||
|  | 92d5b99384 | ||
|  | 315d852eaf | ||
|  | e1760adf4e | ||
|  | f69550c015 | ||
|  | 393846b836 | ||
|  | 18e4ffa7a1 | ||
|  | 0056a31dcb | ||
|  | 40ebb8630a | ||
|  | d51918b713 | ||
|  | 51d2b8eaf9 | ||
|  | 1605d280b8 | ||
|  | 7ae4e92a93 | ||
|  | d5fe146cec | ||
|  | f239508b87 | ||
|  | a6924dac90 | ||
|  | 9ea41700c7 | ||
|  | 09cced8bc3 | ||
|  | 4b893b6c49 | ||
|  | 6eb7b5d13d | ||
|  | 781c0f1543 | ||
|  | b9964d64b0 | ||
|  | 6896dfd197 | ||
|  | e0221ae9ee | ||
|  | d212d1ea1f | ||
|  | 513db9b4b9 | ||
|  | 4b93111ae0 | ||
|  | bfa2985b2f | ||
|  | 0ac30e762e | ||
|  | d5fadfc498 | ||
|  | 7b3fcef56e | ||
|  | a9e4aae662 | ||
|  | 0a154f0c1f | ||
|  | a59a96b092 | ||
|  | ed30be74bc | ||
|  | 96aec2e69f | ||
|  | 6e5a1c3921 | ||
|  | aa846b62a7 | ||
|  | b5ae298ee9 | ||
|  | a3cb513b57 | ||
|  | 54127cc668 | ||
|  | 3e466e01cb | ||
|  | 47b681c99d | ||
|  | a1ca224a98 | ||
|  | 07bc1389c1 | ||
|  | 9292429c8c | ||
|  | 356758a184 | ||
|  | d979943852 | ||
|  | 8a7d6f746f | ||
|  | 6deb734d94 | ||
|  | e55e0fc2cc | ||
|  | d8817261ca | ||
|  | 8e04ec040a | ||
|  | 05db88644c | ||
|  | 90ab2dec01 | ||
|  | 16128af70f | ||
|  | 1a3827e541 | ||
|  | cc283155a1 | ||
|  | a751e3e70b | ||
|  | 3b58dec324 | ||
|  | 503416902c | ||
|  | 1c54bac79c | ||
|  | ff322874e2 | ||
|  | 03bd52194b | ||
|  | 17e2d3b12a | ||
|  | 834132fec2 | ||
|  | e7e69d72e3 | ||
|  | 98762e996c | ||
|  | 11e8588e0d | ||
|  | 0ac92994bc | ||
|  | 3ac9250f38 | ||
|  | 340e40b6d1 | ||
|  | 87215e6352 | ||
|  | d3aa3eef94 | ||
|  | 7db8828e0b | ||
|  | 25b4572ec8 | ||
|  | 5f208c4510 | ||
|  | c378806112 | ||
|  | dd9394b9eb | ||
|  | 169c3afc06 | ||
|  | 4567edbd5f | ||
|  | 387b25c678 | ||
|  | 918b88e5e2 | ||
|  | b66d14f53e | ||
|  | c7c72ddd26 | ||
|  | c03be59b18 | ||
| 6b80930bc0 | |||
|  | 768304bf9d | ||
|  | 3e2a01339d | ||
|  | 7b70dafbaf | ||
|  | 62248f1ac6 | ||
|  | ddc87afed2 | ||
|  | 531f1a55fd | ||
|  | db71cb58d3 | ||
|  | 345f1c10b0 | ||
|  | f95dc9adcc | ||
|  | 3dce3cd497 | ||
|  | fb44d8888a | ||
|  | ca38041eec | ||
|  | 2dbdc7a4c4 | ||
|  | 942078e3fd | ||
|  | 5bc5bf0672 | ||
|  | 307f835cec | ||
|  | a5bfb77e2a | ||
|  | fd755fa58a | ||
|  | 318b7d7748 | ||
|  | ffd792acaa | ||
|  | 7f76715aeb | ||
|  | c09236b06f | ||
|  | 00142f0935 | ||
|  | 190afb8d9d | ||
|  | 447a9703ac | ||
|  | 7235fd4834 | ||
|  | dc44b85d69 | ||
|  | db8b9b82da | ||
|  | abc33595df | ||
|  | bf29282de6 | ||
|  | 1b07cef1d5 | ||
|  | dd8ba7e3ce | ||
|  | d862c250fa | ||
|  | 8ebac73812 | ||
|  | e941dda29c | ||
|  | f74ca9402a | ||
|  | 08f8739a80 | ||
|  | 4066e61fba | ||
|  | 55be902080 | ||
|  | 2c2bc040ca | ||
|  | a3f5bc03d0 | ||
|  | 2f1e902885 | ||
|  | bf6d86bf4e | ||
|  | 95ac3d55ae | ||
|  | 733e873785 | ||
|  | a0b90c4299 | ||
|  | 3ab05fc552 | ||
|  | 1c44c9e776 | ||
|  | f34a0ac163 | ||
|  | 570256341d | ||
|  | 6e8b6b41df | ||
|  | 94ee820ace | ||
|  | 3080718d95 | ||
|  | b35314bf83 | ||
|  | 1dbe9c1a2b | ||
|  | 241395d610 | ||
|  | 2062bc6160 | ||
|  | 41687a386b | ||
|  | c1c046971e | ||
|  | b25222b93e | ||
|  | ea85e1c82b | ||
|  | 8fe7970b81 | ||
|  | 2a4d9b2b1c | ||
|  | 0736ea98d0 | ||
|  | 81a61c4ec4 | ||
|  | c5d3b941dc | ||
|  | 9a2623232c | ||
|  | 96f565bbe4 | ||
|  | 231717f862 | ||
|  | ca02cfc24e | ||
|  | 8e94580b56 | ||
|  | 3fdc528ffe | ||
|  | 35de4f51de | ||
|  | 3e5427633a | ||
|  | 05ff4c5a0e | ||
|  | ff8491c0f3 | ||
|  | fbb77ace5d | ||
|  | 438a24101d | ||
|  | e6fe7b224b | ||
|  | a407d007be | ||
|  | d4534c7dca | ||
|  | 2b3925abf0 | ||
|  | 1fb21fdbd3 | ||
|  | 0a49f98892 | ||
|  | a4348368e0 | ||
|  | 0dfe3125c7 | ||
|  | c924ed7c71 | ||
|  | ccb99b00c1 | ||
|  | c67633eda5 | ||
|  | 55a7cd8624 | ||
|  | b2600d0de5 | ||
|  | f550ae832b | ||
|  | 6d338b8324 | ||
|  | 92645d9c17 | ||
|  | 6d75362672 | ||
|  | d5ecc2579b | ||
|  | 6dab0e1f72 | ||
|  | d24898b558 | ||
|  | fc220c7868 | ||
|  | 33294ac8e7 | ||
|  | 07ca7dc8a7 | ||
|  | 3365fcb1ef | ||
|  | fa7c5428c5 | ||
|  | c9dc8940ed | ||
|  | e20e479697 | ||
|  | c752a1c92b | ||
|  | 05af474916 | ||
|  | b4e54b8fdc | ||
|  | 0b89f4c0a1 | ||
|  | 70e1337980 | ||
|  | 4b04209e62 | ||
|  | 0d31afa0a5 | ||
|  | 893ec0efc9 | ||
|  | 47d44a94b8 | ||
|  | a1ee74f4c8 | ||
|  | 61bacc2742 | ||
|  | 6c581378e8 | ||
|  | d819783b21 | ||
|  | a0cf4601b7 | ||
|  | 3a39248f9c | ||
|  | f8f4c2ffec | ||
|  | 94331d6ba0 | ||
|  | 34dd2fcbcc | ||
|  | 53d0350259 | ||
|  | d510da6e71 | ||
|  | eda3252c95 | ||
|  | c353a19fe5 | ||
|  | 15877d15f4 | ||
|  | 8ee4054eff | ||
|  | 94e27be64b | ||
|  | 10e658af76 | ||
|  | c93c5b6c93 | ||
|  | b7dfd189a0 | ||
|  | 58c3d89297 | ||
|  | 49aa0a6276 | ||
|  | e71d1fcf12 | ||
|  | a09048af63 | ||
|  | f446104dda | ||
|  | c17018ae9d | ||
|  | 69509c43f1 | ||
|  | 8a25040a26 | ||
|  | aaf7631ef3 | ||
|  | a134902bd6 | ||
|  | 768c0759ac | ||
|  | 442296a414 | ||
|  | 90ab577eb1 | ||
|  | bf799bdd93 | ||
|  | 0debe23873 | ||
|  | 79e06e38ae | ||
|  | d94fdb9f86 | ||
|  | 6d35edee98 | ||
|  | 45cde1e2e7 | ||
|  | b63cd4b427 | ||
|  | 97d5c51a12 | ||
|  | 1ea7bf16f2 | ||
|  | 3a7506e0f6 | ||
|  | 09bc287157 | ||
|  | 99555c3924 | ||
|  | 82d93a1266 | ||
|  | 0913a70ac7 | ||
|  | 75d1f34b5d | ||
|  | 8424a06217 | ||
|  | 67d3ad9bca | ||
|  | bcef93975e | ||
|  | cf6610153f | ||
|  | e46dc98f58 | ||
|  | 261a6c6ffa | ||
|  | 4eb47552b3 | ||
|  | a4ac8060ba | ||
|  | 4d99866e39 | ||
|  | f6d36a132d | ||
|  | 97c43de5ce | ||
|  | 4bcf08213f | ||
|  | 1643123b77 | ||
|  | 48a6abc8b0 | ||
|  | ffcd58a34a | ||
|  | 7eb409548b | ||
|  | 81701253cd | ||
|  | 89bcc1c27b | ||
|  | f39003c785 | ||
|  | a2c7c4628d | ||
|  | 7b2a394d9c | ||
|  | 5916681635 | ||
|  | b578e07243 | ||
|  | a73749b450 | ||
|  | c27a19a06b | ||
|  | 234b9f34d5 | ||
|  | 93f1523caa | ||
|  | b22c153f3d | ||
|  | 2a416e8177 | ||
|  | 3bca9a4865 | ||
|  | b0457b8161 | ||
|  | 16aaa2e95a | ||
|  | be0c55de75 | ||
|  | e0d1860aaa | ||
|  | a73d93c1ca | ||
|  | 9ce09b38de | ||
|  | ad856bfaae | ||
|  | f17b80abba | ||
|  | 9b36b9de6d | ||
|  | 479163c50e | ||
|  | 305345a955 | ||
|  | 4414bd3416 | ||
|  | c5d1030940 | ||
|  | b0ea8c451b | ||
|  | 61217e07b8 | ||
|  | 79efa10aa1 | ||
|  | 63286e3f48 | ||
|  | 5f853d5ac3 | ||
|  | 6abe23d791 | ||
|  | 4e36387bb2 | ||
|  | fd03bba979 | ||
|  | a084961c0b | ||
|  | 150760f6ce | ||
|  | 59931236ba | ||
|  | fd5f976dcf | ||
|  | 932733839f | ||
|  | 4fc53f7519 | ||
|  | f71e163e0a | ||
|  | 18c7277d7b | ||
|  | 829e2f5ab8 | ||
|  | 79c6636fb2 | ||
|  | 5403db62fa | ||
|  | 425db08622 | ||
|  | 0e7f0b4d26 | ||
|  | 697b0a5eaf | ||
|  | 364f042e9b | ||
|  | da259ebec6 | ||
|  | dbca23bb6d | ||
|  | 64eafa988b | ||
|  | 355a0fe50e | ||
|  | 46c5474b4e | ||
|  | 23d677bc82 | ||
|  | 5eaf8f996a | ||
|  | 733871805a | ||
|  | 86dbce3da8 | ||
|  | d4ab166fe0 | ||
|  | 0705687d12 | ||
|  | 246aaee5b1 | ||
|  | ca4a465312 | ||
|  | e4ce3d7c45 | ||
|  | b90cc9065f | ||
|  | 69ea4af045 | ||
|  | 7e89712bd9 | ||
|  | dfa29e1677 | ||
|  | aef1ebc8c9 | ||
|  | 5d656a9e65 | ||
|  | e04acbcf5b | ||
|  | 1f7e2b4d84 | ||
|  | d6d2e7b909 | ||
|  | 7de09aa195 | ||
|  | 6835f1da50 | ||
|  | 2004368c90 | ||
|  | ec41626868 | ||
|  | d1acd1de71 | ||
|  | f6d8a737df | ||
|  | 37e16f5795 | ||
|  | d5d5fa6055 | ||
|  | 6ec577f14d | ||
|  | 9300dac087 | ||
|  | 3f25e3a753 | ||
|  | 5dc1ba2230 | ||
|  | 208b440c86 | ||
|  | 8bc6655ec7 | ||
|  | d2bec8554d | ||
|  | 7453962f52 | ||
|  | 4b518445ef | ||
|  | f9d5e51222 | ||
|  | 5b94b47e02 | ||
|  | 1464cfa2de | ||
|  | e4d1e85156 | ||
|  | 8998e9a664 | ||
|  | 97d29d0d7e | ||
|  | a4d48f643b | ||
|  | 5d4a8af8d7 | ||
|  | 0f221d2f9d | ||
|  | 322d0cb479 | ||
|  | 036ee91533 | ||
|  | 71049f7f65 | ||
|  | f39746e303 | ||
|  | c0d890a0a8 | ||
|  | b4446a24a6 | ||
|  | e8c8c1cba6 | ||
|  | 3dd57db73b | ||
|  | a2925da21b | ||
|  | c3d92c18d0 | ||
|  | ae24b4d6b4 | ||
|  | 61de1da32d | ||
|  | 70557adefd | ||
|  | 7894fb68f8 | ||
|  | 409fcd6f44 | ||
|  | 61fed1f99f | ||
|  | 32aae8fe4f | ||
|  | 74e34e52e8 | ||
|  | 4b9bd8ffa8 | ||
|  | 018b926c6c | ||
|  | 1355ef7509 | ||
|  | a076c7b331 | ||
|  | 195c6e3aa6 | ||
|  | 046b1d0c5a | ||
|  | b6a686a021 | ||
|  | bc8cc63d17 | ||
|  | db406eb8fa | ||
|  | c1010119aa | ||
|  | a0cc85027c | ||
|  | 1db79c53a0 | ||
|  | 39f6cb1ff2 | ||
|  | 55e3ab0612 | ||
|  | 84954bcc84 | ||
|  | a0c2bf8f67 | ||
|  | bd2b066e9a | ||
|  | 7d99c2fb5f | ||
|  | 6d3984654c | ||
|  | 64202161dd | ||
|  | 6f14126a2e | ||
|  | f757852ac4 | ||
|  | f38eff6564 | ||
|  | 92516a7753 | ||
|  | 890cbaa0b9 | ||
|  | 376a4778b8 | ||
|  | cc46a5a9c8 | ||
|  | e8439fe40a | ||
|  | 3464798fd9 | ||
|  | 5a730afb99 | ||
|  | 46596b6d57 | ||
|  | 8a0141bf2d | ||
|  | 869d9a4635 | ||
|  | 6eb9dd2ee6 | ||
|  | 47024dde2a | ||
|  | f764b37c8a | ||
|  | 85324959a0 | ||
|  | 6298eeaae3 | ||
|  | c398a354b9 | ||
|  | abe2f9892e | ||
|  | cf4ae0bc58 | ||
|  | 4cb734cbe0 | ||
|  | a4e7a9ff30 | ||
|  | 572f155bf5 | ||
|  | 99ef026ff0 | ||
|  | 86a1128d9a | ||
|  | 38f3ecc288 | ||
|  | ec29f1dc11 | ||
|  | c186b95ae7 | ||
|  | d5fa92d90f | ||
|  | 6f5a918bd1 | ||
|  | 96ad4ac999 | ||
|  | efc3252c1b | ||
|  | 197201d923 | ||
|  | 8baf806758 | ||
|  | 192af31223 | ||
|  | dc2e2ff079 | ||
|  | 97759ee9d2 | ||
|  | ea42e0e53a | ||
|  | b85a5a9cfb | ||
|  | 001fc94d95 | ||
|  | 5f8fff9943 | ||
|  | 476dec8d17 | ||
|  | 0a815cbb35 | ||
|  | 74b98805a5 | ||
|  | b5d7ee5c58 | ||
|  | d970a443ce | ||
|  | 22cbb0c6bf | ||
|  | a23dc0b0cd | ||
|  | 7bbeb88804 | ||
|  | 27f9d4740d | ||
|  | c0c5cd79ee | ||
|  | a6c9430a42 | ||
|  | b468befe67 | ||
|  | b6bcf204f5 | ||
|  | 7bc5f87471 | ||
|  | bb46e123fe | ||
|  | e99ea5b2de | ||
|  | 40dfa8686b | ||
|  | 731389d4a2 | ||
|  | 7c13051ce1 | ||
|  | bfde95f6ca | ||
|  | 9861b4718e | ||
|  | 2f612a074c | ||
|  | 11eda3d90b | ||
|  | c78a75718a | ||
|  | ee93320cad | ||
|  | 35fcde4dca | ||
|  | 054f8b8a50 | ||
|  | 8f79d72950 | ||
|  | 3ba4c9089c | ||
|  | 471609f59c | ||
|  | ffcd6f2943 | ||
|  | abdeeef32f | ||
|  | fa64373189 | ||
|  | 10cb930034 | ||
|  | ab3e8ad93f | ||
|  | a45e5a8844 | ||
|  | 91f8c77e34 | ||
|  | 98a228e644 | ||
|  | bc9a255a3f | ||
|  | 5c3e626df1 | ||
|  | 4db2c45c4a | ||
|  | c921eec601 | ||
|  | ab146f9a69 | ||
|  | 48b3839eca | ||
|  | 7e19978d7a | ||
|  | 050f76c1be | ||
| f4873d924f | |||
| 6fedce8dac | |||
| 9f4c44d75d | |||
|  | f0e3aaa3ab | ||
|  | 9521730bae | ||
|  | ac99e83459 | ||
|  | 3ce7f47a6b | ||
|  | c430bbf467 | ||
|  | ea36a748c8 | ||
| 2c5542d985 | |||
| 722d861dfd | |||
| 5ea1728dbb | |||
|  | 53a4e5ea27 | ||
| 6a75a3470f | |||
| 8600eb20bc | |||
|  | 2074d29e55 | ||
|  | 9283c0c283 | ||
|  | b25f4ff713 | ||
|  | 17c74dd956 | ||
| e0bb149e44 | |||
| f81e56feab | |||
|  | 4b994d76e9 | ||
| 426ce5f49a | |||
| 460a2b0ab7 | |||
|  | 9c0685e4ff | ||
| 3abcf75a3f | |||
| 01e1bc3d7a | |||
| 4d1df90887 | |||
| e687a6b572 | |||
|  | 53a185fec6 | ||
|  | 74adde5a40 | ||
|  | 03d990f8b5 | ||
| d52d2b352d | |||
| 41bc5e8750 | |||
| f796fbc536 | |||
| c6a9856689 | |||
| 6359ceecb3 | |||
| f2bcbffde4 | |||
| 8bdc53d7ca | |||
| d697c5213f | |||
| b7104acd58 | |||
| b84d3bec66 | |||
| d2264c90d1 | |||
| 1d0de7a9c5 | |||
|  | cce3c47466 | ||
|  | a01d79fe2f | ||
| 283fb8767d | |||
| 9baf7fe2ef | |||
| 4ff43d632e | |||
|  | 49dabf912c | ||
| 2fe01ec7cf | |||
| 7250ff3a45 | |||
| 832be3f1ec | |||
| 69347cde15 | |||
| f384b4c73d | |||
|  | 0c2b0c6733 | ||
|  | a49fb6016b | ||
|  | 0370ea61d9 | ||
|  | 25bdc08ede | ||
|  | e2583c25f9 | ||
|  | d01a7b58fa | ||
|  | d3cb80666e | ||
|  | a52c3a1eca | ||
|  | 38fcdfdb70 | ||
|  | 2360db1924 | ||
|  | 9baf96b0c2 | ||
|  | 44e8683cd5 | ||
|  | 9efa58ad49 | ||
|  | 71631bf2ca | ||
|  | 22e7c83a74 | ||
|  | 2a6563a6c1 | ||
|  | fe15dcdad9 | ||
|  | bff298f5c9 | ||
|  | 53d7b3fc85 | ||
|  | 893a75c582 | ||
|  | 86c8722638 | ||
|  | d1e3e69006 | ||
|  | 8719b9d851 | ||
|  | 7cc8b5be93 | ||
|  | b095835e62 | ||
|  | 8cc46723f0 | ||
|  | 4f52add246 | ||
|  | 867ab92be8 | ||
|  | e36ebca88c | ||
|  | e854868514 | ||
|  | 4ec129a695 | ||
|  | 99e8432ea7 | ||
|  | 31b3e6c670 | ||
|  | 459485c83b | ||
|  | 5a14c5373b | ||
|  | 0c25c114d0 | ||
|  | 23edcd62d9 | ||
|  | 7db829566c | ||
|  | 7feea057bc | ||
|  | 52da9be2fc | ||
|  | fb33d84784 | ||
|  | 506e4d5dac | ||
|  | b16b5d5e6c | ||
|  | 96c2a69872 | ||
|  | 9bcbb2c851 | ||
|  | d0b56ba0d1 | ||
|  | a72cbd4811 | ||
|  | 0c69a922a5 | ||
|  | 285fc7aaa9 | ||
|  | d04eb1a4a7 | ||
|  | 00a1adaf82 | ||
|  | ec93e7cc0d | ||
|  | f4f23b4814 | ||
|  | 8002d58294 | ||
|  | 222789a438 | ||
|  | 6ede9e8871 | ||
|  | 178d254bf8 | ||
|  | 8f01e046e0 | ||
|  | 99a9433c92 | ||
|  | 9ff75ba4b5 | ||
|  | e90f40671d | ||
|  | 6ee61ae682 | ||
|  | 669b56c5f9 | ||
|  | f42f6a165d | ||
|  | 586f3746ad | ||
|  | f134ee8f26 | ||
|  | e036ae13aa | ||
|  | 3d27008b40 | ||
|  | 2aa6092938 | ||
|  | 3e036b221f | ||
|  | 2d2865213e | ||
|  | 9497074b72 | ||
|  | 19a18e34a5 | ||
|  | e72ffbf7d0 | ||
|  | a0c547c510 | ||
|  | 761c93541b | ||
|  | 9d73267f8b | ||
|  | a6a38ef099 | ||
|  | c997a099dc | ||
|  | 46044e21fc | ||
|  | 04648a7ac6 | ||
|  | babbb28d07 | ||
|  | 64a98b4712 | ||
|  | 6291f35dca | ||
|  | fcf81210fe | ||
|  | 89271cd829 | ||
|  | 1f8810ad22 | ||
|  | 034961e472 | ||
|  | 831175383f | ||
|  | 17788948fd | ||
|  | 05a6149cd1 | ||
|  | 56c72397c1 | ||
|  | 48df62ac7b | ||
|  | 1da5d7aab5 | ||
|  | 143a3f1996 | ||
|  | 9857d683cf | ||
|  | a184ca666e | ||
|  | 61b86011cc | ||
|  | fac5ed82bb | ||
|  | 5e5d0b4308 | ||
|  | 67dab486e3 | ||
|  | 7ed3cc17a1 | ||
|  | d94bdc362d | ||
|  | 67ba57b994 | ||
|  | e326cf1f55 | ||
|  | 9410f2586a | ||
|  | 8a06fa7b2c | ||
|  | d40905e60b | ||
|  | 5a850b066a | ||
|  | dff04e7289 | ||
|  | a053a01777 | ||
|  | c90615b313 | ||
|  | 8134ef2516 | ||
|  | b3b85f65fd | ||
|  | c71a44d7f1 | ||
|  | d671d5fc8b | ||
|  | a6dfe82012 | ||
|  | 202ff931bd | ||
|  | a8e6cb1710 | ||
|  | 4e8670dcfa | ||
|  | 8c3735fd6e | ||
|  | f4f7963fff | ||
|  | 6e5de10982 | ||
|  | 427f890aa1 | ||
|  | 3607bc86e9 | ||
|  | d7dc92ff4a | ||
|  | 19453c366a | ||
|  | 8779b59856 | ||
|  | 00afdc8f0a | ||
|  | f84c90dbf7 | ||
|  | f06cc9b112 | ||
|  | eb1f4a4a4e | ||
|  | 72485b4ab9 | ||
|  | 9f3b8d7416 | ||
|  | a6f4458327 | ||
|  | 492a64ffb4 | ||
|  | 58bf9d0050 | ||
|  | 3dbf097447 | ||
|  | def72781e7 | ||
|  | ae749f9b25 | ||
|  | 4a7a8b204f | ||
|  | b29694352d | ||
|  | 15bdd4951d | ||
|  | 7b949beaac | ||
|  | cf84815c54 | ||
|  | 698fd5f5f2 | ||
|  | f0a3cf91ad | ||
|  | f106c220e3 | ||
|  | 8502f94796 | ||
|  | 61e30c8dbe | ||
|  | 4a138c52a6 | ||
|  | 2ef7f2a91d | ||
|  | 4d16c8c2cc | ||
|  | 63649d631f | ||
|  | 87c0493629 | ||
|  | 09d107514b | ||
|  | 8cf11b7167 | ||
|  | 0c7c690af1 | ||
|  | 499dcfb026 | ||
|  | cf2e255253 | ||
|  | 446facac7e | ||
|  | bf8bd66b85 | ||
|  | db814b24de | ||
|  | 5c309c0321 | ||
|  | 0e2c0cb3b5 | ||
|  | 5b1fc1317d | ||
|  | dc1d009dad | ||
|  | dcfa2eeada | ||
|  | 4b5d7459f4 | ||
|  | 5da70389cc | ||
|  | c4b6b382ad | ||
|  | f8b0290497 | ||
|  | c4d579a301 | ||
|  | f05c9703c5 | ||
|  | 966a94483a | ||
|  | 8f1ef4dc7e | ||
|  | 67d29e2a89 | ||
|  | d9f873a399 | ||
|  | 55afb5b471 | ||
|  | f8cfb45fa2 | ||
|  | 4875195a90 | ||
|  | 3d6b1c9b7c | ||
|  | 999e1c895e | ||
|  | ecb6a02a46 | ||
|  | a0c42b0053 | ||
|  | c429617241 | ||
|  | 38de1f36f2 | ||
|  | c46a1c7e26 | ||
|  | 7e63f5d911 | ||
|  | 67166d2b25 | ||
|  | fa8967084c | ||
|  | 8ef80e4f0d | ||
|  | 645034f0af | ||
|  | 7bedfeca11 | ||
|  | fd2bbcb344 | ||
|  | 8a31e47e7b | ||
|  | f557e5222c | ||
|  | 5b2b5eb799 | ||
|  | c1aa8bfa1d | ||
|  | a5859f0077 | ||
|  | b386c5d952 | ||
|  | 7c0874b7b3 | ||
|  | 821236713c | ||
|  | d0ed71cf8f | ||
|  | a02e127a42 | ||
|  | 43f1e688e1 | ||
|  | ec853d63f1 | ||
|  | 43b3e253b6 | ||
|  | abed0e85dd | ||
|  | 3398d39e11 | ||
|  | 510f9f14b1 | ||
|  | 3c8104554a | ||
|  | ce55f3db03 | ||
|  | 5da77df064 | ||
|  | f3c3b00367 | ||
|  | 32398ece08 | ||
|  | bf3eda9a10 | ||
|  | 4de7b17f57 | ||
|  | 8165380828 | ||
|  | 11465a2190 | ||
|  | dc27ac30e9 | ||
|  | 478b4025a7 | ||
|  | 037da98f84 | ||
|  | 5dadee4a3a | ||
|  | aea786945f | ||
|  | fb93f70776 | ||
|  | d5acaec0ba | ||
|  | cbd022aed3 | ||
|  | 80617aada2 | ||
|  | bd62cf7b8b | ||
|  | 3241623df2 | ||
|  | 3b89905b0b | ||
|  | b929880b7a | ||
|  | f5ea57d30c | ||
|  | 42a386c38a | ||
|  | faf2742b68 | ||
|  | c227b0ec34 | ||
|  | 0a767cef46 | ||
|  | e37efe0ce0 | ||
|  | b5b797bab5 | ||
|  | dbdb0601f3 | ||
|  | fbd6a41acf | ||
|  | 21fe0d1b25 | ||
|  | 2bafd745b7 | ||
|  | 8eaef01fb7 | ||
|  | 58bbec13fe | ||
|  | 6bd1423e57 | ||
|  | 2e92a69c4d | ||
|  | e67d711db3 | ||
|  | 9900189039 | ||
|  | 0a30b0b091 | ||
|  | a480902ce6 | ||
|  | 7c413fa9b2 | ||
|  | 35e1dd482e | ||
|  | 4da06c2b26 | ||
|  | 9f0f41554b | ||
|  | 546e3dd993 | ||
|  | 4d1368ea62 | ||
|  | f40382b6d1 | ||
|  | b3ec72ac6c | ||
|  | a9aa0c32e8 | ||
|  | 4780045b21 | ||
|  | 6294795ab5 | ||
|  | 8911edde23 | ||
|  | b6b3266a3e | ||
|  | 2d75d69b1e | ||
|  | 3dad000a72 | ||
|  | 5e5fc139de | ||
|  | 6db56c17a7 | ||
|  | f831af9f88 | ||
|  | c181c821c1 | ||
|  | 8962d5c1ad | ||
|  | 71ca1ebd4b | ||
|  | 1bfcccaaec | ||
|  | 1ed3d03e5b | ||
|  | b14c36ce16 | ||
|  | fe10a5870c | ||
|  | 3c8988afe2 | ||
|  | 3e7057e189 | ||
|  | b10bc5209c | ||
|  | 49a2d392ad | ||
|  | 8f4c2a21b9 | ||
|  | ab3bece353 | ||
|  | e84081c42c | ||
|  | d50b295bc7 | ||
|  | 725b1eea0c | ||
|  | 2785af1829 | ||
|  | 723fbdce2a | ||
|  | 31a3290a7b | ||
|  | 27ab36b3ce | ||
|  | 94f5713f89 | ||
|  | 4675ebf883 | ||
|  | 5478611712 | ||
|  | 395bc26bb1 | ||
|  | df0ac93042 | ||
|  | 1a616bc084 | ||
|  | e6f0c7f004 | ||
|  | 10f1ffbe4e | ||
|  | ae5f41df8c | ||
|  | 026cabbc16 | ||
|  | e960e95e06 | ||
|  | d80c3c6092 | ||
|  | 28d917645d | ||
|  | f4c15159d1 | ||
|  | 826fb5f4dd | ||
|  | 6c338a5dd4 | ||
|  | 6aa4d5a6d8 | ||
|  | abd55bd413 | ||
|  | a1d439104e | ||
|  | 087165af50 | ||
|  | d0daec7694 | ||
|  | de2eff8ce6 | ||
|  | 195a1d460d | ||
|  | a7f9c41667 | ||
|  | eed93b27b4 | ||
|  | 92853d3f5e | ||
|  | 47c52e3ef7 | ||
|  | 4c4240e3c8 | ||
|  | 2d35cdc95a | ||
|  | 30f28a4941 | ||
|  | b1d93bb65f | ||
|  | 8f0f4e7106 | ||
|  | 45a1f53627 | ||
|  | f3e003dfd6 | ||
|  | ace4a8314b | ||
|  | 780a912b57 | ||
|  | ad0040260e | ||
|  | 34631c0668 | ||
|  | d4ee80b802 | ||
|  | efd0842832 | ||
|  | 78c9c2a40c | ||
|  | 746927e826 | ||
|  | 1089e784db | ||
|  | bfd7c20187 | ||
|  | c955e7016c | ||
|  | 0ead6bdffb | ||
|  | 352c573251 | ||
|  | 4b20cd2dee | ||
|  | d7b59ba7e1 | ||
|  | d79cb21929 | ||
|  | 4db6925d38 | ||
|  | 30047204e1 | ||
|  | 76154527ef | ||
|  | 8879a71b51 | ||
|  | a3dac13b53 | ||
|  | 5c8e207a57 | ||
|  | 8aae62c071 | ||
|  | 84f60ce32f | ||
|  | 64c1ae7656 | ||
|  | ca3fbd9a89 | ||
|  | a54d30684d | ||
|  | cd21fd3e73 | ||
|  | 2d4edcfc21 | ||
|  | 2611a72508 | ||
|  | c4b597c409 | ||
|  | 92dfebc1d4 | ||
|  | 0eb5036b11 | ||
|  | 52c854661a | ||
|  | f160760526 | ||
|  | 68d5b27194 | ||
|  | e37950d54b | ||
|  | 8f0670265b | ||
|  | a0e2cfc6cf | ||
|  | b0b03d00d4 | ||
|  | 66826caf94 | ||
|  | 9281f18ecb | ||
|  | 82778173bb | ||
|  | 8fe222ba4b | ||
|  | 88775a9bdb | ||
|  | c2b9333e29 | ||
|  | 29fdd4a222 | ||
|  | 8650c0dd09 | ||
|  | c5c1645054 | ||
|  | 4ce4dd0a3c | ||
|  | 3503c2314d | ||
|  | 9e8e1788fb | ||
|  | d484770b2f | ||
|  | e6cb2bf706 | ||
|  | 110c909c50 | ||
|  | ee58c2b938 | ||
|  | 5160f82b65 | ||
|  | 9f21513075 | ||
|  | 8505c995ed | ||
|  | 5712a7e111 | ||
|  | 374a6a1ddf | ||
|  | 208e6de3e4 | ||
|  | 87231fdb1f | ||
|  | 760db2bb82 | ||
|  | b1ffe2afde | ||
|  | 7640fe085b | ||
|  | dd901c005d | ||
|  | 7808526ee7 | ||
|  | c94fe15ced | ||
|  | ce5cb61eb4 | ||
|  | cc87206dbc | ||
|  | 708342d09b | ||
|  | 464c5d5663 | ||
|  | 60bd0b1dff | ||
|  | 40efa96ba1 | ||
|  | fe3a637255 | ||
|  | a8db0542d7 | ||
|  | c2d9aa6d06 | ||
|  | 476bc5c74d | ||
|  | 1ae5558c65 | ||
|  | 8abfcb0e55 | ||
|  | 06240d2b09 | ||
|  | d9701c366d | ||
|  | c33eb0e6f2 | ||
|  | 5f116d6984 | ||
|  | d84400e89b | ||
|  | 0bbb816f3f | ||
|  | 3400df5fd4 | ||
|  | 9e44eddddf | ||
|  | 4dad5e1ab2 | ||
|  | 627b4e15cb | ||
|  | ed9ac12226 | ||
|  | 195dca851c | ||
|  | 8589cbe29a | ||
|  | ea63a41b47 | ||
|  | 76986d7803 | ||
|  | cbdc4a8b65 | ||
|  | 3ca0ba0f11 | ||
|  | 3d805694bc | ||
|  | 26d3d1e7a7 | ||
|  | 6ce2044471 | ||
|  | 6f99497129 | ||
|  | ba92b068d8 | ||
|  | 18a7fead0b | ||
|  | 111e10b434 | ||
|  | 934c2b0a78 | ||
|  | c50141a411 | ||
|  | 5c339ccdfa | ||
|  | 54f71407ad | ||
|  | 3fe0c5ab05 | ||
|  | b86cb09212 | ||
|  | a77aff56aa | ||
|  | fff005a6a1 | ||
|  | e686914023 | ||
|  | 97ab7c1204 | ||
|  | 12873f180c | ||
|  | 941641f917 | ||
|  | 797342111f | ||
|  | 199a75971f | ||
|  | 3ea9d7e23e | ||
|  | f478cb6606 | ||
|  | 99be5be77d | ||
|  | 0b0bd5729c | ||
|  | 9e10f2b77c | ||
|  | 18d2614b13 | ||
|  | 26177d03d4 | ||
|  | af7e1c72a4 | ||
|  | bd65a54b2c | ||
|  | d4c11d65e6 | ||
|  | 6bbc40ef41 | ||
|  | 26f96dd6b1 | ||
|  | d2f1b25b67 | ||
|  | afe315af26 | ||
|  | c84bb0fbdc | ||
|  | f45692df45 | ||
|  | 7bcf923c64 | ||
|  | 1ddf31185c | ||
|  | 1b290214f6 | ||
|  | 07e4320b23 | ||
|  | 433ff4476f | ||
|  | 900ff5ce83 | ||
|  | edbf34a2e3 | ||
|  | f55b55e406 | ||
|  | 9282baa7fa | ||
|  | 30ecf5b154 | ||
|  | 25fddf63db | ||
|  | 59d1e952d5 | ||
|  | a6dafbff38 | ||
|  | b3b46e6724 | ||
|  | 7291113d2f | ||
|  | d0bc1c1508 | ||
|  | 2c5026145d | ||
|  | 729d644e8b | ||
|  | 5364c2571a | ||
|  | f0c1efb4b1 | ||
|  | 39ff23507b | ||
|  | f4514c087b | ||
|  | 4f5cea34b3 | ||
|  | 19e3b730db | ||
|  | d8e4916bbc | ||
|  | 9039ece985 | ||
|  | 7ef72ab71e | ||
|  | 01248798a7 | ||
|  | 16db054fb9 | ||
|  | fd104efd54 | ||
|  | 9f2343075a | ||
|  | ba709d089c | ||
|  | f2c152a3fc | ||
|  | 872d05f47a | ||
|  | b9159b8e15 | ||
|  | e67e0fbb82 | ||
|  | af65ba44ab | ||
|  | a93b78de4f | ||
|  | 585b2fcf85 | ||
|  | fa608965ba | ||
|  | fee4c0c28f | ||
|  | 63ce994265 | ||
|  | 214ced7029 | ||
|  | fffb87b45f | ||
|  | 8099941802 | ||
|  | 5f4b48eba7 | ||
|  | 92249196a4 | ||
|  | 458b03dd0c | ||
|  | 82bfdc6c3c | ||
|  | 8d354eee32 | ||
|  | 38c5ae5e25 | ||
|  | 77625d872f | ||
|  | 091a2761cf | ||
|  | dff68edcbb | ||
|  | 2ffc1d06cf | ||
|  | 2fe8814dce | ||
|  | 9ee83ea972 | ||
|  | 7879070993 | ||
|  | 0af394b0ed | ||
|  | 53397bcdbf | ||
|  | 36bde01ed9 | ||
|  | 0df2fcbee3 | ||
|  | 721a351708 | ||
|  | 057c45869a | ||
|  | fa6ccb5cde | ||
|  | 1384f7495c | ||
|  | c3be9537bd | ||
|  | c41730e9a4 | ||
|  | cb2aa2c46a | ||
|  | dcbe39d228 | ||
|  | edf03dbb5d | ||
|  | f2508c5823 | ||
|  | 66fad244d9 | ||
|  | fcb6bbf956 | ||
|  | 41dc57f1ac | ||
|  | 0c484a0092 | ||
|  | 610631133a | ||
|  | 7f2d6942dc | ||
|  | f1d34435e5 | ||
|  | ecc1500d50 | ||
|  | 22fe4f6373 | ||
|  | 2f21766b4f | ||
|  | 6fe2cafabb | ||
|  | 975e4599d1 | ||
|  | 071666f0fe | ||
|  | 7940cffc3c | ||
|  | 93b1a3a69d | ||
|  | 4c8c8d5ab8 | ||
|  | aa426ef1da | ||
|  | 0563fbe718 | ||
|  | a61fd5656e | ||
|  | 4718b60941 | ||
|  | 61f8d7fea4 | ||
|  | af674d4324 | ||
|  | 905db58f57 | ||
|  | b16720420d | ||
|  | 74f84fe07b | ||
|  | cdd570fae0 | ||
|  | 65b407e744 | ||
|  | 37f54ace01 | ||
|  | 77fbf07625 | ||
|  | 7bcc4469cc | ||
|  | 9f485e897a | ||
|  | 5274499468 | ||
|  | 99ac6ffbad | ||
|  | 192e143b5c | ||
|  | 6fc8928032 | ||
|  | d06b22878c | ||
|  | 117153324f | ||
|  | 505b41fbd6 | ||
|  | 8c21b368bd | ||
|  | 961993ae2b | ||
|  | 047279fe16 | ||
|  | ebce7fab92 | ||
|  | 8975cdf0f6 | ||
|  | 39170c953c | ||
|  | b6e200f635 | ||
|  | a183f874b4 | ||
|  | f3be7e21c9 | ||
|  | 920847b105 | ||
|  | e3aef2c7f2 | ||
|  | 2fb2334e1d | ||
|  | 31935a80b9 | ||
|  | e303901262 | ||
|  | 5883f4123e | ||
|  | 38b46442aa | ||
|  | 93faabe2f5 | ||
|  | f9b623b538 | ||
|  | 22113c33ed | ||
|  | 55a0e44d79 | ||
|  | 66093030c2 | ||
|  | 4d30281c5b | ||
|  | b9d07f88c8 | ||
|  | fcc4518cb1 | ||
|  | 8fee098a0a | ||
|  | 29c6d31eca | ||
|  | 914f1bc4fd | ||
|  | 22e6340ba9 | ||
|  | 1552fa3ba9 | ||
|  | 7dbc4146a5 | ||
|  | dd4e0e1260 | ||
|  | e4398f80df | ||
|  | ac0ca2966a | ||
|  | 66fd58a69d | ||
|  | 9d3378bc93 | ||
|  | ff72b0f104 | ||
|  | 813f299ad1 | ||
|  | 5ff593ee0a | ||
|  | 2237b065c3 | ||
|  | 7a667e6f2b | ||
|  | 04e043cf9d | ||
|  | 6ce01389c8 | ||
|  | 15555a9304 | ||
|  | 375574a901 | ||
|  | 7cc8089813 | ||
|  | 26aa5377c5 | ||
|  | 7a3e6ceb8f | ||
|  | 57ceab5d13 | ||
|  | 27445b1bba | ||
|  | a0f8e79c85 | ||
|  | e86d35858c | ||
|  | 3031392f89 | ||
|  | c79fc16b0a | ||
|  | 252ead5945 | ||
|  | 0d7f0ad424 | ||
|  | 22d951a7b2 | ||
|  | 3feed4ee0f | ||
|  | cbdbae2c57 | ||
|  | c58c7140d0 | ||
|  | f0aa42b8f3 | ||
|  | 05e92437c8 | ||
|  | eda06af5c4 | ||
|  | 5d8cdf3bb6 | ||
|  | e98d1babd2 | ||
|  | 7a87dd25d2 | ||
|  | 7bcee2b1b6 | ||
|  | 57a9d329ba | ||
|  | 8936a026df | ||
|  | 727d05f861 | ||
|  | d6201819c1 | ||
|  | e1a89b5d78 | ||
|  | b15eca92a4 | ||
|  | 08a7208cc4 | ||
|  | 9c0019087b | ||
|  | 349a869311 | ||
|  | 02d6343d8e | ||
|  | 3880e8bc0f | ||
|  | 570c6cf82c | ||
|  | 1a7e06f480 | ||
|  | 70aa2ef31e | ||
|  | a251149452 | ||
|  | 9d1e81b492 | ||
|  | 4ac2f5a134 | ||
|  | c6b293d4bd | ||
|  | 2e7adce3db | ||
|  | 30965d9bdf | ||
|  | 19e82479e4 | ||
|  | 6d7492cebe | ||
|  | 6f5d6c6ee7 | ||
|  | e887776b57 | ||
|  | 6f1b930a54 | ||
|  | 6618bc07cb | ||
|  | 9fefb8fe7e | ||
|  | 1b70874b25 | ||
|  | 54f35593d3 | ||
|  | d2244a049c | ||
|  | a64d93f2e6 | ||
|  | 1188f2532e | ||
|  | f32f109095 | ||
|  | f20a2d8146 | ||
|  | d6ca31c7b1 | ||
|  | adac56a1c1 | ||
|  | f01a37a883 | ||
|  | 3c7983bf65 | ||
|  | c0a7716606 | ||
|  | 04b2f02a13 | ||
|  | 47c22cb822 | ||
|  | c01c66c8ca | ||
|  | 00bd53dd3a | ||
|  | d9ba2bc1c5 | ||
|  | 8790f07496 | ||
|  | 7381b11f0f | ||
|  | 5b668855f3 | ||
|  | 7c187894b3 | ||
|  | 6818260611 | ||
|  | 0f96320a9b | ||
|  | 73bfdcb4c3 | ||
|  | 835502ba9f | ||
|  | 6f395305bf | ||
|  | 6a70b457de | ||
|  | 82d8c9a826 | ||
|  | 1c884e1b1b | ||
|  | da306f69ea | ||
|  | fd7897694c | ||
|  | 0eddd90703 | ||
|  | 0da9b78a13 | ||
|  | 3c44b2580d | ||
|  | 82b11cd362 | ||
|  | 0369ac26db | ||
|  | 1f17f126d0 | ||
|  | cb60468d0e | ||
|  | 05d923b924 | ||
|  | f52201095f | ||
|  | cbc608e3dd | ||
|  | 845019c1c3 | ||
|  | c5fa3901e1 | ||
|  | 769e12aac1 | ||
|  | 40f8cf4984 | ||
|  | 916129957e | ||
|  | 5086a196f8 | ||
|  | 28a466a5d4 | ||
|  | 4370c8d923 | ||
|  | 85b51faa89 | ||
|  | f71db402d3 | ||
|  | ce01784c46 | ||
|  | 502239ac2e | ||
|  | 397cde8383 | ||
|  | 164203adab | ||
|  | 829f03e68c | ||
|  | c228161701 | ||
|  | 9fa1d90c15 | ||
|  | 9fa78fa280 | ||
|  | 864dca4525 | ||
|  | 0e9ef44843 | ||
|  | 86eaa9178e | ||
|  | 01a10159ff | ||
|  | 58e8f0fd71 | ||
|  | 016eb5a75c | ||
|  | e78cc0cbe5 | ||
|  | f1f928dd39 | ||
|  | 0c403ae92b | ||
|  | 6f66cc7503 | ||
|  | 1365cea288 | ||
|  | be19bc7005 | ||
|  | f47e6c9acb | ||
|  | 3982ed8b04 | ||
|  | 0a50030333 | ||
|  | 4ec69ad495 | ||
|  | b3cd8f7a88 | ||
|  | 6b873efacf | ||
|  | 2c16718a9c | ||
|  | 01c843cde1 | ||
|  | 4922c3cb2b | ||
|  | bb6a28867e | ||
|  | 741680265a | ||
|  | efcec7ac90 | ||
|  | aae44c489e | ||
|  | 70e733a7b5 | ||
|  | 39c459c04c | ||
|  | 94f7cb748d | ||
|  | 6803ec7670 | ||
|  | 815bee9dcc | ||
|  | 3884316d22 | ||
|  | 4106c48877 | ||
|  | dfd9282d01 | ||
|  | 5c32b8e240 | ||
|  | 3cd4954d6c | ||
|  | 2503ee1947 | ||
|  | 09cf11a5fc | ||
|  | e98949990a | ||
|  | 5f78476130 | ||
|  | 3c424b63ff | ||
|  | 745a22a8e2 | ||
|  | 6b96dfe939 | ||
|  | fd76ce7ac1 | ||
|  | d98b1ae982 | ||
|  | 8a9e591316 | ||
|  | 2a8c3cd45f | ||
|  | 8c400f9168 | ||
|  | 3dbc129e46 | ||
|  | 99fc7cf835 | ||
|  | 54e7daea44 | ||
|  | aa39a450e4 | ||
|  | 89a564c2dd | ||
|  | c80ef26ad5 | ||
|  | 512e30a84b | ||
|  | 2491c8e906 | ||
|  | 1df841804a | ||
|  | fe66924093 | ||
|  | 3f9b98d32c | ||
|  | aecc216dc1 | ||
|  | 165df7ee8a | ||
|  | c6839f602a | ||
|  | 5fd231cf2f | ||
|  | a634abfbef | ||
|  | 31a496e6b3 | ||
|  | ea52e27e77 | ||
|  | 18edb3aebc | ||
|  | cce0956e6e | ||
|  | a41dac0467 | ||
|  | 4a8896a16c | ||
|  | bec0762630 | ||
|  | 20a6f55368 | ||
|  | 71a0c5e638 | ||
|  | df0324f904 | ||
|  | b8e464e299 | ||
|  | c8cb33b723 | ||
|  | 5acedc6aac | ||
|  | 40b6043eed | ||
|  | 724b52c538 | ||
|  | 8b89646069 | ||
|  | 57564bcc1c | ||
|  | f7d5efd4ae | ||
|  | f29d9e15c8 | ||
|  | a4c6fc3175 | ||
|  | 41ca00537a | ||
|  | b571982b11 | ||
|  | 7d31bbe3d0 | ||
|  | 76af1c2d14 | ||
|  | 9a68f2ec8a | ||
|  | f1e49518e9 | ||
|  | ae4e5e3e78 | ||
|  | 2cd8f476b6 | ||
|  | badf483642 | ||
|  | 2af7808ccc | ||
|  | cb6cf2e19f | ||
|  | 2ea4771df4 | ||
|  | 567a0ba434 | ||
|  | 5374862df7 | ||
|  | 6a5d923739 | ||
|  | fb6fee0ae2 | ||
|  | a90dfd3037 | ||
|  | 9654b024b2 | ||
|  | 14abe686a4 | ||
|  | d1a7c2fd17 | ||
|  | de30d29b53 | ||
|  | 2645898031 | ||
|  | d6fc0e005f | ||
|  | ebcb526f60 | ||
|  | 2900c27c70 | ||
|  | 7a85950d29 | ||
|  | e98fd640fa | ||
|  | 0ad5cc6fd3 | ||
|  | 312f09a06e | ||
|  | b007cd13df | ||
|  | ab6624266c | ||
|  | 01bec4be03 | ||
|  | 69371730b2 | ||
|  | f04f01bdba | ||
|  | 52f1b5d0ed | ||
|  | 7f44ee66fd | ||
|  | 407d8d4baa | ||
|  | 8440693bbd | ||
|  | dc1bfcb1bb | ||
|  | 9c0f4324da | ||
|  | 22855cf70e | ||
|  | bd5de25e4b | ||
|  | e6d8b3c6c8 | ||
|  | e91b292d8b | ||
|  | a558bbdfe5 | ||
|  | 9781699c2b | ||
|  | 2e48b7c427 | ||
|  | fe9df9d2c5 | ||
|  | 07569481f1 | ||
|  | ac52cd0d59 | ||
|  | c452f12eb9 | ||
|  | 571babf236 | ||
|  | 296de1c452 | ||
|  | 394917d3ff | ||
|  | 20fc23d183 | ||
|  | af9f54b06a | ||
|  | d66067c1f1 | ||
|  | f8e1535a52 | ||
|  | 4f10fa559a | ||
|  | eb769a93a1 | ||
|  | b1cbf09a50 | ||
|  | b7a1d77fc1 | ||
|  | 3f4a61090f | ||
|  | c2d156cc16 | ||
|  | 6a472a0092 | ||
|  | e71a1f5d69 | ||
|  | 13f0c0ba15 | ||
|  | 5b88c90de0 | ||
|  | 05e9e882f0 | ||
|  | 196c1b112e | ||
|  | 0568882c64 | ||
|  | aff3830463 | ||
|  | f701080b71 | ||
|  | 92c9a5c1c2 | ||
|  | b26d8f71f6 | ||
|  | bce382fcc1 | ||
|  | e2ca682872 | ||
|  | b148035c40 | ||
|  | 7a9acdb7c1 | ||
|  | 8d8bb29f13 | ||
|  | 602b4f06ef | ||
|  | 2d45ddf2be | ||
|  | d37554d317 | ||
|  | e95360fc81 | ||
|  | be95736987 | ||
|  | b4d98ab335 | ||
|  | 979128036c | ||
|  | 3dcf5d23c4 | ||
|  | a74a7c7b1d | ||
|  | d982651545 | ||
|  | 664c0e7751 | ||
|  | 18ad905525 | ||
|  | 769fa6b534 | ||
|  | 8a06bea864 | ||
|  | 0c55497fb3 | ||
|  | 636e396303 | ||
|  | 3c0a4c9372 | ||
|  | e7b02865fc | ||
|  | 99b451ac8e | ||
|  | 145c1bb2d2 | ||
|  | 33d69091f8 | ||
|  | 48fa10a21b | ||
|  | 6e0c8efbf4 | ||
|  | db27bfd8f2 | ||
|  | 2a43a20531 | ||
|  | 958c7107ce | ||
|  | d734a5063c | ||
|  | 9ca98d43ee | ||
|  | 211d3f9ac7 | ||
|  | b5e1cfb4fa | ||
|  | 72cff8560b | ||
|  | 1caf337e60 | ||
|  | b279d2ef2b | ||
|  | 2fec5f513e | ||
|  | 65cca6165c | ||
|  | 75c1c0d478 | ||
|  | 9d4ef66fa5 | ||
|  | 80adcac8b8 | ||
|  | 69aca8781d | ||
|  | 4a8944cc83 | ||
|  | 0297cb2187 | ||
|  | 69131b57f7 | ||
|  | 9c700ae28f | ||
|  | b90376286c | ||
|  | b3992b98a9 | ||
|  | 4baae80558 | ||
|  | fda3bf95f1 | ||
|  | 9e54a0e47e | ||
|  | c14ad320e3 | ||
|  | e544551627 | ||
|  | ba6160f7e2 | ||
|  | 9e4ebbf29d | ||
|  | 5c02f3702b | ||
|  | 01ff6c00be | ||
|  | b45557e366 | ||
|  | 8b5e387806 | ||
|  | 2296fe413b | ||
|  | 6135040b52 | ||
|  | 158e3ae50e | ||
|  | 5e29b75f20 | ||
|  | c77259734a | ||
|  | 775eba0b0b | ||
|  | de8c4a6fc7 | ||
|  | a792483409 | ||
|  | 271b24ade6 | ||
|  | 185f4174d8 | ||
|  | dc0d258b3f | ||
|  | d6800add0c | ||
|  | 952e264949 | ||
|  | 0a832e3c4b | ||
|  | 15c1d01b29 | ||
|  | 555cd377ac | ||
|  | b4178e1e49 | ||
|  | 31aba06df6 | ||
|  | 6e8e9dfe52 | ||
|  | 91441487ed | ||
|  | faa7a42ed1 | ||
|  | 41c95db700 | ||
|  | 408eb40cc9 | ||
|  | ac4811c507 | ||
|  | a53adf001f | ||
|  | 23ae3efec1 | ||
|  | 25900aab78 | ||
|  | 58b712cda4 | ||
|  | 6a53c29da5 | ||
|  | a7ab45c070 | ||
|  | e7c90dbe7e | ||
|  | cd8aef1c06 | ||
|  | 55b6b0c94a | ||
|  | d74989f048 | ||
|  | 5b458e177d | ||
|  | a03563f3ed | ||
|  | 32f80734fb | ||
|  | 4d62b19ebe | ||
|  | 7ddfd8d394 | ||
|  | f1231284d6 | ||
|  | f8d5828960 | ||
|  | 4bba3674f6 | ||
|  | 392411fbbc | ||
|  | 920484cbd6 | ||
|  | 0f3ca3bc4e | ||
|  | c31eb17b14 | ||
|  | 252752e5d4 | ||
|  | 42e76152b6 | ||
|  | f31c158bf3 | ||
|  | 5b10416a14 | ||
|  | 661c393ab3 | ||
|  | a533a2c845 | ||
|  | 9b0130e3a7 | ||
|  | 18406063a9 | ||
|  | 04fe86fe28 | ||
|  | 143f583ea5 | ||
|  | 75bf4c48a2 | ||
|  | 6c09a8a464 | ||
|  | 85fefcb74b | ||
|  | f56d427d0d | ||
|  | 5d6a962a36 | ||
|  | 9d4bd598f8 | ||
|  | f557ad2d86 | ||
|  | ff40e53f99 | ||
|  | a084f65663 | ||
|  | aa73246705 | ||
|  | e40058b688 | ||
|  | 44f563d94e | ||
|  | 6da2c9de38 | ||
|  | 0ec0d2444c | ||
|  | bd925ea426 | ||
|  | 8ea705ba54 | ||
|  | b7327e5613 | ||
|  | 2dd0c6dfe1 | ||
|  | 11df20b022 | ||
|  | 2226b3733b | ||
|  | ad69011405 | ||
|  | f091321ac7 | ||
|  | ca29a77dd2 | ||
|  | bfbb21228e | ||
|  | f18f98f3ea | ||
|  | 354db2f937 | ||
|  | 3a52cbb083 | ||
|  | 37ec666235 | ||
|  | a8bad5b96f | ||
|  | f01a900c3d | ||
|  | cab34aa178 | ||
|  | c685f3c081 | ||
|  | 75840e02a4 | ||
|  | 40412844ed | ||
|  | 565fb6fcb2 | ||
|  | dde67c0626 | ||
|  | ff312a5b1d | ||
|  | afcfd6caa8 | ||
|  | 41e5b2665a | ||
|  | 7d8e50d5c8 | ||
|  | 327d38f356 | ||
|  | e0e4385e35 | ||
|  | ec9ef47eb6 | ||
|  | b8e09562b1 | ||
|  | 8d0b8d17a0 | ||
|  | befcbf25c8 | ||
|  | b818df0599 | ||
|  | ac37668cd6 | ||
|  | bace1def3d | ||
|  | 9715c28362 | ||
|  | 0d2fb84436 | ||
|  | 2e729a3394 | ||
|  | ac8957511b | ||
|  | f4adb2fab0 | ||
|  | 97ae55bc1f | ||
|  | 9ab95599ab | ||
|  | b967fbd71a | ||
|  | eca0aeb263 | ||
|  | 7f56764456 | ||
|  | bdfc9cf3c7 | ||
|  | 3f27a09ffa | ||
|  | 0de774d55e | ||
|  | 58eceb751a | ||
|  | 27e24ee0be | ||
|  | 65710e72bb | ||
|  | b73b7e9c61 | ||
|  | 4b5e0d70b8 | ||
|  | 3ffcd119f7 | ||
|  | 12134cff51 | ||
|  | 55634c2b4d | ||
|  | ca9913726e | ||
|  | 662527611f | ||
|  | d0666073b6 | ||
|  | decf828911 | ||
|  | 8903d4553a | ||
|  | 281af87870 | ||
|  | bbf3cc1c6c | ||
|  | 22dc407215 | ||
|  | a86910bc6e | ||
|  | ad0161d8e7 | ||
|  | ed9d612e23 | ||
|  | fb6a398380 | ||
|  | 77c480cf89 | ||
|  | c09b2a01d5 | ||
|  | 2aea462902 | ||
|  | d4d686b9d1 | ||
|  | 74c4e9613b | ||
|  | c3eb1db619 | ||
|  | 3e51259802 | ||
|  | 16622b5649 | ||
|  | b82cf2a0e1 | ||
|  | 252ea72212 | ||
|  | 06839ecf21 | ||
|  | 446f80d5fd | ||
|  | 4f1f6fb229 | ||
|  | 6734034782 | ||
|  | f18e443338 | ||
|  | 41857e98ac | ||
|  | 8f7cd4fbcc | ||
|  | 8a28963138 | ||
|  | 75b7d3d79a | ||
|  | 27ad71a856 | ||
|  | b5e65c4086 | ||
|  | a4e1dde375 | ||
|  | a22e8fa0d5 | ||
|  | 6328209ffc | ||
|  | 4de93ae3b4 | ||
|  | d3bc288558 | ||
|  | 742281f807 | ||
|  | d6146ef600 | ||
|  | a3b633f510 | ||
|  | 296fedb89d | ||
|  | 89cad98a82 | ||
|  | 4499445db6 | ||
|  | 76484f4b95 | ||
|  | 4cbe34c08c | ||
|  | 945a087f1b | ||
|  | 56e73bf7ad | ||
|  | 1013f2b29c | ||
|  | 1020513f13 | ||
|  | 2fee0695a1 | ||
|  | 5d2c90bbab | ||
|  | 4f5b1e65aa | ||
|  | 57b048cba0 | ||
|  | 454d77a0df | ||
|  | 309a75a7c8 | ||
|  | a0a34eb431 | ||
|  | 1c60cc9403 | ||
|  | f1ba40f33a | ||
|  | 1e406154d3 | ||
|  | 01b59534fe | ||
|  | 73be1b2646 | ||
|  | 34abb465d2 | ||
|  | f22eb9a004 | ||
|  | 42255fa183 | ||
|  | 17ac94b44a | ||
|  | a744f90b35 | ||
|  | 1f4bd475ef | ||
|  | 60bd2ad03d | ||
|  | 929408e1e5 | ||
|  | dd7ba62505 | ||
|  | cb9edd72d6 | ||
|  | 94dca3d6c4 | ||
|  | f7add33031 | ||
|  | b33e9f8b85 | ||
|  | f2fd618255 | ||
|  | f8d2ac641e | ||
|  | 9d8f35581c | ||
|  | a6300e7163 | ||
|  | bba329a41c | ||
|  | 0014d989a0 | ||
|  | 2765b66115 | ||
|  | ae2b788a65 | ||
|  | 087bd470ec | ||
|  | a8e0988970 | ||
|  | 18b60f9fa2 | ||
|  | ef4c0d20e5 | ||
|  | a9046bb89a | ||
|  | 1a611ae18e | ||
|  | 31df5592bf | ||
|  | 11150f2eea | ||
|  | 1d2510f465 | ||
|  | 53df0f957c | ||
|  | d6c3c2b130 | ||
|  | 539311d192 | ||
|  | 52b742f503 | ||
|  | 83674cf6bb | ||
|  | 63dd7c0fd7 | ||
|  | 99f1cbd934 | ||
|  | f29d742a49 | ||
|  | 41d5eba0bb | ||
|  | 390288d0f4 | ||
|  | ee39c87bf7 | ||
|  | bd4861e4c1 | ||
|  | 115cd0b4ae | ||
|  | ce8be993fe | ||
|  | c857a9af4d | ||
|  | f692f1eca2 | ||
|  | 2fd57b9404 | ||
|  | 585d896cc3 | ||
|  | 2cd746f1d1 | ||
|  | 8b56199ce7 | ||
|  | cd09934080 | ||
|  | 4a7895b0e2 | ||
|  | 4253d7eb8e | ||
|  | cee0a1112f | ||
|  | 053467032d | ||
|  | a7b261a734 | ||
|  | 816c6505d7 | ||
|  | 17d08ef94c | ||
|  | 009a1a98df | ||
|  | abf728c500 | ||
|  | 9ec03075eb | ||
|  | 9b5a92d113 | ||
|  | 75b9400571 | ||
|  | d141f4a908 | ||
|  | 5370e51f8a | ||
|  | ef9f3c6517 | ||
|  | 8756b51ab8 | ||
|  | b355aa642c | ||
|  | 27f4a48e92 | ||
|  | 18182ea5a1 | ||
|  | 6ec6c4a73e | ||
|  | ac46ebb348 | ||
|  | aa1f45e10a | ||
|  | 5e51bfaaa4 | ||
|  | 14578a575e | ||
|  | 298c5b9f8a | ||
|  | e93f2d9d42 | ||
|  | 6e7d0dd8b2 | ||
|  | b89ab13f2d | ||
|  | 196daf7860 | ||
|  | c39483fb3e | ||
|  | 720a36c8de | ||
|  | f48f191273 | ||
|  | 3b3a728b7d | ||
|  | d42606f99a | ||
|  | 14da3b1a52 | ||
|  | 4a33e17110 | ||
|  | bdee85e334 | ||
|  | 376034d4c4 | ||
|  | d8a9b2df48 | ||
|  | bba21ea9f4 | ||
|  | 0dc5f5d7b2 | ||
|  | 5ad75b217f | ||
|  | 4ae1b1ec2e | ||
|  | 72269da46f | ||
|  | 37cfd3fd46 | ||
|  | 5c8af74966 | ||
|  | de1035eb08 | ||
|  | 563e15136c | ||
|  | 49bc304960 | ||
|  | ca7d06b6a6 | ||
|  | 1553352c88 | ||
|  | 87deb83ed5 | ||
|  | 3bff647de9 | ||
|  | d826f0b095 | ||
|  | 49f6fd00d8 | ||
|  | a0c77542ea | ||
|  | 5d1211ba7a | ||
|  | 40dfe9e804 | ||
|  | 224caa595d | ||
|  | 16c8a24163 | ||
|  | bc5c90ca47 | ||
|  | c239b6aa04 | ||
|  | c2dd5e8d29 | ||
|  | 302674273a | ||
|  | f9cfba00bc | ||
|  | 1ed59569e6 | ||
|  | a2208f04c3 | ||
|  | 242bc9a759 | ||
|  | 980b461d59 | ||
|  | 9a7399c2b9 | ||
|  | def00addab | ||
|  | b8767dfe76 | ||
|  | 543ed3d746 | ||
|  | d4749cbe7a | ||
|  | 4f10eb59a9 | ||
|  | cf3dc96e0b | ||
|  | 96072cf9b0 | ||
|  | 56ba5a5a89 | ||
|  | 0833e55c9d | ||
|  | 2f1896b7c4 | ||
|  | b0021631b4 | ||
|  | 65779c1fec | ||
|  | defaa13849 | ||
|  | 751679be2f | ||
|  | f95d7e54f3 | ||
|  | 11a897c366 | ||
|  | b711509609 | ||
|  | a2be11dee6 | ||
|  | 7ee751973a | ||
|  | dc8baff6d3 | ||
|  | 7204db7887 | ||
|  | a2ba873ee0 | ||
|  | 178d7e77a2 | ||
|  | 24673e87ca | ||
|  | 48774e5853 | ||
|  | 704498ed13 | ||
|  | 75594e3e54 | ||
|  | ffbe06071f | ||
|  | 2a23f72102 | ||
|  | b75a945a7a | ||
|  | ec5ab626d9 | ||
|  | 96eae682c0 | ||
|  | a6d286d62d | ||
|  | 3964cc2769 | ||
|  | 543b247d72 | ||
|  | 92f5b6789e | ||
|  | 6e03eaebe4 | ||
|  | b0b5796ece | ||
|  | 627d688c2d | ||
|  | 062af00b20 | ||
|  | f59c178d65 | ||
|  | aeab27e00c | ||
|  | d9fed5e75f | ||
|  | fd260eaefb | ||
|  | 6b1e4556d8 | ||
|  | 59c9757ca3 | ||
|  | 7a4fb1146e | ||
|  | 19e26af1a4 | ||
|  | c760419680 | ||
|  | 0575dcadda | ||
|  | ed55273d5a | ||
|  | 7c3f031e6e | ||
|  | c83712640a | ||
|  | 2526a22e38 | ||
|  | 0dc777d02b | ||
|  | 47e0b485ab | ||
|  | 9dc6dbb4b7 | ||
|  | c32e22ac80 | ||
|  | 931eca4fb3 | ||
|  | ae5cc0e0a4 | ||
|  | 5fe29a09fb | ||
|  | 354750e04a | ||
|  | b70dba7144 | ||
|  | b1e80ec0ca | ||
|  | 0b6c9ed68b | ||
|  | 2a88c51405 | ||
|  | fe582353bb | ||
|  | 32dfdc495c | ||
|  | 72e4300677 | ||
|  | d21e874718 | ||
|  | a0e5ca3656 | ||
|  | 63b12899f0 | ||
|  | 91c49e48d7 | ||
|  | a2e9a4831a | ||
|  | 238f9e5538 | ||
|  | 35a2b6f11d | ||
|  | 947e07a1f3 | ||
|  | 5f0769868f | ||
|  | c3650e0b9c | ||
|  | 7527cdc8c2 | ||
|  | 9d8cd07b8a | ||
|  | dbf81a44e9 | ||
|  | c30278f104 | ||
|  | af0903a979 | ||
|  | 3188da1ad3 | ||
|  | 5134ae67f1 | ||
|  | eb05a503ac | ||
|  | 6f0f5d40b0 | ||
|  | 79b0a142cf | ||
|  | 6892ecf6df | ||
|  | fc76fd16fc | ||
|  | 0cb223e80b | ||
|  | 942a8c4106 | ||
|  | 2e10daef30 | ||
|  | fee27b681b | ||
|  | 9e7c39103f | ||
|  | 7d15d4a1cb | ||
|  | 3ce4c2f542 | ||
|  | f6ec0d0d96 | ||
|  | 0ed6cdb32e | ||
|  | e39d41ec1a | ||
|  | 5464e830af | ||
|  | e4af824c41 | ||
|  | af161676dd | ||
|  | 62681fee0c | ||
|  | 45ae210236 | ||
|  | 0dbbbc40d3 | ||
|  | a8dff862d2 | 
							
								
								
									
										4
									
								
								.env.oms
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,4 @@ | ||||
| VUE_APP_SCOPE=oms | ||||
| VUE_APP_API=http://192.168.1.87:19897 | ||||
| VUE_APP_IS_SIMPLE_SERVER=1 | ||||
| VUE_APP_PORT=19897 | ||||
							
								
								
									
										5
									
								
								.env.xumu
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,5 @@ | ||||
| VUE_APP_SCOPE=xumu | ||||
| VUE_APP_API=http://192.168.1.87:12413 | ||||
| VUE_APP_IS_SIMPLE_SERVER=1 | ||||
| VUE_APP_PORT=12413 | ||||
| VUE_APP_OMS_ID=2cd70a15-a3cf-4b4d-9a22-0f3b3a888b08   # oms定制方案的ID | ||||
							
								
								
									
										33
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,33 @@ | ||||
| .DS_Store | ||||
| node_modules | ||||
| /dist | ||||
|  | ||||
| # local env files | ||||
| .env.local | ||||
| .env.*.local | ||||
|  | ||||
| # Log files | ||||
| npm-debug.log* | ||||
| yarn-debug.log* | ||||
| yarn-error.log* | ||||
|  | ||||
| # Editor directories and files | ||||
| .idea | ||||
| .vscode | ||||
| *.suo | ||||
| *.ntvs* | ||||
| *.njsproj | ||||
| *.sln | ||||
| *.sw? | ||||
| /package-lock.json | ||||
| /lib | ||||
| .prettierrc | ||||
| /oms/dist/ | ||||
| /project/*/index.js | ||||
| /project/*/dist | ||||
| /ui/package-lock.json | ||||
| /examples/modules.json | ||||
| /examples/router/apps.js | ||||
| /src/apps/ | ||||
| /src/config.json | ||||
| /src/utils/apps.js | ||||
							
								
								
									
										14
									
								
								.npmignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,14 @@ | ||||
| # 忽略目录 | ||||
| examples/ | ||||
| packages/ | ||||
| subPackages/ | ||||
| core/ | ||||
| public/ | ||||
| project/ | ||||
| .idea/ | ||||
| ui/lib/ | ||||
|  | ||||
| # 忽略指定文件 | ||||
| vue.config.js | ||||
| babel.config.js | ||||
| *.map | ||||
							
								
								
									
										4
									
								
								.npmrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,4 @@ | ||||
| email=aixianling@sinoecare.com | ||||
| package-lock=false | ||||
| registry=http://registry.npmmirror.com | ||||
| legacy-peer-deps=true | ||||
							
								
								
									
										11
									
								
								babel.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,11 @@ | ||||
| module.exports = { | ||||
|   presets: [ | ||||
|     '@vue/app', | ||||
|   ], | ||||
|   plugins: [ | ||||
|     // 可选链插件, 其他babel插件也是一样的安装方式 | ||||
|     "@babel/plugin-proposal-optional-chaining", | ||||
|     "@babel/plugin-proposal-nullish-coalescing-operator", | ||||
|     "@babel/plugin-proposal-logical-assignment-operators" | ||||
|   ] | ||||
| } | ||||
							
								
								
									
										38
									
								
								bin/appsSync.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,38 @@ | ||||
| const axios = require("axios"); | ||||
| const {chalkTag, findApp, fs} = require("./tools"); | ||||
| const compiler = require('vue-template-compiler') | ||||
| const saveApps = app => { | ||||
|   if (app.list.length > 0) { | ||||
|     return axios.post("http://192.168.1.87:12525/node/wechatapps/addOrUpdate", app, {timeout: 1000}).then(res => { | ||||
|       if (res.data.code == 0) chalkTag.done("产品库目录已同步至后台数据库...") | ||||
|     }).catch(() => 0) | ||||
|   } else return Promise.reject("没有应用") | ||||
| } | ||||
| const getAppInfo = (file, apps) => { | ||||
|   if (/[\\\/](App[A-Z][^\\\/]+)\.vue$/g.test(file)) { | ||||
|     const name = file.replace(/.+[\\\/](App[^\\\/]+)\.vue$/, '$1'), | ||||
|         source = fs.readFileSync(file).toString(), | ||||
|         parsed = compiler.parseComponent(source), | ||||
|         script = parsed.script?.content || "", | ||||
|         label = script.match(/label:[^,]+/)?.[0]?.replace(/.+["']([^"']+).+/, '$1') | ||||
|     apps.push({ | ||||
|       id: file.replace(/\.vue$/, '').replace(/[\\\/]/g, '_'), | ||||
|       label: label || name, | ||||
|       libPath: `/${file.replace(/\.vue$/, '').replace(/[\\\/]/g, '/')}`, | ||||
|       name, | ||||
|       type: 'web' | ||||
|     }) | ||||
|   } | ||||
| } | ||||
| const sync = () => { | ||||
|   chalkTag.info("开始扫描库工程...") | ||||
|   const list = [] | ||||
|   Promise.all([ | ||||
|     findApp('packages', app => getAppInfo(app, list)), | ||||
|     findApp('project', app => getAppInfo(app, list)), | ||||
|   ]).then(() => { | ||||
|     chalkTag.info("正在同步...") | ||||
|     saveApps({type: "web", list}).catch(() => 0).finally(() => chalkTag.done("同步成功!")) | ||||
|   }) | ||||
| } | ||||
| sync() | ||||
							
								
								
									
										99
									
								
								bin/build.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,99 @@ | ||||
| const axios = require('axios') | ||||
| const {fsExtra, copyFiles, findApp, chalkTag, fs} = require("./tools"); | ||||
| const compiler = require('vue-template-compiler') | ||||
| const getBuildConfig = id => { | ||||
|   axios.post('http://192.168.1.87:12525/node/custom/detail', null, {params: {id}}).then(res => { | ||||
|     if (res?.data) { | ||||
|       const config = res.data.data | ||||
|       fsExtra.outputJson('src/config.json', config.extra) | ||||
|       createPages(config) | ||||
|     } | ||||
|   }) | ||||
| } | ||||
| const getAppInfo = (file, apps) => { | ||||
|   if (/[\\\/](App[A-Z][^\\\/]+)\.vue$/g.test(file)) { | ||||
|     const name = file.replace(/.+[\\\/](App[^\\\/]+)\.vue$/, '$1'), | ||||
|       source = fs.readFileSync(file).toString(), | ||||
|       parsed = compiler.parseComponent(source), | ||||
|       script = parsed.script?.content || "", | ||||
|       label = script.match(/label:[^,]+/)?.[0]?.replace(/.+["']([^"']+).+/, '$1') | ||||
|     const paths = file.split(/[\\\/]/) | ||||
|     apps.push({ | ||||
|       id: file.replace(/\.vue$/, '').replace(/[\\\/]/g, '_'), | ||||
|       label: label || name, | ||||
|       path: `/${file.replace(/\.vue$/, '').replace(/[\\\/]/g, '/')}`, | ||||
|       workspace: paths.at(0), | ||||
|       esm: file.replace(/[\\\/]/g, '/').substring(4), | ||||
|       name | ||||
|     }) | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * 根据配置生成应用路由 | ||||
|  * @param {Object} config - 配置对象,用于定制化路由生成过程 | ||||
|  * @returns {Promise} - 返回一个Promise对象,表示路由生成完成 | ||||
|  */ | ||||
| const createRoutes = (config = {}) => { | ||||
|   // 初始化路由数组 | ||||
|   const routes = [] | ||||
|   // 获取签到页面的路径,如果未指定,则使用默认路径 | ||||
|   let signPage = '../views/sign' | ||||
|   let {signPage: sign, homePage: home = "console"} = config.extra || {} | ||||
|   if (config.extra?.signPage) { | ||||
|     signPage = `../apps/custom/${sign}/${sign}` | ||||
|   } | ||||
|   let homePage = `../views/console` | ||||
|   if (config.extra?.homePage) { | ||||
|     homePage = `../apps/custom/${home}/${home}` | ||||
|   } | ||||
|   // 查找并处理所有应用,将它们的信息添加到路由中 | ||||
|   return findApp("src/apps", app => getAppInfo(app, routes)).then(() => { | ||||
|     // 生成并输出apps.js文件,定义所有应用的路由 | ||||
|     fsExtra.outputFile('src/utils/apps.js', `export default [ | ||||
|     {path: "/login", name: "登录", component: () => import('${signPage}')}, | ||||
|     {path: '/dv', name: '数据大屏入口', component: () => import('../views/dvIndex')}, | ||||
|     {path: '/v', name: 'Home', component: () => import('../views/home'), children: [ | ||||
|       {path:'/',name:'mainEntry', component:()=>import('../views/mainEntry'),children:[ | ||||
|       {name: "${home}", path: "${home}", component: () => import('${homePage}')}, | ||||
|       ${routes.filter(e => ![sign, home].includes(e.name)).map(e => { | ||||
|       // 解构每个路由的属性,用于生成路由配置 | ||||
|       const {name, label, esm} = e | ||||
|       // 生成单个路由配置的字符串表示 | ||||
|       return `{name:"${name}",label:"${label}",path:"${name}",component:()=>import("../${esm}")}` | ||||
|     }).join(',\n')}, | ||||
|       {path: '*',name: '404',component: ()=>import('../views/building')}, | ||||
|       ]} | ||||
|     ]}, | ||||
|     {path: '/', name: "init"}, | ||||
|      | ||||
|     ]`) | ||||
|     // 扫描完毕,使用chalkTag标记任务完成 | ||||
|     chalkTag.done("扫描完毕") | ||||
|   }) | ||||
| } | ||||
|  | ||||
| const createPages = (config = {}) => { | ||||
|   fsExtra.emptyDir("src/apps", err => { | ||||
|     if (!err) { | ||||
|       const {customPath, appList} = config | ||||
|       const stdApps = {} | ||||
|       appList.filter(e => !/project/.test(e.id))?.forEach(e => { | ||||
|         const paths = e.libPath.split('/').filter(Boolean) || [] | ||||
|         paths.pop() | ||||
|         stdApps[paths.join("/")] = 1 | ||||
|       }) | ||||
|       Promise.all([ | ||||
|         copyFiles("src/apps/core", "packages/core"), | ||||
|         copyFiles("src/apps/custom", `project/${customPath}`), | ||||
|         ...Object.keys(stdApps).map(e => copyFiles(`src/apps/${e.replace(/^packages[\\\/]/, '')}`, e)), | ||||
|       ]).then(() => createRoutes(config)).then(() => fsExtra.ensureFile("src/apps/actions.js")) | ||||
|     } | ||||
|   }) | ||||
| } | ||||
|  | ||||
| const start = () => { | ||||
|   const buildId = process.argv[2] || process.env.VUE_APP_OMS_ID || 'f670cc46-7cf7-4a0f-86ee-3077044c0b17' | ||||
|   getBuildConfig(buildId) | ||||
| } | ||||
| start() | ||||
							
								
								
									
										37
									
								
								bin/scanApps.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,37 @@ | ||||
| const {chalkTag, findApp, fs, fsExtra} = require("./tools"); | ||||
| const compiler = require('vue-template-compiler') | ||||
| const getAppInfo = (file, apps) => { | ||||
|   if (/[\\\/](App[A-Z][^\\\/]+)\.vue$/g.test(file)) { | ||||
|     const name = file.replace(/.+[\\\/](App[^\\\/]+)\.vue$/, '$1'), | ||||
|       source = fs.readFileSync(file).toString(), | ||||
|       parsed = compiler.parseComponent(source), | ||||
|       script = parsed.script?.content || "", | ||||
|       label = script.match(/label:[^,]+/)?.[0]?.replace(/.+["']([^"']+).+/, '$1') | ||||
|     const paths = file.split(/[\\\/]/) | ||||
|     apps.push({ | ||||
|       id: file.replace(/\.vue$/, '').replace(/[\\\/]/g, '_'), | ||||
|       label: label || name, | ||||
|       path: `/${file.replace(/\.vue$/, '').replace(/[\\\/]/g, '/')}`, | ||||
|       workspace: paths.at(0), | ||||
|       esm: file.replace(/[\\\/]/g, '/'), | ||||
|       name | ||||
|     }) | ||||
|   } | ||||
| } | ||||
|  | ||||
| const start = () => { | ||||
|   chalkTag.info("开始扫描库工程...") | ||||
|   const {VUE_APP_SCOPE, VUE_APP_CORE} = process.env | ||||
|   const list = [] | ||||
|   let scanScope = ['packages', 'project'] | ||||
|   if (VUE_APP_SCOPE) scanScope = [`project/${VUE_APP_SCOPE}`] | ||||
|   if (VUE_APP_CORE) scanScope.push('packages/core') | ||||
|   Promise.all(scanScope.map(e => findApp(e, app => getAppInfo(app, list)))).then(() => { | ||||
|     fsExtra.outputFile('examples/router/apps.js', `export default [${list.map(e => { | ||||
|       const {name, label, path, esm} = e | ||||
|       return `{name:"${name}",label:"${label}",path:"${path}",component:()=>import("@${esm}")}` | ||||
|     }).join(',\n')}]`) | ||||
|     chalkTag.done("扫描完毕") | ||||
|   }) | ||||
| } | ||||
| start() | ||||
							
								
								
									
										70
									
								
								bin/tools.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,70 @@ | ||||
| const fsExtra = require('fs-extra') | ||||
| const path = require('path') | ||||
| const chalk = require('chalk') | ||||
| const fs = require('fs') | ||||
| /** | ||||
|  * 将函数封装成promise | ||||
|  */ | ||||
| const promisify = fn => { | ||||
|   return function () { | ||||
|     let args = arguments; | ||||
|     return new Promise(function (resolve, reject) { | ||||
|       [].push.call(args, function (err, result) { | ||||
|         if (err) { | ||||
|           console.log(err) | ||||
|           reject(err); | ||||
|         } else { | ||||
|           resolve(result); | ||||
|         } | ||||
|       }); | ||||
|       fn.apply(null, args); | ||||
|     }); | ||||
|   } | ||||
| } | ||||
|  | ||||
| const readdir = promisify(fs.readdir) | ||||
| const stat = promisify(fs.stat) | ||||
|  | ||||
| /** | ||||
|  * 封装打印工具 | ||||
|  */ | ||||
| const {log} = console | ||||
| const chalkTag = { | ||||
|   info: msg => log([chalk.bgBlue.black(' INFO '), msg].join(' ')), | ||||
|   done: msg => log([chalk.bgGreen.black(' DONE '), msg].join(' ')), | ||||
|   warn: msg => log([chalk.bgYellow.black(' WARN '), msg].join(' ')), | ||||
|   error: msg => log([chalk.bgRed.black(' ERROR '), msg].join(' ')), | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * 遍历应用的方法 | ||||
|  */ | ||||
| const findApp = (dir, cb) => { | ||||
|   fsExtra.ensureDirSync(dir) | ||||
|   return readdir(dir).then(apps => { | ||||
|     return Promise.all(apps.map(e => { | ||||
|       let cPath = path.join(dir, e) | ||||
|       return stat(cPath).then(state => { | ||||
|         if (state.isDirectory()) { | ||||
|           return findApp(cPath, cb) | ||||
|         } else if (state.isFile()) { | ||||
|           cb && cb(cPath) | ||||
|         } | ||||
|       }) | ||||
|     }) || []) | ||||
|   }) | ||||
| } | ||||
| const copyFiles = (dir, source = 'src/mods') => { | ||||
|   chalkTag.info(`开始扫描${source}...`) | ||||
|   return new Promise(resolve => { | ||||
|     fsExtra.emptyDir(dir, err => { | ||||
|       if (!err) { | ||||
|         fsExtra.copy(source, dir).then(() => { | ||||
|           chalkTag.done(source + ' 扫描完毕') | ||||
|           resolve() | ||||
|         }) | ||||
|       } | ||||
|     }) | ||||
|   }) | ||||
| } | ||||
| module.exports = {findApp, chalkTag, fsExtra, copyFiles, fs, path} | ||||
							
								
								
									
										147
									
								
								examples/App.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,147 @@ | ||||
| <template> | ||||
|   <div id="app"> | ||||
|     <header-nav v-if="showTools" title="web端产品库"> | ||||
|       <template #right> | ||||
|         <mock/> | ||||
|         <div @click="showTools=false,dvDev=true">大屏开发</div> | ||||
|         <div @click="showTools=false">隐藏工具栏</div> | ||||
|         <div @click="handleLogin">点此登录</div> | ||||
|       </template> | ||||
|     </header-nav> | ||||
|     <ai-dv-wrapper class="fill" v-if="dvDev"> | ||||
|       <router-view v-bind="commonAttrs"/> | ||||
|     </ai-dv-wrapper> | ||||
|     <el-row v-else-if="showTools" class="fill mar-t48" type="flex"> | ||||
|       <slider-nav/> | ||||
|       <main-content class="fill" :commonAttrs="commonAttrs"/> | ||||
|     </el-row> | ||||
|     <router-view class="fill" v-else v-bind="commonAttrs"/> | ||||
|     <div v-if="dialog" class="sign-box"> | ||||
|       <ai-sign style="margin: auto" :instance="$request" :action="{login}" | ||||
|                visible @login="getToken" :showScanLogin="false"/> | ||||
|     </div> | ||||
|     <el-button type="info" v-if="!showTools" class="fixedBtn" @click="showTools=true">显示工具栏</el-button> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import SliderNav from "./components/sliderNav"; | ||||
| import MainContent from "./components/mainContent"; | ||||
| import HeaderNav from "./components/headerNav"; | ||||
| import {mapActions, mapMutations, mapState} from "vuex"; | ||||
| import Mock from "./components/mock"; | ||||
| import AiDvWrapper from "dui/dv/layout/AiDvWrapper/AiDvWrapper.vue"; | ||||
|  | ||||
| export default { | ||||
|   name: 'app', | ||||
|   components: {AiDvWrapper, Mock, HeaderNav, MainContent, SliderNav}, | ||||
|   computed: { | ||||
|     ...mapState(['user']), | ||||
|     login() { | ||||
|       let url = '/auth/oauth/token'; | ||||
|       /project\/sass/g.test(location.pathname) && (url += "?corpId=ww596787bb70f08288") | ||||
|       return url | ||||
|     }, | ||||
|     commonAttrs() { | ||||
|       return { | ||||
|         instance: this.$request, | ||||
|         dict: this.$dict, | ||||
|         permissions: this.$permissions | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       dialog: false, | ||||
|       showTools: true, | ||||
|       dvDev: false | ||||
|     } | ||||
|   }, | ||||
|   watch: { | ||||
|     showTools(v) { | ||||
|       v && (this.dvDev = false) | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     ...mapMutations(['setToken']), | ||||
|     ...mapActions(['getUserInfo', 'getFinanceUser']), | ||||
|     getToken(params) { | ||||
|       if (params.access_token) { | ||||
|         this.setToken([params.token_type, params.access_token].join(' ')) | ||||
|         this.dialog = false | ||||
|         this.$message.success("登录成功,正在刷新页面...") | ||||
|         location.reload() | ||||
|       } else this.$message.error(params.msg || "登录失败!") | ||||
|  | ||||
|     }, | ||||
|     handleLogin() { | ||||
|       this.$request.delete("/auth/token/logout").finally(() => { | ||||
|         this.dialog = true | ||||
|       }) | ||||
|     }, | ||||
|     handleMock() { | ||||
|     } | ||||
|   }, | ||||
|   created() { | ||||
|     const {jWeixin} = window | ||||
|     window.wx = jWeixin | ||||
|     if (this.user.token) this.getUserInfo().finally(() => { | ||||
|       if (/^\/project\/xiushan/.test(location.pathname)) { | ||||
|         this.getFinanceUser() | ||||
|       } | ||||
|     }) | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss"> | ||||
| html, body { | ||||
|   width: 100%; | ||||
|   height: 100%; | ||||
|   margin: 0; | ||||
| } | ||||
|  | ||||
| .mar-t48 { | ||||
|   margin-top: 48px; | ||||
| } | ||||
|  | ||||
| #app { | ||||
|   font-family: 'Avenir', Helvetica, Arial, sans-serif; | ||||
|   -webkit-font-smoothing: antialiased; | ||||
|   -moz-osx-font-smoothing: grayscale; | ||||
|   color: #2c3e50; | ||||
|   overflow: hidden; | ||||
|   width: 100%; | ||||
|   height: 100%; | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
|  | ||||
|   .fixedBtn { | ||||
|     position: fixed; | ||||
|     top: 0; | ||||
|     right: 60px; | ||||
|     opacity: 0; | ||||
|     z-index: 999; | ||||
|  | ||||
|     &:hover { | ||||
|       opacity: 1; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   li { | ||||
|     list-style-type: none; | ||||
|   } | ||||
|  | ||||
|   .sign-box { | ||||
|     z-index: 99; | ||||
|     margin: -10px; | ||||
|     display: flex; | ||||
|     position: fixed; | ||||
|     top: 0; | ||||
|     width: 100%; | ||||
|     height: 100%; | ||||
|     background: rgba(0, 0, 0, 0.2); | ||||
|   } | ||||
| } | ||||
|  | ||||
| </style> | ||||
							
								
								
									
										
											BIN
										
									
								
								examples/assets/building.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 22 KiB | 
							
								
								
									
										
											BIN
										
									
								
								examples/assets/file.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.2 KiB | 
							
								
								
									
										271
									
								
								examples/components/headerNav.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,271 @@ | ||||
| <template> | ||||
|   <div class="headerNav navBg"> | ||||
|     <div style="position: relative"> | ||||
|       <ai-icon type="logo" :icon="'iconcunwei'"/> | ||||
|       <ai-icon type="logo" :icon="'iconcunwei'" class="textShadow"/> | ||||
|     </div> | ||||
|     <span class="headerTitle">{{ title }}<div class="textShadow" v-html="title"/></span> | ||||
|     <el-row type="flex" align="middle" class="toolbar"> | ||||
|       <slot v-if="$slots.right" name="right"/> | ||||
|     </el-row> | ||||
|     <el-dropdown @visible-change="v=>isClick=v" @command="doMenu" class="rightDropdown"> | ||||
|       <el-row type="flex" align="middle"> | ||||
|         <el-avatar :src="user.info.avatar"> | ||||
|           {{ defaultAvatar }} | ||||
|         </el-avatar> | ||||
|         <span v-text="defaultName"/> | ||||
|         <i :class="dropdownIcon"/> | ||||
|       </el-row> | ||||
|       <el-dropdown-menu> | ||||
|         <el-dropdown-item command="user">用户中心</el-dropdown-item> | ||||
|         <el-dropdown-item command="signOut">退出</el-dropdown-item> | ||||
|       </el-dropdown-menu> | ||||
|     </el-dropdown> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import {mapState} from "vuex"; | ||||
|  | ||||
| export default { | ||||
|   name: 'headerNav', | ||||
|   props: { | ||||
|     title: {default: ""} | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       isClick: false, | ||||
|       drawer: false,//抽屉 | ||||
|       count: 0, | ||||
|       filesList: [], | ||||
|       fileName: '', | ||||
|       badgeNum: 0, | ||||
|       dvOptions: [] | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState(['user']), | ||||
|     dropdownIcon: v => v.isClick ? 'el-icon-caret-top' : 'el-icon-caret-bottom', | ||||
|     defaultAvatar: v => v.user.info.name?.slice(-2) || "无名", | ||||
|     defaultName: v => [v.user.info.name, v.user.info.roleName].filter(Boolean)?.join(" - ") || "请先登录" | ||||
|   }, | ||||
|   methods: { | ||||
|     // 获取最新的安卓、ios下载二维码 | ||||
|     doMenu(comm) { | ||||
|       switch (comm) { | ||||
|         case 'signOut': | ||||
|           //登出 | ||||
|           this.$confirm("是否要登出?", {type: "warning"}).then(() => { | ||||
|             this.$store.commit("SignOut") | ||||
|           }).catch(() => { | ||||
|           }) | ||||
|           break; | ||||
|         case 'user': | ||||
|           this.$router.push({name: "个人中心"}) | ||||
|           break; | ||||
|       } | ||||
|     }, | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .headerNav { | ||||
|   display: flex; | ||||
|   align-items: center; | ||||
|   width: 100%; | ||||
|   background-repeat: no-repeat; | ||||
|   background-size: 100% 48px; | ||||
|   position: fixed; | ||||
|   z-index: 99; | ||||
|   height: 48px; | ||||
|   padding-left: 24px; | ||||
|   box-sizing: border-box; | ||||
|   top: 0; | ||||
|   color: white; | ||||
|   font-size: 14px; | ||||
|  | ||||
|   .AiIcon { | ||||
|     font-size: 38px; | ||||
|     width: auto; | ||||
|     height: auto; | ||||
|     background: linear-gradient(180deg, #FFFFFF 0%, #CCDBF6 100%); | ||||
|     -webkit-background-clip: text; | ||||
|     -webkit-text-fill-color: transparent; | ||||
|  | ||||
|     &:hover { | ||||
|       color: white; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .headerTitle { | ||||
|     flex: 1; | ||||
|     min-width: 0; | ||||
|     font-size: 24px; | ||||
|     color: #FFF; | ||||
|     line-height: 28px; | ||||
|     background: linear-gradient(180deg, #FFFFFF 0%, #CCDBF6 100%); | ||||
|     -webkit-background-clip: text; | ||||
|     -webkit-text-fill-color: transparent; | ||||
|     font-weight: bold; | ||||
|     margin-left: 8px; | ||||
|     position: relative; | ||||
|   } | ||||
|  | ||||
|   .textShadow { | ||||
|     position: absolute; | ||||
|     top: 0; | ||||
|     text-shadow: 0 2px 0 #384DC3; | ||||
|     color: transparent; | ||||
|     z-index: -1; | ||||
|   } | ||||
|  | ||||
|   :deep(.toolbar) { | ||||
|     gap: 12px; | ||||
|     margin-right: 32px; | ||||
|  | ||||
|     & > div, .toolbarBtn { | ||||
|       color: #fff; | ||||
|       padding: 0 12px; | ||||
|  | ||||
|       &:hover { | ||||
|         cursor: pointer; | ||||
|         color: rgba(#fff, .8); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .el-dropdown { | ||||
|     height: 48px; | ||||
|     line-height: 48px; | ||||
|     color: #fff; | ||||
|     padding: 0 12px; | ||||
|  | ||||
|     &:hover { | ||||
|       background-color: rgba(46, 51, 68, .15); | ||||
|       color: white; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .el-image { | ||||
|     margin: 12px 0 12px 16px; | ||||
|   } | ||||
|  | ||||
|  | ||||
|   .rightDropdown { | ||||
|     font-size: 12px; | ||||
|     padding: 0 16px; | ||||
|     height: 48px; | ||||
|     background: rgba(#fff, .1); | ||||
|  | ||||
|     .el-row { | ||||
|       gap: 4px; | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| :deep( .downLoad_main ) { | ||||
|   width: 100%; | ||||
|   height: 100%; | ||||
|   padding: 16px; | ||||
|   box-sizing: border-box; | ||||
|  | ||||
|   .search_top { | ||||
|     display: flex; | ||||
|     justify-content: space-between; | ||||
|     align-items: center; | ||||
|     padding-bottom: 8px; | ||||
|   } | ||||
|  | ||||
|   .infinite-list { | ||||
|     width: 100%; | ||||
|     height: 100%; | ||||
|  | ||||
|     .infinite-list-item { | ||||
|       width: 100%; | ||||
|       padding: 8px; | ||||
|       box-sizing: border-box; | ||||
|       background: rgba(255, 255, 255, 1); | ||||
|       border-radius: 4px; | ||||
|       border: 1px solid rgba(208, 212, 220, 1); | ||||
|       margin-bottom: 8px; | ||||
|       display: flex; | ||||
|       justify-content: space-between; | ||||
|  | ||||
|       .left { | ||||
|         display: flex; | ||||
|         justify-content: center; | ||||
|         align-items: center; | ||||
|         width: 30px; | ||||
|  | ||||
|         .svg { | ||||
|           width: 24px; | ||||
|           height: 24px; | ||||
|           vertical-align: middle; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       .middle { | ||||
|         flex: 1; | ||||
|  | ||||
|         .fileName { | ||||
|           color: #333333; | ||||
|           font-size: 14px; | ||||
|         } | ||||
|  | ||||
|         p:nth-child(2) { | ||||
|           color: #999999; | ||||
|           font-size: 12px; | ||||
|  | ||||
|           span { | ||||
|             padding: 0 4px; | ||||
|           } | ||||
|  | ||||
|           span:nth-child(2) { | ||||
|             border-right: solid 1px #999999; | ||||
|           } | ||||
|  | ||||
|           span:nth-child(3) { | ||||
|             border-right: solid 1px #999999; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       .right { | ||||
|         display: flex; | ||||
|         justify-content: center; | ||||
|         align-items: center; | ||||
|         font-size: 12px; | ||||
|         width: 90px; | ||||
|         text-align: center; | ||||
|  | ||||
|         span { | ||||
|           color: #999999; | ||||
|         } | ||||
|  | ||||
|         i { | ||||
|           display: block; | ||||
|           width: 50px; | ||||
|           color: #5088FF; | ||||
|           font-size: 12px; | ||||
|           cursor: pointer; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|     } | ||||
|  | ||||
|   } | ||||
|  | ||||
|   ::-webkit-scrollbar { | ||||
|     width: 4px; | ||||
|     background-color: #eee; | ||||
|   } | ||||
|  | ||||
|   ::-webkit-scrollbar-thumb { | ||||
|     background-color: #8888; | ||||
|  | ||||
|   } | ||||
| } | ||||
|  | ||||
| </style> | ||||
							
								
								
									
										30
									
								
								examples/components/mainContent.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,30 @@ | ||||
| <template> | ||||
|   <section class="mainContent"> | ||||
|     <ai-nav-tab :routes="$apps"/> | ||||
|     <div class="fill"> | ||||
|       <router-view v-bind="$attrs.commonAttrs"/> | ||||
|       <ai-empty v-if="isHome">欢迎使用村微产品库</ai-empty> | ||||
|     </div> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import AiNavTab from "dui/packages/basic/AiNavTab"; | ||||
|  | ||||
| export default { | ||||
|   name: "mainContent", | ||||
|   components: {AiNavTab}, | ||||
|   computed: { | ||||
|     isHome: v => v.$route.path == '/', | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .mainContent { | ||||
|   height: 100%; | ||||
|   width: 100%; | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										110
									
								
								examples/components/mock.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,110 @@ | ||||
| <template> | ||||
|   <section class="mock"> | ||||
|     <el-dropdown> | ||||
|       <div class="toolbarBtn" v-text="`生成随机数据`"/> | ||||
|       <el-dropdown-menu slot="dropdown"> | ||||
|         <el-dropdown-item> | ||||
|           <ai-dialog-btn dialogTitle="随机数据配置" :customFooter="false" @onConfirm="submit" appendToBody @open="getBeans" width="500px"> | ||||
|             <div class="btn" slot="btn">生成数据</div> | ||||
|             <el-form size="small" label-width="60px"> | ||||
|               <el-form-item label="接口"> | ||||
|                 <el-input v-model="action" placeholder="请输入接口" @change="handleAction"/> | ||||
|               </el-form-item> | ||||
|             </el-form> | ||||
|           </ai-dialog-btn> | ||||
|         </el-dropdown-item> | ||||
|         <el-dropdown-item> | ||||
|           <ai-dialog-btn dialogTitle="随机数据配置" :customFooter="false" @onConfirm="generateForm" appendToBody @open="getBeans" width="500px"> | ||||
|             <div class="btn" slot="btn">页面数据</div> | ||||
|             <el-form size="small" label-width="60px"> | ||||
|               <el-form-item label="接口"> | ||||
|                 <el-input v-model="action" placeholder="请输入接口" @change="handleAction"/> | ||||
|               </el-form-item> | ||||
|             </el-form> | ||||
|           </ai-dialog-btn> | ||||
|         </el-dropdown-item> | ||||
|       </el-dropdown-menu> | ||||
|     </el-dropdown> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import Mock from "mockjs" | ||||
| import instance from "../router/axios"; | ||||
|  | ||||
| export default { | ||||
|   name: "mock", | ||||
|   data() { | ||||
|     return { | ||||
|       instance, | ||||
|       action: "", | ||||
|       config: "", | ||||
|       swagger: {},//swagger接口对象集合 | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     url: v => /addOrUpdate/.test(v.action) ? v.action : `/${v.action}/addOrUpdate` | ||||
|   }, | ||||
|   methods: { | ||||
|     handleAction() { | ||||
|       let formName = this.swagger.paths[this.url]?.post.parameters.find(e => e.in == "body")?.name || "" | ||||
|       const {Random} = Mock | ||||
|       if (formName) { | ||||
|         formName = Random.capitalize(formName) | ||||
|         const props = this.swagger.definitions[formName]?.properties || {} | ||||
|         Object.keys(props).map(e => { | ||||
|           const item = props[e] | ||||
|           if (item.format == "date-time") { | ||||
|             props[e] = () => Random.datetime() | ||||
|           } else if (/[0-9a-zA-Z]/.test(item.description)) { | ||||
|             props[e] = () => Random.pick(item.description?.match(/\b[0-9a-zA-Z]+\b/g)) | ||||
|           } else if (/address/i.test(e)) { | ||||
|             props[e] = () => Random.county(true) | ||||
|           } else if (/userName/i.test(e)) { | ||||
|             props[e] = () => Random.cname() | ||||
|           } else if (/lat/.test(e)) { | ||||
|             props[e] = () => Random.float(3, 53, 6, 8) | ||||
|           } else if (/lng/.test(e)) { | ||||
|             props[e] = () => Random.float(73, 135, 6, 8) | ||||
|           } else if (item.type == "number") { | ||||
|             props[e] = () => Random.float(0, 1000, 0, 2) | ||||
|           } else if (item.type == "integer") { | ||||
|             props[e] = () => Random.integer(0, 1000) | ||||
|           } else if (item.type == "string") { | ||||
|             props[e] = () => Random.ctitle() | ||||
|           } else props[e] = null | ||||
|         }) | ||||
|         this.config = props | ||||
|       } | ||||
|     }, | ||||
|     getBeans() { | ||||
|       this.instance.get("/app/v2/api-docs", {withoutToken: true}).then(res => this.swagger = res) | ||||
|     }, | ||||
|     generateForm() { | ||||
|       const {mock} = Mock | ||||
|       this.$vm.$emit("mock", mock(this.config)) | ||||
|     }, | ||||
|     submit() { | ||||
|       const {mock} = Mock | ||||
|       const data = mock({ | ||||
|         'list|50-100': [this.config] | ||||
|       }) | ||||
|       Promise.all(data.list.map(e => this.instance.post(this.url, e))).then(() => this.$message.success("随机数据生成,执行完毕!")) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .mock { | ||||
|   .btn { | ||||
|     cursor: pointer; | ||||
|     user-select: none; | ||||
|     padding: 0 12px; | ||||
|  | ||||
|     &:hover { | ||||
|       color: rgba(#fff, .8); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										259
									
								
								examples/components/sliderNav.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,259 @@ | ||||
| <template> | ||||
|   <section class="sliderNav"> | ||||
|     <el-input class="searchApp" size="small" v-model="searchApp" placeholder="搜索应用" clearable | ||||
|               prefix-icon="iconfont iconSearch" @change="recordSearch"/> | ||||
|     <el-scrollbar class="ai-menu"> | ||||
|       <div v-for="(item,i) in navs" :key="i"> | ||||
|         <div class="rootMenu" :class="{isActive:menuPath.includes(item.name)}" | ||||
|              @click.stop="openKidMenu(item)"> | ||||
|           <i class="prep-icon" :class="item.style||'iconfont iconloudongmoxing'"/> | ||||
|           <span class="menuName fill" v-text="item.label"/> | ||||
|           <el-badge type="warning" :hidden="!item.project" :value="item.project"/> | ||||
|           <i v-if="item.children" class="iconfont" :class="arrowIcon(item.showChildren)"/> | ||||
|         </div> | ||||
|         <div class="kidMenu" v-if="item.showChildren" @click.stop> | ||||
|           <div class="kidPane"> | ||||
|             <div class="submenu wrap" flex v-for="menu in item.children" :key="menu.name"> | ||||
|               <b v-text="menu.label" :class="{menuBtn:menu.type==1,current:menuPath.includes(menu.name)}" | ||||
|                  @click="handleSelect(menu)"/> | ||||
|               <div class="menuBtn" v-for="kid in menu.children" :key="kid.name" v-text="kid.label" | ||||
|                    @click="handleSelect(kid)" | ||||
|                    :class="{current:menuPath.includes(kid.name)}"/> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="divider"/> | ||||
|     </el-scrollbar> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import {mapState} from "vuex"; | ||||
|  | ||||
| export default { | ||||
|   name: "sliderNav", | ||||
|   data() { | ||||
|     return { | ||||
|       searchApp: "", | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState(['user']), | ||||
|     navs() { | ||||
|       let reg = new RegExp(`.*${this.searchApp?.replace(/-/g,'')||''}.*`, 'gi') | ||||
|       return (this.$apps || []).filter(e => !this.searchApp || reg?.test(e.name) || reg?.test(e.label)).map(e => { | ||||
|         if (/\/project\//.test(e.path)) { | ||||
|           e.project = process.env.VUE_APP_SCOPE || e.path.replace(/.*project\/([^\/]+)\/.+/, '$1') | ||||
|         } else if (/\/core\//.test(e.path)) { | ||||
|           e.project = "core" | ||||
|         } | ||||
|         return e | ||||
|       }) | ||||
|     }, | ||||
|     menuPath() { | ||||
|       let paths = [], current = this.$apps?.find(e => e.name == this.$route.name) | ||||
|       const findParent = name => { | ||||
|         let menu = this.$apps?.find(e => e.name == name) | ||||
|         if (menu) { | ||||
|           paths.push(menu.name) | ||||
|           if (!!menu.parentId) findParent(menu.parentId) | ||||
|         } | ||||
|       } | ||||
|       if (current) { | ||||
|         findParent(current.name) | ||||
|       } | ||||
|       return paths | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     openKidMenu(parent) { | ||||
|       if (parent.children) { | ||||
|         parent.showChildren = !parent.showChildren | ||||
|       } else { | ||||
|         this.handleSelect(parent) | ||||
|       } | ||||
|     }, | ||||
|     handleSelect(item) { | ||||
|       if (!item.path) return | ||||
|       if (item.name == this.$route.name) { | ||||
|         //避免同一路由跳转的BUG vue-router官方BUG | ||||
|       } else { | ||||
|         let {name, path} = item | ||||
|         if (/\?app=/.test(path)) { | ||||
|           this.goto({name, query: {app: path.replace(/.+\?app=/, '')}}) | ||||
|         } else if (/\?moduleId=/.test(path)) { | ||||
|           this.goto({name, query: {moduleId: path.replace(/.+\?moduleId=/, '')}}) | ||||
|         } else { | ||||
|           this.goto({name}) | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     goto(item) { | ||||
|       this.$router.push(item) | ||||
|     }, | ||||
|     subMenuIcon(flag) { | ||||
|       return flag ? 'iconfont iconArrow_Down' : "iconfont iconArrow_Right" | ||||
|     }, | ||||
|     arrowIcon(v) { | ||||
|       return v ? "iconArrow_Down" : "iconArrow_Right" | ||||
|     }, | ||||
|     recordSearch() { | ||||
|       localStorage.setItem("searchApp", this.searchApp) | ||||
|     }, | ||||
|   }, | ||||
|   created() { | ||||
|     this.searchApp = localStorage.getItem("searchApp") || "" | ||||
|   } | ||||
| } | ||||
| </script> | ||||
| <style lang="scss" scoped> | ||||
| .sliderNav { | ||||
|   min-width: 200px; | ||||
|   height: 100%; | ||||
|   transition: width .1s; | ||||
|   display: flex; | ||||
|   justify-content: space-between; | ||||
|   flex-direction: column; | ||||
|   border-right: 1px solid #e5e5e5; | ||||
|   flex-shrink: 0; | ||||
|   box-sizing: border-box; | ||||
|   background: #EFF1F4; | ||||
|   color: #222; | ||||
|   position: relative; | ||||
|  | ||||
|   .kidMenu { | ||||
|     padding: 0 16px; | ||||
|     background: #EFF1F4; | ||||
|  | ||||
|     .rootName { | ||||
|       font-size: 20px; | ||||
|       color: #333; | ||||
|       cursor: default; | ||||
|     } | ||||
|  | ||||
|     .kidPane { | ||||
|       font-size: 13px; | ||||
|  | ||||
|       .submenu { | ||||
|         margin-top: 8px; | ||||
|         width: 100%; | ||||
|         color: #aaa; | ||||
|  | ||||
|         & > b { | ||||
|           width: 100%; | ||||
|           line-height: 28px; | ||||
|         } | ||||
|  | ||||
|         & > * { | ||||
|           cursor: default; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       .menuBtn { | ||||
|         display: block; | ||||
|         width: 50%; | ||||
|         cursor: pointer; | ||||
|         line-height: 32px; | ||||
|         color: #333; | ||||
|         flex-shrink: 0; | ||||
|  | ||||
|         &:hover { | ||||
|           color: #26f; | ||||
|         } | ||||
|  | ||||
|         &.current { | ||||
|           color: #26f; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .rootMenu { | ||||
|     padding: 0 16px; | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     height: 44px; | ||||
|     cursor: pointer; | ||||
|     box-shadow: 0px -1px 0px 0px #D8DCE3 inset, 0px 1px 0px 0px #FFF inset, -1px 0px 0px 0px #E5E5E5 inset; | ||||
|     gap: 8px; | ||||
|     font-size: 13px; | ||||
|  | ||||
|     .iconfont { | ||||
|       color: #89B; | ||||
|       font-size: 20px; | ||||
|     } | ||||
|  | ||||
|     &.isActive { | ||||
|       color: #26f; | ||||
|  | ||||
|       .iconfont { | ||||
|         color: #26f !important; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     &:hover { | ||||
|       color: #26f; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep( .ai-menu ) { | ||||
|     padding-left: 0; | ||||
|     flex: 1; | ||||
|     min-height: 0; | ||||
|  | ||||
|     .el-scrollbar__wrap { | ||||
|       overflow-x: auto; | ||||
|     } | ||||
|  | ||||
|     &::-webkit-scrollbar { | ||||
|       display: none; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep( .searchApp ) { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     height: 44px; | ||||
|     padding: 0 16px; | ||||
|     box-shadow: 0px -1px 0px 0px #E5E5E5 inset; | ||||
|  | ||||
|     .el-input__inner { | ||||
|       border: none; | ||||
|       background: inherit; | ||||
|       padding: 0 28px; | ||||
|     } | ||||
|  | ||||
|     .el-input__prefix { | ||||
|       left: 16px; | ||||
|  | ||||
|       .iconSearch { | ||||
|         font-size: 20px; | ||||
|         width: fit-content; | ||||
|         color: #89B; | ||||
|         line-height: 44px; | ||||
|       } | ||||
|  | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .divider { | ||||
|     color: #aaa; | ||||
|     border-top: 1px solid #ddd; | ||||
|     position: relative; | ||||
|     font-size: 12px; | ||||
|     margin: 16px 16px 32px; | ||||
|  | ||||
|     &:before { | ||||
|       content: "到达底部"; | ||||
|       position: absolute; | ||||
|       top: 50%; | ||||
|       left: 50%; | ||||
|       transform: translate(-50%, -50%); | ||||
|       padding: 0 16px; | ||||
|       background: #EFF1F4; | ||||
|       white-space: nowrap; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										35
									
								
								examples/main.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,35 @@ | ||||
| import Vue from 'vue'; | ||||
| import App from './App.vue'; | ||||
| import ui from 'element-ui'; | ||||
| import router from './router'; | ||||
| import axios from './router/axios'; | ||||
| import utils from './utils'; | ||||
| import dui from 'dui/packages'; | ||||
| import store from './store'; | ||||
| import dataV from '@jiaminghi/data-view'; | ||||
| import dvui from 'dui/dv' | ||||
|  | ||||
| Vue.use(dataV) | ||||
| Vue.use(ui); | ||||
| Vue.use(dui); | ||||
| Vue.use(dvui); | ||||
| //富文本编辑器配置 | ||||
| Vue.config.productionTip = false; | ||||
| Object.keys(utils).map((e) => (Vue.prototype[e] = utils[e])); | ||||
| Vue.prototype.$request = axios | ||||
| const app = new Vue({ | ||||
|   router, | ||||
|   store, | ||||
|   render: h => h(App) | ||||
| }); | ||||
|  | ||||
| let theme = null | ||||
| store.dispatch('getSystem').then(res => { | ||||
|   theme = JSON.parse(res?.colorScheme || null) | ||||
|   Vue.prototype.$theme = theme?.web || "blue" | ||||
|   return import(`dui/lib/styles/theme.${theme?.web}.scss`).catch(() => 0) | ||||
| }).finally(() => { | ||||
|   Vue.prototype.$vm = app | ||||
|   import(`dui/lib/styles/common.scss`).finally(() => app.$mount('#app')) | ||||
| }) | ||||
|  | ||||
							
								
								
									
										18
									
								
								examples/router/axios.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,18 @@ | ||||
| import { Message } from 'element-ui' | ||||
| import instance from 'dui/lib/js/request' | ||||
|  | ||||
| let baseURLs = { | ||||
|   production: "/", | ||||
|   development: '/lan' | ||||
| } | ||||
| instance.defaults.baseURL = baseURLs[process.env.NODE_ENV] | ||||
| instance.interceptors.request.use(config => { | ||||
|   if (config.url.startsWith("/node")) { | ||||
|     config.url = "/ns" + config.url | ||||
|   } | ||||
|   if (process.env.VUE_APP_IS_SIMPLE_SERVER == 1) { | ||||
|     config.url = config.url.replace(/^\/(app|auth|admin)\//, "/api/") | ||||
|   } | ||||
|   return config | ||||
| }, error => Message.error(error)) | ||||
| export default instance | ||||
							
								
								
									
										18
									
								
								examples/router/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,18 @@ | ||||
| import Vue from 'vue' | ||||
| import VueRouter from 'vue-router' | ||||
| import apps from "./apps"; | ||||
|  | ||||
| Vue.use(VueRouter) | ||||
| Vue.prototype.$apps = apps | ||||
| export default new VueRouter({ | ||||
|   mode: 'history', | ||||
|   hashbang: false, | ||||
|   routes: apps, | ||||
|   scrollBehavior(to) { | ||||
|     if (to.hash) { | ||||
|       return { | ||||
|         selector: to.hash | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| }) | ||||
							
								
								
									
										12
									
								
								examples/store/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,12 @@ | ||||
| import Vue from 'vue' | ||||
| import Vuex from 'vuex' | ||||
| import preState from 'vuex-persistedstate' | ||||
| import * as modules from "dui/lib/js/modules" | ||||
| import xsActions from "../../project/xiushan/actions" | ||||
|  | ||||
| Vue.use(Vuex) | ||||
| export default new Vuex.Store({ | ||||
|   actions: {...xsActions}, | ||||
|   modules, | ||||
|   plugins: [preState()] | ||||
| }) | ||||
							
								
								
									
										102
									
								
								examples/utils/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,102 @@ | ||||
| import {MessageBox} from 'element-ui' | ||||
| import store from '../store' | ||||
| import tools from 'dui/lib/js/utils' | ||||
|  | ||||
| const addChildParty = (parent, pending) => { | ||||
|   let doBeforeCount = pending.length | ||||
|   parent["children"] = parent["children"] || [] | ||||
|   pending.map((e, index, arr) => { | ||||
|     if (e.partyOrgParentId == parent.partyOrgId) { | ||||
|       parent.children.push(e) | ||||
|       arr.splice(index, 1) | ||||
|       addChildParty(parent, arr) | ||||
|     } | ||||
|   }) | ||||
|   if (parent.children.length == 0) { | ||||
|     delete parent.children | ||||
|   } | ||||
|   if (pending.length > 0 && doBeforeCount > pending.length) { | ||||
|     parent.children.map(c => addChildParty(c, pending)) | ||||
|   } | ||||
| } | ||||
| /** | ||||
|  * 封装提示框 | ||||
|  */ | ||||
|  | ||||
|  | ||||
| const $confirm = (content, options) => { | ||||
|   return MessageBox.confirm(content, { | ||||
|     type: "warning", | ||||
|     confirmButtonText: "确认", | ||||
|     closeOnClickModal: false, | ||||
|     center: true, | ||||
|     title: "提示", | ||||
|     dangerouslyUseHTMLString: true, | ||||
|     ...options | ||||
|   }) | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * 封装权限判断方法 | ||||
|  */ | ||||
|  | ||||
|  | ||||
| const $permissions = flag => { | ||||
|   const buttons = store.state.user.info.buttons | ||||
|   if (buttons) return buttons.some(b => b.id == flag || b.permission == flag) | ||||
|   else return false | ||||
| } | ||||
|  | ||||
| const $decimalCalc = (...arr) => { | ||||
|   //确认提升精度 | ||||
|   let decimalLengthes = arr.map(e => { | ||||
|     let index = ("" + e).indexOf(".") | ||||
|     return ("" + e).length - index | ||||
|   }) | ||||
|   let maxDecimal = Math.max(...decimalLengthes), precision = Math.pow(10, maxDecimal) | ||||
|   //计算 | ||||
|   let intArr = arr.map(e => (Number(e) || 0) * precision) | ||||
|   //返回计算值 | ||||
|   return intArr.reduce((t, a) => t + a) / precision | ||||
| } | ||||
| export const waiting = { | ||||
|   init(ops, count) { | ||||
|     if (document.body) { | ||||
|       let div = document.createElement('div') | ||||
|       div.id = "ai-waiting" | ||||
|       div.className = "el-loading-mask is-fullscreen" | ||||
|       div.style.zIndex = '202204271710' | ||||
|       div.style.textAlign = 'center' | ||||
|       div.style.lineHeight = '100vh' | ||||
|       div.style.color = '#26f' | ||||
|       div.style.fontSize = '20px' | ||||
|       div.style.background = 'rgba(255,255,255,.6)' | ||||
|       div.style.backdropFilter = 'blur(6px)' | ||||
|       document.body.appendChild(div) | ||||
|     } else if (count < 10) { | ||||
|       setTimeout(() => this.init(ops, ++count), 500) | ||||
|     } | ||||
|   }, | ||||
|   getDom() { | ||||
|     return document.querySelector('#ai-waiting') | ||||
|   }, | ||||
|   setContent(html) { | ||||
|     let div = this.getDom() | ||||
|     div.innerHTML = html | ||||
|   }, | ||||
|   close() { | ||||
|     let div = this.getDom() | ||||
|     div.parentElement.removeChild(div) | ||||
|   } | ||||
| } | ||||
|  | ||||
| export default { | ||||
|   ...tools, | ||||
|   addChildParty, | ||||
|   $confirm, | ||||
|   $permissions, | ||||
|   $decimalCalc, | ||||
|   $waiting: waiting | ||||
| } | ||||
|  | ||||
|  | ||||
							
								
								
									
										88
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,88 @@ | ||||
| { | ||||
|   "name": "dvcp-web-apps", | ||||
|   "version": "4.0.0", | ||||
|   "private": false, | ||||
|   "author": "kubbo", | ||||
|   "scripts": { | ||||
|     "dev": "vue-cli-service serve examples/main.js", | ||||
|     "build": "vue-cli-service build", | ||||
|     "oms": "vue-cli-service serve examples/main.js --mode oms", | ||||
|     "xumu": "vue-cli-service serve examples/main.js --mode xumu", | ||||
|     "sync": "node bin/appsSync.js", | ||||
|     "preview": "node bin/build.js && vue-cli-service serve", | ||||
|     "predev": "node bin/scanApps.js", | ||||
|     "preoms": "dotenv -e .env.oms node bin/scanApps.js", | ||||
|     "prexumu": "dotenv -e .env.xumu node bin/scanApps.js", | ||||
|     "view:xumu": "vue-cli-service serve --mode xumu", | ||||
|     "preview:xumu": "dotenv -e .env.xumu node bin/build.js" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@amap/amap-jsapi-loader": "^1.0.1", | ||||
|     "@ckeditor/ckeditor5-vue2": "^3.0.1", | ||||
|     "@jiaminghi/data-view": "^2.10.0", | ||||
|     "@logicflow/core": "^1.2.1", | ||||
|     "bin-ace-editor": "^3.2.0", | ||||
|     "crypto-js": "^4.2.0", | ||||
|     "dayjs": "^1.8.35", | ||||
|     "echarts": "^5.5.1", | ||||
|     "echarts-wordcloud": "^2.0.0", | ||||
|     "hash.js": "^1.1.7", | ||||
|     "html2canvas": "^1.4.1", | ||||
|     "jspdf": "^2.5.2", | ||||
|     "mp4box": "^0.4.1", | ||||
|     "print-js": "^1.0.63", | ||||
|     "serialize-javascript": "^6.0.0", | ||||
|     "sortablejs": "^1.12.0", | ||||
|     "vue-carousel": "^0.18.0", | ||||
|     "vue-cropper": "^0.6.5", | ||||
|     "vue-draggable-resizable": "^2.3.0", | ||||
|     "vue-qr": "^4.0.9", | ||||
|     "vue-ruler-tool": "^1.2.4", | ||||
|     "vue-style-loader": "^4.1.3", | ||||
|     "vuedraggable": "^2.24.3" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@babel/plugin-proposal-logical-assignment-operators": "^7.10.4", | ||||
|     "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", | ||||
|     "@babel/plugin-proposal-optional-chaining": "^7.10.4", | ||||
|     "@vue/cli-plugin-babel": "^3.6.0", | ||||
|     "@vue/cli-plugin-eslint": "^3.6.0", | ||||
|     "@vue/cli-service": "^3.6.0", | ||||
|     "axios": "^0.19.2", | ||||
|     "babel-eslint": "^10.1.0", | ||||
|     "core-js": "^2.6.11", | ||||
|     "dotenv-cli": "^7.4.2", | ||||
|     "element-ui": "^2.15.9", | ||||
|     "eslint": "^5.16.0", | ||||
|     "eslint-plugin-vue": "^5.0.0", | ||||
|     "image-webpack-loader": "^6.0.0", | ||||
|     "inquirer": "^6.5.2", | ||||
|     "mockjs": "^1.1.0", | ||||
|     "node-ipc": "^9.2.1", | ||||
|     "readline": "^1.3.0", | ||||
|     "sass": "~1.32.6", | ||||
|     "sass-loader": "^7.3.1", | ||||
|     "uglifyjs-webpack-plugin": "^2.2.0", | ||||
|     "vue": "^2.7.14", | ||||
|     "vue-router": "^3.3.4", | ||||
|     "vue-template-compiler": "^2.7.14", | ||||
|     "vuex": "^3.5.1", | ||||
|     "vuex-persistedstate": "^2.7.1" | ||||
|   }, | ||||
|   "vetur": { | ||||
|     "attributes": "./attributes.json" | ||||
|   }, | ||||
|   "postcss": { | ||||
|     "plugins": { | ||||
|       "autoprefixer": {} | ||||
|     } | ||||
|   }, | ||||
|   "browserslist": [ | ||||
|     "> 1%", | ||||
|     "last 2 versions", | ||||
|     "not ie <= 8" | ||||
|   ], | ||||
|   "resolutions": { | ||||
|     "sass": "1.32.6" | ||||
|   } | ||||
| } | ||||
							
								
								
									
										289
									
								
								packages/bigscreen/designer/Add.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,289 @@ | ||||
| <template> | ||||
|   <ai-detail> | ||||
|     <template slot="title"> | ||||
|       <ai-title :title="isEdit ? '编辑项目' : '添加项目'" isShowBack isShowBottomBorder @onBackClick="cancel"/> | ||||
|     </template> | ||||
|     <template slot="content"> | ||||
|       <el-form ref="form" :model="form" label-width="110px" label-position="right"> | ||||
|         <ai-card title="基本信息"> | ||||
|           <template #content> | ||||
|             <div class="ai-form"> | ||||
|               <el-form-item label="名称" prop="name" | ||||
|                             :rules="[{ required: true, message: '请输入大屏项目名称', trigger: 'blur' }]"> | ||||
|                 <el-input size="small" :maxlength="30" placeholder="请输入大屏项目名称" v-model="form.name"></el-input> | ||||
|               </el-form-item> | ||||
|               <el-form-item label="描述" style="width: 100%;" prop="description"> | ||||
|                 <el-input size="small" :maxlength="200" :rows="5" type="textarea" style="width: 100%;" | ||||
|                           placeholder="请输入描述" | ||||
|                           v-model="form.description"></el-input> | ||||
|               </el-form-item> | ||||
|               <el-form-item label="是否开启" style="width: 100%;" prop="status"> | ||||
|                 <el-switch | ||||
|                     v-model="form.status" | ||||
|                     active-value="1" | ||||
|                     inactive-value="0"> | ||||
|                 </el-switch> | ||||
|               </el-form-item> | ||||
|             </div> | ||||
|           </template> | ||||
|         </ai-card> | ||||
|         <ai-card title="大屏" v-if="isEdit"> | ||||
|           <template #right> | ||||
|             <el-button @click="gotoDesign()" type="primary">添加大屏</el-button> | ||||
|             <el-button @click="dialog=true" type="primary">定制大屏</el-button> | ||||
|           </template> | ||||
|           <template #content> | ||||
|             <ai-table | ||||
|                 :tableData="tableData" | ||||
|                 :col-configs="colConfigs" | ||||
|                 :total="total" | ||||
|                 style="margin-top: 6px;" | ||||
|                 :border="true" | ||||
|                 row-key="id" | ||||
|                 :isShowPagination="false" | ||||
|                 @getList="() => {}"> | ||||
|               <el-table-column slot="options" label="状态" align="center"> | ||||
|                 <template slot-scope="{ row }"> | ||||
|                   <el-switch | ||||
|                       v-model="row.status" | ||||
|                       active-value="1" | ||||
|                       @change="() => onStatusChange(row.id)"> | ||||
|                   </el-switch> | ||||
|                 </template> | ||||
|               </el-table-column> | ||||
|               <el-table-column slot="options" width="160px" fixed="right" label="操作" align="center"> | ||||
|                 <template slot-scope="{ row, column, $index }"> | ||||
|                   <div class="table-options"> | ||||
|                     <el-button type="text" @click="toEdit(row.id, row.isCustom, row)">编辑</el-button> | ||||
|                     <el-button type="text" @click="toViewer(row.id)">预览</el-button> | ||||
|                     <el-button type="text" @click="remove($index)">删除</el-button> | ||||
|                   </div> | ||||
|                 </template> | ||||
|               </el-table-column> | ||||
|             </ai-table> | ||||
|           </template> | ||||
|         </ai-card> | ||||
|       </el-form> | ||||
|       <ai-dialog :visible.sync="dialog" title="定制大屏" @closed="custom={}" @onConfirm="handleCustomizedDV"> | ||||
|         <el-form ref="CustomDVFrom" size="small" :model="custom" :rules="rules" label-width="80px"> | ||||
|           <el-form-item label="大屏标题" prop="title"> | ||||
|             <el-input v-model="custom.title" clearable placeholder="请填写"/> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="选择大屏" prop="dv"> | ||||
|             <ai-select v-model="custom.dv" :selectList="dict.getDict('customizedDVs')"/> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="静态数据"> | ||||
|             <el-input type="textarea" rows="5" v-model="custom.meta"/> | ||||
|           </el-form-item> | ||||
|         </el-form> | ||||
|       </ai-dialog> | ||||
|     </template> | ||||
|     <template #footer> | ||||
|       <el-button @click="cancel">取消</el-button> | ||||
|       <el-button type="primary" @click="confirm">提交</el-button> | ||||
|     </template> | ||||
|   </ai-detail> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import Layout from './viewport.vue' | ||||
| import Sortable from 'sortablejs' | ||||
| import {mapActions} from "vuex" | ||||
|  | ||||
| export default { | ||||
|   name: 'Add', | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|     urlPrefix: String | ||||
|   }, | ||||
|   inject: { | ||||
|     home: {default: ''} | ||||
|   }, | ||||
|   components: { | ||||
|     Layout | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       info: {}, | ||||
|       department: [], | ||||
|       form: { | ||||
|         name: '', | ||||
|         relationLsIds: '', | ||||
|         relationLsNames: '', | ||||
|         status: '1', | ||||
|         description: '' | ||||
|       }, | ||||
|       screenId: '', | ||||
|       query: {}, | ||||
|       total: 0, | ||||
|       colConfigs: [ | ||||
|         {prop: 'title', label: '标题'}, | ||||
|         {prop: 'id', label: 'ID'} | ||||
|       ], | ||||
|       tableData: [], | ||||
|       id: '', | ||||
|       dialog: false, | ||||
|       custom: {}, | ||||
|       rules: { | ||||
|         dv: [{required: true, message: "请选择 定制大屏"}], | ||||
|         title: [{required: true, message: "请输入 大屏标题"}], | ||||
|       }, | ||||
|       config: { | ||||
|         backgroundImage: [] | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     isEdit: v => !!v.$route.query.id | ||||
|   }, | ||||
|   created() { | ||||
|     this.dict.load('customizedDVs') | ||||
|     this.getInfo().then(() => this.$route.params?.id && this.onChange(this.$route.params)) | ||||
|   }, | ||||
|   methods: { | ||||
|     ...mapActions(['closePage']), | ||||
|     getInfo() { | ||||
|       let {id} = this.$route.query | ||||
|       if (!id) return Promise.reject() | ||||
|       return this.instance.post(`${this.urlPrefix}/appdiylargescreen/queryLargeScreenProjectDetailById?id=${id}`).then(res => { | ||||
|         if (res?.data) { | ||||
|           this.form = { | ||||
|             ...res.data | ||||
|           } | ||||
|           if (res.data.relationLsIds) { | ||||
|             this.tableData = res.data.lsList.map(v => { | ||||
|               let conf = JSON.parse(v.config || '') || {} | ||||
|               return { | ||||
|                 id: v.id, | ||||
|                 title: v.title, | ||||
|                 dv: conf.custom || '', | ||||
|                 meta: JSON.stringify(conf.meta), | ||||
|                 isCustom: !!conf.custom, | ||||
|                 status: v.status | ||||
|               } | ||||
|             }) | ||||
|             this.total = res.data.lsList.length | ||||
|             this.$nextTick(() => { | ||||
|               this.rowDrop() | ||||
|             }) | ||||
|           } | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     onStatusChange(id) { | ||||
|       this.instance.post(`${this.urlPrefix}/appdiylargescreen/enableLargeScreen?id=${id}`).then(res => { | ||||
|         if (res.code === 0) { | ||||
|           this.$message.success('操作成功') | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     rowDrop() { | ||||
|       const tbody = document.querySelector('.el-table__body-wrapper tbody') | ||||
|       const _this = this | ||||
|       Sortable.create(tbody, { | ||||
|         onEnd({newIndex, oldIndex}) { | ||||
|           const currRow = _this.tableData.splice(oldIndex, 1)[0] | ||||
|           _this.tableData.splice(newIndex, 0, currRow) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     toViewer(id) { | ||||
|       this.$router.push({query: {id}, hash: "#preview"}) | ||||
|     }, | ||||
|     onChange(e) { | ||||
|       const ids = this.tableData.map(v => v.id) | ||||
|       if (ids.indexOf(e.id) < 0) { | ||||
|         this.tableData.push({ | ||||
|           title: e.title, | ||||
|           id: e.id, | ||||
|           status: '1' | ||||
|         }) | ||||
|       } else { | ||||
|         const index = this.tableData.findIndex(v => v.id === e.id) | ||||
|         this.$set(this.tableData[index], 'title', e.title) | ||||
|       } | ||||
|       this.$nextTick(() => { | ||||
|         if (this.$route.query.id) { | ||||
|           const ids = this.tableData.map(v => v.id).join(',') | ||||
|           const names = this.tableData.map(v => v.name).join(',') | ||||
|           this.instance.post(`${this.urlPrefix}/appdiylargescreen/addOrUpdateLargeScreenProject`, { | ||||
|             ...this.form, | ||||
|             relationLsIds: ids, | ||||
|             relationLsNames: names | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     gotoDesign(did) { | ||||
|       const {id} = this.$route.query | ||||
|       this.$router.push({hash: "#design", query: {id, did, name: this.form.name}}) | ||||
|     }, | ||||
|     toEdit(id, isCustom, form) { | ||||
|       if (!isCustom) { | ||||
|         this.gotoDesign(id) | ||||
|       } else { | ||||
|         this.dialog = true | ||||
|         this.custom = form | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     remove(index) { | ||||
|       this.tableData.splice(index, 1) | ||||
|     }, | ||||
|  | ||||
|     confirm() { | ||||
|       this.$refs.form.validate((valid) => { | ||||
|         if (valid) { | ||||
|           const ids = this.tableData.map(v => v.id).join(',') | ||||
|           const names = this.tableData.map(v => v.name).join(',') | ||||
|           this.instance.post(`${this.urlPrefix}/appdiylargescreen/addOrUpdateLargeScreenProject`, { | ||||
|             ...this.form, | ||||
|             relationLsIds: ids, | ||||
|             relationLsNames: names | ||||
|           }).then(res => { | ||||
|             if (res.code == 0) { | ||||
|               this.$message.success('提交成功') | ||||
|  | ||||
|               this.home && this.home.refreshDvOptions && this.home.refreshDvOptions() | ||||
|               setTimeout(() => { | ||||
|                 this.cancel() | ||||
|               }, 600) | ||||
|             } | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     cancel() { | ||||
|       this.closePage() | ||||
|       this.$router.push({}) | ||||
|     }, | ||||
|  | ||||
|     handleCustomizedDV() { | ||||
|       this.$refs.CustomDVFrom.validate(v => { | ||||
|         if (v) { | ||||
|           this.instance.post(`${this.urlPrefix}/appdiylargescreen/addOrUpdateLargeScreen`, { | ||||
|             config: JSON.stringify({ | ||||
|               custom: this.custom.dv, | ||||
|               meta: JSON.parse(this.custom.meta?.replace(/\\n/g, '') || null) | ||||
|             }), | ||||
|             status: 1, | ||||
|             id: this.custom.id, | ||||
|             title: this.custom.title, | ||||
|           }).then(res => { | ||||
|             if (res?.code == 0 && res?.data) { | ||||
|               this.$message.success('保存成功') | ||||
|               this.onChange(res.data) | ||||
|               this.dialog = false | ||||
|             } | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style scoped lang="scss"> | ||||
| </style> | ||||
							
								
								
									
										83
									
								
								packages/bigscreen/designer/AppDesigner.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,83 @@ | ||||
| <template> | ||||
|   <section class="AppDesigner"> | ||||
|     <component :is="currentPage" v-bind="$props"/> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import List from './List.vue' | ||||
| import Add from './Add.vue' | ||||
| import SourceData from './SourceData.vue' | ||||
| import Preview from "./preview.vue"; | ||||
| import DesignDashboard from "./viewport.vue"; | ||||
|  | ||||
| export default { | ||||
|   name: 'AppDesigner', | ||||
|   label: '大屏设计', | ||||
|   components: {DesignDashboard, Preview, List, Add, SourceData}, | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|     permissions: Function, | ||||
|     urlPrefix: { | ||||
|       type: String, | ||||
|       default: '/app' | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   computed: { | ||||
|     currentPage() { | ||||
|       const {hash} = this.$route | ||||
|       return hash == "#sourceData" ? SourceData : | ||||
|           hash == "#add" ? Add : | ||||
|               hash == "#preview" ? Preview : | ||||
|                   hash == "#design" ? DesignDashboard : List | ||||
|     }, | ||||
|     tabs() { | ||||
|       return [ | ||||
|         {label: '大屏列表', name: 'FormList', comp: List, permission: ''} | ||||
|       ].filter(() => { | ||||
|         return true | ||||
|       }) | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   data() { | ||||
|     return { | ||||
|       currIndex: '0', | ||||
|       componentName: '', | ||||
|       params: {}, | ||||
|       areaId: '', | ||||
|       isShowDetail: false | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     onChange(data) { | ||||
|       if (data.type === 'list') { | ||||
|         this.componentName = 'List' | ||||
|         this.isShowDetail = false | ||||
|         this.params = data.params | ||||
|       } | ||||
|  | ||||
|       if (data.type === 'add') { | ||||
|         this.componentName = 'Add' | ||||
|         this.isShowDetail = true | ||||
|         this.params = data.params | ||||
|       } | ||||
|  | ||||
|       if (data.type === 'SourceData') { | ||||
|         this.componentName = 'SourceData' | ||||
|         this.isShowDetail = true | ||||
|         this.params = data.params | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .AppDesigner { | ||||
|   height: 100%; | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										167
									
								
								packages/bigscreen/designer/List.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,167 @@ | ||||
| <template> | ||||
|   <ai-list> | ||||
|     <ai-title slot="title" title="大屏列表" isShowBottomBorder/> | ||||
|     <template slot="content"> | ||||
|       <ai-search-bar> | ||||
|         <template #left> | ||||
|           <ai-select | ||||
|               v-model="search.status" | ||||
|               @change="search.current = 1, getList()" | ||||
|               placeholder="发布状态" | ||||
|               :selectList="dict.getDict('cwpStatus')"> | ||||
|           </ai-select> | ||||
|           <el-button type="primary" @click="toEdit('')">添加大屏</el-button> | ||||
|           <el-button type="primary" @click="toAddData">数据源管理</el-button> | ||||
|         </template> | ||||
|         <template #right> | ||||
|           <el-input | ||||
|               v-model="search.name" | ||||
|               size="small" | ||||
|               placeholder="请输入模板名称或创建人" | ||||
|               clearable | ||||
|               v-throttle="() => {search.current = 1, getList()}" | ||||
|               @clear="search.current = 1, search.title = '', getList()" | ||||
|               suffix-icon="iconfont iconSearch"> | ||||
|           </el-input> | ||||
|         </template> | ||||
|       </ai-search-bar> | ||||
|       <ai-table | ||||
|           :tableData="tableData" | ||||
|           :col-configs="colConfigs" | ||||
|           :total="total" | ||||
|           v-loading="loading" | ||||
|           style="margin-top: 6px;" | ||||
|           :current.sync="search.current" | ||||
|           :size.sync="search.size" | ||||
|           @getList="getList" :dict="dict"> | ||||
|         <el-table-column slot="options" width="160px" fixed="right" label="操作" align="center"> | ||||
|           <template slot-scope="{ row }"> | ||||
|             <div class="table-options"> | ||||
|               <el-button type="text" @click="toEdit(row.id)">编辑</el-button> | ||||
|               <el-button type="text" @click="copy(row.id)">复制</el-button> | ||||
|             </div> | ||||
|           </template> | ||||
|         </el-table-column> | ||||
|       </ai-table> | ||||
|       <ai-dialog | ||||
|           :visible.sync="isShowAdd" | ||||
|           width="780px" | ||||
|           title="复制大屏" | ||||
|           @close="onClose" | ||||
|           @onConfirm="onConfirm"> | ||||
|         <el-form ref="form" :model="form" label-width="110px" label-position="right"> | ||||
|           <div class="ai-form" :model="form" label-width="110px" label-position="right"> | ||||
|             <el-form-item label="名称" prop="name" style="width: 100%;" :rules="[{ required: true, message: '请输入名称', trigger: 'blur' }]"> | ||||
|               <el-input size="small" placeholder="请输入名称" v-model="form.name"></el-input> | ||||
|             </el-form-item> | ||||
|           </div> | ||||
|         </el-form> | ||||
|       </ai-dialog> | ||||
|     </template> | ||||
|   </ai-list> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| export default { | ||||
|   name: 'FormList', | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|     areaId: String, | ||||
|     urlPrefix: String | ||||
|   }, | ||||
|  | ||||
|   data() { | ||||
|     return { | ||||
|       search: { | ||||
|         current: 1, | ||||
|         status: '', | ||||
|         size: 10, | ||||
|         name: '' | ||||
|       }, | ||||
|       form: { | ||||
|         name: '' | ||||
|       }, | ||||
|       id: '', | ||||
|       isShowAdd: false, | ||||
|       colConfigs: [ | ||||
|         {prop: 'name', label: '模板名称'}, | ||||
|         {prop: 'createUserName', align: 'center', label: '创建人'}, | ||||
|         {prop: 'description', align: 'center', label: '描述'}, | ||||
|         {prop: 'status', align: 'center', label: '状态', dict:"cwpStatus"}, | ||||
|         {prop: 'createTime', align: 'center', label: '创建时间'} | ||||
|       ], | ||||
|       tableData: [], | ||||
|       total: 0, | ||||
|       loading: false | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   created() { | ||||
|  | ||||
|     this.dict.load('cwpStatus').then(() => { | ||||
|       this.getList() | ||||
|     }) | ||||
|   }, | ||||
|  | ||||
|   mounted() { | ||||
|     this.loading = true | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     copy(id) { | ||||
|       this.id = id | ||||
|       this.isShowAdd = true | ||||
|     }, | ||||
|  | ||||
|     onClose() { | ||||
|       this.id = '' | ||||
|       this.form.name = '' | ||||
|     }, | ||||
|  | ||||
|     onConfirm() { | ||||
|       this.$refs.form.validate((valid) => { | ||||
|         if (valid) { | ||||
|           this.instance.post(`${this.urlPrefix}/appdiylargescreen/copyLargeScreenProject`, null, { | ||||
|             params: { | ||||
|               ...this.form, | ||||
|               id: this.id | ||||
|             } | ||||
|           }).then(res => { | ||||
|             if (res.code === 0) { | ||||
|               this.$message.success('复制成功') | ||||
|               this.isShowAdd = false | ||||
|  | ||||
|               this.getList() | ||||
|             } | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     getList() { | ||||
|       this.instance.post(`${this.urlPrefix}/appdiylargescreen/allLargeScreenProjectByPage`, null, { | ||||
|         params: { | ||||
|           ...this.search | ||||
|         } | ||||
|       }).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           this.tableData = res.data.records | ||||
|           this.total = res.data.total | ||||
|           this.loading = false | ||||
|         } else { | ||||
|           this.loading = false | ||||
|         } | ||||
|       }).catch(() => { | ||||
|         this.loading = false | ||||
|       }) | ||||
|     }, | ||||
|     toEdit(id) { | ||||
|       this.$router.push({hash: "#add", query: {id}}) | ||||
|     }, | ||||
|     toAddData() { | ||||
|       this.$router.push({hash: "#sourceData"}) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
							
								
								
									
										460
									
								
								packages/bigscreen/designer/SourceData.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,460 @@ | ||||
| <template> | ||||
|   <ai-detail> | ||||
|     <template slot="title"> | ||||
|       <ai-title title="数据源" isShowBack isShowBottomBorder @onBackClick="cancel"> | ||||
|       </ai-title> | ||||
|     </template> | ||||
|     <template slot="content"> | ||||
|       <ai-card title="数据源列表"> | ||||
|         <template #right> | ||||
|           <el-button type="primary" @click="isShow = true">添加数据源</el-button> | ||||
|         </template> | ||||
|         <template #content> | ||||
|           <ai-search-bar class="search-bar"> | ||||
|             <template slot="right"> | ||||
|               <el-input | ||||
|                   v-model="search.name" | ||||
|                   size="small" | ||||
|                   v-throttle="() => {search.current = 1, getList()}" | ||||
|                   placeholder="请输入名字" | ||||
|                   clearable | ||||
|                   @clear="search.current = 1, search.name = '', getList()" | ||||
|                   suffix-icon="iconfont iconSearch"> | ||||
|               </el-input> | ||||
|             </template> | ||||
|           </ai-search-bar> | ||||
|           <ai-table | ||||
|               :tableData="tableData" | ||||
|               :col-configs="colConfigs" | ||||
|               :total="total" | ||||
|               style="margin-top: 6px;" | ||||
|               :border="true" | ||||
|               :current.sync="search.current" | ||||
|               :size.sync="search.size" | ||||
|               @getList="getList"> | ||||
|             <el-table-column slot="options" width="160px" fixed="right" label="操作" align="center"> | ||||
|               <template slot-scope="{ row }"> | ||||
|                 <div class="table-options"> | ||||
|                   <el-button type="text" @click="toEdit(row)">编辑</el-button> | ||||
|                   <el-button type="text" @click="remove(row.id)">删除</el-button> | ||||
|                 </div> | ||||
|               </template> | ||||
|             </el-table-column> | ||||
|           </ai-table> | ||||
|         </template> | ||||
|       </ai-card> | ||||
|       <ai-dialog | ||||
|           :visible.sync="isShow" | ||||
|           width="920px" | ||||
|           title="数据源" | ||||
|           @close="onClose" | ||||
|           @onConfirm="onConfirm"> | ||||
|         <el-form ref="form" :model="form" label-width="110px" label-position="right"> | ||||
|           <div class="ai-form"> | ||||
|             <el-form-item label="数据源描述" style="width: 100%;" prop="description" :rules="[{ required: true, message: '请输入数据源描述', trigger: 'blur' }]"> | ||||
|               <el-input | ||||
|                   size="small" | ||||
|                   placeholder="请输入数据源描述" | ||||
|                   v-model="form.description"> | ||||
|               </el-input> | ||||
|             </el-form-item> | ||||
|             <el-form-item label="类型" style="width: 100%;" prop="dataRange" :rules="[{ required: true, message: '请选择数据范围', trigger: 'change' }]"> | ||||
|               <el-radio-group v-model="form.type"> | ||||
|                 <el-radio label="0">村微应用</el-radio> | ||||
|                 <el-radio label="1">SQL</el-radio> | ||||
|               </el-radio-group> | ||||
|             </el-form-item> | ||||
|             <el-form-item v-if="form.type === '1'" label="sql语句" style="width: 100%;" prop="description" | ||||
|                           :rules="[{ required: true, message: '请输入sql语句', trigger: 'blur' }]"> | ||||
|               <el-input | ||||
|                   :rows="8" | ||||
|                   size="small" | ||||
|                   type="textarea" | ||||
|                   placeholder="请输入数据源描述" | ||||
|                   v-model="form.sqlContent"> | ||||
|               </el-input> | ||||
|             </el-form-item> | ||||
|             <el-form-item v-if="form.type === '0'" label="村微应用" style="width: 100%;" prop="appId" | ||||
|                           :rules="[{ required: true, message: '请选择村微应用', trigger: 'change' }]"> | ||||
|               <el-select size="small" style="width: 100%;" v-model="form.appId" placeholder="请选择村微应用" @change="onAppChange"> | ||||
|                 <el-option | ||||
|                     v-for="item in appList" | ||||
|                     :key="item.id" | ||||
|                     :label="item.appName" | ||||
|                     :value="item.id"> | ||||
|                 </el-option> | ||||
|               </el-select> | ||||
|             </el-form-item> | ||||
|             <el-form-item v-if="form.type === '0'" label="数据范围" style="width: 100%;" prop="dataRange" | ||||
|                           :rules="[{ required: true, message: '请选择数据范围', trigger: 'change' }]"> | ||||
|               <el-radio-group v-model="form.dataRange"> | ||||
|                 <el-radio label="0">全部</el-radio> | ||||
|                 <el-radio label="1">自定义条数</el-radio> | ||||
|               </el-radio-group> | ||||
|             </el-form-item> | ||||
|             <el-form-item label="数据条数" style="width: 100%;" v-if="form.dataRange === '1' && form.type === '0'" prop="count" | ||||
|                           :rules="[{ required: true, message: '请输入数据条数', trigger: 'blur' }]"> | ||||
|               <el-input | ||||
|                   size="small" | ||||
|                   placeholder="请输入数据条数" | ||||
|                   v-model="form.count"> | ||||
|               </el-input> | ||||
|             </el-form-item> | ||||
|             <div v-if="form.type === '0'"> | ||||
|               <el-form-item :label="'统计项' + index" style="width: 100%;" v-for="(item, index) in form.statisticsConfigs" :key="'statisticsConfigs' + index"> | ||||
|                 <div class="form-flex"> | ||||
|                   <div> | ||||
|                     <el-select size="small" style="width: 160px;" v-model="item.fieldName" @change="e => onChooseField('statisticsConfigs', e, index)" | ||||
|                                placeholder="请选择" clearable> | ||||
|                       <el-option | ||||
|                           v-for="(item, index) in filedList" | ||||
|                           :key="index" | ||||
|                           :label="item.fieldCnName" | ||||
|                           :value="item.fieldName"> | ||||
|                       </el-option> | ||||
|                     </el-select> | ||||
|                     <el-select size="small" style="margin: 0 10px; width: 160px;" v-model="item.calcType" placeholder="请选择" clearable> | ||||
|                       <el-option | ||||
|                           v-for="item in dict.getDict('diyLargeScreenDatasourceCalcType2')" | ||||
|                           :key="item.id" | ||||
|                           :label="item.dictName" | ||||
|                           :value="item.dictValue"> | ||||
|                       </el-option> | ||||
|                     </el-select> | ||||
|                     <el-input size="small" style="width: 165px;" placeholder="请输入别名" v-model="item.alias"></el-input> | ||||
|                   </div> | ||||
|                   <el-button type="danger" v-if="index > 0" @click="removeConfig('statisticsConfigs', index)">删除</el-button> | ||||
|                 </div> | ||||
|               </el-form-item> | ||||
|             </div> | ||||
|  | ||||
|             <el-form-item style="width: 100%;" v-if="form.type === '0'"> | ||||
|               <el-button type="primary" @click="add('statisticsConfigs')">添加统计项</el-button> | ||||
|             </el-form-item> | ||||
|             <div v-if="form.type === '0'"> | ||||
|               <el-form-item :label="'分组' + index" style="width: 100%;" v-for="(item, index) in form.groupConfigs" :key="'groupConfigs' + item.fieldName"> | ||||
|                 <div class="form-flex"> | ||||
|                   <div> | ||||
|                     <el-select size="small" style="width: 160px;" v-model="item.fieldName" placeholder="请选择" clearable> | ||||
|                       <el-option | ||||
|                           v-for="item in filedList" | ||||
|                           :key="item.id" | ||||
|                           :label="item.fieldCnName" | ||||
|                           :value="item.fieldName"> | ||||
|                       </el-option> | ||||
|                     </el-select> | ||||
|                   </div> | ||||
|                   <el-button type="danger" @click="removeConfig('groupConfigs', index)">删除</el-button> | ||||
|                 </div> | ||||
|               </el-form-item> | ||||
|             </div> | ||||
|             <el-form-item style="width: 100%;" v-if="form.type === '0'"> | ||||
|               <el-button type="primary" @click="add('groupConfigs')">添加分组</el-button> | ||||
|             </el-form-item> | ||||
|             <div v-if="form.type === '0'"> | ||||
|               <el-form-item :label="'统计项' + index" style="width: 100%;" v-for="(item, index) in form.orderConfigs" :key="'orderConfigs' + item.fieldName"> | ||||
|                 <div class="form-flex"> | ||||
|                   <div> | ||||
|                     <el-select size="small" style="width: 160px;" v-model="item.fieldName" placeholder="请选择" clearable> | ||||
|                       <el-option | ||||
|                           v-for="item in filedList" | ||||
|                           :key="item.id" | ||||
|                           :label="item.fieldCnName" | ||||
|                           :value="item.fieldName"> | ||||
|                       </el-option> | ||||
|                     </el-select> | ||||
|                     <el-select size="small" style="width: 160px; margin-left: 10px;" v-model="item.orderType" placeholder="请选择" clearable> | ||||
|                       <el-option | ||||
|                           v-for="item in orderTypeDict" | ||||
|                           :key="item.id" | ||||
|                           :label="item.label" | ||||
|                           :value="item.value"> | ||||
|                       </el-option> | ||||
|                     </el-select> | ||||
|                   </div> | ||||
|                   <el-button type="danger" @click="removeConfig('orderConfigs', index)">删除</el-button> | ||||
|                 </div> | ||||
|               </el-form-item> | ||||
|             </div> | ||||
|             <el-form-item style="width: 100%;" v-if="form.type === '0'"> | ||||
|               <el-button type="primary" @click="add('orderConfigs')">添加排序</el-button> | ||||
|             </el-form-item> | ||||
|           </div> | ||||
|         </el-form> | ||||
|       </ai-dialog> | ||||
|     </template> | ||||
|   </ai-detail> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| export default { | ||||
|   name: 'SourceData', | ||||
|  | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|     params: Object, | ||||
|     urlPrefix: String | ||||
|   }, | ||||
|  | ||||
|   data() { | ||||
|     return { | ||||
|       isShow: false, | ||||
|       search: { | ||||
|         current: 1, | ||||
|         size: 10, | ||||
|         name: '' | ||||
|       }, | ||||
|       total: 0, | ||||
|       colConfigs: [ | ||||
|         {prop: 'appName', label: '应用名'}, | ||||
|         {prop: 'appTableName', align: 'center', label: '表名'}, | ||||
|         {prop: 'description', align: 'center', label: '描述'}, | ||||
|         {prop: 'type', align: 'center', label: '类型', format: v => v === '0' ? '村微应用' : 'sql语句'}, | ||||
|         {prop: 'createUserName', align: 'center', label: '创建人'}, | ||||
|         {prop: 'createTime', align: 'center', label: '创建时间'} | ||||
|       ], | ||||
|       tableData: [], | ||||
|       filedList: [], | ||||
|       appList: [], | ||||
|       form: { | ||||
|         orderType: 'asc', | ||||
|         dataRange: '0', | ||||
|         type: '0', | ||||
|         sqlContent: '', | ||||
|         appId: '', | ||||
|         description: '', | ||||
|         appName: '', | ||||
|         appTableName: '', | ||||
|         count: '100', | ||||
|         statisticsConfigs: [{ | ||||
|           alias: '', | ||||
|           calcType: '', | ||||
|           dictCode: '', | ||||
|           fieldCnName: '', | ||||
|           fieldName: '' | ||||
|         }], | ||||
|         orderConfigs: [{ | ||||
|           alias: '', | ||||
|           calcType: '', | ||||
|           dictCode: '', | ||||
|           fieldCnName: '', | ||||
|           fieldName: '' | ||||
|         }], | ||||
|         groupConfigs: [{ | ||||
|           alias: '', | ||||
|           calcType: '', | ||||
|           dictCode: '', | ||||
|           fieldCnName: '', | ||||
|           fieldName: '' | ||||
|         }] | ||||
|       }, | ||||
|       id: '', | ||||
|       orderTypeDict: [ | ||||
|         { | ||||
|           value: 'asc', | ||||
|           label: '升序' | ||||
|         }, | ||||
|         { | ||||
|           value: 'desc', | ||||
|           label: '降序' | ||||
|         } | ||||
|       ] | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   created() { | ||||
|     this.dict.load(['diyLargeScreenDatasourceCalcType2']).then(() => { | ||||
|       this.getList() | ||||
|       this.getAppList() | ||||
|     }) | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     getInfo(id) { | ||||
|       this.instance.post(`${this.urlPrefix}/wxcp/wxuser/queryDetailById?id=${id}`).then(res => { | ||||
|         if (res.code === 0) { | ||||
|           this.form = { | ||||
|             ...res.data | ||||
|           } | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     onChooseField(type, fieldName, index) { | ||||
|       const dictCode = this.filedList.filter(v => v.fieldName === fieldName)[0].dictCode | ||||
|       this.$set(this.form[type][index], 'dictCode', dictCode) | ||||
|     }, | ||||
|  | ||||
|     add(type) { | ||||
|       this.form[type].push({ | ||||
|         alias: '', | ||||
|         calcType: '', | ||||
|         dictCode: '', | ||||
|         fieldCnName: '', | ||||
|         fieldName: '' | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     removeConfig(type, index) { | ||||
|       this.form[type].splice(index, 1) | ||||
|     }, | ||||
|  | ||||
|     toEdit(e) { | ||||
|       this.id = e.id | ||||
|       this.instance.post(`${this.urlPrefix}/appdiylargescreen/queryDatasourceDetailById?id=${e.id}`).then(res => { | ||||
|         if (res.code === 0) { | ||||
|           this.form = { | ||||
|             ...res.data | ||||
|           } | ||||
|  | ||||
|           this.form.dataRange = this.form.dataRange === '0' ? '0' : '1' | ||||
|           this.form.count = res.data.dataRange | ||||
|           this.filedList = this.appList.filter(v => v.id === res.data.appId).length && this.appList.filter(v => v.id === res.data.appId)[0].fields.map(item => { | ||||
|             let value = [] | ||||
|             res.data.configs.forEach(v => { | ||||
|               if (v.fieldName === item.fieldName) { | ||||
|                 value.push(v.calcType) | ||||
|               } | ||||
|             }) | ||||
|  | ||||
|             return { | ||||
|               ...item, | ||||
|               value | ||||
|             } | ||||
|           }) | ||||
|           this.isShow = true | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     remove(id) { | ||||
|       this.$confirm('确定删除该数据?').then(() => { | ||||
|         this.instance.post(`${this.urlPrefix}/appquestionnairetemplate/delete?id=${id}`).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             this.$message.success('删除成功!') | ||||
|             this.getList() | ||||
|           } | ||||
|         }) | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     getList() { | ||||
|       this.instance.post(`${this.urlPrefix}/appdiylargescreen/allDatasourceByPage`, null, { | ||||
|         params: { | ||||
|           ...this.search | ||||
|         } | ||||
|       }).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           this.tableData = res.data.records | ||||
|           this.total = res.data.total | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     getAppList() { | ||||
|       this.instance.post(`${this.urlPrefix}/appdiylargescreen/allDatasourceApp`).then(res => { | ||||
|         if (res.code === 0) { | ||||
|           this.appList = res.data | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     onClose() { | ||||
|       this.id = '' | ||||
|       this.form.orderType = 'asc' | ||||
|       this.form.dataRange = 0 | ||||
|       this.form.appId = '' | ||||
|       this.form.description = '' | ||||
|       this.form.appName = '' | ||||
|       this.form.appTableName = '' | ||||
|       this.form.count = 100 | ||||
|     }, | ||||
|  | ||||
|     onAppChange(e) { | ||||
|       const value = this.appList.filter(v => v.id === e)[0] | ||||
|       this.form.appTableName = value.appTableName | ||||
|       this.form.appName = value.appName | ||||
|       this.form.statisticsConfigs = [{ | ||||
|         alias: '', | ||||
|         calcType: '', | ||||
|         dictCode: '', | ||||
|         fieldCnName: '', | ||||
|         fieldName: '' | ||||
|       }] | ||||
|       this.form.orderConfigs = [{ | ||||
|         alias: '', | ||||
|         calcType: '', | ||||
|         dictCode: '', | ||||
|         fieldCnName: '', | ||||
|         fieldName: '' | ||||
|       }] | ||||
|       this.form.groupConfigs = [{ | ||||
|         alias: '', | ||||
|         calcType: '', | ||||
|         dictCode: '', | ||||
|         fieldCnName: '', | ||||
|         fieldName: '' | ||||
|       }] | ||||
|       this.filedList = value.fields.map(v => { | ||||
|         return { | ||||
|           ...v, | ||||
|           value: '' | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     onConfirm() { | ||||
|       this.$refs.form.validate((valid) => { | ||||
|         if (valid) { | ||||
|           let configs = [] | ||||
|  | ||||
|           if (this.filedList.length) { | ||||
|             this.filedList.forEach(item => { | ||||
|               if (item.value.length) { | ||||
|                 item.value.forEach(v => { | ||||
|                   configs.push({ | ||||
|                     alias: item.fieldCnName, | ||||
|                     calcType: v, | ||||
|                     fieldCnName: item.fieldCnName, | ||||
|                     fieldName: item.fieldName, | ||||
|                     dictCode: item.dictCode, | ||||
|                     orderType: this.orderType | ||||
|                   }) | ||||
|                 }) | ||||
|               } | ||||
|             }) | ||||
|           } | ||||
|  | ||||
|           this.instance.post(`${this.urlPrefix}/appdiylargescreen/addOrUpdateDatasource`, { | ||||
|             ...this.form, | ||||
|             configs, | ||||
|             id: this.id ? this.id : '', | ||||
|             dataRange: this.form.dataRange === '0' ? 0 : this.form.count | ||||
|           }).then(res => { | ||||
|             if (res.code === 0) { | ||||
|               this.$message.success(this.id ? '编辑成功' : '添加成功') | ||||
|               this.search.current = 1 | ||||
|               this.isShow = false | ||||
|  | ||||
|               this.getList() | ||||
|             } | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     cancel() { | ||||
|       this.$router.push({}) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style scoped lang="scss"> | ||||
| .form-flex { | ||||
|   display: flex; | ||||
|   justify-content: space-between; | ||||
|   align-items: center; | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										459
									
								
								packages/bigscreen/designer/components/DataConfig.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,459 @@ | ||||
| <template> | ||||
|   <div class="layout-config__group--wrapper"> | ||||
|     <template v-if="options.type=='map'"> | ||||
|       <ai-fold> | ||||
|         <div slot="title" class="flex w100"> | ||||
|           <span class="layoutTitle fill">标记点设置</span> | ||||
|           <el-button type="text" icon="iconfont iconAdd" @click="handleMapMarker()">添加</el-button> | ||||
|         </div> | ||||
|         <config-item v-for="(item,i) in markers" :key="i" :label="item.label"> | ||||
|           <el-input :value="[item.lat,item.lng].join(',')" readonly size="small"/> | ||||
|           <el-button type="text" icon="el-icon-edit" @click="handleMapMarker(item,i)"/> | ||||
|           <el-button type="text" icon="el-icon-delete" @click="removeMapMarker(i)"/> | ||||
|         </config-item> | ||||
|       </ai-fold> | ||||
|       <ai-fold title="标记点连线"> | ||||
|         <ai-dialog-btn :modal="false" dialog-title="设置标记点连线" :customFooter="false" @confirm="savePolylines" | ||||
|                        @open="handleMapPolylines"> | ||||
|           <code-editor slot="btn" readonly :value="JSON.stringify(options.staticData.polylines, null, 2)" lang="json" | ||||
|                        theme="github" width="100%" height="250" placeholder="测试默认值"/> | ||||
|           <el-button class="m-center" type="text" @click="handleMapPolylineDoc" :closable="false"> | ||||
|             点击查看连线设置参考文档 | ||||
|           </el-button> | ||||
|           <code-editor v-model="json" lang="json" theme="github" width="100%" height="440"/> | ||||
|         </ai-dialog-btn> | ||||
|       </ai-fold> | ||||
|     </template> | ||||
|     <template v-else-if="isPlot"> | ||||
|       <ai-fold v-for="(chart,i) in options.charts" :key="i"> | ||||
|         <div slot="title" class="flex w100"> | ||||
|           <span class="layoutTitle fill" v-text="chart.title"/> | ||||
|           <el-button type="text" icon="el-icon-delete" @click="options.charts.splice(i,1)"/> | ||||
|         </div> | ||||
|         <config-item label="图表名"> | ||||
|           <el-input size="small" v-model="chart.title"/> | ||||
|         </config-item> | ||||
|         <config-item label="图表模板"> | ||||
|           <chart-picker v-model="chart.chart"/> | ||||
|         </config-item> | ||||
|         <datasource-picker v-model="chart.ds" :instance="instance" class="mar-b10" | ||||
|                            @input="chart={...chart,...chart.ds},$emit('change',options)"/> | ||||
|         <config-item label="数据维度" v-if="chart.dataType !== 'staticData'"> | ||||
|           <code-editor v-model="chart.djson" lang="json" theme="github" width="100%" height="100" | ||||
|                        placeholder="参照echarts配置数据维度,为一个数组,数组的第一个值为维度值" | ||||
|                        @change="v=>chart.dimensions=JSON.parse(v)"/> | ||||
|         </config-item> | ||||
|       </ai-fold> | ||||
|       <el-button type="text" icon="el-icon-plus" @click="options.charts.push({title:'新图表'})">添加图表</el-button> | ||||
|     </template> | ||||
|     <template v-else-if="options.type=='monitorCarousel'"> | ||||
|       <config-item label="监控列表"> | ||||
|         <el-button type="text" icon="el-icon-plus" @click="options.list.push({})"/> | ||||
|       </config-item> | ||||
|       <el-table size="mini" :data="options.list" border :row-style="{backgroundColor:'transparent'}"> | ||||
|         <el-table-column label="监控类型"> | ||||
|           <template v-slot="{row}"> | ||||
|             <ai-select size="mini" v-model="row.monitorType" :select-list="monitorTypes"/> | ||||
|           </template> | ||||
|         </el-table-column> | ||||
|         <el-table-column label="监控地址"> | ||||
|           <template v-slot="{row}"> | ||||
|             <el-input v-if="['hik','dahua'].includes(row.monitorType)" size="mini" v-model="row.src" clearable/> | ||||
|             <div v-else-if="['cmcc','slw'].includes(row.monitorType)"> | ||||
|               <el-input size="mini" v-model="row.api" clearable placeholder="请输入监控列表接口"/> | ||||
|               <ai-select v-model="row.did" :instance="instance" @change="handleMonitor(row)" size="mini" | ||||
|                          :prop="{label:'name'}" :condition="e=>!!e.name&&!!e.id" class="mar-t8" :action="row.api"/> | ||||
|             </div> | ||||
|           </template> | ||||
|         </el-table-column> | ||||
|         <el-table-column width="60px" label="操作"> | ||||
|           <template v-slot="{row,i}"> | ||||
|             <el-button type="text" @click="$confirm('是否删除该监控?').then(()=>options.list.splice(i,1))">删除 | ||||
|             </el-button> | ||||
|           </template> | ||||
|         </el-table-column> | ||||
|       </el-table> | ||||
|     </template> | ||||
|     <div class="layout-config__group" v-else-if="['hik','dahua'].includes(options.monitorType)"> | ||||
|       <h2>基础设置</h2> | ||||
|       <config-item label="视频地址"> | ||||
|         <el-input size="mini" v-model="options.src"/> | ||||
|       </config-item> | ||||
|     </div> | ||||
|     <div class="layout-config__group" v-else> | ||||
|       <h2>基础设置</h2> | ||||
|       <datasource-picker :options="options" :instance="instance" @input="$emit('change',options)"/> | ||||
|     </div> | ||||
|     <div class="layout-config__group" v-if="isTable"> | ||||
|       <h2>表格设置</h2> | ||||
|       <code-editor v-model="json" theme="github" width="100%" height="440" | ||||
|                    placeholder="参照dvScrollBoard设置表格" | ||||
|                    @change="v=>options.tableConfig=JSON.parse(v)"/> | ||||
|     </div> | ||||
|     <div v-if="options.dataType!='staticData'&&options.type=='monitor'&&['cmcc','slw'].includes(options.monitorType)" | ||||
|          class="layout-config__group"> | ||||
|       <h2>字段设置</h2> | ||||
|       <config-item label="监控视频"> | ||||
|         <el-select size="mini" v-model="options.moniterId" placeholder="请选择监控视频" @change="onMoniterId"> | ||||
|           <el-option | ||||
|               v-for="(item, index) in monitorList" | ||||
|               :key="index" | ||||
|               :label="item.name" | ||||
|               :value="item.id"> | ||||
|           </el-option> | ||||
|         </el-select> | ||||
|       </config-item> | ||||
|     </div> | ||||
|     <div v-if="options.dataType!='staticData'&& keys.length &&!['table','monitor','map','plot'].includes(options.type)" | ||||
|          class="layout-config__group"> | ||||
|       <h2>字段设置</h2> | ||||
|       <config-item label="X轴设置"> | ||||
|         <el-select size="mini" v-model="options.dataX" placeholder="请选择X轴" @change="onChooseChange"> | ||||
|           <el-option | ||||
|               v-for="(item, index) in keys" | ||||
|               :key="index" | ||||
|               :label="item" | ||||
|               :value="item"> | ||||
|           </el-option> | ||||
|         </el-select> | ||||
|       </config-item> | ||||
|       <config-item label="Y轴设置"> | ||||
|         <el-select size="mini" multiple :multiple-limit="options.type.indexOf('pie') > -1 ? 1 : 100" | ||||
|                    v-model="options.dataY" collapse-tags placeholder="请选择Y轴" | ||||
|                    @change="onChooseChange"> | ||||
|           <el-option | ||||
|               v-for="(item, index) in keys" | ||||
|               :key="index" | ||||
|               :label="item" | ||||
|               :value="item"> | ||||
|           </el-option> | ||||
|         </el-select> | ||||
|       </config-item> | ||||
|     </div> | ||||
|     <ai-dialog class="layout-config__edit" v-model="showMapEditor" title="设置地图标记点" append-to-body | ||||
|                @close="form={}" @confirm="saveMarker"> | ||||
|       <el-form :model="form" size="small" ref="mapMarker" label-width="120px"> | ||||
|         <el-form-item label="标记点名称" :rules="{required:true,message:'请填写标记点名称'}"> | ||||
|           <el-input placeholder="用于地图上展示对标记点的文字标签" v-model="form.label" clearable/> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="标记点图标"> | ||||
|           <el-input placeholder="用于地图上展示对标记点的显示图标" v-model="form.icon" clearable/> | ||||
|         </el-form-item> | ||||
|         <div flex> | ||||
|           <el-form-item class="fill" label="经度" :rules="{required:true,message:'请填写标记点经度'}"> | ||||
|             <el-input v-model="form.lng" clearable placeholder="小数点位保留至少6位数"/> | ||||
|           </el-form-item> | ||||
|           <el-form-item class="fill" label="纬度" :rules="{required:true,message:'请填写标记点纬度'}"> | ||||
|             <el-input v-model="form.lat" clearable placeholder="小数点位保留至少6位数"/> | ||||
|           </el-form-item> | ||||
|         </div> | ||||
|         <el-form-item label="弹窗内容"> | ||||
|           <ai-editor v-model="form.infoWindowHtml" :instance="instance"/> | ||||
|         </el-form-item> | ||||
|       </el-form> | ||||
|     </ai-dialog> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import CodeEditor from 'bin-ace-editor' | ||||
| import 'brace/mode/json' | ||||
| import 'brace/snippets/json'; | ||||
| import 'brace/theme/github'; | ||||
| import 'brace/theme/monokai'; | ||||
| import AiDialogBtn from "dui/packages/layout/AiDialogBtn.vue"; | ||||
| import AiFold from "dui/packages/layout/AiFold.vue"; | ||||
| import ChartPicker from "./chartPicker.vue"; | ||||
| import {monitorTypes} from "../config"; | ||||
| import ConfigItem from "./configItem.vue"; | ||||
| import DatasourcePicker from "./datasourcePicker.vue"; | ||||
| import AiSelect from "dui/packages/basic/AiSelect.vue"; | ||||
| import {DvCompData} from "dui/dv"; | ||||
|  | ||||
| export default { | ||||
|   name: 'dataConfig', | ||||
|   model: { | ||||
|     prop: "options", | ||||
|     event: "change" | ||||
|   }, | ||||
|   props: { | ||||
|     options: Object, | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       dataTypes: Object.entries(DvCompData.types).map(e => ({id: e[0], label: e[1]})), | ||||
|       json: "", | ||||
|       keys: [], | ||||
|       monitorList: [], | ||||
|       list: [], | ||||
|       showMapEditor: false, | ||||
|       form: {}, | ||||
|       datasource: {}, | ||||
|       monitorTypes | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     markers: v => v.options.staticData?.markers || [], | ||||
|     isTable: v => v.options.type == 'table', | ||||
|     isPlot: v => v.options.type == 'plot' | ||||
|   }, | ||||
|   components: { | ||||
|     AiSelect, | ||||
|     DatasourcePicker, | ||||
|     ConfigItem, | ||||
|     ChartPicker, | ||||
|     AiFold, | ||||
|     AiDialogBtn, | ||||
|     CodeEditor, | ||||
|   }, | ||||
|   created() { | ||||
|     if (this.options.type == "map" && Array.isArray(this.options.staticData)) {//处理历史数据,并更新最新数据结构 | ||||
|       const values = this.$copy(this.options) | ||||
|       values.staticData = {markers: this.$copy(this.options.staticData)} | ||||
|       this.$emit("change", values) | ||||
|     } else if (this.isTable) { | ||||
|       this.json = JSON.stringify(this.options.tableConfig) | ||||
|     } else if (this.options.type == "monitorCarousel") { | ||||
|       const {list = []} = this.options | ||||
|       this.$set(this.options, 'list', list) | ||||
|     } else if (this.isPlot) { | ||||
|       this.options.charts = this.options.charts.map(e => ({...e, ds: e})) | ||||
|     } | ||||
|   }, | ||||
|   mounted() { | ||||
|     if ((this.options.dataY && this.options.dataY.length && this.options.dataX) || this.options.type === 'monitor') { | ||||
|       const api = this.options.dataType === 'apiData' ? this.options.api : `/app/appdiylargescreen/statisticsByLsid?id=${this.options.sourceDataId}` | ||||
|       this.instance.post(api).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           if (res.data.length && this.options.type !== 'monitor') { | ||||
|             this.list = res.data | ||||
|             this.keys = Object.keys(res.data[0]) | ||||
|  | ||||
|             this.$nextTick(() => { | ||||
|               this.onChooseChange() | ||||
|             }) | ||||
|           } else if (this.options.type === 'monitor') { | ||||
|             this.monitorList = res.data | ||||
|  | ||||
|             if (this.options.src) { | ||||
|               const obj = res.data.filter(v => this.options.title === v.name) | ||||
|  | ||||
|               if (obj.length) { | ||||
|                 this.options.src = obj[0].url | ||||
|               } | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       }) | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     onMoniterId(e) { | ||||
|       this.instance.post(`/app/appzyvideoequipment/getWebSdkUrl?deviceId=${e}`).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           this.options.src = JSON.parse(res.data).url | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     handleMonitor(row) { | ||||
|       this.instance.post(`/app/appzyvideoequipment/getWebSdkUrl?deviceId=${row.did}`).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           this.$set(row, 'src', JSON.parse(res.data).url) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     onChooseChange() { | ||||
|       let arr = [] | ||||
|       if (this.options.dataX && this.options.dataY.length) { | ||||
|         this.list.forEach(item => { | ||||
|           let obj = {} | ||||
|           this.options.dataY.forEach(v => { | ||||
|             obj[v] = item[v] | ||||
|           }) | ||||
|           arr.push({ | ||||
|             [this.options.dataX]: item[this.options.dataX], | ||||
|             ...obj | ||||
|           }) | ||||
|         }) | ||||
|         this.options[this.options.dataType] = arr | ||||
|       } | ||||
|     }, | ||||
|     handleMapMarker(v = {}, index) { | ||||
|       this.form = this.$copy({...v, index}) | ||||
|       this.showMapEditor = true | ||||
|     }, | ||||
|     saveMarker() { | ||||
|       this.$refs.mapMarker.validate().then(() => { | ||||
|         const i = this.$copy(this.form.index) | ||||
|         delete this.form.index | ||||
|         if (i > -1) { | ||||
|           this.options.staticData.markers.splice(i, 1, this.form) | ||||
|         } else this.options.staticData.markers.push(this.form) | ||||
|         this.showMapEditor = false | ||||
|       }) | ||||
|     }, | ||||
|     removeMapMarker(i) { | ||||
|       this.$confirm("是否要删除该标记点").then(() => { | ||||
|         this.options.staticData.markers.splice(i, 1) | ||||
|       }) | ||||
|     }, | ||||
|     savePolylines() { | ||||
|       this.$set(this.options.staticData, 'polylines', JSON.parse(this.json)) | ||||
|     }, | ||||
|     handleMapPolylines() { | ||||
|       this.json = JSON.stringify(this.options.staticData.polylines || [{path: [[31.547706, 107.224325], [31.552456, 107.201185]]}]) | ||||
|     }, | ||||
|     handleMapPolylineDoc() { | ||||
|       window.open('https://lbs.amap.com/api/javascript-api-v2/documentation#polyline') | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss"> | ||||
| .el-dialog__body { | ||||
|   .jsoneditor-vue { | ||||
|     height: 480px; | ||||
|  | ||||
|     .jsoneditor-poweredBy { | ||||
|       display: none; | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| .ai-dialog__wrapper { | ||||
|   color: #333; | ||||
| } | ||||
|  | ||||
| .layout-config__group--wrapper { | ||||
|  | ||||
|   :deep(.layout-config__group) { | ||||
|     padding: 10px 10px 20px; | ||||
|     border-bottom: 1px solid #000000; | ||||
|  | ||||
|     &:last-child { | ||||
|       border: none; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     & > h2 { | ||||
|       margin-bottom: 20px; | ||||
|       color: #FFFFFF; | ||||
|       font-size: 15px; | ||||
|       font-weight: 700; | ||||
|     } | ||||
|  | ||||
|     .layoutTitle { | ||||
|       color: #FFFFFF; | ||||
|       font-size: 15px; | ||||
|       font-weight: 700; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep(.layout-config__item) { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: space-between; | ||||
|     margin-bottom: 10px; | ||||
|  | ||||
|     &:last-child { | ||||
|       margin-bottom: 0; | ||||
|     } | ||||
|  | ||||
|     label { | ||||
|       flex-shrink: 0; | ||||
|       width: 60px; | ||||
|       color: #FFFFFF; | ||||
|       font-size: 12px; | ||||
|       text-align: right; | ||||
|     } | ||||
|  | ||||
|     .el-select .el-tag { | ||||
|       color: #fff; | ||||
|       background: transparent; | ||||
|     } | ||||
|  | ||||
|     .el-input__icon { | ||||
|       color: #fff; | ||||
|     } | ||||
|  | ||||
|     .el-switch__label { | ||||
|       color: #fff; | ||||
|     } | ||||
|  | ||||
|     .el-select { | ||||
|       width: 100%; | ||||
|  | ||||
|       &:last-child { | ||||
|         margin-right: 0; | ||||
|       } | ||||
|  | ||||
|       input { | ||||
|         background: #262C33; | ||||
|         font-size: 12px; | ||||
|         color: #fff; | ||||
|         border: 1px solid #030411; | ||||
|       } | ||||
|  | ||||
|       .el-input__icon { | ||||
|         color: #fff; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     :deep(.el-collapse) { | ||||
|       height: 18px; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .el-icon-delete { | ||||
|     color: #f46; | ||||
|   } | ||||
|  | ||||
|   .el-button--text + .el-button--text { | ||||
|     margin-left: 0; | ||||
|   } | ||||
|  | ||||
|   input { | ||||
|     background: #262C33; | ||||
|     font-size: 12px; | ||||
|     color: #fff; | ||||
|     border: 1px solid #030411; | ||||
|   } | ||||
|  | ||||
|   .layout-config__item--right { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: flex-end; | ||||
|     text-align: right; | ||||
|     margin-left: 30px; | ||||
|   } | ||||
|  | ||||
|   .el-table { | ||||
|     background-color: transparent; | ||||
|  | ||||
|     tr { | ||||
|       background-color: transparent; | ||||
|     } | ||||
|  | ||||
|     .el-table__cell { | ||||
|       color: white; | ||||
|       background-color: #1D2127 !important; | ||||
|  | ||||
|       input:disabled { | ||||
|         background-color: transparent; | ||||
|         border-color: transparent; | ||||
|         color: white; | ||||
|         padding: 0; | ||||
|       } | ||||
|  | ||||
|       &:last-of-type { | ||||
|         border-left: 1px solid #fff; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| </style> | ||||
							
								
								
									
										91
									
								
								packages/bigscreen/designer/components/chartPicker.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,91 @@ | ||||
| <template> | ||||
|   <section class="chartPicker"> | ||||
|     <ai-dialog-btn :modal="false" dialog-title="选择图表模板" :customFooter="false" | ||||
|                    @confirm="handleConfirm" @open="handleOpenDialog"> | ||||
|       <template #btn> | ||||
|         <img class="pointer thumb" v-if="current.thumb" :src="current.thumb"/> | ||||
|         <el-button v-else type="text">选择图表</el-button> | ||||
|       </template> | ||||
|       <div class="charts"> | ||||
|         <div class="item pointer" v-for="(tpl,i) in tpls" :key="i" :class="{selected:selected==tpl.type}" | ||||
|              @click="selected=tpl.type"> | ||||
|           <img :src="tpl.thumb"/> | ||||
|           <div v-text="tpl.label"/> | ||||
|         </div> | ||||
|       </div> | ||||
|     </ai-dialog-btn> | ||||
|   </section> | ||||
| </template> | ||||
| <script> | ||||
| import AiDialogBtn from "dui/packages/layout/AiDialogBtn"; | ||||
| import {chartTpl} from "../config"; | ||||
|  | ||||
| export default { | ||||
|   name: "chartPicker", | ||||
|   components: {AiDialogBtn}, | ||||
|   model: { | ||||
|     prop: "value", | ||||
|     event: "input" | ||||
|   }, | ||||
|   props: { | ||||
|     value: String, | ||||
|     tpls: {default: () => chartTpl.map(e => e.list).flat()} | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       selected: null | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     current: v => v.tpls.find(e => e.type == v.value) || {} | ||||
|   }, | ||||
|   watch: { | ||||
|     value(v) { | ||||
|       v && this.$emit("config", this.$echartTpls[v]) | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     handleConfirm() { | ||||
|       this.$emit("input", this.selected) | ||||
|     }, | ||||
|     handleOpenDialog() { | ||||
|       this.selected = this.$copy(this.value) | ||||
|     } | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
| <style scoped lang="scss"> | ||||
| .chartPicker { | ||||
|   text-align: left; | ||||
|  | ||||
|   .pointer { | ||||
|     cursor: pointer; | ||||
|   } | ||||
|  | ||||
|   .thumb { | ||||
|     width: 200px; | ||||
|     height: 90px; | ||||
|   } | ||||
|  | ||||
|   .charts { | ||||
|     display: grid; | ||||
|     grid-template-columns: 1fr 1fr 1fr 1fr 1fr; | ||||
|     gap: 8px; | ||||
|  | ||||
|     .item { | ||||
|       text-align: center; | ||||
|       padding: 2px; | ||||
|       border: 2px solid transparent; | ||||
|  | ||||
|       & > img { | ||||
|         width: 100%; | ||||
|         height: 90px; | ||||
|       } | ||||
|  | ||||
|       &.selected, &:hover { | ||||
|         border-color: #46f; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										89
									
								
								packages/bigscreen/designer/components/componentConfig.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,89 @@ | ||||
| <template> | ||||
|   <section class="componentConfig"> | ||||
|     <div class="layout-right__content--wrapper"> | ||||
|       <div class="layout-config__group"> | ||||
|         <h2>基础设置</h2> | ||||
|         <div class="layout-config__item"> | ||||
|           <label>图表尺寸</label> | ||||
|           <div class="layout-config__item--right"> | ||||
|             <el-input-number size="mini" :min="0" v-model="config.width" controls-position="right"/> | ||||
|             <el-input-number size="mini" :min="0" v-model="config.height" controls-position="right"/> | ||||
|           </div> | ||||
|         </div> | ||||
|         <div class="layout-config__item"> | ||||
|           <label>图表位置</label> | ||||
|           <div class="layout-config__item--right"> | ||||
|             <el-input-number size="mini" :min="0" v-model="config.left" controls-position="right"/> | ||||
|             <el-input-number size="mini" :min="0" v-model="config.top" controls-position="right"/> | ||||
|           </div> | ||||
|         </div> | ||||
|         <config-item label="內边距"> | ||||
|           <el-input size="mini" v-model="config.padding" clearable placeholder="请输入符合css的padding合法值"/> | ||||
|         </config-item> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div class="layout-right__content--wrapper"> | ||||
|       <div class="layout-config__group"> | ||||
|         <h2>组件设置</h2> | ||||
|         <config-extra v-model="config"/> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div class="layout-right__content--wrapper"> | ||||
|       <div class="layout-config__group"> | ||||
|         <h2>弹窗设置</h2> | ||||
|         <config-item label="标题"> | ||||
|           <el-input size="mini" clearable placeholder="请输入弹窗标题" v-model="config.dialogTitle"/> | ||||
|         </config-item> | ||||
|         <config-item label="内容" v-if="!['table','AiDvTable','AiDvMap','linkageMap'].includes(config.type)"> | ||||
|           <ai-dialog-btn dialog-title="弹窗内容" text="打开编辑器" :modal="false"> | ||||
|             <ai-editor clearable placeholder="请输入弹窗内容" v-model="config.dialogContent" :instance="instance"/> | ||||
|           </ai-dialog-btn> | ||||
|         </config-item> | ||||
|       </div> | ||||
|     </div> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import ConfigItem from "./configItem"; | ||||
| import ConfigExtra from "./configExtra.vue"; | ||||
|  | ||||
| export default { | ||||
|   name: 'componentConfig', | ||||
|   components: {ConfigExtra, ConfigItem}, | ||||
|   props: { | ||||
|     config: {default: () => ({})}, | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .componentConfig { | ||||
|   .table-config { | ||||
|     & > div { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       justify-content: space-between; | ||||
|       width: 232px; | ||||
|  | ||||
|       :deep( .el-select ) { | ||||
|         width: 80px; | ||||
|       } | ||||
|  | ||||
|       .el-select { | ||||
|         width: 100%; | ||||
|  | ||||
|         .el-input { | ||||
|           width: 100%; | ||||
|  | ||||
|           :deep( input ) { | ||||
|             width: 80px | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										239
									
								
								packages/bigscreen/designer/components/configExtra.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,239 @@ | ||||
| <script> | ||||
| import GroupItem from "./groupItem"; | ||||
| import ConfigItem from "./configItem"; | ||||
| import ChartPicker from "./chartPicker"; | ||||
| import JsonEditor from "./jsonEditor"; | ||||
| import {layers, monitorTypes} from "../config"; | ||||
| import AiDvSummary from "dui/dv/layout/AiDvSummary/AiDvSummary"; | ||||
|  | ||||
| export default { | ||||
|   name: "configExtra", | ||||
|   components: {JsonEditor, ChartPicker, ConfigItem, GroupItem}, | ||||
|   props: ['config'], | ||||
|   model: { | ||||
|     prop: 'config', | ||||
|     event: 'input' | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       borderList: ['border0', 'border1', 'border2', 'border3', 'border4', 'border5', 'border6', 'border7', 'border8', 'border9', 'border10', | ||||
|         'border11', 'border12', 'border13', 'border14', 'border15'],//边框待选项 | ||||
|       layers, monitorTypes, | ||||
|       tableStatus: [ | ||||
|         {label: '是', value: '1'}, | ||||
|         {label: '否', value: '0'} | ||||
|       ], | ||||
|       positionList: [ | ||||
|         {label: "左上", id: "lt"}, | ||||
|         {label: "右上", id: "rt"}, | ||||
|         {label: "左下", id: "lb"}, | ||||
|         {label: "右下", id: "rb"} | ||||
|       ], | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     summaryOps: () => Object.keys(AiDvSummary.components).map(e => ({label: e, id: e})), | ||||
|     values: v => v.config?.[v.config?.dataType] || v.config.data | ||||
|   }, | ||||
|   watch: { | ||||
|     values: { | ||||
|       immediate: true, deep: true, | ||||
|       handler() { | ||||
|         if (this.config.type === 'AiDvTable') { | ||||
|           this.config.config = this.values?.map((v, i) => { | ||||
|             return { | ||||
|               color: this.config.config?.[i]?.color || '', | ||||
|               width: this.config.config?.[i]?.width || '', | ||||
|               align: this.config.config?.[i]?.align || '', | ||||
|             } | ||||
|           }) | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <template> | ||||
|   <section class="configExtra"> | ||||
|     <config-item label="标题"> | ||||
|       <el-input v-model="config.summaryTitle" size="mini" v-if="config.display === 'summary2'" placeholder="请输入标题"/> | ||||
|       <el-input v-else v-model="config.title" size="mini" placeholder="请输入标题"/> | ||||
|     </config-item> | ||||
|     <config-item label="边框" v-if="config.type !== 'display'"> | ||||
|       <el-select size="mini" v-model="config.border" placeholder="请选择边框" clearable> | ||||
|         <el-option | ||||
|             v-for="(item, index) in borderList" | ||||
|             :key="index" | ||||
|             :label="item" | ||||
|             :value="item"> | ||||
|         </el-option> | ||||
|       </el-select> | ||||
|     </config-item> | ||||
|     <config-item label="图表模板"> | ||||
|       <chart-picker v-model="config.type" :tpls="layers" @input="v=>config.echartOps=$echartTpls[v]"/> | ||||
|     </config-item> | ||||
|     <template v-if="/(AiDvMap|linkageMap)/.test(config.type)"> | ||||
|       <config-item label="地图数据(geoJSON)"> | ||||
|         <el-input v-model="config.geoJson" size="mini" clearable placeholder="请输入geoJson的URL地址"/> | ||||
|       </config-item> | ||||
|     </template> | ||||
|     <template v-if="/linkageMap/.test(config.type)"> | ||||
|       <config-item v-for="(item,i) in config.summaryConfigs" :key="i" :label="`统计${i+1}`"> | ||||
|         <ai-select placeholder="请选择位置" v-model="item.pos" :select-list="positionList" size="mini"/> | ||||
|         <ai-select placeholder="请选择类型" v-model="item.display" :select-list="summaryOps" size="mini"/> | ||||
|       </config-item> | ||||
|     </template> | ||||
|     <template v-if="/tabs/.test(config.type)"> | ||||
|       <group-item v-for="(tab,i) in values" :key="i" :label="i"> | ||||
|         <group-item v-for="(comp,j) in tab" :key="j" :label="comp.name"> | ||||
|           <config-extra v-model="tab[j]"/> | ||||
|         </group-item> | ||||
|       </group-item> | ||||
|     </template> | ||||
|     <template v-if="/Chart/.test(config.type)"> | ||||
|       <config-item label="图表配置项" top-label> | ||||
|         <json-editor v-model="config.echartOps"/> | ||||
|       </config-item> | ||||
|     </template> | ||||
|     <config-item label="视频地址" v-if="config.type === 'video'"> | ||||
|       <el-input v-model="config.src" size="mini"/> | ||||
|     </config-item> | ||||
|     <config-item label="图片URL" v-if="config.type=='img'"> | ||||
|       <el-input v-model="config.src" size="mini" clearable placeholder="请输入图片URL"/> | ||||
|     </config-item> | ||||
|     <config-item label="视频类型" v-if="config.type === 'monitor'"> | ||||
|       <ai-select size="mini" v-model="config.monitorType" :select-list="monitorTypes"/> | ||||
|     </config-item> | ||||
|     <config-item label="样式" v-if="config.type === 'AiRanking'"> | ||||
|       <el-select size="mini" v-model="config.subType" placeholder="请选择样式" clearable> | ||||
|         <el-option label="样式1" value="Ranking1"></el-option> | ||||
|         <el-option label="样式2" value="Ranking2"></el-option> | ||||
|         <el-option label="样式3" value="Ranking3"></el-option> | ||||
|       </el-select> | ||||
|     </config-item> | ||||
|     <template v-if="config.type === 'table' || config.type === 'AiDvTable'"> | ||||
|       <config-item label="显示排名"> | ||||
|         <el-select size="mini" v-model="config.isShowIndex" placeholder="请选择" clearable> | ||||
|           <el-option | ||||
|               v-for="(item, index) in tableStatus" | ||||
|               :key="index" | ||||
|               :label="item.label" | ||||
|               :value="item.value"> | ||||
|           </el-option> | ||||
|         </el-select> | ||||
|       </config-item> | ||||
|       <config-item label="斑马纹" v-if="config.type === 'AiDvTable'"> | ||||
|         <el-select size="mini" v-model="config.stripe" placeholder="请选择" clearable> | ||||
|           <el-option | ||||
|               label="是" | ||||
|               value="1"> | ||||
|           </el-option> | ||||
|           <el-option | ||||
|               label="否" | ||||
|               value="0"> | ||||
|           </el-option> | ||||
|         </el-select> | ||||
|       </config-item> | ||||
|       <config-item label="简易样式" v-if="config.type === 'AiDvTable'"> | ||||
|         <el-select size="mini" v-model="config.simple" placeholder="请选择" clearable> | ||||
|           <el-option | ||||
|               label="是" | ||||
|               value="1"> | ||||
|           </el-option> | ||||
|           <el-option | ||||
|               label="否" | ||||
|               value="0"> | ||||
|           </el-option> | ||||
|         </el-select> | ||||
|       </config-item> | ||||
|       <config-item label="表格行数" v-if="config.type !== 'AiDvTable'"> | ||||
|         <el-input-number size="mini" style="width: 232px" :min="0" v-model="config.rowNum" controls-position="right"/> | ||||
|       </config-item> | ||||
|       <config-item v-if="config.type === 'AiDvTable'" v-for="(item, i) in config.config" :key="i" :label="`第${i+1}列`"> | ||||
|         <el-select size="mini" style="width: 80px;" v-model="item.align" placeholder="请选择" clearable> | ||||
|           <el-option label="居中" value="center"></el-option> | ||||
|           <el-option label="居左" value="left"></el-option> | ||||
|           <el-option label="居右" value="right"></el-option> | ||||
|         </el-select> | ||||
|         <el-color-picker v-model="item.color" class="mar-h10" size="mini"/> | ||||
|         <el-input-number v-model="item.width" label="描述文字" controls-position="right" size="mini"/> | ||||
|       </config-item> | ||||
|     </template> | ||||
|     <template v-if="config.type === 'map'"> | ||||
|       <div class="layout-config__item"> | ||||
|         <label>遮罩层</label> | ||||
|         <div class="layout-config__item--right"> | ||||
|           <el-select size="mini" v-model="config.mask" placeholder="请选择" clearable> | ||||
|             <el-option label="是" value="1"></el-option> | ||||
|             <el-option label="否" value="2"></el-option> | ||||
|           </el-select> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="layout-config__item"> | ||||
|         <label>地图图层</label> | ||||
|         <div class="layout-config__item--right"> | ||||
|           <el-select size="mini" v-model="config.layers" placeholder="请选择" clearable> | ||||
|             <el-option label="地图" value="vector"/> | ||||
|             <el-option label="卫星" value="satellite"/> | ||||
|           </el-select> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="layout-config__item"> | ||||
|         <label>选择地区</label> | ||||
|         <div class="layout-config__item--right"> | ||||
|           <AiAreaGet :instance="instance" :valueLevel="3" v-model="config.areaId" placeholder="地图展示的中心"/> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="layout-config__item"> | ||||
|         <label>限制地区</label> | ||||
|         <div class="layout-config__item--right"> | ||||
|           <ai-select v-model="config.limitArea" :selectList="dict.getDict('yesOrNo')"/> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="layout-config__item"> | ||||
|         <label>显示标签</label> | ||||
|         <div class="layout-config__item--right"> | ||||
|           <ai-select v-model="config.alwaysShow" :selectList="dict.getDict('yesOrNo')"/> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="layout-config__item"> | ||||
|         <label>展示光轨</label> | ||||
|         <div class="layout-config__item--right"> | ||||
|           <ai-select v-model="config.pulseLines" :selectList="dict.getDict('yesOrNo')"/> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="layout-config__item layout-config__item--input"> | ||||
|         <label>地图样式</label> | ||||
|         <div class="layout-config__item--right"> | ||||
|           <el-input size="mini" v-model="config.mapStyle" clearable placeholder="请输入地图样式ID,从UI处获取.."/> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="layout-config__item layout-config__item--input"> | ||||
|         <label>3D地图</label> | ||||
|         <div class="layout-config__item--right"> | ||||
|           <ai-select v-model="config.is3d" :selectList="dict.getDict('yesOrNo')"/> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="layout-config__item layout-config__item--input" v-if="config.is3d==1"> | ||||
|         <label>3D环绕</label> | ||||
|         <div class="layout-config__item--right"> | ||||
|           <ai-select v-model="config.is3dAround" :selectList="dict.getDict('yesOrNo')"/> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="layout-config__item layout-config__item--input"> | ||||
|         <label>显示图例</label> | ||||
|         <div class="layout-config__item--right"> | ||||
|           <ai-select v-model="config.showPingchangMapLegend" :selectList="dict.getDict('yesOrNo')"/> | ||||
|         </div> | ||||
|       </div> | ||||
|     </template> | ||||
|     <config-item label="数据汇总" v-if="config.type === 'summary'"> | ||||
|       <ai-select size="mini" v-model="config.display" placeholder="请选择类型" :select-list="summaryOps"/> | ||||
|     </config-item> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <style scoped lang="scss"> | ||||
|  | ||||
| </style> | ||||
							
								
								
									
										111
									
								
								packages/bigscreen/designer/components/configItem.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,111 @@ | ||||
| <template> | ||||
|   <section class="configItem" :class="{topLabel}"> | ||||
|     <label :class="{bold}" v-text="label"/> | ||||
|     <div class="content fill"> | ||||
|       <slot v-if="$slots.default"/> | ||||
|       <div v-else-if="value" v-html="value"/> | ||||
|     </div> | ||||
|   </section> | ||||
| </template> | ||||
| <script> | ||||
| export default { | ||||
|   name: "configItem", | ||||
|   props: { | ||||
|     label: String, | ||||
|     value: {default: null}, | ||||
|     topLabel: Boolean, | ||||
|     bold: Boolean | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
| <style scoped lang="scss"> | ||||
| .configItem { | ||||
|   display: flex; | ||||
|   align-items: center; | ||||
|   justify-content: space-between; | ||||
|   margin-bottom: 10px; | ||||
|  | ||||
|  | ||||
|   &:last-child { | ||||
|     margin-bottom: 0; | ||||
|   } | ||||
|  | ||||
|   & > label { | ||||
|     flex-shrink: 0; | ||||
|     width: 60px; | ||||
|     color: #FFFFFF; | ||||
|     font-size: 12px; | ||||
|     text-align: right; | ||||
|  | ||||
|     &.bold { | ||||
|       font-weight: bold; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .el-select .el-tag { | ||||
|     color: #fff; | ||||
|     background: transparent; | ||||
|   } | ||||
|  | ||||
|   .el-input__icon { | ||||
|     color: #fff; | ||||
|   } | ||||
|  | ||||
|   .el-switch__label { | ||||
|     color: #fff; | ||||
|   } | ||||
|  | ||||
|   .el-select, .ai-select { | ||||
|     width: 100%; | ||||
|  | ||||
|     &:last-child { | ||||
|       margin-right: 0; | ||||
|     } | ||||
|  | ||||
|     input { | ||||
|       background: #262C33; | ||||
|       font-size: 12px; | ||||
|       color: #fff; | ||||
|       border: 1px solid #030411; | ||||
|     } | ||||
|  | ||||
|     .el-input__icon { | ||||
|       color: #fff; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep(.el-collapse) { | ||||
|     height: 18px; | ||||
|   } | ||||
|  | ||||
|   :deep(.content) { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: flex-end; | ||||
|     text-align: right; | ||||
|     margin-left: 27px; | ||||
|  | ||||
|     input, textarea { | ||||
|       background: #262C33; | ||||
|       font-size: 12px; | ||||
|       color: #fff; | ||||
|       border: 1px solid #030411; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   &.topLabel { | ||||
|     flex-direction: column; | ||||
|     align-items: normal; | ||||
|  | ||||
|     & > label { | ||||
|       margin-bottom: 8px; | ||||
|     } | ||||
|  | ||||
|     .content { | ||||
|       flex-shrink: 0; | ||||
|       width: 100%; | ||||
|       margin-left: 0; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										119
									
								
								packages/bigscreen/designer/components/datasourcePicker.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,119 @@ | ||||
| <template> | ||||
|   <section class="datasourcePicker"> | ||||
|     <config-item label="数据类型"> | ||||
|       <ai-select v-model="source.dataType" placeholder="请选择数据类型" :select-list="dataTypes"/> | ||||
|     </config-item> | ||||
|     <div class="codeEditor" v-if="['htmlData'].includes(source.dataType)"> | ||||
|       <ai-dialog-btn :modal="false" dialog-title="编辑器" :customFooter="false" | ||||
|                      @confirm="changeData(JSON.parse(content))" @open="content=contentstr"> | ||||
|         <code-editor slot="btn" readonly :value="contentstr" :lang="dataLang" theme="github" width="100%" height="250"/> | ||||
|         <code-editor v-model="content" :lang="dataLang" theme="github" width="100%" height="440" wrap/> | ||||
|       </ai-dialog-btn> | ||||
|     </div> | ||||
|     <template v-else-if="source.dataType === 'staticData'"> | ||||
|       <config-item label="设置数据" topLabel> | ||||
|         <json-editor v-model="options.staticData" mainMenuBar/> | ||||
|       </config-item> | ||||
|     </template> | ||||
|     <config-item v-else-if="source.dataType === 'dynamicData'" label="数据源"> | ||||
|       <ai-select v-model="source.sourceDataId" placeholder="请选择数据源" :instance="instance" | ||||
|                  :prop="{label:'description'}" @change="changeData" | ||||
|                  action="/app/appdiylargescreen/allDatasourceByPage"/> | ||||
|     </config-item> | ||||
|     <config-item label="接口地址" v-else-if="source.dataType === 'apiData'"> | ||||
|       <el-input size="small" v-model="source.api" @change="changeData" placeholder="请输入数据接口URL"/> | ||||
|     </config-item> | ||||
|   </section> | ||||
| </template> | ||||
| <script> | ||||
| import AiDialogBtn from "dui/packages/layout/AiDialogBtn.vue"; | ||||
| import ConfigItem from "./configItem.vue"; | ||||
| import CodeEditor from 'bin-ace-editor' | ||||
| import 'brace/mode/json' | ||||
| import 'brace/snippets/json'; | ||||
| import 'brace/theme/github'; | ||||
| import 'brace/theme/monokai'; | ||||
| import JsonEditor from "./jsonEditor.vue"; | ||||
| import {DvCompData} from "dui/dv"; | ||||
|  | ||||
| export default { | ||||
|   name: "datasourcePicker", | ||||
|   components: {JsonEditor, ConfigItem, AiDialogBtn, CodeEditor}, | ||||
|   model: { | ||||
|     event: "input", | ||||
|     prop: "options" | ||||
|   }, | ||||
|   props: { | ||||
|     options: Object, | ||||
|     instance: Function | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       dataTypes: Object.entries(DvCompData.types).map(e => ({id: e[0], label: e[1]})), | ||||
|       content: "", | ||||
|       loading: false, | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     contentstr: v => JSON.stringify(v.options.staticData), | ||||
|     dataLang: v => v.options.dataType == 'htmlData' ? 'html' : 'json', | ||||
|     source: { | ||||
|       set(v) { | ||||
|         this.$emit("input", v) | ||||
|       }, | ||||
|       get() { | ||||
|         return this.options | ||||
|       } | ||||
|     }, | ||||
|     staticDataOps() { | ||||
|       const columnProp = "name", ops = {colConfigs: [], tableData: []} | ||||
|       if (Array.isArray(this.options.staticData)) { | ||||
|         const columns = [] | ||||
|         ops.colConfigs = [] | ||||
|         this.options.staticData.map((row, i) => { | ||||
|           const prop = `c${i || ""}` | ||||
|           ops.colConfigs.push({label: row[columnProp] || row.key, prop}) | ||||
|           Object.entries(row).map(([k, v]) => { | ||||
|             if (/^v/.test(k) && k != "value") { | ||||
|               const item = ops.tableData[k.substring(1) || 0] || {} | ||||
|               item[prop] = v | ||||
|               ops.tableData[k.substring(1) || 0] = item | ||||
|             } else if (![columnProp, 'key'].includes(k)) { | ||||
|               const index = columns.findIndex(e => k == e) | ||||
|               if (index > -1) { | ||||
|                 const item = ops.tableData[index] || {} | ||||
|                 item[prop] = v | ||||
|                 ops.tableData[index] = item | ||||
|               } else { | ||||
|                 columns.push(k) | ||||
|                 const newIndex = columns.length - 1 | ||||
|                 const item = ops.tableData[newIndex] || {} | ||||
|                 item[prop] = v | ||||
|                 ops.tableData[newIndex] = item | ||||
|               } | ||||
|             } | ||||
|           }) | ||||
|         }) | ||||
|         ops.tableData = ops.tableData.map(e => ({...e, $cellEdit: false})) | ||||
|       } | ||||
|       return ops | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     changeData(sdata) { | ||||
|       this.source.dataType == 'staticData' ? this.source.staticData = sdata : | ||||
|           new DvCompData(this.source, this.instance).getData().then(data => { | ||||
|             this.source[this.source.dataType] = data | ||||
|           }) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
| <style scoped lang="scss"> | ||||
| .datasourcePicker { | ||||
|   .codeEditor { | ||||
|     position: relative; | ||||
|     padding-left: 10px; | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										32
									
								
								packages/bigscreen/designer/components/groupItem.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,32 @@ | ||||
| <script> | ||||
| export default { | ||||
|   name: "groupItem", | ||||
|   props: ['label'] | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <template> | ||||
|   <section class="groupItem"> | ||||
|     <h2 v-if="label" v-text="label"/> | ||||
|     <slot/> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <style scoped lang="scss"> | ||||
| .groupItem { | ||||
|   padding: 10px 10px 20px; | ||||
|   border-bottom: 1px solid #000000; | ||||
|  | ||||
|   &:last-child { | ||||
|     border: none; | ||||
|   } | ||||
|  | ||||
|  | ||||
|   & > h2 { | ||||
|     margin-bottom: 20px; | ||||
|     color: #FFFFFF; | ||||
|     font-size: 15px; | ||||
|     font-weight: 700; | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										98
									
								
								packages/bigscreen/designer/components/jsonEditor.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,98 @@ | ||||
| <script> | ||||
| export default { | ||||
|   name: "jsonEditor", | ||||
|   model: { | ||||
|     event: "input", | ||||
|     prop: "value" | ||||
|   }, | ||||
|   props: { | ||||
|     value: {default: () => ({})} | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       editor: null, | ||||
|       fullscreen: false | ||||
|     } | ||||
|   }, | ||||
|   watch: { | ||||
|     value(v) { | ||||
|       const content = this.editor.get() | ||||
|       if (v && content && JSON.stringify(v) != JSON.stringify(content)) { | ||||
|         this.editor?.set(v) | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     init() { | ||||
|       const {JSONEditor} = window | ||||
|       if (!this.editor && JSONEditor) { | ||||
|         const {mode, search, mainMenuBar, navigationBar} = this.$attrs | ||||
|         this.editor = new JSONEditor(this.$el, { | ||||
|           modes: ['code', 'form', 'tree'], | ||||
|           language: 'zh-CN', mode, search, mainMenuBar, navigationBar, statusBar: true, | ||||
|           onChange: () => { | ||||
|             this.$emit("input", this.editor.get()) | ||||
|           }, | ||||
|         }, this.value) | ||||
|       } else setTimeout(() => this.init(), 500) | ||||
|       const fullscreenBtn = this.$el.querySelector(".fullscreenBtn") | ||||
|       if (!fullscreenBtn) { | ||||
|         const btn = document.createElement("div") | ||||
|         btn.className = "fullscreenBtn el-icon-full-screen" | ||||
|         btn.onclick = evt => { | ||||
|           evt.stopPropagation() | ||||
|           this.fullscreen = !this.fullscreen | ||||
|         } | ||||
|         this.$el.appendChild(btn) | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   mounted() { | ||||
|     this.init() | ||||
|   }, | ||||
|   beforeDestroy() { | ||||
|     this.editor?.destroy() | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <template> | ||||
|   <section class="jsoneditor" @contextmenu.stop :class="{fullscreen}"/> | ||||
| </template> | ||||
|  | ||||
| <style scoped lang="scss"> | ||||
| .jsoneditor { | ||||
|   position: relative; | ||||
|  | ||||
|   &.fullscreen { | ||||
|     position: fixed; | ||||
|     left: 50%; | ||||
|     top: 50%; | ||||
|     transform: translate(-50%, -50%); | ||||
|     width: 80vw; | ||||
|     height: 80vh; | ||||
|     z-index: 202403221146; | ||||
|   } | ||||
|  | ||||
|   :deep(.ace-jsoneditor) { | ||||
|     font-size: 14px !important; | ||||
|   } | ||||
|  | ||||
|   :deep(.fullscreenBtn) { | ||||
|     position: absolute; | ||||
|     z-index: 202403221132; | ||||
|     right: 6px; | ||||
|     top: 0; | ||||
|     height: 35px; | ||||
|     color: white; | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: center; | ||||
|     cursor: pointer; | ||||
|  | ||||
|     &:hover { | ||||
|       color: rgba(white, .6); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										794
									
								
								packages/bigscreen/designer/config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,794 @@ | ||||
| /** | ||||
|  * 大屏设计资产库,模板设置中心 | ||||
|  * | ||||
|  */ | ||||
| export const chartTpl = [{ | ||||
|   label: '柱状图', type: 'bar', list: [{ | ||||
|     code: 'widget-linechart', | ||||
|     type: 'barChart1', | ||||
|     label: '柱状图1', | ||||
|     title: '柱状图', | ||||
|     border: 'border6', | ||||
|     icon: 'icontext_box', | ||||
|     value: '', | ||||
|     thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar1.png', | ||||
|     width: 500, | ||||
|     sourceDataId: '', | ||||
|     height: 300, | ||||
|     dataX: '', | ||||
|     zIndex: 1, | ||||
|     dataY: [], | ||||
|     top: 0, | ||||
|     left: 0, | ||||
|     api: '', | ||||
|     apiData: [], | ||||
|     dataType: 'staticData', | ||||
|     staticData: [{name: '阿斯达', v1: 23}, {name: '水电费', v1: 12}, {name: '凡哥', v1: 67}, {name: '党费', v1: 98}], | ||||
|     config: 'barChart1', | ||||
|     dynamicData: [] | ||||
|   }, { | ||||
|     code: 'widget-linechart', | ||||
|     type: 'barChart2', | ||||
|     label: '柱状图2', | ||||
|     icon: 'icontext_box', | ||||
|     value: '', | ||||
|     title: '柱状图2', | ||||
|     width: 500, | ||||
|     border: 'border6', | ||||
|     sourceDataId: '', | ||||
|     height: 300, | ||||
|     thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar2.png', | ||||
|     dataX: '', | ||||
|     dataY: [], | ||||
|     top: 0, | ||||
|     zIndex: 1, | ||||
|     left: 0, | ||||
|     dataType: 'staticData', | ||||
|     api: '', | ||||
|     apiData: [], | ||||
|     staticData: [{name: '阿斯达', v1: 23}, {name: '水电费', v1: 12}, {name: '凡哥', v1: 67}, {name: '党费', v1: 98}], | ||||
|     config: 'barChart2', | ||||
|     dynamicData: [] | ||||
|   }, { | ||||
|     code: 'widget-linechart', | ||||
|     type: 'barChart3', | ||||
|     label: '柱状图3', | ||||
|     title: '柱状图3', | ||||
|     icon: 'icontext_box', | ||||
|     value: '', | ||||
|     width: 500, | ||||
|     sourceDataId: '', | ||||
|     height: 300, | ||||
|     thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar3.png', | ||||
|     dataX: '', | ||||
|     dataY: [], | ||||
|     border: 'border6', | ||||
|     top: 0, | ||||
|     left: 0, | ||||
|     zIndex: 1, | ||||
|     dataType: 'staticData', | ||||
|     api: '', | ||||
|     apiData: [], | ||||
|     staticData: [{name: '阿斯达', v1: 23}, {name: '水电费', v1: 12}, {name: '凡哥', v1: 67}, {name: '党费', v1: 98}], | ||||
|     config: 'barChart3', | ||||
|     dynamicData: [] | ||||
|   }, { | ||||
|     code: 'widget-linechart', | ||||
|     type: 'barChart5', | ||||
|     label: '柱状图4', | ||||
|     title: '柱状图4', | ||||
|     icon: 'icontext_box', | ||||
|     value: '', | ||||
|     width: 500, | ||||
|     sourceDataId: '', | ||||
|     height: 300, | ||||
|     dataX: '', | ||||
|     dataY: [], | ||||
|     zIndex: 1, | ||||
|     thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar5.png', | ||||
|     top: 0, | ||||
|     left: 0, | ||||
|     border: 'border6', | ||||
|     api: '', | ||||
|     apiData: [], | ||||
|     dataType: 'staticData', | ||||
|     staticData: [{name: '阿斯达', v1: 23}, {name: '水电费', v1: 12}, {name: '凡哥', v1: 67}, {name: '党费', v1: 98}], | ||||
|     config: 'barChart5', | ||||
|     dynamicData: [] | ||||
|   }, { | ||||
|     code: 'widget-linechart', | ||||
|     type: 'barChart7', | ||||
|     label: '柱状图5', | ||||
|     title: '柱状图5', | ||||
|     icon: 'icontext_box', | ||||
|     value: '', | ||||
|     width: 500, | ||||
|     sourceDataId: '', | ||||
|     height: 300, | ||||
|     thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar7.png', | ||||
|     dataX: '', | ||||
|     zIndex: 1, | ||||
|     dataY: [], | ||||
|     top: 0, | ||||
|     left: 0, | ||||
|     api: '', | ||||
|     apiData: [], | ||||
|     dataType: 'staticData', | ||||
|     staticData: [{name: '阿斯达', v1: 23}, {name: '水电费', v1: 12}, {name: '凡哥', v1: 67}, {name: '党费', v1: 98}], | ||||
|     config: 'barChart7', | ||||
|     dynamicData: [] | ||||
|   }, { | ||||
|     code: 'widget-linechart', | ||||
|     type: 'barChart8', | ||||
|     label: '柱状图6', | ||||
|     title: '柱状图6', | ||||
|     icon: 'icontext_box', | ||||
|     value: '', | ||||
|     width: 500, | ||||
|     sourceDataId: '', | ||||
|     border: 'border6', | ||||
|     height: 300, | ||||
|     thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar8.png', | ||||
|     dataX: '', | ||||
|     dataY: [], | ||||
|     zIndex: 1, | ||||
|     top: 0, | ||||
|     left: 0, | ||||
|     api: '', | ||||
|     apiData: [], | ||||
|     dataType: 'staticData', | ||||
|     staticData: [{name: '阿斯达', v1: 23}, {name: '水电费', v1: 12}, {name: '凡哥', v1: 67}, {name: '党费', v1: 98}], | ||||
|     config: 'barChart8', | ||||
|     dynamicData: [] | ||||
|   }, { | ||||
|     code: 'widget-linechart', | ||||
|     type: 'barChart9', | ||||
|     label: '柱状图7', | ||||
|     title: '柱状图7', | ||||
|     border: 'border6', | ||||
|     icon: 'icontext_box', | ||||
|     value: '', | ||||
|     width: 500, | ||||
|     thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar9.png', | ||||
|     sourceDataId: '', | ||||
|     height: 300, | ||||
|     dataX: '', | ||||
|     dataY: [], | ||||
|     zIndex: 1, | ||||
|     top: 0, | ||||
|     left: 0, | ||||
|     api: '', | ||||
|     apiData: [], | ||||
|     dataType: 'staticData', | ||||
|     staticData: [{name: '阿斯达', v1: 23}, {name: '水电费', v1: 12}, {name: '凡哥', v1: 67}, {name: '党费', v1: 98}], | ||||
|     config: 'barChart9', | ||||
|     dynamicData: [] | ||||
|   }, { | ||||
|     type: 'barChart10', | ||||
|     label: '柱状图8', | ||||
|     title: '柱状图8', | ||||
|     border: 'border13', | ||||
|     width: 500, | ||||
|     thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar10.png', | ||||
|     height: 300, | ||||
|     dataType: 'staticData', | ||||
|     staticData: [{name: '阿斯达', v1: 23}, {name: '水电费', v1: 12}], | ||||
|     config: 'barChart10' | ||||
|   }, | ||||
|   ] | ||||
| }, { | ||||
|   label: '折线图', type: 'line', list: [{ | ||||
|     code: 'widget-linechart', | ||||
|     type: 'lineChart1', | ||||
|     label: '折线图1', | ||||
|     title: '折线图1', | ||||
|     border: 'border6', | ||||
|     icon: 'icontext_box', | ||||
|     value: '', | ||||
|     width: 500, | ||||
|     height: 300, | ||||
|     top: 0, | ||||
|     left: 0, | ||||
|     zIndex: 1, | ||||
|     api: '', | ||||
|     apiData: [], | ||||
|     thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/line1.png', | ||||
|     dataX: '', | ||||
|     dataY: [], | ||||
|     dataType: 'staticData', | ||||
|     staticData: [{name: '阿斯达', v1: 23, v2: 33}, {name: '水电费', v1: 12, v2: 34}, { | ||||
|       name: '凡哥', | ||||
|       v1: 67, | ||||
|       v2: 25 | ||||
|     }, {name: '党费', v1: 98, v2: 85}], | ||||
|     config: 'lineChart1', | ||||
|     sourceDataId: '', | ||||
|     dynamicData: [] | ||||
|   }, { | ||||
|     code: 'widget-linechart', | ||||
|     type: 'lineChart2', | ||||
|     label: '折线图2', | ||||
|     title: '折线图2', | ||||
|     border: 'border6', | ||||
|     icon: 'icontext_box', | ||||
|     value: '', | ||||
|     width: 500, | ||||
|     thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/line2.png', | ||||
|     height: 300, | ||||
|     top: 0, | ||||
|     left: 0, | ||||
|     dataX: '', | ||||
|     dataY: [], | ||||
|     zIndex: 1, | ||||
|     api: '', | ||||
|     apiData: [], | ||||
|     dataType: 'staticData', | ||||
|     staticData: [{name: '阿斯达', v1: 23, v2: 33}, {name: '水电费', v1: 12, v2: 34}, { | ||||
|       name: '凡哥', | ||||
|       v1: 67, | ||||
|       v2: 25 | ||||
|     }, {name: '党费', v1: 98, v2: 85}], | ||||
|     config: 'lineChart2', | ||||
|     sourceDataId: '', | ||||
|     dynamicData: [] | ||||
|   }, { | ||||
|     code: 'widget-linechart', | ||||
|     type: 'lineChart3', | ||||
|     label: '折线图3', | ||||
|     title: '折线图3', | ||||
|     icon: 'icontext_box', | ||||
|     border: 'border6', | ||||
|     value: '', | ||||
|     width: 500, | ||||
|     height: 300, | ||||
|     zIndex: 1, | ||||
|     thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/line3.png', | ||||
|     top: 0, | ||||
|     left: 0, | ||||
|     dataX: '', | ||||
|     dataY: [], | ||||
|     api: '', | ||||
|     apiData: [], | ||||
|     dataType: 'staticData', | ||||
|     staticData: [{name: '阿斯达', v1: 23, v2: 33}, {name: '水电费', v1: 12, v2: 34}, { | ||||
|       name: '凡哥', | ||||
|       v1: 67, | ||||
|       v2: 25 | ||||
|     }, {name: '党费', v1: 98, v2: 85}], | ||||
|     config: 'lineChart3', | ||||
|     sourceDataId: '', | ||||
|     dynamicData: [] | ||||
|   }, { | ||||
|     code: 'widget-linechart', | ||||
|     type: 'lineChart4', | ||||
|     label: '折线图4', | ||||
|     title: '折线图4', | ||||
|     icon: 'icontext_box', | ||||
|     value: '', | ||||
|     border: 'border6', | ||||
|     width: 500, | ||||
|     height: 300, | ||||
|     zIndex: 1, | ||||
|     thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/line4.png', | ||||
|     top: 0, | ||||
|     left: 0, | ||||
|     dataX: '', | ||||
|     dataY: [], | ||||
|     api: '', | ||||
|     apiData: [], | ||||
|     dataType: 'staticData', | ||||
|     staticData: [{name: '阿斯达', v1: 23, v2: 33}, {name: '水电费', v1: 12, v2: 34}, { | ||||
|       name: '凡哥', | ||||
|       v1: 67, | ||||
|       v2: 25 | ||||
|     }, {name: '党费', v1: 98, v2: 85}], | ||||
|     config: 'lineChart4', | ||||
|     sourceDataId: '', | ||||
|     dynamicData: [] | ||||
|   }, { | ||||
|     code: 'widget-linechart', | ||||
|     type: 'lineChart5', | ||||
|     label: '折线图5', | ||||
|     title: '折线图5', | ||||
|     icon: 'icontext_box', | ||||
|     value: '', | ||||
|     border: 'border6', | ||||
|     width: 500, | ||||
|     height: 300, | ||||
|     zIndex: 1, | ||||
|     top: 0, | ||||
|     left: 0, | ||||
|     dataX: '', | ||||
|     thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/line5.png', | ||||
|     dataY: [], | ||||
|     api: '', | ||||
|     apiData: [], | ||||
|     dataType: 'staticData', | ||||
|     staticData: [{name: '阿斯达', v1: 23, v2: 33}, {name: '水电费', v1: 12, v2: 34}, { | ||||
|       name: '凡哥', | ||||
|       v1: 67, | ||||
|       v2: 25 | ||||
|     }, {name: '党费', v1: 98, v2: 85}], | ||||
|     config: 'lineChart5', | ||||
|     sourceDataId: '', | ||||
|     dynamicData: [] | ||||
|   }] | ||||
| }, | ||||
|   { | ||||
|     label: '饼图', type: 'pie', list: [{ | ||||
|       code: 'widget-linechart', | ||||
|       type: 'pieChart2', | ||||
|       config: 'pieChart2', | ||||
|       label: '饼图', | ||||
|       title: '饼图', | ||||
|       icon: 'icontext_box', | ||||
|       value: '', | ||||
|       border: 'border6', | ||||
|       width: 500, | ||||
|       height: 300, | ||||
|       zIndex: 1, | ||||
|       top: 0, | ||||
|       left: 0, | ||||
|       thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/pie.png', | ||||
|       dataX: '', | ||||
|       dataY: [], | ||||
|       api: '', | ||||
|       apiData: [], | ||||
|       dataType: 'staticData', | ||||
|       staticData: [{name: '阿斯达', v1: 23, v2: 33}, {name: '水电费', v1: 12, v2: 34}, { | ||||
|         name: '凡哥', | ||||
|         v1: 67, | ||||
|         v2: 25 | ||||
|       }, {name: '党费', v1: 98, v2: 85}], | ||||
|       sourceDataId: '', | ||||
|       dynamicData: [] | ||||
|     }, { | ||||
|       code: 'widget-linechart', | ||||
|       type: 'pieChart1', | ||||
|       label: '饼图', | ||||
|       title: '饼图', | ||||
|       icon: 'icontext_box', | ||||
|       value: '', | ||||
|       border: 'border6', | ||||
|       width: 500, | ||||
|       height: 300, | ||||
|       zIndex: 1, | ||||
|       top: 0, | ||||
|       left: 0, | ||||
|       thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/pie.png', | ||||
|       dataX: '', | ||||
|       dataY: [], | ||||
|       api: '', | ||||
|       apiData: [], | ||||
|       dataType: 'staticData', | ||||
|       staticData: [{name: '阿斯达', v1: 23, v2: 33}, {name: '水电费', v1: 12, v2: 34}, { | ||||
|         name: '凡哥', | ||||
|         v1: 67, | ||||
|         v2: 25 | ||||
|       }, {name: '党费', v1: 98, v2: 85}], | ||||
|       config: 'pieChart1', | ||||
|       sourceDataId: '', | ||||
|       dynamicData: [] | ||||
|     }, { | ||||
|       code: 'widget-linechart', | ||||
|       type: 'pieChart3', | ||||
|       label: '饼图', | ||||
|       title: '饼图', | ||||
|       icon: 'icontext_box', | ||||
|       value: '', | ||||
|       border: 'border6', | ||||
|       width: 500, | ||||
|       height: 300, | ||||
|       zIndex: 1, | ||||
|       top: 0, | ||||
|       left: 0, | ||||
|       thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/pie.png', | ||||
|       dataX: '', | ||||
|       dataY: [], | ||||
|       api: '', | ||||
|       apiData: [], | ||||
|       dataType: 'staticData', | ||||
|       staticData: [{name: '阿斯达', v1: 23, v2: 33}, {name: '水电费', v1: 12, v2: 34}, { | ||||
|         name: '凡哥', | ||||
|         v1: 67, | ||||
|         v2: 25 | ||||
|       }, {name: '党费', v1: 98, v2: 85}], | ||||
|       config: 'pieChart3', | ||||
|       sourceDataId: '', | ||||
|       dynamicData: [] | ||||
|     }, { | ||||
|       type: 'summary', | ||||
|       label: '进度饼图', | ||||
|       title: '进度饼图', | ||||
|       border: 'border15', | ||||
|       display: 'processPie', | ||||
|       width: 500, | ||||
|       height: 300, | ||||
|       zIndex: 1, | ||||
|       top: 0, | ||||
|       left: 0, | ||||
|       thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/processPieChart.png', | ||||
|       dataType: 'staticData', | ||||
|       staticData: {name: '综合调处率', label: "累计调解成功", v1: 23, totalLabel: "累计排查受理", total: 33}, | ||||
|     },] | ||||
|   }, { | ||||
|     label: '关系图', type: 'graph', list: [{ | ||||
|       type: "graphChart1", | ||||
|       label: "气泡图", title: "气泡图", border: 'border15', | ||||
|       width: 500, | ||||
|       height: 300, | ||||
|       top: 0, | ||||
|       left: 0, | ||||
|       dataType: 'staticData', | ||||
|       staticData: [], | ||||
|       thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/graphChart1.png', | ||||
|     }] | ||||
|   }] | ||||
| const maps = [{ | ||||
|   type: 'map', | ||||
|   label: '地图', | ||||
|   display: 'map', | ||||
|   width: 840, | ||||
|   height: 534, | ||||
|   left: 0, | ||||
|   top: 0, | ||||
|   mask: '2', | ||||
|   pulseLines: '1', | ||||
|   mapStyle: "e51987628aee5206d4c9ca8c6e98b4f7", | ||||
|   areaId: '', | ||||
|   zIndex: 1, | ||||
|   apiData: [], | ||||
|   dataType: 'staticData', | ||||
|   dynamicData: [], | ||||
|   staticData: [{ | ||||
|     label: '中卫慧通', lng: 117.1339399, lat: 36.7190487, | ||||
|   }], | ||||
|   api: '', | ||||
|   thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/map.png', | ||||
|   is3dAround: '0', | ||||
|   limitArea: '0', | ||||
|   layers: 'vector' | ||||
| }, { | ||||
|   type: 'AiDvMap', | ||||
|   label: 'echart地图', | ||||
|   display: 'map', | ||||
|   width: 840, | ||||
|   height: 534, | ||||
|   left: 0, | ||||
|   top: 0, | ||||
|   mask: '2', | ||||
|   pulseLines: '1', | ||||
|   mapStyle: "e51987628aee5206d4c9ca8c6e98b4f7", | ||||
|   areaId: '', | ||||
|   zIndex: 1, | ||||
|   apiData: [], | ||||
|   dataType: 'staticData', | ||||
|   dynamicData: [], | ||||
|   staticData: [{ | ||||
|     label: '中卫慧通', lng: 117.1339399, lat: 36.7190487, | ||||
|   }], | ||||
|   api: '', | ||||
|   thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/map.png', | ||||
|   is3dAround: '0', | ||||
|   limitArea: '0', | ||||
| }, {type: "linkageMap", label: "联动地图", width: 800, height: 964, top: 0, left: 560, thumb: "https://cdn.cunwuyun.cn/dvcp/dv/tpl/linkageMap.png", dataType: 'staticData'}] | ||||
| const customHtml = { | ||||
|   label: "HTML块", type: "html", list: [{ | ||||
|     type: 'html', | ||||
|     label: '自定义HTML', | ||||
|     title: '自定义HTML', | ||||
|     border: 'border0', | ||||
|     width: 500, | ||||
|     height: 300, | ||||
|     top: 0, | ||||
|     left: 0, | ||||
|     thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/pie.png', | ||||
|     html: `<div style="width: 100%;height: 100%;background: #fff;text-align: center;line-height: 300px;font-size: 20px;color: #000;">自定义HTML</div>` | ||||
|   }] | ||||
| } | ||||
| const tables = [{ | ||||
|   type: 'table', | ||||
|   label: '表格', | ||||
|   title: '表格', | ||||
|   border: 'border6', | ||||
|   width: 650, | ||||
|   height: 400, | ||||
|   zIndex: 1, | ||||
|   thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/table.png', | ||||
|   dataX: '', | ||||
|   dataY: [], | ||||
|   rowNum: 7, | ||||
|   isShowIndex: '1', | ||||
|   sourceDataId: '', | ||||
|   api: '', | ||||
|   apiData: [], | ||||
|   dataType: 'staticData', | ||||
|   dynamicData: [], | ||||
|   staticData: [{name: '列1', v: 23, v2: 3}, {name: '列2', v: 12, v2: 4}, {name: '列2', v: 12, v2: 4}] | ||||
| }, { | ||||
|   type: 'AiDvTable', | ||||
|   label: '新版表格', | ||||
|   title: '新版表格', | ||||
|   border: 'border6', | ||||
|   width: 650, | ||||
|   height: 400, | ||||
|   zIndex: 1, | ||||
|   thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/table.png', | ||||
|   dataX: '', | ||||
|   dataY: [], | ||||
|   rowNum: 7, | ||||
|   stripe: '1', | ||||
|   isShowIndex: '1', | ||||
|   sourceDataId: '', | ||||
|   api: '', | ||||
|   config: [{ | ||||
|     width: '', color: '', align: '' | ||||
|   }, { | ||||
|     width: '', color: '', align: '' | ||||
|   }, { | ||||
|     width: '', color: '', align: '' | ||||
|   }], | ||||
|   apiData: [], | ||||
|   dataType: 'staticData', | ||||
|   dynamicData: [], | ||||
|   staticData: [{name: '列1', v: 23, v2: 3}, {name: '列2', v: 12, v2: 4}, {name: '列2', v: 12, v2: 4}] | ||||
| }, { | ||||
|   type: 'AiRanking', | ||||
|   label: '排行榜', | ||||
|   title: '排行榜', | ||||
|   border: 'border6', | ||||
|   width: 523, | ||||
|   height: 400, | ||||
|   zIndex: 1, | ||||
|   thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/table.png', | ||||
|   dataX: '', | ||||
|   dataY: [], | ||||
|   rowNum: 7, | ||||
|   subType: 'Ranking1', | ||||
|   stripe: '1', | ||||
|   isShowIndex: '1', | ||||
|   sourceDataId: '', | ||||
|   api: '', | ||||
|   apiData: [], | ||||
|   dataType: 'staticData', | ||||
|   dynamicData: [], | ||||
|   staticData: [{name: '列1', value: 23}, {name: '列2', value: 12}, {name: '列2', value: 12}] | ||||
| }] | ||||
| const layouts = [ | ||||
|   { | ||||
|     type: 'display', | ||||
|     label: '装饰', | ||||
|     display: 'display0', | ||||
|     width: 840, | ||||
|     height: 540, | ||||
|     isZoom: false, | ||||
|     zIndex: 1, | ||||
|     title: '标题', | ||||
|     thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/display.png', | ||||
|     sourceDataId: '', | ||||
|     dataType: 'staticData', | ||||
|     staticData: [{ | ||||
|       label: '个人服务办理', value: 247 | ||||
|     }, { | ||||
|       label: '同比上月', value: 247 | ||||
|     }] | ||||
|   }, { | ||||
|     type: 'panel', | ||||
|     label: '边框', | ||||
|     title: '边框', | ||||
|     border: 'border0', | ||||
|     width: 400, | ||||
|     height: 400, | ||||
|     isZoom: false, | ||||
|     zIndex: 1, | ||||
|     thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/border.png' | ||||
|   }, { | ||||
|     type: 'summary', | ||||
|     label: '数据统计', | ||||
|     display: 'summary0', | ||||
|     width: 480, | ||||
|     height: 240, | ||||
|     zIndex: 1, | ||||
|     top: 0, | ||||
|     left: 0, | ||||
|     dataX: '', | ||||
|     dataY: [], | ||||
|     summaryTitle: '', | ||||
|     border: 'border3', | ||||
|     sourceDataId: '', | ||||
|     title: '数据统计', | ||||
|     dataType: 'staticData', | ||||
|     staticData: [{ | ||||
|       key: '个人服务办理', value: 247 | ||||
|     }, { | ||||
|       key: '同比上月', value: 247 | ||||
|     }], | ||||
|     dynamicData: [], | ||||
|     thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/total.png' | ||||
|   }, | ||||
| ] | ||||
| const others = [ | ||||
|   { | ||||
|     label: "图片", list: [ | ||||
|       { | ||||
|         label: "普通图片", | ||||
|         type: "img", | ||||
|         width: 500, | ||||
|         height: 400, | ||||
|         thumb: "https://cdn.cunwuyun.cn/dvcp/dv/img/display0-bg.png" | ||||
|       } | ||||
|     ] | ||||
|   }, | ||||
|   { | ||||
|     label: '党组织', type: 'partyOrg', list: [{ | ||||
|       type: 'partyOrg', | ||||
|       label: '党组织', | ||||
|       width: 840, | ||||
|       height: 800, | ||||
|       zIndex: 1, | ||||
|       top: 0, | ||||
|       left: 0, | ||||
|       dataX: '', | ||||
|       dataY: [], | ||||
|       title: '党组织', | ||||
|       border: 'border3', | ||||
|       sourceDataId: '', | ||||
|       dataType: 'staticData', | ||||
|       staticData: [{ | ||||
|         key: '个人服务办理', value: 247 | ||||
|       }, { | ||||
|         key: '同比上月', value: 247 | ||||
|       }], | ||||
|       dynamicData: [], | ||||
|       thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/total.png' | ||||
|     }] | ||||
|   }, { | ||||
|     label: '轮播图', list: [{ | ||||
|       type: 'swiper', | ||||
|       label: '轮播图', | ||||
|       width: 400, | ||||
|       height: 300, | ||||
|       zIndex: 1, | ||||
|       border: 'border2', | ||||
|       dataType: 'staticData', | ||||
|       staticData: [{ | ||||
|         img: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/pie.png', title: '湖羊', content: `歙县众城湖羊养殖专业合作社 | ||||
| 							徐晓红 - 18273645627 | ||||
| 							歙县郑村镇唐跃村碉墅` | ||||
|       }], | ||||
|       thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/swiper.png' | ||||
|     }, { | ||||
|       type: 'swiper', | ||||
|       label: '轮播图(点指示器)', | ||||
|       width: 800, | ||||
|       height: 358, | ||||
|       zIndex: 1, | ||||
|       border: 'border14', | ||||
|       dataType: 'staticData', | ||||
|       staticData: [{ | ||||
|         content: `歙县众城湖羊养殖专业合作社 | ||||
| 							徐晓红 - 18273645627 | ||||
| 							歙县郑村镇唐跃村碉墅` | ||||
|       }, { | ||||
|         content: `歙县众城湖羊养殖专业合作社 | ||||
| 							徐晓红 - 18273645627 | ||||
| 							歙县郑村镇唐跃村碉墅` | ||||
|       },], | ||||
|       thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/swiper.png', | ||||
|       dotIndicator: true | ||||
|     }] | ||||
|   }, { | ||||
|     label: '视频播放器', type: 'video', list: [{ | ||||
|       type: 'video', | ||||
|       label: '视频播放器', | ||||
|       width: 400, | ||||
|       height: 300, | ||||
|       zIndex: 1, | ||||
|       src: '', | ||||
|       border: 'border2', | ||||
|       thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/swiper.png' | ||||
|     }] | ||||
|   }, { | ||||
|     label: '视频监控', list: [ | ||||
|       { | ||||
|         type: 'monitor', | ||||
|         label: '视频监控', | ||||
|         src: '', | ||||
|         width: 480, | ||||
|         height: 240, | ||||
|         zIndex: 1, | ||||
|         top: 0, | ||||
|         left: 0, | ||||
|         title: '', | ||||
|         moniterId: '', | ||||
|         monitorType: 'cmcc', | ||||
|         api: '/app/appzyvideoequipment/list2', | ||||
|         border: 'border2', | ||||
|         sourceDataId: '', | ||||
|         dataType: 'staticData', | ||||
|         staticData: '', | ||||
|         dynamicData: '', | ||||
|         thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/video.png' | ||||
|       }, | ||||
|       { | ||||
|         type: "monitorCarousel", | ||||
|         label: "视频轮播", | ||||
|         width: 480, | ||||
|         height: 480, | ||||
|         zIndex: 1, | ||||
|         title: "视频轮播", | ||||
|         thumb: "https://cdn.cunwuyun.cn/dvcp/dv/tpl/video.png" | ||||
|       } | ||||
|     ] | ||||
|   }, customHtml] | ||||
| const components = [{ | ||||
|   label: '图表', list: [...chartTpl, { | ||||
|     label: "多维图", type: "plot", list: [{ | ||||
|       type: 'plot', | ||||
|       label: '多维图表', | ||||
|       title: '多维图表', | ||||
|       border: 'border0', | ||||
|       width: 500, | ||||
|       height: 300, | ||||
|       top: 0, | ||||
|       left: 0, | ||||
|       thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/pie.png', | ||||
|       charts: [{ | ||||
|         title: "饼状图统计", | ||||
|         chart: "pieChart2", | ||||
|         dataType: 'staticData', | ||||
|         data: [{name: '阿斯达', v1: 23, v2: 33}, {name: '水电费', v1: 12, v2: 34}, { | ||||
|           name: '凡哥', | ||||
|           v1: 67, | ||||
|           v2: 25 | ||||
|         }, {name: '党费', v1: 98, v2: 85}] | ||||
|       }], | ||||
|  | ||||
|     }] | ||||
|   }] | ||||
| }, | ||||
|   {label: '表格', list: tables}, | ||||
|   { | ||||
|     label: "样式", list: [...layouts, { | ||||
|       type: "tabs", label: "TAB页签", border: "border13", width: 480, | ||||
|       height: 240, thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/tabs.png', top: 0, left: 0, | ||||
|       dataType: 'staticData', staticData: {}, title: "TAB页签" | ||||
|     }] | ||||
|   }, | ||||
|   {label: '地图', list: maps}, { | ||||
|     type: 'ai3d', label: "3D", list: [{ | ||||
|       label: "3D楼栋", type: 'building', list: [{ | ||||
|         type: 'building1', | ||||
|         label: "楼栋模型1", | ||||
|         width: 840, | ||||
|         height: 800, | ||||
|         zIndex: 1, | ||||
|         title: "楼栋模型1", | ||||
|         thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/total.png' | ||||
|       }] | ||||
|     }] | ||||
|   }, { | ||||
|     label: "AI", list: [{ | ||||
|       type: "aiAssist", | ||||
|       label: "AI助手", | ||||
|       width: 134, | ||||
|       height: 140, | ||||
|       zIndex: 1, | ||||
|       title: "AI助手", | ||||
|       thumb: "https://cdn.cunwuyun.cn/dvcp/dv/aiIcon.png" | ||||
|     }] | ||||
|   }, { | ||||
|     label: '其他', list: others | ||||
|   }] | ||||
| export const layers = [...chartTpl.map(e => e.list), maps, tables, layouts, ...others.map(e => e.list)].flat() | ||||
| export {components} | ||||
|  | ||||
| /** | ||||
|  * 监控类型 | ||||
|  */ | ||||
| export const monitorTypes = [ | ||||
|   {dictName: "中国移动", dictValue: "cmcc"}, | ||||
|   {dictName: "海康威视", dictValue: "hik"}, | ||||
|   {dictName: "大华", dictValue: "dahua"}, | ||||
|   {dictName: "视联网", dictValue: "slw"}, | ||||
| ] | ||||
							
								
								
									
										58
									
								
								packages/bigscreen/designer/preview.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,58 @@ | ||||
| <template> | ||||
|   <section class="preview"> | ||||
|     <ai-dv-wrapper :views="[{label: '返回'}]" :theme="config.theme" @change="handleBack" v-if="screenId" :title="info.name" :background="bgImg" :titleSize="config.titleSize"> | ||||
|       <ai-dv-viewer :urlPrefix="urlPrefix" :instance="instance" :dict="dict" :id="screenId"/> | ||||
|     </ai-dv-wrapper> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import {mapActions} from "vuex" | ||||
|  | ||||
| export default { | ||||
|   name: "preview", | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|     permissions: Function, | ||||
|     urlPrefix: { | ||||
|       type: String, | ||||
|       default: '/app' | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     screenId: v => v.$route.query.id, | ||||
|     bgImg: v => v.config.theme == 1 ? 'https://cdn.cunwuyun.cn/dvcp/dv/img/dj_bg.png' : (v.config.backgroundImage?.[0]?.url || "") | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       info: {}, | ||||
|       config: {} | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     ...mapActions(['closePage']), | ||||
|     getDvData() { | ||||
|       let {id} = this.$route.query | ||||
|       this.instance.post(`/app/appdiylargescreen/queryLargeScreenDetailById?id=${id}`).then(res => { | ||||
|         if (res?.data) { | ||||
|           this.info = res.data | ||||
|           this.config = JSON.parse(res.data.config).dashboard | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     handleBack() { | ||||
|       this.$router.back() | ||||
|       this.closePage() | ||||
|     } | ||||
|   }, | ||||
|   created() { | ||||
|     this.getDvData() | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .preview { | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										1119
									
								
								packages/bigscreen/designer/viewport.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										133
									
								
								packages/bigscreen/dv/AppCentralTaskDV.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,133 @@ | ||||
| <template> | ||||
|   <section class="AppCentralTaskDV"> | ||||
|     <!--    <ai-dv-background :src="bgImage"/>--> | ||||
|     <div class="coreTask"> | ||||
|       <div class="leftBox"> | ||||
|         <div class="boxTitle">{{ coreTaskData.titleText }}</div> | ||||
|         <dv-scroll-board v-if="refresh" :config="coreTaskData"/> | ||||
|       </div> | ||||
|     </div> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import {scrollBoard} from '@jiaminghi/data-view' | ||||
| import bgImage from './assets/centralTask/bg.png' | ||||
| import Vue from "vue"; | ||||
|  | ||||
| Vue.use(scrollBoard) | ||||
| export default { | ||||
|   name: "AppCentralTaskDV", | ||||
|   label: "数据大屏-重点工作", | ||||
|   props: { | ||||
|     nav: {default: () => ({})} | ||||
|   }, | ||||
|   inject: { | ||||
|     dv: {default: ""} | ||||
|   }, | ||||
|   computed: { | ||||
|     coreTaskData() { | ||||
|       return { | ||||
|         headerHeight: 52, | ||||
|         header: ['基层组织建设', "社区治理", "便民服务效能", "城市管理"], | ||||
|         headerBGC: 'rgba(0, 113, 255, 0.5)', | ||||
|         oddRowBGC: "rgba(5, 65, 139, 0.5)", | ||||
|         evenRowBGC: "rgba(5, 65, 139, 0.5)", | ||||
|         waitTime: 6000, | ||||
|         align: ["center", "start", "center", "center"], | ||||
|         rowNum: 5, | ||||
|         ...this.nav.data, | ||||
|       } | ||||
|     }, | ||||
|   }, | ||||
|   data() { | ||||
|     return {bgImage, refresh: true} | ||||
|   }, | ||||
|   watch: { | ||||
|     nav: { | ||||
|       deep: true, | ||||
|       handler() { | ||||
|         this.refresh = false | ||||
|         this.$nextTick(() => this.refresh = true) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .AppCentralTaskDV { | ||||
|   height: 100%; | ||||
|   padding: 0 0 60px; | ||||
|   box-sizing: border-box; | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
|  | ||||
|   .coreTask { | ||||
|     flex: 1; | ||||
|     min-height: 0; | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     gap: 53px; | ||||
|     margin-top: 56px; | ||||
|  | ||||
|     .leftBox { | ||||
|       width: 100%; | ||||
|       height: 100%; | ||||
|       background-image: url("./assets/centralTask/box.png"); | ||||
|       background-size: 100% 100%; | ||||
|       background-repeat: no-repeat; | ||||
|       display: flex; | ||||
|       flex-direction: column; | ||||
|       align-items: center; | ||||
|       padding: 0 40px 42px; | ||||
|       box-sizing: border-box; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .boxTitle { | ||||
|     height: 68px; | ||||
|     width: 534px; | ||||
|     background-image: url("./assets/centralTask/titleBox.png"); | ||||
|     text-align: center; | ||||
|     font-size: 22px; | ||||
|     font-weight: 400; | ||||
|     color: #71F8FF; | ||||
|     transform: translateY(-32px); | ||||
|     line-height: 68px; | ||||
|   } | ||||
|  | ||||
|   :deep( .dv-scroll-board ){ | ||||
|     width: 100%; | ||||
|     flex: 1; | ||||
|     min-height: 0; | ||||
|     border-radius: 6px; | ||||
|     overflow: hidden; | ||||
|  | ||||
|     .header { | ||||
|       color: #9FDBFB; | ||||
|       font-size: 20px; | ||||
|  | ||||
|       .header-item { | ||||
|         text-align: center; | ||||
|         border: 1px solid #054596; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .row-item { | ||||
|       color: #68F0FC; | ||||
|       font-size: 18px; | ||||
|       overflow: hidden; | ||||
|  | ||||
|       .ceil { | ||||
|         border: 1px solid #054596; | ||||
|         border-top: none; | ||||
|         position: relative; | ||||
|         line-height: 30px; | ||||
|         white-space: normal; | ||||
|         padding: 20px; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										479
									
								
								packages/bigscreen/dv/AppGovInteractionDV.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,479 @@ | ||||
| <template> | ||||
|   <section class="AppGovInteractionDV"> | ||||
|     <el-row type="flex" justify="space-between" align="bottom"> | ||||
|       <div flex class="framePane column top"> | ||||
|         <div class="titlePane" v-text="'事件内容'"/> | ||||
|         <div class="fill"> | ||||
|           <dv-scroll-board :config="topLeftData"/> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="centerTopPane" id="centerTopPane"> | ||||
|         <b class="title gradientFont">事件统计</b> | ||||
|         <el-row type="flex" justify="space-between" align="middle" | ||||
|                 v-for="(row,i) in topCenterData" :key="i"> | ||||
|           <div class="dataPane" v-for="(op,j) in row" :key="j"> | ||||
|             <span class="gradientFont" v-text="op.label"/> | ||||
|             <dv-digital-flop class="gradientFont" :config="op.v1"/> | ||||
|           </div> | ||||
|         </el-row> | ||||
|       </div> | ||||
|       <div flex class="framePane column top"> | ||||
|         <div class="titlePane" v-text="'政务微信群'"/> | ||||
|         <div class="totalPane" flex> | ||||
|           <div class="dataPanel fill" flex v-for="(op,i) in rightTopData.total" :key="i"> | ||||
|             <span v-text="op.label"/> | ||||
|             <b v-text="op.v1"/> | ||||
|           </div> | ||||
|         </div> | ||||
|         <div class="fill"> | ||||
|           <ai-echart class="chart" :data="rightTopData.list" :ops="rightTopData.ops"/> | ||||
|         </div> | ||||
|       </div> | ||||
|     </el-row> | ||||
|     <div flex class="gap fill"> | ||||
|       <div flex class="framePane fill column" v-for="c in charts" :key="c.id"> | ||||
|         <div class="titlePane" v-text="c.label"/> | ||||
|         <div class="fill"> | ||||
|           <ai-echart class="chart" :data="chartData[c.id]" :ops="c.ops"/> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import {digitalFlop, scrollBoard} from '@jiaminghi/data-view' | ||||
| import Vue from "vue"; | ||||
|  | ||||
| Vue.use(digitalFlop) | ||||
| Vue.use(scrollBoard) | ||||
|  | ||||
| export default { | ||||
|   name: "AppGovInteractionDV", | ||||
|   label: "数据大屏-政民互动", | ||||
|   props: { | ||||
|     instance: Function | ||||
|   }, | ||||
|   computed: { | ||||
|     topCenterData() { | ||||
|       let meta = [ | ||||
|         [{label: "待受理", name: 'pending'}, {label: "累计上报", name: 'total_case'}], | ||||
|         [{label: "办理中", name: 'processing'}, {label: "累计受理", name: 'total_accepted'}], | ||||
|         [{label: "今日上报", name: "added_today"}, {label: "累计办结", name: 'total_solved'}], | ||||
|         [{label: "今日办结", name: 'solved_today'}, {label: "累计办结率", name: 'total_solved_percent'}], | ||||
|       ] | ||||
|       return meta.map(e => e.map(s => { | ||||
|         let v1 = { | ||||
|           number: [this.meta.residentCategoryReport?.[s.name] || 0], | ||||
|           style: { | ||||
|             fontFamily: 'dineng', | ||||
|             fontWeight: 'bold', | ||||
|             fontSize: 40, | ||||
|             gradientType: 'linear', | ||||
|             gradientColor: ['#fff', '#fff', '#6BC7FF'], | ||||
|             gradientParams: [0, 0, 0, 40], | ||||
|             gradientWith: 'fill', | ||||
|             gradientStops: [0, .18, 1] | ||||
|           } | ||||
|         } | ||||
|         if (s.name == 'total_solved_percent') { | ||||
|           v1 = { | ||||
|             ...v1, | ||||
|             number: [v1.number * 100], content: '{nt}%' | ||||
|           } | ||||
|         } | ||||
|         return {...s, v1} | ||||
|       })) | ||||
|     }, | ||||
|     topLeftData() { | ||||
|       let statusColor = { | ||||
|             0: 'doing', | ||||
|             1: 'done', | ||||
|             2: 'pending', | ||||
|           }, | ||||
|           statusLabel = { | ||||
|             0: '处理中', | ||||
|             1: '已处理' | ||||
|           }, | ||||
|           list = this.meta.residentOrderList?.map(e => { | ||||
|             let status = e.process_list.slice(-1)?.[0]?.status | ||||
|             return { | ||||
|               ...e, status, statusLabel: statusLabel[status] | ||||
|             } | ||||
|           }) | ||||
|       return { | ||||
|         oddRowBGC: 'transparent', | ||||
|         evenRowBGC: 'transparent', | ||||
|         rowNum: 10, | ||||
|         data: list?.map(e => [` | ||||
|           <div flex class="eventItem"> | ||||
|             <span class="tag ${statusColor[e.status]}">${e.statusLabel}</span> | ||||
|             <div class="fill">${e.desc}</div> | ||||
|           </div>`]) || [] | ||||
|       } | ||||
|     }, | ||||
|     rightTopData() { | ||||
|       let obj = this.meta.groupMap?.list || {}, | ||||
|           list = Object.keys(obj).map(e => { | ||||
|             let {total, increase, decrease} = obj?.[e], | ||||
|                 time = this.$moment(e).format('MM-DD') | ||||
|             return {time, total, increase, decrease} | ||||
|           }) | ||||
|       return { | ||||
|         total: [ | ||||
|           {label: '群聊总数', v1: this.meta.groupMap?.groupSum || 0}, | ||||
|           {label: '群成员数', v1: this.meta.groupMap?.today?.total || 0}, | ||||
|         ], | ||||
|         ops: { | ||||
|           color: ['rgba(54, 165, 255, 0.2)', 'rgba(28, 212, 68, 0.2)', 'rgba(255, 215, 109, 0.2)'], | ||||
|           legend: { | ||||
|             itemWidth: 16, | ||||
|             itemHeight: 16, | ||||
|             textStyle: {color: '#82C5FF', padding: [0, 0, 0, 8], fontSize: 14}, | ||||
|             icon: 'rect', | ||||
|             itemGap: 40 | ||||
|           }, | ||||
|           tooltip: {}, | ||||
|           xAxis: { | ||||
|             type: 'category', axisTick: false, | ||||
|             nameGap: 20, | ||||
|             axisLabel: {color: '#fff'}, | ||||
|             axisLine: {lineStyle: {color: '#263763'}} | ||||
|           }, | ||||
|           // 声明一个 Y 轴,数值轴。 | ||||
|           yAxis: { | ||||
|             nameGap: 30, minInterval: 1, | ||||
|             splitLine: {lineStyle: {color: '#263763'}}, | ||||
|             axisLabel: {color: 'rgba(255,255,255,.8)'} | ||||
|           }, | ||||
|           series: [ | ||||
|             { | ||||
|               type: 'line', name: "群成员数", symbol: 'none', lineStyle: {color: '#36A5FF', borderWidth: 1}, | ||||
|               itemStyle: {borderColor: '#36A5FF', borderWidth: 1}, | ||||
|             }, | ||||
|             { | ||||
|               type: 'line', name: "新增人数", symbol: 'none', lineStyle: {color: '#1CD444', borderWidth: 1}, | ||||
|               itemStyle: {borderColor: '#1CD444', borderWidth: 1}, | ||||
|             }, | ||||
|             { | ||||
|               type: 'line', name: "退群人数", symbol: 'none', lineStyle: {color: '#FFD76D', borderWidth: 1}, | ||||
|               itemStyle: {borderColor: '#FFD76D', borderWidth: 1}, | ||||
|             } | ||||
|           ], | ||||
|           grid: {left: 60, bottom: 58, right: 20} | ||||
|         }, | ||||
|         list | ||||
|       } | ||||
|     }, | ||||
|     chartData() { | ||||
|       return { | ||||
|         EventType: this.meta.residentCategoryReportList?.map(e => { | ||||
|           let {category_name: name, total_case, total_solved} = e | ||||
|           return {name, total_case, total_solved} | ||||
|         }) || [], | ||||
|         EventSource: this.meta.unitReportList?.map(e => { | ||||
|           let {grid_name: name, total_case, total_solved} = e | ||||
|           return {name, total_case, total_solved} | ||||
|         }) || [] | ||||
|       } | ||||
|     }, | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       charts: [ | ||||
|         { | ||||
|           label: "事件类型", id: "EventType", ops: { | ||||
|             color: ['rgba(54, 165, 255, 0.2)', 'rgba(28, 212, 68, 0.2)'], | ||||
|             legend: { | ||||
|               itemWidth: 16, | ||||
|               itemHeight: 16, | ||||
|               textStyle: {color: '#82C5FF', padding: [0, 0, 0, 8], fontSize: 14}, | ||||
|               icon: 'rect', | ||||
|               itemGap: 40 | ||||
|             }, | ||||
|             tooltip: {}, | ||||
|             xAxis: { | ||||
|               type: 'category', nameGap: 20, axisTick: false, | ||||
|               axisLabel: {color: '#fff'}, | ||||
|               axisLine: {lineStyle: {color: '#263763'}} | ||||
|             }, | ||||
|             // 声明一个 Y 轴,数值轴。 | ||||
|             yAxis: { | ||||
|               nameGap: 23, minInterval: 1, | ||||
|               splitLine: {lineStyle: {color: '#263763'}}, | ||||
|               axisLabel: {color: 'rgba(255,255,255,.8)'} | ||||
|             }, | ||||
|             series: [ | ||||
|               { | ||||
|                 type: 'bar', | ||||
|                 name: "累计受理", | ||||
|                 barWidth: 10, | ||||
|                 barGap: '20%', | ||||
|                 itemStyle: {borderColor: '#36A5FF', borderWidth: 1} | ||||
|               }, | ||||
|               { | ||||
|                 type: 'bar', | ||||
|                 name: "累计办结", | ||||
|                 barWidth: 10, | ||||
|                 barGap: '20%', | ||||
|                 itemStyle: {borderColor: '#1CD444', borderWidth: 1} | ||||
|               } | ||||
|             ], | ||||
|             grid: {left: 40, bottom: 58, right: 20} | ||||
|           } | ||||
|         }, | ||||
|         { | ||||
|           label: "上报来源", id: "EventSource", ops: { | ||||
|             color: ['rgba(54, 165, 255, 0.2)', 'rgba(28, 212, 68, 0.2)'], | ||||
|             legend: { | ||||
|               itemWidth: 16, | ||||
|               itemHeight: 16, | ||||
|               textStyle: {color: '#82C5FF', padding: [0, 0, 0, 8], fontSize: 14}, | ||||
|               icon: 'rect', | ||||
|               itemGap: 40 | ||||
|             }, | ||||
|             tooltip: {}, | ||||
|             xAxis: { | ||||
|               type: 'category', axisTick: false, | ||||
|               nameGap: 20, | ||||
|               axisLabel: {color: '#fff'}, | ||||
|               axisLine: {lineStyle: {color: '#263763'}} | ||||
|             }, | ||||
|             // 声明一个 Y 轴,数值轴。 | ||||
|             yAxis: { | ||||
|               nameGap: 30, minInterval: 1, | ||||
|               splitLine: {lineStyle: {color: '#263763'}}, | ||||
|               axisLabel: {color: 'rgba(255,255,255,.8)'} | ||||
|             }, | ||||
|             series: [ | ||||
|               { | ||||
|                 type: 'line', name: "事件数", symbol: 'none', lineStyle: {color: '#36A5FF', borderWidth: 1}, | ||||
|                 itemStyle: {borderColor: '#36A5FF', borderWidth: 1, show: false}, | ||||
|                 areaStyle: { | ||||
|                   color: { | ||||
|                     type: 'linear', x2: 0, y2: 1, colorStops: [ | ||||
|                       {offset: 0, color: 'rgba(37, 161, 255, 0.5)'}, {offset: 1, color: 'rgba(37, 161, 255, 0)'}] | ||||
|                   } | ||||
|                 } | ||||
|               }, | ||||
|               { | ||||
|                 type: 'line', name: "办理数", symbol: 'none', lineStyle: {color: '#1CD444', borderWidth: 1}, | ||||
|                 itemStyle: {borderColor: '#1CD444', borderWidth: 1, show: false}, | ||||
|                 areaStyle: { | ||||
|                   color: { | ||||
|                     type: 'linear', x2: 0, y2: 1, colorStops: [ | ||||
|                       {offset: 0, color: 'rgba(37, 206, 55, 0.5)'}, {offset: 1, color: 'rgba(37, 206, 55, 0)'}] | ||||
|                   } | ||||
|                 } | ||||
|               } | ||||
|             ], | ||||
|             grid: {left: 40, bottom: 58, right: 20} | ||||
|           } | ||||
|         }, | ||||
|       ], | ||||
|       meta: {}, | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     getData() { | ||||
|       this.instance.post("/app/statistics/governmentPeople/queryResidentReport").then(res => { | ||||
|         if (res?.data) this.meta = res.data | ||||
|       }) | ||||
|     }, | ||||
|   }, | ||||
|   created() { | ||||
|     this.getData() | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .AppGovInteractionDV { | ||||
|   height: 100%; | ||||
|   padding: 6px 0 10px; | ||||
|   gap: 20px; | ||||
|   font-size: 16px; | ||||
|   color: #82C5FF; | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
|  | ||||
|  | ||||
|   :deep( .eventItem ){ | ||||
|     width: 100%; | ||||
|     color: #82C5FF; | ||||
|  | ||||
|     & > .fill { | ||||
|       white-space: nowrap; | ||||
|       overflow: hidden; | ||||
|       text-overflow: ellipsis; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep( .communityEvent ){ | ||||
|     list-style-type: circle; | ||||
|     white-space: nowrap; | ||||
|     overflow: hidden; | ||||
|     text-overflow: ellipsis; | ||||
|     height: 40px; | ||||
|     line-height: 40px; | ||||
|     padding-left: 1px; | ||||
|     color: #82C5FF; | ||||
|   } | ||||
|  | ||||
|   :deep( .tag ){ | ||||
|     padding: 0 10px; | ||||
|     border-radius: 4px; | ||||
|     margin-right: 10px; | ||||
|     font-size: 14px; | ||||
|     line-height: 28px; | ||||
|     color: #fff; | ||||
|     box-sizing: border-box; | ||||
|  | ||||
|     &.doing { | ||||
|       background-image: radial-gradient(rgba(#1B1BD6, .4), #208FFF); | ||||
|     } | ||||
|  | ||||
|     &.pending { | ||||
|       background-image: radial-gradient(rgba(#FF9333, .4), #FFE959); | ||||
|     } | ||||
|  | ||||
|     &.done { | ||||
|       background-image: radial-gradient(rgba(#1BD622, .4), #2CFF7C); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .centerTopPane { | ||||
|     background-image: url("./assets/govInteraction/globe_map.png"); | ||||
|     background-repeat: no-repeat; | ||||
|     background-size: 100% 100%; | ||||
|     height: 540px; | ||||
|     width: 940px; | ||||
|     flex-shrink: 0; | ||||
|     position: relative; | ||||
|     padding: 30px 50px 50px; | ||||
|     box-sizing: border-box; | ||||
|  | ||||
|     .title { | ||||
|       font-size: 60px; | ||||
|       position: absolute; | ||||
|       left: 50%; | ||||
|       top: 50%; | ||||
|       transform: translate(-50%, -50%); | ||||
|     } | ||||
|  | ||||
|     :deep( .gradientFont ){ | ||||
|       background-image: linear-gradient(180deg, #FFFFFF 0%, #FFFFFF 18%, #6BC7FF 100%); | ||||
|       -webkit-background-clip: text; | ||||
|       -webkit-text-fill-color: transparent; | ||||
|     } | ||||
|  | ||||
|     .el-row { | ||||
|       &:first-of-type, &:last-of-type { | ||||
|         margin: 0 110px; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     :deep( .dataPane ){ | ||||
|       width: 122px; | ||||
|       height: 114px; | ||||
|       background-image: url("./assets/govInteraction/kuaikuai.png"); | ||||
|       background-repeat: no-repeat; | ||||
|       background-size: 100% 80px; | ||||
|       background-position: bottom center; | ||||
|       display: flex; | ||||
|       flex-direction: column; | ||||
|       align-items: center; | ||||
|       font-weight: bold; | ||||
|  | ||||
|       & > b { | ||||
|         font-size: 50px; | ||||
|         line-height: 50px; | ||||
|  | ||||
|         span { | ||||
|           font-weight: normal; | ||||
|           font-size: 32px; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       & > span { | ||||
|         font-size: 18px; | ||||
|         line-height: 18px; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .framePane { | ||||
|     width: 100%; | ||||
|     height: 100%; | ||||
|     background: rgba(7, 11, 35, 0.4); | ||||
|     border: 1px solid #14345F; | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|  | ||||
|     &.top { | ||||
|       width: 440px; | ||||
|       height: 520px; | ||||
|     } | ||||
|  | ||||
|     & > .fill { | ||||
|       width: 100%; | ||||
|       height: 100%; | ||||
|       padding: 20px; | ||||
|       box-sizing: border-box; | ||||
|       overflow-y: auto; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .titlePane { | ||||
|     width: 100%; | ||||
|     background-image: url("./assets/govInteraction/title.png"); | ||||
|     background-repeat: no-repeat; | ||||
|     background-size: 309px 100%; | ||||
|     height: 60px; | ||||
|     padding-left: 30px; | ||||
|     color: #fff; | ||||
|     font-weight: bold; | ||||
|     font-size: 20px; | ||||
|     line-height: 48px; | ||||
|   } | ||||
|  | ||||
|   .chart { | ||||
|     width: 100%; | ||||
|   } | ||||
|  | ||||
|   .el-image { | ||||
|     width: 100%; | ||||
|     height: 100%; | ||||
|   } | ||||
|  | ||||
|   .totalPane { | ||||
|     width: 100%; | ||||
|  | ||||
|     .dataPanel { | ||||
|       height: 60px; | ||||
|       background: linear-gradient(270deg, rgba(119, 169, 255, 0.1) 0%, rgba(66, 112, 255, 0.25) 100%); | ||||
|       border-radius: 4px; | ||||
|       padding: 0 10px; | ||||
|       font-size: 16px; | ||||
|       justify-content: space-between; | ||||
|       margin-left: 20px; | ||||
|  | ||||
|       & > span { | ||||
|         white-space: nowrap; | ||||
|       } | ||||
|  | ||||
|       & > b { | ||||
|         font-size: 24px; | ||||
|         color: #fff; | ||||
|         font-family: Arial-BoldMT, Arial, serif; | ||||
|       } | ||||
|  | ||||
|       &:last-of-type { | ||||
|         margin-right: 20px; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|  | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										848
									
								
								packages/bigscreen/dv/AppGridDV.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,848 @@ | ||||
| <template> | ||||
|   <div class="griddv"> | ||||
|     <div class="left"> | ||||
|       <div class="griddv-title"> | ||||
|         <h2>网格列表</h2> | ||||
|       </div> | ||||
|       <div class="griddv-tree"> | ||||
|         <el-tree | ||||
|             :data="treeList" | ||||
|             :props="defaultProps" | ||||
|             @node-click="handleNodeClick" | ||||
|             node-key="id" | ||||
|             ref="tree" | ||||
|             default-expand-all | ||||
|             :expand-on-click-node="false" | ||||
|             highlight-current> | ||||
|         </el-tree> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div class="middle" :class="[girdLevel == '2' ? 'middle-active' : '']" ref="container" v-loading="isLoading" | ||||
|          element-loading-background="rgba(0, 0, 0, 0.5)"> | ||||
|       <div | ||||
|           ref="middleTree" | ||||
|           id="tree" | ||||
|           class="tree" | ||||
|           :style="{left: x, top: y, transform: `scale(${scale}) translate(-50%, -50%) `, 'transform-origin': `${0} ${0}`}"> | ||||
|         <ai-okr-tree ref="VueOkrTree" v-if="chartData.length" | ||||
|                      :data="chartData" | ||||
|                      node-key="id" | ||||
|                      show-collapsable | ||||
|                      aniamte | ||||
|                      animate-name="okr-fade-in-linear" | ||||
|                      :render-content="renderContent" | ||||
|                      default-expand-all/> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div class="right"> | ||||
|       <div class="right-top"> | ||||
|         <div class="griddv-title"> | ||||
|           <h2>网格内人员情况</h2> | ||||
|         </div> | ||||
|         <div class="right-chart"> | ||||
|           <ai-echart | ||||
|               style="height: 100%; width: 100%;" | ||||
|               :data="userInfo" | ||||
|               :ops="barChart1"> | ||||
|           </ai-echart> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="right-bottom"> | ||||
|         <div class="griddv-title"> | ||||
|           <h2>事件上报情况</h2> | ||||
|         </div> | ||||
|         <div class="right-chart"> | ||||
|           <ai-echart | ||||
|               style="height: 100%; width: 100%;" | ||||
|               :data="eventInfo" | ||||
|               :ops="pieChart2"> | ||||
|           </ai-echart> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|     <el-dialog :visible.sync="isShowInfo" width="640px" :close-on-click-modal="false" :modal-append-to-body="false"> | ||||
|       <template slot="title"> | ||||
|         <h2>家庭信息</h2> | ||||
|         <img src="./assets/grid/close.png" @click="isShowInfo = false"> | ||||
|       </template> | ||||
|       <div class="grid-info"> | ||||
|         <div class="grid-info__title"> | ||||
|           <h2>家庭地址</h2> | ||||
|           <span>{{ residentInfo.currentAreaName }}</span> | ||||
|         </div> | ||||
|         <ai-table | ||||
|             style="width: 558px" | ||||
|             :tableData="tableData" | ||||
|             :col-configs="colConfigs" | ||||
|             :total="total" | ||||
|             :isShowPagination="false" | ||||
|             :current.sync="search.current" | ||||
|             :size.sync="search.size" | ||||
|             @getList="() => {}"> | ||||
|         </ai-table> | ||||
|       </div> | ||||
|     </el-dialog> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import {barChart1, pieChart2} from "./components/chartOps" | ||||
|  | ||||
| export default { | ||||
|   name: 'AppGridDV', | ||||
|   label: '网格数据大屏', | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|   }, | ||||
|  | ||||
|   data() { | ||||
|     return { | ||||
|       isLoading: false, | ||||
|       treeList: [], | ||||
|       search: { | ||||
|         size: 100, | ||||
|         current: 1 | ||||
|       }, | ||||
|       barChart1, | ||||
|       userInfo: [], | ||||
|       eventInfo: [], | ||||
|       pieChart2, | ||||
|       total: 0, | ||||
|       isShowInfo: false, | ||||
|       defaultProps: { | ||||
|         children: 'girdList', | ||||
|         label: 'girdName', | ||||
|       }, | ||||
|       colConfigs: [ | ||||
|         {prop: 'name', label: '姓名', align: 'center', width: 120}, | ||||
|         { | ||||
|           prop: 'householdRelation', | ||||
|           label: '与户主关系', | ||||
|           align: 'center', | ||||
|           render: (h, {row}) => { | ||||
|             return h('span', { | ||||
|               style: { | ||||
|                 color: row.householdName === '1' ? '#1DE94D' : '#A8D7F3' | ||||
|               } | ||||
|             }, row.householdName === '1' ? '户主' : (this.dict.getLabel('householdRelation', row.householdRelation) || '-')) | ||||
|           }, | ||||
|           format: v => this.dict.getLabel('householdRelation', v) | ||||
|         }, | ||||
|         { | ||||
|           prop: 'idNumber', | ||||
|           label: '身份证号', | ||||
|           align: 'center', | ||||
|           width: 220, | ||||
|           format: v => v ? v.replace(/^(\d{10})\d{4}(.{4}$)/g, `$1${Array(5).join('*')}$2`) : '-' | ||||
|         }, | ||||
|         {prop: 'phone', label: '联系方式', align: 'center'} | ||||
|       ], | ||||
|       girdId: '', | ||||
|       residentInfo: {}, | ||||
|       tableData: [], | ||||
|       chartData: [], | ||||
|       girdLevel: '0', | ||||
|       scale: 1, | ||||
|       x: '50%', | ||||
|       y: '50%', | ||||
|       offsetX: 0, | ||||
|       offsetY: 0, | ||||
|       defaultUrl: 'https://cdn.cunwuyun.cn/dvcp/dv/avatar.png' | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   created() { | ||||
|     this.dict.load('householdRelation') | ||||
|     this.getTreeList() | ||||
|     this.getGirdInfo() | ||||
|   }, | ||||
|  | ||||
|   mounted() { | ||||
|     this.bindEvent() | ||||
|   }, | ||||
|  | ||||
|   destroyed() { | ||||
|     document.querySelector('body').removeEventListener('mousewheel', this.onMousewheel) | ||||
|     document.querySelector('body').removeEventListener('mouseup', this.onMouseUp) | ||||
|     document.querySelector('body').removeEventListener('mousedown', this.onMousedown) | ||||
|     document.querySelector('body').removeEventListener('mousemove', this.onMouseMove) | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     bindEvent() { | ||||
|       document.querySelector('body').addEventListener('mousewheel', this.onMousewheel, true) | ||||
|  | ||||
|       document.querySelector('body').addEventListener('mouseup', this.onMouseUp, true) | ||||
|       document.querySelector('body').addEventListener('mousedown', this.onMousedown, true) | ||||
|       document.querySelector('body').addEventListener('mousemove', this.onMouseMove, true) | ||||
|     }, | ||||
|  | ||||
|     onMousewheel(event) { | ||||
|       if (!event) return false | ||||
|       const elClass = event.target.className | ||||
|       if (elClass === 'tree' || elClass === 'middle' || (elClass && (elClass.indexOf('chart') > -1 || elClass.indexOf('user') > -1))) { | ||||
|         var dir = event.deltaY > 0 ? 'Up' : 'Down' | ||||
|         if (dir === 'Up') { | ||||
|           this.scale = this.scale - 0.2 <= 0.1 ? 0.1 : this.scale - 0.2 | ||||
|         } else { | ||||
|           this.scale = this.scale + 0.2 | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       return false | ||||
|     }, | ||||
|  | ||||
|     onMousedown(e) { | ||||
|       const elClass = e.target.className | ||||
|       if ((elClass && (elClass.indexOf('chart') > -1 || elClass.indexOf('user') > -1))) { | ||||
|         const left = document.querySelector('#tree').offsetLeft | ||||
|         const top = document.querySelector('#tree').offsetTop | ||||
|         this.isMove = true | ||||
|         this.offsetX = e.clientX - left | ||||
|         this.offsetY = e.clientY - top | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     onMouseMove(e) { | ||||
|       if (!this.isMove) return | ||||
|  | ||||
|       this.x = (e.clientX - this.offsetX) + 'px' | ||||
|       this.y = (e.clientY - this.offsetY) + 'px' | ||||
|     }, | ||||
|  | ||||
|     onMouseUp() { | ||||
|       this.isMove = false | ||||
|     }, | ||||
|  | ||||
|     debounce(func, wait = 1000) { | ||||
|       let timeout | ||||
|       return function (event) { | ||||
|         clearTimeout(timeout) | ||||
|         timeout = setTimeout(() => { | ||||
|           func.call(this, event) | ||||
|         }, wait) | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     handleNodeClick(e) { | ||||
|       this.girdLevel = e.girdLevel | ||||
|       this.isLoading = true | ||||
|       this.getGirdInfo(e.id, e.girdLevel) | ||||
|       this.getStatisticsInfo(e.id) | ||||
|     }, | ||||
|  | ||||
|     getStatisticsInfo(id) { | ||||
|       this.instance.post(`/app/appgirdmemberinfo/girdMemberAndResidentStatistic?girdId=${id}`).then((res) => { | ||||
|         if (res.code == 0) { | ||||
|           this.userInfo = [ | ||||
|             { | ||||
|               'name': '网格长', | ||||
|               '人数': res.data['网格长'] || 0 | ||||
|             }, | ||||
|             { | ||||
|               'name': '网格员', | ||||
|               '人数': res.data['网格员'] || 0 | ||||
|             }, | ||||
|             { | ||||
|               'name': '责任家庭数', | ||||
|               '人数': res.data['责任家庭数'] || 0 | ||||
|             } | ||||
|           ] | ||||
|         } | ||||
|       }) | ||||
|  | ||||
|       this.instance.post(`/app/appclapeventinfo/clapEventStatistic?girdId=${id}`).then((res) => { | ||||
|         if (res.code == 0) { | ||||
|           this.eventInfo = Object.keys(res.data).map(v => { | ||||
|             return { | ||||
|               '事件类型': v, | ||||
|               v1: res.data[v] | ||||
|             } | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     renderContent(h, node) { | ||||
|       return h('div', { | ||||
|         class: 'userlist-container' | ||||
|       }, [h('div', { | ||||
|         class: `userlist ${node.data.label === '子节点' ? 'last-level' : ''} ${node.data.girdLevel > 1 ? 'userlist-wrapper' : ''} userlist-${node.data.girdLevel}` | ||||
|       }, node.data.userList.map(v => { | ||||
|         return h('div', { | ||||
|           class: `user-item user-item-${v.girdLevel}` | ||||
|         }, [h('img', { | ||||
|           class: 'user-img', | ||||
|           attrs: { | ||||
|             src: v.photo || this.defaultUrl | ||||
|           }, | ||||
|           on: { | ||||
|             dragstart: e => { | ||||
|               e.preventDefault() | ||||
|               e.stopPropagation() | ||||
|               return false | ||||
|             } | ||||
|           } | ||||
|         }), h('p', { | ||||
|           class: 'user-p', | ||||
|           attrs: { | ||||
|             title: v.label, | ||||
|             'data-id': v.id | ||||
|           }, | ||||
|           on: { | ||||
|             click: () => { | ||||
|               if (node.data.label === '子节点') { | ||||
|                 this.getResidentInfo(v.id) | ||||
|               } | ||||
|             } | ||||
|           } | ||||
|         }, v.label), h('span', { | ||||
|           class: 'user-span', | ||||
|           style: { | ||||
|             display: v.girdLevel === '2' ? 'block' : 'none', | ||||
|             fontSize: v.girdLevel === '2' ? '12px' : '' | ||||
|           } | ||||
|         }, v.checkType ? (v.checkType === '1' ? '网格员' : '网格长') : '-')]) | ||||
|       })), h('div', { | ||||
|         class: 'user-gridName', | ||||
|         style: { | ||||
|           display: node.data.label === '子节点' ? 'none' : 'block', | ||||
|           color: 'rgba(255, 255, 255, 0.8)', | ||||
|           fontSize: '12px', | ||||
|           margin: '4px 0' | ||||
|         } | ||||
|       }, node.data.label)]) | ||||
|     }, | ||||
|  | ||||
|     getResidentInfo(id) { | ||||
|       this.isLoading = true | ||||
|       this.instance.post(`/app/appresident/detail?id=${id}`).then((res) => { | ||||
|         if (res.code == 0) { | ||||
|           this.residentInfo.resident = res.data | ||||
|           this.tableData = res.data.family || [] | ||||
|           this.isShowInfo = true | ||||
|         } | ||||
|  | ||||
|         this.isLoading = false | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     autoScale() { | ||||
|       const treeWidth = this.$refs.middleTree.offsetWidth | ||||
|       const containerWidth = this.$refs.container.offsetWidth | ||||
|       this.scale = treeWidth < containerWidth ? 1 : containerWidth / treeWidth | ||||
|       this.x = '50%' | ||||
|       this.y = '50%' | ||||
|     }, | ||||
|  | ||||
|     getGirdInfo(id) { | ||||
|       this.instance.post(`/app/appgirdinfo/listAllGirdAndMemberByTop?id=${id || ''}`).then((res) => { | ||||
|         if (res.code == 0) { | ||||
|           const chartData = this.formatList([res.data]) | ||||
|           this.chartData = chartData | ||||
|  | ||||
|           this.$nextTick(() => { | ||||
|             if (id) { | ||||
|               this.getUserList(id, chartData[0].id) | ||||
|             } else { | ||||
|               this.isLoading = false | ||||
|               this.autoScale() | ||||
|             } | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     getUserList(id, parentId) { | ||||
|       this.instance.post(`/app/appgirdmemberresident/listByGirdMember`, null, { | ||||
|         params: { | ||||
|           size: 1000, | ||||
|           girdId: id | ||||
|         } | ||||
|       }).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           const userList = res.data.records.map(v => { | ||||
|             return { | ||||
|               ...v, | ||||
|               isLast: true, | ||||
|               label: v.name | ||||
|             } | ||||
|           }) | ||||
|  | ||||
|           this.isLoading = false | ||||
|  | ||||
|           if (!userList.length) { | ||||
|             this.autoScale() | ||||
|             return false | ||||
|           } | ||||
|  | ||||
|           const node = this.$refs.VueOkrTree.getNode(parentId) | ||||
|           this.$refs.VueOkrTree.append({ | ||||
|             id: new Date().getTime(), | ||||
|             label: '子节点', | ||||
|             userList: userList || [] | ||||
|           }, node) | ||||
|           this.$nextTick(() => { | ||||
|             this.autoScale() | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     formatList(list) { | ||||
|       return list.map(item => { | ||||
|         let userList = [] | ||||
|         const girdMemberManageList = item.girdMemberManageList ? item.girdMemberManageList.map(v => { | ||||
|           return { | ||||
|             ...v, | ||||
|             label: v.name, | ||||
|             id: v.id, | ||||
|             checkType: '2', | ||||
|             girdName: item.girdName, | ||||
|             girdLevel: item.girdLevel, | ||||
|             isUser: true | ||||
|           } | ||||
|         }) : [] | ||||
|         const girdMemberList = item.girdMemberList ? item.girdMemberList.map(v => { | ||||
|           return { | ||||
|             ...v, | ||||
|             label: v.name, | ||||
|             id: v.id, | ||||
|             checkType: '1', | ||||
|             girdName: item.girdName, | ||||
|             girdLevel: item.girdLevel, | ||||
|             isUser: true | ||||
|           } | ||||
|         }) : [] | ||||
|  | ||||
|         if (this.girdLevel === '2' && item.girdLevel === '2' && girdMemberList.length) { | ||||
|           userList = girdMemberManageList | ||||
|           item.girdList = [{ | ||||
|             girdLevel: '2', | ||||
|             id: item.id, | ||||
|             isUser: false, | ||||
|             userList: girdMemberList, | ||||
|             label: item.girdName, | ||||
|             children: [] | ||||
|           }] | ||||
|         } else { | ||||
|           userList = [...girdMemberManageList, ...girdMemberList] | ||||
|         } | ||||
|         if (!userList.length) { | ||||
|           userList = [{ | ||||
|             label: '-', | ||||
|             id: item.id, | ||||
|             girdLevel: item.girdLevel, | ||||
|             girdName: item.girdName | ||||
|           }] | ||||
|         } | ||||
|  | ||||
|         const obj = { | ||||
|           label: item.girdName, | ||||
|           id: `${new Date().getTime()}-${item.id}`, | ||||
|           girdLevel: item.girdLevel, | ||||
|           isUser: false, | ||||
|           userList: userList, | ||||
|           children: item.girdList || [] | ||||
|         } | ||||
|  | ||||
|         if (obj.children && obj.children.length && this.girdLevel !== '2') { | ||||
|           obj.children = this.formatList(obj.children) | ||||
|         } | ||||
|  | ||||
|         return obj | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     getTreeList() { | ||||
|       this.instance.post('/app/appgirdinfo/listAll').then((res) => { | ||||
|         if (res.code == 0) { | ||||
|           this.treeList = [...res.data] | ||||
|  | ||||
|           this.$nextTick(() => { | ||||
|             this.$refs.tree.setCurrentKey(res.data[0].id) | ||||
|             this.getStatisticsInfo(res.data[0].id) | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .griddv { | ||||
|   display: flex; | ||||
|   align-items: center; | ||||
|   height: 100%; | ||||
|   user-select: none; | ||||
|  | ||||
|   ::-webkit-scrollbar { | ||||
|     width: 6px; | ||||
|   } | ||||
|  | ||||
|   ::-webkit-scrollbar-track { | ||||
|     border-radius: 5px; | ||||
|     background: rgba(93, 163, 255, 0.1); | ||||
|   } | ||||
|  | ||||
|   ::-webkit-scrollbar-thumb { | ||||
|     border-radius: 5px; | ||||
|     background: rgba(173, 208, 255, 0.5); | ||||
|   } | ||||
|  | ||||
|   .grid-info { | ||||
|     width: 100%; | ||||
|  | ||||
|     .grid-info__title { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       margin-bottom: 20px; | ||||
|  | ||||
|       h2, span { | ||||
|         color: #fff; | ||||
|         font-size: 14px; | ||||
|         font-weight: 500; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep( .el-dialog__body ){ | ||||
|     padding: 10px 40px 30px; | ||||
|  | ||||
|     .el-table { | ||||
|       background-color: transparent; | ||||
|     } | ||||
|  | ||||
|     .el-table__body tr td:first-child .cell, .ai-table .el-table__header tr th:first-child .cell { | ||||
|       padding-left: 0 !important; | ||||
|     } | ||||
|  | ||||
|     .el-table th, .el-table tr { | ||||
|       color: #fff; | ||||
|       font-size: 14px; | ||||
|       background-color: rgba(28, 39, 65, 0.9); | ||||
|     } | ||||
|  | ||||
|     .el-table__row--striped, .el-table--striped .el-table__body tr.el-table__row--striped td { | ||||
|       background-color: transparent !important; | ||||
|     } | ||||
|  | ||||
|     .el-table__header-wrapper { | ||||
|       display: none; | ||||
|     } | ||||
|  | ||||
|     .el-table--enable-row-hover .el-table__body tr:hover > td, .el-table-filter { | ||||
|       background-color: transparent; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep( .el-dialog ){ | ||||
|     position: absolute; | ||||
|     top: 50%; | ||||
|     left: 50%; | ||||
|     margin: 0 !important; | ||||
|     transform: translate(-50%, -50%); | ||||
|     background: rgba(2, 13, 43, 0.9); | ||||
|     box-shadow: 0px 2px 10px 0px rgba(0, 0, 0, 0.5), inset 0px 0px 10px 0px #2C7CFF; | ||||
|     border: 1px solid #2D65C9; | ||||
|  | ||||
|     .el-dialog__header { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       justify-content: space-between; | ||||
|       background: transparent; | ||||
|       box-shadow: none; | ||||
|  | ||||
|       h2 { | ||||
|         color: #fff; | ||||
|         font-size: 18px; | ||||
|       } | ||||
|  | ||||
|       img { | ||||
|         cursor: pointer; | ||||
|         width: 16px; | ||||
|         height: 16px; | ||||
|  | ||||
|         &:hover { | ||||
|           opacity: 0.6; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .el-dialog__headerbtn { | ||||
|       display: none; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep( .userlist-container ){ | ||||
|     .userlist { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       justify-content: center; | ||||
|       padding: 10px; | ||||
|       background: rgba(76, 166, 255, 0.1); | ||||
|       border: 1px solid rgba(255, 255, 255, 0.2); | ||||
|  | ||||
|       .user-item { | ||||
|         margin-right: 10px; | ||||
|         color: #fff; | ||||
|         font-size: 0; | ||||
|  | ||||
|         &:last-child { | ||||
|           margin-right: 0; | ||||
|         } | ||||
|  | ||||
|         img { | ||||
|           width: 58px; | ||||
|           height: 80px; | ||||
|           object-fit: cover; | ||||
|           user-select: none; | ||||
|         } | ||||
|  | ||||
|         p { | ||||
|           max-width: 120px; | ||||
|           margin: 4px 0 0 0; | ||||
|           font-size: 19px; | ||||
|           text-align: center; | ||||
|           overflow: hidden; | ||||
|           text-overflow: ellipsis; | ||||
|           white-space: nowrap; | ||||
|         } | ||||
|  | ||||
|         span { | ||||
|           display: block; | ||||
|           max-width: 120px; | ||||
|           font-size: 17px; | ||||
|           color: #9DD3FF; | ||||
|           overflow: hidden; | ||||
|           text-overflow: ellipsis; | ||||
|           white-space: nowrap; | ||||
|         } | ||||
|  | ||||
|         &.user-item-0 { | ||||
|           img { | ||||
|             width: 86px; | ||||
|             height: 120px; | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         &.user-item-2 { | ||||
|           p { | ||||
|             line-height: 14px; | ||||
|             font-size: 12px; | ||||
|             margin-bottom: 4px; | ||||
|           } | ||||
|  | ||||
|           span { | ||||
|             line-height: 14px; | ||||
|           } | ||||
|  | ||||
|           img { | ||||
|             width: 40px; | ||||
|             height: 56px; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       &.userlist-2 { | ||||
|         justify-content: space-between; | ||||
|         max-width: 130px; | ||||
|         flex-wrap: wrap; | ||||
|         padding-bottom: 0; | ||||
|         width: fit-content; | ||||
|         margin: 0 auto; | ||||
|  | ||||
|         .user-item { | ||||
|           width: 48px; | ||||
|           overflow: hidden; | ||||
|           text-overflow: ellipsis; | ||||
|           white-space: nowrap; | ||||
|           margin-bottom: 10px; | ||||
|  | ||||
|           &:nth-of-type(2n) { | ||||
|             margin-right: 0; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       &.last-level { | ||||
|         flex-wrap: wrap; | ||||
|         max-width: 690px; | ||||
|         font-size: 0; | ||||
|         background: rgba(0, 0, 0, 0.1); | ||||
|         border: 1px solid rgba(255, 255, 255, 0.2); | ||||
|         padding: 12px 12px 0 12px; | ||||
|         box-sizing: border-box; | ||||
|  | ||||
|         .user-item { | ||||
|           margin-bottom: 12px; | ||||
|         } | ||||
|  | ||||
|         img { | ||||
|           display: none; | ||||
|         } | ||||
|  | ||||
|         p { | ||||
|           padding: 8px; | ||||
|           font-size: 12px; | ||||
|           background: #0B477D; | ||||
|           border-radius: 4px; | ||||
|         } | ||||
|  | ||||
|         span { | ||||
|           display: none !important; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   * { | ||||
|     box-sizing: border-box; | ||||
|   } | ||||
|  | ||||
|   .griddv-title { | ||||
|     display: flex; | ||||
|     width: 320px; | ||||
|     height: 62px; | ||||
|     background-image: url(assets/grid/title-bg.png); | ||||
|     background-size: 100% 100%; | ||||
|  | ||||
|     h2 { | ||||
|       width: 100%; | ||||
|       height: 50px; | ||||
|       line-height: 50px; | ||||
|       padding-left: 24px; | ||||
|       font-weight: 600; | ||||
|       font-size: 20px; | ||||
|       letter-spacing: 1px; | ||||
|       color: #fff; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   & > div { | ||||
|     height: 100%; | ||||
|   } | ||||
|  | ||||
|   .right { | ||||
|     display: flex; | ||||
|     justify-content: space-between; | ||||
|     flex-direction: column; | ||||
|     width: 440px; | ||||
|     margin-left: 20px; | ||||
|  | ||||
|     & > div { | ||||
|       flex: 1; | ||||
|       width: 100%; | ||||
|       padding-bottom: 20px; | ||||
|       background: rgba(7, 11, 35, 0.4); | ||||
|       border: 1px solid #2D50B5; | ||||
|       box-sizing: border-box; | ||||
|  | ||||
|       .right-chart { | ||||
|         height: calc(100% - 82px); | ||||
|         padding: 0 20px; | ||||
|       } | ||||
|  | ||||
|       &:last-child { | ||||
|         margin-top: 20px; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .middle { | ||||
|     position: relative; | ||||
|     flex: 1; | ||||
|     margin-left: 20px; | ||||
|     background: rgba(7, 11, 35, 0.4); | ||||
|     border: 1px solid #2D50B5; | ||||
|     overflow: hidden; | ||||
|  | ||||
|     #tree { | ||||
|       display: flex; | ||||
|       position: absolute; | ||||
|       align-items: center; | ||||
|       justify-content: center; | ||||
|       left: 50%; | ||||
|       top: 50%; | ||||
|       padding: 20px; | ||||
|       overflow: hidden; | ||||
|       width: max-content; | ||||
|       height: 300%; | ||||
|     } | ||||
|  | ||||
|     :deep( .org-chart-container ){ | ||||
|       display: flex; | ||||
|       justify-content: center; | ||||
|  | ||||
|       .org-chart-node-children:before, .org-chart-node:after, .org-chart-node:last-child:before, | ||||
|       .org-chart-node.is-leaf:before { | ||||
|         border-radius: 0; | ||||
|         border-color: #9CD7FF !important; | ||||
|       } | ||||
|  | ||||
|       .vertical .org-chart-node:after, .vertical .org-chart-node:before { | ||||
|         border-radius: 0; | ||||
|         border-color: #9CD7FF !important; | ||||
|       } | ||||
|  | ||||
|       .org-chart-node-label-inner { | ||||
|         padding: 0 !important; | ||||
|       } | ||||
|  | ||||
|       .org-chart-node-btn { | ||||
|         margin-left: 0; | ||||
|         transform: translateX(-50%); | ||||
|       } | ||||
|  | ||||
|       .org-chart-node { | ||||
|         // max-width: 500px; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     :deep( .org-chart-node-children ){ | ||||
|       display: flex; | ||||
|       justify-content: center; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .left { | ||||
|     width: 320px; | ||||
|     background: rgba(7, 11, 35, 0.4); | ||||
|     border: 1px solid #2D50B5; | ||||
|  | ||||
|     .griddv-tree { | ||||
|       height: calc(100% - 62px); | ||||
|       overflow-y: auto; | ||||
|       margin: 0 8px; | ||||
|       padding-bottom: 8px; | ||||
|     } | ||||
|  | ||||
|     :deep( .el-tree ){ | ||||
|       background: transparent; | ||||
|  | ||||
|       .el-tree-node__expand-icon { | ||||
|         color: #eaeff9; | ||||
|       } | ||||
|  | ||||
|       .el-tree-node__expand-icon.is-leaf { | ||||
|         color: transparent; | ||||
|       } | ||||
|  | ||||
|       .el-tree-node__content { | ||||
|         height: 32px; | ||||
|         color: #eaeff9; | ||||
|         font-size: 14px; | ||||
|         user-select: none; | ||||
|         font-weight: normal !important; | ||||
|         background: transparent; | ||||
|       } | ||||
|  | ||||
|       .is-current > .el-tree-node__content, .el-tree-node__content:hover { | ||||
|         background: linear-gradient(270deg, #4895D9 0%, #2D52CA 100%); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										812
									
								
								packages/bigscreen/dv/AppHouseMapDv.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,812 @@ | ||||
| <template> | ||||
|   <div style="height:100%;" class="AppHouseMapDv"> | ||||
|     <div class="map"> | ||||
|       <div id="map" ref="rootmap" @click="hidePopup"/> | ||||
|       <div class="community-info" v-show="isShowInfo"> | ||||
|         <div class="community-info__close" title="关闭" @click="info = {}, isShowInfo = false,chooseBuildId=''"> | ||||
|           <i class="iconClean iconfont"></i> | ||||
|         </div> | ||||
|         <div class="community-info__header"> | ||||
|           <h2 v-if="!info.name">{{ info.createAddress }}</h2> | ||||
|           <h2 v-if="info.name">{{ info.homesteadAddress }}</h2> | ||||
|           <div>{{ info.lng }},{{ info.lat }}</div> | ||||
|         </div> | ||||
|         <div class="community-info__wrapper" v-if="info.name"> | ||||
|           <h2>户主信息</h2> | ||||
|           <div class="community-info__item"> | ||||
|             <label>所属村</label> | ||||
|             <span>{{ info.areaName }}</span> | ||||
|           </div> | ||||
|           <div class="community-info__item"> | ||||
|             <label>姓名</label> | ||||
|             <span style="color:#2266FF;">{{ info.name }}</span> | ||||
|           </div> | ||||
|           <div class="community-info__item"> | ||||
|             <label>联系电话</label> | ||||
|             <span style="color:#2266FF;">{{ info.phone }}</span> | ||||
|           </div> | ||||
|           <div class="community-info__item"> | ||||
|             <label>性别</label> | ||||
|             <span>{{ info.sex == 1 ? '男' : '女' }}</span> | ||||
|           </div> | ||||
|           <div class="community-info__item"> | ||||
|             <label>年龄</label> | ||||
|             <span>{{ info.age }}</span> | ||||
|           </div> | ||||
|         </div> | ||||
|         <div class="community-info__wrapper" v-if="info.name"> | ||||
|           <h2>宅基地信息</h2> | ||||
|           <div class="community-info__item"> | ||||
|             <label>住宅建筑面积</label> | ||||
|             <span>{{ info.liveBuildingArea }}m²</span> | ||||
|           </div> | ||||
|           <div class="community-info__item"> | ||||
|             <label>建筑层数</label> | ||||
|             <span>{{ info.buildingFloorNumber }}层</span> | ||||
|           </div> | ||||
|           <div class="community-info__item"> | ||||
|             <label>建筑高度</label> | ||||
|             <span>{{ info.buildingHeight }}m</span> | ||||
|           </div> | ||||
|         </div> | ||||
|         <div class="community-info__wrapper" v-if="!info.name"> | ||||
|           <h2>房屋信息</h2> | ||||
|           <div class="community-info__item"> | ||||
|             <label>所属社区</label> | ||||
|             <span>{{ info.areaName }}</span> | ||||
|           </div> | ||||
|           <div class="community-info__item"> | ||||
|             <label>所属小区</label> | ||||
|             <span>{{ info.communityName }}</span> | ||||
|           </div> | ||||
|           <div class="community-info__item"> | ||||
|             <label>房屋类型</label> | ||||
|             <span>{{ dict.getLabel("communityBuildingType", info.buildingType) }}</span> | ||||
|           </div> | ||||
|           <div class="community-info__item"> | ||||
|             <label>楼长姓名</label> | ||||
|             <span>{{ info.managerName }}</span> | ||||
|           </div> | ||||
|           <div class="community-info__item"> | ||||
|             <label>楼长电话</label> | ||||
|             <span>{{ info.managerPhone }}</span> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import AMapLoader from '@amap/amap-jsapi-loader' | ||||
| import {mapState} from 'vuex' | ||||
|  | ||||
| export default { | ||||
|   name: 'AppHouseMapDv', | ||||
|   label: '房屋地图', | ||||
|   provide() { | ||||
|     return { | ||||
|       root: this | ||||
|     } | ||||
|   }, | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       map: null, | ||||
|       mapLib: null, | ||||
|       community: '', | ||||
|       areaData: {}, | ||||
|       isShowInfo: false, | ||||
|       areaId: '', | ||||
|       areaName: '', | ||||
|       list: [], | ||||
|       info: {}, | ||||
|       resident: null, | ||||
|       satellite: null, | ||||
|       zoom: 11, | ||||
|       chooseBuildId: '', | ||||
|       buildList: [], | ||||
|       searchList: [], | ||||
|       house: null, | ||||
|       center: [], | ||||
|       type: '', | ||||
|       showStatistics: false | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState(['user']) | ||||
|   }, | ||||
|  | ||||
|   watch: { | ||||
|     community: { | ||||
|       deep: true, | ||||
|       handler() { | ||||
|         this.debounce(this.search, 500) | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     showStatistics: { | ||||
|       deep: true, | ||||
|       handler() { | ||||
|         this.debounce(this.getCorpLocation, 500) | ||||
|       } | ||||
|     }, | ||||
|   }, | ||||
|  | ||||
|   created() { | ||||
|     this.dict.load('householdRelation', 'communityBuildingType') | ||||
|   }, | ||||
|  | ||||
|   mounted() { | ||||
|     this.areaId = this.user.info.areaId | ||||
|     this.areaName = this.user.info.areaName | ||||
|     this.getCorpLocation() | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     getCorpLocation() { | ||||
|       if (this.showStatistics) { | ||||
|         return | ||||
|       } | ||||
|       this.instance.post("/app/appdvcpconfig/getCorpLocation").then(res => { | ||||
|         if (res.code == 0) { | ||||
|           this.initMap(res.data) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     changeZoom(isAdd) { | ||||
|       const zoom = isAdd ? this.map.getZoom() + 1 : this.map.getZoom() - 1 | ||||
|       this.map.setZoom(zoom, false, 600) | ||||
|     }, | ||||
|  | ||||
|     getBuildInfo(id, type) { | ||||
|       var url = `/app/apphomesteadinfo/queryDetailById?id=${id}` | ||||
|       if (type == 0) { | ||||
|         url = `/app/appcommunityhouseinfo/queryDetailByIdWithBuilding?buildId=${id}` | ||||
|       } | ||||
|       this.instance.post(url).then(res => { | ||||
|         if (res.code === 0) { | ||||
|           if (type == 1) { | ||||
|             this.info = res.data | ||||
|           } else { | ||||
|             this.info = res.data.build | ||||
|             this.resident = null; | ||||
|           } | ||||
|           this.$nextTick(() => { | ||||
|             this.isShowInfo = true | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     chooseCommunity(item) { | ||||
|       if (item.name) { //宅基地 | ||||
|         if (!item.lng || !item.lat) { | ||||
|           return this.$message.error('未获取到该房屋坐标信息') | ||||
|         } else { | ||||
|           this.map.setZoomAndCenter(18, [item.lng, item.lat], false, 600) | ||||
|           this.info = item | ||||
|           this.$nextTick(() => { | ||||
|             this.isShowSearch = false | ||||
|             this.isShowInfo = true | ||||
|           }) | ||||
|         } | ||||
|  | ||||
|       } else { //楼栋 | ||||
|         this.instance.post(`/app/appcommunityhouseinfo/queryDetailByIdWithBuilding`, null, { | ||||
|           params: { | ||||
|             buildId: item.buildingId, | ||||
|             houseId: item.id, | ||||
|             residentId: item.residentId | ||||
|           } | ||||
|         }).then(res => { | ||||
|           if (res.code === 0) { | ||||
|             if (!res.data.build?.lng || !res.data.build?.lat) { | ||||
|               this.isShowInfo = true | ||||
|               this.isShowSearch = false | ||||
|               this.info = res.data.build; | ||||
|               return this.$message.error('未获取到该房屋坐标信息') | ||||
|             } else { | ||||
|               this.chooseBuildId = res.data.build.id | ||||
|               this.house = res.data.house | ||||
|               this.resident = res.data.resident; | ||||
|             } | ||||
|  | ||||
|             this.map.setZoomAndCenter(18, [res.data.build?.lng, res.data.build?.lat], false, 600) | ||||
|             this.info = res.data.build | ||||
|             this.$nextTick(() => { | ||||
|               this.isShowSearch = false | ||||
|               this.isShowInfo = true | ||||
|             }) | ||||
|           } | ||||
|         }) | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     toCenter() { | ||||
|       this.map.setZoomAndCenter(this.zoom, this.center, false, 600) | ||||
|     }, | ||||
|  | ||||
|     renderClusterMarker(context) { | ||||
|       let el = `<div class="polymeric"> | ||||
|         <div class="polymeric-container"> | ||||
|           <p>${context.count}</p> | ||||
|         </div> | ||||
|       </div>` | ||||
|       let {mapLib: AMap} = this | ||||
|       let offset = new AMap.Pixel(-9, -9) | ||||
|       context.marker.setContent(el) | ||||
|       context.marker.setOffset(offset) | ||||
|       context.marker.lnglat = context.clusterData[0].lnglat | ||||
|  | ||||
|       context.marker.on('click', e => { | ||||
|         this.map.setZoomAndCenter(this.map.getZoom() + 2, e.target.lnglat, false, 500) | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     renderMarker(context) { | ||||
|       const buildId = context.data[0].id | ||||
|       let el = '' | ||||
|       var urlType = '' | ||||
|       if (context.data[0].communityName == context.data[0].buildingNumber) { //宅基地 | ||||
|         urlType = 1 | ||||
|         el = `<div id="buildId-${buildId}" class="mark ${buildId === this.chooseBuildId ? 'mark-active' : ''}"> | ||||
|          <div class="mark-contaienr"> | ||||
|             <span>${context.data[0].areaName}</span>   | ||||
|             <span>${context.data[0].communityName}</span> | ||||
|           </div> | ||||
|       </div>` | ||||
|       } else { | ||||
|         urlType = 0 | ||||
|         el = `<div id="buildId-${buildId}" class="mark ${buildId === this.chooseBuildId ? 'mark-active' : ''}"> | ||||
|          <div class="mark-contaienr"> | ||||
|             <span>${context.data[0].communityName}</span>   | ||||
|             <span>${context.data[0].buildingNumber}栋</span> | ||||
|           </div> | ||||
|       </div>` | ||||
|       } | ||||
|  | ||||
|       context.marker.setContent(el); | ||||
|       context.marker.setAnchor("center") | ||||
|       context.marker.id = `${buildId}` | ||||
|       context.marker.lnglat = context.data[0].lnglat | ||||
|       context.marker.urlType = urlType | ||||
|  | ||||
|       context.marker.on('click', e => { | ||||
|         this.chooseBuildId = e.target.id | ||||
|         this.getBuildInfo(e.target.id, e.target.urlType) | ||||
|         context.marker.setContent(el); | ||||
|         document.querySelectorAll('.mark').forEach(el => { | ||||
|           el.classList.remove('mark-active') | ||||
|         }) | ||||
|         document.querySelector(`#buildId-${e.target.id}`).classList.add('mark-active') | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     addMakert(points) { | ||||
|       let {mapLib: AMap} = this | ||||
|       new AMap.MarkerClusterer(this.map, points, { | ||||
|         gridSize: 60, | ||||
|         maxZoom: 15, | ||||
|         clusterByZoomChange: false, | ||||
|         renderClusterMarker: this.renderClusterMarker, | ||||
|         renderMarker: this.renderMarker | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     getCommunityList() { | ||||
|       this.instance.post('/app/appcommunitybuildinginfo/listByBuilding', null, { | ||||
|         params: { | ||||
|           current: 1, | ||||
|           size: 1000000 | ||||
|         } | ||||
|       }).then(res => { | ||||
|         if (res.code === 0) { | ||||
|           this.buildList = res.data | ||||
|           const points = res.data.map(item => { | ||||
|             return { | ||||
|               lnglat: [item.lng, item.lat], | ||||
|               id: item.id, | ||||
|               corpId: item.corpId, | ||||
|               areaName: item.areaName, | ||||
|               buildingNumber: item.name || item.buildingNumber, | ||||
|               communityName: item.name || item.communityName, | ||||
|             } | ||||
|           }) | ||||
|  | ||||
|           this.addMakert(points) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     hidePopup() { | ||||
|       this.isShowArea = false | ||||
|       this.isShowSearch = false | ||||
|     }, | ||||
|  | ||||
|     initMap({lng, lat}) { | ||||
|       this.center = [lng, lat]; | ||||
|       AMapLoader.load({ | ||||
|         key: '54a02a43d9828a8f9cd4f26fe281e74e', | ||||
|         version: '2.0', | ||||
|         plugins: ['AMap.ToolBar', 'AMap.Scale', 'AMap.MouseTool', 'AMap.MarkerClusterer'], | ||||
|         AMapUI: { | ||||
|           version: '1.1', | ||||
|           plugins: [] | ||||
|         } | ||||
|       }).then((AMap) => { | ||||
|         this.mapLib = AMap | ||||
|         this.map = new AMap.Map('map', { | ||||
|           resizeEnable: true, | ||||
|           zooms: [6, 20], | ||||
|           center: [lng, lat], | ||||
|           zoom: this.zoom, | ||||
|           mapStyle: 'amap://styles/40f6fba77127e061a058f670433a67ec' | ||||
|         }) | ||||
|         this.satellite = new AMap.TileLayer.Satellite() | ||||
|         this.getCommunityList() | ||||
|       }) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .map { | ||||
|   :deep( .amap-logo), :deep( .amap-copyright ){ | ||||
|     display: none !important; | ||||
|   } | ||||
|  | ||||
|   :deep( .amap-icon ){ | ||||
|     width: 40px !important; | ||||
|     height: 40px !important; | ||||
|  | ||||
|     img { | ||||
|       width: 100%; | ||||
|       height: 100%; | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| .community-info__star { | ||||
|   margin-top: 4px; | ||||
|   margin-bottom: 8px; | ||||
|  | ||||
|   .community-info__star--content { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     height: 36px; | ||||
|     padding: 0 12px; | ||||
|     color: #666666; | ||||
|     font-size: 12px; | ||||
|  | ||||
|     span { | ||||
|       flex: 1; | ||||
|       text-align: center; | ||||
|  | ||||
|       &:first-child { | ||||
|         text-align: left; | ||||
|       } | ||||
|  | ||||
|       &:last-child { | ||||
|         text-align: right; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     &:nth-of-type(2n) { | ||||
|       background: #fff; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .community-info__star--tab { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     height: 36px; | ||||
|     padding: 0 12px; | ||||
|     user-select: none; | ||||
|     background: #fff; | ||||
|  | ||||
|     span { | ||||
|       height: 100%; | ||||
|       line-height: 36px; | ||||
|       color: #999999; | ||||
|       font-size: 12px; | ||||
|       font-weight: 700; | ||||
|       cursor: pointer; | ||||
|       border-bottom: 2px solid transparent; | ||||
|  | ||||
|       &:first-child { | ||||
|         margin-right: 16px; | ||||
|       } | ||||
|  | ||||
|       &.star-active { | ||||
|         color: #2266FF; | ||||
|         border-bottom: 2px solid #2266FF; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| .community-info__item--imgs { | ||||
|   display: block !important; | ||||
|   height: auto !important; | ||||
|  | ||||
|   label { | ||||
|     height: 36px; | ||||
|     line-height: 36px; | ||||
|   } | ||||
|  | ||||
|   .community-info__item--img { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     flex-wrap: wrap; | ||||
|     padding-bottom: 10px; | ||||
|     overflow: hidden; | ||||
|  | ||||
|     img { | ||||
|       width: 69px; | ||||
|       height: 69px; | ||||
|       margin-right: 4px; | ||||
|       margin-bottom: 4px; | ||||
|       cursor: pointer; | ||||
|  | ||||
|       &:nth-of-type(4n) { | ||||
|         margin-right: 0; | ||||
|       } | ||||
|  | ||||
|       &:last-child { | ||||
|         margin-right: 0; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| .map { | ||||
|   position: relative; | ||||
|   width: 100%; | ||||
|   height: 100%; | ||||
|   overflow: hidden; | ||||
|  | ||||
|   :deep( .ol-zoom ){ | ||||
|     display: none !important; | ||||
|     top: inherit !important; | ||||
|     bottom: 0.5em !important; | ||||
|   } | ||||
|  | ||||
|   div { | ||||
|     box-sizing: border-box; | ||||
|   } | ||||
|  | ||||
|   #map { | ||||
|     width: 100%; | ||||
|     height: 100%; | ||||
|   } | ||||
| } | ||||
|  | ||||
| .community { | ||||
|   display: flex; | ||||
|   align-items: center; | ||||
|   position: relative; | ||||
|   height: 28px; | ||||
|   padding: 0 10px; | ||||
|   background: #0F8F64; | ||||
|   border-radius: 26px; | ||||
|   color: #fff; | ||||
|   font-size: 12px; | ||||
|   cursor: pointer; | ||||
|  | ||||
|   &.color1 { | ||||
|     background: #2266FF; | ||||
|  | ||||
|     em:after { | ||||
|       border-top-color: #2266FF !important; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   &.color2 { | ||||
|     background: #F46159; | ||||
|  | ||||
|     em:after { | ||||
|       border-top-color: #F46159 !important; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   em { | ||||
|     position: absolute; | ||||
|     bottom: -6px; | ||||
|     left: 50%; | ||||
|     transform: translate(-50%, 0); | ||||
|  | ||||
|     &::after { | ||||
|       position: absolute; | ||||
|       bottom: -6px; | ||||
|       left: 0; | ||||
|       width: 0; | ||||
|       height: 0; | ||||
|       border: 6px solid #0F8F64; | ||||
|       border-bottom-color: transparent; | ||||
|       border-left-color: transparent; | ||||
|       border-right-color: transparent; | ||||
|       transform: translate(-50%, 0); | ||||
|       overflow: hidden; | ||||
|       content: ' '; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   i { | ||||
|     padding-right: 2px; | ||||
|     position: relative; | ||||
|     color: #ffc928; | ||||
|     font-size: 16px; | ||||
|     font-style: normal; | ||||
|   } | ||||
| } | ||||
|  | ||||
| :deep( .polymeric ){ | ||||
|   display: flex; | ||||
|   position: relative; | ||||
|   align-items: center; | ||||
|   justify-content: center; | ||||
|   width: 62px; | ||||
|   height: 62px; | ||||
|   border-radius: 50%; | ||||
|   cursor: pointer; | ||||
|   user-select: none; | ||||
|  | ||||
|   &.polymeric-active { | ||||
|     .polymeric-container { | ||||
|       background: #F46159; | ||||
|     } | ||||
|  | ||||
|     &::after { | ||||
|       background-color: #F46159; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   &::after { | ||||
|     position: absolute; | ||||
|     z-index: -1; | ||||
|     width: 62px; | ||||
|     height: 62px; | ||||
|     border-radius: 50%; | ||||
|     -webkit-animation: warn 1s ease-out 0s infinite; | ||||
|     animation: warn 1s ease-out 0s infinite; | ||||
|     background-color: rgba(15, 143, 100, 1); | ||||
|     transform: translate(-50%, -50%); | ||||
|     content: " "; | ||||
|   } | ||||
|  | ||||
|   .polymeric-container { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: center; | ||||
|     flex-direction: column; | ||||
|     width: 62px; | ||||
|     height: 62px; | ||||
|     border-radius: 50%; | ||||
|     background: rgba(15, 143, 100, 1); | ||||
|  | ||||
|     p { | ||||
|       text-align: center; | ||||
|       width: 58px; | ||||
|       color: #fff; | ||||
|       font-size: 18px; | ||||
|       overflow: hidden; | ||||
|       text-overflow: ellipsis; | ||||
|       white-space: nowrap; | ||||
|     } | ||||
|  | ||||
|     p:first-child { | ||||
|       font-size: 14px; | ||||
|     } | ||||
|  | ||||
|     h2 { | ||||
|       color: #fff; | ||||
|       font-weight: normal; | ||||
|       font-size: 12px; | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| :deep( .mark ){ | ||||
|   user-select: none; | ||||
|   cursor: pointer; | ||||
|   height: 32px; | ||||
|   border-radius: 26px; | ||||
|   position: relative; | ||||
|   display: flex; | ||||
|   align-items: center; | ||||
|   justify-content: center; | ||||
|   box-sizing: border-box; | ||||
|   padding: 0 12px; | ||||
|   background: rgba(0,39,100,0.50); | ||||
|   border: 1px solid #36A5FF; | ||||
|   border-radius: 30px; | ||||
|  | ||||
|   &.mark-active { | ||||
|     background: #004AC0; | ||||
|     border: 1px solid transparent; | ||||
|     box-shadow: inset 0 0 8px 2px #33BBFF; | ||||
|   } | ||||
|  | ||||
|   .mark-contaienr { | ||||
|     color: white; | ||||
|     font-size: 14px; | ||||
|     position: relative; | ||||
|     overflow: hidden; | ||||
|     text-overflow: ellipsis; | ||||
|     white-space: nowrap; | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: center; | ||||
|   } | ||||
|  | ||||
|   .arrow { | ||||
|     position: absolute; | ||||
|     left: 50%; | ||||
|     transform: translateX(-50%); | ||||
|     bottom: -21px; | ||||
|     width: 0; | ||||
|     height: 0; | ||||
|     border: 12px solid transparent; | ||||
|     border-top: 12px solid #0F8F64; | ||||
|   } | ||||
|  | ||||
| } | ||||
|  | ||||
| @-webkit-keyframes warn { | ||||
|   0% { | ||||
|     transform: scale(.5); | ||||
|     opacity: 1 | ||||
|   } | ||||
|  | ||||
|   30% { | ||||
|     opacity: .5 | ||||
|   } | ||||
|  | ||||
|   to { | ||||
|     transform: scale(1.8); | ||||
|     opacity: 0 | ||||
|   } | ||||
| } | ||||
|  | ||||
| @keyframes warn { | ||||
|   0% { | ||||
|     transform: scale(.5); | ||||
|     opacity: 1 | ||||
|   } | ||||
|  | ||||
|   30% { | ||||
|     opacity: .5 | ||||
|   } | ||||
|  | ||||
|   to { | ||||
|     transform: scale(1.4); | ||||
|     opacity: 0 | ||||
|   } | ||||
| } | ||||
|  | ||||
| .community-info { | ||||
|   position: absolute; | ||||
|   top: 58px; | ||||
|   right: 10px; | ||||
|   width: 400px; | ||||
|   height: calc(100% - 117px); | ||||
|   overflow-y: auto; | ||||
|   overflow-x: hidden; | ||||
|   z-index: 111; | ||||
|   border-radius: 2px; | ||||
|   background: rgba(0,15,38,0.30); | ||||
|   border: 1px solid #103588; | ||||
|   // filter: blur(5px); | ||||
|  | ||||
|   .community-info__close { | ||||
|     position: absolute; | ||||
|     right: 0; | ||||
|     top: 0; | ||||
|     padding: 16px 12px 0 12px; | ||||
|     font-size: 16px; | ||||
|     color: #fff; | ||||
|     cursor: pointer; | ||||
|  | ||||
|     &:hover { | ||||
|       opacity: 0.6; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   &::-webkit-scrollbar { | ||||
|     width: 6px; | ||||
|     height: 1px; | ||||
|   } | ||||
|  | ||||
|   &::-webkit-scrollbar-thumb { | ||||
|     border-radius: 6px; | ||||
|     background: rgba(144, 147, 153, .5); | ||||
|   } | ||||
|  | ||||
|   .community-info__header { | ||||
|     padding: 12px 20px; | ||||
|     background-image: linear-gradient(270deg, rgba(11, 158, 255, 0.2) 0%, rgba(2, 81, 227, 0.2) 100%); | ||||
|  | ||||
|     h2 { | ||||
|       max-width: 360px; | ||||
|       line-height: 28px; | ||||
|       margin: 0; | ||||
|       color: #fff; | ||||
|       font-size: 20px; | ||||
|       font-weight: 600; | ||||
|       margin-bottom: 10px; | ||||
|     } | ||||
|  | ||||
|     div { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       color: #D2E0FF; | ||||
|       font-size: 12px; | ||||
|     } | ||||
|  | ||||
|     span { | ||||
|       display: block; | ||||
|       margin-top: 4px; | ||||
|       font-style: normal; | ||||
|       color: #82C5FF; | ||||
|       font-size: 14px; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .community-info__wrapper { | ||||
|     h2 { | ||||
|       margin: 20px 0 20px 20px; | ||||
|       padding: 0 20px; | ||||
|       font-size: 15px; | ||||
|       color: #fff; | ||||
|       font-weight: 600; | ||||
|       background: url(https://cdn.cunwuyun.cn/dvcp/ply/title-bg.png) no-repeat; | ||||
|       background-size: 169px 30px; | ||||
|       background-position-y: -5px; | ||||
|       background-position-x: -10px; | ||||
|     } | ||||
|  | ||||
|     .community-info__item { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       justify-content: space-between; | ||||
|       margin: 0 20px; | ||||
|       padding: 12px 12px; | ||||
|       font-size: 14px; | ||||
|       color: #fff; | ||||
|       background: rgba(63, 136, 255, 0.15); | ||||
|  | ||||
|       &:nth-of-type(2n) { | ||||
|         background: transparent; | ||||
|       } | ||||
|  | ||||
|       span { | ||||
|         max-width: 70%; | ||||
|         text-align: right; | ||||
|       } | ||||
|  | ||||
|       label { | ||||
|         flex-shrink: 1; | ||||
|         color: #82C5FF; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     &.community-info__wrapper--last { | ||||
|       .community-info__item { | ||||
|         background: #fff; | ||||
|  | ||||
|         &:nth-of-type(2n-1) { | ||||
|           background: #fff; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .bg-fff { | ||||
|       background-color: #fff !important; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										887
									
								
								packages/bigscreen/dv/AppMonitorMapDv.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,887 @@ | ||||
| <template> | ||||
|   <div class="map"> | ||||
|     <div id="map" ref="rootmap" /> | ||||
|     <div class="community-info" v-show="isShowInfo"> | ||||
|       <div class="community-info__close" title="关闭" @click="closeInfo"> | ||||
|         <i class="iconClean iconfont"></i> | ||||
|       </div> | ||||
|       <div class="community-info__header"> | ||||
|         <div class="user" :style="userStyle"> | ||||
|           <span>{{ formatName(info.name) }}</span> | ||||
|         </div> | ||||
|         <h2>{{ info.name }}</h2> | ||||
|         <h3>{{ info.gpsDesc }}</h3> | ||||
|         <p>最后更新时间:{{ info.lastUpdateTime }}</p> | ||||
|         <div class="community-info__header--status"> | ||||
|           <div :style="{color: info.onlineStatus === '1' ? '#2EA222' : '#F46' }"> | ||||
|             <i class="iconfont iconzhuangtai"></i> | ||||
|             <span>设备{{ info.onlineStatus === '1' ? '在线' : '离线' }}</span> | ||||
|           </div> | ||||
|           <div> | ||||
|             <i class="iconfont icondianliang"></i> | ||||
|             <span>剩余{{ info.electricQuantity }}%</span> | ||||
|           </div> | ||||
|         </div> | ||||
|         <div class="community-info__header--info"> | ||||
|           <div class="community-info__header--info-item" v-for="(item, index) in testItem" :key="item.name" v-if="index !== 0"> | ||||
|             <div class="left"> | ||||
|               <div :style="{backgroundColor: item.color}"> | ||||
|                 <i :class="item.icon" class="iconfont"></i> | ||||
|               </div> | ||||
|               <span>{{ item.name }}</span> | ||||
|             </div> | ||||
|             <i :style="{color: (testData[index] && testData[index].abnormalStatus === '1') ? '#F46' : ''}">{{ testData[index] ? testData[index].itemValue : '-' }}{{ index === '1' ? '℃' : '' }}</i> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="community-info__wrapper"> | ||||
|         <div class="community-info__title"> | ||||
|           <h2>人员信息</h2> | ||||
|           <span :style="userStatusColor">{{ userStatus }}</span> | ||||
|         </div> | ||||
|         <div class="community-info__item"> | ||||
|           <label>姓名</label> | ||||
|           <span>{{ info.name}}</span> | ||||
|         </div> | ||||
|         <div class="community-info__item"> | ||||
|           <label>性别</label> | ||||
|           <span>{{ info.sex === '1' ? '男' : '女' }}</span> | ||||
|         </div> | ||||
|         <div class="community-info__item"> | ||||
|           <label>年龄</label> | ||||
|           <span>{{ info.age }}</span> | ||||
|         </div> | ||||
|         <div class="community-info__item"> | ||||
|           <label>所属地区</label> | ||||
|           <span>{{ info.areaName }}</span> | ||||
|         </div> | ||||
|         <div class="community-info__item"> | ||||
|           <label>联系电话</label> | ||||
|           <span>{{ info.phone }}</span> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import AMapLoader from '@amap/amap-jsapi-loader' | ||||
| import {mapState} from 'vuex' | ||||
|  | ||||
| export default { | ||||
|   name: 'AppMonitorMapDv', | ||||
|   label: '监护地图', | ||||
|   provide() { | ||||
|     return { | ||||
|       root: this | ||||
|     } | ||||
|   }, | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       map: null, | ||||
|       community: '', | ||||
|       isShowInfo: false, | ||||
|       info: {}, | ||||
|       satellite: null, | ||||
|       zoom: 11, | ||||
|       choosedId: '', | ||||
|       testItem: [{ | ||||
|         name: '体温', | ||||
|         icon: 'icontiwen', | ||||
|         color: '#6BA3DB' | ||||
|       }, { | ||||
|         name: '心率', | ||||
|         icon: 'iconxinlv', | ||||
|         color: '#72BB5C' | ||||
|       }, { | ||||
|         name: '血压', | ||||
|         icon: 'iconxueya', | ||||
|         color: '#7577CB' | ||||
|       }, { | ||||
|         name: '血氧', | ||||
|         icon: 'iconxueyang', | ||||
|         color: '#FF5656' | ||||
|       }], | ||||
|       testData: [], | ||||
|       center: [] | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState(['user']), | ||||
|  | ||||
|     userStatus () { | ||||
|       if (this.info.abnormalStatus === '2') { | ||||
|         return '求助' | ||||
|       } | ||||
|  | ||||
|       if (this.info.abnormalStatus === '1') { | ||||
|         return '异常' | ||||
|       } | ||||
|  | ||||
|       if (this.info.abnormalStatus === '0') { | ||||
|         return '正常' | ||||
|       } | ||||
|  | ||||
|       return '-' | ||||
|     }, | ||||
|  | ||||
|     userStatusColor () { | ||||
|       if (this.info.abnormalStatus === '2') { | ||||
|         return { | ||||
|           color: '#FF69DD', | ||||
|           border: '1px solid #FF69DD' | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       if (this.info.abnormalStatus === '1') { | ||||
|         return { | ||||
|           color: '#FF6969', | ||||
|           border: '1px solid #FF6969' | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       return { | ||||
|         color: '#22FF81', | ||||
|         border: '1px solid #22FF81' | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     userStyle () { | ||||
|       if (this.info.abnormalStatus === '2') { | ||||
|         return { | ||||
|           background: 'rgba(96,8,102,0.80)', | ||||
|           border: '1px solid #FF69DD', | ||||
|           boxShadow: '0 4px 4px 0 #000000, inset 0 0 8px 4px #C312CA' | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       if (this.info.abnormalStatus === '1') { | ||||
|         return { | ||||
|           background: 'rgba(79,14,7,0.80)', | ||||
|           border: '1px solid #FF6969', | ||||
|           boxShadow: '0 4px 4px 0 #000000, inset 0 0 8px 4px #C60E0E' | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       return { | ||||
|         background: 'rgba(8,73,35,0.80)', | ||||
|         border: '1px solid #22FF81', | ||||
|         boxShadow: '0 4px 4px 0 #000000, inset 0 0 8px 4px #15BE55' | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   mounted() { | ||||
|     this.getCorpLocation() | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     getIdInfo (UUserCard, num) { | ||||
|       if (num == 1) { | ||||
|         var birth = UUserCard.substring(6, 10) + '-' + UUserCard.substring(10, 12) + '-' + UUserCard.substring(12, 14) | ||||
|         return birth | ||||
|       } | ||||
|       if (num == 2) { | ||||
|         if (parseInt(UUserCard.substr(16, 1)) % 2 == 1) { | ||||
|           return '1' | ||||
|         } else { | ||||
|           return '0' | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       if (num == 3) { | ||||
|         var myDate = new Date() | ||||
|         var month = myDate.getMonth() + 1 | ||||
|         var day = myDate.getDate() | ||||
|         var age = myDate.getFullYear() - UUserCard.substring(6, 10) - 1; | ||||
|         if (UUserCard.substring(10, 12) < month || UUserCard.substring(10, 12) == month && UUserCard.substring(12, 14) <= day) { | ||||
|           age ++ | ||||
|         } | ||||
|  | ||||
|         return age | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     getCorpLocation(){ | ||||
|       this.instance.post("/app/appdvcpconfig/getCorpLocation").then(res=>{ | ||||
|         if(res.code==0){ | ||||
|           this.initMap(res.data); | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     getList () { | ||||
|       this.instance.post(`/app/appintelligentguardianshipdevice/list`, null, { | ||||
|         params: { | ||||
|           size: 8000, | ||||
|           current: 1 | ||||
|         } | ||||
|       }).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           const points = res.data.records.map(item => { | ||||
|             return { | ||||
|               ...item, | ||||
|               lnglat: [item.lng, item.lat], | ||||
|               id: item.id, | ||||
|               corpId: item.corpId, | ||||
|               areaName:item.areaName, | ||||
|               name: item.name | ||||
|             } | ||||
|           }) | ||||
|  | ||||
|           this.addMakert(points) | ||||
|  | ||||
|           if (this.$route.query.id) { | ||||
|             this.onTreeChange({ | ||||
|               type: '1', | ||||
|               deviceId: this.$route.query.id, | ||||
|               lng: this.$route.query.lng, | ||||
|               lat: this.$route.query.lat | ||||
|             }) | ||||
|           } | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     formatName (str) { | ||||
|       if (!str) return '' | ||||
|  | ||||
|       return str.substr(str.length - 2) | ||||
|     }, | ||||
|  | ||||
|     getInfo (id) { | ||||
|       this.instance.post(`/app/appintelligentguardianshipdevice/queryMonitorList?deviceId=${id}&type=1`).then(res => { | ||||
|         if (res.code === 0) { | ||||
|           let obj = {} | ||||
|           this.testData = res.data.records.forEach(item => { | ||||
|             obj[item.item] = item | ||||
|           }) | ||||
|  | ||||
|           this.testData = obj | ||||
|         } | ||||
|       }) | ||||
|       this.instance.post(`/app/appintelligentguardianshipdevice/queryDetailById?id=${id}`).then(res => { | ||||
|         if (res.code === 0) { | ||||
|           this.info = res.data | ||||
|           this.info.age = this.getIdInfo(res.data.idNumber, 3) | ||||
|           this.isShowInfo = true | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     toCenter() { | ||||
|       this.map.setZoomAndCenter(this.zoom, this.center, false, 600) | ||||
|     }, | ||||
|  | ||||
|     renderClusterMarker(context) { | ||||
|       let el = `<div class="polymeric"> | ||||
|         <div class="polymeric-container"> | ||||
|           <p>${context.count}</p> | ||||
|         </div> | ||||
|       </div>` | ||||
|  | ||||
|       let offset = new AMap.Pixel(-9, -9) | ||||
|       context.marker.setContent(el) | ||||
|       context.marker.setOffset(offset) | ||||
|       context.marker.lnglat = context.clusterData[0].lnglat | ||||
|  | ||||
|       context.marker.on('click', e => { | ||||
|         this.map.setZoomAndCenter(this.map.getZoom() + 3, e.target.lnglat, false, 500) | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     renderMarker(context) { | ||||
|       const buildId = context.data[0].id | ||||
|  | ||||
|       let el = `<div class="mark mark${context.data[0].abnormalStatus}" id="buildId-${buildId}"> | ||||
|          <div class="mark-contaienr"> | ||||
|             <span>${context.data[0].name}</span> | ||||
|           </div> | ||||
|       </div>` | ||||
|  | ||||
|       context.marker.setContent(el); | ||||
|       context.marker.setAnchor("center") | ||||
|       context.marker.id = `${buildId}` | ||||
|       context.marker.data = JSON.stringify(context.data[0]) | ||||
|       context.marker.lnglat = context.data[0].lnglat | ||||
|  | ||||
|       context.marker.on('click', e => { | ||||
|         this.choosedId = e.target.id | ||||
|         this.getInfo(e.target.id) | ||||
|         context.marker.setContent(el); | ||||
|         document.querySelectorAll('.mark').forEach(el => { | ||||
|           el.classList.remove('mark-active') | ||||
|         }) | ||||
|         document.querySelector(`#buildId-${e.target.id}`).add('mark-active') | ||||
|         this.map.setZoomAndCenter(this.map.getZoom() + 0.000000001, e.target.lnglat, false, 300) | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     closeInfo () { | ||||
|       this.info = {} | ||||
|       this.isShowInfo = false | ||||
|       this.choosedId = '' | ||||
|       this.map.setZoom(this.map.getZoom() + 0.0001) | ||||
|     }, | ||||
|  | ||||
|     addMakert(points) { | ||||
|       new AMap.MarkerClusterer(this.map, points, { | ||||
|         gridSize: 60, | ||||
|         maxZoom: 15, | ||||
|         clusterByZoomChange: false, | ||||
|         renderClusterMarker: this.renderClusterMarker, | ||||
|         renderMarker: this.renderMarker | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     initMap({lng,lat}) { | ||||
|       this.center = [lng,lat]; | ||||
|       AMapLoader.load({ | ||||
|         key: '54a02a43d9828a8f9cd4f26fe281e74e', | ||||
|         version: '2.0', | ||||
|         plugins: ['AMap.ToolBar', 'AMap.Scale', 'AMap.MouseTool', 'AMap.MarkerClusterer'], | ||||
|         AMapUI: { | ||||
|           version: '1.1', | ||||
|           plugins: [] | ||||
|         } | ||||
|       }).then((AMap) => { | ||||
|         this.map = new AMap.Map('map', { | ||||
|           resizeEnable: true, | ||||
|           zooms: [6, 20], | ||||
|           center: [lng, lat], | ||||
|           zoom: this.zoom, | ||||
|           mapStyle: 'amap://styles/40f6fba77127e061a058f670433a67ec' | ||||
|         }) | ||||
|         this.satellite = new AMap.TileLayer.Satellite() | ||||
|         this.getList() | ||||
|       }) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
|   .map { | ||||
|     position: relative; | ||||
|     width: 100%; | ||||
|     height: 100%; | ||||
|     overflow: hidden; | ||||
|  | ||||
|     .community-info { | ||||
|       position: absolute; | ||||
|       top: 10px; | ||||
|       right: 10px; | ||||
|       width: 400px; | ||||
|       max-height: calc(100% - 20px); | ||||
|       overflow-y: overlay; | ||||
|       overflow-x: hidden; | ||||
|       z-index: 111; | ||||
|       background: rgba(7,11,35,0.50); | ||||
|       border: 1px solid #14345F; | ||||
|  | ||||
|       .community-info__close { | ||||
|         position: absolute; | ||||
|         right: 0; | ||||
|         top: 0; | ||||
|         padding: 16px 12px 0 12px; | ||||
|         font-size: 16px; | ||||
|         color: #8899bb; | ||||
|         cursor: pointer; | ||||
|  | ||||
|         &:hover { | ||||
|           opacity: 0.6; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       &::-webkit-scrollbar { | ||||
|         width: 6px; | ||||
|         height: 1px; | ||||
|       } | ||||
|  | ||||
|       &::-webkit-scrollbar-thumb { | ||||
|         border-radius: 6px; | ||||
|         background: rgba(144, 147, 153, .5); | ||||
|       } | ||||
|  | ||||
|       .community-info__header { | ||||
|         padding-top: 40px; | ||||
|         text-align: center; | ||||
|  | ||||
|         .user { | ||||
|           display: flex; | ||||
|           align-items: center; | ||||
|           justify-content: center; | ||||
|           width: 50px; | ||||
|           height: 50px; | ||||
|           margin: 0 auto 8px; | ||||
|           border-radius: 50%; | ||||
|           background: #2266FF; | ||||
|  | ||||
|           span { | ||||
|             color: #fff; | ||||
|             font-size: 16px; | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         h2 { | ||||
|           line-height: 24px; | ||||
|           margin-bottom: 12px; | ||||
|           font-weight: Bold; | ||||
|           font-size: 16px; | ||||
|           color: #FFFFFF; | ||||
|         } | ||||
|  | ||||
|         h3, p { | ||||
|           width: 300px; | ||||
|           line-height: 22px; | ||||
|           margin: 0 auto 4px; | ||||
|           font-size: 13px; | ||||
|           color: #82C5FF; | ||||
|           text-align: center; | ||||
|           font-weight: normal; | ||||
|         } | ||||
|  | ||||
|         & > h3 { | ||||
|           line-height: 1.4; | ||||
|           color: #82C5FF; | ||||
|         } | ||||
|  | ||||
|         .community-info__header--info { | ||||
|           display: flex; | ||||
|           flex-wrap: wrap; | ||||
|           padding: 0 20px; | ||||
|  | ||||
|           .community-info__header--info-item { | ||||
|             display: flex; | ||||
|             align-items: center; | ||||
|             justify-content: space-between; | ||||
|             width: 174px; | ||||
|             height: 56px; | ||||
|             margin-bottom: 10px; | ||||
|             padding: 0 12px; | ||||
|             background-image: linear-gradient(270deg, rgba(119,169,255,0.20) 0%, rgba(66,112,255,0.50) 100%); | ||||
|             border-radius: 4px; | ||||
|  | ||||
|             &:nth-of-type(2n - 1) { | ||||
|               margin-right: 10px; | ||||
|             } | ||||
|  | ||||
|             & > i { | ||||
|               position: relative; | ||||
|               top: 2px; | ||||
|               font-style: normal; | ||||
|               color: #fff; | ||||
|               font-size: 16px; | ||||
|               font-weight: 700; | ||||
|             } | ||||
|  | ||||
|             .left { | ||||
|               display: flex; | ||||
|               align-items: center; | ||||
|  | ||||
|               span { | ||||
|                 font-size: 14px; | ||||
|                 color: rgba(130, 197, 255, 1); | ||||
|               } | ||||
|  | ||||
|               div { | ||||
|                 display: flex; | ||||
|                 align-items: center; | ||||
|                 justify-content: center; | ||||
|                 margin-right: 8px; | ||||
|                 width: 24px; | ||||
|                 height: 24px; | ||||
|                 border-radius: 50%; | ||||
|                 background: #6BA3DB; | ||||
|  | ||||
|                 i { | ||||
|                   color: #fff; | ||||
|                   font-size: 16px; | ||||
|                 } | ||||
|               } | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         .community-info__header--status { | ||||
|           display: flex; | ||||
|           align-items: center; | ||||
|           justify-content: center; | ||||
|           margin-bottom: 20px; | ||||
|  | ||||
|           div { | ||||
|             display: flex; | ||||
|             align-items: center; | ||||
|             color: #74FF66; | ||||
|           } | ||||
|  | ||||
|           span { | ||||
|             font-size: 14px; | ||||
|           } | ||||
|  | ||||
|           div:first-child { | ||||
|             margin-right: 20px; | ||||
|           } | ||||
|  | ||||
|           i { | ||||
|             position: relative; | ||||
|             margin-right: 2px; | ||||
|             font-size: 16px; | ||||
|           } | ||||
|  | ||||
|           div:last-child { | ||||
|             color: #fff; | ||||
|  | ||||
|             span { | ||||
|               font-size: 12px; | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       .community-info__wrapper { | ||||
|         padding: 0 20px 40px; | ||||
|  | ||||
|         .community-info__title { | ||||
|           display: flex; | ||||
|           align-items: center; | ||||
|           justify-content: space-between; | ||||
|           margin-bottom: 20px; | ||||
|  | ||||
|           h2 { | ||||
|             position: relative; | ||||
|             width: 169px; | ||||
|             padding: 0 20px; | ||||
|             font-size: 15px; | ||||
|             color: #fff; | ||||
|             font-weight: 700; | ||||
|             background: url(https://cdn.cunwuyun.cn/dvcp/ply/title-bg.png) no-repeat; | ||||
|             background-size: 169px 30px; | ||||
|             background-position-y: -5px; | ||||
|             background-position-x: -10px; | ||||
|           } | ||||
|  | ||||
|           span { | ||||
|             width: 52px; | ||||
|             height: 24px; | ||||
|             line-height: 24px; | ||||
|             color: #fff; | ||||
|             font-size: 14px; | ||||
|             text-align: center; | ||||
|             border-radius: 12px; | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         .community-info__item { | ||||
|           display: flex; | ||||
|           align-items: center; | ||||
|           justify-content: space-between; | ||||
|           height: 40px; | ||||
|           padding: 0 12px; | ||||
|           font-size: 12px; | ||||
|           color: #fff; | ||||
|           background: transparent; | ||||
|  | ||||
|           &:nth-of-type(2n) { | ||||
|             background-image: linear-gradient(270deg, rgba(119,169,255,0.20) 0%, rgba(66,112,255,0.50) 100%); | ||||
|           } | ||||
|  | ||||
|           span { | ||||
|             max-width: 70%; | ||||
|             text-align: right; | ||||
|           } | ||||
|  | ||||
|           label { | ||||
|             flex-shrink: 1; | ||||
|             color: rgba(130, 197, 255, 1); | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         &.community-info__wrapper--last { | ||||
|           .community-info__item { | ||||
|             background: #fff; | ||||
|  | ||||
|             &:nth-of-type(2n) { | ||||
|               background: #F3F6F9; | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     :deep( .ol-zoom ){ | ||||
|       display: none !important; | ||||
|       top: inherit !important; | ||||
|       bottom: 0.5em !important; | ||||
|     } | ||||
|  | ||||
|     div { | ||||
|       box-sizing: border-box; | ||||
|     } | ||||
|  | ||||
|     #map { | ||||
|       width: 100%; | ||||
|       height: 100%; | ||||
|     } | ||||
|  | ||||
|     :deep( .amap-logo), :deep( .amap-copyright ){ | ||||
|       display: none !important; | ||||
|     } | ||||
|  | ||||
|     :deep( .amap-icon ){ | ||||
|       width: 40px !important; | ||||
|       height: 40px !important; | ||||
|  | ||||
|       img { | ||||
|         width: 100%; | ||||
|         height: 100%; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .no-more { | ||||
|       display: block; | ||||
|       height: 60px; | ||||
|       line-height: 60px; | ||||
|       margin-top: 2px; | ||||
|       text-align: center; | ||||
|       font-size: 12px; | ||||
|       color: #999; | ||||
|       width: 100%; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .community { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     position: relative; | ||||
|     height: 28px; | ||||
|     padding: 0 10px; | ||||
|     background: #0F8F64; | ||||
|     border-radius: 26px; | ||||
|     color: #fff; | ||||
|     font-size: 12px; | ||||
|     cursor: pointer; | ||||
|  | ||||
|     &.color1 { | ||||
|       background: #2266FF; | ||||
|  | ||||
|       em:after { | ||||
|         border-top-color: #2266FF !important; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     &.color2 { | ||||
|       background: #F46159; | ||||
|  | ||||
|       em:after { | ||||
|         border-top-color: #F46159 !important; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     em { | ||||
|       position: absolute; | ||||
|       bottom: -6px; | ||||
|       left: 50%; | ||||
|       transform: translate(-50%, 0); | ||||
|  | ||||
|       &::after { | ||||
|         position: absolute; | ||||
|         bottom: -6px; | ||||
|         left: 0; | ||||
|         width: 0; | ||||
|         height: 0; | ||||
|         border: 6px solid #0F8F64; | ||||
|         border-bottom-color: transparent; | ||||
|         border-left-color: transparent; | ||||
|         border-right-color: transparent; | ||||
|         transform: translate(-50%, 0); | ||||
|         overflow: hidden; | ||||
|         content: ' '; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     i { | ||||
|       padding-right: 2px; | ||||
|       position: relative; | ||||
|       color: #ffc928; | ||||
|       font-size: 16px; | ||||
|       font-style: normal; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep( .polymeric ){ | ||||
|     display: flex; | ||||
|     position: relative; | ||||
|     align-items: center; | ||||
|     justify-content: center; | ||||
|     width: 62px; | ||||
|     height: 62px; | ||||
|     border-radius: 50%; | ||||
|     cursor: pointer; | ||||
|     user-select: none; | ||||
|  | ||||
|     &.polymeric-active { | ||||
|       .polymeric-container { | ||||
|         background: #F46159; | ||||
|       } | ||||
|  | ||||
|       &::after { | ||||
|         background-color: #F46159; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     &::after { | ||||
|       position: absolute; | ||||
|       z-index: -1; | ||||
|       width: 62px; | ||||
|       height: 62px; | ||||
|       border-radius: 50%; | ||||
|       -webkit-animation: warn 1s ease-out 0s infinite; | ||||
|       animation: warn 1s ease-out 0s infinite; | ||||
|       background-color: rgba(15, 143, 100, 1); | ||||
|       transform: translate(-50%, -50%); | ||||
|       content: " "; | ||||
|     } | ||||
|  | ||||
|     .polymeric-container { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       justify-content: center; | ||||
|       flex-direction: column; | ||||
|       width: 62px; | ||||
|       height: 62px; | ||||
|       border-radius: 50%; | ||||
|       background: rgba(15, 143, 100, 1); | ||||
|  | ||||
|       p { | ||||
|         text-align: center; | ||||
|         width: 58px; | ||||
|         color: #fff; | ||||
|         font-size: 18px; | ||||
|         overflow: hidden; | ||||
|         text-overflow: ellipsis; | ||||
|         white-space: nowrap; | ||||
|       } | ||||
|  | ||||
|       p:first-child{ | ||||
|         font-size: 14px; | ||||
|       } | ||||
|  | ||||
|       h2 { | ||||
|         color: #fff; | ||||
|         font-weight: normal; | ||||
|         font-size: 12px; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep( .mark){ | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: center; | ||||
|     position: relative; | ||||
|     user-select: none; | ||||
|     cursor: pointer; | ||||
|     width: 56px; | ||||
|     height: 56px; | ||||
|     background: rgba(108,94,14,0.80); | ||||
|     border: 1px solid #FFDF54; | ||||
|     box-shadow: 0 4px 4px 0 #000000, inset 0 0 8px 4px #D1A818; | ||||
|     border-radius: 50%; | ||||
|     box-sizing: border-box; | ||||
|     font-size: 14px; | ||||
|     color: #FFFFFF; | ||||
|     overflow: hidden; | ||||
|     text-overflow: ellipsis; | ||||
|     white-space: nowrap; | ||||
|     text-shadow: 0 2px 4px rgba(0,0,0,0.50); | ||||
|  | ||||
|     &.mark0 { | ||||
|       background: rgba(8,73,35,0.80); | ||||
|       border: 1px solid #22FF81; | ||||
|       box-shadow: 0 4px 4px 0 #000000, inset 0 0 8px 4px #15BE55; | ||||
|     } | ||||
|  | ||||
|     &.mark1 { | ||||
|       background: rgba(79,14,7,0.80); | ||||
|       border: 1px solid #FF6969; | ||||
|       box-shadow: 0 4px 4px 0 #000000, inset 0 0 8px 4px #C60E0E; | ||||
|     } | ||||
|  | ||||
|     &.mark2 { | ||||
|       background: rgba(96,8,102,0.80); | ||||
|       border: 1px solid #FF69DD; | ||||
|       box-shadow: 0 4px 4px 0 #000000, inset 0 0 8px 4px #C312CA; | ||||
|     } | ||||
|  | ||||
|     .mark-contaienr { | ||||
|       width: 56px; | ||||
|       overflow: hidden; | ||||
|       text-overflow: ellipsis; | ||||
|       white-space: nowrap; | ||||
|       text-align: center; | ||||
|     } | ||||
|  | ||||
|     // &.mark1::after { | ||||
|     //   position: absolute; | ||||
|     //   z-index: -1; | ||||
|     //   width: 100px; | ||||
|     //   height: 100px; | ||||
|     //   border-radius: 50%; | ||||
|     //   -webkit-animation: warn 1s ease-out 0s infinite; | ||||
|     //   animation: warn 1s ease-out 0s infinite; | ||||
|     //   background-color: #FF6969; | ||||
|     //   transform: translate(-50%, -50%); | ||||
|     //   content: " "; | ||||
|     // } | ||||
|  | ||||
|     // &.mark2::after { | ||||
|     //   position: absolute; | ||||
|     //   z-index: -1; | ||||
|     //   width: 100px; | ||||
|     //   height: 100px; | ||||
|     //   border-radius: 50%; | ||||
|     //   -webkit-animation: warn 1s ease-out 0s infinite; | ||||
|     //   animation: warn 1s ease-out 0s infinite; | ||||
|     //   background-color: #FF69DD; | ||||
|     //   transform: translate(-50%, -50%); | ||||
|     //   content: " "; | ||||
|     // } | ||||
|   } | ||||
|  | ||||
|   @-webkit-keyframes warn { | ||||
|     0% { | ||||
|       transform: scale(.5); | ||||
|       opacity: 1 | ||||
|     } | ||||
|  | ||||
|     30% { | ||||
|       opacity: .5 | ||||
|     } | ||||
|  | ||||
|     to { | ||||
|       transform: scale(1.8); | ||||
|       opacity: 0 | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   @keyframes warn { | ||||
|     0% { | ||||
|       transform: scale(.5); | ||||
|       opacity: 1 | ||||
|     } | ||||
|  | ||||
|     30% { | ||||
|       opacity: .5 | ||||
|     } | ||||
|  | ||||
|     to { | ||||
|       transform: scale(1.4); | ||||
|       opacity: 0 | ||||
|     } | ||||
|   } | ||||
| </style> | ||||
							
								
								
									
										1271
									
								
								packages/bigscreen/dv/AppPdDv.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1257
									
								
								packages/bigscreen/dv/AppPlyDv.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1396
									
								
								packages/bigscreen/dv/AppQxnDv.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1735
									
								
								packages/bigscreen/dv/AppQxnEventDv.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										505
									
								
								packages/bigscreen/dv/AppResourceMapDv.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,505 @@ | ||||
| <template> | ||||
|   <div class="map"> | ||||
|     <div id="map" ref="rootmap" /> | ||||
|     <div class="community-info" v-show="isShowInfo"> | ||||
|       <div class="community-info__close" title="关闭" @click="closeInfo"> | ||||
|         <i class="iconClean iconfont"></i> | ||||
|       </div> | ||||
|       <div class="community-info__header"> | ||||
|         <h2>{{ info.resourceName }}</h2> | ||||
|         <el-tag type="success" size="small" style="margin: 6px 0;">{{ info.categoryName }}</el-tag> | ||||
|         <div>{{ info.areaName }}{{ info.address }}</div> | ||||
|       </div> | ||||
|       <div class="community-info__wrapper"> | ||||
|         <div class="community-info__title"> | ||||
|           <h2>资源信息</h2> | ||||
|         </div> | ||||
|         <p>{{ info.information }}</p> | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import AMapLoader from '@amap/amap-jsapi-loader' | ||||
| import {mapState} from 'vuex' | ||||
|  | ||||
| export default { | ||||
|   name: 'AppResourceMapDv', | ||||
|   label: '资源地图', | ||||
|   provide() { | ||||
|     return { | ||||
|       root: this | ||||
|     } | ||||
|   }, | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       map: null, | ||||
|       community: '', | ||||
|       isShowInfo: false, | ||||
|       info: {}, | ||||
|       satellite: null, | ||||
|       zoom: 11, | ||||
|       choosedId: '', | ||||
|       center: [], | ||||
|       list: [] | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState(['user']) | ||||
|   }, | ||||
|  | ||||
|   mounted() { | ||||
|     this.getCorpLocation() | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     getCorpLocation(){ | ||||
|       this.instance.post("/app/appdvcpconfig/getCorpLocation").then(res=>{ | ||||
|         if(res.code==0){ | ||||
|           this.initMap(res.data) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     getList () { | ||||
|       this.instance.post(`/app/appresourceinfo/listAll`).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           const points = res.data.map(item => { | ||||
|             return { | ||||
|               ...item, | ||||
|               lnglat: [item.lng, item.lat], | ||||
|               id: item.id, | ||||
|               corpId: item.corpId, | ||||
|               areaName:item.areaName, | ||||
|               name: item.resourceName | ||||
|             } | ||||
|           }) | ||||
|  | ||||
|           this.list = points | ||||
|  | ||||
|           this.addMakert(points) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     getInfo (id) { | ||||
|       this.info = this.list.filter(v => id === v.id)[0] | ||||
|       this.isShowInfo = true | ||||
|     }, | ||||
|  | ||||
|     renderClusterMarker(context) { | ||||
|       let el = `<div class="polymeric"> | ||||
|         <div class="polymeric-container"> | ||||
|           <p>${context.count}</p> | ||||
|         </div> | ||||
|       </div>` | ||||
|  | ||||
|       let offset = new AMap.Pixel(-9, -9) | ||||
|       context.marker.setContent(el) | ||||
|       context.marker.setOffset(offset) | ||||
|       context.marker.lnglat = context.clusterData[0].lnglat | ||||
|  | ||||
|       context.marker.on('click', e => { | ||||
|         this.map.setZoomAndCenter(this.map.getZoom() + 3, e.target.lnglat, false, 500) | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     renderMarker(context) { | ||||
|       const buildId = context.data[0].id | ||||
|  | ||||
|       let el = `<div id="buildId-${buildId}" class="mark ${buildId === this.choosedId ? 'mark-active' : ''}"> | ||||
|          <img src="${context.data[0].categoryIcon || 'https://cdn.cunwuyun.cn/dvcp/ply/icon.png'}"> | ||||
|       </div>` | ||||
|  | ||||
|       context.marker.setContent(el); | ||||
|       context.marker.setAnchor("center") | ||||
|       context.marker.id = `${buildId}` | ||||
|       context.marker.data = JSON.stringify(context.data[0]) | ||||
|       context.marker.lnglat = context.data[0].lnglat | ||||
|  | ||||
|       context.marker.on('click', e => { | ||||
|         this.choosedId = e.target.id | ||||
|         this.getInfo(e.target.id) | ||||
|         context.marker.setContent(el); | ||||
|         document.querySelectorAll('.mark').forEach(el => { | ||||
|           el.classList.remove('mark-active') | ||||
|         }) | ||||
|         document.querySelector(`#buildId-${e.target.id}`).classList.add('mark-active') | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     closeInfo () { | ||||
|       this.info = {} | ||||
|       this.isShowInfo = false | ||||
|       this.choosedId = '' | ||||
|       this.map.setZoom(this.map.getZoom() + 0.0001) | ||||
|     }, | ||||
|  | ||||
|     addMakert(points) { | ||||
|       new AMap.MarkerClusterer(this.map, points, { | ||||
|         gridSize: 60, | ||||
|         maxZoom: 15, | ||||
|         clusterByZoomChange: false, | ||||
|         renderClusterMarker: this.renderClusterMarker, | ||||
|         renderMarker: this.renderMarker | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     initMap({lng,lat}) { | ||||
|       this.center = [lng,lat]; | ||||
|       AMapLoader.load({ | ||||
|         key: '54a02a43d9828a8f9cd4f26fe281e74e', | ||||
|         version: '2.0', | ||||
|         plugins: ['AMap.ToolBar', 'AMap.Scale', 'AMap.MouseTool', 'AMap.MarkerClusterer'], | ||||
|         AMapUI: { | ||||
|           version: '1.1', | ||||
|           plugins: [] | ||||
|         } | ||||
|       }).then((AMap) => { | ||||
|         this.map = new AMap.Map('map', { | ||||
|           resizeEnable: true, | ||||
|           zooms: [6, 20], | ||||
|           center: [lng, lat], | ||||
|           zoom: this.zoom, | ||||
|           mapStyle: 'amap://styles/40f6fba77127e061a058f670433a67ec' | ||||
|         }) | ||||
|         this.satellite = new AMap.TileLayer.Satellite() | ||||
|         this.getList() | ||||
|       }) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
|   .map { | ||||
|     position: relative; | ||||
|     width: 100%; | ||||
|     height: 100%; | ||||
|     overflow: hidden; | ||||
|  | ||||
|     .community-info__header { | ||||
|       margin-bottom: 10px; | ||||
|       padding: 12px 20px; | ||||
|       background-image: linear-gradient(270deg, rgba(11, 158, 255, 0.2) 0%, rgba(2, 81, 227, 0.2) 100%); | ||||
|  | ||||
|       h2 { | ||||
|         max-width: 360px; | ||||
|         line-height: 28px; | ||||
|         margin: 0; | ||||
|         color: #fff; | ||||
|         font-size: 20px; | ||||
|         font-weight: 500; | ||||
|       } | ||||
|  | ||||
|       div { | ||||
|         display: flex; | ||||
|         align-items: center; | ||||
|         color: #D2E0FF; | ||||
|         font-size: 12px; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .community-info { | ||||
|       position: absolute; | ||||
|       top: 10px; | ||||
|       right: 10px; | ||||
|       width: 400px; | ||||
|       max-height: calc(100% - 20px); | ||||
|       overflow-y: overlay; | ||||
|       overflow-x: hidden; | ||||
|       z-index: 111; | ||||
|       background: rgba(7,11,35,0.50); | ||||
|       border: 1px solid #14345F; | ||||
|  | ||||
|       .community-info__close { | ||||
|         position: absolute; | ||||
|         right: 0; | ||||
|         top: 0; | ||||
|         padding: 16px 12px 0 12px; | ||||
|         font-size: 16px; | ||||
|         color: #8899bb; | ||||
|         cursor: pointer; | ||||
|  | ||||
|         &:hover { | ||||
|           opacity: 0.6; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       &::-webkit-scrollbar { | ||||
|         width: 6px; | ||||
|         height: 1px; | ||||
|       } | ||||
|  | ||||
|       &::-webkit-scrollbar-thumb { | ||||
|         border-radius: 6px; | ||||
|         background: rgba(144, 147, 153, .5); | ||||
|       } | ||||
|  | ||||
|       .community-info__wrapper { | ||||
|         padding: 0 20px 40px; | ||||
|  | ||||
|         .community-info__title { | ||||
|           display: flex; | ||||
|           align-items: center; | ||||
|           justify-content: space-between; | ||||
|           margin-bottom: 20px; | ||||
|  | ||||
|           h2 { | ||||
|             position: relative; | ||||
|             width: 169px; | ||||
|             padding: 0 20px; | ||||
|             font-size: 15px; | ||||
|             color: #fff; | ||||
|             font-weight: 700; | ||||
|             background: url(https://cdn.cunwuyun.cn/dvcp/ply/title-bg.png) no-repeat; | ||||
|             background-size: 169px 30px; | ||||
|             background-position-y: -5px; | ||||
|             background-position-x: -10px; | ||||
|           } | ||||
|  | ||||
|           span { | ||||
|             width: 52px; | ||||
|             height: 24px; | ||||
|             line-height: 24px; | ||||
|             color: #fff; | ||||
|             font-size: 14px; | ||||
|             text-align: center; | ||||
|             border-radius: 12px; | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         p { | ||||
|           line-height: 1.5; | ||||
|           font-size: 14px; | ||||
|           color: #82C5FF; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     :deep( .ol-zoom ){ | ||||
|       display: none !important; | ||||
|       top: inherit !important; | ||||
|       bottom: 0.5em !important; | ||||
|     } | ||||
|  | ||||
|     div { | ||||
|       box-sizing: border-box; | ||||
|     } | ||||
|  | ||||
|     #map { | ||||
|       width: 100%; | ||||
|       height: 100%; | ||||
|     } | ||||
|  | ||||
|     :deep( .amap-logo), :deep( .amap-copyright ){ | ||||
|       display: none !important; | ||||
|     } | ||||
|  | ||||
|     :deep( .amap-icon ){ | ||||
|       width: 40px !important; | ||||
|       height: 40px !important; | ||||
|  | ||||
|       img { | ||||
|         width: 100%; | ||||
|         height: 100%; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .no-more { | ||||
|       display: block; | ||||
|       height: 60px; | ||||
|       line-height: 60px; | ||||
|       margin-top: 2px; | ||||
|       text-align: center; | ||||
|       font-size: 12px; | ||||
|       color: #999; | ||||
|       width: 100%; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .community { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     position: relative; | ||||
|     height: 28px; | ||||
|     padding: 0 10px; | ||||
|     background: #0F8F64; | ||||
|     border-radius: 26px; | ||||
|     color: #fff; | ||||
|     font-size: 12px; | ||||
|     cursor: pointer; | ||||
|  | ||||
|     &.color1 { | ||||
|       background: #2266FF; | ||||
|  | ||||
|       em:after { | ||||
|         border-top-color: #2266FF !important; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     &.color2 { | ||||
|       background: #F46159; | ||||
|  | ||||
|       em:after { | ||||
|         border-top-color: #F46159 !important; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     em { | ||||
|       position: absolute; | ||||
|       bottom: -6px; | ||||
|       left: 50%; | ||||
|       transform: translate(-50%, 0); | ||||
|  | ||||
|       &::after { | ||||
|         position: absolute; | ||||
|         bottom: -6px; | ||||
|         left: 0; | ||||
|         width: 0; | ||||
|         height: 0; | ||||
|         border: 6px solid #0F8F64; | ||||
|         border-bottom-color: transparent; | ||||
|         border-left-color: transparent; | ||||
|         border-right-color: transparent; | ||||
|         transform: translate(-50%, 0); | ||||
|         overflow: hidden; | ||||
|         content: ' '; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     i { | ||||
|       padding-right: 2px; | ||||
|       position: relative; | ||||
|       color: #ffc928; | ||||
|       font-size: 16px; | ||||
|       font-style: normal; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep( .polymeric ){ | ||||
|     display: flex; | ||||
|     position: relative; | ||||
|     align-items: center; | ||||
|     justify-content: center; | ||||
|     width: 62px; | ||||
|     height: 62px; | ||||
|     border-radius: 50%; | ||||
|     cursor: pointer; | ||||
|     user-select: none; | ||||
|  | ||||
|     &.polymeric-active { | ||||
|       .polymeric-container { | ||||
|         background: #F46159; | ||||
|       } | ||||
|  | ||||
|       &::after { | ||||
|         background-color: #F46159; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     &::after { | ||||
|       position: absolute; | ||||
|       z-index: -1; | ||||
|       width: 62px; | ||||
|       height: 62px; | ||||
|       border-radius: 50%; | ||||
|       -webkit-animation: warn 1s ease-out 0s infinite; | ||||
|       animation: warn 1s ease-out 0s infinite; | ||||
|       background-color: rgba(15, 143, 100, 1); | ||||
|       transform: translate(-50%, -50%); | ||||
|       content: " "; | ||||
|     } | ||||
|  | ||||
|     .polymeric-container { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       justify-content: center; | ||||
|       flex-direction: column; | ||||
|       width: 62px; | ||||
|       height: 62px; | ||||
|       border-radius: 50%; | ||||
|       background: rgba(15, 143, 100, 1); | ||||
|  | ||||
|       p { | ||||
|         text-align: center; | ||||
|         width: 58px; | ||||
|         color: #fff; | ||||
|         font-size: 18px; | ||||
|         overflow: hidden; | ||||
|         text-overflow: ellipsis; | ||||
|         white-space: nowrap; | ||||
|       } | ||||
|  | ||||
|       p:first-child{ | ||||
|         font-size: 14px; | ||||
|       } | ||||
|  | ||||
|       h2 { | ||||
|         color: #fff; | ||||
|         font-weight: normal; | ||||
|         font-size: 12px; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep( .mark){ | ||||
|     position: relative; | ||||
|     user-select: none; | ||||
|     width: 50px; | ||||
|     height: 50px; | ||||
|     border-radius: 50%; | ||||
|     cursor: pointer; | ||||
|  | ||||
|     img { | ||||
|       width: 50px; | ||||
|       height: 50px; | ||||
|       border-radius: 50%; | ||||
|     } | ||||
|  | ||||
|     &:hover { | ||||
|       opacity: 0.8; | ||||
|     } | ||||
|  | ||||
|     &.mark-active { | ||||
|       transform: scale(1.2); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   @-webkit-keyframes warn { | ||||
|     0% { | ||||
|       transform: scale(.5); | ||||
|       opacity: 1 | ||||
|     } | ||||
|  | ||||
|     30% { | ||||
|       opacity: .5 | ||||
|     } | ||||
|  | ||||
|     to { | ||||
|       transform: scale(1.8); | ||||
|       opacity: 0 | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   @keyframes warn { | ||||
|     0% { | ||||
|       transform: scale(.5); | ||||
|       opacity: 1 | ||||
|     } | ||||
|  | ||||
|     30% { | ||||
|       opacity: .5 | ||||
|     } | ||||
|  | ||||
|     to { | ||||
|       transform: scale(1.4); | ||||
|       opacity: 0 | ||||
|     } | ||||
|   } | ||||
| </style> | ||||
							
								
								
									
										1232
									
								
								packages/bigscreen/dv/AppSpecialPeopleDV.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										522
									
								
								packages/bigscreen/dv/AppVideoMonitoringDV.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,522 @@ | ||||
| <template> | ||||
|   <section class="AppVideoMonitoringDV"> | ||||
|     <el-row type="flex" justify="space-between" class="body"> | ||||
|       <div class="left-wrap column" flex> | ||||
|         <div class="left-top fill"> | ||||
|           <label class="label">设备统计</label> | ||||
|           <dv-scroll-board :header="config.header" :config="config" class="table"/> | ||||
|         </div> | ||||
|         <div class="left-bottom"> | ||||
|           <label class="label">电子地图</label> | ||||
|           <ai-map :areaId="user.info.areaId"/> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="center-wrap column" flex> | ||||
|         <div flex style="width: 100%"> | ||||
|           <div :span="6" class="card fill" v-for="(item,index) in cardList" :key="index"> | ||||
|             <span>{{ item.label }}</span> | ||||
|             <span>{{ item.value }}</span> | ||||
|           </div> | ||||
|         </div> | ||||
|         <div class="center-bottom fill"> | ||||
|           <label class="label">视频监控</label> | ||||
|           <div class="video-wrap"> | ||||
|             <div class="item" v-for="(item,index) in videoData.slice(0,2)" | ||||
|                  :key="index"> | ||||
|               <template v-if="flag"> | ||||
|                 <iframe class="video" :src="item.url" allow="autoplay *; microphone *; fullscreen *" | ||||
|                         allowfullscreen allowtransparency="true" allowusermedia="true" frameBorder="no"></iframe> | ||||
|               </template> | ||||
|               <template v-else> | ||||
|                 <div class="video"></div> | ||||
|               </template> | ||||
|               <div class="info"> | ||||
|                 <span>{{ item.name }}</span> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|           <div class="video-wrap"> | ||||
|             <div class="item" v-for="(item,index) in videoData.slice(2,4)" | ||||
|                  :key="index"> | ||||
|               <template v-if="flag"> | ||||
|                 <iframe class="video" :src="item.url" allow="autoplay *; microphone *; fullscreen *" | ||||
|                         allowfullscreen allowtransparency="true" allowusermedia="true" frameBorder="no"></iframe> | ||||
|               </template> | ||||
|               <template v-else> | ||||
|                 <div class="video"></div> | ||||
|               </template> | ||||
|               <div class="info"> | ||||
|                 <span>{{ item.name }}</span> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="right-wrap column" flex> | ||||
|         <div class="right-top fill"> | ||||
|           <label class="label">人员统计</label> | ||||
|           <label class="total">人员总数 | ||||
|             <span>0</span> | ||||
|             <span>人</span> | ||||
|           </label> | ||||
|           <dv-scroll-board :config="config1" class="total-table"/> | ||||
|         </div> | ||||
|         <div class="right-middle"> | ||||
|           <label class="label">动作告警统计</label> | ||||
|           <div class="tag"> | ||||
|             <span></span> | ||||
|           </div> | ||||
|           <ai-echart :ops="getOpt()"/> | ||||
|           <div class="info"> | ||||
|             今日 | ||||
|             <span>0</span> | ||||
|             <span>次</span> | ||||
|             本月 | ||||
|             <span>0</span> | ||||
|             <span>次</span> | ||||
|           </div> | ||||
|         </div> | ||||
|         <div class="right-bottom"> | ||||
|           <label class="label">声音告警统计</label> | ||||
|           <div class="tag"> | ||||
|             <span></span> | ||||
|           </div> | ||||
|           <ai-echart :ops="getOpt('1')"/> | ||||
|           <div class="info"> | ||||
|             今日 | ||||
|             <span style="color:#00FFDF">0</span> | ||||
|             <span>次</span> | ||||
|             本月 | ||||
|             <span style="color:#00FFDF">0</span> | ||||
|             <span>次</span> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </el-row> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import {mapState} from "vuex"; | ||||
| import Vue from "vue"; | ||||
| import {scrollBoard} from "@jiaminghi/data-view"; | ||||
|  | ||||
| Vue.use(scrollBoard) | ||||
| export default { | ||||
|   name: "AppVideoMonitoringDV", | ||||
|   label: "数据大屏-平安小区", | ||||
|   inject: { | ||||
|     dv: {default: ""} | ||||
|   }, | ||||
|   props: { | ||||
|     instance: Function | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState(['user']), | ||||
|     cardList() { | ||||
|       return [ | ||||
|         {label: "总设备数", value: "0"}, | ||||
|         {label: "在线设备", value: "0"}, | ||||
|         {label: "离线设备", value: "0"}, | ||||
|         {label: "设备在线率", value: "0%"}, | ||||
|       ] | ||||
|     }, | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       meta: {}, | ||||
|       config: { | ||||
|         data: [ | ||||
|         ], | ||||
|         columnWidth: [60, 140], | ||||
|         header: ["机构", "设备在线率"], | ||||
|         headerBGC: '', | ||||
|         headerHeight: 41, | ||||
|         oddRowBGC: "", | ||||
|         evenRowBGC: "", | ||||
|         align: ["center", "center", "center"], | ||||
|         rowNum: 10, | ||||
|         index: true, | ||||
|         indexHeader: "排名" | ||||
|       }, | ||||
|       config1: { | ||||
|         data: [ | ||||
|           ['普通用户', '-'], | ||||
|           ['村级管理员', '-'], | ||||
|           ['超级管理员', '-'], | ||||
|           ['测试', '-'], | ||||
|         ], | ||||
|         headerHeight: 41, | ||||
|         oddRowBGC: "", | ||||
|         evenRowBGC: "", | ||||
|         align: ["left", "left", "right"], | ||||
|         index: true, | ||||
|         rowNum: 6, | ||||
|         columnWidth: [50] | ||||
|       }, | ||||
|       start: 0, | ||||
|       end: 40, | ||||
|       start1: 0, | ||||
|       end1: 40, | ||||
|       interval: null, | ||||
|       videoData: [], | ||||
|       flag: false, | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     jsonObj(val) { | ||||
|       return JSON.parse(val || "{}")?.url | ||||
|     }, | ||||
|     getOpt(type = "0") { | ||||
|       let opt = { | ||||
|         "0": { | ||||
|           xData: ['2020/7/1', "2020/7/2", "2020/7/3", "2020/7/4", "2020/7/5", "2020/7/6", "2020/7/7", "2020/7/8", "2020/7/9", "2020/7/10", "2020/7/11"], | ||||
|           yData: Array(11).fill(0), | ||||
|           color: "#FFEA2F", | ||||
|           areaStyle: 'rgba(255,234,47,0.2)', | ||||
|           unit: '', | ||||
|         }, | ||||
|         "1": { | ||||
|           xData: ["1:00", "2:00", "3:00", "4:00", "5:00", "6:00", "7:00", "8:00", "9:00", "10:00"], | ||||
|           yData: Array(10).fill(0), | ||||
|           color: "#13B5B1", | ||||
|           areaStyle: 'rgba(255,234,47,0.2)', | ||||
|           unit: '次', | ||||
|         }, | ||||
|       } | ||||
|       return { | ||||
|         grid: { | ||||
|           top: "5%", | ||||
|           left: "16%", | ||||
|           right: "3%", | ||||
|           bottom: "12%" | ||||
|         }, | ||||
|         xAxis: { | ||||
|           show: true, | ||||
|           boundaryGap: false, | ||||
|           type: 'category', | ||||
|           axisLabel: { | ||||
|             show: true, | ||||
|             textStyle: { | ||||
|               color: "#5E9CEA", | ||||
|               fontSize: 12 | ||||
|             } | ||||
|           }, | ||||
|           axisLine: { | ||||
|             show: false | ||||
|           }, | ||||
|           axisTick: { | ||||
|             show: false | ||||
|           }, | ||||
|           data: opt[type]["xData"] | ||||
|         }, | ||||
|         yAxis: { | ||||
|           type: 'value', | ||||
|           show: true, | ||||
|           axisTick: { | ||||
|             show: false | ||||
|           }, | ||||
|           axisLine: { | ||||
|             show: false | ||||
|           }, | ||||
|           splitLine: { | ||||
|             show: true, | ||||
|             lineStyle: { | ||||
|               color: ['#103066'], | ||||
|             } | ||||
|           }, | ||||
|           axisLabel: { | ||||
|             show: true, | ||||
|             formatter: (val) => `${val}${opt[type]["unit"]}`, | ||||
|             textStyle: { | ||||
|               color: "#5E9CEA", | ||||
|               fontSize: 12 | ||||
|             } | ||||
|           }, | ||||
|         }, | ||||
|         series: [{ | ||||
|           symbol: "none", | ||||
|           data: opt[type]["yData"], | ||||
|           type: 'line', | ||||
|           itemStyle: { | ||||
|             normal: { | ||||
|               color: opt[type]["color"], | ||||
|               areaStyle: { | ||||
|                 color: { | ||||
|                   type: 'linear', x2: 0, y2: 1, colorStops: [ | ||||
|                     {offset: 0, color: opt[type]["areaStyle"]}, {offset: 1, color: '#000000'}] | ||||
|                 } | ||||
|               } | ||||
|             } | ||||
|           } | ||||
|         }] | ||||
|       } | ||||
|     }, | ||||
|     getWebSdkUrlForScreen() { | ||||
|       this.instance.post(`/app/appzyvideoequipment/getWebSdkUrlForTianQiaoScreen`).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           this.videoData = res.data | ||||
|           this.flag = true | ||||
|         } | ||||
|       }) | ||||
|     } | ||||
|   }, | ||||
|   beforeDestroy() { | ||||
|     this.interval && clearInterval(this.interval); | ||||
|   }, | ||||
|   mounted() { | ||||
|     // this.getWebSdkUrlForScreen() | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .AppVideoMonitoringDV { | ||||
|   height: 100%; | ||||
|   padding: 6px 0 10px; | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
|   gap: 24px; | ||||
|  | ||||
|   .body { | ||||
|     height: 100%; | ||||
|  | ||||
|     .left-wrap { | ||||
|       width: 307px; | ||||
|       height: 100%; | ||||
|  | ||||
|       .left-top { | ||||
|         width: 100%; | ||||
|         background-image: url("./assets/videoMonitor/box1.png"); | ||||
|         background-size: 100% 100%; | ||||
|         position: relative; | ||||
|         overflow: hidden; | ||||
|  | ||||
|         .table { | ||||
|           box-sizing: border-box; | ||||
|           padding: 63px 17px 17px; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       .left-bottom { | ||||
|         width: 100%; | ||||
|         height: 311px; | ||||
|         background-image: url("./assets/videoMonitor/box2.png"); | ||||
|         background-size: 100% 100%; | ||||
|         margin-top: 7px; | ||||
|         display: flex; | ||||
|         align-items: center; | ||||
|         justify-content: center; | ||||
|         position: relative; | ||||
|  | ||||
|         .AiMap { | ||||
|           width: 274px; | ||||
|           height: 247px; | ||||
|           margin-top: 40px; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .center-wrap { | ||||
|       width: 1183px; | ||||
|       height: 100%; | ||||
|  | ||||
|       .card { | ||||
|         height: 93.3px; | ||||
|         display: flex; | ||||
|         align-items: center; | ||||
|         justify-content: center; | ||||
|         background-image: url("./assets/videoMonitor/card.png"); | ||||
|         background-size: 100% 100%; | ||||
|         margin-right: 24px; | ||||
|  | ||||
|         &:last-child { | ||||
|           margin-right: 0; | ||||
|         } | ||||
|  | ||||
|         & > span:first-child { | ||||
|           font-size: 20px; | ||||
|           font-weight: 400; | ||||
|           color: #FFFFFF; | ||||
|         } | ||||
|  | ||||
|         & > span:last-child { | ||||
|           font-size: 38px; | ||||
|           font-family: dineng, serif; | ||||
|           font-weight: bold; | ||||
|           color: #00EDFF; | ||||
|           margin-left: 13px; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       .center-bottom { | ||||
|         width: 100%; | ||||
|         height: 789px; | ||||
|         background-image: url("./assets/videoMonitor/middlebox.png"); | ||||
|         background-size: 100% 100%; | ||||
|         margin-top: 40px; | ||||
|         position: relative; | ||||
|         box-sizing: border-box; | ||||
|         padding: 61px; | ||||
|  | ||||
|         .video-wrap { | ||||
|           width: 100%; | ||||
|           height: 344px; | ||||
|           display: flex; | ||||
|           justify-content: space-between; | ||||
|           margin-bottom: 12px; | ||||
|  | ||||
|           .item { | ||||
|             .video { | ||||
|               width: 522px; | ||||
|               height: 296px; | ||||
|               object-fit: fill; | ||||
|               vertical-align: bottom; | ||||
|               border: 2px solid #122C7D; | ||||
|             } | ||||
|  | ||||
|             .info { | ||||
|               height: 48px; | ||||
|               display: flex; | ||||
|               align-items: center; | ||||
|               justify-content: space-between; | ||||
|               box-sizing: border-box; | ||||
|               padding: 0 12px; | ||||
|               background-color: #071153; | ||||
|               font-size: 14px; | ||||
|               color: #FFFFFF; | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .right-wrap { | ||||
|       width: 297px; | ||||
|       height: 100%; | ||||
|  | ||||
|       .right-top { | ||||
|         width: 100%; | ||||
|         height: 333px; | ||||
|         background-image: url("./assets/videoMonitor/box3.png"); | ||||
|         background-size: 100% 100%; | ||||
|         position: relative; | ||||
|         overflow: hidden; | ||||
|  | ||||
|         .total { | ||||
|           font-size: 16px; | ||||
|           color: #979AB7; | ||||
|           display: inline-block; | ||||
|           margin: 65px 0 16px 23px; | ||||
|  | ||||
|           & > span:nth-child(1) { | ||||
|             font-size: 28px; | ||||
|             font-family: dineng, serif; | ||||
|             font-weight: bold; | ||||
|             color: #01CAFF; | ||||
|           } | ||||
|  | ||||
|           & > span:nth-child(2) { | ||||
|             font-size: 16px; | ||||
|             color: #01CAFF; | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         .total-table { | ||||
|           height: 200px; | ||||
|           box-sizing: border-box; | ||||
|           padding: 0 23px; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       .right-middle, .right-bottom { | ||||
|         width: 100%; | ||||
|         height: 276px; | ||||
|         background-image: url("./assets/videoMonitor/box4.png"); | ||||
|         background-size: 100% 100%; | ||||
|         margin: 19px 0; | ||||
|         position: relative; | ||||
|         overflow: hidden; | ||||
|  | ||||
|         .tag { | ||||
|           margin: 28px 18px 0 0; | ||||
|           display: flex; | ||||
|           justify-content: flex-end; | ||||
|           font-size: 12px; | ||||
|           color: #5E9CEA; | ||||
|  | ||||
|           & > span { | ||||
|             font-size: 12px; | ||||
|             color: #FFFFFF; | ||||
|             display: inline-block; | ||||
|             width: 34px; | ||||
|             height: 17px; | ||||
|             text-align: center; | ||||
|             line-height: 18px; | ||||
|             margin-left: 14px; | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         :deep( .AiEchart ){ | ||||
|           width: 251px; | ||||
|           height: 175px; | ||||
|           margin: 11px auto 0; | ||||
|         } | ||||
|  | ||||
|         .info { | ||||
|           font-size: 12px; | ||||
|           color: #FFFFFF; | ||||
|           line-height: 24px; | ||||
|           box-sizing: border-box; | ||||
|           padding: 15px 19px 0; | ||||
|  | ||||
|           & > span:nth-child(2n+1) { | ||||
|             font-size: 18px; | ||||
|             font-weight: 400; | ||||
|             line-height: 24px; | ||||
|             color: #FFE930; | ||||
|           } | ||||
|  | ||||
|           & > span:nth-child(2n) { | ||||
|             font-size: 14px; | ||||
|             font-weight: 400; | ||||
|             color: #FFE930; | ||||
|             line-height: 24px; | ||||
|             margin: 0 5px; | ||||
|           } | ||||
|  | ||||
|           & > span:nth-child(2) { | ||||
|             margin-right: 22px; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       .right-bottom { | ||||
|         margin: 0; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .label { | ||||
|     position: absolute; | ||||
|     left: 24px; | ||||
|     top: 23px; | ||||
|     font-size: 16px; | ||||
|     font-weight: 600; | ||||
|     color: #FFFFFF; | ||||
|   } | ||||
|  | ||||
|   :deep( .index ){ | ||||
|     background-color: transparent !important; | ||||
|   } | ||||
|  | ||||
|   :deep( .header ){ | ||||
|     background: url("./assets/videoMonitor/titlebox.png"); | ||||
|   } | ||||
|  | ||||
|   :deep( .row-item div:nth-child(3) ){ | ||||
|     font-size: 13px; | ||||
|     color: #00CDFF; | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										1267
									
								
								packages/bigscreen/dv/AppXyDv.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1267
									
								
								packages/bigscreen/dv/AppYyxDv.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								packages/bigscreen/dv/assets/centralTask/bg.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 362 KiB | 
							
								
								
									
										
											BIN
										
									
								
								packages/bigscreen/dv/assets/centralTask/box.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 11 KiB | 
							
								
								
									
										
											BIN
										
									
								
								packages/bigscreen/dv/assets/centralTask/titleBox.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								packages/bigscreen/dv/assets/govInteraction/globe_map.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 693 KiB | 
							
								
								
									
										
											BIN
										
									
								
								packages/bigscreen/dv/assets/govInteraction/kuaikuai.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 11 KiB | 
							
								
								
									
										
											BIN
										
									
								
								packages/bigscreen/dv/assets/govInteraction/title.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 24 KiB | 
							
								
								
									
										
											BIN
										
									
								
								packages/bigscreen/dv/assets/grid/avatar.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 11 KiB | 
							
								
								
									
										
											BIN
										
									
								
								packages/bigscreen/dv/assets/grid/close.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 445 B | 
							
								
								
									
										
											BIN
										
									
								
								packages/bigscreen/dv/assets/grid/title-bg.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 26 KiB | 
							
								
								
									
										
											BIN
										
									
								
								packages/bigscreen/dv/assets/videoMonitor/bg.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 140 KiB | 
							
								
								
									
										
											BIN
										
									
								
								packages/bigscreen/dv/assets/videoMonitor/box1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 4.5 KiB | 
							
								
								
									
										
											BIN
										
									
								
								packages/bigscreen/dv/assets/videoMonitor/box2.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.5 KiB | 
							
								
								
									
										
											BIN
										
									
								
								packages/bigscreen/dv/assets/videoMonitor/box3.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.6 KiB | 
							
								
								
									
										
											BIN
										
									
								
								packages/bigscreen/dv/assets/videoMonitor/box4.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								packages/bigscreen/dv/assets/videoMonitor/card.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								packages/bigscreen/dv/assets/videoMonitor/middlebox.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 8.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								packages/bigscreen/dv/assets/videoMonitor/titlebox.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 5.2 KiB | 
							
								
								
									
										275
									
								
								packages/bigscreen/dv/components/AiGrid.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,275 @@ | ||||
| <template> | ||||
|   <div class="AiGrid" ref="container"> | ||||
|     <div | ||||
|         class="AiGrid-wrapper" | ||||
|         ref="tree" | ||||
|         id="tree" | ||||
|         :style="{left: x, top: y, transform: `scale(${scale}) translate(-50%, -50%) `, 'transform-origin': `${0} ${0}`}"> | ||||
|       <ai-okr-tree | ||||
|           :props="props" | ||||
|           node-key="id" | ||||
|           show-collapsable | ||||
|           show-node-num | ||||
|           current-lable-class-name="aigrid-active" | ||||
|           :default-expanded-keys="defaultExpandedKeys" | ||||
|           ref="VueOkrTree" | ||||
|           @node-click="onNodeClick" | ||||
|           :data="treeData"> | ||||
|       </ai-okr-tree> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| export default { | ||||
|   name: 'AiGrid', | ||||
|   props: ['instance'], | ||||
|  | ||||
|   data() { | ||||
|     return { | ||||
|       scale: 1, | ||||
|       x: '50%', | ||||
|       y: '50%', | ||||
|       defaultExpandedKeys: [], | ||||
|       treeData: [], | ||||
|       props: { | ||||
|         label: 'girdName', | ||||
|         children: 'children' | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   mounted() { | ||||
|     this.bindEvent() | ||||
|     this.getPartyOrg() | ||||
|   }, | ||||
|  | ||||
|   destroyed() { | ||||
|     document.querySelector('body').removeEventListener('mousewheel', this.onMousewheel) | ||||
|     document.querySelector('body').removeEventListener('mouseup', this.onMouseUp) | ||||
|     document.querySelector('body').removeEventListener('mousedown', this.onMousedown) | ||||
|     document.querySelector('body').removeEventListener('mousemove', this.onMouseMove) | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     bindEvent() { | ||||
|       document.querySelector('body').addEventListener('mousewheel', this.onMousewheel, true) | ||||
|       document.querySelector('body').addEventListener('mouseup', this.onMouseUp, true) | ||||
|       document.querySelector('body').addEventListener('mousedown', this.onMousedown, true) | ||||
|       document.querySelector('body').addEventListener('mousemove', this.onMouseMove, true) | ||||
|     }, | ||||
|  | ||||
|     onMousewheel(event) { | ||||
|       if (!event) return false | ||||
|       const elClass = event.target.className | ||||
|       if (elClass === 'tree' || elClass === 'middle' || (elClass && (elClass.indexOf('chart') > -1 || elClass.indexOf('user') > -1))) { | ||||
|         var dir = event.deltaY > 0 ? 'Up' : 'Down' | ||||
|         if (dir === 'Up') { | ||||
|           this.scale = this.scale - 0.12 <= 0.1 ? 0.1 : this.scale - 0.12 | ||||
|         } else { | ||||
|           this.scale = this.scale + 0.12 | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       return false | ||||
|     }, | ||||
|  | ||||
|     onMousedown(e) { | ||||
|       const elClass = e.target.className | ||||
|       if ((elClass && (elClass.indexOf('chart') > -1 || elClass.indexOf('user') > -1))) { | ||||
|         const left = document.querySelector('#tree').offsetLeft | ||||
|         const top = document.querySelector('#tree').offsetTop | ||||
|         this.isMove = true | ||||
|         this.offsetX = e.clientX - left | ||||
|         this.offsetY = e.clientY - top | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     onMouseMove(e) { | ||||
|       if (!this.isMove) return | ||||
|  | ||||
|       this.x = (e.clientX - this.offsetX) + 'px' | ||||
|       this.y = (e.clientY - this.offsetY) + 'px' | ||||
|     }, | ||||
|  | ||||
|     onMouseUp() { | ||||
|       this.isMove = false | ||||
|     }, | ||||
|  | ||||
|     onNodeClick(e) { | ||||
|       this.$emit('nodeClick', e) | ||||
|     }, | ||||
|  | ||||
|     getPartyOrg() { | ||||
|       this.instance.post('/app/appgirdinfo/listAll3').then(res => { | ||||
|         if (res.code === 0) { | ||||
|           this.treeData = res.data.filter(e => !e.parentGirdId) | ||||
|           const parentGirdId = this.treeData[0].id | ||||
|  | ||||
|           this.treeData.map(p => this.addChild(p, res.data.map(v => { | ||||
|             if (v.id === parentGirdId) { | ||||
|               this.defaultExpandedKeys.push(v.id) | ||||
|             } | ||||
|  | ||||
|             return { | ||||
|               ...v, | ||||
|               girdName: v.girdName.substr(0, 11) | ||||
|             } | ||||
|           }), { | ||||
|             parent: 'parentGirdId' | ||||
|           })) | ||||
|  | ||||
|           this.$nextTick(() => { | ||||
|             this.autoScale() | ||||
|             this.$refs.VueOkrTree.setCurrentKey(parentGirdId) | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     autoScale() { | ||||
|       const treeWidth = this.$refs.tree.offsetWidth | ||||
|       const containerWidth = this.$refs.container.offsetWidth - 100 | ||||
|       this.scale = treeWidth < containerWidth ? 1 : containerWidth / treeWidth | ||||
|       this.x = '50%' | ||||
|       this.y = '50%' | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .AiGrid { | ||||
|   position: relative; | ||||
|   width: 100%; | ||||
|   height: 100%; | ||||
|   overflow: hidden; | ||||
|   box-sizing: border-box; | ||||
|  | ||||
|   .AiGrid-wrapper { | ||||
|     display: flex; | ||||
|     position: absolute; | ||||
|     align-items: center; | ||||
|     left: 50%; | ||||
|     top: 50%; | ||||
|     padding: 20px; | ||||
|     overflow: hidden; | ||||
|     width: max-content; | ||||
|     height: 300%; | ||||
|   } | ||||
|  | ||||
|   .aigrid-active { | ||||
|     background: linear-gradient(180deg, #42C6CE 0%, #307598 100%); | ||||
|   } | ||||
|  | ||||
|   :deep( .org-chart-container ){ | ||||
|     color: #FFFFFF; | ||||
|     font-size: 16px; | ||||
|  | ||||
|     .org-chart-node-children { | ||||
|       display: flex; | ||||
|       justify-content: center; | ||||
|       float: initial !important; | ||||
|     } | ||||
|  | ||||
|     .org-chart-node-btn { | ||||
|       border: 1px solid #23A0AC !important; | ||||
|       font-size: 16px; | ||||
|       font-weight: bold; | ||||
|       background: #071030; | ||||
|       color: #FF9A02; | ||||
|  | ||||
|       &:after, &::before { | ||||
|         display: none; | ||||
|       } | ||||
|  | ||||
|       &.expanded::before { | ||||
|         display: block; | ||||
|         position: absolute; | ||||
|         top: 50%; | ||||
|         left: 4px; | ||||
|         right: 4px; | ||||
|         height: 0; | ||||
|         border-top: 1px solid #FF9A02; | ||||
|         content: ""; | ||||
|       } | ||||
|  | ||||
|       .org-chart-node-btn-text { | ||||
|         background: transparent; | ||||
|         color: #FF9A02; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .org-chart-node { | ||||
|       // overflow: hidden; | ||||
|  | ||||
|       .org-chart-node-label { | ||||
|         width: 40px; | ||||
|         height: 254px; | ||||
|         margin-right: 15px; | ||||
|         padding: 0 0; | ||||
|  | ||||
|         .org-chart-node-label-inner { | ||||
|           width: 40px !important; | ||||
|           height: 254px !important; | ||||
|           border: 1px solid; | ||||
|           background: linear-gradient(180deg, rgba(69, 210, 218, 0.2500) 0%, rgba(69, 210, 218, 0.1000) 100%) !important; | ||||
|           border-image: linear-gradient(180deg, rgba(5, 185, 203, 1), rgba(73, 214, 207, 1)) 1 1 !important; | ||||
|           line-height: 1.3; | ||||
|           padding: 10px 8px; | ||||
|           text-align: center; | ||||
|           font-size: 18px; | ||||
|           color: rgba(255, 255, 255, 0.8); | ||||
|  | ||||
|           &.aigrid-active { | ||||
|             background: linear-gradient(180deg, #42C6CE 0%, #307598 100%) !important; | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         &.is-root-label { | ||||
|           width: auto !important; | ||||
|           min-width: 240px; | ||||
|           height: 40px !important; | ||||
|           line-height: 40px !important; | ||||
|           min-height: 40px !important; | ||||
|           text-align: center; | ||||
|  | ||||
|           .org-chart-node-label-inner { | ||||
|             padding: 0 30px !important; | ||||
|             color: #fff !important; | ||||
|             width: auto !important; | ||||
|             min-width: 240px; | ||||
|             height: 40px !important; | ||||
|             line-height: 40px !important; | ||||
|             min-height: 40px !important; | ||||
|             text-align: center; | ||||
|             background: linear-gradient(180deg, rgba(69, 210, 218, 0.2500) 0%, rgba(69, 210, 218, 0.1000) 100%) !important; | ||||
|             border-image: linear-gradient(180deg, rgba(5, 185, 203, 1), rgba(73, 214, 207, 1)) 1 1 !important; | ||||
|  | ||||
|             &.aigrid-active { | ||||
|               background: linear-gradient(180deg, #42C6CE 0%, #307598 100%) !important; | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       &:last-child { | ||||
|         .org-chart-node-label { | ||||
|           margin-right: 0; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .org-chart-node-children:before, .org-chart-node:after, .org-chart-node:last-child:before, | ||||
|     .org-chart-node.is-leaf:before { | ||||
|       border-radius: 0; | ||||
|       border-color: #23A0AC !important; | ||||
|     } | ||||
|  | ||||
|     .vertical .org-chart-node:after, .vertical .org-chart-node:before { | ||||
|       border-radius: 0; | ||||
|       border-color: #23A0AC !important; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										133
									
								
								packages/bigscreen/dv/components/DonutChart.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,133 @@ | ||||
| <template> | ||||
|   <div class="DonutChart" :id="id"> | ||||
|     <canvas :id="canvasId"></canvas> | ||||
|     <div class="DonutChart-text"> | ||||
|       <span>{{ ratio || 0 }}%</span> | ||||
|       <i>{{ text }}</i> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   export default { | ||||
|     props: ['ratio', 'text'], | ||||
|  | ||||
|     data () { | ||||
|       return { | ||||
|         id: `DonutChart-${Math.ceil(Math.random() * 10000)}`, | ||||
|         canvasId: `DonutChartCanvas-${Math.ceil(Math.random() * 10000)}`, | ||||
|         canvasWidth: 90, | ||||
|         canvasHeight: 90 | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     mounted () { | ||||
|       this.$nextTick(() => { | ||||
|         this.init() | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     methods: { | ||||
|       drawLine(ctx, options) { | ||||
|         const { beginX, beginY, endX, endY, lineColor, lineWidth } = options | ||||
|         ctx.lineWidth = lineWidth | ||||
|         ctx.strokeStyle = lineColor | ||||
|         ctx.beginPath() | ||||
|         ctx.moveTo(beginX, beginY) | ||||
|         ctx.lineTo(endX, endY) | ||||
|         ctx.closePath() | ||||
|         ctx.stroke() | ||||
|       }, | ||||
|  | ||||
|       angle (a, i, ox, oy, or) { | ||||
|         var hudu = (2 * Math.PI / 360) * a * i | ||||
|         var x = ox + Math.sin(hudu) * or | ||||
|         var y = oy - Math.cos(hudu) * or | ||||
|         return x + '_' + y | ||||
|       }, | ||||
|  | ||||
|       mapColor (value) { | ||||
|         if (value < 25) { | ||||
|           return '#FFC139' | ||||
|         } | ||||
|  | ||||
|         if (value < 50) { | ||||
|           return '#21E03E' | ||||
|         } | ||||
|  | ||||
|         return '#05C8FF' | ||||
|       }, | ||||
|  | ||||
|       init () { | ||||
|         const ctx = document.querySelector(`#${this.canvasId}`).getContext('2d') | ||||
|         const canvasWidth = document.querySelector(`#${this.id}`).offsetWidth | ||||
|         const canvasHeight = document.querySelector(`#${this.id}`).offsetHeight | ||||
|         const angle = this.ratio / 100 * 2 | ||||
|         let radian = 0 | ||||
|  | ||||
|         ctx.width = canvasWidth | ||||
|         ctx.height = canvasHeight | ||||
|         const x = canvasWidth / 2 | ||||
|         const y = canvasHeight / 2 | ||||
|         ctx.lineWidth = 2 | ||||
|         ctx.strokeStyle = '#383f56' | ||||
|         ctx.beginPath(); | ||||
|         ctx.arc(x, y, x - 3, 0, 2 * Math.PI) | ||||
|         ctx.stroke() | ||||
|  | ||||
|         ctx.beginPath() | ||||
|         ctx.lineWidth = 4 | ||||
|         ctx.strokeStyle = 'rgba(76, 202, 227, 1)' | ||||
|  | ||||
|         if (this.ratio < 25) { | ||||
|           radian = 3 / 2 + angle | ||||
|           ctx.arc(x, y, x - 4, Math.PI + Math.PI / 2, Math.PI * radian, false) | ||||
|         } else if (this.ratio === 100) { | ||||
|           ctx.arc(x, y, x - 4, 0, Math.PI * 2) | ||||
|         } else { | ||||
|           radian = (this.ratio - 25) / 100 * 2 | ||||
|           ctx.arc(x, y, x - 4, Math.PI + Math.PI / 2, Math.PI * radian, false) | ||||
|         } | ||||
|         ctx.stroke() | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
|   .DonutChart { | ||||
|     position: relative; | ||||
|     width: 84px; | ||||
|     height: 84px; | ||||
|     overflow: hidden; | ||||
|  | ||||
|     .DonutChart-text { | ||||
|       display: flex; | ||||
|       position: absolute; | ||||
|       align-items: center; | ||||
|       justify-content: center; | ||||
|       flex-direction: column; | ||||
|       top: 50%; | ||||
|       left: 50%; | ||||
|       z-index: 1; | ||||
|       width: 100%; | ||||
|       height: 100%; | ||||
|       line-height: 1; | ||||
|       transform: translate(-50%, -50%); | ||||
|  | ||||
|       span { | ||||
|         margin-bottom: 8px; | ||||
|         font-size: 20px; | ||||
|         font-weight: bold; | ||||
|         color: #fff; | ||||
|         font-style: oblique; | ||||
|       } | ||||
|  | ||||
|       i { | ||||
|         font-size: 12px; | ||||
|         font-style: normal; | ||||
|         color: rgba(42, 183, 209, 1); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </style> | ||||
							
								
								
									
										190
									
								
								packages/bigscreen/dv/components/DoughnutChart.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,190 @@ | ||||
| <template> | ||||
|   <div class="DoughnutChart-wrapper"> | ||||
|     <div class="DoughnutChart" :id="id"> | ||||
|       <canvas :id="canvasId"></canvas> | ||||
|       <div class="DonutChart-text"> | ||||
|         <span>{{ ratio }}%</span> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div class="DoughnutChart-explain"> | ||||
|       <div class="item" v-for="(item, index) in value" :key="index"> | ||||
|         <i></i> | ||||
|         <span :style="labelStyle">{{ item.key }}</span> | ||||
|         <p>{{ item.value }}</p> | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   export default { | ||||
|     props: ['ratio', 'value', 'labelStyle'], | ||||
|  | ||||
|     data () { | ||||
|       return { | ||||
|         id: `DonutChart-${Math.ceil(Math.random() * 10000)}`, | ||||
|         canvasId: `DonutChartCanvas-${Math.ceil(Math.random() * 10000)}`, | ||||
|         canvasWidth: 90, | ||||
|         canvasHeight: 90 | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     watch: { | ||||
|       ratio () { | ||||
|         this.init() | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     mounted () { | ||||
|       this.$nextTick(() => { | ||||
|         this.init() | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     methods: { | ||||
|       drawLine(ctx, options) { | ||||
|         const { beginX, beginY, endX, endY, lineColor, lineWidth } = options | ||||
|         ctx.lineWidth = lineWidth | ||||
|         ctx.strokeStyle = lineColor | ||||
|         ctx.beginPath() | ||||
|         ctx.moveTo(beginX, beginY) | ||||
|         ctx.lineTo(endX, endY) | ||||
|         ctx.closePath() | ||||
|         ctx.stroke() | ||||
|       }, | ||||
|  | ||||
|       angle (a, i, ox, oy, or) { | ||||
|         var hudu = (2 * Math.PI / 360) * a * i | ||||
|         var x = ox + Math.sin(hudu) * or | ||||
|         var y = oy - Math.cos(hudu) * or | ||||
|         return x + '_' + y | ||||
|       }, | ||||
|  | ||||
|       mapColor (value) { | ||||
|         if (value < 25) { | ||||
|           return '#FFC139' | ||||
|         } | ||||
|  | ||||
|         if (value < 50) { | ||||
|           return '#21E03E' | ||||
|         } | ||||
|  | ||||
|         return '#05C8FF' | ||||
|       }, | ||||
|  | ||||
|       init () { | ||||
|         const ctx = document.querySelector(`#${this.canvasId}`).getContext('2d') | ||||
|         const canvasWidth = document.querySelector(`#${this.id}`).offsetWidth | ||||
|         const canvasHeight = document.querySelector(`#${this.id}`).offsetHeight | ||||
|         const angle = this.ratio / 100 * 2 | ||||
|         let radian = 0 | ||||
|  | ||||
|         ctx.width = canvasWidth | ||||
|         ctx.height = canvasHeight | ||||
|         const x = canvasWidth / 2 | ||||
|         const y = canvasHeight / 2 | ||||
|         ctx.lineWidth = 4 | ||||
|         ctx.strokeStyle = 'rgba(102, 121, 138, 0.3)' | ||||
|         ctx.beginPath(); | ||||
|         ctx.arc(x, y, x - 8, 0, 2 * Math.PI) | ||||
|         ctx.stroke() | ||||
|  | ||||
|         ctx.beginPath() | ||||
|         ctx.lineWidth = 4 | ||||
|         var g = ctx.createLinearGradient(0, 0, 0, 80) | ||||
|         g.addColorStop(0, 'rgba(44, 150, 231, 0.8)') | ||||
|         g.addColorStop(1, 'rgba(92, 255, 243, 1)') | ||||
|         ctx.strokeStyle = g | ||||
|  | ||||
|         if (this.ratio < 25) { | ||||
|           radian = 3 / 2 + angle | ||||
|           ctx.arc(x, y, x - 8, Math.PI + Math.PI / 2, Math.PI * radian, false) | ||||
|         } else if (this.ratio === 100) { | ||||
|           ctx.arc(x, y, x - 8, 0, Math.PI * 2) | ||||
|         } else { | ||||
|           radian = (this.ratio - 25) / 100 * 2 | ||||
|           ctx.arc(x, y, x - 8, Math.PI + Math.PI / 2, Math.PI * radian, false) | ||||
|         } | ||||
|         ctx.stroke() | ||||
|  | ||||
|         ctx.beginPath() | ||||
|         ctx.strokeStyle = 'rgba(102, 121, 138, 0.4)' | ||||
|         ctx.lineWidth = 1 | ||||
|         ctx.arc(x, y, x - 15, 0, 2 * Math.PI) | ||||
|         ctx.stroke() | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
|   .DoughnutChart-wrapper { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: space-between; | ||||
|     height: 100%; | ||||
|     padding-top: 12px; | ||||
|  | ||||
|     .DoughnutChart-explain { | ||||
|       flex: 1; | ||||
|       margin-left: 10px; | ||||
|  | ||||
|       .item { | ||||
|         display: flex; | ||||
|         align-items: center; | ||||
|  | ||||
|         &:first-child { | ||||
|           margin-bottom: 10px; | ||||
|         } | ||||
|  | ||||
|         i { | ||||
|           width: 8px; | ||||
|           height: 8px; | ||||
|           margin-right: 6px; | ||||
|           border-radius: 50%; | ||||
|           background: #5AF9F0; | ||||
|         } | ||||
|  | ||||
|         span { | ||||
|           width: 78px; | ||||
|           font-weight: 400; | ||||
|           font-size: 14px; | ||||
|           color: #9BB7D4; | ||||
|         } | ||||
|  | ||||
|         p { | ||||
|           font-size: 14px; | ||||
|           color: #FFFFFF; | ||||
|         } | ||||
|  | ||||
|         &:last-child i { | ||||
|           background: rgba(102, 121, 138, 0.3); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|  | ||||
|     .DoughnutChart { | ||||
|       position: relative; | ||||
|       width: 90px; | ||||
|       height: 90px; | ||||
|       overflow: hidden; | ||||
|  | ||||
|       .DonutChart-text { | ||||
|         display: flex; | ||||
|         position: absolute; | ||||
|         justify-content: center; | ||||
|         top: 50%; | ||||
|         left: 50%; | ||||
|         z-index: 1; | ||||
|         transform: translate(-50%, -50%); | ||||
|  | ||||
|         span { | ||||
|           font-size: 17px; | ||||
|           font-weight: bold; | ||||
|           color: #02FEFF; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </style> | ||||
							
								
								
									
										386
									
								
								packages/bigscreen/dv/components/DvMap.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,386 @@ | ||||
| <template> | ||||
|   <div class="AiDvMap"> | ||||
|     <div class="chart-map" :class="v" style="width: 100%; height: 100%"></div> | ||||
|     <transition name="fade"> | ||||
|       <div class="info" v-if="isShowInfo"> | ||||
|         <div class="info-mask" @click="isShowInfo = false"></div> | ||||
|         <div class="info-content"> | ||||
|           <div class="info-title"> | ||||
|             <h2>{{ title }}</h2> | ||||
|           </div> | ||||
|           <img src="https://cdn.cunwuyun.cn/dvcp/dv/qxn/close.png" @click="isShowInfo = false" /> | ||||
|           <div class="info-wrapper" v-if="type === '0'"> | ||||
|             <div class="info-wrapper__item"> | ||||
|               <label>下属单位:</label> | ||||
|               <span>{{ info['派出所数量'] }}个派出所</span> | ||||
|             </div> | ||||
|             <div class="info-wrapper__item"> | ||||
|               <label>居民群:</label> | ||||
|               <span>{{ info['群数量'] }}</span> | ||||
|             </div> | ||||
|             <div class="info-wrapper__item"> | ||||
|               <label>成员人数:</label> | ||||
|               <span>{{ info['成员总数'] }}</span> | ||||
|             </div> | ||||
|             <div class="info-wrapper__item"> | ||||
|               <label>群人数:</label> | ||||
|               <span>{{ info['群成员数量'] }}</span> | ||||
|             </div> | ||||
|             <div class="info-wrapper__item"> | ||||
|               <label>激活比例:</label> | ||||
|               <span>{{ rate }}</span> | ||||
|             </div> | ||||
|             <div class="info-wrapper__item"> | ||||
|               <label>好友人数:</label> | ||||
|               <span>{{ info['外部联系人数量'] }}</span> | ||||
|             </div> | ||||
|             <div class="info-wrapper__item"> | ||||
|               <label>群主人数:</label> | ||||
|               <span>{{ info['群主人数'] }}</span> | ||||
|             </div> | ||||
|           </div> | ||||
|           <div class="info-wrapper" v-else> | ||||
|             <div class="info-wrapper__item"> | ||||
|               <label>负责人:</label> | ||||
|               <span>{{ info['负责人'] }}</span> | ||||
|             </div> | ||||
|             <div class="info-wrapper__item"> | ||||
|               <label>下属警格数:</label> | ||||
|               <span>{{ info['下属警格数量'] }}</span> | ||||
|             </div> | ||||
|             <div class="info-wrapper__item"> | ||||
|               <label>警格人数:</label> | ||||
|               <span>{{ info['外部联系人数量'] }}</span> | ||||
|             </div> | ||||
|             <div class="info-wrapper__item"> | ||||
|               <label>事件处理率:</label> | ||||
|               <span>{{ rate }}</span> | ||||
|             </div> | ||||
|             <div class="info-wrapper__item"> | ||||
|               <label>待处理:</label> | ||||
|               <span>{{ info['待受理'] }}</span> | ||||
|             </div> | ||||
|             <div class="info-wrapper__item"> | ||||
|               <label>处理中:</label> | ||||
|               <span>{{ info['办理中'] }}</span> | ||||
|             </div> | ||||
|             <div class="info-wrapper__item"> | ||||
|               <label>已办理:</label> | ||||
|               <span>{{ info['已办结'] }}</span> | ||||
|             </div> | ||||
|             <div class="info-wrapper__item"> | ||||
|               <label>事件总数:</label> | ||||
|               <span>{{ info['事件总数'] }}</span> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </transition> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|  | ||||
|  | ||||
|   export default { | ||||
|     name: 'AiDvMap', | ||||
|  | ||||
|     props: { | ||||
|       instance: Function, | ||||
|       type: String | ||||
|     }, | ||||
|  | ||||
|     data() { | ||||
|       return { | ||||
|         info: {}, | ||||
|         timer: null, | ||||
|         title: '', | ||||
|         v: `AiDvMap-${new Date().getTime()}`, | ||||
|         chart: null, | ||||
|         isShowInfo: false, | ||||
|         geoJSON: require('./geoJSon/qxnGeoJSON.json') | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     computed: { | ||||
|       rate () { | ||||
|         if (!this.info['事件总数']) { | ||||
|           return '0%' | ||||
|         } | ||||
|  | ||||
|         return ((this.info['事件总数'] - this.info['待受理']) / this.info['事件总数']).toFixed(4) * 100 + '%' | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     mounted() { | ||||
|       this.$nextTick(() => { | ||||
|         this.initChart() | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     methods: { | ||||
|       initChart() { | ||||
|         this.chart = echarts.init(document.querySelector(`.${this.v}`)) | ||||
|         echarts.registerMap('黔西南', this.geoJSON) | ||||
|  | ||||
|         let option = { | ||||
|           geo: [ | ||||
|             { | ||||
|               map: "黔西南", | ||||
|               aspectScale: 1, | ||||
|               zoom: 0.65, | ||||
|               layoutCenter: ["50%", "50%"], | ||||
|               layoutSize: "180%", | ||||
|               show: true, | ||||
|               roam: false, | ||||
|               emphasis: { | ||||
|                 show: true, | ||||
|                 label: { | ||||
|                   textStyle: { | ||||
|                     color: "#FFFFFF" | ||||
|                   }, | ||||
|                 }, | ||||
|                 itemStyle: { | ||||
|                   // areaColor: '#fff' | ||||
|                 } | ||||
|               }, | ||||
|               label: { | ||||
|                 normal: { | ||||
|                   show: true, | ||||
|                   color: '#fff', | ||||
|                   fontSize: '14' | ||||
|                 } | ||||
|               }, | ||||
|               itemStyle: { | ||||
|                 normal: { | ||||
|                   borderColor: "rgba(2, 254, 255, 0.7)", | ||||
|                   borderWidth: 2, | ||||
|                   shadowColor: "rgba(2, 254, 255, 0.1)", | ||||
|                   shadowOffsetY: 10, | ||||
|                   shadowBlur: 120, | ||||
|                   areaColor: "#0f7295", | ||||
|                 }, | ||||
|               } | ||||
|             }, | ||||
|             // 重影 | ||||
|             { | ||||
|               type: "map", | ||||
|               map: "黔西南", | ||||
|               zlevel: -1, | ||||
|               aspectScale: 1, | ||||
|               zoom: 0.65, | ||||
|               layoutCenter: ["50%", "51%"], | ||||
|               layoutSize: "180%", | ||||
|               roam: false, | ||||
|               silent: true, | ||||
|               itemStyle: { | ||||
|                 normal: { | ||||
|                   borderWidth: 1, | ||||
|                   // borderColor:"rgba(17, 149, 216,0.6)", | ||||
|                   borderColor: "rgba(2, 254, 255, 0.3)", | ||||
|                   shadowColor: "rgba(2, 254, 255, 0.3)", | ||||
|                   shadowOffsetY: 5, | ||||
|                   shadowBlur: 15, | ||||
|                   areaColor: "rgba(5,21,35,0.1)", | ||||
|                 }, | ||||
|               }, | ||||
|             }, | ||||
|             { | ||||
|               type: "map", | ||||
|               map: "黔西南", | ||||
|               zlevel: -2, | ||||
|               aspectScale: 1, | ||||
|               zoom: 0.65, | ||||
|               layoutCenter: ["50%", "52%"], | ||||
|               layoutSize: "180%", | ||||
|               roam: false, | ||||
|               silent: true, | ||||
|               itemStyle: { | ||||
|                 normal: { | ||||
|                   borderWidth: 1, | ||||
|                   // borderColor: "rgba(57, 132, 188,0.4)", | ||||
|                   borderColor: "rgba(2, 254, 255, 0.2)", | ||||
|                   shadowColor: "rgba(2, 254, 255, 0.24)", | ||||
|                   shadowOffsetY: 5, | ||||
|                   shadowBlur: 15, | ||||
|                   areaColor: "transpercent", | ||||
|                 }, | ||||
|               }, | ||||
|             }, | ||||
|             { | ||||
|               type: "map", | ||||
|               map: "黔西南", | ||||
|               zlevel: -3, | ||||
|               aspectScale: 1, | ||||
|               zoom: 0.65, | ||||
|               layoutCenter: ["50%", "53%"], | ||||
|               layoutSize: "180%", | ||||
|               roam: false, | ||||
|               silent: true, | ||||
|               itemStyle: { | ||||
|                 normal: { | ||||
|                   borderWidth: 1, | ||||
|                   // borderColor: "rgba(11, 43, 97,0.8)", | ||||
|                   borderColor: "rgba(2, 254, 255, 0.1)", | ||||
|                   shadowColor: "rgba(2, 254, 255, 0.1)", | ||||
|                   shadowOffsetY: 15, | ||||
|                   shadowBlur: 10, | ||||
|                   areaColor: "transpercent", | ||||
|                 }, | ||||
|               }, | ||||
|             } | ||||
|           ], | ||||
|           series: [ | ||||
|             { | ||||
|               type: 'scatter', | ||||
|               map: "黔西南", | ||||
|               coordinateSystem: 'geo', | ||||
|               z: 3, | ||||
|               zlevel: 3, | ||||
|               // symbol: 'none', | ||||
|               symbolSize: 16, | ||||
|               rippleEffect: { | ||||
|                 period: 2, | ||||
|                 scale: 4, | ||||
|                 brushType: 'fill' | ||||
|               }, | ||||
|               label: { | ||||
|                   show: false | ||||
|               }, | ||||
|               roam: false, | ||||
|               itemStyle: { | ||||
|                 normal: { | ||||
|                   areaColor: '#000', | ||||
|                   borderColor: '#a18a3a', | ||||
|                   borderWidth: 1 | ||||
|                 }, | ||||
|                 emphasis: { | ||||
|                   show: false, | ||||
|                   areaColor: null | ||||
|                 } | ||||
|               }, | ||||
|               data: [] | ||||
|             } | ||||
|           ] | ||||
|         } | ||||
|         this.chart.setOption(option) | ||||
|         this.chart.on('click', e => { | ||||
|           this.getInfo(e.name) | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       getInfo (name) { | ||||
|         this.title = `${name}公安局` | ||||
|         this.instance.post(`/api/wxgridinfo/comprehensiveOverviewMap`, null, { | ||||
|           params: { | ||||
|             gridName: `${name}公安局`, | ||||
|             corpId: 'wwb182f88f0327b37f' | ||||
|           } | ||||
|         }).then(res => { | ||||
|           if (res.code === 0) { | ||||
|             this.info = res.data | ||||
|             this.isShowInfo = true | ||||
|           } | ||||
|         }) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
|   .AiDvMap { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: center; | ||||
|     width: 100%; | ||||
|     height: 100%; | ||||
|  | ||||
|     .info { | ||||
|       position: fixed; | ||||
|       left: 0; | ||||
|       top: 0; | ||||
|       z-index: 111; | ||||
|       width: 100%; | ||||
|       height: 100%; | ||||
|       overflow: hidden; | ||||
|  | ||||
|       .info-mask { | ||||
|         position: absolute; | ||||
|         left: 0; | ||||
|         top: 0; | ||||
|         z-index: 1; | ||||
|         width: 100%; | ||||
|         height: 100%; | ||||
|         background: rgba($color: #000000, $alpha: 0.1); | ||||
|       } | ||||
|  | ||||
|       .info-content { | ||||
|         position: absolute; | ||||
|         top: 50%; | ||||
|         left: 50%; | ||||
|         z-index: 11; | ||||
|         width: 390px; | ||||
|         height: 262px; | ||||
|         padding: 15px 18px 0; | ||||
|         background: url(https://cdn.cunwuyun.cn/dvcp/dv/qxn/info-bg.png); | ||||
|         background-size: 100% 100%; | ||||
|         transform: translate(-50%, -50%); | ||||
|  | ||||
|         .info-wrapper { | ||||
|           display: flex; | ||||
|           flex-wrap: wrap; | ||||
|           justify-content: space-between; | ||||
|           margin-top: 40px; | ||||
|  | ||||
|           .info-wrapper__item { | ||||
|             display: flex; | ||||
|             align-items: center; | ||||
|             width: 50%; | ||||
|             line-height: 1; | ||||
|             margin-bottom: 20px; | ||||
|  | ||||
|             label { | ||||
|               width: 90px; | ||||
|               margin-right: 10px; | ||||
|               color: #fff; | ||||
|               text-align: right; | ||||
|               font-size: 14px; | ||||
|               font-weight: 500; | ||||
|             } | ||||
|  | ||||
|             span { | ||||
|               flex: 1; | ||||
|               font-size: 14px; | ||||
|               color: #FF8533; | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         img { | ||||
|           position: absolute; | ||||
|           top: 30px; | ||||
|           right: 18px; | ||||
|           z-index: 1; | ||||
|           width: 24px; | ||||
|           height: 24px; | ||||
|           cursor: pointer; | ||||
|           transition: all ease 300ms; | ||||
|  | ||||
|           &:hover { | ||||
|             opacity: 0.6; | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         .info-title { | ||||
|           display: flex; | ||||
|           align-items: center; | ||||
|  | ||||
|           h2 { | ||||
|             font-size: 16px; | ||||
|             color: #fff; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </style> | ||||
							
								
								
									
										483
									
								
								packages/bigscreen/dv/components/PdGrid.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,483 @@ | ||||
| <template> | ||||
|   <div class="pdgrid"> | ||||
|     <div class="pdgrid-title"> | ||||
|       <h2>{{ currGird }}</h2> | ||||
|     </div> | ||||
|     <div class="pdgrid-grid__title" @click="isShowGrid2 = true"> | ||||
|       <h2 :title="girdName2">{{ girdName2 }}</h2> | ||||
|     </div> | ||||
|     <div class="pdgrid-body"> | ||||
|       <div class="pdgrid-body__item" @click="isShowGrid3 = true"> | ||||
|         <h2>{{ girdNum3 }}</h2> | ||||
|         <div class="bottom"> | ||||
|           <i></i> | ||||
|           <p>{{ girdName3 }}</p> | ||||
|           <i class="right"></i> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="pdgrid-body__item" @click.stop="isShowGrid4 = true"> | ||||
|         <h2>{{ girdNum4 }}</h2> | ||||
|         <div class="bottom"> | ||||
|           <i></i> | ||||
|           <p>{{ girdName4 }}</p> | ||||
|           <i class="right"></i> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="pdgrid-body__item" @click="isShowGrid5 = true"> | ||||
|         <h2>{{ girdNum5 }}</h2> | ||||
|         <div class="bottom"> | ||||
|           <i></i> | ||||
|           <p>{{ girdName5 }}</p> | ||||
|           <i class="right"></i> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|     <transition name="fade"> | ||||
|       <div class="grid-dialog" v-show="isShowGrid2"> | ||||
|         <div class="mask" @click="isShowGrid2 = false"></div> | ||||
|         <div class="grid-container"> | ||||
|           <h2 :title="girdName2">{{ girdName2 }}</h2> | ||||
|           <div class="grid-list"> | ||||
|             <div | ||||
|               :class="[currIndex2 === index ? 'grid-active' : '']" | ||||
|               v-for="(item, index) in girdInfoList2" | ||||
|               :key="index" | ||||
|               :title="item.girdName" | ||||
|               @click.stop="onGrid2Click(item, index)"> | ||||
|               {{ item.girdName }} | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </transition> | ||||
|     <transition name="fade"> | ||||
|       <div class="grid-dialog" v-show="isShowGrid3"> | ||||
|         <div class="mask" @click="isShowGrid3 = false"></div> | ||||
|         <div class="grid-container"> | ||||
|           <h2 :title="girdName3">{{ girdName3 }}</h2> | ||||
|           <div class="grid-list"> | ||||
|             <div | ||||
|               :class="[currIndex3 === index ? 'grid-active' : '']" | ||||
|               v-for="(item, index) in girdInfoList3" | ||||
|               :key="index" | ||||
|               :title="item.girdName" | ||||
|               @click.stop="onGrid3Click(item, index)"> | ||||
|               {{ item.girdName }} | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </transition> | ||||
|     <transition name="fade"> | ||||
|       <div class="grid-dialog" v-show="isShowGrid4"> | ||||
|         <div class="mask" @click="isShowGrid4 = false"></div> | ||||
|         <div class="grid-container"> | ||||
|           <h2 :title="girdName4">{{ girdName4 }}</h2> | ||||
|           <div class="grid-list"> | ||||
|             <div | ||||
|               :class="[currIndex4 === index ? 'grid-active' : '']" | ||||
|               v-for="(item, index) in girdInfoList4" | ||||
|               :key="index" | ||||
|               :title="item.girdName" | ||||
|               @click.stop="onGrid4Click(item, index)"> | ||||
|               {{ item.girdName }} | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </transition> | ||||
|     <transition name="fade"> | ||||
|       <div class="grid-dialog" v-show="isShowGrid5"> | ||||
|         <div class="mask" @click="isShowGrid5 = false"></div> | ||||
|         <div class="grid-container"> | ||||
|           <h2 :title="girdName5">{{ girdName5 }}</h2> | ||||
|           <div class="grid-list"> | ||||
|             <div | ||||
|               :class="[currIndex5 === index ? 'grid-active' : '']" | ||||
|               v-for="(item, index) in girdInfoList5" | ||||
|               :key="index" | ||||
|               :title="item.girdName" | ||||
|               @click.stop="onGrid5Click(item, index)"> | ||||
|               {{ item.girdName }} | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </transition> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   export default { | ||||
|     name: 'pdgrid', | ||||
|  | ||||
|     props: ['instance'], | ||||
|  | ||||
|     data () { | ||||
|       return { | ||||
|         isShowGrid2: false, | ||||
|         isShowGrid3: false, | ||||
|         isShowGrid4: false, | ||||
|         isShowGrid5: false, | ||||
|         currIndex2: 0, | ||||
|         currIndex3: 0, | ||||
|         currIndex4: 0, | ||||
|         currIndex5: 0, | ||||
|         girdInfoList2: [], | ||||
|         girdInfoList3: [], | ||||
|         girdInfoList4: [], | ||||
|         girdInfoList5: [], | ||||
|         girdName2: '', | ||||
|         girdName3: '', | ||||
|         girdName4: '', | ||||
|         girdName5: '', | ||||
|         girdNum3: 0, | ||||
|         girdNum4: 0, | ||||
|         girdNum5: 0, | ||||
|         currGird: '' | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     mounted () { | ||||
|       this.$nextTick(() => { | ||||
|         document.addEventListener('keydown', this.onKeyDown) | ||||
|       }) | ||||
|       this.getInfo() | ||||
|     }, | ||||
|  | ||||
|     destroyed () { | ||||
|       document.removeEventListener('keydown', this.onKeyDown) | ||||
|     }, | ||||
|  | ||||
|     methods: { | ||||
|       onKeyDown (e) { | ||||
|         if (e.keyCode == 27) { | ||||
|           this.isShowGrid2 = false | ||||
|           this.isShowGrid3 = false | ||||
|           this.isShowGrid4 = false | ||||
|           this.isShowGrid5 = false | ||||
|         } | ||||
|       }, | ||||
|  | ||||
|       onGrid2Click (item, index) { | ||||
|         this.currIndex2 = index | ||||
|         this.girdName2 = item.girdName | ||||
|         this.currIndex3 = -1 | ||||
|         this.currIndex4 = -1 | ||||
|         this.currIndex5 = -1 | ||||
|         this.isShowGrid2 = false | ||||
|         this.girdInfoList3 = [] | ||||
|         this.girdInfoList4 = [] | ||||
|         this.girdInfoList5 = [] | ||||
|         this.$emit('nodeClick', item.id) | ||||
|  | ||||
|         this.currGird = item.girdName | ||||
|         this.getInfo(item.id) | ||||
|       }, | ||||
|  | ||||
|       onGrid3Click (item, index) { | ||||
|         this.currIndex3 = index | ||||
|         this.girdName3 = item.girdName | ||||
|         this.currIndex4 = -1 | ||||
|         this.currIndex5 = -1 | ||||
|         this.girdNum3 = 1 | ||||
|         this.isShowGrid3 = false | ||||
|         this.$emit('nodeClick', item.id) | ||||
|         this.girdInfoList4 = [] | ||||
|         this.girdInfoList5 = [] | ||||
|         this.currGird = item.girdName | ||||
|         this.getInfo(item.id) | ||||
|       }, | ||||
|  | ||||
|       onGrid4Click (item, index) { | ||||
|         this.currIndex4 = index | ||||
|         this.girdName4 = item.girdName | ||||
|         this.currIndex5 = -1 | ||||
|         this.girdNum4 = 1 | ||||
|         this.isShowGrid4 = false | ||||
|         this.$emit('nodeClick', item.id) | ||||
|         this.girdInfoList5 = [] | ||||
|  | ||||
|         this.currGird = item.girdName | ||||
|         this.getInfo(item.id) | ||||
|       }, | ||||
|  | ||||
|       onGrid5Click (item, index) { | ||||
|         this.currIndex5 = index | ||||
|         this.girdName5 = item.girdName | ||||
|         this.isShowGrid5 = false | ||||
|         this.girdNum5 = 1 | ||||
|         this.$emit('nodeClick', item.id) | ||||
|  | ||||
|         this.currGird = item.girdName | ||||
|         this.getInfo(item.id) | ||||
|       }, | ||||
|  | ||||
|       getInfo (id) { | ||||
|         this.instance.post(`/app/appgirdinfo/queryPdDetailByGirdId?id=${id || ''}`).then(res => { | ||||
|           if (res.code === 0) { | ||||
|             res.data.girdInfoList2 && (this.girdInfoList2 = res.data.girdInfoList2) | ||||
|             res.data.girdInfoList3 && (this.girdInfoList3 = res.data.girdInfoList3) | ||||
|             res.data.girdInfoList4 && (this.girdInfoList4 = res.data.girdInfoList4) | ||||
|             res.data.girdInfoList5 && (this.girdInfoList5 = res.data.girdInfoList5) | ||||
|  | ||||
|             res.data.girdName2 && (this.girdName2 = res.data.girdName2) | ||||
|             res.data.girdName3 && (this.girdName3 = res.data.girdName3) | ||||
|             res.data.girdName4 && (this.girdName4 = res.data.girdName4) | ||||
|             res.data.girdName5 && (this.girdName5 = res.data.girdName5) | ||||
|  | ||||
|             res.data.girdNum3 != null && (this.girdNum3 = res.data.girdNum3) | ||||
|             res.data.girdNum4 != null && (this.girdNum4 = res.data.girdNum4) | ||||
|             res.data.girdNum5 != null && (this.girdNum5 = res.data.girdNum5) | ||||
|  | ||||
|             if (!id) { | ||||
|               this.currGird = res.data.girdName2 | ||||
|               this.currIndex2 = res.data.girdInfoList2.findIndex(v => res.data.girdName2 === v.girdName) | ||||
|             } | ||||
|           } | ||||
|         }) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss"> | ||||
|   .pdgrid { | ||||
|     position: relative; | ||||
|     width: 100%; | ||||
|     height: 100%; | ||||
|     overflow: hidden; | ||||
|     box-sizing: border-box; | ||||
|     background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/middle-bg.png) no-repeat center; | ||||
|     background-size: contain; | ||||
|  | ||||
|     .fade-enter-active, .fade-leave-active { | ||||
|       transition: opacity .3s ease-in-out; | ||||
|     } | ||||
|     .fade-enter, .fade-leave-to { | ||||
|       opacity: 0; | ||||
|     } | ||||
|  | ||||
|     * { | ||||
|       box-sizing: border-box; | ||||
|     } | ||||
|  | ||||
|     .pdgrid-grid__title { | ||||
|       position: absolute; | ||||
|       top: 40px; | ||||
|       left: 50%; | ||||
|       width: 271px; | ||||
|       height: 53px; | ||||
|       line-height: 53px; | ||||
|       text-align: center; | ||||
|       background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/grid-title-sbg.png) no-repeat center; | ||||
|       background-size: 100% 100%; | ||||
|       cursor: pointer; | ||||
|       transform: translateX(-50%); | ||||
|       transition: opacity ease 0.3s; | ||||
|  | ||||
|       &:hover { | ||||
|         opacity: 0.8; | ||||
|       } | ||||
|  | ||||
|       h2 { | ||||
|         width: 182px; | ||||
|         margin: 0 auto; | ||||
|         white-space: nowrap; | ||||
|         overflow: hidden; | ||||
|         text-overflow: ellipsis; | ||||
|         color: #FFFFFF; | ||||
|         font-size: 21px; | ||||
|         text-shadow: 0px 0px 13px rgb(59 182 255 / 80%); | ||||
|         background: #fff; | ||||
|         -webkit-background-clip: text; | ||||
|         -webkit-text-fill-color: transparent; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .pdgrid-title { | ||||
|       position: absolute; | ||||
|       top: 200px; | ||||
|       left: 50%; | ||||
|       min-width: 640px; | ||||
|       height: 80px; | ||||
|       line-height: 80px; | ||||
|       text-align: center; | ||||
|       background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/middle-titlebg.png) no-repeat center; | ||||
|       background-size: 100% 100%; | ||||
|       transform: translateX(-50%); | ||||
|  | ||||
|       h2 { | ||||
|         color: #FFFFFF; | ||||
|         font-size: 22px; | ||||
|         white-space: nowrap; | ||||
|         text-shadow: 0px 0px 13px rgb(59 182 255 / 80%); | ||||
|         background: #fff; | ||||
|         -webkit-background-clip: text; | ||||
|         -webkit-text-fill-color: transparent; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .pdgrid-body { | ||||
|       display: flex; | ||||
|       position: absolute; | ||||
|       justify-content: space-between; | ||||
|       bottom: 200px; | ||||
|       left: 0; | ||||
|       width: 100%; | ||||
|       padding: 0 112px; | ||||
|  | ||||
|       .pdgrid-body__item { | ||||
|         display: flex; | ||||
|         flex-direction: column; | ||||
|         width: 200px; | ||||
|         height: 187px; | ||||
|         align-items: center; | ||||
|         padding-top: 71px; | ||||
|         cursor: pointer; | ||||
|         background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/item-bg.png) no-repeat center; | ||||
|         background-size: 100% 100%; | ||||
|         transition: opacity ease 0.3s; | ||||
|  | ||||
|         &:hover { | ||||
|           opacity: 0.8; | ||||
|         } | ||||
|  | ||||
|         &:nth-of-type(2) { | ||||
|           position: relative; | ||||
|           top: 67px; | ||||
|         } | ||||
|  | ||||
|         h2 { | ||||
|           font-size: 36px; | ||||
|           color: #FFFFFF; | ||||
|           text-shadow: 0px 0px 13px rgb(59 182 255 / 80%); | ||||
|           background: #fff; | ||||
|           -webkit-background-clip: text; | ||||
|           -webkit-text-fill-color: transparent; | ||||
|         } | ||||
|  | ||||
|         p { | ||||
|           max-width: 164px; | ||||
|           margin-top: 4px; | ||||
|           padding: 0 16px; | ||||
|           font-size: 16px; | ||||
|           color: #FFFFFF; | ||||
|           text-shadow: 0px 0px 13px rgb(59 182 255 / 80%); | ||||
|           background: #fff; | ||||
|           -webkit-background-clip: text; | ||||
|           font-weight: 600; | ||||
|           white-space: nowrap; | ||||
|           overflow: hidden; | ||||
|           text-overflow: ellipsis; | ||||
|           -webkit-text-fill-color: transparent; | ||||
|         } | ||||
|  | ||||
|         .bottom { | ||||
|           display: flex; | ||||
|           align-items: center; | ||||
|  | ||||
|           i { | ||||
|             width: 0px; | ||||
|             height: 0px; | ||||
|             border: 6px solid transparent; | ||||
|             border-top-color: transparent; | ||||
|             border-bottom-color: transparent; | ||||
|             border-left-color: transparent; | ||||
|             border-right-color: #FFCB42; | ||||
|  | ||||
|             &.right { | ||||
|               width: 0px; | ||||
|               height: 0px; | ||||
|               border: 6px solid transparent; | ||||
|               border-top-color: transparent; | ||||
|               border-bottom-color: transparent; | ||||
|               border-left-color: #FFCB42; | ||||
|               border-right-color: transparent; | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .grid-dialog { | ||||
|       position: fixed; | ||||
|       top: 0; | ||||
|       left: 0; | ||||
|       z-index: 111; | ||||
|       width: 100%; | ||||
|       height: 100%; | ||||
|  | ||||
|       & > .mask { | ||||
|         position: absolute; | ||||
|         left: 0; | ||||
|         top: 0; | ||||
|         z-index: 1; | ||||
|         width: 100%; | ||||
|         height: 100%; | ||||
|         background: rgba(0, 0, 0, 0.5); | ||||
|       } | ||||
|  | ||||
|       .grid-container { | ||||
|         display: flex; | ||||
|         position: absolute; | ||||
|         flex-direction: column; | ||||
|         left: 50%; | ||||
|         top: 50%; | ||||
|         z-index: 2; | ||||
|         width: 640px; | ||||
|         height: 640px; | ||||
|         background: rgba(7,13,41,0.9); | ||||
|         border: 1px solid #144662; | ||||
|         transform: translate(-50%, -50%); | ||||
|  | ||||
|         & > h2 { | ||||
|           width: 100%; | ||||
|           height: 67px; | ||||
|           line-height: 67px; | ||||
|           padding: 0 20px; | ||||
|           text-align: center; | ||||
|           color: #FFFFFF; | ||||
|           font-size: 24px; | ||||
|           white-space: nowrap; | ||||
|           overflow: hidden; | ||||
|           text-overflow: ellipsis; | ||||
|           text-shadow: 0px 0px 13px rgb(59 182 255 / 80%); | ||||
|           background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/grid-title-bg.png) no-repeat center; | ||||
|           background-size: 100% 100%; | ||||
|         } | ||||
|  | ||||
|         .grid-list { | ||||
|           flex: 1; | ||||
|           overflow-y: auto; | ||||
|  | ||||
|           & > div { | ||||
|             height: 67px; | ||||
|             line-height: 67px; | ||||
|             padding: 0 20px; | ||||
|             text-align: center; | ||||
|             color: #FFFFFF; | ||||
|             font-size: 27px; | ||||
|             cursor: pointer; | ||||
|             white-space: nowrap; | ||||
|             overflow: hidden; | ||||
|             text-overflow: ellipsis; | ||||
|             transition: all ease 0.5s; | ||||
|  | ||||
|             &.grid-active { | ||||
|               background: linear-gradient(270deg, rgba(0,48,124,0) 0%, #00307C 16%, rgba(0,99,255,0.9100) 50%, rgba(0,48,124,0.8200) 87%, rgba(0,48,124,0) 100%); | ||||
|               box-shadow: inset 0px -1px 0px 0px rgba(16,34,54,1); | ||||
|               text-shadow: 0px 3px 5px rgba(0,0,0,0.5000); | ||||
|             } | ||||
|  | ||||
|             &:hover { | ||||
|               background: linear-gradient(270deg, rgba(0,48,124,0) 0%, #00307C 16%, rgba(0,99,255,0.9100) 50%, rgba(0,48,124,0.8200) 87%, rgba(0,48,124,0) 100%); | ||||
|               box-shadow: inset 0px -1px 0px 0px rgba(16,34,54,1); | ||||
|               text-shadow: 0px 3px 5px rgba(0,0,0,0.5000); | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </style> | ||||
							
								
								
									
										334
									
								
								packages/bigscreen/dv/components/PlyGird.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,334 @@ | ||||
| <template> | ||||
|   <div class="PlyGird"> | ||||
|     <div class="pdgrid-title"> | ||||
|       <h2>{{ currGird }}</h2> | ||||
|     </div> | ||||
|     <div class="pdgrid-body"> | ||||
|       <div class="pdgrid-body__item" @click="isShowGrid2 = true"> | ||||
|         <h2>{{ girdNum2 }}</h2> | ||||
|         <div class="bottom"> | ||||
|           <i></i> | ||||
|           <p>{{ girdName2 }}</p> | ||||
|           <i class="right"></i> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|     <transition name="fade"> | ||||
|       <div class="grid-dialog" v-show="isShowGrid2"> | ||||
|         <div class="mask" @click="isShowGrid2 = false"></div> | ||||
|         <div class="grid-container"> | ||||
|           <h2 :title="girdName2">{{ girdName2 }}</h2> | ||||
|           <div class="grid-list"> | ||||
|             <div | ||||
|               :class="[currIndex2 === index ? 'grid-active' : '']" | ||||
|               v-for="(item, index) in girdInfoList2" | ||||
|               :key="index" | ||||
|               :title="item.girdName" | ||||
|               @click.stop="onGrid2Click(item, index)"> | ||||
|               {{ item.girdName }} | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </transition> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   export default { | ||||
|     name: 'pdgrid', | ||||
|  | ||||
|     props: ['instance'], | ||||
|  | ||||
|     data () { | ||||
|       return { | ||||
|         isShowGrid2: false, | ||||
|         currIndex2: 0, | ||||
|         girdInfoList2: [], | ||||
|         girdName2: '', | ||||
|         girdNum2: 0, | ||||
|         currGird: '' | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     mounted () { | ||||
|       this.$nextTick(() => { | ||||
|         document.addEventListener('keydown', this.onKeyDown) | ||||
|       }) | ||||
|       this.getInfo() | ||||
|     }, | ||||
|  | ||||
|     destroyed () { | ||||
|       document.removeEventListener('keydown', this.onKeyDown) | ||||
|     }, | ||||
|  | ||||
|     methods: { | ||||
|       onKeyDown (e) { | ||||
|         if (e.keyCode == 27) { | ||||
|           this.isShowGrid2 = false | ||||
|         } | ||||
|       }, | ||||
|  | ||||
|       onGrid2Click (item, index) { | ||||
|         this.currIndex2 = index | ||||
|         this.girdName2 = item.girdName | ||||
|         this.isShowGrid2 = false | ||||
|         this.$emit('nodeClick', item.id) | ||||
|  | ||||
|         this.currGird = item.girdName | ||||
|         this.getInfo(item.id) | ||||
|       }, | ||||
|  | ||||
|       getInfo (id) { | ||||
|         this.instance.post(`/app/appgirdinfo/queryPlyDetailByGirdId?id=${id || ''}`).then(res => { | ||||
|           if (res.code === 0) { | ||||
|             res.data.girdInfoList2 && (this.girdInfoList2 = res.data.girdInfoList2) | ||||
|             res.data.girdName2 && (this.girdName2 = res.data.girdName2) | ||||
|             res.data.girdNum2 != null && (this.girdNum2 = res.data.girdNum2) | ||||
|             res.data.girdName1 && (this.currGird = res.data.girdName1) | ||||
|  | ||||
|             if (!id) { | ||||
|               this.currIndex2 = res.data.girdInfoList2.findIndex(v => res.data.girdName2 === v.girdName) | ||||
|             } | ||||
|           } | ||||
|         }) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
|   .PlyGird { | ||||
|     position: relative; | ||||
|     width: 100%; | ||||
|     height: 100%; | ||||
|     overflow: hidden; | ||||
|     box-sizing: border-box; | ||||
|     background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/middle-bg.png) no-repeat center; | ||||
|     background-size: contain; | ||||
|  | ||||
|     .fade-enter-active, .fade-leave-active { | ||||
|       transition: opacity .3s ease-in-out; | ||||
|     } | ||||
|     .fade-enter, .fade-leave-to { | ||||
|       opacity: 0; | ||||
|     } | ||||
|  | ||||
|     * { | ||||
|       box-sizing: border-box; | ||||
|     } | ||||
|  | ||||
|     .pdgrid-grid__title { | ||||
|       position: absolute; | ||||
|       top: 40px; | ||||
|       left: 50%; | ||||
|       width: 271px; | ||||
|       height: 53px; | ||||
|       line-height: 53px; | ||||
|       text-align: center; | ||||
|       background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/grid-title-sbg.png) no-repeat center; | ||||
|       background-size: 100% 100%; | ||||
|       cursor: pointer; | ||||
|       transform: translateX(-50%); | ||||
|       transition: opacity ease 0.3s; | ||||
|  | ||||
|       &:hover { | ||||
|         opacity: 0.8; | ||||
|       } | ||||
|  | ||||
|       h2 { | ||||
|         width: 182px; | ||||
|         margin: 0 auto; | ||||
|         white-space: nowrap; | ||||
|         overflow: hidden; | ||||
|         text-overflow: ellipsis; | ||||
|         color: #FFFFFF; | ||||
|         font-size: 21px; | ||||
|         text-shadow: 0px 0px 13px rgb(59 182 255 / 80%); | ||||
|         background: #fff; | ||||
|         -webkit-background-clip: text; | ||||
|         -webkit-text-fill-color: transparent; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .pdgrid-title { | ||||
|       position: absolute; | ||||
|       top: 200px; | ||||
|       left: 50%; | ||||
|       min-width: 640px; | ||||
|       height: 80px; | ||||
|       line-height: 80px; | ||||
|       text-align: center; | ||||
|       background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/middle-titlebg.png) no-repeat center; | ||||
|       background-size: 100% 100%; | ||||
|       transform: translateX(-50%); | ||||
|  | ||||
|       h2 { | ||||
|         color: #FFFFFF; | ||||
|         font-size: 22px; | ||||
|         white-space: nowrap; | ||||
|         text-shadow: 0px 0px 13px rgb(59 182 255 / 80%); | ||||
|         background: #fff; | ||||
|         -webkit-background-clip: text; | ||||
|         -webkit-text-fill-color: transparent; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .pdgrid-body { | ||||
|       display: flex; | ||||
|       position: absolute; | ||||
|       justify-content: center; | ||||
|       bottom: 133px; | ||||
|       left: 0; | ||||
|       width: 100%; | ||||
|       padding: 0 112px; | ||||
|  | ||||
|       .pdgrid-body__item { | ||||
|         display: flex; | ||||
|         flex-direction: column; | ||||
|         width: 200px; | ||||
|         height: 187px; | ||||
|         align-items: center; | ||||
|         padding-top: 71px; | ||||
|         cursor: pointer; | ||||
|         background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/item-bg.png) no-repeat center; | ||||
|         background-size: 100% 100%; | ||||
|         transition: opacity ease 0.3s; | ||||
|  | ||||
|         &:hover { | ||||
|           opacity: 0.8; | ||||
|         } | ||||
|  | ||||
|         h2 { | ||||
|           font-size: 36px; | ||||
|           color: #FFFFFF; | ||||
|           text-shadow: 0px 0px 13px rgb(59 182 255 / 80%); | ||||
|           background: #fff; | ||||
|           -webkit-background-clip: text; | ||||
|           -webkit-text-fill-color: transparent; | ||||
|         } | ||||
|  | ||||
|         p { | ||||
|           max-width: 164px; | ||||
|           margin-top: 4px; | ||||
|           padding: 0 16px; | ||||
|           font-size: 16px; | ||||
|           color: #FFFFFF; | ||||
|           text-shadow: 0px 0px 13px rgb(59 182 255 / 80%); | ||||
|           background: #fff; | ||||
|           -webkit-background-clip: text; | ||||
|           font-weight: 600; | ||||
|           white-space: nowrap; | ||||
|           overflow: hidden; | ||||
|           text-overflow: ellipsis; | ||||
|           -webkit-text-fill-color: transparent; | ||||
|         } | ||||
|  | ||||
|         .bottom { | ||||
|           display: flex; | ||||
|           align-items: center; | ||||
|  | ||||
|           i { | ||||
|             width: 0px; | ||||
|             height: 0px; | ||||
|             border: 6px solid transparent; | ||||
|             border-top-color: transparent; | ||||
|             border-bottom-color: transparent; | ||||
|             border-left-color: transparent; | ||||
|             border-right-color: #FFCB42; | ||||
|  | ||||
|             &.right { | ||||
|               width: 0px; | ||||
|               height: 0px; | ||||
|               border: 6px solid transparent; | ||||
|               border-top-color: transparent; | ||||
|               border-bottom-color: transparent; | ||||
|               border-left-color: #FFCB42; | ||||
|               border-right-color: transparent; | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .grid-dialog { | ||||
|       position: fixed; | ||||
|       top: 0; | ||||
|       left: 0; | ||||
|       z-index: 111; | ||||
|       width: 100%; | ||||
|       height: 100%; | ||||
|  | ||||
|       & > .mask { | ||||
|         position: absolute; | ||||
|         left: 0; | ||||
|         top: 0; | ||||
|         z-index: 1; | ||||
|         width: 100%; | ||||
|         height: 100%; | ||||
|         background: rgba(0, 0, 0, 0.5); | ||||
|       } | ||||
|  | ||||
|       .grid-container { | ||||
|         display: flex; | ||||
|         position: absolute; | ||||
|         flex-direction: column; | ||||
|         left: 50%; | ||||
|         top: 50%; | ||||
|         z-index: 2; | ||||
|         width: 640px; | ||||
|         height: 640px; | ||||
|         background: rgba(7,13,41,0.9); | ||||
|         border: 1px solid #144662; | ||||
|         transform: translate(-50%, -50%); | ||||
|  | ||||
|         & > h2 { | ||||
|           width: 100%; | ||||
|           height: 67px; | ||||
|           line-height: 67px; | ||||
|           padding: 0 20px; | ||||
|           text-align: center; | ||||
|           color: #FFFFFF; | ||||
|           font-size: 24px; | ||||
|           white-space: nowrap; | ||||
|           overflow: hidden; | ||||
|           text-overflow: ellipsis; | ||||
|           text-shadow: 0px 0px 13px rgb(59 182 255 / 80%); | ||||
|           background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/grid-title-bg.png) no-repeat center; | ||||
|           background-size: 100% 100%; | ||||
|         } | ||||
|  | ||||
|         .grid-list { | ||||
|           flex: 1; | ||||
|           overflow-y: auto; | ||||
|  | ||||
|           & > div { | ||||
|             height: 67px; | ||||
|             line-height: 67px; | ||||
|             padding: 0 20px; | ||||
|             text-align: center; | ||||
|             color: #FFFFFF; | ||||
|             font-size: 27px; | ||||
|             cursor: pointer; | ||||
|             white-space: nowrap; | ||||
|             overflow: hidden; | ||||
|             text-overflow: ellipsis; | ||||
|             transition: all ease 0.5s; | ||||
|  | ||||
|             &.grid-active { | ||||
|               background: linear-gradient(270deg, rgba(0,48,124,0) 0%, #00307C 16%, rgba(0,99,255,0.9100) 50%, rgba(0,48,124,0.8200) 87%, rgba(0,48,124,0) 100%); | ||||
|               box-shadow: inset 0px -1px 0px 0px rgba(16,34,54,1); | ||||
|               text-shadow: 0px 3px 5px rgba(0,0,0,0.5000); | ||||
|             } | ||||
|  | ||||
|             &:hover { | ||||
|               background: linear-gradient(270deg, rgba(0,48,124,0) 0%, #00307C 16%, rgba(0,99,255,0.9100) 50%, rgba(0,48,124,0.8200) 87%, rgba(0,48,124,0) 100%); | ||||
|               box-shadow: inset 0px -1px 0px 0px rgba(16,34,54,1); | ||||
|               text-shadow: 0px 3px 5px rgba(0,0,0,0.5000); | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </style> | ||||
							
								
								
									
										498
									
								
								packages/bigscreen/dv/components/XyGrid.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,498 @@ | ||||
| <template> | ||||
|   <div class="pdgrid"> | ||||
|     <div class="pdgrid-title"> | ||||
|       <h2>{{ currGird }}</h2> | ||||
|     </div> | ||||
|     <div class="pdgrid-grid__title" @click="isShowGrid2 = true"> | ||||
|       <h2 :title="girdName2">{{ girdName2 }}</h2> | ||||
|     </div> | ||||
|     <div class="pdgrid-body"> | ||||
|       <div class="pdgrid-body__item" @click="isShowGrid3 = true"> | ||||
|         <h2>{{ girdNum3 || 0 }}</h2> | ||||
|         <div class="bottom"> | ||||
|           <i></i> | ||||
|           <p>{{ girdName3 }}</p> | ||||
|           <i class="right"></i> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="pdgrid-body__item" @click.stop="isShowGrid4 = true"> | ||||
|         <h2>{{ girdNum4 || 0 }}</h2> | ||||
|         <div class="bottom"> | ||||
|           <i></i> | ||||
|           <p>{{ girdName4 }}</p> | ||||
|           <i class="right"></i> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="pdgrid-body__item" @click="isShowGrid5 = true"> | ||||
|         <h2>{{ girdNum5 || 0 }}</h2> | ||||
|         <div class="bottom"> | ||||
|           <i></i> | ||||
|           <p>{{ girdName5 }}</p> | ||||
|           <i class="right"></i> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|     <transition name="fade"> | ||||
|       <div class="grid-dialog" v-show="isShowGrid2"> | ||||
|         <div class="mask" @click="isShowGrid2 = false"></div> | ||||
|         <div class="grid-container"> | ||||
|           <h2 :title="girdName2">{{ girdName2 }}</h2> | ||||
|           <div class="grid-list"> | ||||
|             <div @click.stop="onGrid2Click(girdId1, girdName2)">{{ girdName2 }}</div> | ||||
|             <!-- <div | ||||
|               :class="[currIndex2 === index ? 'grid-active' : '']" | ||||
|               v-for="(item, index) in girdInfoList2" | ||||
|               :key="index" | ||||
|               :title="item.girdName" | ||||
|               @click.stop="onGrid2Click(item, index)"> | ||||
|               {{ item.girdName }} | ||||
|             </div> --> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </transition> | ||||
|     <transition name="fade"> | ||||
|       <div class="grid-dialog" v-show="isShowGrid3"> | ||||
|         <div class="mask" @click="isShowGrid3 = false"></div> | ||||
|         <div class="grid-container"> | ||||
|           <h2 :title="girdName3">{{ girdName3 }}</h2> | ||||
|           <div class="grid-list"> | ||||
|             <div | ||||
|               :class="[currIndex3 === index ? 'grid-active' : '']" | ||||
|               v-for="(item, index) in girdInfoList3" | ||||
|               :key="index" | ||||
|               :title="item.girdName" | ||||
|               @click.stop="onGrid3Click(item, index)"> | ||||
|               {{ item.girdName }} | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </transition> | ||||
|     <transition name="fade"> | ||||
|       <div class="grid-dialog" v-show="isShowGrid4"> | ||||
|         <div class="mask" @click="isShowGrid4 = false"></div> | ||||
|         <div class="grid-container"> | ||||
|           <h2 :title="girdName4">{{ girdName4 }}</h2> | ||||
|           <div class="grid-list"> | ||||
|             <div | ||||
|               :class="[currIndex4 === index ? 'grid-active' : '']" | ||||
|               v-for="(item, index) in girdInfoList4" | ||||
|               :key="index" | ||||
|               :title="item.girdName" | ||||
|               @click.stop="onGrid4Click(item, index)"> | ||||
|               {{ item.girdName }} | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </transition> | ||||
|     <transition name="fade"> | ||||
|       <div class="grid-dialog" v-show="isShowGrid5"> | ||||
|         <div class="mask" @click="isShowGrid5 = false"></div> | ||||
|         <div class="grid-container"> | ||||
|           <h2 :title="girdName5">{{ girdName5 }}</h2> | ||||
|           <div class="grid-list"> | ||||
|             <div | ||||
|               :class="[currIndex5 === index ? 'grid-active' : '']" | ||||
|               v-for="(item, index) in girdInfoList5" | ||||
|               :key="index" | ||||
|               :title="item.girdName" | ||||
|               @click.stop="onGrid5Click(item, index)"> | ||||
|               {{ item.girdName }} | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </transition> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   export default { | ||||
|     name: 'XyGrid', | ||||
|  | ||||
|     props: ['instance'], | ||||
|  | ||||
|     data () { | ||||
|       return { | ||||
|         isShowGrid2: false, | ||||
|         isShowGrid3: false, | ||||
|         isShowGrid4: false, | ||||
|         isShowGrid5: false, | ||||
|         currIndex2: 0, | ||||
|         girdId1: '', | ||||
|         currIndex3: 0, | ||||
|         currIndex4: 0, | ||||
|         currIndex5: 0, | ||||
|         girdInfoList2: [], | ||||
|         girdInfoList3: [], | ||||
|         girdInfoList4: [], | ||||
|         girdInfoList5: [], | ||||
|         girdName2: '', | ||||
|         girdName3: '', | ||||
|         girdName4: '', | ||||
|         girdName5: '', | ||||
|         girdNum3: 0, | ||||
|         girdNum4: 0, | ||||
|         girdNum5: 0, | ||||
|         currGird: '', | ||||
|         girdName1: '' | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     mounted () { | ||||
|       this.$nextTick(() => { | ||||
|         document.addEventListener('keydown', this.onKeyDown) | ||||
|       }) | ||||
|       this.getInfo() | ||||
|     }, | ||||
|  | ||||
|     destroyed () { | ||||
|       document.removeEventListener('keydown', this.onKeyDown) | ||||
|     }, | ||||
|  | ||||
|     methods: { | ||||
|       onKeyDown (e) { | ||||
|         if (e.keyCode == 27) { | ||||
|           this.isShowGrid2 = false | ||||
|           this.isShowGrid3 = false | ||||
|           this.isShowGrid4 = false | ||||
|           this.isShowGrid5 = false | ||||
|         } | ||||
|       }, | ||||
|  | ||||
|       onGrid2Click (id, name) { | ||||
|         // this.currIndex2 = index | ||||
|         // this.girdName2 = item.girdName | ||||
|         this.currIndex3 = -1 | ||||
|         this.currIndex4 = -1 | ||||
|         this.currIndex5 = -1 | ||||
|         this.isShowGrid2 = false | ||||
|         this.girdInfoList3 = [] | ||||
|         this.girdInfoList4 = [] | ||||
|         this.girdInfoList5 = [] | ||||
|         this.$emit('nodeClick', id) | ||||
|  | ||||
|         this.currGird = name | ||||
|         this.getInfo(id) | ||||
|       }, | ||||
|  | ||||
|       onGrid3Click (item, index) { | ||||
|         this.currIndex3 = index | ||||
|         this.girdName3 = item.girdName | ||||
|         this.currIndex4 = -1 | ||||
|         this.currIndex5 = -1 | ||||
|         this.girdNum3 = 1 | ||||
|         this.isShowGrid3 = false | ||||
|         this.$emit('nodeClick', { | ||||
|           id: item.id, | ||||
|           level: 2 | ||||
|         }) | ||||
|         this.girdInfoList4 = [] | ||||
|         this.girdInfoList5 = [] | ||||
|         this.currGird = item.girdName | ||||
|         this.getInfo(item.id) | ||||
|       }, | ||||
|  | ||||
|       onGrid4Click (item, index) { | ||||
|         this.currIndex4 = index | ||||
|         this.girdName4 = item.girdName | ||||
|         this.currIndex5 = -1 | ||||
|         this.girdNum4 = 1 | ||||
|         this.isShowGrid4 = false | ||||
|         this.$emit('nodeClick', { | ||||
|           id: item.id, | ||||
|           level: 3 | ||||
|         }) | ||||
|         this.girdInfoList5 = [] | ||||
|  | ||||
|         this.currGird = item.girdName | ||||
|         this.getInfo(item.id) | ||||
|       }, | ||||
|  | ||||
|       onGrid5Click (item, index) { | ||||
|         this.currIndex5 = index | ||||
|         this.girdName5 = item.girdName | ||||
|         this.isShowGrid5 = false | ||||
|         this.girdNum5 = 1 | ||||
|         this.$emit('nodeClick', { | ||||
|           id: item.id, | ||||
|           level: 4 | ||||
|         }) | ||||
|  | ||||
|         this.currGird = item.girdName | ||||
|         this.getInfo(item.id) | ||||
|       }, | ||||
|  | ||||
|       getInfo (id) { | ||||
|         this.instance.post(`/app/qxn_appgirdinfo/queryGirdInfo?id=${id || ''}`).then(res => { | ||||
|           if (res.code === 0) { | ||||
|             res.data.girdInfoList2 && (this.girdInfoList3 = res.data.girdInfoList2) | ||||
|             res.data.girdInfoList3 && (this.girdInfoList4 = res.data.girdInfoList3) | ||||
|             res.data.girdInfoList4 && (this.girdInfoList5 = res.data.girdInfoList4) | ||||
|  | ||||
|             res.data.girdName1 && (this.girdName2 = res.data.girdName1) | ||||
|             res.data.girdName2 && (this.girdName3 = res.data.girdName2) | ||||
|             res.data.girdName3 && (this.girdName4 = res.data.girdName3) | ||||
|             res.data.girdName4 && (this.girdName5 = res.data.girdName4) | ||||
|  | ||||
|             if (this.girdId1) { | ||||
|               this.girdName2 = res.data.girdName1 | ||||
|               this.girdId1 = res.data.girdId1 | ||||
|             } | ||||
|  | ||||
|             res.data.girdNum2 != null && (this.girdNum3 = res.data.girdNum2) | ||||
|             res.data.girdNum3 != null && (this.girdNum4 = res.data.girdNum3) | ||||
|             res.data.girdNum4 != null && (this.girdNum5 = res.data.girdNum4) | ||||
|  | ||||
|             if (!id) { | ||||
|               this.currGird = res.data.girdName1 | ||||
|             } | ||||
|           } | ||||
|         }) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss"> | ||||
|   .pdgrid { | ||||
|     position: relative; | ||||
|     width: 100%; | ||||
|     height: 100%; | ||||
|     overflow: hidden; | ||||
|     box-sizing: border-box; | ||||
|     background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/middle-bg.png) no-repeat center; | ||||
|     background-size: contain; | ||||
|  | ||||
|     .fade-enter-active, .fade-leave-active { | ||||
|       transition: opacity .3s ease-in-out; | ||||
|     } | ||||
|     .fade-enter, .fade-leave-to { | ||||
|       opacity: 0; | ||||
|     } | ||||
|  | ||||
|     * { | ||||
|       box-sizing: border-box; | ||||
|     } | ||||
|  | ||||
|     .pdgrid-grid__title { | ||||
|       position: absolute; | ||||
|       top: 40px; | ||||
|       left: 50%; | ||||
|       width: 271px; | ||||
|       height: 53px; | ||||
|       line-height: 53px; | ||||
|       text-align: center; | ||||
|       background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/grid-title-sbg.png) no-repeat center; | ||||
|       background-size: 100% 100%; | ||||
|       cursor: pointer; | ||||
|       transform: translateX(-50%); | ||||
|       transition: opacity ease 0.3s; | ||||
|  | ||||
|       &:hover { | ||||
|         opacity: 0.8; | ||||
|       } | ||||
|  | ||||
|       h2 { | ||||
|         width: 182px; | ||||
|         margin: 0 auto; | ||||
|         white-space: nowrap; | ||||
|         overflow: hidden; | ||||
|         text-overflow: ellipsis; | ||||
|         color: #FFFFFF; | ||||
|         font-size: 21px; | ||||
|         text-shadow: 0px 0px 13px rgb(59 182 255 / 80%); | ||||
|         background: #fff; | ||||
|         -webkit-background-clip: text; | ||||
|         -webkit-text-fill-color: transparent; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .pdgrid-title { | ||||
|       position: absolute; | ||||
|       top: 200px; | ||||
|       left: 50%; | ||||
|       min-width: 640px; | ||||
|       height: 80px; | ||||
|       line-height: 80px; | ||||
|       text-align: center; | ||||
|       background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/middle-titlebg.png) no-repeat center; | ||||
|       background-size: 100% 100%; | ||||
|       transform: translateX(-50%); | ||||
|  | ||||
|       h2 { | ||||
|         color: #FFFFFF; | ||||
|         font-size: 22px; | ||||
|         white-space: nowrap; | ||||
|         text-shadow: 0px 0px 13px rgb(59 182 255 / 80%); | ||||
|         background: #fff; | ||||
|         -webkit-background-clip: text; | ||||
|         -webkit-text-fill-color: transparent; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .pdgrid-body { | ||||
|       display: flex; | ||||
|       position: absolute; | ||||
|       justify-content: space-between; | ||||
|       bottom: 200px; | ||||
|       left: 0; | ||||
|       width: 100%; | ||||
|       padding: 0 112px; | ||||
|  | ||||
|       .pdgrid-body__item { | ||||
|         display: flex; | ||||
|         flex-direction: column; | ||||
|         width: 200px; | ||||
|         height: 187px; | ||||
|         align-items: center; | ||||
|         padding-top: 71px; | ||||
|         cursor: pointer; | ||||
|         background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/item-bg.png) no-repeat center; | ||||
|         background-size: 100% 100%; | ||||
|         transition: opacity ease 0.3s; | ||||
|  | ||||
|         &:hover { | ||||
|           opacity: 0.8; | ||||
|         } | ||||
|  | ||||
|         &:nth-of-type(2) { | ||||
|           position: relative; | ||||
|           top: 67px; | ||||
|         } | ||||
|  | ||||
|         h2 { | ||||
|           font-size: 36px; | ||||
|           color: #FFFFFF; | ||||
|           text-shadow: 0px 0px 13px rgb(59 182 255 / 80%); | ||||
|           background: #fff; | ||||
|           -webkit-background-clip: text; | ||||
|           -webkit-text-fill-color: transparent; | ||||
|         } | ||||
|  | ||||
|         p { | ||||
|           max-width: 164px; | ||||
|           margin-top: 4px; | ||||
|           padding: 0 16px; | ||||
|           font-size: 16px; | ||||
|           color: #FFFFFF; | ||||
|           text-shadow: 0px 0px 13px rgb(59 182 255 / 80%); | ||||
|           background: #fff; | ||||
|           -webkit-background-clip: text; | ||||
|           font-weight: 600; | ||||
|           white-space: nowrap; | ||||
|           overflow: hidden; | ||||
|           text-overflow: ellipsis; | ||||
|           -webkit-text-fill-color: transparent; | ||||
|         } | ||||
|  | ||||
|         .bottom { | ||||
|           display: flex; | ||||
|           align-items: center; | ||||
|  | ||||
|           i { | ||||
|             width: 0px; | ||||
|             height: 0px; | ||||
|             border: 6px solid transparent; | ||||
|             border-top-color: transparent; | ||||
|             border-bottom-color: transparent; | ||||
|             border-left-color: transparent; | ||||
|             border-right-color: #FFCB42; | ||||
|  | ||||
|             &.right { | ||||
|               width: 0px; | ||||
|               height: 0px; | ||||
|               border: 6px solid transparent; | ||||
|               border-top-color: transparent; | ||||
|               border-bottom-color: transparent; | ||||
|               border-left-color: #FFCB42; | ||||
|               border-right-color: transparent; | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .grid-dialog { | ||||
|       position: fixed; | ||||
|       top: 0; | ||||
|       left: 0; | ||||
|       z-index: 111; | ||||
|       width: 100%; | ||||
|       height: 100%; | ||||
|  | ||||
|       & > .mask { | ||||
|         position: absolute; | ||||
|         left: 0; | ||||
|         top: 0; | ||||
|         z-index: 1; | ||||
|         width: 100%; | ||||
|         height: 100%; | ||||
|         background: rgba(0, 0, 0, 0.5); | ||||
|       } | ||||
|  | ||||
|       .grid-container { | ||||
|         display: flex; | ||||
|         position: absolute; | ||||
|         flex-direction: column; | ||||
|         left: 50%; | ||||
|         top: 50%; | ||||
|         z-index: 2; | ||||
|         width: 640px; | ||||
|         height: 640px; | ||||
|         background: rgba(7,13,41,0.9); | ||||
|         border: 1px solid #144662; | ||||
|         transform: translate(-50%, -50%); | ||||
|  | ||||
|         & > h2 { | ||||
|           width: 100%; | ||||
|           height: 67px; | ||||
|           line-height: 67px; | ||||
|           padding: 0 20px; | ||||
|           text-align: center; | ||||
|           color: #FFFFFF; | ||||
|           font-size: 24px; | ||||
|           white-space: nowrap; | ||||
|           overflow: hidden; | ||||
|           text-overflow: ellipsis; | ||||
|           text-shadow: 0px 0px 13px rgb(59 182 255 / 80%); | ||||
|           background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/grid-title-bg.png) no-repeat center; | ||||
|           background-size: 100% 100%; | ||||
|         } | ||||
|  | ||||
|         .grid-list { | ||||
|           flex: 1; | ||||
|           overflow-y: auto; | ||||
|  | ||||
|           & > div { | ||||
|             height: 67px; | ||||
|             line-height: 67px; | ||||
|             padding: 0 20px; | ||||
|             text-align: center; | ||||
|             color: #FFFFFF; | ||||
|             font-size: 27px; | ||||
|             cursor: pointer; | ||||
|             white-space: nowrap; | ||||
|             overflow: hidden; | ||||
|             text-overflow: ellipsis; | ||||
|             transition: all ease 0.5s; | ||||
|  | ||||
|             &.grid-active { | ||||
|               background: linear-gradient(270deg, rgba(0,48,124,0) 0%, #00307C 16%, rgba(0,99,255,0.9100) 50%, rgba(0,48,124,0.8200) 87%, rgba(0,48,124,0) 100%); | ||||
|               box-shadow: inset 0px -1px 0px 0px rgba(16,34,54,1); | ||||
|               text-shadow: 0px 3px 5px rgba(0,0,0,0.5000); | ||||
|             } | ||||
|  | ||||
|             &:hover { | ||||
|               background: linear-gradient(270deg, rgba(0,48,124,0) 0%, #00307C 16%, rgba(0,99,255,0.9100) 50%, rgba(0,48,124,0.8200) 87%, rgba(0,48,124,0) 100%); | ||||
|               box-shadow: inset 0px -1px 0px 0px rgba(16,34,54,1); | ||||
|               text-shadow: 0px 3px 5px rgba(0,0,0,0.5000); | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </style> | ||||
							
								
								
									
										498
									
								
								packages/bigscreen/dv/components/YyxGrid.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,498 @@ | ||||
| <template> | ||||
|   <div class="pdgrid"> | ||||
|     <div class="pdgrid-title"> | ||||
|       <h2>{{ currGird }}</h2> | ||||
|     </div> | ||||
|     <div class="pdgrid-grid__title" @click="isShowGrid2 = true"> | ||||
|       <h2 :title="girdName2">{{ girdName2 }}</h2> | ||||
|     </div> | ||||
|     <div class="pdgrid-body"> | ||||
|       <div class="pdgrid-body__item" @click="isShowGrid3 = true"> | ||||
|         <h2>{{ girdNum3 || 0 }}</h2> | ||||
|         <div class="bottom"> | ||||
|           <i></i> | ||||
|           <p>{{ girdName3 }}</p> | ||||
|           <i class="right"></i> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="pdgrid-body__item" @click.stop="isShowGrid4 = true"> | ||||
|         <h2>{{ girdNum4 || 0 }}</h2> | ||||
|         <div class="bottom"> | ||||
|           <i></i> | ||||
|           <p>{{ girdName4 }}</p> | ||||
|           <i class="right"></i> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="pdgrid-body__item" @click="isShowGrid5 = true"> | ||||
|         <h2>{{ girdNum5 || 0 }}</h2> | ||||
|         <div class="bottom"> | ||||
|           <i></i> | ||||
|           <p>{{ girdName5 }}</p> | ||||
|           <i class="right"></i> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|     <transition name="fade"> | ||||
|       <div class="grid-dialog" v-show="isShowGrid2"> | ||||
|         <div class="mask" @click="isShowGrid2 = false"></div> | ||||
|         <div class="grid-container"> | ||||
|           <h2 :title="girdName2">{{ girdName2 }}</h2> | ||||
|           <div class="grid-list"> | ||||
|             <div @click.stop="onGrid2Click(girdId1, girdName2)">{{ girdName2 }}</div> | ||||
|             <!-- <div | ||||
|               :class="[currIndex2 === index ? 'grid-active' : '']" | ||||
|               v-for="(item, index) in girdInfoList2" | ||||
|               :key="index" | ||||
|               :title="item.girdName" | ||||
|               @click.stop="onGrid2Click(item, index)"> | ||||
|               {{ item.girdName }} | ||||
|             </div> --> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </transition> | ||||
|     <transition name="fade"> | ||||
|       <div class="grid-dialog" v-show="isShowGrid3"> | ||||
|         <div class="mask" @click="isShowGrid3 = false"></div> | ||||
|         <div class="grid-container"> | ||||
|           <h2 :title="girdName3">{{ girdName3 }}</h2> | ||||
|           <div class="grid-list"> | ||||
|             <div | ||||
|               :class="[currIndex3 === index ? 'grid-active' : '']" | ||||
|               v-for="(item, index) in girdInfoList3" | ||||
|               :key="index" | ||||
|               :title="item.girdName" | ||||
|               @click.stop="onGrid3Click(item, index)"> | ||||
|               {{ item.girdName }} | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </transition> | ||||
|     <transition name="fade"> | ||||
|       <div class="grid-dialog" v-show="isShowGrid4"> | ||||
|         <div class="mask" @click="isShowGrid4 = false"></div> | ||||
|         <div class="grid-container"> | ||||
|           <h2 :title="girdName4">{{ girdName4 }}</h2> | ||||
|           <div class="grid-list"> | ||||
|             <div | ||||
|               :class="[currIndex4 === index ? 'grid-active' : '']" | ||||
|               v-for="(item, index) in girdInfoList4" | ||||
|               :key="index" | ||||
|               :title="item.girdName" | ||||
|               @click.stop="onGrid4Click(item, index)"> | ||||
|               {{ item.girdName }} | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </transition> | ||||
|     <transition name="fade"> | ||||
|       <div class="grid-dialog" v-show="isShowGrid5"> | ||||
|         <div class="mask" @click="isShowGrid5 = false"></div> | ||||
|         <div class="grid-container"> | ||||
|           <h2 :title="girdName5">{{ girdName5 }}</h2> | ||||
|           <div class="grid-list"> | ||||
|             <div | ||||
|               :class="[currIndex5 === index ? 'grid-active' : '']" | ||||
|               v-for="(item, index) in girdInfoList5" | ||||
|               :key="index" | ||||
|               :title="item.girdName" | ||||
|               @click.stop="onGrid5Click(item, index)"> | ||||
|               {{ item.girdName }} | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </transition> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   export default { | ||||
|     name: 'XyGrid', | ||||
|  | ||||
|     props: ['instance'], | ||||
|  | ||||
|     data () { | ||||
|       return { | ||||
|         isShowGrid2: false, | ||||
|         isShowGrid3: false, | ||||
|         isShowGrid4: false, | ||||
|         isShowGrid5: false, | ||||
|         currIndex2: 0, | ||||
|         girdId1: '', | ||||
|         currIndex3: 0, | ||||
|         currIndex4: 0, | ||||
|         currIndex5: 0, | ||||
|         girdInfoList2: [], | ||||
|         girdInfoList3: [], | ||||
|         girdInfoList4: [], | ||||
|         girdInfoList5: [], | ||||
|         girdName2: '', | ||||
|         girdName3: '', | ||||
|         girdName4: '', | ||||
|         girdName5: '', | ||||
|         girdNum3: 0, | ||||
|         girdNum4: 0, | ||||
|         girdNum5: 0, | ||||
|         currGird: '', | ||||
|         girdName1: '' | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     mounted () { | ||||
|       this.$nextTick(() => { | ||||
|         document.addEventListener('keydown', this.onKeyDown) | ||||
|       }) | ||||
|       this.getInfo() | ||||
|     }, | ||||
|  | ||||
|     destroyed () { | ||||
|       document.removeEventListener('keydown', this.onKeyDown) | ||||
|     }, | ||||
|  | ||||
|     methods: { | ||||
|       onKeyDown (e) { | ||||
|         if (e.keyCode == 27) { | ||||
|           this.isShowGrid2 = false | ||||
|           this.isShowGrid3 = false | ||||
|           this.isShowGrid4 = false | ||||
|           this.isShowGrid5 = false | ||||
|         } | ||||
|       }, | ||||
|  | ||||
|       onGrid2Click (id, name) { | ||||
|         // this.currIndex2 = index | ||||
|         // this.girdName2 = item.girdName | ||||
|         this.currIndex3 = -1 | ||||
|         this.currIndex4 = -1 | ||||
|         this.currIndex5 = -1 | ||||
|         this.isShowGrid2 = false | ||||
|         this.girdInfoList3 = [] | ||||
|         this.girdInfoList4 = [] | ||||
|         this.girdInfoList5 = [] | ||||
|         this.$emit('nodeClick', id) | ||||
|  | ||||
|         this.currGird = name | ||||
|         this.getInfo(id) | ||||
|       }, | ||||
|  | ||||
|       onGrid3Click (item, index) { | ||||
|         this.currIndex3 = index | ||||
|         this.girdName3 = item.girdName | ||||
|         this.currIndex4 = -1 | ||||
|         this.currIndex5 = -1 | ||||
|         this.girdNum3 = 1 | ||||
|         this.isShowGrid3 = false | ||||
|         this.$emit('nodeClick', { | ||||
|           id: item.id, | ||||
|           level: 2 | ||||
|         }) | ||||
|         this.girdInfoList4 = [] | ||||
|         this.girdInfoList5 = [] | ||||
|         this.currGird = item.girdName | ||||
|         this.getInfo(item.id) | ||||
|       }, | ||||
|  | ||||
|       onGrid4Click (item, index) { | ||||
|         this.currIndex4 = index | ||||
|         this.girdName4 = item.girdName | ||||
|         this.currIndex5 = -1 | ||||
|         this.girdNum4 = 1 | ||||
|         this.isShowGrid4 = false | ||||
|         this.$emit('nodeClick', { | ||||
|           id: item.id, | ||||
|           level: 3 | ||||
|         }) | ||||
|         this.girdInfoList5 = [] | ||||
|  | ||||
|         this.currGird = item.girdName | ||||
|         this.getInfo(item.id) | ||||
|       }, | ||||
|  | ||||
|       onGrid5Click (item, index) { | ||||
|         this.currIndex5 = index | ||||
|         this.girdName5 = item.girdName | ||||
|         this.isShowGrid5 = false | ||||
|         this.girdNum5 = 1 | ||||
|         this.$emit('nodeClick', { | ||||
|           id: item.id, | ||||
|           level: 4 | ||||
|         }) | ||||
|  | ||||
|         this.currGird = item.girdName | ||||
|         this.getInfo(item.id) | ||||
|       }, | ||||
|  | ||||
|       getInfo (id) { | ||||
|         this.instance.post(`/app/yyx_appgirdinfo/queryGirdInfo?id=${id || ''}`).then(res => { | ||||
|           if (res.code === 0) { | ||||
|             res.data.girdInfoList2 && (this.girdInfoList3 = res.data.girdInfoList2) | ||||
|             res.data.girdInfoList3 && (this.girdInfoList4 = res.data.girdInfoList3) | ||||
|             res.data.girdInfoList4 && (this.girdInfoList5 = res.data.girdInfoList4) | ||||
|  | ||||
|             res.data.girdName1 && (this.girdName2 = res.data.girdName1) | ||||
|             res.data.girdName2 && (this.girdName3 = res.data.girdName2) | ||||
|             res.data.girdName3 && (this.girdName4 = res.data.girdName3) | ||||
|             res.data.girdName4 && (this.girdName5 = res.data.girdName4) | ||||
|  | ||||
|             if (this.girdId1) { | ||||
|               this.girdName2 = res.data.girdName1 | ||||
|               this.girdId1 = res.data.girdId1 | ||||
|             } | ||||
|  | ||||
|             res.data.girdNum2 != null && (this.girdNum3 = res.data.girdNum2) | ||||
|             res.data.girdNum3 != null && (this.girdNum4 = res.data.girdNum3) | ||||
|             res.data.girdNum4 != null && (this.girdNum5 = res.data.girdNum4) | ||||
|  | ||||
|             if (!id) { | ||||
|               this.currGird = res.data.girdName1 | ||||
|             } | ||||
|           } | ||||
|         }) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss"> | ||||
|   .pdgrid { | ||||
|     position: relative; | ||||
|     width: 100%; | ||||
|     height: 100%; | ||||
|     overflow: hidden; | ||||
|     box-sizing: border-box; | ||||
|     background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/middle-bg.png) no-repeat center; | ||||
|     background-size: contain; | ||||
|  | ||||
|     .fade-enter-active, .fade-leave-active { | ||||
|       transition: opacity .3s ease-in-out; | ||||
|     } | ||||
|     .fade-enter, .fade-leave-to { | ||||
|       opacity: 0; | ||||
|     } | ||||
|  | ||||
|     * { | ||||
|       box-sizing: border-box; | ||||
|     } | ||||
|  | ||||
|     .pdgrid-grid__title { | ||||
|       position: absolute; | ||||
|       top: 40px; | ||||
|       left: 50%; | ||||
|       width: 271px; | ||||
|       height: 53px; | ||||
|       line-height: 53px; | ||||
|       text-align: center; | ||||
|       background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/grid-title-sbg.png) no-repeat center; | ||||
|       background-size: 100% 100%; | ||||
|       cursor: pointer; | ||||
|       transform: translateX(-50%); | ||||
|       transition: opacity ease 0.3s; | ||||
|  | ||||
|       &:hover { | ||||
|         opacity: 0.8; | ||||
|       } | ||||
|  | ||||
|       h2 { | ||||
|         width: 182px; | ||||
|         margin: 0 auto; | ||||
|         white-space: nowrap; | ||||
|         overflow: hidden; | ||||
|         text-overflow: ellipsis; | ||||
|         color: #FFFFFF; | ||||
|         font-size: 21px; | ||||
|         text-shadow: 0px 0px 13px rgb(59 182 255 / 80%); | ||||
|         background: #fff; | ||||
|         -webkit-background-clip: text; | ||||
|         -webkit-text-fill-color: transparent; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .pdgrid-title { | ||||
|       position: absolute; | ||||
|       top: 200px; | ||||
|       left: 50%; | ||||
|       min-width: 640px; | ||||
|       height: 80px; | ||||
|       line-height: 80px; | ||||
|       text-align: center; | ||||
|       background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/middle-titlebg.png) no-repeat center; | ||||
|       background-size: 100% 100%; | ||||
|       transform: translateX(-50%); | ||||
|  | ||||
|       h2 { | ||||
|         color: #FFFFFF; | ||||
|         font-size: 22px; | ||||
|         white-space: nowrap; | ||||
|         text-shadow: 0px 0px 13px rgb(59 182 255 / 80%); | ||||
|         background: #fff; | ||||
|         -webkit-background-clip: text; | ||||
|         -webkit-text-fill-color: transparent; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .pdgrid-body { | ||||
|       display: flex; | ||||
|       position: absolute; | ||||
|       justify-content: space-between; | ||||
|       bottom: 200px; | ||||
|       left: 0; | ||||
|       width: 100%; | ||||
|       padding: 0 112px; | ||||
|  | ||||
|       .pdgrid-body__item { | ||||
|         display: flex; | ||||
|         flex-direction: column; | ||||
|         width: 200px; | ||||
|         height: 187px; | ||||
|         align-items: center; | ||||
|         padding-top: 71px; | ||||
|         cursor: pointer; | ||||
|         background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/item-bg.png) no-repeat center; | ||||
|         background-size: 100% 100%; | ||||
|         transition: opacity ease 0.3s; | ||||
|  | ||||
|         &:hover { | ||||
|           opacity: 0.8; | ||||
|         } | ||||
|  | ||||
|         &:nth-of-type(2) { | ||||
|           position: relative; | ||||
|           top: 67px; | ||||
|         } | ||||
|  | ||||
|         h2 { | ||||
|           font-size: 36px; | ||||
|           color: #FFFFFF; | ||||
|           text-shadow: 0px 0px 13px rgb(59 182 255 / 80%); | ||||
|           background: #fff; | ||||
|           -webkit-background-clip: text; | ||||
|           -webkit-text-fill-color: transparent; | ||||
|         } | ||||
|  | ||||
|         p { | ||||
|           max-width: 164px; | ||||
|           margin-top: 4px; | ||||
|           padding: 0 16px; | ||||
|           font-size: 16px; | ||||
|           color: #FFFFFF; | ||||
|           text-shadow: 0px 0px 13px rgb(59 182 255 / 80%); | ||||
|           background: #fff; | ||||
|           -webkit-background-clip: text; | ||||
|           font-weight: 600; | ||||
|           white-space: nowrap; | ||||
|           overflow: hidden; | ||||
|           text-overflow: ellipsis; | ||||
|           -webkit-text-fill-color: transparent; | ||||
|         } | ||||
|  | ||||
|         .bottom { | ||||
|           display: flex; | ||||
|           align-items: center; | ||||
|  | ||||
|           i { | ||||
|             width: 0px; | ||||
|             height: 0px; | ||||
|             border: 6px solid transparent; | ||||
|             border-top-color: transparent; | ||||
|             border-bottom-color: transparent; | ||||
|             border-left-color: transparent; | ||||
|             border-right-color: #FFCB42; | ||||
|  | ||||
|             &.right { | ||||
|               width: 0px; | ||||
|               height: 0px; | ||||
|               border: 6px solid transparent; | ||||
|               border-top-color: transparent; | ||||
|               border-bottom-color: transparent; | ||||
|               border-left-color: #FFCB42; | ||||
|               border-right-color: transparent; | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .grid-dialog { | ||||
|       position: fixed; | ||||
|       top: 0; | ||||
|       left: 0; | ||||
|       z-index: 111; | ||||
|       width: 100%; | ||||
|       height: 100%; | ||||
|  | ||||
|       & > .mask { | ||||
|         position: absolute; | ||||
|         left: 0; | ||||
|         top: 0; | ||||
|         z-index: 1; | ||||
|         width: 100%; | ||||
|         height: 100%; | ||||
|         background: rgba(0, 0, 0, 0.5); | ||||
|       } | ||||
|  | ||||
|       .grid-container { | ||||
|         display: flex; | ||||
|         position: absolute; | ||||
|         flex-direction: column; | ||||
|         left: 50%; | ||||
|         top: 50%; | ||||
|         z-index: 2; | ||||
|         width: 640px; | ||||
|         height: 640px; | ||||
|         background: rgba(7,13,41,0.9); | ||||
|         border: 1px solid #144662; | ||||
|         transform: translate(-50%, -50%); | ||||
|  | ||||
|         & > h2 { | ||||
|           width: 100%; | ||||
|           height: 67px; | ||||
|           line-height: 67px; | ||||
|           padding: 0 20px; | ||||
|           text-align: center; | ||||
|           color: #FFFFFF; | ||||
|           font-size: 24px; | ||||
|           white-space: nowrap; | ||||
|           overflow: hidden; | ||||
|           text-overflow: ellipsis; | ||||
|           text-shadow: 0px 0px 13px rgb(59 182 255 / 80%); | ||||
|           background: url(https://cdn.cunwuyun.cn/dvcp/dv/pddv/grid-title-bg.png) no-repeat center; | ||||
|           background-size: 100% 100%; | ||||
|         } | ||||
|  | ||||
|         .grid-list { | ||||
|           flex: 1; | ||||
|           overflow-y: auto; | ||||
|  | ||||
|           & > div { | ||||
|             height: 67px; | ||||
|             line-height: 67px; | ||||
|             padding: 0 20px; | ||||
|             text-align: center; | ||||
|             color: #FFFFFF; | ||||
|             font-size: 27px; | ||||
|             cursor: pointer; | ||||
|             white-space: nowrap; | ||||
|             overflow: hidden; | ||||
|             text-overflow: ellipsis; | ||||
|             transition: all ease 0.5s; | ||||
|  | ||||
|             &.grid-active { | ||||
|               background: linear-gradient(270deg, rgba(0,48,124,0) 0%, #00307C 16%, rgba(0,99,255,0.9100) 50%, rgba(0,48,124,0.8200) 87%, rgba(0,48,124,0) 100%); | ||||
|               box-shadow: inset 0px -1px 0px 0px rgba(16,34,54,1); | ||||
|               text-shadow: 0px 3px 5px rgba(0,0,0,0.5000); | ||||
|             } | ||||
|  | ||||
|             &:hover { | ||||
|               background: linear-gradient(270deg, rgba(0,48,124,0) 0%, #00307C 16%, rgba(0,99,255,0.9100) 50%, rgba(0,48,124,0.8200) 87%, rgba(0,48,124,0) 100%); | ||||
|               box-shadow: inset 0px -1px 0px 0px rgba(16,34,54,1); | ||||
|               text-shadow: 0px 3px 5px rgba(0,0,0,0.5000); | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </style> | ||||
							
								
								
									
										187
									
								
								packages/bigscreen/dv/components/chartOps.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,187 @@ | ||||
| export const pieChart2 = { | ||||
|   legend: { | ||||
|     bottom: 0, | ||||
|     itemGap: 14, | ||||
|     itemWidth: 16, | ||||
|     itemHeight: 5, | ||||
|     textStyle: {color: "#fff", fontSize: 14} | ||||
|   }, | ||||
|   grid: { | ||||
|     height: 260 | ||||
|   }, | ||||
|   xAxis: {show: false}, | ||||
|   yAxis: {show: false}, | ||||
|   tooltip: { | ||||
|     backgroundColor: "rgba(14, 51, 111, 0.9)", | ||||
|     borderColor: "#1A6ABC", | ||||
|     textStyle: {color: "#fff"} | ||||
|   }, | ||||
|   series: { | ||||
|     type: "pie", | ||||
|     minShowLabelAngle: 10, | ||||
|     radius: [70, 81], | ||||
|     itemStyle: { | ||||
|       borderColor: "#fff", | ||||
|       borderWidth: 2 | ||||
|     }, | ||||
|     label: { | ||||
|       color: "#A8D7F3", | ||||
|       fontSize: 14, | ||||
|       formatter: "{name|{b}}\n{v|{d}%}", | ||||
|       minMargin: 5, | ||||
|       edgeDistance: 10, | ||||
|       lineHeight: 22, | ||||
|       rich: { | ||||
|         v: { | ||||
|           color: "#fff" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     labelLine: {}, | ||||
|     labelLayout: function (params) { | ||||
|       let points = params.labelLinePoints, | ||||
|           isLeft = points[2][0] < points[1][0] | ||||
|       points[2][0] = | ||||
|           points[2][0] + (params.labelRect.width + 4) * (isLeft ? -1 : 1) | ||||
|       return { | ||||
|         labelLinePoints: points | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   render: (h, params) => { | ||||
|     const formatNum = num => { | ||||
|       if (num >= 10000000) { | ||||
|         return num / 10000000 + "千万" | ||||
|       } | ||||
|  | ||||
|       if (num >= 10000) { | ||||
|         return num / 10000 + "万" | ||||
|       } | ||||
|  | ||||
|       return parseFloat(num.toFixed(2)) | ||||
|     } | ||||
|  | ||||
|     let total = params.data.reduce((t, e) => { | ||||
|       return t + Number(Object.values(e)?.[1] || 0) | ||||
|     }, 0) | ||||
|     return h( | ||||
|         "div", | ||||
|         { | ||||
|           style: { | ||||
|             height: "162px", | ||||
|             width: "162px", | ||||
|             color: "#8BCCFF", | ||||
|             left: "50%", | ||||
|             top: "50%", | ||||
|             display: "flex", | ||||
|             alignItems: "center", | ||||
|             justifyContent: "center", | ||||
|             flexDirection: "column", | ||||
|             position: "absolute", | ||||
|             transform: "translate(-50%,-50%)", | ||||
|             backgroundImage: `url('https://cdn.cunwuyun.cn/dvcp/dv/tpl/pie2Circle.png')`, | ||||
|             backgroundPosition: "center" | ||||
|           } | ||||
|         }, | ||||
|         [ | ||||
|           h( | ||||
|               "span", | ||||
|               {style: {fontSize: "28px", color: "#fff", fontFamily: "DIN"}}, | ||||
|               formatNum(total) | ||||
|           ), | ||||
|           h("span", null, "总量") | ||||
|         ] | ||||
|     ) | ||||
|   } | ||||
| } | ||||
| export const barChart1 = { | ||||
|   legend: { | ||||
|     right: 0, | ||||
|     itemHeight: 5, | ||||
|     itemWidth: 16, | ||||
|     textStyle: { color: '#fff' } | ||||
|   }, | ||||
|   yAxis: { | ||||
|     nameGap: 23, | ||||
|     minInterval: 1, | ||||
|     splitLine: { lineStyle: { color: 'rgba(255,255,255,.2)', type: 'dashed' } }, | ||||
|     axisLabel: { color: '#fff' }, | ||||
|     axisPointer: { show: false } | ||||
|   }, | ||||
|   axisPointer: { | ||||
|     type: 'shadow', | ||||
|     triggerTooltip: false, | ||||
|     shadowStyle: { color: 'rgba(46, 153, 255, .2)' } | ||||
|   }, | ||||
|   color: [ | ||||
|     { | ||||
|       type: 'linear', | ||||
|       x: 0, | ||||
|       x2: 0, | ||||
|       y: 0, | ||||
|       y2: 1, | ||||
|       colorStops: [ | ||||
|         { offset: 0, color: 'rgba(66, 187, 255, 1)' }, | ||||
|         { offset: 1, color: 'rgba(37, 143, 255, 0.2)' } | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       type: 'linear', | ||||
|       x: 0, | ||||
|       x2: 0, | ||||
|       y: 0, | ||||
|       y2: 1, | ||||
|       colorStops: [ | ||||
|         { offset: 0, color: 'rgba(66, 255, 254, 1)' }, | ||||
|         { offset: 1, color: 'rgba(37, 255, 246, 0.2)' } | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       type: 'linear', | ||||
|       x: 0, | ||||
|       x2: 0, | ||||
|       y: 0, | ||||
|       y2: 1, | ||||
|       colorStops: [ | ||||
|         { offset: 0, color: 'rgba(97, 253, 185, 1)' }, | ||||
|         { offset: 1, color: 'rgba(97, 253, 185, 0.2)' } | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       type: 'linear', | ||||
|       x: 0, | ||||
|       x2: 0, | ||||
|       y: 0, | ||||
|       y2: 1, | ||||
|       colorStops: [ | ||||
|         { offset: 0, color: 'rgba(253, 108, 57, 1)' }, | ||||
|         { offset: 1, color: 'rgba(253, 108, 57, 0.2)' } | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       type: 'linear', | ||||
|       x: 0, | ||||
|       x2: 0, | ||||
|       y: 0, | ||||
|       y2: 1, | ||||
|       colorStops: [ | ||||
|         { offset: 0, color: 'rgba(248, 187, 25, 1)' }, | ||||
|         { offset: 1, color: 'rgba(55, 39, 5, 1)' } | ||||
|       ] | ||||
|     } | ||||
|   ], | ||||
|   daemon: { | ||||
|     type: 'bar', | ||||
|     label: { | ||||
|       show: true, | ||||
|       position: 'top', | ||||
|       color: '#fff', | ||||
|       formatter: e => { | ||||
|         return e.data[e.seriesName] || '' | ||||
|       } | ||||
|     }, | ||||
|     barWidth: 16, | ||||
|     barCategoryGap: 40, | ||||
|     itemStyle: {} | ||||
|   } | ||||
| } | ||||
							
								
								
									
										1
									
								
								packages/bigscreen/dv/components/geoJSon/qxnGeoJSON.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,66 @@ | ||||
| <template> | ||||
|   <div class="doc-circulation ailist-wrapper"> | ||||
|     <keep-alive :include="['List']"> | ||||
|       <component ref="component" :is="component" @change="onChange" :params="params" :instance="instance" :dict="dict"></component> | ||||
|     </keep-alive> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   import List from './components/List' | ||||
|   import Add from './components/Add' | ||||
|  | ||||
|   export default { | ||||
|     name: 'AppConvenienceAddressBook', | ||||
|     label: '便民通讯录', | ||||
|  | ||||
|     props: { | ||||
|       instance: Function, | ||||
|       dict: Object | ||||
|     }, | ||||
|  | ||||
|     data () { | ||||
|       return { | ||||
|         component: 'List', | ||||
|         params: {}, | ||||
|         include: [] | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     components: { | ||||
|       Add, | ||||
|       List | ||||
|     }, | ||||
|  | ||||
|     mounted () { | ||||
|     }, | ||||
|  | ||||
|     methods: { | ||||
|       onChange (data) { | ||||
|         if (data.type === 'Add') { | ||||
|           this.component = 'Add' | ||||
|           this.params = data.params | ||||
|         } | ||||
|  | ||||
|         if (data.type === 'list') { | ||||
|           this.component = 'List' | ||||
|           this.params = data.params | ||||
|  | ||||
|           this.$nextTick(() => { | ||||
|             if (data.isRefresh) { | ||||
|               this.$refs.component.getList() | ||||
|             } | ||||
|           }) | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss"> | ||||
|   .doc-circulation { | ||||
|     height: 100%; | ||||
|     background: #F3F6F9; | ||||
|     overflow: auto; | ||||
|   } | ||||
| </style> | ||||
							
								
								
									
										132
									
								
								packages/conv/AppConvenienceAddressBook/components/Add.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,132 @@ | ||||
| <template> | ||||
|   <ai-detail> | ||||
|     <template slot="title"> | ||||
|       <ai-title :title="params.id ? '编辑通讯录' : '添加通讯录'" isShowBack isShowBottomBorder @onBackClick="cancel(false)"> | ||||
|       </ai-title> | ||||
|     </template> | ||||
|     <template slot="content"> | ||||
|       <ai-card title="基本信息"> | ||||
|         <template #content> | ||||
|           <el-form ref="CBookForm" class="ai-form" :model="form" label-width="110px" label-position="right"> | ||||
|             <el-form-item label="地区" style="width: 100%;" prop="codeName"> | ||||
|               <span style="color: #666;">{{ form.areaName }}</span> | ||||
|             </el-form-item> | ||||
|             <el-form-item style="width: 100%" label="名称" prop="name" :rules="[{ required: true, message: '请输入名称', trigger: 'blur' }]"> | ||||
|               <el-input size="small" placeholder="请输入名称" show-word-limit v-model="form.name" :maxlength="30"></el-input> | ||||
|             </el-form-item> | ||||
|             <el-form-item style="width: 100%" label="类型" prop="type" :rules="[{ required: true, message: '请输入类型', trigger: 'change' }]"> | ||||
|               <el-input size="small" placeholder="请输入类型" v-model="form.type"></el-input> | ||||
|             </el-form-item> | ||||
|             <el-form-item style="width: 100%" label="电话" prop="phone" :rules="[{required: true, validator: regPhone, trigger: 'blur' }]"> | ||||
|               <el-input size="small" placeholder="请输入电话" show-word-limit maxlength="11" v-model="form.phone"></el-input> | ||||
|             </el-form-item> | ||||
|             <el-form-item style="width: 100%;" label="是否公开" prop="isPublic" :rules="[{ required: true, message: '请选择是否公开', trigger: 'change' }]"> | ||||
|               <el-radio-group v-model="form.isPublic"> | ||||
|                 <el-radio label="1">是</el-radio> | ||||
|                 <el-radio label="0">否</el-radio> | ||||
|               </el-radio-group> | ||||
|             </el-form-item> | ||||
|           </el-form> | ||||
|         </template> | ||||
|       </ai-card> | ||||
|     </template> | ||||
|     <template #footer> | ||||
|       <el-button @click="cancel">取消</el-button> | ||||
|       <el-button type="primary" @click="confirm">提交</el-button> | ||||
|     </template> | ||||
|   </ai-detail> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   export default { | ||||
|     name: 'Add', | ||||
|  | ||||
|     props: { | ||||
|       instance: Function, | ||||
|       dict: Object, | ||||
|       params: Object | ||||
|     }, | ||||
|  | ||||
|     data () { | ||||
|       var regPhone = (rule, value, callback) => { | ||||
|         if (!value) { | ||||
|           return callback(new Error('请输入电话')) | ||||
|         } else { | ||||
|           const reg = /^[0-9]{3,11}$/ | ||||
|           if (reg.test(value)) { | ||||
|             callback() | ||||
|           } else { | ||||
|             return callback(new Error('请输入正确的电话号码')) | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|       return { | ||||
|         info: {}, | ||||
|         form: { | ||||
|           areaId: '', | ||||
|           name: '', | ||||
|           areaName: '', | ||||
|           phone: '', | ||||
|           isPublic: '1', | ||||
|           type: '', | ||||
|         }, | ||||
|         id: '', | ||||
|         regPhone, | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     created () { | ||||
|       if (this.params && this.params.areaId && !this.params.id) { | ||||
|         this.form.areaId = this.params.areaId | ||||
|         this.form.areaName = this.params.areaName | ||||
|       } | ||||
|  | ||||
|       if (this.params && this.params.id) { | ||||
|         this.id = this.params.id | ||||
|         this.getInfo(this.params.id) | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     methods: { | ||||
|       getInfo (id) { | ||||
|         this.instance.post(`/app/appconvenientaddressbook/queryDetailById?id=${id}`).then(res => { | ||||
|           if (res?.data) { | ||||
|             this.form = res.data | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       onClose () { | ||||
|         this.form.explain = '' | ||||
|       }, | ||||
|  | ||||
|       confirm () { | ||||
|         this.$refs.CBookForm.validate((valid) => { | ||||
|           if (valid) { | ||||
|             this.instance.post(`/app/appconvenientaddressbook/addOrUpdate`, { | ||||
|               ...this.form, | ||||
|               id: this.params.id || '' | ||||
|             }).then(res => { | ||||
|               if (res.code == 0) { | ||||
|                 this.$message.success('提交成功') | ||||
|                 setTimeout(() => { | ||||
|                   this.cancel(true) | ||||
|                 }, 600) | ||||
|               } | ||||
|             }) | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       cancel (isRefresh) { | ||||
|         this.$emit('change', { | ||||
|           type: 'list', | ||||
|           isRefresh: !!isRefresh | ||||
|         }) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| <style scoped lang="scss"> | ||||
| </style> | ||||
							
								
								
									
										438
									
								
								packages/conv/AppConvenienceAddressBook/components/List.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,438 @@ | ||||
| <template> | ||||
|   <ai-list class="villagecode"> | ||||
|     <template slot="title"> | ||||
|       <ai-title title="便民通讯录" isShowBottomBorder></ai-title> | ||||
|     </template> | ||||
|     <template #left> | ||||
|       <div class="villagecode-left"> | ||||
|         <div class="villagecode-left__title"> | ||||
|           <h2>地区</h2> | ||||
|         </div> | ||||
|         <div class="addressBook-left__list"> | ||||
|           <div class="addressBook-left__list--title"> | ||||
|             <el-input | ||||
|                 class="addressBook-left__list--search" | ||||
|                 size="mini" | ||||
|                 clearable | ||||
|                 placeholder="请输入地区名称" | ||||
|                 v-model="unitName" | ||||
|                 suffix-icon="iconfont iconSearch"> | ||||
|             </el-input> | ||||
|           </div> | ||||
|           <el-tree | ||||
|               :filter-node-method="filterNode" | ||||
|               ref="tree" | ||||
|               :props="defaultProps" | ||||
|               node-key="id" | ||||
|               :data="areaTree" | ||||
|               highlight-current | ||||
|               :current-node-key="search.areaId" | ||||
|               :default-expanded-keys="defaultExpanded" | ||||
|               :default-checked-keys="defaultChecked" | ||||
|               @current-change="onTreeChange"> | ||||
|           </el-tree> | ||||
|         </div> | ||||
|       </div> | ||||
|     </template> | ||||
|     <template slot="content"> | ||||
|       <ai-search-bar class="search-bar"> | ||||
|         <template #left> | ||||
|           <el-button size="small" type="primary" :disabled="isShowAdd" icon="iconfont iconAdd" @click="toAdd('')">添加 | ||||
|           </el-button> | ||||
|           <ai-import :instance="instance" :dict="dict" type="appconvenientaddressbook" name="便民通讯录" | ||||
|                      @success="getList()"> | ||||
|             <el-button icon="iconfont iconImport">导入</el-button> | ||||
|           </ai-import> | ||||
|           <ai-download :instance="instance" url="/app/appconvenientaddressbook/export" :params="search" fileName="便民通讯录" | ||||
|                        :disabled="tableData.length == 0"> | ||||
|             <el-button icon="iconfont iconExported" :disabled="tableData.length == 0">导出</el-button> | ||||
|           </ai-download> | ||||
|         </template> | ||||
|         <template slot="right"> | ||||
|           <el-input | ||||
|               v-model="search.name" | ||||
|               class="search-input" | ||||
|               size="small" | ||||
|               v-throttle="() => {search.current = 1, getList()}" | ||||
|               placeholder="请输入名称/电话/类型" | ||||
|               clearable | ||||
|               @clear="search.current = 1, search.name = '', getList()" | ||||
|               suffix-icon="iconfont iconSearch"> | ||||
|           </el-input> | ||||
|         </template> | ||||
|       </ai-search-bar> | ||||
|       <ai-table | ||||
|           :tableData="tableData" | ||||
|           :col-configs="colConfigs" | ||||
|           :total="total" | ||||
|           style="margin-top: 6px;" | ||||
|           :current.sync="search.current" | ||||
|           :size.sync="search.size" | ||||
|           @getList="getList"> | ||||
|         <el-table-column slot="isPublic" label="是否公开" align="center"> | ||||
|           <template slot-scope="{ row }"> | ||||
|             <el-switch | ||||
|                 v-model="row.isPublic" | ||||
|                 active-value="1" | ||||
|                 @change="e => onChange(row.id, e)" | ||||
|                 inactive-value="0"> | ||||
|             </el-switch> | ||||
|           </template> | ||||
|         </el-table-column> | ||||
|         <el-table-column slot="options" width="120px" fixed="right" label="操作" align="center"> | ||||
|           <template slot-scope="{ row }"> | ||||
|             <div class="table-options"> | ||||
|               <el-button type="text" @click="toAdd(row.id)">编辑</el-button> | ||||
|               <el-button type="text" @click="remove(row.id)">删除</el-button> | ||||
|             </div> | ||||
|           </template> | ||||
|         </el-table-column> | ||||
|       </ai-table> | ||||
|     </template> | ||||
|   </ai-list> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import {mapState} from 'vuex' | ||||
|  | ||||
| export default { | ||||
|   name: 'List', | ||||
|  | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object | ||||
|   }, | ||||
|  | ||||
|   data() { | ||||
|     return { | ||||
|       search: { | ||||
|         current: 1, | ||||
|         size: 10, | ||||
|         name: '', | ||||
|         areaId: '' | ||||
|       }, | ||||
|       defaultExpanded: [], | ||||
|       defaultChecked: [], | ||||
|       areaTree: [], | ||||
|       defaultProps: { | ||||
|         children: 'children', | ||||
|         label: 'name' | ||||
|       }, | ||||
|       currIndex: -1, | ||||
|       total: 10, | ||||
|       colConfigs: [ | ||||
|         {prop: 'name', label: '名称', align: 'left'}, | ||||
|         {prop: 'type', label: '类型', align: 'center'}, | ||||
|         {prop: 'phone', label: '电话', align: 'center'}, | ||||
|         {prop: 'createTime', align: 'center', label: '创建时间'}, | ||||
|         {slot: 'isPublic', label: '是否公开', align: 'center'} | ||||
|       ], | ||||
|       areaName: '', | ||||
|       unitName: '', | ||||
|       tableData: [] | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   computed: { | ||||
|     ...mapState(['user']), | ||||
|  | ||||
|     isShowAdd() { | ||||
|       return false | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   watch: { | ||||
|     unitName(val) { | ||||
|       this.$refs.tree.filter(val) | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   created() { | ||||
|     this.search.areaId = this.user.info.areaId | ||||
|     this.areaName = this.user.info.areaName | ||||
|     this.getTree() | ||||
|     this.getList() | ||||
|  | ||||
|     this.$nextTick(() => { | ||||
|     }) | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     getList() { | ||||
|       this.instance.post(`/app/appconvenientaddressbook/list`, null, { | ||||
|         params: { | ||||
|           ...this.search | ||||
|         } | ||||
|       }).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           this.tableData = res.data.records | ||||
|           this.total = res.data.total | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     onChange(id) { | ||||
|       this.instance.post(`/app/appconvenientaddressbook/enable?id=${id}`).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           this.$message.success('修改成功') | ||||
|           this.getList() | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     filterNode(value, data) { | ||||
|       if (!value) return true | ||||
|       return data.name.indexOf(value) !== -1 | ||||
|     }, | ||||
|  | ||||
|     onTreeChange(e) { | ||||
|       this.search.areaId = e.id | ||||
|       this.areaName = e.name | ||||
|       this.search.current = 1 | ||||
|  | ||||
|       this.$nextTick(() => { | ||||
|         this.getList() | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     getTree() { | ||||
|       this.instance.post(`/admin/area/queryAllArea?id=${this.user.info.areaId}`).then(res => { | ||||
|         if (res.code === 0) { | ||||
|           let parent = res.data.map(v => { | ||||
|             v.label = v.name | ||||
|             v.children = [] | ||||
|  | ||||
|             return v | ||||
|           }).filter(e => !e.parentid)[0] | ||||
|           this.defaultExpanded = [parent.id] | ||||
|           this.defaultChecked = [parent.id] | ||||
|           this.search.areaId = parent.id | ||||
|           this.addChild(parent, res.data) | ||||
|           this.areaTree = [parent] | ||||
|  | ||||
|           this.$nextTick(() => { | ||||
|             this.$refs.tree.setCurrentKey(parent.id) | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     addChild(parent, list) { | ||||
|       for (let i = 0; i < list.length; i++) { | ||||
|         if (list[i].parentId === parent.id) { | ||||
|           parent.children.push(list[i]) | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       if (list.length > 0) { | ||||
|         parent['children'].map(v => this.addChild(v, list)) | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     remove(id) { | ||||
|       this.$confirm('确定删除该数据?').then(() => { | ||||
|         this.instance.post(`/app/appconvenientaddressbook/delete?ids=${id}`).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             this.$message.success('删除成功!') | ||||
|             this.getList() | ||||
|           } | ||||
|         }) | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     toAdd(id) { | ||||
|       this.$emit('change', { | ||||
|         type: 'Add', | ||||
|         params: { | ||||
|           areaName: this.areaName, | ||||
|           id: id || '', | ||||
|           areaId: this.search.areaId | ||||
|         } | ||||
|       }) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .villagecode { | ||||
|   .table-tags { | ||||
|     .el-tag { | ||||
|       margin-right: 8px; | ||||
|  | ||||
|       &:last-child { | ||||
|         margin-right: 0; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .addressBook-left__list { | ||||
|     height: calc(100% - 40px); | ||||
|     padding: 8px 8px; | ||||
|     overflow: auto; | ||||
|  | ||||
|     .addressBook-left__tags--item { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       justify-content: space-between; | ||||
|       height: 40px; | ||||
|       padding: 0 8px 0 16px; | ||||
|       color: #222222; | ||||
|  | ||||
|       &.addressBook-left__tags--item-active, &:hover { | ||||
|         background: #E8EFFF; | ||||
|         color: #2266FF; | ||||
|  | ||||
|         i, span { | ||||
|           color: #2266FF; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       span { | ||||
|         font-size: 14px; | ||||
|       } | ||||
|  | ||||
|       i { | ||||
|         cursor: pointer; | ||||
|         color: #8e9ebf; | ||||
|         font-size: 16px; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .addressBook-left__list--title { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       margin-bottom: 8px; | ||||
|  | ||||
|       .addressBook-left__list--search { | ||||
|         flex: 1; | ||||
|  | ||||
|         :deep( input ){ | ||||
|           width: 100%; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       .el-button { | ||||
|         width: 84px; | ||||
|         flex-shrink: 1; | ||||
|         margin-right: 8px; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     span { | ||||
|       color: #222222; | ||||
|       font-size: 14px; | ||||
|     } | ||||
|  | ||||
|     :deep( .el-tree ){ | ||||
|       background: transparent; | ||||
|  | ||||
|       .el-tree-node__expand-icon.is-leaf { | ||||
|         color: transparent !important; | ||||
|       } | ||||
|  | ||||
|       .el-tree-node__content > .el-tree-node__expand-icon { | ||||
|         padding: 4px; | ||||
|       } | ||||
|  | ||||
|       .el-tree-node__content { | ||||
|         height: 32px; | ||||
|       } | ||||
|  | ||||
|       .el-tree__empty-text { | ||||
|         color: #222; | ||||
|         font-size: 14px; | ||||
|       } | ||||
|  | ||||
|       .el-tree-node__children .el-tree-node__content { | ||||
|         height: 32px; | ||||
|       } | ||||
|  | ||||
|       .el-tree-node__content:hover { | ||||
|         background: #E8EFFF; | ||||
|         color: #222222; | ||||
|         border-radius: 2px; | ||||
|       } | ||||
|  | ||||
|       .is-current > .el-tree-node__content { | ||||
|         &:hover { | ||||
|           background: #2266FF; | ||||
|           color: #fff; | ||||
|         } | ||||
|  | ||||
|         background: #2266FF; | ||||
|  | ||||
|         span { | ||||
|           color: #fff; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep( .ai-list__content--left ){ | ||||
|     margin-right: 2px; | ||||
|   } | ||||
|  | ||||
|   .villagecode-left { | ||||
|     width: 100%; | ||||
|     height: auto; | ||||
|     background: #FAFAFB; | ||||
|  | ||||
|     .villagecode-left__title { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       height: 40px; | ||||
|       padding: 0 16px; | ||||
|       background: #fff; | ||||
|  | ||||
|       h2 { | ||||
|         color: #222; | ||||
|         font-size: 14px; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .villagecode-left__list { | ||||
|       height: calc(100% - 40px); | ||||
|       padding: 8px 0; | ||||
|       overflow: auto; | ||||
|  | ||||
|       span { | ||||
|         display: block; | ||||
|         height: 40px; | ||||
|         line-height: 40px; | ||||
|         padding: 0 24px; | ||||
|         color: #222222; | ||||
|         font-size: 14px; | ||||
|         cursor: pointer; | ||||
|         border-right: 2px solid transparent; | ||||
|         background: transparent; | ||||
|  | ||||
|         &:hover { | ||||
|           color: #2266FF; | ||||
|           background: #E8EFFF; | ||||
|         } | ||||
|  | ||||
|         &.left-active { | ||||
|           color: #2266FF; | ||||
|           border-color: #2266FF; | ||||
|           background: #E8EFFF; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep( .ai-list__content--right ){ | ||||
|  | ||||
|     .ai-list__content--right-wrapper { | ||||
|       min-height: 100%; | ||||
|     } | ||||
|   } | ||||
|  | ||||
| } | ||||
|  | ||||
| .message-info__img { | ||||
|   font-size: 0; | ||||
|   width: 144px; | ||||
|   height: 144px; | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										87
									
								
								packages/conv/AppDeviceConfig/AppDeviceConfig.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,87 @@ | ||||
| <template> | ||||
|   <ai-list class="AppDeviceConfig"> | ||||
|     <template slot="title"> | ||||
|       <ai-title title="设备配置" :isShowBottomBorder="false" :fullname.sync="areaName" v-model="areaId" :instance="instance" @change="onAreaChange"></ai-title> | ||||
|     </template> | ||||
|     <template slot="tabs"> | ||||
|       <el-tabs v-model="currIndex"> | ||||
|         <el-tab-pane v-for="(tab,i) in tabs" :key="i" :label="tab.label"> | ||||
|           <component :areaId="areaId" :ref="String(i)" v-if="currIndex == i" :is="tab.comp" @change="onChange" lazy :instance="instance" :dict="dict" :permissions="permissions"/> | ||||
|         </el-tab-pane> | ||||
|       </el-tabs> | ||||
|     </template> | ||||
|   </ai-list> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   import eyeList from './components/eyeList.vue' | ||||
|   import videoList from './components/videoList.vue' | ||||
|   import { mapState } from 'vuex' | ||||
|  | ||||
|   export default { | ||||
|     name: 'AppDeviceConfig', | ||||
|     label: '设备配置', | ||||
|  | ||||
|     components: { | ||||
|       eyeList, | ||||
|       videoList, | ||||
|     }, | ||||
|  | ||||
|     props: { | ||||
|       instance: Function, | ||||
|       dict: Object, | ||||
|       permissions: Function | ||||
|     }, | ||||
|  | ||||
|     computed: { | ||||
|       ...mapState(['user']), | ||||
|  | ||||
|       tabs () { | ||||
|         const tabList = [ | ||||
|           {label: '千里眼', name: 'eyeList', comp: eyeList, permission: ''}, | ||||
|           {label: '视联网', name: 'videoList', comp: videoList, permission: ''} | ||||
|         ] | ||||
|  | ||||
|         return tabList | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     data () { | ||||
|       return { | ||||
|         currIndex: '0', | ||||
|         component: 'eyeList', | ||||
|         params: {}, | ||||
|         areaId: '', | ||||
|         areaName: '' | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     created () { | ||||
|       this.areaId = this.user.info.areaId | ||||
|     }, | ||||
|  | ||||
|     methods: { | ||||
|       onChange (data) { | ||||
|         this.component = data.type | ||||
|         this.params = data.params | ||||
|  | ||||
|         this.$nextTick(() => { | ||||
|           if (data.isRefresh) { | ||||
|             this.$refs.component.getList() | ||||
|           } | ||||
|         }) | ||||
|          | ||||
|       }, | ||||
|  | ||||
|       onAreaChange () { | ||||
|         this.$refs[this.currIndex][0].changeArea() | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
|   .AppDeviceConfig { | ||||
|     height: 100%; | ||||
|   } | ||||
| </style> | ||||
							
								
								
									
										237
									
								
								packages/conv/AppDeviceConfig/components/eyeList.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,237 @@ | ||||
| <template> | ||||
|   <ai-list class="eyeList" isTabs> | ||||
|     <template slot="content"> | ||||
|       <ai-search-bar bottomBorder> | ||||
|         <template #left> | ||||
|           <el-button type="primary" icon="iconfont iconAdd" size="small" @click="add('添加设备配置', {})">添加</el-button> | ||||
|           <el-button icon="el-icon-delete" class="delete-btn del-btn-list" :disabled="!ids.length" @click="remove(ids)">删除</el-button> | ||||
|         </template> | ||||
|         <template slot="right"> | ||||
|           <el-input | ||||
|             v-model="search.condition" | ||||
|             class="search-input" | ||||
|             size="small" | ||||
|             v-throttle="() => {search.current = 1, getList()}" | ||||
|             placeholder="请输入CorpId" | ||||
|             clearable | ||||
|             @change="getList" | ||||
|             @clear="search.current = 1, search.condition = '', getList()" | ||||
|             suffix-icon="iconfont iconSearch"> | ||||
|           </el-input> | ||||
|         </template> | ||||
|       </ai-search-bar> | ||||
|       <ai-table | ||||
|         :tableData="tableData" | ||||
|         :col-configs="colConfigs" | ||||
|         :total="total" | ||||
|         v-loading="loading" | ||||
|         style="margin-top: 16px;" | ||||
|         :current.sync="search.current" | ||||
|         :size.sync="search.size" | ||||
|         @getList="getList" | ||||
|         @selection-change="v=>ids=v.map(e=>e.id)"> | ||||
|         <el-table-column slot="options" width="140px" fixed="right" label="操作" align="center"> | ||||
|           <template slot-scope="{ row }"> | ||||
|             <div class="table-options"> | ||||
|               <el-button type="text" @click="add('编辑设备配置', row)">编辑</el-button> | ||||
|               <el-button type="text" @click="refresh(row)">刷新</el-button> | ||||
|               <el-button type="text" @click="remove(row.id)">删除</el-button> | ||||
|             </div> | ||||
|           </template> | ||||
|         </el-table-column> | ||||
|         <el-table-column slot="flag" align="center" label="状态" width="100"> | ||||
|           <template v-slot="{ row }"> | ||||
|             <el-switch v-model="row.flag" @change="onChange(row)" active-value="1" inactive-value="0" | ||||
|                         active-color="#5088FF" inactive-color="#D0D4DC"></el-switch> | ||||
|           </template> | ||||
|         </el-table-column> | ||||
|       </ai-table> | ||||
|       <ai-dialog :title="dialogTitle" :visible.sync="dialog" width="800px"  @onConfirm="addForm" @closed="dialogForm={}"> | ||||
|         <el-form ref="addForm" :model="dialogForm" :rules="rules" size="small"  label-width="160px"> | ||||
|           <el-form-item label="CorpId" prop="corpId"> | ||||
|             <el-input v-model.trim="dialogForm.corpId" placeholder="请输入..." clearable :maxLength="50"/> | ||||
|           </el-form-item> | ||||
|           <el-form-item required label="状态"> | ||||
|              <el-radio-group v-model="dialogForm.flag"> | ||||
|               <el-radio :label="0">关闭</el-radio> | ||||
|               <el-radio :label="1">开启</el-radio> | ||||
|             </el-radio-group> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="AppId"> | ||||
|             <el-input v-model.trim="dialogForm.appId" placeholder="请输入..." clearable :maxLength="50" /> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="RSA"> | ||||
|             <el-input v-model.trim="dialogForm.rsa" placeholder="请输入..." clearable :maxLength="5000"  type="textarea" :rows="5"/> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="SECRET"> | ||||
|             <el-input v-model.trim="dialogForm.secret" placeholder="请输入..." clearable :maxLength="50" /> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="TOKEN"> | ||||
|             <el-input v-model.trim="dialogForm.token" placeholder="请输入..." clearable :maxLength="200"  type="textarea" :rows="2"/> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="结点ids"> | ||||
|             <el-input v-model.trim="dialogForm.orgIds" placeholder="请输入..." clearable :maxLength="50" /> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="版本号"> | ||||
|             <el-input v-model.trim="dialogForm.version" placeholder="请输入..." clearable :maxLength="50" /> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="大喇叭账号"> | ||||
|             <el-input v-model.trim="dialogForm.dlbName" placeholder="请输入..." clearable :maxLength="50" /> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="大喇叭密码"> | ||||
|             <el-input v-model.trim="dialogForm.dlbPwd" placeholder="请输入..." clearable :maxLength="50" /> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="大喇叭Token"> | ||||
|             <el-input v-model.trim="dialogForm.dlbToken" placeholder="请输入..." clearable :maxLength="50" /> | ||||
|           </el-form-item> | ||||
|         </el-form> | ||||
|       </ai-dialog> | ||||
|     </template> | ||||
|   </ai-list> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   import { mapState } from 'vuex' | ||||
|   export default { | ||||
|     name: 'eyeList', | ||||
|     props: { | ||||
|       instance: Function, | ||||
|       dict: Object, | ||||
|       areaId: String | ||||
|     }, | ||||
|  | ||||
|     data () { | ||||
|       return { | ||||
|         search: { | ||||
|           current: 1, | ||||
|           condition: '', | ||||
|           size: 10, | ||||
|         }, | ||||
|         ids: [], | ||||
|         tableData: [], | ||||
|         total: 0, | ||||
|         loading: false, | ||||
|         dialog: false, | ||||
|         dialogTitle: '', | ||||
|         dialogForm: {} | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     computed: { | ||||
|       ...mapState(['user']), | ||||
|  | ||||
|       param () { | ||||
|         return this.search | ||||
|       }, | ||||
|       rules() { | ||||
|         return { | ||||
|           corpId: [{required: true, message: "请输入CorpId"}], | ||||
|         } | ||||
|       }, | ||||
|       colConfigs() { | ||||
|         return [ | ||||
|           {type: "selection"}, | ||||
|           { prop: 'corpId', label: 'CorpId', fixed: 'left', width: 220 }, | ||||
|           { slot: 'flag', align: 'center', label: '状态', fixed: 'left', width: 120 }, | ||||
|           { prop: 'appId', align: 'center', label: 'AppId', width: 240 }, | ||||
|           { prop: 'rsa', align: 'center', label: 'RSA', width: 240 }, | ||||
|           { prop: 'secret', align: 'center', label: 'SECRET', width: 180 }, | ||||
|           { prop: 'token', align: 'center', label: 'TOKEN', width: 120 }, | ||||
|           { prop: 'orgIds', align: 'center', label: '结点ids', width: 120 }, | ||||
|           { prop: 'version', align: 'center', label: '版本号', width: 120 }, | ||||
|           { prop: 'dlbName', align: 'center', label: '大喇叭账号', width: 140 }, | ||||
|           { prop: 'dlbPwd', align: 'center', label: '大喇叭密码', width: 140 }, | ||||
|           { prop: 'dlbToken', align: 'center', label: '大喇叭Token', width: 180 }, | ||||
|           { prop: 'createTime', align: 'center', label: '创建时间', fixed: 'right', width: 180 }, | ||||
|           { slot: 'options'}, | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     created () { | ||||
|       this.getList() | ||||
|     }, | ||||
|     methods: { | ||||
|       getListInit() { | ||||
|         this.search.current = 1 | ||||
|         this.getList() | ||||
|       }, | ||||
|       getList () { | ||||
|         this.instance.post(`/app/appzyaccountconfig/list`, null, { | ||||
|           params: { | ||||
|             ...this.search, | ||||
|             type: 0 | ||||
|           } | ||||
|         }).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             this.tableData = res.data.records | ||||
|             this.total = res.data.total | ||||
|             this.loading = false | ||||
|           } else { | ||||
|             this.loading = false | ||||
|           } | ||||
|         }).catch(() => { | ||||
|           this.loading = false | ||||
|         }) | ||||
|       }, | ||||
|       remove(id) { | ||||
|         this.$confirm('确定删除该数据?').then(() => { | ||||
|           this.instance.post(`/app/appzyaccountconfig/delete?ids=${id}`).then(res => { | ||||
|             if (res.code == 0) { | ||||
|               this.$message.success('删除成功!') | ||||
|               this.getList() | ||||
|             } | ||||
|           }) | ||||
|         }) | ||||
|       }, | ||||
|       add(title, item) { | ||||
|         this.dialog = true | ||||
|         this.dialogTitle = title | ||||
|         this.dialogForm = item | ||||
|         if(title == '添加设备配置') { | ||||
|           this.dialogForm.flag = 1 | ||||
|           this.dialogForm.version = '1.0.0' | ||||
|         } | ||||
|       }, | ||||
|       addForm() { | ||||
|         this.$refs.addForm.validate((valid) => { | ||||
|           if (valid) { | ||||
|             this.dialogForm.type = 0 | ||||
|             this.instance.post(`/app/appzyaccountconfig/addOrUpdate`, this.dialogForm).then((res) => { | ||||
|               if (res.code == 0) { | ||||
|                 this.$message.success(`${this.dialogForm.id ? '编辑成功' : '添加成功'}`) | ||||
|                 this.getListInit() | ||||
|                 this.dialog = false; | ||||
|               } | ||||
|             }); | ||||
|           } else { | ||||
|             return false; | ||||
|           } | ||||
|         }); | ||||
|       }, | ||||
|       refresh(row) { | ||||
|         this.$confirm('确定刷新该数据token?').then(() => { | ||||
|           this.instance.post(`/app/appzyaccountconfig/initQlyToken?id=${row.id}`).then(res => { | ||||
|             if (res.code == 0) { | ||||
|               this.$message.success('刷新成功!') | ||||
|               this.getList() | ||||
|             } | ||||
|           }) | ||||
|         }) | ||||
|       }, | ||||
|       onChange(row) { | ||||
|         this.instance.post(`/app/appzyaccountconfig/setFlag`, null, { | ||||
|           params: { | ||||
|             id: row.id, | ||||
|             flag: row.flag | ||||
|           } | ||||
|         }).then((res) => { | ||||
|           if (res.code == 0) { | ||||
|             this.$message.success(+row.flag ? '已启用' : '已禁用'); | ||||
|             this.getList(); | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
							
								
								
									
										224
									
								
								packages/conv/AppDeviceConfig/components/videoList.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,224 @@ | ||||
| <template> | ||||
|   <ai-list class="videoList" isTabs> | ||||
|     <template slot="content"> | ||||
|       <ai-search-bar bottomBorder> | ||||
|         <template #left> | ||||
|           <el-button type="primary" icon="iconfont iconAdd" size="small" @click="add('添加设备配置', {})">添加</el-button> | ||||
|           <el-button icon="el-icon-delete" class="delete-btn del-btn-list" :disabled="!Boolean(ids.length)" @click="remove(ids)">删除</el-button> | ||||
|         </template> | ||||
|         <template #right> | ||||
|           <el-input | ||||
|             v-model="search.condition" | ||||
|             class="search-input" | ||||
|             size="small" | ||||
|             v-throttle="() => {search.current = 1, getList()}" | ||||
|             placeholder="请输入CorpId" | ||||
|             clearable | ||||
|             @change="getList" | ||||
|             @clear="search.current = 1, search.condition = '', getList()" | ||||
|             suffix-icon="iconfont iconSearch"> | ||||
|           </el-input> | ||||
|         </template> | ||||
|       </ai-search-bar> | ||||
|       <ai-table | ||||
|         :tableData="tableData" | ||||
|         :col-configs="colConfigs" | ||||
|         :total="total" | ||||
|         v-loading="loading" | ||||
|         style="margin-top: 16px;" | ||||
|         :current.sync="search.current" | ||||
|         :size.sync="search.size" | ||||
|         @getList="getList" | ||||
|         @selection-change="v=>ids=v.map(e=>e.id)"> | ||||
|         <el-table-column slot="options" width="140px" fixed="right" label="操作" align="center"> | ||||
|           <template slot-scope="{ row }"> | ||||
|             <div class="table-options"> | ||||
|               <el-button type="text" @click="add('编辑设备配置', row)">编辑</el-button> | ||||
|               <el-button type="text" @click="refresh(row)">刷新</el-button> | ||||
|               <el-button type="text" @click="remove(row.id)">删除</el-button> | ||||
|             </div> | ||||
|           </template> | ||||
|         </el-table-column> | ||||
|         <el-table-column slot="flag" align="center" label="状态" width="100"> | ||||
|           <template v-slot="{ row }"> | ||||
|             <el-switch v-model="row.flag" @change="onChange(row)" active-value="1" inactive-value="0" | ||||
|                         active-color="#5088FF" inactive-color="#D0D4DC"></el-switch> | ||||
|           </template> | ||||
|         </el-table-column> | ||||
|       </ai-table> | ||||
|       <ai-dialog :title="dialogTitle" :visible.sync="dialog" width="800px"  @onConfirm="addForm" @closed="dialogForm={}"> | ||||
|         <el-form ref="addForm" :model="dialogForm" :rules="rules" size="small"  label-width="160px"> | ||||
|           <el-form-item label="CorpId" prop="corpId"> | ||||
|             <el-input v-model.trim="dialogForm.corpId" placeholder="请输入..." clearable :maxLength="50"/> | ||||
|           </el-form-item> | ||||
|           <el-form-item required label="状态"> | ||||
|              <el-radio-group v-model="dialogForm.flag"> | ||||
|               <el-radio :label="0">关闭</el-radio> | ||||
|               <el-radio :label="1">开启</el-radio> | ||||
|             </el-radio-group> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="用户ID"> | ||||
|             <el-input v-model.trim="dialogForm.slwUserId" placeholder="请输入..." clearable :maxLength="50" /> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="地区编码"> | ||||
|             <el-input v-model.trim="dialogForm.slwAreaId" placeholder="请输入..." clearable :maxLength="50" /> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="TOKEN"> | ||||
|             <el-input v-model.trim="dialogForm.slwToken" placeholder="请输入..." clearable :maxLength="50" /> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="大喇叭账号"> | ||||
|             <el-input v-model.trim="dialogForm.dlbName" placeholder="请输入..." clearable :maxLength="50" /> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="大喇叭密码"> | ||||
|             <el-input v-model.trim="dialogForm.dlbPwd" placeholder="请输入..." clearable :maxLength="50" /> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="大喇叭Token"> | ||||
|             <el-input v-model.trim="dialogForm.dlbToken" placeholder="请输入..." clearable :maxLength="50" /> | ||||
|           </el-form-item> | ||||
|         </el-form> | ||||
|       </ai-dialog> | ||||
|     </template> | ||||
|   </ai-list> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   import { mapState } from 'vuex' | ||||
|   export default { | ||||
|     name: 'eyeList', | ||||
|     props: { | ||||
|       instance: Function, | ||||
|       dict: Object, | ||||
|       areaId: String | ||||
|     }, | ||||
|  | ||||
|     data () { | ||||
|       return { | ||||
|         search: { | ||||
|           current: 1, | ||||
|           condition: '', | ||||
|           size: 10, | ||||
|         }, | ||||
|         ids: [], | ||||
|         tableData: [], | ||||
|         total: 0, | ||||
|         loading: false, | ||||
|         dialog: false, | ||||
|         dialogTitle: '', | ||||
|         dialogForm: {} | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     computed: { | ||||
|       ...mapState(['user']), | ||||
|  | ||||
|       param () { | ||||
|         return this.search | ||||
|       }, | ||||
|       rules() { | ||||
|         return { | ||||
|           corpId: [{required: true, message: "请输入CorpId"}], | ||||
|         } | ||||
|       }, | ||||
|       colConfigs() { | ||||
|         return [ | ||||
|           {type: "selection"}, | ||||
|           { prop: 'corpId', label: 'CorpId', fixed: 'left', width: 220 }, | ||||
|           { slot: 'flag', align: 'center', label: '状态', fixed: 'left', width: 120 }, | ||||
|           { prop: 'slwUserId', align: 'center', label: '用户ID', width: 180 }, | ||||
|           { prop: 'slwAreaId', align: 'center', label: '地区编码', width: 180 }, | ||||
|           { prop: 'slwToken', align: 'center', label: 'TOKEN', width: 220 }, | ||||
|           { prop: 'dlbName', align: 'center', label: '大喇叭账号', width: 140 }, | ||||
|           { prop: 'dlbPwd', align: 'center', label: '大喇叭密码', width: 140 }, | ||||
|           { prop: 'dlbToken', align: 'center', label: '大喇叭Token', width: 180 }, | ||||
|           { prop: 'createTime', align: 'center', label: '创建时间', width: 180 }, | ||||
|           { slot: 'options'}, | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     created () { | ||||
|       this.getList() | ||||
|     }, | ||||
|     methods: { | ||||
|       getListInit() { | ||||
|         this.search.current = 1 | ||||
|         this.getList() | ||||
|       }, | ||||
|       getList () { | ||||
|         this.instance.post(`/app/appzyaccountconfig/list`, null, { | ||||
|           params: { | ||||
|             ...this.search, | ||||
|             type: 1 | ||||
|           } | ||||
|         }).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             this.tableData = res.data.records | ||||
|             this.total = res.data.total | ||||
|             this.loading = false | ||||
|           } else { | ||||
|             this.loading = false | ||||
|           } | ||||
|         }).catch(() => { | ||||
|           this.loading = false | ||||
|         }) | ||||
|       }, | ||||
|       remove(id) { | ||||
|         this.$confirm('确定删除该数据?').then(() => { | ||||
|           this.instance.post(`/app/appzyaccountconfig/delete?ids=${id}`).then(res => { | ||||
|             if (res.code == 0) { | ||||
|               this.$message.success('删除成功!') | ||||
|               this.getList() | ||||
|             } | ||||
|           }) | ||||
|         }) | ||||
|       }, | ||||
|       add(title, item) { | ||||
|         this.dialog = true | ||||
|         this.dialogTitle = title | ||||
|         this.dialogForm = item | ||||
|         if(title == '添加设备配置') { | ||||
|           this.dialogForm.flag = 1 | ||||
|         } | ||||
|       }, | ||||
|       addForm() { | ||||
|         this.$refs.addForm.validate((valid) => { | ||||
|           if (valid) { | ||||
|             this.dialogForm.type = 1 | ||||
|             this.instance.post(`/app/appzyaccountconfig/addOrUpdate`, this.dialogForm).then((res) => { | ||||
|               if (res.code == 0) { | ||||
|                 this.$message.success(`${this.dialogForm.id ? '编辑成功' : '添加成功'}`) | ||||
|                 this.getListInit() | ||||
|                 this.dialog = false; | ||||
|               } | ||||
|             }); | ||||
|           } else { | ||||
|             return false; | ||||
|           } | ||||
|         }); | ||||
|       }, | ||||
|       refresh(row) { | ||||
|         this.$confirm('确定刷新该数据token?').then(() => { | ||||
|           this.instance.post(`/app/appzyaccountconfig/initSlwToken?id=${row.id}`).then(res => { | ||||
|             if (res.code == 0) { | ||||
|               this.$message.success('刷新成功!') | ||||
|               this.getList() | ||||
|             } | ||||
|           }) | ||||
|         }) | ||||
|       }, | ||||
|       onChange(row) { | ||||
|         this.instance.post(`/app/appzyaccountconfig/setFlag`, null, { | ||||
|           params: { | ||||
|             id: row.id, | ||||
|             flag: row.flag | ||||
|           } | ||||
|         }).then((res) => { | ||||
|           if (res.code == 0) { | ||||
|             this.$message.success(+row.flag ? '已启用' : '已禁用'); | ||||
|             this.getList(); | ||||
|           } | ||||
|         }) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
							
								
								
									
										55
									
								
								packages/conv/AppEventReporting/AppEventReporting.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,55 @@ | ||||
| <template> | ||||
|   <section class="AppEventReporting"> | ||||
|     <component ref="component" :is="currentPage" @change="onChange" :params="params" :instance="instance" :dict="dict" :menuName="menuName" /> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import List from './components/List' | ||||
| import Detail from './components/Detail' | ||||
| import Setting from './components/Setting' | ||||
|  | ||||
| export default { | ||||
|   name: 'AppEventReporting', | ||||
|   label: '巡查上报', | ||||
|  | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|     menuName: {default: '巡查上报'} | ||||
|   }, | ||||
|  | ||||
|   data() { | ||||
|     return { | ||||
|       component: 'List', | ||||
|       params: {} | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     currentPage() { | ||||
|       let {hash, query: {id}} = this.$route | ||||
|       return hash == "#Setting" ? Setting : | ||||
|           !!id ? Detail : List | ||||
|     } | ||||
|   }, | ||||
|   components: { | ||||
|     List, | ||||
|     Detail, | ||||
|     Setting | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     onChange(data) { | ||||
|       this.$router.push({query: data.params, hash: data.type == "Setting" ? "#Setting" : ""}) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss"> | ||||
| .AppEventReporting { | ||||
|   height: 100%; | ||||
|   background: #F3F6F9; | ||||
|   overflow: auto; | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										592
									
								
								packages/conv/AppEventReporting/components/Detail.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,592 @@ | ||||
| <template> | ||||
|   <ai-detail class="reportAtWillDetail" v-loading="isLoading"> | ||||
|     <template #title> | ||||
|       <ai-title title="详情" isShowBack isShowBottomBorder @onBackClick="cancel(false)"> | ||||
|         <template #rightBtn> | ||||
|           <div class="title-btns"> | ||||
|             <el-button type="primary" icon="iconfont iconPerson_Transfered" @click="isShowForward = true" v-if="detail.powerTransmit">指派事件</el-button> | ||||
|             <el-button type="primary" icon="iconfont iconRegister" @click="isShowAdd = true" v-if="detail.powerHandle">处理事件</el-button> | ||||
|           </div> | ||||
|         </template> | ||||
|       </ai-title> | ||||
|     </template> | ||||
|     <template #content> | ||||
|       <div class="detail-content__wrapper"> | ||||
|         <div class="detail-content__wrapper--left"> | ||||
|           <ai-card title="基础信息"> | ||||
|             <template #content> | ||||
|               <ai-wrapper> | ||||
|                 <ai-info-item label="上报人员" :value="detail.name"></ai-info-item> | ||||
|                 <ai-info-item label="当前状态" :value="dict.getLabel('clapEventStatus', detail.eventStatus)"></ai-info-item> | ||||
|                 <ai-info-item label="联系方式">{{ detail.phone }}</ai-info-item> | ||||
|                 <ai-info-item label="上报时间">{{ detail.createTime }}</ai-info-item> | ||||
|                 <ai-info-item label="事件来源">{{ dict.getLabel('residentEventSource', detail.eventSource) }}</ai-info-item> | ||||
|                 <ai-info-item label="事件类型">{{ detail.groupName }}</ai-info-item> | ||||
|                 <ai-info-item label="事件描述" isLine>{{ detail.content }}</ai-info-item> | ||||
|                 <ai-info-item label="现场照片" isLine> | ||||
|                   <ai-uploader :instance="instance" disabled v-model="detail.files"></ai-uploader> | ||||
|                 </ai-info-item> | ||||
|                 <ai-info-item label="所属网格">{{ detail.girdName }}</ai-info-item> | ||||
|                 <ai-info-item label="事件位置" isLine> | ||||
|                   <div id="map" style="width: 500px; height: 280px;"></div> | ||||
|                 </ai-info-item> | ||||
|               </ai-wrapper> | ||||
|             </template> | ||||
|           </ai-card> | ||||
|           <ai-evaluation v-if="!!detail.id" :bid="detail.id" :info.sync="evaluation"/> | ||||
|         </div> | ||||
|         <div class="rightZone"> | ||||
|           <ai-card title="办理进度"> | ||||
|             <template #content> | ||||
|               <el-steps direction="vertical" :active="1"> | ||||
|                 <el-step | ||||
|                     v-for="(item, i) in process" | ||||
|                     :key="i" | ||||
|                     :title="item.systemExplain" | ||||
|                     :description="item.doTime"> | ||||
|                   <template #title> | ||||
|                     <h2 class="step-title" style="font-weight: 500; font-size: 14px;"> | ||||
|                       {{ item.systemExplain }} | ||||
|                     </h2> | ||||
|                   </template> | ||||
|                   <template #description> | ||||
|                     <p style="color: #888; margin: 0 4px 10px 0; font-size: 14px;">{{ item.doTime }}</p> | ||||
|                     <div style="color: #444;margin-bottom: 10px;" v-if="item.doExplain">{{ item.doExplain }}</div> | ||||
|                     <ai-uploader :instance="instance" disabled v-model="item.files"></ai-uploader> | ||||
|                   </template> | ||||
|                 </el-step> | ||||
|               </el-steps> | ||||
|             </template> | ||||
|           </ai-card> | ||||
|         </div> | ||||
|       </div> | ||||
|       <ai-dialog | ||||
|           :visible.sync="isShowAdd" | ||||
|           width="800px" | ||||
|           title="事件处理" | ||||
|           @closed="onClose" | ||||
|           @onConfirm="handleEvent"> | ||||
|         <el-form class="ai-form" label-width="120px" :model="form" ref="form"> | ||||
|           <el-form-item label="事件分类" prop="groupId" style="width: 100%;" :rules="[{ required: true, message: '请选择事件分类' }]"> | ||||
|             <ai-select | ||||
|                 v-model="form.groupId" | ||||
|                 placeholder="请选择事件分类" | ||||
|                 :selectList="dictList"> | ||||
|             </ai-select> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="处理结果" prop="eventStatus" style="width: 100%;" :rules="[{ required: true, message: '请选择处理结果' }]"> | ||||
|             <el-radio-group v-model="form.eventStatus"> | ||||
|               <el-radio label="1">已办结</el-radio> | ||||
|               <el-radio label="0">已拒绝</el-radio> | ||||
|             </el-radio-group> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="处理意见" prop="content" style="width: 100%;" :rules="[{ required: true, message: '请输入处理意见' }]"> | ||||
|             <el-input type="textarea" :rows="5" :maxlength="500" v-model="form.content" clearable placeholder="请输入处理意见" show-word-limit></el-input> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="图片" prop="files" style="width: 100%;"> | ||||
|             <ai-uploader | ||||
|                 :instance="instance" | ||||
|                 isShowTip | ||||
|                 v-model="form.files" | ||||
|                 :limit="9"> | ||||
|             </ai-uploader> | ||||
|           </el-form-item> | ||||
|         </el-form> | ||||
|       </ai-dialog> | ||||
|       <ai-dialog | ||||
|           :visible.sync="isShowForward" | ||||
|           width="800px" | ||||
|           @close="onClose" | ||||
|           title="事件指派" | ||||
|           @onConfirm="onForwardConfirm"> | ||||
|         <el-form class="ai-form" label-width="120px" :model="forwardForm" ref="forwardForm"> | ||||
|           <el-form-item label="转交" prop="name" style="width: 100%;" :rules="[{ required: true, message: '请选择网格员或网格' }]"> | ||||
|             <el-input disabled size="small" v-model="forwardForm.name" clearable placeholder="请选择网格员或网格"> | ||||
|               <template slot="append"> | ||||
|                 <el-button @click="getGirdList().then(()=>isShowUser=true )">选择</el-button> | ||||
|               </template> | ||||
|             </el-input> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="办理意见" prop="content" style="width: 100%;" :rules="[{ required: true, message: '请输入办理意见' }]"> | ||||
|             <el-input type="textarea" :rows="5" :maxlength="500" v-model="forwardForm.content" clearable placeholder="请输入办理意见" show-word-limit></el-input> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="图片" prop="files" style="width: 100%;"> | ||||
|             <ai-uploader | ||||
|                 :instance="instance" | ||||
|                 v-model="forwardForm.files" | ||||
|                 isShowTip | ||||
|                 :limit="9"> | ||||
|             </ai-uploader> | ||||
|           </el-form-item> | ||||
|         </el-form> | ||||
|       </ai-dialog> | ||||
|       <ai-dialog | ||||
|           :visible.sync="isShowUser" | ||||
|           width="800px" | ||||
|           title="选择网格员" | ||||
|           @onConfirm="onConfirm"> | ||||
|         <div class="grid-wrapper"> | ||||
|           <el-input | ||||
|               style="margin-bottom: 10px;" | ||||
|               size="small" | ||||
|               placeholder="请输入网格名称/网格员姓名/网格员电话" | ||||
|               v-model="name" @change="$refs.tree.filter(name)" | ||||
|               suffix-icon="iconfont iconSearch"> | ||||
|           </el-input> | ||||
|           <el-tree | ||||
|               :filter-node-method="filterNode" | ||||
|               ref="tree" | ||||
|               :props="defaultProps" | ||||
|               node-key="id" | ||||
|               :data="tree" | ||||
|               highlight-current | ||||
|               @current-change="onTreeChange"> | ||||
|             <div class="tree-container" slot-scope="{ data }"> | ||||
|               <div class="tree-container__user"> | ||||
|                 <div class="tree-user__item"> | ||||
|                   <span v-if="!data.isUser">{{ data.girdName }}</span> | ||||
|                   <span v-else>{{data.name}}<span v-if="data.phone">-{{data.phone}}</span></span> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|           </el-tree> | ||||
|         </div> | ||||
|       </ai-dialog> | ||||
|     </template> | ||||
|   </ai-detail> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import AMapLoader from '@amap/amap-jsapi-loader' | ||||
| import {mapState} from 'vuex' | ||||
|  | ||||
| export default { | ||||
|   name: 'Detail', | ||||
|   props: ['dict', 'instance'], | ||||
|  | ||||
|   data() { | ||||
|     return { | ||||
|       forwardForm: { | ||||
|         content: '', | ||||
|         girdId: '', | ||||
|         girdName: '', | ||||
|         girdMemberId: '', | ||||
|         girdMemberName: '', | ||||
|         name: '' | ||||
|       }, | ||||
|       isLoading: true, | ||||
|       name: '', | ||||
|       detail: {}, | ||||
|       isShowUser: false, | ||||
|       eventList: [], | ||||
|       isShowAdd: false, | ||||
|       userList: [], | ||||
|       processList: [], | ||||
|       dictList: [], | ||||
|       defaultProps: { | ||||
|         label: 'girdName' | ||||
|       }, | ||||
|       isShowForward: false, | ||||
|       tree: [], | ||||
|       gridInfo: {}, | ||||
|       form: { | ||||
|         files: [], | ||||
|         groupId: '', | ||||
|         groupName: '', | ||||
|         content: [], | ||||
|         eventStatus: '1' | ||||
|       }, | ||||
|       evaluation: {} | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   computed: { | ||||
|     ...mapState(['user']), | ||||
|     process: v => [v.evaluation.id ? { | ||||
|       systemExplain: `${v.evaluation.createUserName}完成评价 (${v.evaluation.score}星评价)`, | ||||
|       doTime: v.evaluation.createTime, | ||||
|       doExplain: v.evaluation.rateText, | ||||
|     } : null, v.processList].flat().filter(Boolean) | ||||
|   }, | ||||
|  | ||||
|   created() { | ||||
|     this.getDict() | ||||
|     this.dict.load('clapEventStatus', 'residentEventSource').then(() => { | ||||
|       this.getDetail() | ||||
|     }) | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     getDetail() { | ||||
|       this.instance.post('/app/apppatrolreportinfov2/queryDetailById', null, { | ||||
|         params: {id: this.$route.query.id} | ||||
|       }).then(res => { | ||||
|         if (res?.data) { | ||||
|           this.detail = res.data | ||||
|           this.processList = res.data.processList | ||||
|           this.form.groupId = res.data.groupId | ||||
|  | ||||
|           this.$nextTick(() => { | ||||
|             this.initMap() | ||||
|           }) | ||||
|           this.isLoading = false | ||||
|         } | ||||
|       }).catch(() => { | ||||
|         this.isLoading = false | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     getGirdList() { | ||||
|       return this.instance.post(`/app/apppatrolreportinfov2/listGirdInfoByTransfer?id=${this.$route.query.id}`).then(res => { | ||||
|         if (res?.data) { | ||||
|           // return this.tree = this.formatList([res.data]) | ||||
|           this.tree = res.data | ||||
|           this.tree.map((item) => { | ||||
|             item.children = [item.girdMemberList?.map(e => ({ | ||||
|               ...e, isUser: true, girdName: item.girdName | ||||
|             })) || []].flat() | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     onClose() { | ||||
|       this.form.files = [] | ||||
|       this.form.groupId = '' | ||||
|       this.form.groupName = '' | ||||
|       this.form.content = '' | ||||
|       this.form.eventStatus = '' | ||||
|       this.forwardForm.content = '' | ||||
|       this.forwardForm.girdId = '' | ||||
|       this.forwardForm.girdName = '' | ||||
|       this.forwardForm.girdMemberId = '' | ||||
|       this.forwardForm.girdMemberName = '' | ||||
|       this.forwardForm.name = '' | ||||
|       this.forwardForm.files = [] | ||||
|     }, | ||||
|  | ||||
|     formatList(list) { | ||||
|       for (let item of list) { | ||||
|         item.children = [item.girdList, item.girdMemberList?.map(e => ({ | ||||
|           ...e, isUser: true, girdName: item.girdName, | ||||
|           girdId: item.id | ||||
|         })) || []].flat() | ||||
|         if (item.girdList?.length > 0) { | ||||
|           this.formatList(item.girdList) | ||||
|         } | ||||
|       } | ||||
|       return list | ||||
|     }, | ||||
|  | ||||
|     filterNode(value, data) { | ||||
|       if (!value) return true | ||||
|  | ||||
|       return (data.girdName && data.girdName.indexOf(value) !== -1) || (data.name && data.name.indexOf(value) !== -1) || (data.name && data.phone.indexOf(value) !== -1) | ||||
|     }, | ||||
|  | ||||
|     onTreeChange(e) { | ||||
|       this.gridInfo = e | ||||
|     }, | ||||
|  | ||||
|     onForwardConfirm() { | ||||
|       this.$refs.forwardForm.validate(v => { | ||||
|         if (v) { | ||||
|           this.instance.post('/app/apppatrolreportinfov2/transfer', { | ||||
|             ...this.forwardForm, | ||||
|             id: this.$route.query.id | ||||
|           }).then(res => { | ||||
|             if (res?.code == 0) { | ||||
|               this.isShowForward = false | ||||
|               this.onClose() | ||||
|               this.getDetail() | ||||
|               this.$message.success('转交成功!') | ||||
|             } | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     onConfirm() { | ||||
|       // if (this.gridInfo.userId) { | ||||
|       //   this.forwardForm.girdId = this.gridInfo.girdId | ||||
|       //   this.forwardForm.girdName = this.gridInfo.girdName | ||||
|       //   this.forwardForm.girdMemberId = this.gridInfo.id | ||||
|       //   this.forwardForm.girdMemberName = this.gridInfo.name | ||||
|       // } else { | ||||
|       //   this.forwardForm.girdId = this.gridInfo.id | ||||
|       // } | ||||
|       // this.forwardForm.girdName = this.gridInfo.girdName | ||||
|       // this.forwardForm.name = `${this.gridInfo.girdName}${this.gridInfo.name ? '-' + this.gridInfo.name : ''}` | ||||
|       // this.isShowUser = false | ||||
|       if(!this.gridInfo.userId) { | ||||
|         return this.$message.error('请选择网格员!') | ||||
|       }  | ||||
|       this.forwardForm.girdId = this.gridInfo.girdId | ||||
|       this.forwardForm.girdName = this.gridInfo.girdName | ||||
|       this.forwardForm.girdMemberId = this.gridInfo.id | ||||
|       this.forwardForm.girdMemberName = this.gridInfo.name | ||||
|       this.forwardForm.name = `${this.gridInfo.girdName}${this.gridInfo.name ? '-' + this.gridInfo.name : ''}` | ||||
|       this.isShowUser = false | ||||
|     }, | ||||
|     getDict() { | ||||
|       this.instance.post(`/app/apppatrolreportgroupv2/list?current=1&size=100000`).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           this.dictList = res.data.records.map(v => { | ||||
|             return { | ||||
|               dictValue: v.id, | ||||
|               dictName: v.groupName | ||||
|             } | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     close() { | ||||
|       this.$confirm('确定关闭该事件?').then(() => { | ||||
|         this.instance.post(`/app/apppatrolreportinfov2/delete?ids=${this.$route.query.id}`).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             this.$message.success('删除成功!') | ||||
|             this.getList() | ||||
|           } | ||||
|         }) | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     cancel(isRefresh) { | ||||
|       this.$emit('change', { | ||||
|         type: 'list', | ||||
|         isRefresh: !!isRefresh | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     initMap() { | ||||
|       let {lng, lat} = this.detail | ||||
|       let center = [lng, lat] | ||||
|       AMapLoader.load({ | ||||
|         key: 'b553334ba34f7ac3cd09df9bc8b539dc', | ||||
|         version: '2.0' | ||||
|       }).then(AMap => { | ||||
|         let map = new AMap.Map('map', { | ||||
|           center, | ||||
|           zoom: 14 | ||||
|         }) | ||||
|         let marker = new AMap.Marker({ | ||||
|           position: new AMap.LngLat(lng, lat), | ||||
|           title: this.detail.address | ||||
|         }) | ||||
|         map.add(marker) | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     handleEvent() { | ||||
|       this.$refs.form.validate(v => { | ||||
|         if (v) { | ||||
|           this.instance.post('/app/apppatrolreportinfov2/finish', { | ||||
|             ...this.form, | ||||
|             groupName: this.dictList.filter(v => v.dictValue === this.form.groupId)[0].dictName, | ||||
|             id: this.$route.query.id | ||||
|           }).then(res => { | ||||
|             if (res?.code == 0) { | ||||
|               this.isShowAdd = false | ||||
|               this.getDetail() | ||||
|               this.$message.success('处理成功!') | ||||
|             } | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .reportAtWillDetail { | ||||
|   height: 100%; | ||||
|  | ||||
|   .grid-wrapper { | ||||
|     min-height: 360px; | ||||
|   } | ||||
|  | ||||
|   .title-btns { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|   } | ||||
|  | ||||
|   :deep( .el-tree ) { | ||||
|     background: transparent; | ||||
|  | ||||
|     .el-tree-node__expand-icon.is-leaf { | ||||
|       color: transparent !important; | ||||
|     } | ||||
|  | ||||
|     .el-tree-node__content > .el-tree-node__expand-icon { | ||||
|       padding: 4px; | ||||
|     } | ||||
|  | ||||
|     .el-tree-node__content { | ||||
|       height: 32px; | ||||
|     } | ||||
|  | ||||
|     .el-tree__empty-text { | ||||
|       color: #222; | ||||
|       font-size: 14px; | ||||
|     } | ||||
|  | ||||
|     .el-tree-node__children .el-tree-node__content { | ||||
|       height: 32px; | ||||
|     } | ||||
|  | ||||
|     .el-tree-node__content:hover { | ||||
|       background: #E8EFFF; | ||||
|       color: #222222; | ||||
|       border-radius: 2px; | ||||
|     } | ||||
|  | ||||
|     .is-current > .el-tree-node__content { | ||||
|       &:hover { | ||||
|         background: #2266FF; | ||||
|         color: #fff; | ||||
|       } | ||||
|  | ||||
|       background: #2266FF; | ||||
|  | ||||
|       span { | ||||
|         color: #fff; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .el-steps { | ||||
|     :deep( .el-step__icon ) { | ||||
|       font-size: 12px; | ||||
|       color: #555555; | ||||
|       border-color: #d0d4dc; | ||||
|     } | ||||
|  | ||||
|     :deep( .el-step__head.is-finish ) { | ||||
|       .el-step__icon.is-text { | ||||
|         border: none; | ||||
|         color: #fff; | ||||
|         font-size: 12px; | ||||
|         background: #2266ff; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     :deep( .el-step__line ) { | ||||
|       background-color: #d0d4dc; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .imgs { | ||||
|     font-size: 0; | ||||
|  | ||||
|     img { | ||||
|       width: 108px; | ||||
|       height: 108px; | ||||
|       margin-right: 4px; | ||||
|       margin-bottom: 4px; | ||||
|       cursor: pointer; | ||||
|       user-select: none; | ||||
|  | ||||
|       &:hover { | ||||
|         opacity: 0.8; | ||||
|       } | ||||
|  | ||||
|       &:nth-of-type(2n) { | ||||
|         margin-right: 0; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep( .report-dialog ) { | ||||
|     .el-select { | ||||
|       width: 100%; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep( .el-step__head.is-process ) { | ||||
|     color: #555; | ||||
|     border-color: #555; | ||||
|   } | ||||
|  | ||||
|   :deep( .is-finish h2 ) { | ||||
|     color: #2266ff; | ||||
|   } | ||||
|  | ||||
|   .step-title { | ||||
|     color: #555; | ||||
|   } | ||||
|  | ||||
|   .detail-content__wrapper { | ||||
|     display: flex; | ||||
|     width: 100%; | ||||
|     flex-wrap: wrap; | ||||
|  | ||||
|     .detail-content__wrapper--left { | ||||
|       flex: 1; | ||||
|       margin-right: 20px; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep( .ai-detail__content ) { | ||||
|     background: #f3f6f9; | ||||
|  | ||||
|     .ai-detail__content--wrapper { | ||||
|       display: flex; | ||||
|       gap: 16px; | ||||
|       width: 100%; | ||||
|       max-width: 100%; | ||||
|       padding: 16px; | ||||
|       box-sizing: border-box; | ||||
|  | ||||
|       & > .el-card { | ||||
|         flex: 1; | ||||
|         min-width: 0; | ||||
|       } | ||||
|  | ||||
|       .rightZone { | ||||
|         width: 400px; | ||||
|         flex-shrink: 0; | ||||
|         display: flex; | ||||
|         flex-direction: column; | ||||
|         gap: 16px; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep( .el-card ) { | ||||
|     .el-card__header { | ||||
|       padding: 12px 16px; | ||||
|       font-weight: bold; | ||||
|     } | ||||
|  | ||||
|     .el-card__body { | ||||
|       padding: 8px; | ||||
|     } | ||||
|  | ||||
|     #amap { | ||||
|       width: 466px; | ||||
|       height: 232px; | ||||
|     } | ||||
|  | ||||
|     .el-steps { | ||||
|       margin-left: 8px; | ||||
|     } | ||||
|  | ||||
|     .imgFormItem > .el-form-item__content { | ||||
|       display: flex; | ||||
|       gap: 16px; | ||||
|       flex-wrap: wrap; | ||||
|  | ||||
|       &:before { | ||||
|         content: none; | ||||
|       } | ||||
|  | ||||
|       .el-image__inner { | ||||
|         width: 82px; | ||||
|         height: 82px; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										249
									
								
								packages/conv/AppEventReporting/components/List.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,249 @@ | ||||
| <template> | ||||
|   <ai-list> | ||||
|     <template #title> | ||||
|       <ai-title :title="menuName" isShowBottomBorder> | ||||
|         <el-button type="primary" slot="rightBtn" @click="toSetting">事件类型设置</el-button> | ||||
|       </ai-title> | ||||
|     </template> | ||||
|     <template #content> | ||||
|       <ai-search-bar> | ||||
|         <template #left> | ||||
|           <ai-select | ||||
|             v-model="search.eventStatus" | ||||
|             clearable | ||||
|             placeholder="处理状态" | ||||
|             :selectList="dict.getDict('clapEventStatus')" | ||||
|             @change="search.current = 1, getList()"> | ||||
|           </ai-select> | ||||
|           <ai-select | ||||
|             v-model="search.eventSource" | ||||
|             clearable | ||||
|             placeholder="事件来源" | ||||
|             :selectList="dict.getDict('residentEventSource')" | ||||
|             @change="search.current = 1, getList()"> | ||||
|           </ai-select> | ||||
|           <ai-select | ||||
|             v-model="search.groupId" | ||||
|             clearable | ||||
|             placeholder="事件类型" | ||||
|             :selectList="typeList" | ||||
|             @change="search.current = 1, getList()"> | ||||
|           </ai-select> | ||||
|           <el-cascader ref="cascader1" v-model="girdArr" :options="girdOptions" placeholder="所属网格" size="small" | ||||
|             :props="defaultProps" :show-all-levels="false" @change="gridChange" clearable></el-cascader> | ||||
|           <el-date-picker size="small" v-model="searchDotime" type="daterange" range-separator="至" @change="timeChange" | ||||
|             start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd" format="yyyy-MM-dd"></el-date-picker> | ||||
|         </template> | ||||
|         <template #right> | ||||
|           <ai-download :instance="instance" url="/app/apppatrolreportinfov2/export" :params="search" fileName="巡查上报" | ||||
|                        :disabled="tableData.length == 0"> | ||||
|             <el-button icon="iconfont iconExported" :disabled="tableData.length == 0">导出</el-button> | ||||
|           </ai-download> | ||||
|           <el-input | ||||
|               v-model="search.content" | ||||
|               class="search-input" | ||||
|               size="small" | ||||
|               v-throttle="() => {search.current = 1, getList()}" | ||||
|               placeholder="请输入内容描述/上报人员/联系方式" | ||||
|               clearable | ||||
|               @change="getList" | ||||
|               @clear="search.current = 1, search.content = '', getList()" | ||||
|               suffix-icon="iconfont iconSearch"> | ||||
|           </el-input> | ||||
|         </template> | ||||
|       </ai-search-bar> | ||||
|       <ai-table :tableData="tableData" :colConfigs="colConfigs" :total="total" :current.sync="search.current" :size.sync="search.size" @getList="getList"> | ||||
|         <el-table-column slot="options" label="操作" fixed="right" width="120" align="center"> | ||||
|           <div class="table-options" slot-scope="{row}"> | ||||
|             <el-button type="text" title="详情" @click="toDetail(row.id)">详情</el-button> | ||||
|             <el-button type="text" title="删除" @click="handleDelete(row.id)">删除</el-button> | ||||
|           </div> | ||||
|         </el-table-column> | ||||
|       </ai-table> | ||||
|     </template> | ||||
|   </ai-list> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import {mapState} from 'vuex' | ||||
|  | ||||
| export default { | ||||
|   name: 'List', | ||||
|   label: "巡查上报", | ||||
|  | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|     menuName: String | ||||
|   }, | ||||
|  | ||||
|   data() { | ||||
|     return { | ||||
|       userList: [], | ||||
|       search: { | ||||
|         current: 1, | ||||
|         size: 10, | ||||
|         eventStatus: '', | ||||
|         content: '', | ||||
|         eventSource: '', | ||||
|         groupId: '', | ||||
|         createTimeStart: '', | ||||
|         createTimeEnd: '', | ||||
|         girdId: '' | ||||
|       }, | ||||
|       total: 0, | ||||
|       tableData: [], | ||||
|       content: '', | ||||
|       id: '', | ||||
|       girdId: '', | ||||
|       girdArr: [], | ||||
|       girdOptions: [], | ||||
|       defaultProps: { | ||||
|         label: 'girdName', | ||||
|         value: 'id', | ||||
|         children: 'children', | ||||
|         checkStrictly: true, | ||||
|       }, | ||||
|       searchDotime: [], | ||||
|       typeList: [] | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   computed: { | ||||
|     ...mapState(['user']), | ||||
|  | ||||
|     colConfigs() { | ||||
|       return [ | ||||
|         {prop: 'content', label: '内容描述', width: '300px'}, | ||||
|         {prop: 'eventSource', label: '事件来源', align: 'center', dict: 'residentEventSource'}, | ||||
|         {prop: 'groupName', label: '事件类型', align: 'center'}, | ||||
|         {prop: 'girdName', label: '所属网格', align: 'center'}, | ||||
|         {prop: 'createTime', label: '上报时间', align: 'center'}, | ||||
|         {prop: 'name', label: '上报人员', align: 'center'}, | ||||
|         {prop: 'phone', label: '联系方式', align: 'center'}, | ||||
|         {prop: 'eventStatus', label: '处理状态', align: 'center', format: v => this.dict.getLabel('clapEventStatus', v)}, | ||||
|         {prop: 'processTime', label: '处理时长', align: 'center'}, | ||||
|         {slot: 'options'} | ||||
|       ] | ||||
|     }, | ||||
|  | ||||
|     handleStatusOps() { | ||||
|       return this.dict.getDict("reportAtWillHandleStatus").map(e => ({label: e.dictName, value: e.dictValue})) | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   created() { | ||||
|     this.dict.load('clapEventStatus', 'residentEventSource').then(() => { | ||||
|       this.getList() | ||||
|       this.getGridList() | ||||
|       this.getTypeList() | ||||
|     }) | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     timeChange() { | ||||
|       if (this.searchDotime) { | ||||
|         this.search.createTimeStart = this.searchDotime[0] | ||||
|         this.search.createTimeEnd = this.searchDotime[1] | ||||
|       } else { | ||||
|         this.search.createTimeStart = null | ||||
|         this.search.createTimeEnd = null | ||||
|       } | ||||
|       this.search.current = 1 | ||||
|       this.getList() | ||||
|     }, | ||||
|     // 所有网格 | ||||
|     getGridList() { | ||||
|       this.instance.post(`/app/appgirdinfo/listAll3`).then((res) => { | ||||
|         if (res?.code == 0) { | ||||
|           this.girdOptions = this.toTree(res.data) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     // 转树形结构 | ||||
|     toTree(data) { | ||||
|       let result = []; | ||||
|       if (!Array.isArray(data)) { | ||||
|         return result | ||||
|       } | ||||
|       let map = {}; | ||||
|       data.forEach(item => { | ||||
|         map[item.id] = item; | ||||
|       }); | ||||
|       data.forEach(item => { | ||||
|         let parent = map[item.parentGirdId]; | ||||
|         if (parent) { | ||||
|           (parent.children || (parent.children = [])).push(item); | ||||
|         } else { | ||||
|           result.push(item); | ||||
|         } | ||||
|       }); | ||||
|       return result; | ||||
|     }, | ||||
|     gridChange(val) { | ||||
|       this.girdArr = val | ||||
|       this.search.girdId = val?.[val.length - 1] | ||||
|       this.$refs.cascader1.dropDownVisible = false; | ||||
|       this.search.current = 1 | ||||
|       this.getList() | ||||
|     }, | ||||
|     getList() { | ||||
|       this.instance.post(`/app/apppatrolreportinfov2/list`, null, { | ||||
|         params: { | ||||
|           ...this.search | ||||
|         } | ||||
|       }).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           this.tableData = res.data.records | ||||
|           this.total = res.data.total | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     toDetail(id) { | ||||
|       this.$emit('change', { | ||||
|         type: 'Detail', | ||||
|         params: { | ||||
|           id: id || '' | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     toSetting() { | ||||
|       this.$emit('change', { | ||||
|         type: 'Setting', | ||||
|         params: { | ||||
|           id: '' | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     handleDelete(ids) { | ||||
|       this.$confirm("是否要进行删除?").then(() => { | ||||
|         this.instance.post("/app/apppatrolreportinfov2/delete", null, { | ||||
|           params: {ids} | ||||
|         }).then(res => { | ||||
|           if (res?.code == 0) { | ||||
|             this.$message.success("删除成功!") | ||||
|             this.getList() | ||||
|           } | ||||
|         }) | ||||
|       }).catch(() => 0) | ||||
|     }, | ||||
|     getTypeList() { | ||||
|       this.instance.post(`/app/apppatrolreportgroupv2/list?size=10000`).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           res.data.records.map((item) => { | ||||
|             item.dictName = item.groupName | ||||
|             item.dictValue = item.id | ||||
|           }) | ||||
|           this.typeList = res.data.records | ||||
|         } | ||||
|       }) | ||||
|     } | ||||
|   }, | ||||
|    | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| </style> | ||||
							
								
								
									
										178
									
								
								packages/conv/AppEventReporting/components/Setting.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,178 @@ | ||||
| <template> | ||||
|   <ai-list class="notice"> | ||||
|     <template slot="title"> | ||||
|       <ai-title  isShowBack isShowBottomBorder title="事件类型" @onBackClick="cancel(false)"></ai-title> | ||||
|     </template> | ||||
|     <template slot="content"> | ||||
|       <ai-search-bar class="search-bar"> | ||||
|         <template #left> | ||||
|           <el-button size="small" type="primary" icon="iconfont iconAdd" @click="isShowAdd = true">添加事件类型</el-button> | ||||
|         </template> | ||||
|         <template slot="right"> | ||||
|           <el-input | ||||
|             v-model="search.groupName" | ||||
|             class="search-input" | ||||
|             size="small" | ||||
|             v-throttle="() => {search.current = 1, getList()}" | ||||
|             placeholder="请输入事件类型名称" | ||||
|             clearable | ||||
|             @change="getList" | ||||
|             @clear="search.current = 1, search.groupName = '', getList()" | ||||
|             suffix-icon="iconfont iconSearch"> | ||||
|           </el-input> | ||||
|         </template> | ||||
|       </ai-search-bar> | ||||
|       <ai-table | ||||
|         :tableData="tableData" | ||||
|         :col-configs="colConfigs" | ||||
|         :total="total" | ||||
|         style="margin-top: 6px;" | ||||
|         :current.sync="search.current" | ||||
|         :size.sync="search.size" | ||||
|         @getList="getList"> | ||||
|         <el-table-column slot="tags" label="标签"> | ||||
|           <template slot-scope="{ row }"> | ||||
|             <div class="table-tags"> | ||||
|               <el-tag type="info" v-for="(item, index) in row.tags" size="small" :key="index">{{ item }}</el-tag> | ||||
|             </div> | ||||
|           </template> | ||||
|         </el-table-column> | ||||
|         <el-table-column slot="options" width="120px" fixed="right" label="操作" align="center"> | ||||
|           <div class="table-options" slot-scope="{ row }"> | ||||
|             <el-button type="text" @click="edit(row)">编辑</el-button> | ||||
|             <el-button type="text" @click="remove(row.id)">删除</el-button> | ||||
|           </div> | ||||
|         </el-table-column> | ||||
|       </ai-table> | ||||
|       <ai-dialog | ||||
|         :visible.sync="isShowAdd" | ||||
|         width="780px" | ||||
|         height="580px" | ||||
|         :title="id ? '编辑事件类型' : '添加事件类型'" | ||||
|         @close="onClose" | ||||
|         @onConfirm="onConfirm"> | ||||
|         <el-form ref="form" class="ai-form" :model="form" label-width="110px" label-position="right"> | ||||
|           <el-form-item label="事件类型" prop="groupName" style="width: 100%;" :rules="[{ required: true, message: '请输入事件类型名称', trigger: 'blur' }]"> | ||||
|             <el-input size="small" :maxlength="10" show-word-limit placeholder="请输入事件类型名称" v-model="form.groupName"></el-input> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="排序" prop="showIndex" style="width: 100%;" :rules="[{ required: true, message: '请输入排序', trigger: 'blur' }]"> | ||||
|             <el-input-number size="small" v-model="form.showIndex" :min="1" :max="100" label="请输入排序"></el-input-number> | ||||
|           </el-form-item> | ||||
|         </el-form> | ||||
|       </ai-dialog> | ||||
|     </template> | ||||
|   </ai-list> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   import { mapState } from 'vuex' | ||||
|   export default { | ||||
|     name: 'List', | ||||
|  | ||||
|     props: { | ||||
|       instance: Function, | ||||
|       dict: Object | ||||
|     }, | ||||
|  | ||||
|     data() { | ||||
|       return { | ||||
|         search: { | ||||
|           current: 1, | ||||
|           size: 10, | ||||
|           groupName: '' | ||||
|         }, | ||||
|         form: { | ||||
|           groupName: '', | ||||
|           showIndex: '' | ||||
|         }, | ||||
|         id: '', | ||||
|         isShowAdd: false, | ||||
|         total: 0, | ||||
|         colConfigs: [ | ||||
|           {prop: 'groupName', label: '事件类型', align: 'left'}, | ||||
|           {prop: 'showIndex', label: '排序', align: 'center'}, | ||||
|           {slot: 'options', label: '操作'} | ||||
|         ], | ||||
|         tableData: [] | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     computed: { | ||||
|       ...mapState(['user']) | ||||
|     }, | ||||
|  | ||||
|     mounted() { | ||||
|       this.getList() | ||||
|     }, | ||||
|  | ||||
|     methods: { | ||||
|       getList() { | ||||
|         this.instance.post(`/app/apppatrolreportgroupv2/list`, null, { | ||||
|           params: { | ||||
|             ...this.search | ||||
|           } | ||||
|         }).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             this.tableData = res.data.records | ||||
|             this.total = res.data.total | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       edit (e) { | ||||
|         this.id = e.id | ||||
|         this.form.groupName = e.groupName | ||||
|         this.form.showIndex = '' | ||||
|  | ||||
|         this.$nextTick(() => { | ||||
|           this.isShowAdd = true | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       onClose () { | ||||
|         this.id = '' | ||||
|         this.form.showIndex = '' | ||||
|         this.form.groupName = '' | ||||
|       }, | ||||
|  | ||||
|       onConfirm () { | ||||
|         this.$refs.form.validate((valid) => { | ||||
|           if (valid) { | ||||
|             this.instance.post(`/app/apppatrolreportgroupv2/addOrUpdate`, { | ||||
|               ...this.form, | ||||
|               id: this.id || null | ||||
|             }).then(res => { | ||||
|               if (res.code === 0) { | ||||
|                 this.$message.success('添加成功') | ||||
|                 this.isShowAdd = false | ||||
|  | ||||
|                 this.getList() | ||||
|               } | ||||
|             }) | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       cancel (isRefresh) { | ||||
|         this.$emit('change', { | ||||
|           type: 'list', | ||||
|           isRefresh: !!isRefresh | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       remove(id) { | ||||
|         this.$confirm('确定删除该数据?').then(() => { | ||||
|           this.instance.post(`/app/apppatrolreportgroupv2/delete?ids=${id}`).then(res => { | ||||
|             if (res.code == 0) { | ||||
|               this.$message.success('删除成功!') | ||||
|               this.getList() | ||||
|             } | ||||
|           }) | ||||
|         }) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| </style> | ||||
							
								
								
									
										62
									
								
								packages/conv/AppHealthReport/AppHealthReport.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,62 @@ | ||||
| <template> | ||||
|   <div class="AppHealthReport"> | ||||
|     <keep-alive :include="['List']"> | ||||
|       <component ref="component" :is="component" @change="onChange" :params="params" :instance="instance" :dict="dict"></component> | ||||
|     </keep-alive> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   import List from './components/List.vue' | ||||
|   import Detail from './components/Detail.vue' | ||||
|  | ||||
|   export default { | ||||
|     name: 'AppHealthReport', | ||||
|     label: '健康上报', | ||||
|  | ||||
|     components: { | ||||
|       List, | ||||
|       Detail | ||||
|     }, | ||||
|  | ||||
|     props: { | ||||
|       instance: Function, | ||||
|       dict: Object, | ||||
|       permissions: Function | ||||
|     }, | ||||
|  | ||||
|     data () { | ||||
|       return { | ||||
|         component: 'List', | ||||
|         params: {} | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     methods: { | ||||
|       onChange (data) { | ||||
|         if (data.type === 'Detail') { | ||||
|           this.component = 'Detail' | ||||
|           this.isShowDetail = true | ||||
|           this.params = data.params | ||||
|         } | ||||
|  | ||||
|         if (data.type === 'list') { | ||||
|           this.component = 'List' | ||||
|           this.params = data.params | ||||
|  | ||||
|           this.$nextTick(() => { | ||||
|             if (data.isRefresh) { | ||||
|               this.$refs.component.getList() | ||||
|             } | ||||
|           }) | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
|   .AppHealthReport { | ||||
|     height: 100%; | ||||
|   } | ||||
| </style> | ||||
							
								
								
									
										316
									
								
								packages/conv/AppHealthReport/components/Detail.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,316 @@ | ||||
|  <template> | ||||
|   <ai-detail isHasSidebar> | ||||
|     <template slot="title"> | ||||
|       <ai-title title="详情" isShowBack isShowBottomBorder @onBackClick="cancel(true)"> | ||||
|       </ai-title> | ||||
|     </template> | ||||
|     <template slot="content"> | ||||
|       <AiSidebar :tabTitle="tabList" v-model="currIndex"></AiSidebar> | ||||
|       <div v-show="currIndex === 0"> | ||||
|         <ai-card title="基本信息" v-show="currIndex === 0"> | ||||
|           <template #content> | ||||
|             <ai-wrapper | ||||
|               label-width="120px"> | ||||
|               <ai-info-item label="姓名" :value="info.name"></ai-info-item> | ||||
|               <ai-info-item label="上报时间" :value="info.createTime"></ai-info-item> | ||||
|               <ai-info-item label="身份证号" :value="info.idNumber"></ai-info-item> | ||||
|               <ai-info-item label="所属地区" :value="info.areaName"></ai-info-item> | ||||
|               <ai-info-item label="详细地址" isLine :value="info.address"></ai-info-item> | ||||
|             </ai-wrapper> | ||||
|           </template> | ||||
|         </ai-card> | ||||
|       </div> | ||||
|       <ai-card title="每日上报" v-show="currIndex === 1"> | ||||
|         <template #content> | ||||
|           <ai-table | ||||
|             class="detail-table__table" | ||||
|             :tableData="tableData" | ||||
|             :col-configs="colConfigs" | ||||
|             :total="total" | ||||
|             :current.sync="search.current" | ||||
|             :size.sync="search.size" | ||||
|             @getList="getList"> | ||||
|             <el-table-column slot="options" width="140px" fixed="right" label="操作" align="center"> | ||||
|               <template slot-scope="{ row }"> | ||||
|                 <div class="table-options"> | ||||
|                   <el-button type="text" @click="toDetail(row.id)">详情</el-button> | ||||
|                 </div> | ||||
|               </template> | ||||
|             </el-table-column> | ||||
|           </ai-table> | ||||
|           <ai-dialog | ||||
|             :visible.sync="isShow" | ||||
|             width="890px" | ||||
|             customFooter | ||||
|             title="上报详情"> | ||||
|             <ai-bar title="健康状况"></ai-bar> | ||||
|             <ai-wrapper | ||||
|               label-width="120px"> | ||||
|               <ai-info-item label="当前体温"> | ||||
|                 <span :style="{color: reportInfo.temperature > 37.3 ? '#FF4466' : '#42D784'}">{{ reportInfo.temperature }}℃</span> | ||||
|               </ai-info-item> | ||||
|               <ai-info-item label="14天内是否接触新冠确诊或疑似患者"> | ||||
|                 <span :style="{color: reportInfo.touchInFourteen === '0' ? '#42D784' : '#FF4466'}">{{ $dict.getLabel('epidemicTouchInFourteen', reportInfo.touchInFourteen) }}</span> | ||||
|               </ai-info-item> | ||||
|               <ai-info-item label="当前健康状况" isLine> | ||||
|                 <span :style="{color: !reportInfo.isHealth ? '#42D784' : '#FF4466'}">{{ reportInfo.healthName }}</span> | ||||
|               </ai-info-item> | ||||
|             </ai-wrapper> | ||||
|             <ai-bar title="核酸检测信息"></ai-bar> | ||||
|             <ai-wrapper | ||||
|               label-width="120px"> | ||||
|               <ai-info-item label="检测日期"> | ||||
|                 <span>{{ reportInfo.checkTime && reportInfo.checkTime.split(' ')[0] }}</span> | ||||
|               </ai-info-item> | ||||
|               <ai-info-item label="检测结果"> | ||||
|                 <span :style="{color: reportInfo.checkResult === '0' ? '#42D784' : '#FF4466'}">{{ $dict.getLabel('epidemicRecentTestResult', reportInfo.checkResult) }}</span> | ||||
|               </ai-info-item> | ||||
|               <ai-info-item label="健康码状态"> | ||||
|                 <span :style="{color: (reportInfo.healthCode === '0' || reportInfo.healthCode === '1') ? '#42D784' : '#FF4466'}">{{ $dict.getLabel('epidemicHealthCode', reportInfo.healthCode) }}</span> | ||||
|               </ai-info-item> | ||||
|               <ai-info-item label="已接种疫苗次数"> | ||||
|                 <span>{{ $dict.getLabel('epidemicVaccineTime', reportInfo.vaccine) }}</span> | ||||
|               </ai-info-item> | ||||
|               <ai-info-item label="本人健康码截图" isLine> | ||||
|                 <ai-uploader | ||||
|                   :instance="instance" | ||||
|                   v-model="reportInfo.checkPhoto" | ||||
|                   disabled | ||||
|                   :limit="9"> | ||||
|                 </ai-uploader> | ||||
|               </ai-info-item> | ||||
|             </ai-wrapper> | ||||
|             <div class="dialog-footer" slot="footer"> | ||||
|               <el-button @click="isShow = false">关闭</el-button> | ||||
|             </div> | ||||
|           </ai-dialog> | ||||
|         </template> | ||||
|       </ai-card> | ||||
|       <div v-show="currIndex === 2"> | ||||
|         <ai-card title="异常处理"> | ||||
|           <template #right> | ||||
|             <el-button type="primary" v-if="info.status === '0'" @click="release">解除异常</el-button> | ||||
|           </template> | ||||
|           <template #content> | ||||
|             <ai-wrapper | ||||
|               label-width="120px"> | ||||
|               <ai-info-item label="姓名" :value="info.name"></ai-info-item> | ||||
|               <ai-info-item label="填报时间" :value="info.createTime"></ai-info-item> | ||||
|               <ai-info-item label="身份证号" :value="info.idNumber"></ai-info-item> | ||||
|               <ai-info-item label="手机号码" :value="info.phone"></ai-info-item> | ||||
|               <ai-info-item label="异常状况" isLine> | ||||
|                 <span :style="{color: info.unusual ? 'red' : '#333'}">{{ info.unusual || '-' }}</span> | ||||
|               </ai-info-item> | ||||
|               <ai-info-item label="异常解除人" v-if="info.releaseName && info.status === '1'" :value="info.releaseName"></ai-info-item> | ||||
|               <ai-info-item label="异常解除时间" v-if="info.releaseTime && info.status === '1'" :value="info.releaseTime"></ai-info-item> | ||||
|             </ai-wrapper> | ||||
|           </template> | ||||
|         </ai-card> | ||||
|         <ai-card title="异常情况记录"> | ||||
|           <template #right> | ||||
|             <el-button type="primary" v-if="info.status === '0'" @click="isShowAdd = true">添加记录</el-button> | ||||
|           </template> | ||||
|           <template #content> | ||||
|             <ai-table | ||||
|               :tableData="recordList" | ||||
|               :col-configs="recordConfigs" | ||||
|               :total="recordTotal" | ||||
|               :current.sync="recordSerch.current" | ||||
|               :size.sync="recordSerch.size" | ||||
|               @getList="getRecordList"> | ||||
|               <el-table-column slot="options" width="120px" fixed="right" label="操作" align="center"> | ||||
|                 <template slot-scope="{ row }"> | ||||
|                   <div class="table-options"> | ||||
|                     <el-button type="text" @click="remove(row.id)">删除</el-button> | ||||
|                   </div> | ||||
|                 </template> | ||||
|               </el-table-column> | ||||
|             </ai-table> | ||||
|           </template> | ||||
|         </ai-card> | ||||
|         <ai-dialog | ||||
|           :visible.sync="isShowAdd" | ||||
|           width="800px" | ||||
|           @close="form.content = ''" | ||||
|           title="添加异常记录" | ||||
|           @onConfirm="onConfirm"> | ||||
|           <el-form class="ai-form" label-width="120px" :model="form" ref="form"> | ||||
|             <el-form-item label="异常记录" prop="content" style="width: 100%;" :rules="[{ required: true, message: '请输入异常记录' }]"> | ||||
|               <el-input type="textarea" :rows="5" :maxlength="500" v-model="form.content" clearable placeholder="请输入异常记录" show-word-limit></el-input> | ||||
|             </el-form-item> | ||||
|           </el-form> | ||||
|         </ai-dialog> | ||||
|       </div> | ||||
|     </template> | ||||
|   </ai-detail> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   export default { | ||||
|     name: 'Detail', | ||||
|  | ||||
|     props: { | ||||
|       instance: Function, | ||||
|       dict: Object, | ||||
|       params: Object | ||||
|     }, | ||||
|  | ||||
|     data () { | ||||
|       return { | ||||
|         total: 0, | ||||
|         info: {}, | ||||
|         id: '', | ||||
|         isShowAdd: false, | ||||
|         recordTotal: 0, | ||||
|         recordSerch: { | ||||
|           current: 1, | ||||
|           size: 10 | ||||
|         }, | ||||
|         search: { | ||||
|           current: 1, | ||||
|           size: 10 | ||||
|         }, | ||||
|         form: { | ||||
|           content: '' | ||||
|         }, | ||||
|         recordConfigs: [ | ||||
|           {prop: 'content', label: '异常记录', align: 'center' }, | ||||
|           {prop: 'createTime', label: '创建时间', align: 'center'}, | ||||
|           {prop: 'createUserName', label: '记录人', align: 'center' } | ||||
|         ], | ||||
|         reportInfo: {}, | ||||
|         isShow: false, | ||||
|         currIndex: 0, | ||||
|         tableData: [], | ||||
|         recordList: [], | ||||
|         colConfigs: [ | ||||
|           {prop: 'createTime', label: '上报日期', align: 'center', dateFormat: 'YYYY-MM-DD'}, | ||||
|           {prop: 'status', label: '健康状态', align: 'center', format: v => v === '0' ? '异常' : '正常' } | ||||
|         ], | ||||
|         tabList: ['基本信息', '每日上报', '异常处理'] | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     created () { | ||||
|       if (this.params && this.params.id) { | ||||
|         this.id = this.params.id | ||||
|         this.dict.load(['epidemicRecentHealth', 'epidemicRecentTravel', 'epidemicTouchInFourteen', 'epidemicMemberType', 'epidemicRecentTestResult']).then(() => { | ||||
|           this.getInfo(this.params.id) | ||||
|           this.getList() | ||||
|           this.getRecordList() | ||||
|         }) | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     methods: { | ||||
|       getInfo (id) { | ||||
|         this.instance.post(`/app/appepidemicreportmember/queryDetailById?id=${id}`).then(res => { | ||||
|           if (res.code === 0) { | ||||
|             this.info = res.data | ||||
|             this.currIndex = 0 | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       getRecordList () { | ||||
|         this.instance.post(`/app/appepidemicunusuallog/list`, null, { | ||||
|           params: { | ||||
|             ...this.search, | ||||
|             recordId: this.params.id | ||||
|           } | ||||
|         }).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             this.recordList = res.data.records | ||||
|             this.recordTotal = res.data.total | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       onConfirm() { | ||||
|         this.$refs.form.validate(v => { | ||||
|           if (v) { | ||||
|             this.instance.post('/app/appepidemicunusuallog/addOrUpdate', { | ||||
|               ...this.form, | ||||
|               recordId: this.params.id | ||||
|             }).then(res => { | ||||
|               if (res?.code == 0) { | ||||
|                 this.isShowAdd = false | ||||
|                 this.getRecordList(this.params.id) | ||||
|                 this.$message.success('添加成功!') | ||||
|               } | ||||
|             }) | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       release () { | ||||
|         this.$confirm('确定解除异常?').then(() => { | ||||
|           this.instance.post(`/app/appepidemicreportmember/release`, { | ||||
|             id: this.params.id | ||||
|           }).then(res => { | ||||
|             if (res.code == 0) { | ||||
|               this.$message.success('解除异常成功!') | ||||
|               this.currIndex = 0 | ||||
|               this.getInfo(this.params.id) | ||||
|             } | ||||
|           }) | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       remove(id) { | ||||
|         this.$confirm('确定删除该数据?').then(() => { | ||||
|           this.instance.post(`/app/appepidemicunusuallog/delete?ids=${id}`).then(res => { | ||||
|             if (res.code == 0) { | ||||
|               this.$message.success('删除成功!') | ||||
|               this.getRecordList(this.params.id) | ||||
|             } | ||||
|           }) | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       toDetail (id) { | ||||
|         this.instance.post(`/app/appepidemichealthreport/queryDetailById?id=${id}`).then(res => { | ||||
|           if (res.code === 0) { | ||||
|             this.reportInfo = res.data | ||||
|             this.reportInfo.checkPhoto = JSON.parse(res.data.checkPhoto) | ||||
|             let healthName = '' | ||||
|             this.reportInfo.isHealth = false | ||||
|             res.data.health.split(',').forEach(v => { | ||||
|               if (v > 0) { | ||||
|                 this.reportInfo.isHealth = true | ||||
|               } | ||||
|               healthName = healthName + this.dict.getLabel('epidemicRecentHealth', v) | ||||
|             }) | ||||
|             this.reportInfo.healthName = healthName | ||||
|  | ||||
|             this.isShow = true | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       getList () { | ||||
|         this.instance.post(`/app/appepidemichealthreport/list`, null, { | ||||
|           params: { | ||||
|             ...this.search, | ||||
|             memberId: this.params.id | ||||
|           } | ||||
|         }).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             this.tableData = res.data.records | ||||
|             this.total = res.data.total | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       cancel (isRefresh) { | ||||
|         this.$emit('change', { | ||||
|           type: 'list', | ||||
|           isRefresh: !!isRefresh | ||||
|         }) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| <style scoped lang="scss"> | ||||
| </style> | ||||
							
								
								
									
										293
									
								
								packages/conv/AppHealthReport/components/List.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,293 @@ | ||||
| <template> | ||||
|   <ai-list class="list"> | ||||
|     <ai-title slot="title" title="健康上报" v-if="search.areaId" isShowBottomBorder :instance="instance" :disabledLevel="disabledLevel" isShowArea v-model="search.areaId" @change="changeArea"></ai-title> | ||||
|     <template slot="content"> | ||||
|       <div class="statistics-top"> | ||||
|         <div class="statistics-top__item"> | ||||
|           <span>上报人数</span> | ||||
|           <h2 style="color: #2266FF;">{{ info.total }}</h2> | ||||
|         </div> | ||||
|         <div class="statistics-top__item"> | ||||
|           <span>今日上报</span> | ||||
|           <h2 style="color: #22AA99;">{{ info.today }}</h2> | ||||
|         </div> | ||||
|         <div class="statistics-top__item"> | ||||
|           <span>今日未报</span> | ||||
|           <h2 style="color: #F8B425">{{ info.unReport }}</h2> | ||||
|         </div> | ||||
|         <div class="statistics-top__item"> | ||||
|           <span>今日异常</span> | ||||
|           <h2 style="color: red">{{ info.unusual }}</h2> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="content"> | ||||
|         <ai-search-bar bottomBorder> | ||||
|           <template #left> | ||||
|             <ai-select | ||||
|               v-model="search.checkResult" | ||||
|               clearable | ||||
|               placeholder="请选择检查结果" | ||||
|               :selectList="dict.getDict('epidemicRecentTestResult')" | ||||
|               @change="search.current = 1, getList()"> | ||||
|             </ai-select> | ||||
|             <ai-select | ||||
|               v-model="search.today" | ||||
|               clearable | ||||
|               placeholder="今日是否上报" | ||||
|               :selectList="dictList" | ||||
|               @change="search.current = 1, getList()"> | ||||
|             </ai-select> | ||||
|             <ai-download :instance="instance" url="/app/appepidemicreportmember/export" :params="search" fileName="健康上报" :disabled="tableData.length == 0"> | ||||
|               <el-button icon="iconfont iconExported" :disabled="tableData.length == 0">导出</el-button> | ||||
|             </ai-download> | ||||
|           </template> | ||||
|           <template #right> | ||||
|             <el-input | ||||
|               v-model="search.name" | ||||
|               size="small" | ||||
|               placeholder="请输入姓名" | ||||
|               clearable | ||||
|               v-throttle="() => {search.current = 1, getList()}" | ||||
|               @clear="search.current = 1, search.name = '', getList()" | ||||
|               suffix-icon="iconfont iconSearch"> | ||||
|             </el-input> | ||||
|           </template> | ||||
|         </ai-search-bar> | ||||
|         <ai-table | ||||
|           :tableData="tableData" | ||||
|           :col-configs="colConfigs" | ||||
|           :total="total" | ||||
|           v-loading="loading" | ||||
|           style="margin-top: 16px;" | ||||
|           :current.sync="search.current" | ||||
|           :size.sync="search.size" | ||||
|           @getList="getList"> | ||||
|           <el-table-column slot="healthCode" align="center" label="健康码"> | ||||
|             <template slot-scope="{ row }"> | ||||
|               <ai-uploader | ||||
|                 v-if="row.healthCode" | ||||
|                 :instance="instance" | ||||
|                 :value="JSON.parse(row.healthCode)" | ||||
|                 disabled | ||||
|                 :limit="1"> | ||||
|               </ai-uploader> | ||||
|             </template> | ||||
|           </el-table-column> | ||||
|           <el-table-column slot="options" width="140px" fixed="right" label="操作" align="center"> | ||||
|             <template slot-scope="{ row }"> | ||||
|               <div class="table-options"> | ||||
|                 <el-button type="text" @click="toDetail(row.id)">详情</el-button> | ||||
|                 <el-button type="text" @click="remove(row.id)">删除</el-button> | ||||
|               </div> | ||||
|             </template> | ||||
|           </el-table-column> | ||||
|         </ai-table> | ||||
|       </div> | ||||
|     </template> | ||||
|   </ai-list> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   import { mapState } from 'vuex' | ||||
|   export default { | ||||
|     name: 'List', | ||||
|  | ||||
|     props: { | ||||
|       instance: Function, | ||||
|       dict: Object | ||||
|     }, | ||||
|  | ||||
|     data () { | ||||
|       return { | ||||
|         search: { | ||||
|           current: 1, | ||||
|           size: 10, | ||||
|           name: '', | ||||
|           checkResult: '', | ||||
|           areaId: '', | ||||
|           today: '' | ||||
|         }, | ||||
|         dictList: [{ | ||||
|           dictName: '否', | ||||
|           dictValue: '0' | ||||
|         }, { | ||||
|           dictName: '是', | ||||
|           dictValue: '1' | ||||
|         }], | ||||
|         info: {}, | ||||
|         colConfigs: [ | ||||
|           { prop: 'name', label: '姓名' }, | ||||
|           { prop: 'phone', align: 'center', label: '手机号码' }, | ||||
|           { prop: 'areaName', align: 'center', label: '所属地区', width: '200px' }, | ||||
|           { prop: 'reportTime', align: 'center', label: '上报时间', width: '200px' }, | ||||
|           { | ||||
|             prop: 'vaccine', | ||||
|             align: 'center', | ||||
|             label: '已接种情况', | ||||
|             render: (h, {row}) => { | ||||
|               return h('span', { | ||||
|                 style: { | ||||
|                 } | ||||
|               }, row.today === '0' ? '-' : (row.vaccine || 0 + '次')) | ||||
|             } | ||||
|           }, | ||||
|           { prop: 'healthCode', align: 'center', label: '健康码', format: v => v ? this.dict.getLabel('epidemicHealthCode', v) : '-' }, | ||||
|           { prop: 'checkTime', align: 'center', label: '核酸日期', format: v => v ? v.split(' ')[0] : '-' }, | ||||
|           { prop: 'checkResult', align: 'center', label: '检测结果', format: v => v ? this.dict.getLabel('epidemicRecentTestResult', v) : '-' }, | ||||
|           { | ||||
|             prop: 'status', | ||||
|             align: 'center', | ||||
|             label: '健康状态', | ||||
|             render: (h, {row}) => { | ||||
|               return h('span', { | ||||
|                 style: { | ||||
|                   color: row.status === '0' ? 'red' : '#333' | ||||
|                 } | ||||
|               }, row.today === '0' ? '-' : (row.status === '0' ? '异常' : '正常')) | ||||
|             } | ||||
|           }, | ||||
|           { prop: 'today', align: 'center', label: '今日上报', format: v => v === '0' ? '未上报' : '已上报' }, | ||||
|         ], | ||||
|         tableData: [], | ||||
|         total: 0, | ||||
|         loading: false, | ||||
|         disabledLevel: 0 | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     computed: { | ||||
|       ...mapState(['user']), | ||||
|  | ||||
|       param () { | ||||
|         return { | ||||
|  | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     created () { | ||||
|       this.disabledLevel = this.user.info.areaList.length - 1 | ||||
|       this.search.areaId = this.user.info.areaId | ||||
|       this.loading = true | ||||
|       this.dict.load(['epidemicTouchInFourteen', 'epidemicRecentHealth', 'epidemicRecentTestResult', 'epidemicHealthCode', 'epidemicVaccineTime']).then(() => { | ||||
|         this.getList() | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     methods: { | ||||
|       getList () { | ||||
|         this.instance.post(`/app/appepidemicreportmember/list`, null, { | ||||
|           params: { | ||||
|             ...this.search | ||||
|           } | ||||
|         }).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             this.tableData = res.data.records | ||||
|             this.total = res.data.total | ||||
|             this.loading = false | ||||
|           } else { | ||||
|             this.loading = false | ||||
|           } | ||||
|         }).catch(() => { | ||||
|           this.loading = false | ||||
|         }) | ||||
|  | ||||
|         this.getTotalInfo() | ||||
|       }, | ||||
|  | ||||
|       remove(id) { | ||||
|         this.$confirm('确定删除该数据?').then(() => { | ||||
|           this.instance.post(`/app/appepidemicreportmember/delete?ids=${id}`).then(res => { | ||||
|             if (res.code == 0) { | ||||
|               this.$message.success('删除成功!') | ||||
|               this.getTotalInfo() | ||||
|               this.getList() | ||||
|             } | ||||
|           }) | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       toDetail (id) { | ||||
|         this.$emit('change', { | ||||
|           type: 'Detail', | ||||
|           params: { | ||||
|             id: id || '' | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       changeArea () { | ||||
|         this.search.current = 1 | ||||
|  | ||||
|         this.$nextTick(() => { | ||||
|           this.getList() | ||||
|           this.getTotalInfo() | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       getTotalInfo () { | ||||
|         this.instance.post(`/app/appepidemicreportmember/statistic`, null, { | ||||
|           params: { | ||||
|             areaId: this.search.areaId | ||||
|           } | ||||
|         }).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             this.info = res.data | ||||
|           } | ||||
|         }) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| <style scoped lang="scss"> | ||||
|   .list { | ||||
|     :deep( .ai-list__content ){ | ||||
|       padding: 0!important; | ||||
|  | ||||
|       .ai-list__content--right-wrapper { | ||||
|         background: transparent!important; | ||||
|         box-shadow: none!important; | ||||
|         margin: 0!important; | ||||
|         padding: 12px 16px 12px!important; | ||||
|       } | ||||
|     } | ||||
|     .statistics-top { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       margin-bottom: 20px; | ||||
|  | ||||
|       & > div { | ||||
|         flex: 1; | ||||
|         height: 96px; | ||||
|         line-height: 1; | ||||
|         margin-right: 20px; | ||||
|         padding: 16px 24px; | ||||
|         background: #FFFFFF; | ||||
|         box-shadow: 0px 4px 6px -2px rgba(15, 15, 21, 0.15); | ||||
|         border-radius: 4px; | ||||
|  | ||||
|         &:last-child { | ||||
|           margin-right: 0; | ||||
|         } | ||||
|  | ||||
|         h3 { | ||||
|           font-size: 24px; | ||||
|         } | ||||
|  | ||||
|         span { | ||||
|           display: block; | ||||
|           margin-bottom: 16px; | ||||
|           color: #888888; | ||||
|           font-size: 16px; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .content { | ||||
|       padding: 16px; | ||||
|       background: #FFFFFF; | ||||
|       box-shadow: 0px 4px 6px -2px rgba(15, 15, 21, 0.15); | ||||
|     } | ||||
|   } | ||||
| </style> | ||||
							
								
								
									
										397
									
								
								packages/conv/AppPatrolReportSet/AppPatrolReportSet.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,397 @@ | ||||
| <template> | ||||
|   <ai-detail class="AppPatrolReportSet"> | ||||
|     <ai-title slot="title" title="巡查上报设置"  isShowBottomBorder> | ||||
|       <el-button size="small" type="primary" icon="iconfont iconAdd" slot="rightBtn" @click="add">添加节点</el-button> | ||||
|     </ai-title> | ||||
|     <template slot="content"> | ||||
|       <div class="list" v-if="list.length"> | ||||
|         <div class="item" v-for="(item, index) in list" :key="index"> | ||||
|           <div class="btn"> | ||||
|             <el-button type="text" @click="edit(index)">编辑</el-button> | ||||
|             <el-button type="text" @click="del(index)">删除</el-button> | ||||
|           </div> | ||||
|           <div class="index">{{index < 9 ? `0${index+1}` : `${index+1}`}}</div> | ||||
|           <div class="info"> | ||||
|             <div class="label">节点类型</div> | ||||
|             <div class="value">{{item.nodeType == 0 ? '首节点' : $dict.getLabel('prfcNodeType', item.nodeType)}}</div> | ||||
|           </div> | ||||
|           <div class="info"> | ||||
|             <div class="label">上级节点网络</div> | ||||
|             <div class="value">{{item.girdName}}<span class="span" v-if="item.nodeType == 2 && item.onlyCoordination == '1'">仅协同部门</span></div> | ||||
|           </div> | ||||
|           <div class="flex"> | ||||
|             <div class="info"> | ||||
|               <div class="label">生效功能</div> | ||||
|               <div class="value"> | ||||
|                 <span v-if="item.functionAdd == 1">添加</span> | ||||
|                 <span v-if="item.functionHandle == 1">办理</span> | ||||
|                 <span v-if="item.functionTransmit == 1">转交</span> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div class="info"> | ||||
|               <div class="label">生效身份</div> | ||||
|               <div class="value"> | ||||
|                 <span v-if="item.roleMember == 1">网格员</span> | ||||
|                 <span v-if="item.roleAdmin == 1">网格长</span> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|  | ||||
|           <div v-if="item.nodeType == 3"> | ||||
|             <div class="info"> | ||||
|               <div class="label">同级节点网络</div> | ||||
|               <div class="value">{{item.girdName2}}<span class="span" v-if="item.nodeType == 3 && item.onlyCoordination == '1'">仅协同部门</span></div> | ||||
|             </div> | ||||
|             <div class="flex"> | ||||
|               <div class="info"> | ||||
|                 <div class="label">生效功能</div> | ||||
|                 <div class="value"> | ||||
|                   <span v-if="item.functionAdd2 == 1">添加</span> | ||||
|                   <span v-if="item.functionHandle2 == 1">办理</span> | ||||
|                   <span v-if="item.functionTransmit2 == 1">转交</span> | ||||
|                 </div> | ||||
|               </div> | ||||
|               <div class="info"> | ||||
|                 <div class="label">生效身份</div> | ||||
|                 <div class="value"> | ||||
|                   <span v-if="item.roleMember2 == 1">网格员</span> | ||||
|                   <span v-if="item.roleAdmin2 == 1">网格长</span> | ||||
|                 </div> | ||||
|               </div> | ||||
|               <!-- <div class="info"> | ||||
|                 <div class="label">条件约束</div> | ||||
|                 <div class="value">名称约束</div> | ||||
|               </div> --> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|       <ai-empty v-else>暂无数据</ai-empty> | ||||
|        | ||||
|       <ai-dialog :visible.sync="dialog" :title="dialogTitle" @closed="$refs.form.resetFields()" @onConfirm="onConfirm" width="70%"> | ||||
|         <el-form ref="form" :rules="rules" size="small" :model="form" label-width="110px"> | ||||
|           <el-form-item label="节点类型" prop="nodeType" v-if="form.nodeType === '0'"> | ||||
|             <ai-select disabled | ||||
|               v-model="form.nodeType" | ||||
|               clearable | ||||
|               placeholder="请选择..." | ||||
|               :selectList="nodeTypeDictList"> | ||||
|             </ai-select> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="节点类型" prop="nodeType" v-else> | ||||
|             <ai-select :disabled="getGirdList.length == 1 && form.nodeType == '1'" | ||||
|               v-model="form.nodeType" | ||||
|               clearable | ||||
|               placeholder="请选择..." | ||||
|               :selectList="dict.getDict('prfcNodeType')" @change="changeNodeType"> | ||||
|             </ai-select> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="选择节点网格" prop="girdId" > | ||||
|             <ai-picker v-if="form.nodeType === '0'" | ||||
|               :ops="{label: 'girdName'}" | ||||
|               dialogTitle="选择节点网格" | ||||
|               action="/app/appgirdinfo/girdList" | ||||
|               :instance="instance" | ||||
|               @pick="onGirdChange" | ||||
|               v-model="form.girdIdList"> | ||||
|               <div class="userSelcet"> | ||||
|                 <span style="color: #606266;" v-if="form.girdIdList.length">{{ form.girdName }}</span> | ||||
|                 <span v-else>选择节点网格</span> | ||||
|                 <i class="el-icon-arrow-down"></i> | ||||
|               </div> | ||||
|             </ai-picker> | ||||
|             <el-input placeholder="节点网格" v-model="form.girdName" disabled v-else></el-input> | ||||
|             <el-checkbox v-model="sameLevelUsed" disabled>当前选中网格层级生效</el-checkbox> | ||||
|             <el-checkbox v-model="form.onlyCoordination" v-if="form.nodeType == '2'" true-label="1" false-label="0">仅协同部门</el-checkbox> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="生效功能"> | ||||
|             <el-checkbox v-model="form.functionAdd" true-label="1" false-label="0">添加</el-checkbox> | ||||
|             <el-checkbox v-model="form.functionHandle" true-label="1" false-label="0">办理</el-checkbox> | ||||
|             <el-checkbox v-model="form.functionTransmit" true-label="1" false-label="0">转交</el-checkbox> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="生效身份"> | ||||
|             <el-checkbox v-model="form.roleMember" true-label="1" false-label="0">网格员</el-checkbox> | ||||
|             <el-checkbox v-model="form.roleAdmin" true-label="1" false-label="0">网格长</el-checkbox> | ||||
|           </el-form-item> | ||||
|           <div v-if="form.nodeType == 3"> | ||||
|             <el-form-item label="同级节点网格" prop="girdId2"> | ||||
|               <el-input placeholder="节点网格" v-model="form.girdName2" disabled></el-input> | ||||
|               <el-checkbox v-model="sameLevelUsed" disabled>当前选中网格层级生效</el-checkbox> | ||||
|               <el-checkbox v-model="form.onlyCoordination" v-if="form.nodeType == '3'" true-label="1" false-label="0">仅协同部门</el-checkbox> | ||||
|             </el-form-item> | ||||
|             <el-form-item label="生效功能"> | ||||
|               <el-checkbox v-model="form.functionAdd2" true-label="1" false-label="0">添加</el-checkbox> | ||||
|               <el-checkbox v-model="form.functionHandle2" true-label="1" false-label="0">办理</el-checkbox> | ||||
|               <el-checkbox v-model="form.functionTransmit2" true-label="1" false-label="0">转交</el-checkbox> | ||||
|             </el-form-item> | ||||
|             <el-form-item label="生效身份"> | ||||
|               <el-checkbox v-model="form.roleMember2" true-label="1" false-label="0">网格员</el-checkbox> | ||||
|               <el-checkbox v-model="form.roleAdmin2" true-label="1" false-label="0">网格长</el-checkbox> | ||||
|             </el-form-item> | ||||
|           </div> | ||||
|         </el-form> | ||||
|       </ai-dialog> | ||||
|     </template> | ||||
|     <template slot="footer"> | ||||
|       <el-button @click="getList">返回</el-button> | ||||
|       <el-button type="primary" @click="confirm">提交</el-button> | ||||
|     </template> | ||||
|   </ai-detail> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   export default { | ||||
|     name: 'AppPatrolReportSet', | ||||
|     label: '巡查上报设置', | ||||
|  | ||||
|     props: { | ||||
|       instance: Function, | ||||
|       dict: Object, | ||||
|       permissions: Function | ||||
|     }, | ||||
|  | ||||
|     data () { | ||||
|       return { | ||||
|         dialog: false, | ||||
|         dialogTitle: '', | ||||
|         form: { | ||||
|           nodeType: '', //0:首节点、1:上级、2:同级、3:混合 | ||||
|           girdIdList: [], | ||||
|           girdId: '', | ||||
|           girdCode: '', | ||||
|           girdLevel: '', | ||||
|           girdName: '', | ||||
|           functionAdd: '1', | ||||
|           functionHandle: '1', | ||||
|           functionTransmit: '1', | ||||
|           roleAdmin: '1', | ||||
|           roleMember: '1', | ||||
|           girdId2: '', | ||||
|           girdCode2: '', | ||||
|           girdLevel2: '', | ||||
|           girdName2: '', | ||||
|           functionAdd2: '1', | ||||
|           functionHandle2: '1', | ||||
|           functionTransmit2: '1', | ||||
|           roleAdmin2: '1', | ||||
|           roleMember2: '1', | ||||
|           onlyCoordination: '1' | ||||
|         }, | ||||
|         list: [], | ||||
|         nodeTypeDictList: [{dictName: '首节点', dictValue: '0'}], | ||||
|         sameLevelUsed: true, | ||||
|         getGirdList: [], | ||||
|         editIndex: '' | ||||
|       } | ||||
|     }, | ||||
|     computed: { | ||||
|       rules() { | ||||
|         return { | ||||
|           nodeType: [{ required: true, message: '请选择节点类型', trigger: 'change'}], | ||||
|           girdId: [{ required: true, message: '请选择节点网络', trigger: 'change'}], | ||||
|           girdId2: [{ required: true, message: '请选择同级节点网格', trigger: 'change'}], | ||||
|         } | ||||
|       }, | ||||
|     }, | ||||
|     created() { | ||||
|       this.dict.load('prfcNodeType').then(() => { | ||||
|         this.getList() | ||||
|       }) | ||||
|     }, | ||||
|     methods: { | ||||
|       add() { | ||||
|         this.form = { | ||||
|           nodeType: '', //0:首节点、1:上级、2:同级、3:混合 | ||||
|           girdIdList: [], | ||||
|           girdId: '', | ||||
|           girdCode: '', | ||||
|           girdLevel: '', | ||||
|           girdName: '', | ||||
|           functionAdd: '1', | ||||
|           functionHandle: '1', | ||||
|           functionTransmit: '1', | ||||
|           roleAdmin: '1', | ||||
|           roleMember: '1', | ||||
|           girdId2: '', | ||||
|           girdCode2: '', | ||||
|           girdLevel2: '', | ||||
|           girdName2: '', | ||||
|           functionAdd2: '1', | ||||
|           functionHandle2: '1', | ||||
|           functionTransmit2: '1', | ||||
|           roleAdmin2: '1', | ||||
|           roleMember2: '1', | ||||
|           onlyCoordination: '1' | ||||
|         } | ||||
|         if(this.list.length > 0) { | ||||
|           this.getGird(this.list.length-1) | ||||
|         }else { //首节点 | ||||
|           this.form.nodeType = '0' | ||||
|         } | ||||
|         this.dialogTitle = '添加节点' | ||||
|         this.dialog = true | ||||
|         this.$refs.form.resetFields() | ||||
|       }, | ||||
|       del(index) { | ||||
|         this.$confirm('确定删除该节点?').then(() => { | ||||
|           this.list.splice(index, 1) | ||||
|         }) | ||||
|       }, | ||||
|       edit(index) { | ||||
|         this.editIndex = index | ||||
|         this.form = {...this.list[index]} | ||||
|         if(this.form.nodeType != '0') { | ||||
|           this.getGird(index-1) | ||||
|         }  | ||||
|         this.dialogTitle = '编辑节点' | ||||
|         this.dialog = true | ||||
|       }, | ||||
|       onConfirm() { | ||||
|         this.$refs.form.validate((valid) => { | ||||
|           if (valid) { | ||||
|             if(this.dialogTitle == '添加节点') { | ||||
|               this.list.push(this.form) | ||||
|             }else { | ||||
|               this.list.splice(this.editIndex, 1, this.form) | ||||
|             } | ||||
|             this.dialog = false | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|       getList() { | ||||
|         this.instance.post(`/app/apppatrolreportflowconfigv2/queryNew`).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             this.list = res.data | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|       onGirdChange(e) { | ||||
|         this.form.girdId = e[0].id | ||||
|         this.form.girdCode = e[0].girdCode | ||||
|         this.form.girdLevel = e[0].girdLevel | ||||
|         this.form.girdName = e[0].girdName | ||||
|       }, | ||||
|       changeNodeType(e) { //1 上下级节点取数组0;2同级节点选择数组1; 3混合节点主取数组0,同级选择数组1 | ||||
|         console.log(e) | ||||
|         var arr = [] | ||||
|         if(e == 1) { | ||||
|           arr.push(this.getGirdList[0]) | ||||
|         } | ||||
|         if(e == 2) { | ||||
|           arr.push(this.getGirdList[1]) | ||||
|         } | ||||
|         if(e == 3) { | ||||
|           arr.push(this.getGirdList[0]) | ||||
|           this.form.girdId2 = this.getGirdList[1].id | ||||
|           this.form.girdCode2 = this.getGirdList[1].girdCode | ||||
|           this.form.girdLevel2 = this.getGirdList[1].girdLevel | ||||
|           this.form.girdName2 = this.getGirdList[1].girdName | ||||
|         } | ||||
|         this.onGirdChange(arr) | ||||
|       }, | ||||
|       getGird(index) { | ||||
|         var girdCode = this.list[index].girdCode | ||||
|         this.instance.post(`app/apppatrolreportflowconfigv2/choiseGird?previousGirdCode=${girdCode}`).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             this.getGirdList = res.data | ||||
|             if(res.data.length == 1 && this.dialogTitle == '添加节点') { //返回数据一条表示nodeType 1 上下级节点;混合节点主去数组0,同级选择数组1;同级节点选择数组1 | ||||
|               this.form.nodeType = '1' | ||||
|               this.onGirdChange(res.data) | ||||
|             } | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|       confirm() { | ||||
|         this.instance.post(`/app/apppatrolreportflowconfigv2/addOrUpdate`, this.list).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             this.$message.success('提交成功') | ||||
|             this.getList() | ||||
|           } | ||||
|         }) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
|   .AppPatrolReportSet { | ||||
|     height: 100%; | ||||
|     .list { | ||||
|       padding: 0 16px 16px; | ||||
|       background-color: #fff; | ||||
|     } | ||||
|     .item { | ||||
|       padding: 16px 0 4px 26px; | ||||
|       position: relative; | ||||
|       border-bottom: 1px solid #F2F2F2; | ||||
|       .info { | ||||
|         height: 22px; | ||||
|         font-family: MicrosoftYaHei; | ||||
|         font-size: 14px; | ||||
|         color: #888; | ||||
|         line-height: 22px; | ||||
|         margin-bottom: 16px; | ||||
|         .label { | ||||
|           display: inline-block; | ||||
|           width: 112px; | ||||
|           color: #888; | ||||
|         } | ||||
|         .value { | ||||
|           display: inline-block; | ||||
|           width: calc(100% - 112px); | ||||
|           color: #222; | ||||
|           span { | ||||
|             display: inline-block; | ||||
|             margin-right: 24px; | ||||
|           } | ||||
|           .span { | ||||
|             margin-left: 16px; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|       .index { | ||||
|         position: absolute; | ||||
|         top: 16px; | ||||
|         left: 0; | ||||
|         height: 21px; | ||||
|         font-family: DINAlternate-Bold; | ||||
|         font-weight: 700; | ||||
|         font-size: 18px; | ||||
|         color: #666; | ||||
|       } | ||||
|       .btn { | ||||
|         position: absolute; | ||||
|         right: 0; | ||||
|         top: 16px; | ||||
|       } | ||||
|       .flex { | ||||
|         display: flex; | ||||
|         .info { | ||||
|           width: 33.3%; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     :deep(.ai-select), | ||||
|     :deep(.el-input) { | ||||
|       display: inline-block; | ||||
|       width: 50%; | ||||
|       margin-right: 16px; | ||||
|     } | ||||
|     :deep(.AiPicker) { | ||||
|       display: inline-block; | ||||
|       width: 50%; | ||||
|       margin-right: 16px; | ||||
|       border: 1px solid #d0d4dc; | ||||
|       padding-left: 16px; | ||||
|       box-sizing: border-box; | ||||
|       border-radius: 4px; | ||||
|       position: relative; | ||||
|       .el-icon-arrow-down { | ||||
|         position: absolute; | ||||
|         top: 8px; | ||||
|         right: 8px; | ||||
|       } | ||||
|     } | ||||
|      | ||||
|   } | ||||
| </style> | ||||
							
								
								
									
										55
									
								
								packages/conv/AppReportAiWill/AppReportAtWill.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,55 @@ | ||||
| <template> | ||||
|   <section class="AppReportAtWill"> | ||||
|     <component ref="component" :is="currentPage" @change="onChange" :params="params" :instance="instance" :dict="dict" :menuName="menuName" /> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import List from './components/List' | ||||
| import Detail from './components/Detail' | ||||
| import Setting from './components/Setting' | ||||
|  | ||||
| export default { | ||||
|   name: 'AppReportAtWill', | ||||
|   label: '随手拍', | ||||
|  | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|     menuName: {default: '随手拍'} | ||||
|   }, | ||||
|  | ||||
|   data() { | ||||
|     return { | ||||
|       component: 'List', | ||||
|       params: {} | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     currentPage() { | ||||
|       let {hash, query: {id}} = this.$route | ||||
|       return hash == "#Setting" ? Setting : | ||||
|           !!id ? Detail : List | ||||
|     } | ||||
|   }, | ||||
|   components: { | ||||
|     List, | ||||
|     Detail, | ||||
|     Setting | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     onChange(data) { | ||||
|       this.$router.push({query: data.params, hash: data.type == "Setting" ? "#Setting" : ""}) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss"> | ||||
| .AppReportAtWill { | ||||
|   height: 100%; | ||||
|   background: #F3F6F9; | ||||
|   overflow: auto; | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										581
									
								
								packages/conv/AppReportAiWill/components/Detail.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,581 @@ | ||||
| <template> | ||||
|   <ai-detail class="reportAtWillDetail" v-loading="isLoading"> | ||||
|     <template #title> | ||||
|       <ai-title title="详情" isShowBack isShowBottomBorder @onBackClick="cancel(false)"> | ||||
|         <template #rightBtn> | ||||
|           <div class="title-btns"> | ||||
|             <el-button type="primary" icon="iconfont iconPerson_Transfered" @click="isShowForward = true" v-if="detail.eventStatus < 2">指派事件</el-button> | ||||
|             <el-button type="primary" icon="iconfont iconRegister" @click="isShowAdd = true" v-if="detail.eventStatus < 2">处理事件</el-button> | ||||
|           </div> | ||||
|         </template> | ||||
|       </ai-title> | ||||
|     </template> | ||||
|     <template #content> | ||||
|       <div class="detail-content__wrapper"> | ||||
|         <div class="detail-content__wrapper--left"> | ||||
|           <ai-card title="基础信息"> | ||||
|             <template #content> | ||||
|               <ai-wrapper> | ||||
|                 <ai-info-item label="上报人员" :value="detail.name"></ai-info-item> | ||||
|                 <ai-info-item label="当前状态" :value="dict.getLabel('clapEventStatus', detail.eventStatus)"></ai-info-item> | ||||
|                 <ai-info-item label="联系方式">{{ detail.phone }}</ai-info-item> | ||||
|                 <ai-info-item label="上报时间">{{ detail.createTime }}</ai-info-item> | ||||
|                 <ai-info-item label="事件类型">{{ detail.groupName }}</ai-info-item> | ||||
|                 <ai-info-item label="事件描述" isLine>{{ detail.content }}</ai-info-item> | ||||
|                 <ai-info-item label="现场照片" isLine> | ||||
|                   <ai-uploader :instance="instance" disabled v-model="detail.files"></ai-uploader> | ||||
|                 </ai-info-item> | ||||
|                 <ai-info-item label="所属网格">{{ detail.girdName }}</ai-info-item> | ||||
|                 <ai-info-item label="事件位置" isLine> | ||||
|                   <div id="map" style="width: 500px; height: 280px;"></div> | ||||
|                 </ai-info-item> | ||||
|               </ai-wrapper> | ||||
|             </template> | ||||
|           </ai-card> | ||||
|           <ai-evaluation v-if="!!detail.id" :bid="detail.id" :info.sync="evaluation"/> | ||||
|         </div> | ||||
|         <div class="rightZone"> | ||||
|           <ai-card title="办理进度"> | ||||
|             <template #content> | ||||
|               <el-steps direction="vertical" :active="1"> | ||||
|                 <el-step | ||||
|                     v-for="(item, i) in process" | ||||
|                     :key="i" | ||||
|                     :title="item.systemExplain" | ||||
|                     :description="item.doTime"> | ||||
|                   <template #title> | ||||
|                     <h2 class="step-title" style="font-weight: 500; font-size: 14px;"> | ||||
|                       {{ item.systemExplain }} | ||||
|                     </h2> | ||||
|                   </template> | ||||
|                   <template #description> | ||||
|                     <p style="color: #888; margin: 0 4px 10px 0; font-size: 14px;">{{ item.doTime }}</p> | ||||
|                     <div style="color: #444;margin-bottom: 10px;" v-if="item.doExplain">{{ item.doExplain }}</div> | ||||
|                     <ai-uploader :instance="instance" disabled v-model="item.files"></ai-uploader> | ||||
|                   </template> | ||||
|                 </el-step> | ||||
|               </el-steps> | ||||
|             </template> | ||||
|           </ai-card> | ||||
|         </div> | ||||
|       </div> | ||||
|       <ai-dialog | ||||
|           :visible.sync="isShowAdd" | ||||
|           width="800px" | ||||
|           title="事件处理" | ||||
|           @closed="onClose" | ||||
|           @onConfirm="handleEvent"> | ||||
|         <el-form class="ai-form" label-width="120px" :model="form" ref="form"> | ||||
|           <el-form-item label="事件分类" prop="groupId" style="width: 100%;" :rules="[{ required: true, message: '请选择事件分类' }]"> | ||||
|             <ai-select | ||||
|                 v-model="form.groupId" | ||||
|                 placeholder="请选择事件分类" | ||||
|                 :selectList="dictList"> | ||||
|             </ai-select> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="处理结果" prop="eventStatus" style="width: 100%;" :rules="[{ required: true, message: '请选择处理结果' }]"> | ||||
|             <el-radio-group v-model="form.eventStatus"> | ||||
|               <el-radio label="2">已办结</el-radio> | ||||
|               <el-radio label="3">已拒绝</el-radio> | ||||
|             </el-radio-group> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="处理意见" prop="content" style="width: 100%;" :rules="[{ required: true, message: '请输入处理意见' }]"> | ||||
|             <el-input type="textarea" :rows="5" :maxlength="500" v-model="form.content" clearable placeholder="请输入处理意见" show-word-limit></el-input> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="图片" prop="files" style="width: 100%;"> | ||||
|             <ai-uploader | ||||
|                 :instance="instance" | ||||
|                 isShowTip | ||||
|                 v-model="form.files" | ||||
|                 :limit="9"> | ||||
|             </ai-uploader> | ||||
|           </el-form-item> | ||||
|         </el-form> | ||||
|       </ai-dialog> | ||||
|       <ai-dialog | ||||
|           :visible.sync="isShowForward" | ||||
|           width="800px" | ||||
|           @close="onClose" | ||||
|           title="事件指派" | ||||
|           @onConfirm="onForwardConfirm"> | ||||
|         <el-form class="ai-form" label-width="120px" :model="forwardForm" ref="forwardForm"> | ||||
|           <el-form-item label="转交" prop="name" style="width: 100%;" :rules="[{ required: true, message: '请选择网格员或网格' }]"> | ||||
|             <el-input disabled size="small" v-model="forwardForm.name" clearable placeholder="请选择网格员或网格"> | ||||
|               <template slot="append"> | ||||
|                 <el-button @click="getGirdList().then(()=>isShowUser=true )">选择</el-button> | ||||
|               </template> | ||||
|             </el-input> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="办理意见" prop="content" style="width: 100%;" :rules="[{ required: true, message: '请输入办理意见' }]"> | ||||
|             <el-input type="textarea" :rows="5" :maxlength="500" v-model="forwardForm.content" clearable placeholder="请输入办理意见" show-word-limit></el-input> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="图片" prop="files" style="width: 100%;"> | ||||
|             <ai-uploader | ||||
|                 :instance="instance" | ||||
|                 v-model="forwardForm.files" | ||||
|                 isShowTip | ||||
|                 :limit="9"> | ||||
|             </ai-uploader> | ||||
|           </el-form-item> | ||||
|         </el-form> | ||||
|       </ai-dialog> | ||||
|       <ai-dialog | ||||
|           :visible.sync="isShowUser" | ||||
|           width="800px" | ||||
|           title="选择网格或网格员" | ||||
|           @onConfirm="onConfirm"> | ||||
|         <div class="grid-wrapper"> | ||||
|           <el-input | ||||
|               style="margin-bottom: 10px;" | ||||
|               size="small" | ||||
|               placeholder="请输入网格名称/网格员姓名/网格员电话" | ||||
|               v-model="name" @change="$refs.tree.filter(name)" | ||||
|               suffix-icon="iconfont iconSearch"> | ||||
|           </el-input> | ||||
|           <el-tree | ||||
|               :filter-node-method="filterNode" | ||||
|               ref="tree" | ||||
|               :props="defaultProps" | ||||
|               node-key="id" | ||||
|               :data="tree" | ||||
|               highlight-current | ||||
|               @current-change="onTreeChange"> | ||||
|             <div class="tree-container" slot-scope="{ data }"> | ||||
|               <div class="tree-container__user"> | ||||
|                 <div class="tree-user__item"> | ||||
|                   <span>{{ data.isUser ? `${data.name}-${data.phone}` : data.girdName }}</span> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|           </el-tree> | ||||
|         </div> | ||||
|       </ai-dialog> | ||||
|     </template> | ||||
|   </ai-detail> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import AMapLoader from '@amap/amap-jsapi-loader' | ||||
| import {mapState} from 'vuex' | ||||
|  | ||||
| export default { | ||||
|   name: 'Detail', | ||||
|   props: ['dict', 'instance'], | ||||
|  | ||||
|   data() { | ||||
|     return { | ||||
|       forwardForm: { | ||||
|         content: '', | ||||
|         girdId: '', | ||||
|         girdName: '', | ||||
|         girdMemberId: '', | ||||
|         girdMemberName: '', | ||||
|         name: '' | ||||
|       }, | ||||
|       isLoading: true, | ||||
|       name: '', | ||||
|       detail: {}, | ||||
|       isShowUser: false, | ||||
|       eventList: [], | ||||
|       isShowAdd: false, | ||||
|       userList: [], | ||||
|       processList: [], | ||||
|       dictList: [], | ||||
|       defaultProps: { | ||||
|         label: 'girdName' | ||||
|       }, | ||||
|       isShowForward: false, | ||||
|       tree: [], | ||||
|       gridInfo: {}, | ||||
|       form: { | ||||
|         files: [], | ||||
|         groupId: '', | ||||
|         groupName: '', | ||||
|         content: [], | ||||
|         eventStatus: '2' | ||||
|       }, | ||||
|       evaluation: {} | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   computed: { | ||||
|     ...mapState(['user']), | ||||
|     process: v => [v.evaluation.id ? { | ||||
|       systemExplain: `${v.evaluation.createUserName}完成评价 (${v.evaluation.score}星评价)`, | ||||
|       doTime: v.evaluation.createTime, | ||||
|       doExplain: v.evaluation.rateText | ||||
|     } : null, v.processList].flat().filter(Boolean) | ||||
|   }, | ||||
|  | ||||
|   created() { | ||||
|     this.getDict() | ||||
|     this.dict.load('clapEventStatus').then(() => { | ||||
|       this.getDetail() | ||||
|     }) | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     getDetail() { | ||||
|       this.instance.post('/app/appclapeventinfo/queryDetailById', null, { | ||||
|         params: {id: this.$route.query.id} | ||||
|       }).then(res => { | ||||
|         if (res?.data) { | ||||
|           this.detail = res.data | ||||
|           this.processList = res.data.processList | ||||
|           this.form.groupId = res.data.groupId | ||||
|  | ||||
|           this.$nextTick(() => { | ||||
|             this.initMap() | ||||
|           }) | ||||
|           this.isLoading = false | ||||
|         } | ||||
|       }).catch(() => { | ||||
|         this.isLoading = false | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     getGirdList() { | ||||
|       return this.instance.post(`/app/appgirdinfo/listAllByTop`).then(res => { | ||||
|         if (res?.data) { | ||||
|           return this.tree = this.formatList([res.data]) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     onClose() { | ||||
|       this.form.files = [] | ||||
|       this.form.groupId = '' | ||||
|       this.form.groupName = '' | ||||
|       this.form.content = '' | ||||
|       this.form.eventStatus = '' | ||||
|       this.forwardForm.content = '' | ||||
|       this.forwardForm.girdId = '' | ||||
|       this.forwardForm.girdName = '' | ||||
|       this.forwardForm.girdMemberId = '' | ||||
|       this.forwardForm.girdMemberName = '' | ||||
|       this.forwardForm.name = '' | ||||
|     }, | ||||
|  | ||||
|     formatList(list) { | ||||
|       for (let item of list) { | ||||
|         item.children = [item.girdList, item.girdMemberList?.map(e => ({ | ||||
|           ...e, isUser: true, girdName: item.girdName, | ||||
|           girdId: item.id | ||||
|         })) || []].flat() | ||||
|         if (item.girdList?.length > 0) { | ||||
|           this.formatList(item.girdList) | ||||
|         } | ||||
|       } | ||||
|       return list | ||||
|     }, | ||||
|  | ||||
|     filterNode(value, data = {}) { | ||||
|       if (!value) return true | ||||
|       return ["girdName", "name", "phone"].some(e => data[e]?.includes(value)) | ||||
|     }, | ||||
|  | ||||
|     onTreeChange(e) { | ||||
|       this.gridInfo = e | ||||
|     }, | ||||
|  | ||||
|     onForwardConfirm() { | ||||
|       this.$refs.forwardForm.validate(v => { | ||||
|         if (v) { | ||||
|           this.instance.post('/app/appclapeventinfo/transferByManager', { | ||||
|             ...this.forwardForm, | ||||
|             id: this.$route.query.id | ||||
|           }).then(res => { | ||||
|             if (res?.code == 0) { | ||||
|               this.isShowForward = false | ||||
|               this.getDetail() | ||||
|               this.$message.success('转交成功!') | ||||
|             } | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     onConfirm() { | ||||
|       if (this.gridInfo.userId) { | ||||
|         this.forwardForm.girdId = this.gridInfo.girdId | ||||
|         this.forwardForm.girdName = this.gridInfo.girdName | ||||
|         this.forwardForm.girdMemberId = this.gridInfo.id | ||||
|         this.forwardForm.girdMemberName = this.gridInfo.name | ||||
|       } else { | ||||
|         this.forwardForm.girdId = this.gridInfo.id | ||||
|       } | ||||
|       this.forwardForm.girdName = this.gridInfo.girdName | ||||
|       this.forwardForm.name = `${this.gridInfo.girdName}${this.gridInfo.name ? '-' + this.gridInfo.name : ''}` | ||||
|       this.isShowUser = false | ||||
|     }, | ||||
|     getDict() { | ||||
|       this.instance.post(`/app/appclapeventgroup/list?current=1&size=100000`).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           this.dictList = res.data.records.map(v => { | ||||
|             return { | ||||
|               dictValue: v.id, | ||||
|               dictName: v.groupName | ||||
|             } | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     close() { | ||||
|       this.$confirm('确定关闭该事件?').then(() => { | ||||
|         this.instance.post(`/app/appmininotice/delete?ids=${this.$route.query.id}`).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             this.$message.success('删除成功!') | ||||
|             this.getList() | ||||
|           } | ||||
|         }) | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     cancel(isRefresh) { | ||||
|       this.$emit('change', { | ||||
|         type: 'list', | ||||
|         isRefresh: !!isRefresh | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     onChange(e) { | ||||
|       this.instance.post(`/app/appvillagerintegralrule/list?size=1000&classification=${e}&ruleStatus=1`).then(res => { | ||||
|         if (res.code === 0) { | ||||
|           this.form.ruleId = '' | ||||
|           this.eventList = res.data.records | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     initMap() { | ||||
|       let {lng, lat} = this.detail | ||||
|       let center = [lng, lat] | ||||
|       AMapLoader.load({ | ||||
|         key: 'b553334ba34f7ac3cd09df9bc8b539dc', | ||||
|         version: '2.0' | ||||
|       }).then(AMap => { | ||||
|         let map = new AMap.Map('map', { | ||||
|           center, | ||||
|           zoom: 14 | ||||
|         }) | ||||
|         let marker = new AMap.Marker({ | ||||
|           position: new AMap.LngLat(lng, lat), | ||||
|           title: this.detail.address | ||||
|         }) | ||||
|         map.add(marker) | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     handleEvent() { | ||||
|       this.$refs.form.validate(v => { | ||||
|         if (v) { | ||||
|           this.instance.post('/app/appclapeventinfo/finishByManager', { | ||||
|             ...this.form, | ||||
|             groupName: this.dictList.filter(v => v.dictValue === this.form.groupId)[0].dictName, | ||||
|             id: this.$route.query.id | ||||
|           }).then(res => { | ||||
|             if (res?.code == 0) { | ||||
|               this.isShowAdd = false | ||||
|               this.getDetail() | ||||
|               this.$message.success('处理成功!') | ||||
|             } | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .reportAtWillDetail { | ||||
|   height: 100%; | ||||
|  | ||||
|   .grid-wrapper { | ||||
|     min-height: 360px; | ||||
|   } | ||||
|  | ||||
|   .title-btns { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|   } | ||||
|  | ||||
|   :deep( .el-tree ) { | ||||
|     background: transparent; | ||||
|  | ||||
|     .el-tree-node__expand-icon.is-leaf { | ||||
|       color: transparent !important; | ||||
|     } | ||||
|  | ||||
|     .el-tree-node__content > .el-tree-node__expand-icon { | ||||
|       padding: 4px; | ||||
|     } | ||||
|  | ||||
|     .el-tree-node__content { | ||||
|       height: 32px; | ||||
|     } | ||||
|  | ||||
|     .el-tree__empty-text { | ||||
|       color: #222; | ||||
|       font-size: 14px; | ||||
|     } | ||||
|  | ||||
|     .el-tree-node__children .el-tree-node__content { | ||||
|       height: 32px; | ||||
|     } | ||||
|  | ||||
|     .el-tree-node__content:hover { | ||||
|       background: #E8EFFF; | ||||
|       color: #222222; | ||||
|       border-radius: 2px; | ||||
|     } | ||||
|  | ||||
|     .is-current > .el-tree-node__content { | ||||
|       &:hover { | ||||
|         background: #2266FF; | ||||
|         color: #fff; | ||||
|       } | ||||
|  | ||||
|       background: #2266FF; | ||||
|  | ||||
|       span { | ||||
|         color: #fff; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .el-steps { | ||||
|     :deep( .el-step__icon ) { | ||||
|       font-size: 12px; | ||||
|       color: #555555; | ||||
|       border-color: #d0d4dc; | ||||
|     } | ||||
|  | ||||
|     :deep( .el-step__head.is-finish ) { | ||||
|       .el-step__icon.is-text { | ||||
|         border: none; | ||||
|         color: #fff; | ||||
|         font-size: 12px; | ||||
|         background: #2266ff; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     :deep( .el-step__line ) { | ||||
|       background-color: #d0d4dc; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .imgs { | ||||
|     font-size: 0; | ||||
|  | ||||
|     img { | ||||
|       width: 108px; | ||||
|       height: 108px; | ||||
|       margin-right: 4px; | ||||
|       margin-bottom: 4px; | ||||
|       cursor: pointer; | ||||
|       user-select: none; | ||||
|  | ||||
|       &:hover { | ||||
|         opacity: 0.8; | ||||
|       } | ||||
|  | ||||
|       &:nth-of-type(2n) { | ||||
|         margin-right: 0; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep( .report-dialog ) { | ||||
|     .el-select { | ||||
|       width: 100%; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep( .el-step__head.is-process ) { | ||||
|     color: #555; | ||||
|     border-color: #555; | ||||
|   } | ||||
|  | ||||
|   :deep( .is-finish h2 ) { | ||||
|     color: #2266ff; | ||||
|   } | ||||
|  | ||||
|   .step-title { | ||||
|     color: #555; | ||||
|   } | ||||
|  | ||||
|   .detail-content__wrapper { | ||||
|     display: flex; | ||||
|     width: 100%; | ||||
|     flex-wrap: wrap; | ||||
|  | ||||
|     .detail-content__wrapper--left { | ||||
|       flex: 1; | ||||
|       margin-right: 20px; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep( .ai-detail__content ) { | ||||
|     background: #f3f6f9; | ||||
|  | ||||
|     .ai-detail__content--wrapper { | ||||
|       display: flex; | ||||
|       gap: 16px; | ||||
|       width: 100%; | ||||
|       max-width: 100%; | ||||
|       padding: 16px; | ||||
|       box-sizing: border-box; | ||||
|  | ||||
|       & > .el-card { | ||||
|         flex: 1; | ||||
|         min-width: 0; | ||||
|       } | ||||
|  | ||||
|       .rightZone { | ||||
|         width: 400px; | ||||
|         flex-shrink: 0; | ||||
|         display: flex; | ||||
|         flex-direction: column; | ||||
|         gap: 16px; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   :deep( .el-card ) { | ||||
|     .el-card__header { | ||||
|       padding: 12px 16px; | ||||
|       font-weight: bold; | ||||
|     } | ||||
|  | ||||
|     .el-card__body { | ||||
|       padding: 8px; | ||||
|     } | ||||
|  | ||||
|     #amap { | ||||
|       width: 466px; | ||||
|       height: 232px; | ||||
|     } | ||||
|  | ||||
|     .el-steps { | ||||
|       margin-left: 8px; | ||||
|     } | ||||
|  | ||||
|     .imgFormItem > .el-form-item__content { | ||||
|       display: flex; | ||||
|       gap: 16px; | ||||
|       flex-wrap: wrap; | ||||
|  | ||||
|       &:before { | ||||
|         content: none; | ||||
|       } | ||||
|  | ||||
|       .el-image__inner { | ||||
|         width: 82px; | ||||
|         height: 82px; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										150
									
								
								packages/conv/AppReportAiWill/components/List.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,150 @@ | ||||
| <template> | ||||
|   <ai-list> | ||||
|     <template #title> | ||||
|       <ai-title :title="menuName" isShowBottomBorder> | ||||
|         <el-button type="primary" slot="rightBtn" @click="toSetting">设置</el-button> | ||||
|       </ai-title> | ||||
|     </template> | ||||
|     <template #content> | ||||
|       <ai-search-bar> | ||||
|         <template #left> | ||||
|           <ai-select | ||||
|               v-model="search.eventStatus" | ||||
|               clearable | ||||
|               placeholder="处理状态" | ||||
|               :selectList="dict.getDict('clapEventStatus')" | ||||
|               @change="search.current = 1, getList()"> | ||||
|           </ai-select> | ||||
|         </template> | ||||
|         <template #right> | ||||
|           <el-input | ||||
|               v-model="search.content" | ||||
|               class="search-input" | ||||
|               size="small" | ||||
|               v-throttle="() => {search.current = 1, getList()}" | ||||
|               placeholder="请输入内容描述/上报居民/联系方式" | ||||
|               clearable | ||||
|               @change="getList" | ||||
|               @clear="search.current = 1, search.content = '', getList()" | ||||
|               suffix-icon="iconfont iconSearch"> | ||||
|           </el-input> | ||||
|         </template> | ||||
|       </ai-search-bar> | ||||
|       <ai-table :tableData="tableData" :colConfigs="colConfigs" :total="total" :current.sync="search.current" :size.sync="search.size" @getList="getList"> | ||||
|         <el-table-column slot="options" label="操作" fixed="right" width="120" align="center"> | ||||
|           <div class="table-options" slot-scope="{row}"> | ||||
|             <el-button type="text" title="详情" @click="toDetail(row.id)">详情</el-button> | ||||
|             <el-button type="text" title="删除" @click="handleDelete(row.id)">删除</el-button> | ||||
|           </div> | ||||
|         </el-table-column> | ||||
|       </ai-table> | ||||
|     </template> | ||||
|   </ai-list> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import {mapState} from 'vuex' | ||||
|  | ||||
| export default { | ||||
|   name: 'List', | ||||
|   label: "随手拍", | ||||
|  | ||||
|   props: { | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|     menuName: String | ||||
|   }, | ||||
|  | ||||
|   data() { | ||||
|     return { | ||||
|       userList: [], | ||||
|       search: { | ||||
|         current: 1, | ||||
|         size: 10, | ||||
|         eventStatus: '', | ||||
|         content: '' | ||||
|       }, | ||||
|       total: 0, | ||||
|       tableData: [], | ||||
|       content: '', | ||||
|       id: '' | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   computed: { | ||||
|     ...mapState(['user']), | ||||
|  | ||||
|     colConfigs() { | ||||
|       return [ | ||||
|         {prop: 'content', label: '内容描述', width: '300px'}, | ||||
|         {prop: 'groupName', label: '事件类型', align: 'center'}, | ||||
|         {prop: 'girdName', label: '所属网格', align: 'center'}, | ||||
|         {prop: 'createTime', label: '上报时间', align: 'center'}, | ||||
|         {prop: 'name', label: '上报居民', align: 'center'}, | ||||
|         {prop: 'phone', label: '联系方式', align: 'center'}, | ||||
|         {prop: 'eventStatus', label: '处理状态', align: 'center', format: v => this.dict.getLabel('clapEventStatus', v)}, | ||||
|         {prop: 'processTime', label: '处理时长', align: 'center'}, | ||||
|         {slot: 'options'} | ||||
|       ] | ||||
|     }, | ||||
|  | ||||
|     handleStatusOps() { | ||||
|       return this.dict.getDict("reportAtWillHandleStatus").map(e => ({label: e.dictName, value: e.dictValue})) | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   created() { | ||||
|     this.dict.load('clapEventStatus').then(() => { | ||||
|       this.getList() | ||||
|     }) | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     getList() { | ||||
|       this.instance.post(`/app/appclapeventinfo/list`, null, { | ||||
|         params: { | ||||
|           ...this.search | ||||
|         } | ||||
|       }).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           this.tableData = res.data.records | ||||
|           this.total = res.data.total | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     toDetail(id) { | ||||
|       this.$emit('change', { | ||||
|         type: 'Detail', | ||||
|         params: { | ||||
|           id: id || '' | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     toSetting() { | ||||
|       this.$emit('change', { | ||||
|         type: 'Setting', | ||||
|         params: { | ||||
|           id: '' | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     handleDelete(ids) { | ||||
|       this.$confirm("是否要进行删除?").then(() => { | ||||
|         this.instance.post("/app/appclapeventinfo/delete", null, { | ||||
|           params: {ids} | ||||
|         }).then(res => { | ||||
|           if (res?.code == 0) { | ||||
|             this.$message.success("删除成功!") | ||||
|             this.getList() | ||||
|           } | ||||
|         }) | ||||
|       }).catch(() => 0) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| </style> | ||||
							
								
								
									
										178
									
								
								packages/conv/AppReportAiWill/components/Setting.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,178 @@ | ||||
| <template> | ||||
|   <ai-list class="notice"> | ||||
|     <template slot="title"> | ||||
|       <ai-title  isShowBack isShowBottomBorder title="事件类型" @onBackClick="cancel(false)"></ai-title> | ||||
|     </template> | ||||
|     <template slot="content"> | ||||
|       <ai-search-bar class="search-bar"> | ||||
|         <template #left> | ||||
|           <el-button size="small" type="primary" icon="iconfont iconAdd" @click="isShowAdd = true">添加事件类型</el-button> | ||||
|         </template> | ||||
|         <template slot="right"> | ||||
|           <el-input | ||||
|             v-model="search.groupName" | ||||
|             class="search-input" | ||||
|             size="small" | ||||
|             v-throttle="() => {search.current = 1, getList()}" | ||||
|             placeholder="请输入事件类型名称" | ||||
|             clearable | ||||
|             @change="getList" | ||||
|             @clear="search.current = 1, search.groupName = '', getList()" | ||||
|             suffix-icon="iconfont iconSearch"> | ||||
|           </el-input> | ||||
|         </template> | ||||
|       </ai-search-bar> | ||||
|       <ai-table | ||||
|         :tableData="tableData" | ||||
|         :col-configs="colConfigs" | ||||
|         :total="total" | ||||
|         style="margin-top: 6px;" | ||||
|         :current.sync="search.current" | ||||
|         :size.sync="search.size" | ||||
|         @getList="getList"> | ||||
|         <el-table-column slot="tags" label="标签"> | ||||
|           <template slot-scope="{ row }"> | ||||
|             <div class="table-tags"> | ||||
|               <el-tag type="info" v-for="(item, index) in row.tags" size="small" :key="index">{{ item }}</el-tag> | ||||
|             </div> | ||||
|           </template> | ||||
|         </el-table-column> | ||||
|         <el-table-column slot="options" width="120px" fixed="right" label="操作" align="center"> | ||||
|           <div class="table-options" slot-scope="{ row }"> | ||||
|             <el-button type="text" @click="edit(row)">编辑</el-button> | ||||
|             <el-button type="text" @click="remove(row.id)">删除</el-button> | ||||
|           </div> | ||||
|         </el-table-column> | ||||
|       </ai-table> | ||||
|       <ai-dialog | ||||
|         :visible.sync="isShowAdd" | ||||
|         width="780px" | ||||
|         height="580px" | ||||
|         :title="id ? '编辑事件类型' : '添加事件类型'" | ||||
|         @close="onClose" | ||||
|         @onConfirm="onConfirm"> | ||||
|         <el-form ref="form" class="ai-form" :model="form" label-width="110px" label-position="right"> | ||||
|           <el-form-item label="事件类型" prop="groupName" style="width: 100%;" :rules="[{ required: true, message: '请输入事件类型名称', trigger: 'blur' }]"> | ||||
|             <el-input size="small" :maxlength="10" show-word-limit placeholder="请输入事件类型名称" v-model="form.groupName"></el-input> | ||||
|           </el-form-item> | ||||
|           <el-form-item label="排序" prop="showIndex" style="width: 100%;" :rules="[{ required: true, message: '请输入排序', trigger: 'blur' }]"> | ||||
|             <el-input-number size="small" v-model="form.showIndex" :min="1" :max="100" label="请输入排序"></el-input-number> | ||||
|           </el-form-item> | ||||
|         </el-form> | ||||
|       </ai-dialog> | ||||
|     </template> | ||||
|   </ai-list> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   import { mapState } from 'vuex' | ||||
|   export default { | ||||
|     name: 'List', | ||||
|  | ||||
|     props: { | ||||
|       instance: Function, | ||||
|       dict: Object | ||||
|     }, | ||||
|  | ||||
|     data() { | ||||
|       return { | ||||
|         search: { | ||||
|           current: 1, | ||||
|           size: 10, | ||||
|           groupName: '' | ||||
|         }, | ||||
|         form: { | ||||
|           groupName: '', | ||||
|           showIndex: '' | ||||
|         }, | ||||
|         id: '', | ||||
|         isShowAdd: false, | ||||
|         total: 0, | ||||
|         colConfigs: [ | ||||
|           {prop: 'groupName', label: '事件类型', align: 'left'}, | ||||
|           {prop: 'showIndex', label: '排序', align: 'center'}, | ||||
|           {slot: 'options', label: '操作'} | ||||
|         ], | ||||
|         tableData: [] | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     computed: { | ||||
|       ...mapState(['user']) | ||||
|     }, | ||||
|  | ||||
|     mounted() { | ||||
|       this.getList() | ||||
|     }, | ||||
|  | ||||
|     methods: { | ||||
|       getList() { | ||||
|         this.instance.post(`/app/appclapeventgroup/list`, null, { | ||||
|           params: { | ||||
|             ...this.search | ||||
|           } | ||||
|         }).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             this.tableData = res.data.records | ||||
|             this.total = res.data.total | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       edit (e) { | ||||
|         this.id = e.id | ||||
|         this.form.groupName = e.groupName | ||||
|         this.form.showIndex = '' | ||||
|  | ||||
|         this.$nextTick(() => { | ||||
|           this.isShowAdd = true | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       onClose () { | ||||
|         this.id = '' | ||||
|         this.form.showIndex = '' | ||||
|         this.form.groupName = '' | ||||
|       }, | ||||
|  | ||||
|       onConfirm () { | ||||
|         this.$refs.form.validate((valid) => { | ||||
|           if (valid) { | ||||
|             this.instance.post(`/app/appclapeventgroup/addOrUpdate`, { | ||||
|               ...this.form, | ||||
|               id: this.id || null | ||||
|             }).then(res => { | ||||
|               if (res.code === 0) { | ||||
|                 this.$message.success('添加成功') | ||||
|                 this.isShowAdd = false | ||||
|  | ||||
|                 this.getList() | ||||
|               } | ||||
|             }) | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       cancel (isRefresh) { | ||||
|         this.$emit('change', { | ||||
|           type: 'list', | ||||
|           isRefresh: !!isRefresh | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       remove(id) { | ||||
|         this.$confirm('确定删除该数据?').then(() => { | ||||
|           this.instance.post(`/app/appclapeventgroup/delete?ids=${id}`).then(res => { | ||||
|             if (res.code == 0) { | ||||
|               this.$message.success('删除成功!') | ||||
|               this.getList() | ||||
|             } | ||||
|           }) | ||||
|         }) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| </style> | ||||
							
								
								
									
										105
									
								
								packages/conv/AppReturnHomeRegister/AppReturnHomeRegister.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,105 @@ | ||||
| <template> | ||||
|   <ai-list class="AppReturnHomeRegister" v-if="!isShowDetail"> | ||||
|     <template slot="title"> | ||||
|       <ai-title title="返乡登记" :isShowBottomBorder="false" :fullname.sync="areaName" v-model="areaId" :instance="instance" @change="onAreaChange"></ai-title> | ||||
|     </template> | ||||
|     <template slot="tabs"> | ||||
|       <el-tabs v-model="currIndex"> | ||||
|         <el-tab-pane v-for="(tab,i) in tabs" :key="i" :label="tab.label"> | ||||
|           <component :areaId="areaId" :ref="String(i)" v-if="currIndex == i" :is="tab.comp" @change="onChange" lazy :instance="instance" :dict="dict" :permissions="permissions"/> | ||||
|         </el-tab-pane> | ||||
|       </el-tabs> | ||||
|     </template> | ||||
|   </ai-list> | ||||
|   <Detail v-else-if="component === 'Detail'" :params="params" :instance="instance" :dict="dict" :permissions="permissions" @change="onChange"></Detail> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   import List from './components/List.vue' | ||||
|   import Detail from './components/Detail.vue' | ||||
|   import AbnormalList from './components/AbnormalList.vue' | ||||
|   import { mapState } from 'vuex' | ||||
|  | ||||
|   export default { | ||||
|     name: 'AppReturnHomeRegister', | ||||
|     label: '返乡登记', | ||||
|  | ||||
|     components: { | ||||
|       List, | ||||
|       Detail, | ||||
|       AbnormalList | ||||
|     }, | ||||
|  | ||||
|     props: { | ||||
|       instance: Function, | ||||
|       dict: Object, | ||||
|       permissions: Function | ||||
|     }, | ||||
|  | ||||
|     computed: { | ||||
|       ...mapState(['user']), | ||||
|  | ||||
|       tabs () { | ||||
|         const tabList = [ | ||||
|           {label: '返乡登记', name: 'List', comp: List, permission: ''}, | ||||
|           // {label: '历史异常人员', name: 'AbnormalList', comp: AbnormalList, permission: ''} | ||||
|         ] | ||||
|  | ||||
|         return tabList | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     data () { | ||||
|       return { | ||||
|         activeName: 'JoinEvent', | ||||
|         currIndex: '0', | ||||
|         component: 'List', | ||||
|         params: {}, | ||||
|         areaId: '', | ||||
|         isShowDetail: false, | ||||
|         areaName: '' | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     created () { | ||||
|       this.areaId = this.user.info.areaId | ||||
|     }, | ||||
|  | ||||
|     methods: { | ||||
|       onChange (data) { | ||||
|         if (data.type === 'Detail') { | ||||
|           this.component = 'Detail' | ||||
|           this.isShowDetail = true | ||||
|           this.params = data.params | ||||
|         } | ||||
|         if (data.type === 'AbnormalList') { | ||||
|           this.component = 'AbnormalList' | ||||
|           this.isShowDetail = false | ||||
|           this.params = data.params | ||||
|         } | ||||
|  | ||||
|         if (data.type === 'List') { | ||||
|           this.component = 'List' | ||||
|           this.isShowDetail = false | ||||
|           this.params = data.params | ||||
|  | ||||
|           this.$nextTick(() => { | ||||
|             if (data.isRefresh) { | ||||
|               this.$refs.component.getList() | ||||
|             } | ||||
|           }) | ||||
|         } | ||||
|       }, | ||||
|  | ||||
|       onAreaChange () { | ||||
|         this.$refs[this.currIndex][0].changeArea() | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
|   .AppReturnHomeRegister { | ||||
|     height: 100%; | ||||
|   } | ||||
| </style> | ||||
							
								
								
									
										200
									
								
								packages/conv/AppReturnHomeRegister/components/AbnormalList.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,200 @@ | ||||
| <template> | ||||
|   <ai-list isTabs> | ||||
|     <template slot="content"> | ||||
|       <ai-search-bar bottomBorder> | ||||
|         <template #left> | ||||
|           <ai-select | ||||
|             v-model="search.status" | ||||
|             clearable | ||||
|             placeholder="请选择健康状态" | ||||
|             :selectList="dictList" | ||||
|             @change="search.current = 1, getList()"> | ||||
|           </ai-select> | ||||
|           <ai-download :instance="instance" url="/app/appepidemicbackhomerecord/export" :params="param" fileName="返乡登记" :disabled="tableData.length == 0"> | ||||
|             <el-button icon="iconfont iconExported" :disabled="tableData.length == 0">导出</el-button> | ||||
|           </ai-download> | ||||
|         </template> | ||||
|         <template #right> | ||||
|           <el-input | ||||
|             v-model="search.name" | ||||
|             size="small" | ||||
|             placeholder="请输入姓名" | ||||
|             clearable | ||||
|             v-throttle="() => {search.current = 1, getList()}" | ||||
|             @clear="search.current = 1, search.name = '', getList()" | ||||
|             suffix-icon="iconfont iconSearch"> | ||||
|           </el-input> | ||||
|         </template> | ||||
|       </ai-search-bar> | ||||
|       <ai-table | ||||
|         :tableData="tableData" | ||||
|         :col-configs="colConfigs" | ||||
|         :total="total" | ||||
|         v-loading="loading" | ||||
|         style="margin-top: 16px;" | ||||
|         :current.sync="search.current" | ||||
|         :size.sync="search.size" | ||||
|         @getList="getList"> | ||||
|         <el-table-column slot="options" width="140px" fixed="right" label="操作" align="center"> | ||||
|           <template slot-scope="{ row }"> | ||||
|             <div class="table-options"> | ||||
|               <el-button type="text" @click="toDetail(row.id)">详情</el-button> | ||||
|               <el-button type="text" @click="remove(row.id)">删除</el-button> | ||||
|             </div> | ||||
|           </template> | ||||
|         </el-table-column> | ||||
|       </ai-table> | ||||
|     </template> | ||||
|   </ai-list> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   import { mapState } from 'vuex' | ||||
|   export default { | ||||
|     name: 'AbnormalList', | ||||
|  | ||||
|     props: { | ||||
|       instance: Function, | ||||
|       dict: Object | ||||
|     }, | ||||
|  | ||||
|     data () { | ||||
|       return { | ||||
|         search: { | ||||
|           current: 1, | ||||
|           size: 10, | ||||
|           name: '', | ||||
|           arriveAreaId: '', | ||||
|           status: '' | ||||
|         }, | ||||
|         dictList: [{ | ||||
|           dictName: '异常', | ||||
|           dictValue: '0' | ||||
|         }, { | ||||
|           dictName: '正常', | ||||
|           dictValue: '1' | ||||
|         }], | ||||
|         info: {}, | ||||
|         colConfigs: [ | ||||
|           { prop: 'name', label: '姓名' }, | ||||
|           { prop: 'phone', align: 'center', label: '手机号码' }, | ||||
|           { prop: 'startTime', align: 'center', label: '出发时间', format: v => v.substr(0, v.length - 3) }, | ||||
|           { | ||||
|             prop: 'startAreaName', | ||||
|             align: 'center', | ||||
|             label: '出发地区' | ||||
|           }, | ||||
|           { prop: 'arriveTime', align: 'center', label: '到达时间', format: v => v.substr(0, v.length - 3) }, | ||||
|           { | ||||
|             prop: 'arriveAreaName', | ||||
|             align: 'center', | ||||
|             label: '到达地区' | ||||
|           }, | ||||
|           { prop: 'checkTime', align: 'center', label: '核酸日期', format: v => v.split(' ')[0] }, | ||||
|           { | ||||
|             prop: 'status', | ||||
|             align: 'center', | ||||
|             label: '健康状态', | ||||
|             render: (h, {row}) => { | ||||
|               return h('span', { | ||||
|                 style: { | ||||
|                   color: row.status === '0' ? 'red' : '#333' | ||||
|                 } | ||||
|               }, row.status === '0' ? '异常' : '正常') | ||||
|             } | ||||
|           } | ||||
|         ], | ||||
|         ids: [], | ||||
|         tableData: [], | ||||
|         total: 0, | ||||
|         loading: false, | ||||
|         disabledLevel: 0 | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     computed: { | ||||
|       ...mapState(['user']), | ||||
|  | ||||
|       param () { | ||||
|         return this.search | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     created () { | ||||
|       this.disabledLevel = this.user.info.areaList.length - 1 | ||||
|       this.search.arriveAreaId = this.user.info.areaId | ||||
|       this.loading = true | ||||
|       this.dict.load(['marriageType', 'marriagePersonType', 'modeType']).then(() => { | ||||
|         this.getList() | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     methods: { | ||||
|       getList () { | ||||
|         this.instance.post(`/app/appepidemicbackhomerecord/list`, null, { | ||||
|           params: { | ||||
|             ...this.search | ||||
|           } | ||||
|         }).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             this.tableData = res.data.records | ||||
|             this.total = res.data.total | ||||
|             this.loading = false | ||||
|           } else { | ||||
|             this.loading = false | ||||
|           } | ||||
|         }).catch(() => { | ||||
|           this.loading = false | ||||
|         }) | ||||
|  | ||||
|         this.getTotalInfo() | ||||
|       }, | ||||
|  | ||||
|       toDetail (id) { | ||||
|         this.$emit('change', { | ||||
|           type: 'Detail', | ||||
|           params: { | ||||
|             id: id || '' | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       changeArea () { | ||||
|         this.search.current = 1 | ||||
|  | ||||
|         this.$nextTick(() => { | ||||
|           this.getList() | ||||
|           this.getTotalInfo() | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       remove(id) { | ||||
|         this.$confirm('确定删除该数据?').then(() => { | ||||
|           this.instance.post(`/app/appepidemicbackhomerecord/delete?ids=${id}`).then(res => { | ||||
|             if (res.code == 0) { | ||||
|               this.$message.success('删除成功!') | ||||
|               this.getTotalInfo() | ||||
|               this.getList() | ||||
|             } | ||||
|           }) | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|  | ||||
|       getTotalInfo () { | ||||
|         this.instance.post(`/app/appepidemicbackhomerecord/statistic`, null, { | ||||
|           params: { | ||||
|             areaId: this.search.arriveAreaId | ||||
|           } | ||||
|         }).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             this.info = res.data | ||||
|           } | ||||
|         }) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| <style scoped lang="scss"> | ||||
| </style> | ||||
							
								
								
									
										279
									
								
								packages/conv/AppReturnHomeRegister/components/Detail.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,279 @@ | ||||
|  <template> | ||||
|   <ai-detail isHasSidebar> | ||||
|     <template slot="title"> | ||||
|       <ai-title title="返乡登记详情" isShowBack isShowBottomBorder @onBackClick="cancel(false)"> | ||||
|       </ai-title> | ||||
|     </template> | ||||
|     <template slot="content"> | ||||
|       <AiSidebar :tabTitle="tabList" v-model="currIndex"></AiSidebar> | ||||
|       <div v-show="currIndex === 0"> | ||||
|         <ai-card title="基本信息" v-show="currIndex === 0"> | ||||
|           <template #content> | ||||
|             <ai-wrapper | ||||
|               label-width="120px"> | ||||
|               <ai-info-item label="姓名" :value="info.name"></ai-info-item> | ||||
|               <ai-info-item label="填报时间" :value="info.createTime"></ai-info-item> | ||||
|               <ai-info-item label="身份证号" :value="info.idNumber"></ai-info-item> | ||||
|               <ai-info-item label="手机号码" :value="info.phone"></ai-info-item> | ||||
|               <ai-info-item label="人员类别" isLine> | ||||
|                 <span :style="(info.type == 0 || info.type == 3 || info.type ==6 || info.type == 9)? 'color:#42D784;' : 'color:#f46;'">{{dict.getLabel('epidemicRecentPersonType', info.type)}}</span> | ||||
|               </ai-info-item> | ||||
|             </ai-wrapper> | ||||
|           </template> | ||||
|         </ai-card> | ||||
|         <ai-card title="行程信息"> | ||||
|           <template #content> | ||||
|             <ai-wrapper | ||||
|               label-width="120px"> | ||||
|               <ai-info-item label="出发时间" :value="info.startTime"></ai-info-item> | ||||
|               <ai-info-item label="出发地区" > | ||||
|                 <span  :style="{color: info.denger == 1 ? '#FF4466' : '#333'}">{{info.startAreaName}} </span> | ||||
|               </ai-info-item> | ||||
|               <ai-info-item label="出发地址" isLine :value="info.startAddress"></ai-info-item> | ||||
|               <ai-info-item label="出行方式" :value="dict.getLabel('epidemicRecentTravel', info.travelType)"></ai-info-item> | ||||
|               <ai-info-item label="行程描述" isLine :value="info.description"></ai-info-item> | ||||
|               <ai-info-item label="到达时间" :value="info.arriveTime"></ai-info-item> | ||||
|               <ai-info-item label="到达地区" :value="info.arriveAreaName"></ai-info-item> | ||||
|               <ai-info-item label="返乡地址" isLine :value="info.arriveAddress"></ai-info-item> | ||||
|             </ai-wrapper> | ||||
|           </template> | ||||
|         </ai-card> | ||||
|         <ai-card title="健康状况"> | ||||
|           <template #content> | ||||
|             <ai-wrapper | ||||
|               label-width="120px"> | ||||
|               <ai-info-item label="当前体温"> | ||||
|                 <span :style="info.temperature >= 37.3 ? 'color:#f46;' : ''">{{ info.temperature + '℃' }}</span> | ||||
|               </ai-info-item> | ||||
|               <ai-info-item label="14天内是否接触新冠确诊或疑似患者"> | ||||
|                 <span :class="'color-'+info.touchInFourteen">{{$dict.getLabel('epidemicTouchInFourteen', info.touchInFourteen)}}</span>  | ||||
|               </ai-info-item> | ||||
|               <ai-info-item label="当前健康状况">  | ||||
|                 <span></span> | ||||
|                 <span v-for="(item, index) in info.health" :key="index" :style="item != 0 ? 'color:#FF4466;' : ''"><span v-if="index>0">;</span>{{$dict.getLabel('epidemicRecentHealth', item)}}</span> | ||||
|               </ai-info-item> | ||||
|             </ai-wrapper> | ||||
|           </template> | ||||
|         </ai-card> | ||||
|         <ai-card title="核酸检测"> | ||||
|           <template #content> | ||||
|             <ai-wrapper | ||||
|               label-width="120px"> | ||||
|               <ai-info-item label="检测日期" :value="info.checkTime && info.checkTime.split(' ')[0]"></ai-info-item> | ||||
|               <ai-info-item label="检测结果"> | ||||
|                 <span :style="info.checkResult == 1 ? 'color:#f46;' : 'color:#42D784;'">{{$dict.getLabel('epidemicRecentTestResult', info.checkResult)}}</span> | ||||
|               </ai-info-item> | ||||
|               <ai-info-item label="本人健康码截图" isLine> | ||||
|                 <ai-uploader | ||||
|                   :instance="instance" | ||||
|                   v-model="info.checkPhoto" | ||||
|                   disabled | ||||
|                   :limit="9"> | ||||
|                 </ai-uploader> | ||||
|               </ai-info-item> | ||||
|             </ai-wrapper> | ||||
|           </template> | ||||
|         </ai-card> | ||||
|       </div> | ||||
|       <div v-show="currIndex === 1"> | ||||
|         <ai-card title="异常处理"> | ||||
|           <template #right> | ||||
|             <el-button type="primary" v-if="info.status === '0'" @click="release">解除异常</el-button> | ||||
|           </template> | ||||
|           <template #content> | ||||
|             <ai-wrapper | ||||
|               label-width="120px"> | ||||
|               <ai-info-item label="姓名" :value="info.name"></ai-info-item> | ||||
|               <ai-info-item label="填报时间" :value="info.createTime"></ai-info-item> | ||||
|               <ai-info-item label="身份证号" :value="info.idNumber"></ai-info-item> | ||||
|               <ai-info-item label="手机号码" :value="info.phone"></ai-info-item> | ||||
|               <ai-info-item label="人员类别" isLine :value="dict.getLabel('epidemicRecentPersonType', info.type)"></ai-info-item> | ||||
|               <ai-info-item label="异常状况" isLine> | ||||
|                 <span :style="{color: info.unusual ? 'red' : '#333'}">{{ info.unusual || '-' }}</span> | ||||
|               </ai-info-item> | ||||
|               <ai-info-item label="异常解除人" v-if="info.releaseName && info.status === '1'" :value="info.releaseName"></ai-info-item> | ||||
|               <ai-info-item label="异常解除时间" v-if="info.releaseTime && info.status === '1'" :value="info.releaseTime"></ai-info-item> | ||||
|             </ai-wrapper> | ||||
|           </template> | ||||
|         </ai-card> | ||||
|         <ai-card title="异常情况记录"> | ||||
|           <template #right> | ||||
|             <el-button type="primary" v-if="info.status === '0'" @click="isShow = true">添加记录</el-button> | ||||
|           </template> | ||||
|           <template #content> | ||||
|             <ai-table | ||||
|               :tableData="tableData" | ||||
|               :col-configs="colConfigs" | ||||
|               :total="total" | ||||
|               :current.sync="search.current" | ||||
|               :size.sync="search.size" | ||||
|               @getList="getList"> | ||||
|               <el-table-column slot="options" width="120px" fixed="right" label="操作" align="center"> | ||||
|                 <template slot-scope="{ row }"> | ||||
|                   <div class="table-options"> | ||||
|                     <el-button type="text" @click="remove(row.id)">删除</el-button> | ||||
|                   </div> | ||||
|                 </template> | ||||
|               </el-table-column> | ||||
|             </ai-table> | ||||
|           </template> | ||||
|         </ai-card> | ||||
|         <ai-dialog | ||||
|           :visible.sync="isShow" | ||||
|           width="800px" | ||||
|           @close="form.content = ''" | ||||
|           title="添加异常记录" | ||||
|           @onConfirm="onConfirm"> | ||||
|           <el-form class="ai-form" label-width="120px" :model="form" ref="form"> | ||||
|             <el-form-item label="异常记录" prop="content" style="width: 100%;" :rules="[{ required: true, message: '请输入异常记录' }]"> | ||||
|               <el-input type="textarea" :rows="5" :maxlength="500" v-model="form.content" clearable placeholder="请输入异常记录" show-word-limit></el-input> | ||||
|             </el-form-item> | ||||
|           </el-form> | ||||
|         </ai-dialog> | ||||
|       </div> | ||||
|     </template> | ||||
|   </ai-detail> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   export default { | ||||
|     name: 'Detail', | ||||
|  | ||||
|     props: { | ||||
|       instance: Function, | ||||
|       dict: Object, | ||||
|       params: Object | ||||
|     }, | ||||
|  | ||||
|     data () { | ||||
|       return { | ||||
|         total: 0, | ||||
|         info: {}, | ||||
|         id: '', | ||||
|         search: { | ||||
|           current: 1, | ||||
|           size: 10 | ||||
|         }, | ||||
|         form: { | ||||
|           content: '' | ||||
|         }, | ||||
|         isShow: false, | ||||
|         currIndex: 0, | ||||
|         tableData: [], | ||||
|         colConfigs: [ | ||||
|           {prop: 'content', label: '异常记录', align: 'center' }, | ||||
|           {prop: 'createTime', label: '创建时间', align: 'center'}, | ||||
|           {prop: 'createUserName', label: '记录人', align: 'center' } | ||||
|         ], | ||||
|         tabList: ['基本信息', '异常处理'] | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     created () { | ||||
|       if (this.params && this.params.id) { | ||||
|         this.id = this.params.id | ||||
|         this.$dict.load(['epidemicRecentHealth', 'epidemicRecentTravel', 'epidemicTouchInFourteen', 'epidemicRecentPersonType', 'epidemicRecentTestResult']).then(() => { | ||||
|           this.getInfo(this.params.id) | ||||
|         }) | ||||
|  | ||||
|         this.getList() | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     methods: { | ||||
|       getInfo (id) { | ||||
|         this.instance.post(`/app/appepidemicbackhomerecord/queryDetailById?id=${id}`).then(res => { | ||||
|           if (res.code === 0) { | ||||
|             this.info = res.data | ||||
|             this.info.checkPhoto = res.data.checkPhoto ? JSON.parse(res.data.checkPhoto) : [] | ||||
|             let healthName = '' | ||||
|             this.info.isHealth = false | ||||
|             res.data.health.split(',').forEach(v => { | ||||
|               if (v > 0) { | ||||
|                 this.info.isHealth = true | ||||
|               } | ||||
|               healthName = healthName + this.$dict.getLabel('epidemicRecentHealth', v) | ||||
|             }) | ||||
|             this.info.healthName = healthName | ||||
|             this.info.health = this.info.health.split(',') | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       release () { | ||||
|         this.$confirm('确定解除异常?').then(() => { | ||||
|           this.instance.post(`/app/appepidemicbackhomerecord/release?recordId=${this.params.id}`, { | ||||
|             id: this.params.id | ||||
|           }).then(res => { | ||||
|             if (res.code == 0) { | ||||
|               this.$message.success('解除异常成功!') | ||||
|               this.currIndex = 0 | ||||
|               this.getInfo(this.params.id) | ||||
|             } | ||||
|           }) | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       remove(id) { | ||||
|         this.$confirm('确定删除该数据?').then(() => { | ||||
|           this.instance.post(`/app/appepidemicunusuallog/delete?ids=${id}`).then(res => { | ||||
|             if (res.code == 0) { | ||||
|               this.$message.success('删除成功!') | ||||
|               this.getList() | ||||
|             } | ||||
|           }) | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       onConfirm() { | ||||
|         this.$refs.form.validate(v => { | ||||
|           if (v) { | ||||
|             this.instance.post('/app/appepidemicunusuallog/addOrUpdate', { | ||||
|               ...this.form, | ||||
|               recordId: this.params.id | ||||
|             }).then(res => { | ||||
|               if (res?.code == 0) { | ||||
|                 this.isShow = false | ||||
|                 this.getList() | ||||
|                 this.$message.success('添加成功!') | ||||
|               } | ||||
|             }) | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       getList () { | ||||
|         this.instance.post(`/app/appepidemicunusuallog/list`, null, { | ||||
|           params: { | ||||
|             ...this.search, | ||||
|             recordId: this.params.id | ||||
|           } | ||||
|         }).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             this.tableData = res.data.records | ||||
|             this.total = res.data.total | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       cancel () { | ||||
|         this.$emit('change', { | ||||
|           type: 'List', | ||||
|           isRefresh: true | ||||
|         }) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| <style scoped lang="scss"> | ||||
|   .color-0{ | ||||
|     color: #42D784; | ||||
|   } | ||||
|   .color-1{ | ||||
|     color: #f46; | ||||
|   } | ||||
|   .color-2{ | ||||
|     color: #1365DD; | ||||
|   } | ||||
| </style> | ||||