Compare commits
1171 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 65a852d380 | |||
| 0efd2a7db2 | |||
| 83c01575e6 | |||
| 5808145c01 | |||
| e1543e05b4 | |||
| d20b968307 | |||
| 7735d20021 | |||
| 831f017482 | |||
| 827978f7bd | |||
| b16893955d | |||
| 41830600bf | |||
| 76a5ebbeb9 | |||
| a26088a756 | |||
| 4229cb9d74 | |||
| a64715717b | |||
| f18ae8b1ee | |||
| 19c566cd0d | |||
| 3c459f4be2 | |||
| 1ad6e021a1 | |||
| 6cbc3f83e6 | |||
| 9560a964e7 | |||
| 94bd9930b6 | |||
| f2e80e4874 | |||
| 62e98b9e3f | |||
|
|
a620b248f4 | ||
|
|
e2e4d3226f | ||
|
|
af2788583f | ||
|
|
ba58089e94 | ||
|
|
88dcbf3196 | ||
| 9092b1e960 | |||
| 3ddd24cc70 | |||
| 1fb3345afe | |||
| d1fe0faad1 | |||
| 64d10a711d | |||
| 1d5e8a23ed | |||
| 2973bbe6a7 | |||
|
|
8974282b44 | ||
|
|
81705482a8 | ||
| 9cc8d337be | |||
| 973dc0f2e4 | |||
| db696ca389 | |||
| 64e2ff0647 | |||
| 53b0e4b240 | |||
| 17010a15a3 | |||
| f74743c00f | |||
| e14b6d676c | |||
| 3ecea87de8 | |||
| cb290acf09 | |||
| f6cabee345 | |||
| 8b03d62a75 | |||
| 1674d1acd0 | |||
| 41a455338f | |||
| 5b67f97021 | |||
| a451f7481e | |||
| 2400660b1f | |||
| 26e0009ebd | |||
| 34b0b88f07 | |||
| 37a3cd75a2 | |||
| 81d4002034 | |||
| 5c000cdba3 | |||
|
|
5dcdbe9ae1 | ||
|
|
4371ccb5e7 | ||
|
|
f9ef5c7087 | ||
|
|
bf2f28960f | ||
|
|
f42eacd06e | ||
| 861a6489c7 | |||
| 9133f7a7e3 | |||
| e9be87990c | |||
| ec8db3c199 | |||
| d2520336cb | |||
| e97db1a70d | |||
| afd27e38b5 | |||
| 7dd5120133 | |||
| 75da0633e5 | |||
| 41b498066f | |||
| c852448089 | |||
| 9cd744d44e | |||
| a7917137c9 | |||
| 85346fa343 | |||
| e5b205870d | |||
| 5ae66763e1 | |||
| 9221d27960 | |||
| c442b9b2fd | |||
| 25c94284ca | |||
| 5da74960f2 | |||
| cdcb76d009 | |||
| c87b5c57a6 | |||
| fd0d70072b | |||
| 747f675cfc | |||
| 941b06ab8b | |||
| 3e6f86abfd | |||
| 01ccc1ddcd | |||
| b6ac47e88b | |||
| 707486c69d | |||
| 2ef726b95b | |||
| 697af99240 | |||
| ee2f7a9162 | |||
| 476f6a794d | |||
| 0c53ee8392 | |||
| 4c1e892d35 | |||
| ac6d7863da | |||
| ea33ffb60a | |||
| a1ae39cbd7 | |||
| 0ada78f180 | |||
| 60e29aca8d | |||
| 3db2901a03 | |||
| 7428fe43d4 | |||
| 18592571a4 | |||
| 4bb03409f4 | |||
| 7fec9c5735 | |||
| 3d9f22d503 | |||
| 76c9a38718 | |||
| af7d0ac580 | |||
| 4888a7e077 | |||
| 47a2f61036 | |||
| f26e40df90 | |||
| 07103258f7 | |||
| 8fa0d72cc4 | |||
| 7684444e93 | |||
| 81446971e5 | |||
| 5930a2c4b6 | |||
| 052c0090e3 | |||
| d24892141a | |||
| 83dc28630b | |||
| 086fdb36e9 | |||
| ba4c4fccdd | |||
| bc79cfc0bc | |||
| 35d4d1b7ba | |||
| 71324efd0c | |||
| 781e7393e8 | |||
| 1eea7a377c | |||
| 065eb6cfba | |||
| 35a2f755a2 | |||
| 9bd9cda872 | |||
| dd6181880a | |||
| cd2bfe8817 | |||
| 8b6406c4e0 | |||
| fa3171fecd | |||
| 177ccee058 | |||
| 28de3667f5 | |||
| 05a5385d87 | |||
| 529f482bc7 | |||
| 20fb592584 | |||
| bd35243cbd | |||
| d7ca84a4a0 | |||
| 6c7eddcf94 | |||
| 3588257f61 | |||
| 6c47337318 | |||
| bacd397294 | |||
| b3dbb24bb2 | |||
| 9e194f5f04 | |||
| f448ec47a3 | |||
| f633862434 | |||
| a4674d497b | |||
| e8aee6f01c | |||
| 43e0f98509 | |||
| 10b66cbf15 | |||
| 560bea739c | |||
| 1ed6156117 | |||
| 4321b42003 | |||
| 7f0f74c844 | |||
| c1065cb084 | |||
| 579cadd687 | |||
| 78f4135efb | |||
| 1a120418f0 | |||
| d3ae1c1205 | |||
| e49b6ef1a3 | |||
| 6fbf37ab78 | |||
| a0d9c58c77 | |||
| b3900a2a1c | |||
| 4bb0c49dc8 | |||
| 4f6c36a20a | |||
| aada3d785b | |||
| fef4c57bd5 | |||
| 35b332f640 | |||
| 31da00d7e3 | |||
| 6afac9be28 | |||
| b54289a0a5 | |||
| dc064de364 | |||
| 7f656447b2 | |||
| 78bafe0a7e | |||
| ddf5159fbc | |||
| d0960f6ad6 | |||
| e7b982ef6c | |||
| b5ada3a1ac | |||
| 418effdb04 | |||
| 215f7c6bbf | |||
| 57a1d2700f | |||
| e4025b90e9 | |||
| e44380c000 | |||
| 70d94f3c1d | |||
| 14c6ed1168 | |||
| 05275aed15 | |||
| 47d5863361 | |||
| 9758981d3f | |||
| a946247849 | |||
| 7c2d713035 | |||
| f4330b60d5 | |||
| 1a38381ab8 | |||
| f61d50dbfc | |||
| f5b9339b36 | |||
| 66dc6df0d9 | |||
| a3c7439a7f | |||
| c7329f2f6d | |||
| 59699b6118 | |||
| 673e4fa20a | |||
| eb2a5581ca | |||
| ee5fc2cba3 | |||
| 952884a7fe | |||
| b7ca97696a | |||
| 6ba9fa4bee | |||
| baea68c52a | |||
| a2ed04e144 | |||
| 8a218ad270 | |||
| 287d6a3ad0 | |||
| 9813f8c585 | |||
| 673a26368a | |||
| 9b90dbc649 | |||
| 9adea1060c | |||
| 4f471494cc | |||
| 4e5a4bb4b9 | |||
| b4d6d97e27 | |||
| a5ebab16a6 | |||
| 6ad76d1571 | |||
| 0cc1b63ae7 | |||
| d76ef8ff9c | |||
| f105485714 | |||
| df99acd638 | |||
| af275ea6c4 | |||
| 68830daab3 | |||
| c27162f918 | |||
| f1b81d86a2 | |||
| 0c24d2cf51 | |||
| 710ccbdf65 | |||
| 7001261f01 | |||
| 7fcfc992fb | |||
| b7be0a34ae | |||
| a792df80e6 | |||
| b56e5b3544 | |||
| 5dccaa1ee7 | |||
| 6aa074bfa3 | |||
| 8aefca0c82 | |||
| e518791ddd | |||
| afda146103 | |||
| 11f7fa37aa | |||
| 35c2e1d9b4 | |||
| fe3a15fcbd | |||
| 9fd97f6ea2 | |||
| cccd14ec79 | |||
| 2ed2cae599 | |||
| 958399a32a | |||
| 745971087c | |||
| 8ea916c206 | |||
| e0aefecf50 | |||
| 10e9c9de19 | |||
| 950b32270b | |||
| b032903ed4 | |||
| 696921243e | |||
| 7200592f05 | |||
| 963b7b93e3 | |||
| 86751acbd6 | |||
| c17149235f | |||
| fda0f4fcde | |||
| 560485f255 | |||
| 2847c88c61 | |||
| 5611fd9f02 | |||
| 2827c5ace6 | |||
| 750a4c8178 | |||
| 9941fc14f6 | |||
| 8b94f044db | |||
| c71208c3e4 | |||
| b2fb3fbb67 | |||
| 7e6b48b62a | |||
| 4aa0b093bb | |||
| e77820e145 | |||
| 66d2c3c7cf | |||
| a1422067d0 | |||
| 7579b77b2d | |||
| c6390a8117 | |||
| e20f8cad7f | |||
| 5cf2e4d208 | |||
| 4f3a8550eb | |||
| ad6d7af1a3 | |||
| 65a4c72fd0 | |||
| 5ea25ae8ae | |||
| 810757e828 | |||
| e82c6e2316 | |||
| af593b08da | |||
| 2b14bd19a4 | |||
| da69cb4dba | |||
| cc1d0c8cf2 | |||
| f3d9ff44a3 | |||
| 375a678fc3 | |||
| a3cbf4d24b | |||
| d3b12bd64c | |||
| c213b3b41c | |||
| d0c677cfb4 | |||
| e9469439e8 | |||
| 62035606c9 | |||
| b101d70c75 | |||
| 382bad4cb3 | |||
| 8c5d08874f | |||
| 25d5b20b65 | |||
| 2f43919132 | |||
| 8f5b9fc637 | |||
| 7b619a9bef | |||
| f33543c540 | |||
| a9a2be2c74 | |||
| 3160e86710 | |||
| a307697028 | |||
| 062f9c7bee | |||
| e8a5b4e788 | |||
| da9624663e | |||
| 7b8cedcfb0 | |||
| d3c0b36657 | |||
| eabf9cb3d6 | |||
| b84c2ce131 | |||
| 348027f355 | |||
| 579f2777cf | |||
| ed22942ab2 | |||
| 119e3d8333 | |||
| 011566cb22 | |||
| bf34d8aa0c | |||
| 7f3fedc2f2 | |||
| 69aa6aa0fb | |||
| e54db551a6 | |||
| 6c91a0740a | |||
| f0fe6c8269 | |||
| 9174c09a6b | |||
| 4dc5ca40ee | |||
| 09705e634a | |||
| 1e29e6bdc4 | |||
| e49d8cfb5e | |||
| a3bb1a9156 | |||
| e9ced267ed | |||
| ef9a536b5c | |||
| a87be0e6e2 | |||
| 98d8ea4805 | |||
| 244f2e72b4 | |||
| f9aa6191ce | |||
| ebd7fa3851 | |||
| 2941847f54 | |||
| ca9e281119 | |||
| a1ed160445 | |||
| 9db0e8e9ec | |||
| fe09ced0bc | |||
| d73eb49461 | |||
| b890372fc5 | |||
| 53bab74ea9 | |||
|
|
023256630e | ||
|
|
f65663071a | ||
|
|
9a55494da7 | ||
|
|
d5a07e772f | ||
|
|
42499bcb22 | ||
|
|
0243d6fc56 | ||
|
|
6bdbde262f | ||
|
|
78435bbcac | ||
|
|
c3358acf73 | ||
|
|
3b1b822882 | ||
| f874cd75b7 | |||
| d9a5099436 | |||
| dd75bc6513 | |||
| d3506d841e | |||
| 263df9e489 | |||
| 65b76da880 | |||
| 50973efb0a | |||
| 8256c80648 | |||
| d0dc8ba9f8 | |||
| 97e9799b1a | |||
| e81b2bc42f | |||
| 9c297d92c9 | |||
| e2de62e54a | |||
| a3b1f96ab6 | |||
| d2c77b9cc2 | |||
| 61feb031aa | |||
| b06b4b88bb | |||
| 560fd3af3b | |||
| e5b5b26e24 | |||
| 19aa70a8ca | |||
| 06af12ca88 | |||
| 41b04e6fac | |||
| 96d912ff44 | |||
| 10f1afe23c | |||
| 0f2cb87f66 | |||
| e10978cadd | |||
| 7ce2d6edb7 | |||
| 5f8a29f2d6 | |||
| ccba937158 | |||
| efe27b8580 | |||
| 7a535c41e7 | |||
| edffc54453 | |||
| 1cf05c8653 | |||
| 7f4a3a274e | |||
| f5b3791762 | |||
| 6e5c7d172d | |||
| 4123a685b7 | |||
| 7e25e76683 | |||
| 2fe09971ab | |||
| dc099c9347 | |||
| 7e7aac5139 | |||
| 54e7a8f662 | |||
| 43785b7460 | |||
| eed18d0c17 | |||
| ad969d33bb | |||
| b41e39abbf | |||
| 981d65c759 | |||
| d7e36ee464 | |||
| 54eeefd5dd | |||
| 049091719a | |||
| df6f0083ea | |||
| a5486c1948 | |||
| 5f120bff1e | |||
| f6d5a97dfb | |||
| a6ace0a27d | |||
| 70a4899337 | |||
| b2eec2e1f3 | |||
| 5506ebee7a | |||
| a6fd326774 | |||
| 348edd66bd | |||
| d58579579d | |||
| 3139c78179 | |||
| 252a077dcd | |||
| 45aaaf5360 | |||
| 87d5677352 | |||
| 39c9408f34 | |||
| 193862f58b | |||
| 36624c5621 | |||
| 08da2601d8 | |||
| 24563fd7df | |||
| 4b4aed5600 | |||
| a175a6456a | |||
| 6de9896ead | |||
| 0bbe97c582 | |||
| 960d294870 | |||
| f3fbb8d76b | |||
| 60df95cc20 | |||
| 8a0f6c6f37 | |||
| 99be2b0501 | |||
| d8a1a661df | |||
| 942603c344 | |||
| 54772cbbb1 | |||
| f720c3cddb | |||
| a4e95e21b3 | |||
| 53b581e71c | |||
| 0a6803371b | |||
| 604a0fedb8 | |||
| 8f226e6fa3 | |||
| fb48952924 | |||
| 44eb378423 | |||
| 40ba004082 | |||
| 1a5dda5302 | |||
| 2b2e54957f | |||
| db2a062400 | |||
| cde8d9f0b4 | |||
| f36d7abca8 | |||
| 4f2bfb80ae | |||
| a560460cc1 | |||
| 7ee2f084db | |||
| b5d2dceda1 | |||
| 7d234e523b | |||
| 7c7984b08f | |||
| 68f9c787e9 | |||
| bf6779a008 | |||
| baecbac6c3 | |||
| ea625f98f3 | |||
| 065a232333 | |||
| 9b2baf43ef | |||
| 49596316f2 | |||
| 4c492a8866 | |||
| 203721e9e0 | |||
| 1a72339ade | |||
| bb84f72836 | |||
| 83a740de91 | |||
| fb0a0cd719 | |||
| 45b8b91152 | |||
| 2b36fd181f | |||
| 5c2ec69fd6 | |||
| ffe7d0bb6c | |||
| 94a46d01fe | |||
| 99d8bc156b | |||
| e78ae692ee | |||
| 80bf9ae9bd | |||
| 7be10381bd | |||
| 1fbd31f137 | |||
| 9d55426a2a | |||
| e0299baf46 | |||
| 39fedea1ca | |||
| ed8104ba92 | |||
| c5d7961b4d | |||
| ec9c4c526c | |||
| 0cb840a466 | |||
| b8aa24e6a0 | |||
| e3b17f0f04 | |||
| a1b249b86c | |||
| d12d4865c7 | |||
| a01cede9c0 | |||
| 318410ff74 | |||
| a8feed2d7f | |||
| fe0a6bb3be | |||
| 872c54abd3 | |||
| c2c1cfd6e1 | |||
| 41bd6d1686 | |||
| 779d6f7094 | |||
| 5c4f25dc1a | |||
| e65bf98db2 | |||
| c17396d44a | |||
| 344a3a03b3 | |||
| dc8fc056f9 | |||
| 9ff596c167 | |||
| a82030b04f | |||
| d316661574 | |||
| 3690235ae7 | |||
| 2a788fff0a | |||
| a3b93d0e1a | |||
| 3d6bdd50ca | |||
| 20b2203930 | |||
| d23a86e9ea | |||
| 6afc855cd8 | |||
| 44a50176cc | |||
| 069816e17f | |||
| 57ec7832f2 | |||
| dfdaabeb48 | |||
| f427fa9ef2 | |||
| bfc6845071 | |||
| ea9047ee2a | |||
| 87ab014111 | |||
| 1341f3749b | |||
| 30f3f3bdcd | |||
| f9d7b765d1 | |||
| fbb277cb30 | |||
| 145bb01fdd | |||
| 7601a7872c | |||
| f36c8ffcac | |||
| de0b64909d | |||
| 39af97815c | |||
| bcffdba692 | |||
| 2e9d015623 | |||
| 4654f71f11 | |||
| 9d63e05d03 | |||
| 6ea9538b0a | |||
| 88f4a93a81 | |||
| 9671d5a36d | |||
| f476dc9203 | |||
| 235ec0c4ff | |||
| f2ba567b93 | |||
| 525385cd17 | |||
| ee8df164d1 | |||
| df2d53b9da | |||
| 9b1d51273d | |||
| 0fc92b7742 | |||
| 1996ff0b3a | |||
| 735dedfb42 | |||
| 4ab7a04c92 | |||
| 8864e13030 | |||
| b3bfff9588 | |||
| c6d8b45537 | |||
| e7e1f33985 | |||
| 4f67329f6b | |||
| 4aff4667ef | |||
| 41fd5bef4d | |||
| 11e4b4ab3f | |||
| 509b7e35c9 | |||
| a7143c8c58 | |||
| f588695f3c | |||
| 26ba628cae | |||
| 7fbc2037d3 | |||
| 5c1a1d507a | |||
| ee2ddfca14 | |||
| c456c6f642 | |||
| 2c2055a11a | |||
| 502b4cff10 | |||
| c34fb88311 | |||
| 5949cdd843 | |||
| 22548f34c1 | |||
| c643aa0e1d | |||
| 9be3a714d1 | |||
| 478f9d2639 | |||
| 19c4f7469d | |||
| 9b50bcd0ee | |||
| 06f3fcefee | |||
| 62d18089c4 | |||
| 03a34bb637 | |||
| 9d144af68a | |||
| 00c346c7b1 | |||
| fcc67e542e | |||
|
|
f18dd60383 | ||
|
|
5019a88fd5 | ||
|
|
b573fafb8e | ||
| 1440ba821a | |||
| e0b564c56c | |||
| 158fbfd124 | |||
| 1a005f3b9e | |||
| f1cc13ae71 | |||
| 35ba4523e8 | |||
| c8731e0612 | |||
| 30f74720b4 | |||
| 9e9c4beb45 | |||
| 20798e0ce6 | |||
| 810479701c | |||
| b8392f199c | |||
| 9646a0110f | |||
| 11f887c93d | |||
| b539f4a6d7 | |||
| 216bc5034b | |||
| cefee8298a | |||
| 47633749fb | |||
| 4e325196c8 | |||
| 18c5386fdd | |||
| 242fb1ddee | |||
| 2546db9b64 | |||
| b28fbaf903 | |||
| 58ffb22bf6 | |||
| d7d825b5b0 | |||
| dc9f82f30e | |||
| 7077604a27 | |||
| ea38a6ddef | |||
| bba7a8e456 | |||
| 4a620c5d78 | |||
| c37e150bb9 | |||
| fe45524d52 | |||
| 5d21271316 | |||
| 9b78d4e52e | |||
| 349f514bcb | |||
| 85a910b794 | |||
| e4069c0de2 | |||
| 7b155f649d | |||
| ecc7b0ebc3 | |||
| c6a8a6fc70 | |||
| 4f594b0bfd | |||
| f1a02e9188 | |||
| f011a1e8fd | |||
| 090e9a1ea8 | |||
| fc8575dd0b | |||
| f162befa0d | |||
| 10bb9cbc37 | |||
| 52ca3791b3 | |||
| 2fe143b6c7 | |||
| bbf63ec51f | |||
| 222b9829b6 | |||
| ffaf17d6f9 | |||
| e9835df985 | |||
| 377e041eb2 | |||
| b3fe207469 | |||
| e527deabd5 | |||
| d644b0e3ca | |||
| 6800117ed4 | |||
| ae31f68586 | |||
| 4568101f06 | |||
| c67e5cf15e | |||
| 5bfa2a0243 | |||
| 68fa803016 | |||
| 457547a34e | |||
| adbfc42015 | |||
| 0c26f2245e | |||
| e4959cecd7 | |||
| 01029195fb | |||
| 68897bbabf | |||
| ed3462be87 | |||
| ac22684d69 | |||
| fa977c5134 | |||
| 21cc38ed73 | |||
| 662042a228 | |||
| 258e340752 | |||
| 96378e161f | |||
| 7e7197b9b8 | |||
| 2e3089e6b1 | |||
| b5a1c76fad | |||
| b7ebe7e3b9 | |||
| 3fb35e085c | |||
| f2b1cad505 | |||
| e2e4f47c60 | |||
| 87d4633b18 | |||
| 2fdbc144a6 | |||
| c43ea8be87 | |||
| e52efa0a45 | |||
| 3c6a8bedc2 | |||
| a0906ed5c7 | |||
| a9cfa60b36 | |||
| 09cef9de33 | |||
| c884333fc1 | |||
| 8274f9f186 | |||
| b90d3bc466 | |||
| e4094dcd73 | |||
| e99d217d34 | |||
| fc41bd8e6d | |||
| 5640978025 | |||
| cff3198dcd | |||
| d4d7601bae | |||
| 6018cd6838 | |||
| 1ce0bf708b | |||
| 060f6e0fd8 | |||
| 7e110dd656 | |||
| 4d5f163f17 | |||
| f4a1e3e932 | |||
| 195cc714ab | |||
| 43211d6f0c | |||
| d59c9d8cca | |||
| 8d731ff7c5 | |||
| 50504f4e94 | |||
| 37ee6af0e5 | |||
| 5362a47d1e | |||
| a1a3c0ac9f | |||
| f22e14b1ba | |||
| 5d44bae1c3 | |||
| 4d78debb92 | |||
| 93d69861bf | |||
| 936f5dbf4c | |||
| d4e7503306 | |||
| 81c24023e9 | |||
| d1a20fbad1 | |||
| 6e8f2328c6 | |||
| 83e780c17d | |||
| 251fdf7989 | |||
| 30d1664a9b | |||
| 2173cd1cf1 | |||
| 298d298dc5 | |||
| 9557e8595d | |||
| bc2c77ff34 | |||
| 99c93dd582 | |||
| 741187c129 | |||
| 8f9d5eb37b | |||
| f0e25b21d3 | |||
| 1541482e76 | |||
| ce2d39e3bf | |||
| d229f957e5 | |||
| 6d0a1940fc | |||
| b6b1c8a3ff | |||
| 4a52ab51df | |||
| 9ecabb8f69 | |||
| 09c51f13fc | |||
| a6ee226073 | |||
| 968eebaa2b | |||
| 7637608226 | |||
| db720f6d1b | |||
| 26ed532684 | |||
| 2e101d1017 | |||
| abda409817 | |||
| cb2fe73481 | |||
| c1bba811b9 | |||
| 1183be2987 | |||
| 11598c507b | |||
| 38b6299dbf | |||
| fa054d2a07 | |||
| 7541b37117 | |||
| cafba1e18c | |||
| 4755849a8c | |||
| f219635348 | |||
| ad6509f043 | |||
| 6cf0a0b0da | |||
| b2774892de | |||
| f7b0461218 | |||
| 42fc5524f3 | |||
| ea51e6a300 | |||
| 10cfe6e6ad | |||
| 1dd381cc1e | |||
| 1e02e00000 | |||
| c799c16663 | |||
| 27cb965f3a | |||
| e643d9ef86 | |||
| becce5dfab | |||
| 1da833f451 | |||
| 95a2161ab3 | |||
| 873458595d | |||
| a134dfd308 | |||
| 8fade135fe | |||
| 8408697b57 | |||
| 1bdb1e6739 | |||
| b497e2117d | |||
| 04d62635f8 | |||
| ef38b0c18f | |||
| 83af021d33 | |||
| 12d3fbcda1 | |||
| 2227ceabde | |||
| 3e3d738362 | |||
| bcb74bf29f | |||
| c4ad13b09c | |||
| 48430951ef | |||
| 443f598173 | |||
| 420605436c | |||
| a1fa0dab6a | |||
| 8b5a4aba6f | |||
| 09b1c86ceb | |||
| 3dbaf21281 | |||
| 474cf72333 | |||
| 433f0bc712 | |||
| e4d0b87069 | |||
| 8d87e2a7a0 | |||
| 4b56a92444 | |||
| 3289e799be | |||
| a7367bef2f | |||
| 87d3493c34 | |||
| 0250e3008b | |||
| cab7311cfb | |||
| 89603d1094 | |||
| 5cdec2b677 | |||
| 66746458ee | |||
|
|
892e9c01f1 | ||
| 203b0c9753 | |||
| d9d2d446f6 | |||
| bd37eb66a9 | |||
| 9ed6fc1b94 | |||
| 74fd0a8610 | |||
| 2244e96484 | |||
| f99422a8e0 | |||
| d27576ede2 | |||
| c16d86354b | |||
| d8a01ad3b1 | |||
| c61b06e8b2 | |||
| 88f12c7fce | |||
| 1b1e0a8174 | |||
| 33e6ad37b9 | |||
|
|
522eb5025c | ||
|
|
6aeb846ca4 | ||
|
|
f5d8a46829 | ||
| a7a146c055 | |||
| 94155d2ca6 | |||
| ab191e940b | |||
| 5f95f461a8 | |||
| 173b928412 | |||
| f0d19e535c | |||
| 63d8feb712 | |||
| ebccaaa12f | |||
| 147d66c756 | |||
| 04fff31b3a | |||
| 96529cccc6 | |||
| 848f167bb6 | |||
| ee869f3c34 | |||
|
|
21a111ae8f | ||
|
|
5f6f1a7912 | ||
| 5912f37ebb | |||
| 66bd341692 | |||
| 39b71a581a | |||
| 28257ceefe | |||
| e2eed22d73 | |||
| 790cac67ef | |||
| b6ddafdd25 | |||
|
|
bda93c9744 | ||
|
|
2634e9b70c | ||
| 2f3d47e349 | |||
| f7fcd79251 | |||
| 25f4f33cb0 | |||
| e06e2d553e | |||
| a5e3e269a1 | |||
| 9d0d722880 | |||
| 6ac90f3841 | |||
| e0bfe67c7e | |||
| eaed989525 | |||
| f08f754002 | |||
| 77ff2143c3 | |||
| a55031ed70 | |||
| b3c3156a08 | |||
| 76d4254f5e | |||
| 31928abbd1 | |||
| df349f1480 | |||
| 15ec2d909c | |||
| fbfbe5c328 | |||
| 067ff09c73 | |||
| 36e76b15b9 | |||
| 6e612e1f7a | |||
| 9b698cfdb3 | |||
|
|
45e0bf3c6c | ||
|
|
5111897d13 | ||
| 38631df3f9 | |||
| 1e41101f9b | |||
| 36bb362fd7 | |||
| 2f42a7464a | |||
| db2f0d8daf | |||
| ff668b1887 | |||
| a4f94099af | |||
| 96bcb30868 | |||
| 40de9f0a4c | |||
| d265ef5a32 | |||
| a21f061589 | |||
| 58c3419b35 | |||
| 5a443bfab9 | |||
| d92bcfe0aa | |||
| 055310b6e7 | |||
| 55782df345 | |||
| e0e5111f32 | |||
| 4acd0cbab1 | |||
| 925b4a2eb4 | |||
| 39cb9400f6 | |||
| c6ddba8702 | |||
|
|
0fe2bb42ae | ||
|
|
e0b937fce9 | ||
| 6f505ba281 | |||
| c740929622 | |||
| 8901053fd6 | |||
| 15689dfbc1 | |||
| ea660fff65 | |||
| 303e981a0c | |||
| bab9597739 | |||
| 1430b1eae7 | |||
| 45104ecc87 | |||
| 6bb55520cf | |||
| 95b2193393 | |||
| 74d2033857 | |||
| 8e8116e869 | |||
| 7df05a46f2 | |||
| 5754709a21 | |||
| 614bd328d1 | |||
| cc322f3352 | |||
| 328c75b2e4 | |||
| d6f53a69da | |||
| 1716a3a562 | |||
| b5933a9016 | |||
| 5048c638b8 | |||
| b4e9359165 | |||
| 24f4a4a498 | |||
| 42befadca5 | |||
| da2721ca56 | |||
| 19db2667c2 | |||
| 291f91bc61 | |||
| 0c1aa248d5 | |||
| f617b815a1 | |||
| a13006d630 | |||
|
|
fc0451ca32 | ||
| 5664faccfe | |||
| d769ec9755 | |||
| b9de011871 | |||
| d2e672e761 | |||
| 6cc409d744 | |||
|
|
9506d3e0f6 | ||
|
|
b90ed53437 | ||
|
|
fe8ca80452 | ||
|
|
1194f04eb6 | ||
|
|
c7866f2e5e | ||
|
|
e5452741e9 | ||
| ac8cbdc991 | |||
| d87dd8985c | |||
| 342b64273c | |||
|
|
3685174117 | ||
|
|
7ee43a9b4d | ||
| 84e5c2dd7e | |||
| ad7ca888a9 | |||
| 838f2edf7e | |||
| 3c1fcc327c | |||
|
|
9a66c333c7 | ||
| 3580fb41f3 | |||
| dc822bba07 | |||
| 1db5d4b11f | |||
| 1ca25d8ec4 | |||
| a9c7977347 | |||
| 3c471b1124 | |||
| 2b94151780 | |||
| 9088a792d1 | |||
| ff09ed8c8a | |||
| fdb76c31a8 | |||
| 484efa5854 | |||
| 07b3457409 | |||
| 1150fdac86 | |||
| 930684ac01 | |||
| 760d452311 | |||
| 6f0800162b | |||
| 8f3432f9a0 | |||
| ae1c614ee8 | |||
| 7ceb63b02f | |||
| a0fa5d43f1 | |||
| 008b3c942a | |||
| 3cc9f40baf | |||
| ca030e42d4 | |||
| 7b6ca29a93 | |||
| 8538f7d43f | |||
| 9f8e07c18a | |||
| a2212ac8e6 | |||
| d6c7538c36 | |||
| 150ac2afcb | |||
| 609df9855a | |||
| da2f27bc72 | |||
| eeb821de24 | |||
| a754751832 | |||
| 5235f23365 | |||
|
|
7f684fa085 | ||
|
|
d674a6ea12 | ||
| b315b667e9 | |||
| 798c42beb9 | |||
| 2613884a89 | |||
| 9a9702227c | |||
| 74ad7e9eb9 | |||
| cdb984a439 | |||
| ab33f09538 | |||
| 152da3c0e4 | |||
|
|
bd165769de | ||
|
|
c266e27c51 | ||
| 1bfa0095ae | |||
| 33c4e4baa7 | |||
| eb5df00b45 | |||
| 61be47b3d4 | |||
| e5356787be | |||
| f842bf375b | |||
| 9ef88a2d17 | |||
| 9688322f69 | |||
| 19a61159e4 | |||
| beb727760b | |||
| aa2631b7de | |||
| cfe89816f4 | |||
| 80d8d3c687 | |||
| c75bd8a197 | |||
| 12eeeced0e | |||
|
|
de69dc9b47 | ||
| 2edef9fcf0 | |||
| dfcf635f05 | |||
| 9beb9ed9de | |||
| 89dd56959a | |||
| d2f7f6080a | |||
|
|
0556e5eb79 | ||
| 6fc5a3f6f3 | |||
| 706bf36aa8 | |||
| 634931a624 | |||
| afc079b670 | |||
| c1a1b30c99 | |||
| d17bca9994 | |||
| 0fbaa25cd6 | |||
| 9a1b04966d | |||
| 759f93078b | |||
| 1e97239d18 | |||
| 49a3bbd701 | |||
| 68dc2ff018 | |||
| 6f843f54a6 | |||
| 19791498d4 | |||
| 4242b22c1a | |||
| 6e3b1e8b54 | |||
| 43703f3366 | |||
| bb052b85ac | |||
| 4049becfb8 | |||
| 2a8dabd648 | |||
| a6bd56c29c | |||
| 662e11c154 | |||
| fab991400e | |||
| b1b389ce8f | |||
| c977249713 | |||
| 9a306be965 | |||
| d01f37f5b9 | |||
| 07069af7a0 | |||
|
|
4a598f52d4 | ||
| c67a66c119 | |||
|
|
c99e553515 | ||
|
|
380c476cf3 | ||
| b433efc81a | |||
| ab4b9c1bf3 | |||
| 169423d5f9 | |||
| ce981882c8 | |||
| dd13f8d175 | |||
| 47f13d4b1e | |||
| 433bb7e1a4 | |||
| 08f86517da | |||
| 794826f0c7 | |||
| 096fa6dc51 | |||
| accf65ef10 | |||
| eaa8b834bf | |||
| b32ced514b | |||
| 78cf7e6857 | |||
| 8128766e24 | |||
| 90a08f37f6 | |||
| ad03a1ed2b | |||
| 41b1bed81d | |||
|
|
bc882f375f | ||
| 5d23a903fc | |||
| 7fb30322b3 | |||
| a795fa5786 | |||
|
|
6fcb68d929 | ||
| 9cf7396fb8 | |||
| 891cebec90 | |||
| 2206e2aa21 | |||
| ba4e927ff5 | |||
| fa366d18e5 | |||
| 31ff2a4502 | |||
| 4d312a8892 | |||
| fc09c1db05 | |||
| 62983eea10 | |||
| a7f95e98aa | |||
| df4312e61d | |||
| 65af3e7bfb | |||
| fe5c28dbf0 | |||
| 5b78df27f5 | |||
| f9cf478694 | |||
| 7b67e71bd6 | |||
| 2c5c694445 | |||
| 4649ad3abd | |||
| ac00d68350 | |||
| 40c09c58d4 | |||
| a30638d693 | |||
| 0f83224f28 | |||
| 11a1f044f5 | |||
| 7df8fbd46a | |||
| d57af223cc | |||
| a1925121d7 | |||
|
|
4f4f1842a4 | ||
| 1bc27897d8 | |||
| e5d03a07a3 | |||
|
|
d6909fb449 | ||
| 73978ca602 | |||
| ac4cdb1189 | |||
|
|
b3e85e186e | ||
| f0a09b2d0a | |||
| 501790677e | |||
|
|
700c08616f | ||
| 28207004c7 | |||
| 8c33aaa8a7 | |||
| 9e5d07d7e5 | |||
| 45dc828332 | |||
|
|
26f5c2c9c5 | ||
|
|
8ac192f8ba | ||
|
|
496109cc1a | ||
| e08eccb46d | |||
| df9debe453 | |||
| 43433b3b02 | |||
| 1cec0b123c | |||
| 324862a61f | |||
| aa76f82a74 | |||
| 24fc98cf7b | |||
| e7a2753c06 | |||
|
|
a7ae9df845 | ||
|
|
f04459aba1 | ||
| 4000b0b8e9 | |||
|
|
2d23266e50 | ||
| 99d90acebc | |||
| 6b2a94453c | |||
| bd679710e2 | |||
| 86610c07a8 | |||
|
|
b336efa79c | ||
|
|
d010907d2b | ||
|
|
894b656a82 | ||
|
|
4b9ecb9360 | ||
|
|
228fef7a9b | ||
|
|
6a6a440428 | ||
|
|
ee9462769f | ||
|
|
cf2f071f6d | ||
|
|
18113da288 | ||
|
|
743f55c11d | ||
|
|
4009f05185 | ||
|
|
182572bfd1 | ||
|
|
5edd4ee722 | ||
|
|
497f1ad64e | ||
|
|
ff632ef4cf | ||
|
|
10d094a5b7 | ||
|
|
f395fa32c7 | ||
|
|
57153d3bc7 | ||
|
|
5b3a6b6bf4 | ||
| 6fbf040107 | |||
| 6b81e35db0 | |||
|
|
97578316b8 | ||
|
|
4c07528102 | ||
|
|
065ef047a7 | ||
|
|
b5c5b9ec99 | ||
|
|
76824a5c57 | ||
|
|
75b0625dc4 | ||
|
|
4585a4e49d | ||
|
|
eb5b27fdf8 | ||
|
|
e8ab5fc050 | ||
|
|
9df7674abc | ||
|
|
21517a41a3 | ||
|
|
4449fcce60 | ||
| 27c7b68595 | |||
| 306f92f4e5 | |||
| 51fe4e113b | |||
| 3bb0b9108c | |||
| b8aff8512d | |||
| 6ec24f7431 | |||
|
|
d4373bc44f | ||
|
|
d0c20d68eb | ||
|
|
ad808d6fa6 | ||
|
|
ac92da76aa | ||
| 20c913f61f | |||
| f25e74869b | |||
|
|
09028a2041 | ||
| 0a9d2fbfc1 | |||
| 901cf7fbc4 | |||
| bd9d0a43c2 | |||
| 9eb481be57 | |||
| f568676a40 |
@@ -1,41 +1,41 @@
|
||||
### Java template
|
||||
# Compiled class file
|
||||
*.class
|
||||
# Log file
|
||||
*.log
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.nar
|
||||
*.ear
|
||||
*.zip
|
||||
*.tar.gz
|
||||
*.rar
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
### Maven template
|
||||
target/
|
||||
pom.xml.tag
|
||||
pom.xml.releaseBackup
|
||||
pom.xml.versionsBackup
|
||||
pom.xml.next
|
||||
release.properties
|
||||
dependency-reduced-pom.xml
|
||||
buildNumber.properties
|
||||
.mvn/timing.properties
|
||||
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
|
||||
.mvn/wrapper/maven-wrapper.jar
|
||||
### Example user template template
|
||||
### Example user template
|
||||
# IntelliJ project files
|
||||
.idea
|
||||
*.iml
|
||||
out
|
||||
gen
|
||||
!build
|
||||
!default.conf
|
||||
!nginx.conf
|
||||
### Java template
|
||||
# Compiled class file
|
||||
*.class
|
||||
# Log file
|
||||
*.log
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.nar
|
||||
*.ear
|
||||
*.zip
|
||||
*.tar.gz
|
||||
*.rar
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
### Maven template
|
||||
target/
|
||||
pom.xml.tag
|
||||
pom.xml.releaseBackup
|
||||
pom.xml.versionsBackup
|
||||
pom.xml.next
|
||||
release.properties
|
||||
dependency-reduced-pom.xml
|
||||
buildNumber.properties
|
||||
.mvn/timing.properties
|
||||
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
|
||||
.mvn/wrapper/maven-wrapper.jar
|
||||
### Example user template template
|
||||
### Example user template
|
||||
# IntelliJ project files
|
||||
.idea
|
||||
*.iml
|
||||
out
|
||||
gen
|
||||
!build
|
||||
!default.conf
|
||||
!nginx.conf
|
||||
|
||||
17
.drone.yml
@@ -8,7 +8,7 @@ steps:
|
||||
|
||||
|
||||
- name: build-package
|
||||
image: node:16.20.0
|
||||
image: node:18.19.0
|
||||
volumes:
|
||||
- name: cache
|
||||
path: /drone/src/node_modules
|
||||
@@ -23,11 +23,18 @@ steps:
|
||||
- cp docker.sh /app/build/$DRONE_REPO_NAME/
|
||||
- cp nginx.conf /app/build/$DRONE_REPO_NAME/
|
||||
- npm -v
|
||||
- node -v
|
||||
- mkdir -p ./node_modules
|
||||
- export NODE_MODULES_PATH=`pwd`/node_modules
|
||||
# - npm config set registry https://registry.npmmirror.com
|
||||
# - set NODE_OPTIONS=--openssl-legacy-provider
|
||||
# - npm install
|
||||
- npm config set registry https://registry.npmmirror.com
|
||||
- set NODE_OPTIONS=--openssl-legacy-provider
|
||||
- npm install --legacy-peer-deps
|
||||
- npm install codemirror
|
||||
# - npm install patch-package
|
||||
# - npx patch-package
|
||||
# - npm info unplugin-icons
|
||||
- npm list package-manager-detector
|
||||
# - npm install unplugin-icons@latest @antfu/install-pkg@latest package-manager-detector@latest
|
||||
- npm run build
|
||||
- ls /app/build/$DRONE_REPO_NAME/
|
||||
- echo $NODE_MODULES_PATH
|
||||
@@ -35,7 +42,7 @@ steps:
|
||||
|
||||
|
||||
- name: build-docker-prod # 制作docker镜像
|
||||
image: docker # 使用官方docker镜像
|
||||
image: 10.7.127.190:38080/docker/docker # 使用官方docker镜像
|
||||
volumes: # 将容器内目录挂载到宿主机
|
||||
- name: docker
|
||||
path: /var/run/docker.sock # 挂载宿主机的docker
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
# 开发环境基地址
|
||||
VITE_BASE_URL='/api'
|
||||
# 开发环境基地址
|
||||
VITE_BASE_URL='/api'
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 生产环境基地址
|
||||
VITE_BASE_URL='/api'
|
||||
|
||||
# 生产环境基地址
|
||||
VITE_BASE_URL='/api'
|
||||
|
||||
|
||||
56
.gitignore
vendored
@@ -1,28 +1,28 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
node_modules
|
||||
.DS_Store
|
||||
dist
|
||||
dist-ssr
|
||||
coverage
|
||||
*.local
|
||||
|
||||
/cypress/videos/
|
||||
/cypress/screenshots/
|
||||
|
||||
# Editor directories and files
|
||||
.vscode
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
node_modules
|
||||
.DS_Store
|
||||
dist
|
||||
dist-ssr
|
||||
coverage
|
||||
*.local
|
||||
|
||||
/cypress/videos/
|
||||
/cypress/screenshots/
|
||||
|
||||
# Editor directories and files
|
||||
.vscode
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
|
||||
36
Dockerfile
@@ -1,17 +1,19 @@
|
||||
FROM nginx
|
||||
|
||||
RUN rm -rf /etc/nginx/conf.d/default.conf
|
||||
RUN rm -rf /etc/nginx/nginx.conf
|
||||
COPY default.conf /etc/nginx/conf.d
|
||||
COPY nginx.conf /etc/nginx/
|
||||
|
||||
#RUN useradd -b /home/clay -m -s /bin/bash clay
|
||||
#RUN chmod a+xr -R /home/clay && chown clay:clay -R /home/clay
|
||||
#USER clay
|
||||
|
||||
COPY ./dist /home/clay
|
||||
|
||||
WORKDIR /home/clay
|
||||
|
||||
|
||||
EXPOSE 80
|
||||
FROM 10.7.127.190:38080/nginx:latest
|
||||
|
||||
RUN rm -rf /etc/nginx/conf.d/default.conf
|
||||
RUN rm -rf /etc/nginx/nginx.conf
|
||||
COPY default.conf /etc/nginx/conf.d
|
||||
COPY nginx.conf /etc/nginx/
|
||||
#COPY mosr.feashow.cn_chain.crt /etc/nginx/
|
||||
#COPY private.key /etc/nginx/
|
||||
|
||||
#RUN useradd -b /home/clay -m -s /bin/bash clay
|
||||
#RUN chmod a+xr -R /home/clay && chown clay:clay -R /home/clay
|
||||
#USER clay
|
||||
|
||||
COPY ./dist /home/clay
|
||||
|
||||
WORKDIR /home/clay
|
||||
|
||||
|
||||
EXPOSE 80
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
# <EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>ƽ̨
|
||||
|
||||
# 科技创新项目管理平台
|
||||
|
||||
|
||||
38
default.conf
@@ -1,19 +1,19 @@
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
|
||||
location /api {
|
||||
proxy_pass http://gateway.dev.svc.cluster.local:8080;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Forwarded-Port $server_port;
|
||||
#proxy_set_header Host $host;
|
||||
rewrite "^/api/(.*)$" /$1 break;
|
||||
}
|
||||
|
||||
location / {
|
||||
root /home/clay;
|
||||
index index.html index.htm;
|
||||
}
|
||||
|
||||
}
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
|
||||
location /api {
|
||||
proxy_pass http://gateway.dev.svc.cluster.local:8080;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Forwarded-Port $server_port;
|
||||
#proxy_set_header Host $host;
|
||||
rewrite "^/api/(.*)$" /$1 break;
|
||||
}
|
||||
|
||||
location / {
|
||||
root /home/clay;
|
||||
index index.html index.htm;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
102
deployment.yml
@@ -1,51 +1,51 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: $DRONE_REPO_NAME
|
||||
spec:
|
||||
type: NodePort
|
||||
ports:
|
||||
- name: $PORTS_NAME
|
||||
nodePort: $PORTS_PORT
|
||||
port: 80
|
||||
protocol: TCP
|
||||
targetPort: 80
|
||||
selector:
|
||||
app: $DRONE_REPO_NAME
|
||||
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: $DRONE_REPO_NAME
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: $DRONE_REPO_NAME
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: $DRONE_REPO_NAME
|
||||
spec:
|
||||
imagePullSecrets:
|
||||
- name: harbor
|
||||
containers:
|
||||
- image: $REGISTRY/$REGISTRY_NAMESPACE/$DRONE_REPO_NAME:$DRONE_COMMIT
|
||||
name: $DRONE_REPO_NAME
|
||||
imagePullPolicy: Always
|
||||
env:
|
||||
- name: TIME_ZONE
|
||||
value: Asia/Shanghai
|
||||
- name: REF_NAME
|
||||
value: dev
|
||||
resources:
|
||||
requests:
|
||||
memory: 0.1Gi
|
||||
cpu: 0.1
|
||||
limits:
|
||||
memory: 2Gi
|
||||
cpu: 2
|
||||
ports:
|
||||
- containerPort: 80
|
||||
name: app-port
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: $DRONE_REPO_NAME
|
||||
spec:
|
||||
type: NodePort
|
||||
ports:
|
||||
- name: $PORTS_NAME
|
||||
nodePort: $PORTS_PORT
|
||||
port: 80
|
||||
protocol: TCP
|
||||
targetPort: 80
|
||||
selector:
|
||||
app: $DRONE_REPO_NAME
|
||||
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: $DRONE_REPO_NAME
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: $DRONE_REPO_NAME
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: $DRONE_REPO_NAME
|
||||
spec:
|
||||
imagePullSecrets:
|
||||
- name: harbor
|
||||
containers:
|
||||
- image: $REGISTRY/$REGISTRY_NAMESPACE/$DRONE_REPO_NAME:$DRONE_COMMIT
|
||||
name: $DRONE_REPO_NAME
|
||||
imagePullPolicy: Always
|
||||
env:
|
||||
- name: TIME_ZONE
|
||||
value: Asia/Shanghai
|
||||
- name: REF_NAME
|
||||
value: dev
|
||||
resources:
|
||||
requests:
|
||||
memory: 0.1Gi
|
||||
cpu: 0.1
|
||||
limits:
|
||||
memory: 2Gi
|
||||
cpu: 2
|
||||
ports:
|
||||
- containerPort: 80
|
||||
name: app-port
|
||||
|
||||
@@ -8,6 +8,7 @@ app_version=$DRONE_COMMIT
|
||||
echo ${app_version}
|
||||
# 打包编译docker镜像
|
||||
echo '----build image start----'
|
||||
echo ${group_name}/${app_name}
|
||||
docker build -t ${group_name}/${app_name} .
|
||||
echo '----build image success----'
|
||||
docker tag ${group_name}/${app_name} $REGISTRY/$REGISTRY_NAMESPACE/${app_name}:${app_version}
|
||||
|
||||
26
index.html
@@ -1,13 +1,13 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="icon" href="/favicon.ico">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>科研管理平台</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script type="module" src="/src/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="icon" href="/favicon.ico">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>科技创新项目管理平台</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script type="module" src="/src/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
72
mosr.feashow.cn_chain.crt
Normal file
@@ -0,0 +1,72 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIG3DCCBMSgAwIBAgIQDzIS+rldpl8FKv9qt1IuQDANBgkqhkiG9w0BAQsFADBb
|
||||
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
|
||||
SW5jLjElMCMGA1UEAxMcVHJ1c3RBc2lhIERWIFRMUyBSU0EgQ0EgMjAyNTAeFw0y
|
||||
NTAzMTkwMDAwMDBaFw0yNTA2MTcyMzU5NTlaMBoxGDAWBgNVBAMTD21vc3IuZmVh
|
||||
c2hvdy5jbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK92bSayd6Wo
|
||||
wFJz+ldX8QEgQiUjEPyQB0rV+Op9/eZSmpC6y+DuS/CddOPaXs+t1fV9L2kQ1yWD
|
||||
Byc7cZK2PnzGb8+Uh9BR3UtVaCxISGqxjvt2V1lIwXbBDOUjtkVVlchhGR+BrNzP
|
||||
YGyMLhgdBDxhKK4ogBNOx23AzCpTGFsU7sL996qwYo2rhIE8UuYcw3deS4RtfMUx
|
||||
zt58wn1s+9kki6Qti7dLw3Bg0eCXop+7/FC09fg5Nh3EygMlZvLyvNOFig+o/Fk3
|
||||
6ibp2N56yFLEfe+WNj4xPCad/3Cevh5BIgTsSAPBh6J5Jk4IXoL8PuCSc96d79Bg
|
||||
SVGNGhRuCgcCAwEAAaOCAtswggLXMB8GA1UdIwQYMBaAFLQSKKW0wB2fKXFpPNkR
|
||||
lkp1aVDAMB0GA1UdDgQWBBTL9/e/QUue1NxlPXspxQ/RzXhzxTAaBgNVHREEEzAR
|
||||
gg9tb3NyLmZlYXNob3cuY24wPgYDVR0gBDcwNTAzBgZngQwBAgEwKTAnBggrBgEF
|
||||
BQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMA4GA1UdDwEB/wQEAwIF
|
||||
oDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIweQYIKwYBBQUHAQEEbTBr
|
||||
MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQwYIKwYBBQUH
|
||||
MAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9UcnVzdEFzaWFEVlRMU1JT
|
||||
QUNBMjAyNS5jcnQwDAYDVR0TAQH/BAIwADCCAX8GCisGAQQB1nkCBAIEggFvBIIB
|
||||
awFpAHYATnWjJ1yaEMM4W2zU3z9S6x3w4I4bjWnAsfpksWKaOd8AAAGVrKDPywAA
|
||||
BAMARzBFAiAJkC1pvmPIhgdAkRoyPCItM4oRM5Bb8OI3zVzNvdNTkQIhAN1Fq4mU
|
||||
GJYrJkOmwvJ2Mb5upB50Ic8C7KatpMdKEFM7AHYAfVkeEuF4KnscYWd8Xv340Idc
|
||||
FKBOlZ65Ay/ZDowuebgAAAGVrKDQBwAABAMARzBFAiAT9jfX08uN94aIeK84IySz
|
||||
jUPDa1MSWjJKsA3XusY3GAIhAJ9PvGtFx9+UM9YNNT7BZUq6hhVvhYWhlf+d0qpy
|
||||
uEl9AHcAzxFW7tUufK/zh1vZaS6b6RpxZ0qwF+ysAdJbd87MOwgAAAGVrKDP+AAA
|
||||
BAMASDBGAiEA0c9dt1JwyAMzQtv7UsPaKEJ5sp6HDaSWe5BGIYWsYrcCIQDjS6L1
|
||||
9TF6SpcEWHH6bl952VQb6Xvt1JmmKUNX6iK2xTANBgkqhkiG9w0BAQsFAAOCAgEA
|
||||
0E2VWQjWgEBz968xq2cpYGv2Enfs2TWpynuoPTwY83V7h2ejNbpjgyW1gT/kQkxa
|
||||
G5k4jpkVmNMaj3CAvK4IA5jOPh6dhzBG35Qc0PwRm0eovcUdUNUd0g4EOv82p2s1
|
||||
ab1SWNYoxGdS+y+LHhfFZ7CoVcSvBz+LHBlPTVTkLA0SWLA0fhS3pl5oGIilMtSM
|
||||
znCUUuMBtMQBv7sFX2gDEYwxGaMn3lpoqBGkpx4UBc51z/U3+X9zLqu6n/GpLC72
|
||||
+qz6QtQVm0Np8gcjul0ebQqAPwDG4U+9jYEmdwVHZ0iUKgyZPECPU+TTtHx0TFS3
|
||||
B5JXy8vbGJBqpwq6hMnu/SFm+GY3iPk7N0Aj5+9QNcl2FTF8k/nCoK3MuY71ZmxR
|
||||
E1NY6Hl5KpKzBqc7JG4iqQxJ0dD9Racn4wegGDlX0Vr2U+ohHYeETNJXOX+JT4tc
|
||||
1PBdfiywbX+FCdE2ZPehWa6dt4fnPBC/9lSywrzOWLNt9z1a/Mh73N5F6ndaXq1p
|
||||
v/N3Q0qnXpW1RZa6Baqlfvk2vqhraRbT9YH5Y+f51DhtVB6fbELO/pJr1H5kh0XI
|
||||
CczHkGTGD7xZloNfTMLP2AVguIXJ0EASAAMw/MBRWvSd4He2lLHvujEqTXsTISgv
|
||||
v+/5bZP8qBk3/oEgdLjlmqWY1sesBH84tiMZcxCkPNM=
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIFnjCCBIagAwIBAgIQCSYyO0lk42hGFRLe8aXVLDANBgkqhkiG9w0BAQsFADBh
|
||||
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
||||
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
|
||||
MjAeFw0yNTAxMDgwMDAwMDBaFw0zNTAxMDcyMzU5NTlaMFsxCzAJBgNVBAYTAkNO
|
||||
MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSUwIwYDVQQD
|
||||
ExxUcnVzdEFzaWEgRFYgVExTIFJTQSBDQSAyMDI1MIICIjANBgkqhkiG9w0BAQEF
|
||||
AAOCAg8AMIICCgKCAgEA0fuEmuBIsN6ZZVq+gRobMorOGIilTCIfQrxNpR8FUZ9R
|
||||
/GfbiekbiIKphQXEZ7N1uBnn6tXUuZ32zl6jPkZpHzN/Bmgk1BWSIzVc0npMzrWq
|
||||
/hrbk5+KddXJdsNpeG1+Q8lc8uVMBrztnxaPb7Rh7yQCsMrcO4hgVaqLJWkVvEfW
|
||||
ULtoCHQnNaj4IroG6VxQf1oArQ8bPbwpI02lieSahRa78FQuXdoGVeQcrkhtVjZs
|
||||
ON98vq5fPWZX2LFv7e5J6P9IHbzvOl8yyQjv+2/IOwhNSkaXX3bI+//bqF9XW/p7
|
||||
+gsUmHiK5YsvLjmXcvDmoDEGrXMzgX31Zl2nJ+umpRbLjwP8rxYIUsKoEwEdFoto
|
||||
Aid59UEBJyw/GibwXQ5xTyKD/N6C8SFkr1+myOo4oe1UB+YgvRu6qSxIABo5kYdX
|
||||
FodLP4IgoVJdeUFs1Usa6bxYEO6EgMf5lCWt9hGZszvXYZwvyZGq3ogNXM7eKyi2
|
||||
20WzJXYMmi9TYFq2Fa95aZe4wki6YhDhhOO1g0sjITGVaB73G+JOCI9yJhv6+REN
|
||||
D40ZpboUHE8JNgMVWbG1isAMVCXqiADgXtuC+tmJWPEH9cR6OuJLEpwOzPfgAbnn
|
||||
2MRu7Tsdr8jPjTPbD0FxblX1ydW3RG30vwLF5lkTTRkHG9epMgpPMdYP7nY/08MC
|
||||
AwEAAaOCAVYwggFSMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLQSKKW0
|
||||
wB2fKXFpPNkRlkp1aVDAMB8GA1UdIwQYMBaAFE4iVCAYlebjbuYP+vq5Eu0GF485
|
||||
MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
|
||||
dgYIKwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy
|
||||
dC5jb20wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9E
|
||||
aWdpQ2VydEdsb2JhbFJvb3RHMi5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDov
|
||||
L2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDARBgNV
|
||||
HSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQELBQADggEBAJ4a3svh316GY2+Z7EYx
|
||||
mBIsOwjJSnyoEfzx2T699ctLLrvuzS79Mg3pPjxSLlUgyM8UzrFc5tgVU3dZ1sFQ
|
||||
I4RM+ysJdvIAX/7Yx1QbooVdKhkdi9X7QN7yVkjqwM3fY3WfQkRTzhIkM7mYIQbR
|
||||
r+y2Vkju61BLqh7OCRpPMiudjEpP1kEtRyGs2g0aQpEIqKBzxgitCXSayO1hoO6/
|
||||
71ts801OzYlqYW9OQQQ2GCJyFbD6XHDjdpn+bWUxTKWaMY0qedSCbHE3Kl2QEF0C
|
||||
ynZ7SbC03yR+gKZQDeTXrNP1kk5Qhe7jSXgw+nhbspe0q/M1ZcNCz+sPxeOwdCcC
|
||||
gJE=
|
||||
-----END CERTIFICATE-----
|
||||
102
nginx.conf
@@ -1,50 +1,52 @@
|
||||
user nginx;
|
||||
worker_processes auto;
|
||||
|
||||
error_log /var/log/nginx/error.log notice;
|
||||
pid /var/run/nginx.pid;
|
||||
|
||||
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
http {
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||
'$status $body_bytes_sent "$http_referer" '
|
||||
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||
|
||||
add_header 'Access-Control-Allow-Origin' '*';
|
||||
add_header 'Access-Control-Allow-Headers' '*';
|
||||
add_header 'Access-Control-Allow-Methods' '*';
|
||||
|
||||
access_log /var/log/nginx/access.log main;
|
||||
|
||||
sendfile on;
|
||||
|
||||
keepalive_timeout 65;
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
|
||||
location /api {
|
||||
proxy_pass http://gateway.$PROFILES.svc.cluster.local:8080;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Forwarded-Port $server_port;
|
||||
proxy_set_header Host $host;
|
||||
rewrite "^/api/(.*)$" /$1 break;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection 'upgrade';
|
||||
}
|
||||
|
||||
location / {
|
||||
root /home/clay;
|
||||
index index.html index.htm;
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
}
|
||||
}
|
||||
user nginx;
|
||||
worker_processes auto;
|
||||
|
||||
error_log /var/log/nginx/error.log notice;
|
||||
pid /var/run/nginx.pid;
|
||||
|
||||
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
http {
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||
'$status $body_bytes_sent "$http_referer" '
|
||||
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||
|
||||
add_header 'Access-Control-Allow-Origin' '*';
|
||||
add_header 'Access-Control-Allow-Headers' '*';
|
||||
add_header 'Access-Control-Allow-Methods' '*';
|
||||
|
||||
access_log /var/log/nginx/access.log main;
|
||||
|
||||
sendfile on;
|
||||
|
||||
keepalive_timeout 65;
|
||||
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
|
||||
location /api {
|
||||
proxy_pass http://gateway.$PROFILES.svc.cluster.local:8080;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Forwarded-Port $server_port;
|
||||
proxy_set_header Host $host;
|
||||
rewrite "^/api/(.*)$" /$1 break;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection 'upgrade';
|
||||
client_max_body_size 30m;
|
||||
}
|
||||
|
||||
location / {
|
||||
root /home/clay;
|
||||
index index.html index.htm;
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
109
package.json
@@ -1,50 +1,59 @@
|
||||
{
|
||||
"name": "mosr-web",
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"@antv/g6": "^3.5.7",
|
||||
"@tinymce/tinymce-vue": "^4.0.7",
|
||||
"axios": "^1.4.0",
|
||||
"d3": "^7.8.5",
|
||||
"echarts": "^5.4.2",
|
||||
"element-plus": "^2.6.0",
|
||||
"file-saver": "^2.0.5",
|
||||
"highlight.js": "9.18.5",
|
||||
"jquery": "^3.6.0",
|
||||
"js-cookie": "^3.0.5",
|
||||
"nprogress": "^0.2.0",
|
||||
"pinia": "^2.0.35",
|
||||
"sass": "^1.62.1",
|
||||
"scss": "^0.2.4",
|
||||
"sql-formatter": "^2.3.4",
|
||||
"tinymce": "^5.0.4",
|
||||
"unplugin-icons": "^0.16.1",
|
||||
"vite-plugin-inspect": "^0.7.26",
|
||||
"vue": "^3.2.47",
|
||||
"vue-clipboard3": "^2.0.0",
|
||||
"vue-codemirror": "^6.1.1",
|
||||
"vue-json-viewer": "^3.0.4",
|
||||
"vue-router": "^4.1.6",
|
||||
"vuedraggable": "^4.1.0",
|
||||
"xlsx": "^0.18.5",
|
||||
"xlsx-style-vite": "^0.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@codemirror/lang-java": "^6.0.1",
|
||||
"@codemirror/lang-javascript": "^6.1.9",
|
||||
"@codemirror/lang-sql": "^6.5.4",
|
||||
"@vitejs/plugin-vue": "^4.2.1",
|
||||
"@vitejs/plugin-vue-jsx": "^3.0.1",
|
||||
"lodash": "^4.17.21",
|
||||
"unplugin-auto-import": "^0.15.3",
|
||||
"unplugin-vue-components": "^0.24.1",
|
||||
"vite": "^4.3.4",
|
||||
"vite-plugin-svg-icons": "^0.4.0"
|
||||
}
|
||||
}
|
||||
{
|
||||
"name": "mosr-web",
|
||||
"version": "0.0.0",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build --config vite.config.mjs",
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"overrides": {
|
||||
"package-manager-detector": "1.0.0",
|
||||
|
||||
"@iconify/utils": "2.2.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@antv/g6": "^3.5.7",
|
||||
"@tinymce/tinymce-vue": "^4.0.7",
|
||||
"axios": "^1.4.0",
|
||||
"d3": "^7.8.5",
|
||||
"docx-preview": "^0.3.2",
|
||||
"echarts": "^5.4.2",
|
||||
"element-plus": "^2.6.0",
|
||||
"file-saver": "^2.0.5",
|
||||
"highlight.js": "9.18.5",
|
||||
"jquery": "^3.6.0",
|
||||
"js-cookie": "^3.0.5",
|
||||
"nprogress": "^0.2.0",
|
||||
"pinia": "^2.0.35",
|
||||
"sass": "^1.62.1",
|
||||
"scss": "^0.2.4",
|
||||
"sql-formatter": "^2.3.4",
|
||||
"tinymce": "^5.0.4",
|
||||
"unplugin-icons": "^0.16.1",
|
||||
"vite-plugin-inspect": "^0.7.26",
|
||||
"vue": "^3.2.47",
|
||||
"vue-clipboard3": "^2.0.0",
|
||||
"vue-codemirror": "^6.1.1",
|
||||
"vue-json-viewer": "^3.0.4",
|
||||
"vue-router": "^4.1.6",
|
||||
"vue3-pdf-app": "^1.0.3",
|
||||
"vue3-print-nb": "^0.1.4",
|
||||
"vuedraggable": "^4.1.0",
|
||||
"xlsx": "^0.18.5",
|
||||
"xlsx-style-vite": "^0.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@codemirror/lang-java": "^6.0.1",
|
||||
"@codemirror/lang-javascript": "^6.1.9",
|
||||
"@codemirror/lang-sql": "^6.5.4",
|
||||
"@vitejs/plugin-vue": "^4.2.1",
|
||||
"@vitejs/plugin-vue-jsx": "^3.0.1",
|
||||
"lodash": "^4.17.21",
|
||||
"unplugin-auto-import": "^0.15.3",
|
||||
"unplugin-vue-components": "^0.24.1",
|
||||
"vite": "^4.3.4",
|
||||
"vite-plugin-svg-icons": "^0.4.0"
|
||||
}
|
||||
}
|
||||
|
||||
28
private.key
Normal file
@@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCvdm0msnelqMBS
|
||||
c/pXV/EBIEIlIxD8kAdK1fjqff3mUpqQusvg7kvwnXTj2l7PrdX1fS9pENclgwcn
|
||||
O3GStj58xm/PlIfQUd1LVWgsSEhqsY77dldZSMF2wQzlI7ZFVZXIYRkfgazcz2Bs
|
||||
jC4YHQQ8YSiuKIATTsdtwMwqUxhbFO7C/feqsGKNq4SBPFLmHMN3XkuEbXzFMc7e
|
||||
fMJ9bPvZJIukLYu3S8NwYNHgl6Kfu/xQtPX4OTYdxMoDJWby8rzThYoPqPxZN+om
|
||||
6djeeshSxH3vljY+MTwmnf9wnr4eQSIE7EgDwYeieSZOCF6C/D7gknPene/QYElR
|
||||
jRoUbgoHAgMBAAECggEABmJQMV6/9LKRoM5gduoXtjtGvNQsS4wv/7yOTHXeFZG+
|
||||
1vI89cel0rDf7mRlG7hO9xohbfizY0WDrp0+kiB4YJDVw587W8yGuTV3z1in7d3c
|
||||
/nA9WF3J0DjQ78tfV+F3zC0gPWG5+OTAtOJa0PzJSSsd0Exf8JPmtKsVopqYYcPv
|
||||
RL2uP+NfcsxIEPz7rBBqiTGbOgsoKIpVZWiV6dmGOHLnI3ktWE8GXyIFv0VO6kp2
|
||||
fk/Z2uU9rfS9Qc9NijVdZ5AejdSh70iWNdiVMTSXZ69XLQCiY1h/376mraAPZTC1
|
||||
T0fYAtaOdyRrYLIW3yuznZa6hz351+t4TjJHQGjAUQKBgQDe8FS3yM85Ve3qlNaV
|
||||
pzjpjkv8cn8u43Hyk88owNACxkvzUXx15YE+AGjjycVO5rbyC1mtdE2MKX8cd5T/
|
||||
cA75RoSDxBTR7xi9eqBzJpQ7hm2rTaZSkHhu4P9KsthgQFFYQB6EkZgYczLOs/OV
|
||||
UmPMuKwL7HcwuRf00jjAOoJPdwKBgQDJe7R4PS0VBAWnh3lC9R/NEbEoFQ6LUwPh
|
||||
Qgmgj6LRB/1NgaC7ekDCSyfFlTtpnRDD+WqCrZDiB1ZZehyUObvr0Y0Cb4Y77Fjh
|
||||
lPVG0kfcKUldMpJIfeex0LPBwYHC62Y0ztNQmtgTldDjX04b4gAEgpUReHVTJtDr
|
||||
6S1wRPVd8QKBgHIL0+roqUmVcc5NMbEBCJZCGxEbqYBdDg+gGZupdz/UHUpt5xOQ
|
||||
wprrLr1InM0OLYyIzelz06/eEo6HhgteUeqnbmbRyizS+X8E2kvN8oq47CVz5Z/b
|
||||
FCD0rOSTtSkX/gT9WB9NM9deJyGi4PsEWNWDq0+2OgsMxPqTCEEeLUdlAoGAHNmB
|
||||
tdXMpr20sZBMZLIEo7Bs1XhuZLS2UYLLLhpjDds/AeIVycJvk2J/h2Me5rh+thD4
|
||||
l02S+Upjqtw5S2AY8GNI9ZhSeDIXZ/WUSVfCwluHDbk4CPk+O8/ObWfv1KEwOU+E
|
||||
In6JggRprKTw4j0yE3M/NQkyg32DXMQ+pVy6ZYECgYEAmW/+vm3X2NMj8yjr0Io2
|
||||
P3F/9EHPkrGHNC3Qj6Q2mFus6oDe6NwOQg5Su0fFC77spHFi1g/MlGUxbzoxjVxH
|
||||
1wQmwCHBJuJ97H9MOJ9K2v88/pkvfFGthkTLpbcJLqX57WVEVnVKBMNhpLrlp+0r
|
||||
T3tV8tN010INwiQkaoqCsuw=
|
||||
-----END PRIVATE KEY-----
|
||||
BIN
public/home1.png
Normal file
|
After Width: | Height: | Size: 750 KiB |
BIN
public/home2.png
Normal file
|
After Width: | Height: | Size: 736 KiB |
BIN
public/home3.png
Normal file
|
After Width: | Height: | Size: 743 KiB |
BIN
public/home4.png
Normal file
|
After Width: | Height: | Size: 733 KiB |
BIN
public/loading.gif
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
public/people.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
@@ -1,61 +1,61 @@
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
||||
line-height: 1.4;
|
||||
margin: 1rem;
|
||||
}
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
/* Apply a default padding if legacy cellpadding attribute is missing */
|
||||
table:not([cellpadding]) th,
|
||||
table:not([cellpadding]) td {
|
||||
padding: 0.4rem;
|
||||
}
|
||||
/* Set default table styles if a table has a positive border attribute
|
||||
and no inline css */
|
||||
table[border]:not([border="0"]):not([style*="border-width"]) th,
|
||||
table[border]:not([border="0"]):not([style*="border-width"]) td {
|
||||
border-width: 1px;
|
||||
}
|
||||
/* Set default table styles if a table has a positive border attribute
|
||||
and no inline css */
|
||||
table[border]:not([border="0"]):not([style*="border-style"]) th,
|
||||
table[border]:not([border="0"]):not([style*="border-style"]) td {
|
||||
border-style: solid;
|
||||
}
|
||||
/* Set default table styles if a table has a positive border attribute
|
||||
and no inline css */
|
||||
table[border]:not([border="0"]):not([style*="border-color"]) th,
|
||||
table[border]:not([border="0"]):not([style*="border-color"]) td {
|
||||
border-color: #ccc;
|
||||
}
|
||||
figure {
|
||||
display: table;
|
||||
margin: 1rem auto;
|
||||
}
|
||||
figure figcaption {
|
||||
color: #999;
|
||||
display: block;
|
||||
margin-top: 0.25rem;
|
||||
text-align: center;
|
||||
}
|
||||
hr {
|
||||
border-color: #ccc;
|
||||
border-style: solid;
|
||||
border-width: 1px 0 0 0;
|
||||
}
|
||||
code {
|
||||
background-color: #e8e8e8;
|
||||
border-radius: 3px;
|
||||
padding: 0.1rem 0.2rem;
|
||||
}
|
||||
.mce-content-body:not([dir=rtl]) blockquote {
|
||||
border-left: 2px solid #ccc;
|
||||
margin-left: 1.5rem;
|
||||
padding-left: 1rem;
|
||||
}
|
||||
.mce-content-body[dir=rtl] blockquote {
|
||||
border-right: 2px solid #ccc;
|
||||
margin-right: 1.5rem;
|
||||
padding-right: 1rem;
|
||||
}
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
||||
line-height: 1.4;
|
||||
margin: 1rem;
|
||||
}
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
/* Apply a default padding if legacy cellpadding attribute is missing */
|
||||
table:not([cellpadding]) th,
|
||||
table:not([cellpadding]) td {
|
||||
padding: 0.4rem;
|
||||
}
|
||||
/* Set default table styles if a table has a positive border attribute
|
||||
and no inline css */
|
||||
table[border]:not([border="0"]):not([style*="border-width"]) th,
|
||||
table[border]:not([border="0"]):not([style*="border-width"]) td {
|
||||
border-width: 1px;
|
||||
}
|
||||
/* Set default table styles if a table has a positive border attribute
|
||||
and no inline css */
|
||||
table[border]:not([border="0"]):not([style*="border-style"]) th,
|
||||
table[border]:not([border="0"]):not([style*="border-style"]) td {
|
||||
border-style: solid;
|
||||
}
|
||||
/* Set default table styles if a table has a positive border attribute
|
||||
and no inline css */
|
||||
table[border]:not([border="0"]):not([style*="border-color"]) th,
|
||||
table[border]:not([border="0"]):not([style*="border-color"]) td {
|
||||
border-color: #ccc;
|
||||
}
|
||||
figure {
|
||||
display: table;
|
||||
margin: 1rem auto;
|
||||
}
|
||||
figure figcaption {
|
||||
color: #999;
|
||||
display: block;
|
||||
margin-top: 0.25rem;
|
||||
text-align: center;
|
||||
}
|
||||
hr {
|
||||
border-color: #ccc;
|
||||
border-style: solid;
|
||||
border-width: 1px 0 0 0;
|
||||
}
|
||||
code {
|
||||
background-color: #e8e8e8;
|
||||
border-radius: 3px;
|
||||
padding: 0.1rem 0.2rem;
|
||||
}
|
||||
.mce-content-body:not([dir=rtl]) blockquote {
|
||||
border-left: 2px solid #ccc;
|
||||
margin-left: 1.5rem;
|
||||
padding-left: 1rem;
|
||||
}
|
||||
.mce-content-body[dir=rtl] blockquote {
|
||||
border-right: 2px solid #ccc;
|
||||
margin-right: 1.5rem;
|
||||
padding-right: 1rem;
|
||||
}
|
||||
|
||||
2
public/skins/content/default/content.min.css
vendored
@@ -1 +1 @@
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem}
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem}
|
||||
|
||||
2
public/skins/ui/oxide/content.min.css
vendored
2
public/skins/ui/oxide/skin.min.css
vendored
211
public/upfiles.html
Normal file
@@ -0,0 +1,211 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>axupimgs</title>
|
||||
<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1.0, maximum-scale=1.0"/>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
|
||||
<meta name="format-detection" content="telephone=no">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
||||
<style>
|
||||
html,body{height:100%;margin:0;padding:0;background:#fff;}
|
||||
ul{margin:0;padding:0;list-style:none;}
|
||||
#wrap{padding:10px;}
|
||||
#topbar{padding:10px 0;border-bottom:1px solid #ccc;text-align:right;}
|
||||
#topbar button {margin:0;margin-left:5px;outline:none;padding: 4px 16px;box-sizing: border-box;
|
||||
display:inline-block;border:none;border-radius:3px;text-align:center;cursor:pointer;
|
||||
font-size:14px;line-height:1.5;background-color:#f0f0f0;color:#223;
|
||||
}
|
||||
#topbar button.primary{background-color:#3d97d4;color:#fff;}
|
||||
#topbar button:hover{background-color:#207ab7;color:#fff;}
|
||||
#topbar button.removeall{float:left}
|
||||
#file_list {display:grid;grid-gap:10px;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));padding-top:10px;}
|
||||
#file_list:empty:after{content:'可以直接拖拽文件到这里';color:#777;font-size:0.8em;}
|
||||
#file_list li{position:relative;display:block;vertical-align:top;padding:5px 5px;border-radius:5px;}
|
||||
#file_list li.up-over {}
|
||||
#file_list li.up-now {}
|
||||
#file_list li.up-now:after{content:'';position:absolute;top:0;left:0;display:block;width:100%;height:100%;background:rgba(255,255,255,0.8) url(loading.gif) center center no-repeat;border-radius:5px;z-index:999;}
|
||||
#file_list li:hover{background-color:#ddd;}
|
||||
#file_list li .picbox {display:flex;flex:0 0 auto;justify-content:center;overflow:hidden;position:relative;width:100%;padding-top:100%;align-items:center;}
|
||||
#file_list li .picbox img {display:block;max-width:100%;max-height:100%;position:absolute;
|
||||
top:50%;left:50%;transform:translateX(-50%) translateY(-50%);}
|
||||
#file_list li.up-over .picbox:after{content:url('data:image/svg+xml;%20charset=utf8,%3Csvg%20viewBox%3D%220%200%201024%201024%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M512%200C229.376%200%200%20229.376%200%20512s229.376%20512%20512%20512%20512-229.376%20512-512S794.624%200%20512%200z%22%20fill%3D%22%234AC711%22%3E%3C%2Fpath%3E%3Cpath%20d%3D%22M855.552%20394.752l-358.4%20358.4a50.9952%2050.9952%200%200%201-72.192%200l-204.8-204.8c-18.944-19.968-18.944-51.2%200-71.168a50.5344%2050.5344%200%200%201%2072.192-1.024L460.8%20644.608l322.048-322.048c19.968-18.944%2051.2-18.944%2071.168%200%2020.48%2019.456%2020.992%2051.712%201.536%2072.192z%22%20fill%3D%22%23FFFFFF%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E');position:absolute;bottom:2px;right:2px;z-index:9;}
|
||||
#file_list li .tools {display:none;position:absolute;bottom:5px;right:5px;z-index:99;}
|
||||
#file_list li:hover .tools {display:block;}
|
||||
#file_list li .tools .remove{cursor:pointer;}
|
||||
#file_list li .tools .remove:after{content:url('data:image/svg+xml;%20charset=utf8,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M17%206h3a1%201%200%200%201%200%202h-1v11a3%203%200%200%201-3%203H8a3%203%200%200%201-3-3V8H4a1%201%200%201%201%200-2h3V5a3%203%200%200%201%203-3h4a3%203%200%200%201%203%203v1zm-2%200V5a1%201%200%200%200-1-1h-4a1%201%200%200%200-1%201v1h6zm2%202H7v11a1%201%200%200%200%201%201h8a1%201%200%200%200%201-1V8zm-8%203a1%201%200%200%201%202%200v6a1%201%200%200%201-2%200v-6zm4%200a1%201%200%200%201%202%200v6a1%201%200%200%201-2%200v-6z%22%3E%3C/path%3E%3C/svg%3E');}
|
||||
#file_list li .namebox {font-size:14px;line-height:20px;max-height:40px;overflow:hidden;padding:5px 10px;text-align:center;display:flex;justify-content:center;align-items:flex-start;}
|
||||
#file_list li .namebox span{word-break:break-all;vertical-align:top;}
|
||||
</style>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<div id="wrap">
|
||||
<div id="topbar"><button class="addfile primary">+ 添加文件</button><button class="removeall">清空列表</button></div>
|
||||
<ul id="file_list"></ul>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
var editor=parent.tinymce.activeEditor;
|
||||
var axupimgs=parent.axupimgs;
|
||||
axupimgs.res = []; //存放本地文件的数组
|
||||
var blobInfo = {file:null}
|
||||
blobInfo.blob = function(){return this.file;}
|
||||
var upload_handler = axupimgs.images_upload_handler;
|
||||
var upload_base_path = axupimgs.images_upload_base_path;
|
||||
//为列表添加排序
|
||||
function reSort(){
|
||||
document.querySelectorAll('#file_list li').forEach((el,i)=>{
|
||||
el.setAttribute('data-num',i);
|
||||
});
|
||||
}
|
||||
|
||||
function addList(files){
|
||||
var files_sum = files.length;
|
||||
var vDom = document.createDocumentFragment();
|
||||
for(let i=0;i<files_sum;i++){
|
||||
let file = files[i];
|
||||
let blobUrl = window.URL.createObjectURL(file)
|
||||
axupimgs.res.push({file:file,blobUrl:blobUrl,url:''});
|
||||
let li = document.createElement('li');
|
||||
li.setAttribute('class','up-no');
|
||||
li.setAttribute('data-time',file.lastModified);
|
||||
li.innerHTML='<div class="picbox"><img src="'+blobUrl+'"></div><div class="namebox"><span>'+file.name+'</span></div><div class="tools"><a class="remove"></a></div>';
|
||||
vDom.appendChild(li);
|
||||
|
||||
}
|
||||
|
||||
document.querySelector('#file_list').appendChild(vDom);
|
||||
if(axupimgs.res.length>0){
|
||||
document.querySelectorAll('#file_list li.up-no').forEach((el,i)=>{
|
||||
el.classList ? el.classList.add('up-now') : el.className+=' up-now';
|
||||
});
|
||||
upAllFiles(0);
|
||||
}
|
||||
|
||||
//reSort();
|
||||
}
|
||||
|
||||
|
||||
//清空列表
|
||||
document.querySelector('#topbar .removeall').addEventListener('click',()=>{
|
||||
axupimgs.res=[]
|
||||
document.querySelectorAll('#file_list li').forEach((el,i)=>{
|
||||
el.parentNode.removeChild(el)
|
||||
});
|
||||
});
|
||||
//拖拽添加
|
||||
document.addEventListener('dragover', (e)=>{
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
e.dataTransfer.dropEffect = 'copy';
|
||||
});
|
||||
document.addEventListener('drop', (e)=>{
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
if(!e.dataTransfer.files){return false;}
|
||||
var dropfiles = e.dataTransfer.files;
|
||||
if(!(dropfiles.length>0)){return false;}
|
||||
var exts=axupimgs.axupimgs_filetype.replace(/(\s)+/g,'').toLowerCase().split(',');
|
||||
var files=[];
|
||||
for( let file of dropfiles ){
|
||||
ext = file.name.split('.');
|
||||
ext = '.'+ext[ext.length-1];
|
||||
for(let s of exts){
|
||||
if(s==ext){
|
||||
files.push(file);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(files.length>0){ addList(files) }
|
||||
});
|
||||
|
||||
//添加文件
|
||||
document.querySelector('#topbar .addfile').addEventListener('click',()=>{
|
||||
var input = document.createElement('input');
|
||||
input.setAttribute('type', 'file');
|
||||
input.setAttribute('multiple', 'multiple');
|
||||
input.setAttribute('accept', axupimgs.axupimgs_filetype);
|
||||
input.click();
|
||||
input.onchange = function() {
|
||||
var files = this.files;
|
||||
addList(files);
|
||||
}
|
||||
});
|
||||
|
||||
var file_i = 0;
|
||||
|
||||
function upAllFiles(n){
|
||||
var len = axupimgs.res.length;
|
||||
file_i = n;
|
||||
if(len == n){
|
||||
file_i=0;
|
||||
// document.querySelector('#topbar .upall').innerText='全部上传';
|
||||
return true;
|
||||
}
|
||||
if( axupimgs.res[n].url!='' ){
|
||||
n++;
|
||||
upAllFiles(n)
|
||||
}else{
|
||||
blobInfo.file=axupimgs.res[n].file;
|
||||
upload_handler(blobInfo,function(url,name){
|
||||
if(upload_base_path){
|
||||
if(upload_base_path.slice(-1)=='/' && url.substr(0,1)=='/' ){
|
||||
url = upload_base_path + url.slice(1);
|
||||
}else if(upload_base_path.slice(-1)!='/' && url.substr(0,1)!='/' ){
|
||||
url = upload_base_path + '/' + url;
|
||||
}else{
|
||||
url = upload_base_path + url;
|
||||
}
|
||||
}
|
||||
axupimgs.res[file_i].url = url;
|
||||
// filename = url.split('/').pop();
|
||||
filename = name
|
||||
var li = document.querySelectorAll('#file_list li')[file_i];
|
||||
li.setAttribute('class','up-over');
|
||||
li.querySelector('.namebox span').innerText = filename;
|
||||
n++
|
||||
upAllFiles(n);
|
||||
},function(err){
|
||||
// document.querySelector('#topbar .upall').innerText='全部上传';
|
||||
// document.querySelectorAll('#file_list li.up-now').forEach((el,i)=>{
|
||||
// el.setAttribute('class','up-no');
|
||||
// });
|
||||
// alert(err);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
//
|
||||
// document.querySelector('#topbar .upall').addEventListener('click',(e)=>{
|
||||
// if(e.target.innerText!='全部上传'){return false;}
|
||||
// if(axupimgs.res.length>0){
|
||||
// document.querySelectorAll('#file_list li.up-no').forEach((el,i)=>{
|
||||
// el.classList ? el.classList.add('up-now') : el.className+=' up-now';
|
||||
// });
|
||||
// e.target.innerText='上传中...';
|
||||
// upAllFiles(0);
|
||||
// }
|
||||
// });
|
||||
|
||||
var observ_flist = new MutationObserver( (muList,observe)=>{
|
||||
if(muList[0].addedNodes.length>0){
|
||||
muList[0].addedNodes.forEach((el)=>{
|
||||
el.querySelector('.remove').addEventListener('click',(e)=>{
|
||||
var li = e.target.parentNode.parentNode;
|
||||
var n = li.getAttribute('data-num');
|
||||
var el = document.querySelectorAll('#file_list li')[n];
|
||||
el.parentNode.removeChild(el);
|
||||
axupimgs.res.splice(n,1);
|
||||
});
|
||||
});
|
||||
}
|
||||
reSort();
|
||||
});
|
||||
observ_flist.observe(document.querySelector('#file_list'),{childList:true});
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
26
src/App.vue
@@ -1,13 +1,13 @@
|
||||
<template>
|
||||
<RouterView />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {usePermisstionStroe} from '@/stores/permisstion.js'
|
||||
window.addEventListener('beforeunload', e=>beforeunload(e))
|
||||
const beforeunload = (()=>{
|
||||
const permisstionStore = usePermisstionStroe()
|
||||
permisstionStore.setIsLoadRoutes(true)
|
||||
permisstionStore.setIsSuccessReq()
|
||||
})
|
||||
</script>
|
||||
<template>
|
||||
<RouterView />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {usePermisstionStroe} from '@/stores/permisstion.js'
|
||||
window.addEventListener('beforeunload', e=>beforeunload(e))
|
||||
const beforeunload = (()=>{
|
||||
const permisstionStore = usePermisstionStroe()
|
||||
permisstionStore.setIsLoadRoutes(true)
|
||||
permisstionStore.setIsSuccessReq()
|
||||
})
|
||||
</script>
|
||||
|
||||
36
src/api/article/index.js
Normal file
@@ -0,0 +1,36 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
|
||||
export const getArticle = (params) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/article/list',
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
};
|
||||
export const getArticleDetail = (articleId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/article/${articleId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const addArticle= (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/article/add',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
};
|
||||
export const editArticle= (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/article/update',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
};
|
||||
export const deleteArticle = (articleIds) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/article/${articleIds}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
@@ -1,16 +1,31 @@
|
||||
import request from "@/utils/request.js";
|
||||
|
||||
export const initPassword=(data)=>{
|
||||
return request({
|
||||
url:'/admin/mosr/user/init/password',
|
||||
method:'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
export const editPassword=(data)=>{
|
||||
return request({
|
||||
url:'/admin/mosr/user/update/password',
|
||||
method:'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
import request from "@/utils/request.js";
|
||||
|
||||
export const initPassword=(data)=>{
|
||||
return request({
|
||||
url:'/admin/mosr/user/init/password',
|
||||
method:'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
export const editPassword=(data)=>{
|
||||
return request({
|
||||
url:'/admin/mosr/user/update/password',
|
||||
method:'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export const getAgentInfo=()=>{
|
||||
return request({
|
||||
url:'/admin/mosr/user/self/approval/agent',
|
||||
method:'get'
|
||||
})
|
||||
}
|
||||
|
||||
export const editAgentInfo=(data)=>{
|
||||
return request({
|
||||
url:'/admin/mosr/user/self/approval/agent',
|
||||
method:'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export const getCacheOpt = (cacheKey) => {
|
||||
return request({
|
||||
url: '/admin/dict/data/option/'+ cacheKey,
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
|
||||
export const getCacheType = (cacheKey) => {
|
||||
return request({
|
||||
url: '/admin/dict/data/type/'+ cacheKey,
|
||||
method: 'get',
|
||||
})
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export const getCacheOpt = (cacheKey) => {
|
||||
return request({
|
||||
url: '/admin/dict/data/option/'+ cacheKey,
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
|
||||
export const getCacheType = (cacheKey) => {
|
||||
return request({
|
||||
url: '/admin/dict/data/type/'+ cacheKey,
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export const requestList = ( api, params, method = 'get' ) => {
|
||||
return request({
|
||||
url: api,
|
||||
method,
|
||||
params
|
||||
})
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export const requestList = ( api, params, method = 'get' ) => {
|
||||
return request({
|
||||
url: api,
|
||||
method,
|
||||
params
|
||||
})
|
||||
}
|
||||
@@ -1,54 +1,54 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
//获取部门信息
|
||||
export const getDeptList = (params) => {
|
||||
return request({
|
||||
url: '/admin/dept',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
//获取增加时的部门列表
|
||||
export const getDeptOption = () => {
|
||||
return request({
|
||||
url: '/admin/dept/option',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
//获取修改时的部门列表
|
||||
export const getDeptExcludeOption = (deptId) => {
|
||||
return request({
|
||||
url: `/admin/dept/option/exclude/${deptId}`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
//新增部门
|
||||
export const addDept = (data) => {
|
||||
return request({
|
||||
url: '/admin/dept',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
//编辑部门
|
||||
export const editDept = (data) => {
|
||||
return request({
|
||||
url: '/admin/dept',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
//查询部门详情
|
||||
export const getDeptDetail = (deptId) => {
|
||||
return request({
|
||||
url: `/admin/dept/${deptId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
//删除部门
|
||||
export const deleteDept = (deptId) => {
|
||||
return request({
|
||||
url: `/admin/dept/${deptId}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
//获取部门信息
|
||||
export const getDeptList = (params) => {
|
||||
return request({
|
||||
url: '/admin/dept',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
//获取增加时的部门列表
|
||||
export const getDeptOption = () => {
|
||||
return request({
|
||||
url: '/admin/dept/option',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
//获取修改时的部门列表
|
||||
export const getDeptExcludeOption = (deptId) => {
|
||||
return request({
|
||||
url: `/admin/dept/option/exclude/${deptId}`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
//新增部门
|
||||
export const addDept = (data) => {
|
||||
return request({
|
||||
url: '/admin/dept',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
//编辑部门
|
||||
export const editDept = (data) => {
|
||||
return request({
|
||||
url: '/admin/dept',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
//查询部门详情
|
||||
export const getDeptDetail = (deptId) => {
|
||||
return request({
|
||||
url: `/admin/dept/${deptId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
//删除部门
|
||||
export const deleteDept = (deptId) => {
|
||||
return request({
|
||||
url: `/admin/dept/${deptId}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1,81 +1,107 @@
|
||||
import request from '@/utils/request.js'
|
||||
import axios from "axios";
|
||||
import {getToken} from "@/utils/auth";
|
||||
|
||||
export const addAllocation = (data) => {
|
||||
return request({
|
||||
url:'/workflow/mosr/cost/allocation',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
};
|
||||
export const getAllocationDetail = (allocationId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/cost/allocation/info/${allocationId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getAllocationDetails = (allocationId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/cost/allocation/usr/detail/${allocationId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getAllocationSummaryDetails = (params) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/cost/allocation/collect',
|
||||
method: "get",
|
||||
params:params
|
||||
});
|
||||
};
|
||||
export const getAllocationProcess = () => {
|
||||
return request({
|
||||
url: '/workflow/mosr/cost/allocation/process',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getAllocationDetailList = (params) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/cost/allocation/usr',
|
||||
method: "get",
|
||||
params:params
|
||||
});
|
||||
};
|
||||
export const getResearchUser = () => {
|
||||
return request({
|
||||
url: '/admin/mosr/user/research',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getProjectOption = () => {
|
||||
return request({
|
||||
url: '/workflow/mosr/project/implementation/in/implementation/option',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
export const editAllocation = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/cost/allocation/edit',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
};
|
||||
export const deleteAllocation = (id) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/cost/allocation/${id}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
|
||||
export const shareExportExcel = (allocationId) => {
|
||||
return axios.get(
|
||||
`${import.meta.env.VITE_BASE_URL}/workflow/mosr/cost/allocation/collect/${allocationId}`,
|
||||
{
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
Authorization: getToken()
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
import request from '@/utils/request.js'
|
||||
import axios from "axios";
|
||||
import {getToken} from "@/utils/auth";
|
||||
|
||||
export const addAllocation = (data) => {
|
||||
return request({
|
||||
url:'/workflow/mosr/cost/allocation',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
};
|
||||
export const addShare = (data) => {
|
||||
return request({
|
||||
url:'/workflow/mosr/cost/share',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
};
|
||||
export const getAllocationDetail = (allocationId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/cost/allocation/info/${allocationId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getAllocationDetails = (allocationId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/cost/allocation/usr/detail/${allocationId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getAllocationSummaryDetails = (params) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/cost/allocation/collect',
|
||||
method: "get",
|
||||
params:params
|
||||
});
|
||||
};
|
||||
export const getAllocationProcess = () => {
|
||||
return request({
|
||||
url: '/workflow/mosr/cost/allocation/process',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getAllocationDetailList = (params) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/cost/allocation/usr',
|
||||
method: "get",
|
||||
params:params
|
||||
});
|
||||
};
|
||||
export const getResearchUser = () => {
|
||||
return request({
|
||||
url: '/admin/mosr/user/research',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getProjectOption = () => {
|
||||
return request({
|
||||
url: '/workflow/mosr/project/implementation/in/implementation/option',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
export const editAllocation = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/cost/allocation/edit',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
};
|
||||
export const applyCcSend = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/cc/send',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
};
|
||||
export const deleteAllocation = (id) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/cost/allocation/${id}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
|
||||
export const shareExportExcel = (allocationId) => {
|
||||
return axios.get(
|
||||
`${import.meta.env.VITE_BASE_URL}/workflow/mosr/cost/allocation/collect/${allocationId}`,
|
||||
{
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
Authorization: getToken()
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
export const shareDetailExport= (data) => {
|
||||
return axios.post(
|
||||
`${import.meta.env.VITE_BASE_URL}/workflow/mosr/cost/share/export`,
|
||||
data, {
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
Authorization: getToken()
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
@@ -1,8 +1,31 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export const getHomeInfo = () => {
|
||||
return request({
|
||||
url: '/workflow/mosr/process/task',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export const getHomeTaskInfo = () => {
|
||||
return request({
|
||||
url: '/workflow/mosr/process/task',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
//获取已办数据
|
||||
export const getDoneTaskInfo = () => {
|
||||
return request({
|
||||
url: '/workflow/mosr/process/task/about',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
//获取专项资金饼图数据
|
||||
export const getSpecialFundChart = () => {
|
||||
return request({
|
||||
url: '/workflow/home/page/statistic',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
//获取首页四个统计数量
|
||||
export const getHomeStatistics = () => {
|
||||
return request({
|
||||
url: '/workflow/mosr/process/task/statistics',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1,44 +1,44 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
// 获取list
|
||||
export const getIPBlackList = (params) => {
|
||||
return request({
|
||||
url: '/admin/ip/back',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
// 新增
|
||||
export const addIPBlack = (data) => {
|
||||
return request({
|
||||
url: '/admin/ip/back',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改
|
||||
export const editIPBlack = (data) => {
|
||||
return request({
|
||||
url: '/admin/ip/back',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除
|
||||
export const delIPBlack = (ids) => {
|
||||
return request({
|
||||
url: '/admin/ip/back/'+ids,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 详情
|
||||
export const getIPBlackDetail = (id) => {
|
||||
return request({
|
||||
url: '/admin/ip/back/'+id,
|
||||
method: 'get'
|
||||
})
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
// 获取list
|
||||
export const getIPBlackList = (params) => {
|
||||
return request({
|
||||
url: '/admin/ip/back',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
// 新增
|
||||
export const addIPBlack = (data) => {
|
||||
return request({
|
||||
url: '/admin/ip/back',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改
|
||||
export const editIPBlack = (data) => {
|
||||
return request({
|
||||
url: '/admin/ip/back',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除
|
||||
export const delIPBlack = (ids) => {
|
||||
return request({
|
||||
url: '/admin/ip/back/'+ids,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 详情
|
||||
export const getIPBlackDetail = (id) => {
|
||||
return request({
|
||||
url: '/admin/ip/back/'+id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
@@ -1,24 +1,24 @@
|
||||
import request from "@/utils/request.js";
|
||||
|
||||
//查询登录日志
|
||||
export const getLoginLogList = (params) => {
|
||||
return request({
|
||||
url: "/log/login-info/list",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
};
|
||||
//查询登录日志详情
|
||||
export const getLoginLogDetail = (infoId) => {
|
||||
return request({
|
||||
url: `/log/login-info/${infoId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
//删除登录日志
|
||||
export const deleteLoginLog = (infoIds) => {
|
||||
return request({
|
||||
url: `/log/login-info/${infoIds}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
import request from "@/utils/request.js";
|
||||
|
||||
//查询登录日志
|
||||
export const getLoginLogList = (params) => {
|
||||
return request({
|
||||
url: "/log/login-info/list",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
};
|
||||
//查询登录日志详情
|
||||
export const getLoginLogDetail = (infoId) => {
|
||||
return request({
|
||||
url: `/log/login-info/${infoId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
//删除登录日志
|
||||
export const deleteLoginLog = (infoIds) => {
|
||||
return request({
|
||||
url: `/log/login-info/${infoIds}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
import request from "@/utils/request.js";
|
||||
|
||||
//查询操作日志
|
||||
export const getOperateLog = (params) => {
|
||||
return request({
|
||||
url: "/log/log/list",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
};
|
||||
//查询操作日志详情
|
||||
export const getOperateLogDetail = (operId) => {
|
||||
return request({
|
||||
url: `/log/log/${operId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
//删除操作日志
|
||||
export const deleteOperateLog = (operIds) => {
|
||||
return request({
|
||||
url: `/log/log/${operIds}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
import request from "@/utils/request.js";
|
||||
|
||||
//查询操作日志
|
||||
export const getOperateLog = (params) => {
|
||||
return request({
|
||||
url: "/log/log/list",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
};
|
||||
//查询操作日志详情
|
||||
export const getOperateLogDetail = (operId) => {
|
||||
return request({
|
||||
url: `/log/log/${operId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
//删除操作日志
|
||||
export const deleteOperateLog = (operIds) => {
|
||||
return request({
|
||||
url: `/log/log/${operIds}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1,36 +1,36 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export const getCodeImg = () => {
|
||||
return request({
|
||||
url: '/auth/captchaImage',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
export const login = (data) => {
|
||||
return request({
|
||||
url: '/auth/login',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
export const switchAccount = (userId) => {
|
||||
return request({
|
||||
url: `/auth/switch/account/${userId}`,
|
||||
method: 'post',
|
||||
})
|
||||
}
|
||||
|
||||
export const getUserInfo = () => {
|
||||
return request({
|
||||
url: '/auth/info',
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
export const getAuthInfo = () => {
|
||||
return request({
|
||||
url: '/admin/mosr/user/detail/info',
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export const getCodeImg = () => {
|
||||
return request({
|
||||
url: '/auth/captchaImage',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
export const login = (data) => {
|
||||
return request({
|
||||
url: '/auth/login',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
export const switchAccount = (userId) => {
|
||||
return request({
|
||||
url: `/auth/switch/account/${userId}`,
|
||||
method: 'post',
|
||||
})
|
||||
}
|
||||
|
||||
export const getUserInfo = () => {
|
||||
return request({
|
||||
url: '/auth/info',
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
export const getAuthInfo = () => {
|
||||
return request({
|
||||
url: '/admin/mosr/user/detail/info',
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,30 +1,30 @@
|
||||
import request from '@/utils/request.js'
|
||||
export const getNoticeList = (params) => {
|
||||
return request({
|
||||
url: '/notice/notice',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
export const getNoticeDetail = (noticeId) => {
|
||||
return request({
|
||||
url: '/notice/notice/'+noticeId,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
export const addNotice = (data) => {
|
||||
return request({
|
||||
url: '/notice/notice',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export const deleteNotice = (noticeId) => {
|
||||
return request({
|
||||
url: `/notice/notice/${noticeId}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
import request from '@/utils/request.js'
|
||||
export const getNoticeList = (params) => {
|
||||
return request({
|
||||
url: '/notice/notice',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
export const getNoticeDetail = (noticeId) => {
|
||||
return request({
|
||||
url: '/notice/notice/'+noticeId,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
export const addNotice = (data) => {
|
||||
return request({
|
||||
url: '/notice/notice',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export const deleteNotice = (noticeId) => {
|
||||
return request({
|
||||
url: `/notice/notice/${noticeId}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1,43 +1,43 @@
|
||||
import request from '@/utils/request.js'
|
||||
export const getNotifyList = (params) => {
|
||||
return request({
|
||||
url: '/notice/notify',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
export const getNotifyDetail = (noticeId) => {
|
||||
return request({
|
||||
url: '/notice/notify/'+noticeId,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
//已读单个消息
|
||||
export const readSingleNotify = (noticeId) => {
|
||||
return request({
|
||||
url: '/notice/notify/read/'+noticeId,
|
||||
method: 'put'
|
||||
})
|
||||
}
|
||||
//已读全部消息
|
||||
export const readAllNotify = () => {
|
||||
return request({
|
||||
url: '/notice/notify/read/all',
|
||||
method: 'put'
|
||||
})
|
||||
}
|
||||
//删除单个消息
|
||||
export const deleteSingleNotify = (noticeId) => {
|
||||
return request({
|
||||
url: '/notice/notify/'+noticeId,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
//删除多个消息
|
||||
export const deleteMoreNotify = (noticeIds) => {
|
||||
return request({
|
||||
url: '/notice/notify/batch/'+noticeIds,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
|
||||
import request from '@/utils/request.js'
|
||||
export const getNotifyList = (params) => {
|
||||
return request({
|
||||
url: '/notice/notify',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
export const getNotifyDetail = (noticeId) => {
|
||||
return request({
|
||||
url: '/notice/notify/'+noticeId,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
//已读单个消息
|
||||
export const readSingleNotify = (noticeId) => {
|
||||
return request({
|
||||
url: '/notice/notify/read/'+noticeId,
|
||||
method: 'put'
|
||||
})
|
||||
}
|
||||
//已读全部消息
|
||||
export const readAllNotify = () => {
|
||||
return request({
|
||||
url: '/notice/notify/read/all',
|
||||
method: 'put'
|
||||
})
|
||||
}
|
||||
//删除单个消息
|
||||
export const deleteSingleNotify = (noticeId) => {
|
||||
return request({
|
||||
url: '/notice/notify/'+noticeId,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
//删除多个消息
|
||||
export const deleteMoreNotify = (noticeIds) => {
|
||||
return request({
|
||||
url: '/notice/notify/batch/'+noticeIds,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
import request from "@/utils/request.js";
|
||||
//查询在线用户
|
||||
export const getOnlineList = (params) => {
|
||||
return request({
|
||||
url: "/admin/online/user",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
};
|
||||
|
||||
//强制退出用户
|
||||
export const deleteOnlineUser= (tokenId) => {
|
||||
return request({
|
||||
url: '/admin/online/user/'+tokenId,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
import request from "@/utils/request.js";
|
||||
//查询在线用户
|
||||
export const getOnlineList = (params) => {
|
||||
return request({
|
||||
url: "/admin/online/user",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
};
|
||||
|
||||
//强制退出用户
|
||||
export const deleteOnlineUser= (tokenId) => {
|
||||
return request({
|
||||
url: '/admin/online/user/'+tokenId,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1,48 +1,48 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
//获取岗位信息
|
||||
export const getPostList = (params) => {
|
||||
return request({
|
||||
url: '/admin/post',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
//查询岗位详情
|
||||
export const getPostDetail = (postId) => {
|
||||
return request({
|
||||
url: `/admin/post/info/${postId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
//新增岗位
|
||||
export const addPost = (data) => {
|
||||
return request({
|
||||
url: '/admin/post',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
//编辑岗位
|
||||
export const editPost = (data) => {
|
||||
return request({
|
||||
url: '/admin/post',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
//获取select下拉框数据
|
||||
export const getSelectOption = () => {
|
||||
return request({
|
||||
url: '/admin/post/option',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
//删除角色信息
|
||||
export const deletePost = (postId) => {
|
||||
return request({
|
||||
url: `/admin/post/${postId}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
//获取岗位信息
|
||||
export const getPostList = (params) => {
|
||||
return request({
|
||||
url: '/admin/post',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
//查询岗位详情
|
||||
export const getPostDetail = (postId) => {
|
||||
return request({
|
||||
url: `/admin/post/info/${postId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
//新增岗位
|
||||
export const addPost = (data) => {
|
||||
return request({
|
||||
url: '/admin/post',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
//编辑岗位
|
||||
export const editPost = (data) => {
|
||||
return request({
|
||||
url: '/admin/post',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
//获取select下拉框数据
|
||||
export const getSelectOption = () => {
|
||||
return request({
|
||||
url: '/admin/post/option',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
//删除角色信息
|
||||
export const deletePost = (postId) => {
|
||||
return request({
|
||||
url: `/admin/post/${postId}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1,90 +1,128 @@
|
||||
import request from '@/utils/request.js'
|
||||
//需求征集
|
||||
export const getDemandInfo = (param) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/requirement',
|
||||
method: "get",
|
||||
params: param
|
||||
});
|
||||
};
|
||||
export const getWorkflowInfo = () => {
|
||||
return request({
|
||||
url: '/workflow/mosr/requirement/process',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getInfo = (requirementId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/requirement/info/${requirementId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getFormInfo = (requirementId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/requirement/form/${requirementId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const agreeTask = (data) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/process/task/agree`,
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const rejectTask = (data) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/process/task/reject`,
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
export const addRequirement = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/requirement',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const resubmit = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/requirement/resubmit',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const deleteFile = (fileId) => {
|
||||
return request({
|
||||
url: `/workflow/process/file/delete/${fileId}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
export const downloadFile = (fileId) => {
|
||||
return request({
|
||||
url: '/workflow/process/file/download',
|
||||
method: "get",
|
||||
responseType:'blob',
|
||||
params:{
|
||||
fileId:fileId
|
||||
}
|
||||
});
|
||||
};
|
||||
export const getCompanyOption = () => {
|
||||
return request({
|
||||
url: '/admin/mosr/sub/company/companyOption',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const deleteDemand = (id) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/requirement/${id}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
export const getRequirementStatePerm = () => {
|
||||
return request({
|
||||
url: '/workflow/mosr/requirement/prem/state',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
import request from '@/utils/request.js'
|
||||
import axios from "axios";
|
||||
import {getToken} from "@/utils/auth";
|
||||
|
||||
//需求征集
|
||||
export const getDemandInfo = (param) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/requirement',
|
||||
method: "get",
|
||||
params: param
|
||||
});
|
||||
};
|
||||
export const filterRequirementName = (requirementName) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/requirement/match/${requirementName}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getWorkflowInfo = () => {
|
||||
return request({
|
||||
url: '/workflow/mosr/requirement/process',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getInfo = (requirementId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/requirement/info/${requirementId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getFormInfo = (requirementId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/requirement/form/${requirementId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const agreeTask = (data) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/process/task/agree`,
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const rejectTask = (data) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/process/task/reject`,
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
export const addRequirement = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/requirement',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const resubmit = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/requirement/resubmit',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const deleteFile = (fileId) => {
|
||||
return request({
|
||||
url: `/workflow/process/file/delete/${fileId}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
export const downloadFile = (fileId) => {
|
||||
return request({
|
||||
url: '/workflow/process/file/download',
|
||||
method: "get",
|
||||
responseType:'blob',
|
||||
params:{
|
||||
fileId:fileId
|
||||
}
|
||||
});
|
||||
};
|
||||
export const getCompanyOption = () => {
|
||||
return request({
|
||||
url: '/admin/mosr/sub/company/companyOption',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const deleteDemand = (id) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/requirement/${id}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
export const getRequirementStatePerm = () => {
|
||||
return request({
|
||||
url: '/workflow/mosr/requirement/prem/state',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const downloadTemplate = (type) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/attachment/download/template',
|
||||
method: "get",
|
||||
responseType:'blob',
|
||||
params:{
|
||||
type:type
|
||||
}
|
||||
});
|
||||
};
|
||||
export const downloadTemplateZip = (typeList) => {
|
||||
return axios.get(
|
||||
`${import.meta.env.VITE_BASE_URL}/workflow/mosr/attachment/download/pack?typeList=${typeList}`,
|
||||
{
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
Authorization: getToken()
|
||||
},
|
||||
}
|
||||
);
|
||||
// return request({
|
||||
// url: '/workflow/mosr/attachment/download/pack',
|
||||
// method: "get",
|
||||
// responseType:'blob',
|
||||
// params:{
|
||||
// typeList:typeList
|
||||
// }
|
||||
// });
|
||||
};
|
||||
|
||||
@@ -1,91 +1,185 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
export const fileUp = (url, data) => {
|
||||
return request({
|
||||
url,
|
||||
method: 'post',
|
||||
data,
|
||||
headers: {
|
||||
'Content-Type': 'multipart/form-data'
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export const requirementReported = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/requirement/reported',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
//获取需求上报 流程信息
|
||||
export const getProcessInfo = (specialFund) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/requirement/collect/process/${specialFund}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getDetail = (projectId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/requirement/collect/info/${projectId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
export const resubmitReported = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/requirement/collect/resubmit',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
export const getCollectAttachment = (params) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/requirement/collect/attachments',
|
||||
method: "get",
|
||||
params:params
|
||||
});
|
||||
};
|
||||
export const uploadCollectAttachment= (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/requirement/collect/upload',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
// 年度计划
|
||||
export const addPlan= (data) => {
|
||||
return request({
|
||||
url: '/workflow/annual/plan',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const editPlan= (data) => {
|
||||
return request({
|
||||
url: '/workflow/annual/plan',
|
||||
method: "put",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const getPlan= (annualPlanId) => {
|
||||
return request({
|
||||
url: `/workflow/annual/plan/info/${annualPlanId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const deletePlan= (annualPlanId) => {
|
||||
return request({
|
||||
url: `/workflow/annual/plan/${annualPlanId}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
export const approvePlan= (data) => {
|
||||
return request({
|
||||
url: '/workflow/annual/plan/approve',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
import request from '@/utils/request'
|
||||
|
||||
export const fileUp = (url, data) => {
|
||||
return request({
|
||||
url,
|
||||
method: 'post',
|
||||
data,
|
||||
headers: {
|
||||
'Content-Type': 'multipart/form-data'
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export const requirementReported = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/requirement/reported',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
//需求汇总-征集名称关键词匹配
|
||||
export const getRequirementName = (requirementName) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/requirement/collect/project/match/${requirementName}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
//需求汇总-项目名称关键词匹配
|
||||
export const getProjectName = (projectName) => {
|
||||
return request({
|
||||
url: `workflow/mosr/requirement/collect`,
|
||||
method: "get",
|
||||
params:{
|
||||
projectName:projectName
|
||||
}
|
||||
});
|
||||
};
|
||||
//获取需求上报 流程信息
|
||||
export const getProcessInfo = (specialFund) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/requirement/collect/process/${specialFund}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getDetail = (projectId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/requirement/collect/info/${projectId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
export const resubmitReported = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/requirement/collect/resubmit',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
export const getCollectAttachment = (params) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/requirement/collect/attachments',
|
||||
method: "get",
|
||||
params:params
|
||||
});
|
||||
};
|
||||
export const uploadCollectAttachment= (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/requirement/collect/upload',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
// 项目计划
|
||||
export const addPlan= (data) => {
|
||||
return request({
|
||||
url: '/workflow/annual/plan',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const editPlan= (data) => {
|
||||
return request({
|
||||
url: '/workflow/annual/plan',
|
||||
method: "put",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const getPlan= (annualPlanId) => {
|
||||
return request({
|
||||
url: `/workflow/annual/plan/info/${annualPlanId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const deletePlan= (annualPlanId) => {
|
||||
return request({
|
||||
url: `/workflow/annual/plan/${annualPlanId}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
export const approvePlan= (data) => {
|
||||
return request({
|
||||
url: '/workflow/annual/plan/approve',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
export const getProjectOption = (projectName) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/requirement/master',
|
||||
method: "get",
|
||||
params:{
|
||||
projectName:projectName
|
||||
}
|
||||
});
|
||||
};
|
||||
export const getMasterProjectNameOption = (masterProjectName) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/payment/master/option',
|
||||
method: "get",
|
||||
params:{
|
||||
masterProjectName:masterProjectName
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
export const getSubprojectNameOption = (subProjectName) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/payment/sub/option',
|
||||
method: "get",
|
||||
params:{
|
||||
subProjectName:subProjectName
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
export const getExpenseMasterProjectNameOption = (masterProjectName) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/rd/expense/master/option',
|
||||
method: "get",
|
||||
params:{
|
||||
masterProjectName:masterProjectName
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
export const getExpenseSubprojectNameOption = (subProjectName) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/rd/expense/sub/option',
|
||||
method: "get",
|
||||
params:{
|
||||
subProjectName:subProjectName
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
export const getCostMasterProjectNameOption = (masterProjectName) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/cost/share/master/option',
|
||||
method: "get",
|
||||
params:{
|
||||
masterProjectName:masterProjectName
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
export const getCostSubprojectNameOption = (subProjectName) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/cost/share/sub/option',
|
||||
method: "get",
|
||||
params:{
|
||||
subProjectName:subProjectName
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
export const getRequirementOption = () => {
|
||||
return request({
|
||||
url: '/workflow/mosr/requirement/option',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1,31 +1,38 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
|
||||
export const searchFileList = (params) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/attachment/list`,
|
||||
method: "get",
|
||||
params: params
|
||||
});
|
||||
};
|
||||
export const uploadFileList = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/attachment/upload',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const searchImplementationFileList = (params) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/attachment/implementation/list',
|
||||
method: "get",
|
||||
params: params
|
||||
});
|
||||
};
|
||||
export const switchAttachmentState = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/project/filing/attachment/switch',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
};
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
|
||||
export const searchFileList = (params) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/attachment/list`,
|
||||
method: "get",
|
||||
params: params
|
||||
});
|
||||
};
|
||||
export const searchAllFileList = (params) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/attachment/all',
|
||||
method: "get",
|
||||
params: params
|
||||
});
|
||||
};
|
||||
export const uploadFileList = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/attachment/upload',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const searchImplementationFileList = (params) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/attachment/implementation/list',
|
||||
method: "get",
|
||||
params: params
|
||||
});
|
||||
};
|
||||
export const switchAttachmentState = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/project/filing/attachment/switch',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1,181 +1,240 @@
|
||||
import request from '@/utils/request.js'
|
||||
import axios from "axios";
|
||||
import {getToken} from "@/utils/auth";
|
||||
//项目立项
|
||||
export const getApplyProcess = (projectId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/project/approval/initiation/process/${projectId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const projectApply = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/project/approval/initiation/apply',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const getApplyDetail = (ProjectId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/project/approval/info/${ProjectId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
export const resubmitApply = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/project/approval/initiation/resubmit',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const getInitiationAttachment = (params) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/project/approval/attachments',
|
||||
method: "get",
|
||||
params: params
|
||||
});
|
||||
};
|
||||
//项目实施
|
||||
export const getCheckDetail = (projectId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/project/implementation/info/${projectId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const resubmitCheck = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/project/implementation/resubmit',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
export const projectCheck = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/project/implementation/initiation/check',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const getProjectCheckProcess = (projectId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/project/implementation/process/${projectId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
export const addLedger = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/expense/ledger',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
export const getTags = (projectId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/attachment/option/${projectId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getPhaseProcess = () => {
|
||||
return request({
|
||||
url: '/workflow/phase/change/process',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const submitPhaseChange = (data) => {
|
||||
return request({
|
||||
url: '/workflow/phase/change',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const getPhaseDetail = (projectId) => {
|
||||
return request({
|
||||
url: `/workflow/phase/change/info/${projectId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getPhaseForm = (projectId) => {
|
||||
return request({
|
||||
url: `/workflow/phase/change/from/${projectId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const resubmitPhaseForm = (data) => {
|
||||
return request({
|
||||
url: '/workflow/phase/change/resubmit',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
//项目归档
|
||||
export const getConclusionDetail = (ProjectId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/project/filing/info/${ProjectId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const resubmitConclusion = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/project/filing/resubmit',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
export const projectConclusion = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/project/filing/project/entry',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const getProjectConclusionProcess = () => {
|
||||
return request({
|
||||
url: '/workflow/mosr/project/filing/process',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
//获取前置流程
|
||||
export const getPreProcess = () => {
|
||||
return request({
|
||||
url: '/workflow/details/pre/process',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const updateLedger = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/expense/ledger/replenishment',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const searchUpdateLedgerData = (projectId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/expense/ledger/${projectId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
//
|
||||
// export const searchUpdateLedgerData = (projectId) => {
|
||||
// return request({
|
||||
// url: '/workflow/mosr/expense/ledger/import',
|
||||
// method: "get"
|
||||
// });
|
||||
// };
|
||||
|
||||
export const exportExcel = (data) => {
|
||||
return axios.post(
|
||||
`${import.meta.env.VITE_BASE_URL}/workflow/mosr/project/implementation/export`,
|
||||
data, {
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
Authorization: getToken()
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
import request from '@/utils/request.js'
|
||||
import axios from "axios";
|
||||
import {getToken} from "@/utils/auth";
|
||||
//项目立项
|
||||
export const getApplyProcess = (projectId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/project/approval/initiation/process/${projectId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const filterProjectName = (projectName,targetState) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/project/approval/match/${projectName}/${targetState}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const projectApply = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/project/approval/initiation/apply',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const getApplyDetail = (ProjectId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/project/approval/info/${ProjectId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
export const resubmitApply = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/project/approval/initiation/resubmit',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const getInitiationAttachment = (params) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/project/approval/attachments',
|
||||
method: "get",
|
||||
params: params
|
||||
});
|
||||
};
|
||||
//项目实施
|
||||
export const getCheckDetail = (projectId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/project/implementation/info/${projectId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const resubmitCheck = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/project/implementation/resubmit',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
export const projectCheck = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/project/implementation/initiation/check',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const getProjectCheckProcess = (projectId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/project/implementation/process/${projectId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
export const addLedger = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/expense/ledger',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
export const getTags = (projectId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/attachment/option/${projectId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getTagList = (projectId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/file/tag/list`,
|
||||
method: "get",
|
||||
params:{
|
||||
projectId: projectId
|
||||
}
|
||||
});
|
||||
};
|
||||
export const addTag = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/file/tag/add',
|
||||
method: "post",
|
||||
data:data
|
||||
});
|
||||
};
|
||||
export const updateTag = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/file/tag/update',
|
||||
method: "post",
|
||||
data:data
|
||||
});
|
||||
};
|
||||
export const delTag = (tageId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/file/tag/${tageId}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
export const getPhaseProcess = () => {
|
||||
return request({
|
||||
url: '/workflow/phase/change/process',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const submitPhaseChange = (data) => {
|
||||
return request({
|
||||
url: '/workflow/phase/change',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const getPhaseDetail = (projectId) => {
|
||||
return request({
|
||||
url: `/workflow/phase/change/info/${projectId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getPhaseForm = (projectId) => {
|
||||
return request({
|
||||
url: `/workflow/phase/change/from/${projectId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const resubmitPhaseForm = (data) => {
|
||||
return request({
|
||||
url: '/workflow/phase/change/resubmit',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
//项目归档
|
||||
export const getConclusionDetail = (ProjectId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/project/filing/info/${ProjectId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const resubmitConclusion = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/project/filing/resubmit',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
export const projectConclusion = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/project/filing/project/entry',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const getProjectConclusionProcess = () => {
|
||||
return request({
|
||||
url: '/workflow/mosr/project/filing/process',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
//获取前置流程
|
||||
export const getPreProcess = () => {
|
||||
return request({
|
||||
url: '/workflow/details/pre/process',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const updateLedger = (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/expense/ledger/replenishment',
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
};
|
||||
export const searchUpdateLedgerData = (projectId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/expense/ledger/${projectId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
//
|
||||
// export const searchUpdateLedgerData = (projectId) => {
|
||||
// return request({
|
||||
// url: '/workflow/mosr/expense/ledger/import',
|
||||
// method: "get"
|
||||
// });
|
||||
// };
|
||||
|
||||
export const exportExcel = (data) => {
|
||||
return axios.post(
|
||||
`${import.meta.env.VITE_BASE_URL}/workflow/mosr/project/implementation/export`,
|
||||
data, {
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
Authorization: getToken()
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
//台账模板下载
|
||||
export const ledgerTemplateDownload = () => {
|
||||
return axios.get(
|
||||
`${import.meta.env.VITE_BASE_URL}/workflow/mosr/project/implementation/download/template`,
|
||||
{
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
Authorization: getToken()
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
//费用明细模板下载
|
||||
export const costTemplateDownload = () => {
|
||||
return axios.get(
|
||||
`${import.meta.env.VITE_BASE_URL}/workflow/mosr/rd/expense/download/template`,
|
||||
{
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
Authorization: getToken()
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
@@ -1,68 +1,68 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export const getTableList = (params) => {
|
||||
return request({
|
||||
url: '/code-gen/table',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
export const getDynamicTable = (params) => {
|
||||
return request({
|
||||
url: '/code-gen/dynamic-table',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
export const getTableDetail = (tableId) => {
|
||||
return request({
|
||||
url: `/code-gen/table/${tableId}`,
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
|
||||
export const previewCode = (tableId) => {
|
||||
return request({
|
||||
url: `/code-gen/table/preview/${tableId}`,
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
export const deleteMoreTable = (params) => {
|
||||
return request({
|
||||
url: '/code-gen/table',
|
||||
method: 'delete',
|
||||
params
|
||||
})
|
||||
}
|
||||
export const deleteTable = (tableId) => {
|
||||
return request({
|
||||
url: `/code-gen/table/${tableId}`,
|
||||
method: 'delete',
|
||||
})
|
||||
}
|
||||
export const importTable = (data) => {
|
||||
return request({
|
||||
url: "/code-gen/table/import-table",
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export const editCodeGen = (data) => {
|
||||
return request({
|
||||
url: '/code-gen/table',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
export const syncDatabase = (tableId) => {
|
||||
return request({
|
||||
url: '/code-gen/table/sync/'+tableId,
|
||||
method: 'put'
|
||||
})
|
||||
}
|
||||
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export const getTableList = (params) => {
|
||||
return request({
|
||||
url: '/code-gen/table',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
export const getDynamicTable = (params) => {
|
||||
return request({
|
||||
url: '/code-gen/dynamic-table',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
export const getTableDetail = (tableId) => {
|
||||
return request({
|
||||
url: `/code-gen/table/${tableId}`,
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
|
||||
export const previewCode = (tableId) => {
|
||||
return request({
|
||||
url: `/code-gen/table/preview/${tableId}`,
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
export const deleteMoreTable = (params) => {
|
||||
return request({
|
||||
url: '/code-gen/table',
|
||||
method: 'delete',
|
||||
params
|
||||
})
|
||||
}
|
||||
export const deleteTable = (tableId) => {
|
||||
return request({
|
||||
url: `/code-gen/table/${tableId}`,
|
||||
method: 'delete',
|
||||
})
|
||||
}
|
||||
export const importTable = (data) => {
|
||||
return request({
|
||||
url: "/code-gen/table/import-table",
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export const editCodeGen = (data) => {
|
||||
return request({
|
||||
url: '/code-gen/table',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
export const syncDatabase = (tableId) => {
|
||||
return request({
|
||||
url: '/code-gen/table/sync/'+tableId,
|
||||
method: 'put'
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -1,54 +1,54 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
|
||||
export const getDataSourceList = (params) => {
|
||||
return request({
|
||||
url: '/code-gen/data-source',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
export const getDataSourceOption = () => {
|
||||
return request({
|
||||
url: '/code-gen/data-source/option',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export const getDataSourceOptionType=()=>{
|
||||
return request({
|
||||
url:'/code-gen/data-source/option/type',
|
||||
method:'get'
|
||||
})
|
||||
}
|
||||
|
||||
export const getDataSource = (dsId) => {
|
||||
return request({
|
||||
url: `/code-gen/data-source/${dsId}`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export const addDataSource = (data) => {
|
||||
return request({
|
||||
url: '/code-gen/data-source',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
export const editDataSource = (data) => {
|
||||
return request({
|
||||
url: '/code-gen/data-source',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export const deleteDataSource = (dsId) => {
|
||||
return request({
|
||||
url: `/code-gen/data-source/${dsId}`,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
|
||||
export const getDataSourceList = (params) => {
|
||||
return request({
|
||||
url: '/code-gen/data-source',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
export const getDataSourceOption = () => {
|
||||
return request({
|
||||
url: '/code-gen/data-source/option',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export const getDataSourceOptionType=()=>{
|
||||
return request({
|
||||
url:'/code-gen/data-source/option/type',
|
||||
method:'get'
|
||||
})
|
||||
}
|
||||
|
||||
export const getDataSource = (dsId) => {
|
||||
return request({
|
||||
url: `/code-gen/data-source/${dsId}`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export const addDataSource = (data) => {
|
||||
return request({
|
||||
url: '/code-gen/data-source',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
export const editDataSource = (data) => {
|
||||
return request({
|
||||
url: '/code-gen/data-source',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export const deleteDataSource = (dsId) => {
|
||||
return request({
|
||||
url: `/code-gen/data-source/${dsId}`,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -1,52 +1,52 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
// 请求校验规则表list
|
||||
export const getRegularList = (params) => {
|
||||
return request({
|
||||
url: '/code-gen/rapid/regular',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
// 获取校验规则表详情
|
||||
export const getRegularDetails = (regularId) => {
|
||||
return request({
|
||||
url: '/code-gen/rapid/regular/' + regularId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 获取校验规则选项列表
|
||||
export const getRegularOpt = (regularId) => {
|
||||
return request({
|
||||
url: '/code-gen/rapid/regular/option',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增校验规则表
|
||||
export const addRegular = (data) => {
|
||||
return request({
|
||||
url: '/code-gen/rapid/regular',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改校验规则表
|
||||
export const editRegular = (data) => {
|
||||
return request({
|
||||
url: '/code-gen/rapid/regular',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除校验规则表
|
||||
export const delRegular =(regularId) => {
|
||||
return request({
|
||||
url: '/code-gen/rapid/regular/' + regularId,
|
||||
method: 'delete'
|
||||
})
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
// 请求校验规则表list
|
||||
export const getRegularList = (params) => {
|
||||
return request({
|
||||
url: '/code-gen/rapid/regular',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
// 获取校验规则表详情
|
||||
export const getRegularDetails = (regularId) => {
|
||||
return request({
|
||||
url: '/code-gen/rapid/regular/' + regularId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 获取校验规则选项列表
|
||||
export const getRegularOpt = (regularId) => {
|
||||
return request({
|
||||
url: '/code-gen/rapid/regular/option',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增校验规则表
|
||||
export const addRegular = (data) => {
|
||||
return request({
|
||||
url: '/code-gen/rapid/regular',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改校验规则表
|
||||
export const editRegular = (data) => {
|
||||
return request({
|
||||
url: '/code-gen/rapid/regular',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除校验规则表
|
||||
export const delRegular =(regularId) => {
|
||||
return request({
|
||||
url: '/code-gen/rapid/regular/' + regularId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
36
src/api/research-fund/index.js
Normal file
@@ -0,0 +1,36 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
|
||||
export const getResearchFundChart = (year) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/rd/home',
|
||||
method: 'get',
|
||||
params: {year:year}
|
||||
})
|
||||
}
|
||||
export const getResearchFundDetail = (rdFundId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/rd/${rdFundId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const addResearchFund= (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/rd/add',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
};
|
||||
export const editResearchFund= (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/rd/update',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
};
|
||||
export const deleteResearchFund = (rdFundIds) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/rd/${rdFundIds}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
@@ -1,110 +1,110 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export const getRoleList = (params) => {
|
||||
return request({
|
||||
url: '/admin/role',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
//查询角色option
|
||||
export const getRoleOption = () => {
|
||||
return request({
|
||||
url: '/admin/role/option',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
export const getTemRoleOption = () => {
|
||||
return request({
|
||||
url: '/admin/role/option/template',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
//查询角色信息
|
||||
export const getRoleDetail = (roleId) => {
|
||||
return request({
|
||||
url: `/admin/role/${roleId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
//根据菜单id获取分配的角色信息
|
||||
export const getRoleInfoByMenuId = (params) => {
|
||||
return request({
|
||||
url: '/admin/role/menu',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
//获取排除在外的角色
|
||||
export const getRoleExcludeMenuId = (params) => {
|
||||
return request({
|
||||
url: '/admin/role/menu/list',
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
};
|
||||
|
||||
// 新增修改
|
||||
export const operate = (data) => {
|
||||
if(data.roleId) return editRole(data)
|
||||
return addRole(data)
|
||||
}
|
||||
|
||||
// 新增角色
|
||||
export const addRole = (data) => {
|
||||
return request({
|
||||
url: '/admin/role',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改角色
|
||||
export const editRole = (data) => {
|
||||
return request({
|
||||
url: '/admin/role',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
//解除当前角色对应的所有菜单的绑定关系
|
||||
export const unbindAllRole = (menuId) => {
|
||||
return request({
|
||||
url: '/admin/role/all/unbind/menu',
|
||||
method: 'put',
|
||||
data: {
|
||||
id: menuId
|
||||
}
|
||||
})
|
||||
}
|
||||
// 解除角色与菜单之间的绑定状态
|
||||
export const cancelAuthorization = (menuId, roleIds) => {
|
||||
return request({
|
||||
url: '/admin/role/unbind/menu',
|
||||
method: 'put',
|
||||
data: {
|
||||
id: menuId,
|
||||
ids: roleIds
|
||||
}
|
||||
})
|
||||
}
|
||||
//建立角色用户绑定关系
|
||||
export const bindRoleAndMenu = (menuId, roleIds) => {
|
||||
return request({
|
||||
url: '/admin/role/bind/menu',
|
||||
method: 'put',
|
||||
data: {
|
||||
id: menuId,
|
||||
ids: roleIds
|
||||
}
|
||||
})
|
||||
}
|
||||
//删除角色信息
|
||||
export const deleteRole = (roleId) => {
|
||||
return request({
|
||||
url: `/admin/role/${roleId}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export const getRoleList = (params) => {
|
||||
return request({
|
||||
url: '/admin/role',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
//查询角色option
|
||||
export const getRoleOption = () => {
|
||||
return request({
|
||||
url: '/admin/role/option',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
export const getTemRoleOption = () => {
|
||||
return request({
|
||||
url: '/admin/role/option/template',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
//查询角色信息
|
||||
export const getRoleDetail = (roleId) => {
|
||||
return request({
|
||||
url: `/admin/role/${roleId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
//根据菜单id获取分配的角色信息
|
||||
export const getRoleInfoByMenuId = (params) => {
|
||||
return request({
|
||||
url: '/admin/role/menu',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
//获取排除在外的角色
|
||||
export const getRoleExcludeMenuId = (params) => {
|
||||
return request({
|
||||
url: '/admin/role/menu/list',
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
};
|
||||
|
||||
// 新增修改
|
||||
export const operate = (data) => {
|
||||
if(data.roleId) return editRole(data)
|
||||
return addRole(data)
|
||||
}
|
||||
|
||||
// 新增角色
|
||||
export const addRole = (data) => {
|
||||
return request({
|
||||
url: '/admin/role',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改角色
|
||||
export const editRole = (data) => {
|
||||
return request({
|
||||
url: '/admin/role',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
//解除当前角色对应的所有菜单的绑定关系
|
||||
export const unbindAllRole = (menuId) => {
|
||||
return request({
|
||||
url: '/admin/role/all/unbind/menu',
|
||||
method: 'put',
|
||||
data: {
|
||||
id: menuId
|
||||
}
|
||||
})
|
||||
}
|
||||
// 解除角色与菜单之间的绑定状态
|
||||
export const cancelAuthorization = (menuId, roleIds) => {
|
||||
return request({
|
||||
url: '/admin/role/unbind/menu',
|
||||
method: 'put',
|
||||
data: {
|
||||
id: menuId,
|
||||
ids: roleIds
|
||||
}
|
||||
})
|
||||
}
|
||||
//建立角色用户绑定关系
|
||||
export const bindRoleAndMenu = (menuId, roleIds) => {
|
||||
return request({
|
||||
url: '/admin/role/bind/menu',
|
||||
method: 'put',
|
||||
data: {
|
||||
id: menuId,
|
||||
ids: roleIds
|
||||
}
|
||||
})
|
||||
}
|
||||
//删除角色信息
|
||||
export const deleteRole = (roleId) => {
|
||||
return request({
|
||||
url: `/admin/role/${roleId}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1,46 +1,46 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export const getFundDetail = (specialFundId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/special/fund/from/${specialFundId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getFundDetailProcess = (specialFundId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/special/fund/info/${specialFundId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getFundOption = () => {
|
||||
return request({
|
||||
url: '/workflow/mosr/special/fund/option',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getFundProcess = (specialFundId) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/special/fund/process',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const addFund= (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/special/fund',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
};
|
||||
export const resubmitFund= (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/special/fund/resubmit',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
};
|
||||
export const deleteFund = (id) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/special/fund/${id}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export const getFundDetail = (specialFundId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/special/fund/from/${specialFundId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getFundDetailProcess = (specialFundId) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/special/fund/info/${specialFundId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getFundOption = () => {
|
||||
return request({
|
||||
url: '/workflow/mosr/special/fund/option',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getFundProcess = (specialFundId) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/special/fund/process',
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const addFund= (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/special/fund',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
};
|
||||
export const resubmitFund= (data) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/special/fund/resubmit',
|
||||
method: "post",
|
||||
data
|
||||
});
|
||||
};
|
||||
export const deleteFund = (id) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/special/fund/${id}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1,22 +1,30 @@
|
||||
import request from "@/utils/request.js";
|
||||
|
||||
export const getSubCompanyList=(params)=>{
|
||||
return request({
|
||||
url:'/admin/mosr/sub/company',
|
||||
method:'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
export const getDepartmentList=(params)=>{
|
||||
return request({
|
||||
url:'/admin/mosr/department',
|
||||
method:'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
export const getCompanyDetail=(companyId)=>{
|
||||
return request({
|
||||
url:`/admin/mosr/sub/company/info/${companyId}`,
|
||||
method:'get'
|
||||
})
|
||||
}
|
||||
import request from "@/utils/request.js";
|
||||
|
||||
export const getSubCompanyList=(params)=>{
|
||||
return request({
|
||||
url:'/admin/mosr/sub/company',
|
||||
method:'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
export const getDepartmentList=(params)=>{
|
||||
return request({
|
||||
url:'/admin/mosr/department',
|
||||
method:'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
export const getCompanyDetail=(companyId)=>{
|
||||
return request({
|
||||
url:`/admin/mosr/sub/company/info/${companyId}`,
|
||||
method:'get'
|
||||
})
|
||||
}
|
||||
|
||||
export const setCompanyLeader=(data)=>{
|
||||
return request({
|
||||
url:'/admin/mosr/sub/company/leader',
|
||||
method:'post',
|
||||
data:data
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,54 +1,54 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
// 请求参数配置表list
|
||||
export const getConfigList = (params) => {
|
||||
return request({
|
||||
url: '/admin/config',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
//获取到option列表
|
||||
|
||||
// 获取参数配置表详情
|
||||
export const getConfigDetails = (configId) => {
|
||||
return request({
|
||||
url: '/admin/config/' + configId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
// 获取参数配置表详情
|
||||
export const getConfigByKey = (configKey) => {
|
||||
return request({
|
||||
url: '/admin/config/key/' + configKey,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增参数配置表
|
||||
export const addConfig = (data) => {
|
||||
return request({
|
||||
url: '/admin/config',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改参数配置表
|
||||
export const editConfig = (data) => {
|
||||
return request({
|
||||
url: '/admin/config',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除参数配置表
|
||||
export const delConfig =(configId) => {
|
||||
return request({
|
||||
url: '/admin/config/' + configId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
// 请求参数配置表list
|
||||
export const getConfigList = (params) => {
|
||||
return request({
|
||||
url: '/admin/config',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
//获取到option列表
|
||||
|
||||
// 获取参数配置表详情
|
||||
export const getConfigDetails = (configId) => {
|
||||
return request({
|
||||
url: '/admin/config/' + configId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
// 获取参数配置表详情
|
||||
export const getConfigByKey = (configKey) => {
|
||||
return request({
|
||||
url: '/admin/config/key/' + configKey,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增参数配置表
|
||||
export const addConfig = (data) => {
|
||||
return request({
|
||||
url: '/admin/config',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改参数配置表
|
||||
export const editConfig = (data) => {
|
||||
return request({
|
||||
url: '/admin/config',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除参数配置表
|
||||
export const delConfig =(configId) => {
|
||||
return request({
|
||||
url: '/admin/config/' + configId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -1,44 +1,44 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
// 请求字典类型表list
|
||||
export const getDictDataList = (params) => {
|
||||
return request({
|
||||
url: '/admin/dict/data',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
// 获取字典数据表详情
|
||||
export const getDictDataDetails = (dictCode) => {
|
||||
return request({
|
||||
url: '/admin/dict/data/' + dictCode,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增字典数据表
|
||||
export const addDictData = (data) => {
|
||||
return request({
|
||||
url: '/admin/dict/data',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改字典类型表
|
||||
export const editDictData = (data) => {
|
||||
return request({
|
||||
url: '/admin/dict/data',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除字典类型表
|
||||
export const delDictData = (dictCode) => {
|
||||
return request({
|
||||
url: `/admin/dict/data/${dictCode}`,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
// 请求字典类型表list
|
||||
export const getDictDataList = (params) => {
|
||||
return request({
|
||||
url: '/admin/dict/data',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
// 获取字典数据表详情
|
||||
export const getDictDataDetails = (dictCode) => {
|
||||
return request({
|
||||
url: '/admin/dict/data/' + dictCode,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增字典数据表
|
||||
export const addDictData = (data) => {
|
||||
return request({
|
||||
url: '/admin/dict/data',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改字典类型表
|
||||
export const editDictData = (data) => {
|
||||
return request({
|
||||
url: '/admin/dict/data',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除字典类型表
|
||||
export const delDictData = (dictCode) => {
|
||||
return request({
|
||||
url: `/admin/dict/data/${dictCode}`,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,58 +1,58 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export const getDictOption = () => {
|
||||
return request({
|
||||
url: '/admin/dict/type/option',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 请求字典类型表list
|
||||
export const getDictTypeList = (params) => {
|
||||
return request({
|
||||
url: '/admin/dict/type',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
// 获取字典类型表详情
|
||||
export const getDictTypeDetails = (dictTypeId) => {
|
||||
return request({
|
||||
url: '/admin/dict/type/' + dictTypeId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增字典类型表
|
||||
export const addDictType = (data) => {
|
||||
return request({
|
||||
url: '/admin/dict/type',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改字典类型表
|
||||
export const editDictType = (data) => {
|
||||
return request({
|
||||
url: '/admin/dict/type',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除字典类型表
|
||||
export const delDictType =(dictTypeId) => {
|
||||
return request({
|
||||
url: '/admin/dict/type/' + dictTypeId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
//字典刷新缓存
|
||||
export const refreshDict =() => {
|
||||
return request({
|
||||
url: 'admin/dict/type/refresh',
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export const getDictOption = () => {
|
||||
return request({
|
||||
url: '/admin/dict/type/option',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 请求字典类型表list
|
||||
export const getDictTypeList = (params) => {
|
||||
return request({
|
||||
url: '/admin/dict/type',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
// 获取字典类型表详情
|
||||
export const getDictTypeDetails = (dictTypeId) => {
|
||||
return request({
|
||||
url: '/admin/dict/type/' + dictTypeId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增字典类型表
|
||||
export const addDictType = (data) => {
|
||||
return request({
|
||||
url: '/admin/dict/type',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改字典类型表
|
||||
export const editDictType = (data) => {
|
||||
return request({
|
||||
url: '/admin/dict/type',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除字典类型表
|
||||
export const delDictType =(dictTypeId) => {
|
||||
return request({
|
||||
url: '/admin/dict/type/' + dictTypeId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
//字典刷新缓存
|
||||
export const refreshDict =() => {
|
||||
return request({
|
||||
url: 'admin/dict/type/refresh',
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export const getMappingList = (params) => {
|
||||
return request({
|
||||
url: '/admin/mapping/switch',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
export const editMappingSwitch = (data) => {
|
||||
return request({
|
||||
url: '/admin/mapping/switch',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export const getMappingList = (params) => {
|
||||
return request({
|
||||
url: '/admin/mapping/switch',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
export const editMappingSwitch = (data) => {
|
||||
return request({
|
||||
url: '/admin/mapping/switch',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
export const getRouters = () => {
|
||||
return request({
|
||||
url: '/auth/router',
|
||||
method: 'get'
|
||||
})
|
||||
import request from '@/utils/request'
|
||||
|
||||
export const getRouters = () => {
|
||||
return request({
|
||||
url: '/auth/router',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
@@ -1,53 +1,53 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export const getMenuList = (params) => {
|
||||
return request({
|
||||
url: '/admin/menu',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
export const editMenu = (data) => {
|
||||
return request({
|
||||
url: '/admin/menu',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export const addMenu = (data) => {
|
||||
return request({
|
||||
url: '/admin/menu',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export const delMenu = (menuId) => {
|
||||
return request({
|
||||
url: '/admin/menu/'+menuId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
export const getMenuInfo = (menuId) => {
|
||||
return request({
|
||||
url: '/admin/menu/info/'+menuId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export const getMenuOpt = (excludeId=0) => {
|
||||
return request({
|
||||
url: '/admin/menu/option/'+excludeId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export const getMenuOptRole = (roleId) => {
|
||||
return request({
|
||||
url: '/admin/menu/option/role/'+roleId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export const getMenuList = (params) => {
|
||||
return request({
|
||||
url: '/admin/menu',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
export const editMenu = (data) => {
|
||||
return request({
|
||||
url: '/admin/menu',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export const addMenu = (data) => {
|
||||
return request({
|
||||
url: '/admin/menu',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export const delMenu = (menuId) => {
|
||||
return request({
|
||||
url: '/admin/menu/'+menuId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
export const getMenuInfo = (menuId) => {
|
||||
return request({
|
||||
url: '/admin/menu/info/'+menuId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export const getMenuOpt = (excludeId=0) => {
|
||||
return request({
|
||||
url: '/admin/menu/option/'+excludeId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export const getMenuOptRole = (roleId) => {
|
||||
return request({
|
||||
url: '/admin/menu/option/role/'+roleId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,208 +1,251 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
// 根据角色或者部门id获取对应数据
|
||||
export const getDeptOpt = (params = {}) => {
|
||||
return request({
|
||||
url: `/admin/mosr/department/option`,
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
export const getSubCompOpt = () => {
|
||||
return request({
|
||||
url: `/admin/mosr/sub/company/option`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
export const getUserAccount = () => {
|
||||
return request({
|
||||
url: `/admin/mosr/user/account/list`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 查询角色信息
|
||||
export const getRolesOpt = () => {
|
||||
return request({
|
||||
url: '/admin/role/option',
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
|
||||
// 获取岗位下拉
|
||||
export const getJobOpt = () => {
|
||||
return request({
|
||||
url: '/admin/job/option',
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
|
||||
export const getUserList = (params) => {
|
||||
return request({
|
||||
url: '/admin/user',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
//获取用户详情
|
||||
export const getUserDetail = (userId) => {
|
||||
return request({
|
||||
url: `/admin/mosr/user/info/${userId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
// 操作
|
||||
export const operate = (data, type) => {
|
||||
// console.log(type ,'type');
|
||||
if (data.userId && type !== '0') return editUser(data)
|
||||
else if (type == '0') return editUserOA(data)
|
||||
return addUser(data)
|
||||
}
|
||||
|
||||
// 新增用户
|
||||
export const addUser = (data) => {
|
||||
return request({
|
||||
url: '/admin/mosr/user',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
// 修改用户
|
||||
export const editUser = (data) => {
|
||||
return request({
|
||||
url: '/admin/mosr/user',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改OA用户
|
||||
export const editUserOA = (data) => {
|
||||
return request({
|
||||
url: '/admin/mosr/user/oa',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
//删除用户信息
|
||||
export const deleteUser = (userId) => {
|
||||
return request({
|
||||
url: `/admin/user/${userId}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
//根据roleId获取用户信息
|
||||
export const getUserByRoleId = (roleId, params) => {
|
||||
return request({
|
||||
url: `/admin/user/role/${roleId}`,
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
};
|
||||
//排除角色id获取用户信息
|
||||
export const getUserExcludeRoleId = (roleId, params) => {
|
||||
return request({
|
||||
url: `/admin/user/role/exclude/${roleId}`,
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
};
|
||||
//建立角色用户绑定关系
|
||||
export const roleBindUser = (data) => {
|
||||
return request({
|
||||
url: '/admin/user/bind/role',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
// 解除角色与用户之间的绑定状态
|
||||
export const cancelAuthorization = (data) => {
|
||||
return request({
|
||||
url: '/admin/user/unbind/role',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
//解除当前角色对应的所有用户的绑定关系
|
||||
export const unbindAllUser = (roleId) => {
|
||||
return request({
|
||||
url: '/admin/user/all/unbind/role',
|
||||
method: 'put',
|
||||
data: {
|
||||
id: roleId
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
//根据岗位id获取分配的用户信息
|
||||
export const getUserInfoByPostId = (postId, params) => {
|
||||
return request({
|
||||
url: `/admin/user/post/${postId}`,
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
//排除岗位id获取用户信息
|
||||
export const getUserExcludePostId = (postId, params) => {
|
||||
return request({
|
||||
url: `/admin/user/post/exclude/${postId}`,
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
};
|
||||
//建立岗位与用户绑定关系
|
||||
export const postBindUser = (userIds, postId) => {
|
||||
return request({
|
||||
url: '/admin/user/bind/post',
|
||||
method: 'put',
|
||||
data: {
|
||||
ids: userIds,
|
||||
id: postId
|
||||
}
|
||||
})
|
||||
}
|
||||
// 解除岗位与用户之间的绑定状态
|
||||
export const cancelPostAndUserAuthorization = (userIds, postId) => {
|
||||
return request({
|
||||
url: '/admin/user/unbind/post',
|
||||
method: 'put',
|
||||
data: {
|
||||
ids: userIds,
|
||||
id: postId
|
||||
}
|
||||
})
|
||||
}
|
||||
//解除当前岗位对应的所有用户的绑定关系
|
||||
export const unbindAllUserByPost = (postId) => {
|
||||
return request({
|
||||
url: '/admin/user/all/unbind/post',
|
||||
method: 'put',
|
||||
data: {
|
||||
id: postId
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export const bindAccount = (data) => {
|
||||
return request({
|
||||
url: '/admin/mosr/user/bind/account',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
export const getBindAccount = (userId) => {
|
||||
return request({
|
||||
url: `/admin/mosr/user/bind/account/info/${userId}`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export const checkMatrix = (userId) => {
|
||||
return request({
|
||||
url: `/admin/mosr/user/matrix?userId=` + userId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
// 根据角色或者部门id获取对应数据
|
||||
export const getDeptOpt = (params = {}) => {
|
||||
return request({
|
||||
url: `/admin/mosr/department/option`,
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
export const getSubCompOpt = () => {
|
||||
return request({
|
||||
url: `/admin/mosr/sub/company/option`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
export const getUserAccount = () => {
|
||||
return request({
|
||||
url: `/admin/mosr/user/account/list`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
export const judgeIsSameRole = (userId) => {
|
||||
return request({
|
||||
url: `/admin/mosr/user/company/same/${userId}`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 查询角色信息
|
||||
export const getRolesOpt = () => {
|
||||
return request({
|
||||
url: '/admin/role/option',
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
|
||||
// 获取岗位下拉
|
||||
export const getJobOpt = () => {
|
||||
return request({
|
||||
url: '/admin/job/option',
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
|
||||
export const getMosrUserList = (params) => {
|
||||
return request({
|
||||
url: '/admin/mosr/user',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
export const getUserList = (params) => {
|
||||
return request({
|
||||
url: '/admin/user',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
//获取用户详情
|
||||
export const getUserDetail = (userId) => {
|
||||
return request({
|
||||
url: `/admin/mosr/user/info/${userId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
|
||||
// 操作
|
||||
export const operate = (data, type) => {
|
||||
// console.log(type ,'type');
|
||||
if (data.userId && type !== '0') return editUser(data)
|
||||
else if (type == '0') return editUserOA(data)
|
||||
return addUser(data)
|
||||
}
|
||||
|
||||
// 新增用户
|
||||
export const addUser = (data) => {
|
||||
return request({
|
||||
url: '/admin/mosr/user',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
// 修改用户
|
||||
export const editUser = (data) => {
|
||||
return request({
|
||||
url: '/admin/mosr/user',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改OA用户
|
||||
export const editUserOA = (data) => {
|
||||
return request({
|
||||
url: '/admin/mosr/user/oa',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
//删除用户信息
|
||||
export const deleteUser = (userId) => {
|
||||
return request({
|
||||
url: `/admin/user/${userId}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
//根据roleId获取用户信息
|
||||
export const getUserByRoleId = (roleId, params) => {
|
||||
return request({
|
||||
url: `/admin/user/role/${roleId}`,
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
};
|
||||
//排除角色id获取用户信息
|
||||
export const getUserExcludeRoleId = (roleId, params) => {
|
||||
return request({
|
||||
url: `/admin/user/role/exclude/${roleId}`,
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
};
|
||||
//建立角色用户绑定关系
|
||||
export const roleBindUser = (data) => {
|
||||
return request({
|
||||
url: '/admin/user/bind/role',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
// 解除角色与用户之间的绑定状态
|
||||
export const cancelAuthorization = (data) => {
|
||||
return request({
|
||||
url: '/admin/user/unbind/role',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
//解除当前角色对应的所有用户的绑定关系
|
||||
export const unbindAllUser = (roleId) => {
|
||||
return request({
|
||||
url: '/admin/user/all/unbind/role',
|
||||
method: 'put',
|
||||
data: {
|
||||
id: roleId
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
//根据岗位id获取分配的用户信息
|
||||
export const getUserInfoByPostId = (postId, params) => {
|
||||
return request({
|
||||
url: `/admin/user/post/${postId}`,
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
//排除岗位id获取用户信息
|
||||
export const getUserExcludePostId = (postId, params) => {
|
||||
return request({
|
||||
url: `/admin/user/post/exclude/${postId}`,
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
};
|
||||
//建立岗位与用户绑定关系
|
||||
export const postBindUser = (userIds, postId) => {
|
||||
return request({
|
||||
url: '/admin/user/bind/post',
|
||||
method: 'put',
|
||||
data: {
|
||||
ids: userIds,
|
||||
id: postId
|
||||
}
|
||||
})
|
||||
}
|
||||
// 解除岗位与用户之间的绑定状态
|
||||
export const cancelPostAndUserAuthorization = (userIds, postId) => {
|
||||
return request({
|
||||
url: '/admin/user/unbind/post',
|
||||
method: 'put',
|
||||
data: {
|
||||
ids: userIds,
|
||||
id: postId
|
||||
}
|
||||
})
|
||||
}
|
||||
//解除当前岗位对应的所有用户的绑定关系
|
||||
export const unbindAllUserByPost = (postId) => {
|
||||
return request({
|
||||
url: '/admin/user/all/unbind/post',
|
||||
method: 'put',
|
||||
data: {
|
||||
id: postId
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export const bindAccount = (data) => {
|
||||
return request({
|
||||
url: '/admin/mosr/user/bind/account',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
export const getBindAccount = (userId) => {
|
||||
return request({
|
||||
url: `/admin/mosr/user/bind/account/info/${userId}`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export const checkMatrix = (userId) => {
|
||||
return request({
|
||||
url: `/admin/mosr/user/matrix?userId=` + userId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
export const getAgentInfo=(userId)=>{
|
||||
return request({
|
||||
url: `/admin/mosr/user/approval/agent/${userId}`,
|
||||
method:'get'
|
||||
})
|
||||
}
|
||||
|
||||
export const editAgentInfo=(data)=>{
|
||||
return request({
|
||||
url:'/admin/mosr/user/approval/agent',
|
||||
method:'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export const addWhiteUser=(data)=>{
|
||||
return request({
|
||||
url:'/admin/approve/white',
|
||||
method:'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export const delWhiteUser=(data)=>{
|
||||
return request({
|
||||
url:'/admin/approve/white',
|
||||
method:'delete',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,78 +1,78 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export function getProcessDefinitionList(param) {
|
||||
return request({
|
||||
url: "/workflow/process/definition",
|
||||
method: "get",
|
||||
params: param
|
||||
})
|
||||
}
|
||||
|
||||
export function getProcessDefinitionInfo(deploymentId) {
|
||||
return request({
|
||||
url: "/workflow/process/definition/" + deploymentId,
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
|
||||
export function getInitiateInfo(processDefinitionKey) {
|
||||
return request({
|
||||
url: "/workflow/process/definition/key/" + processDefinitionKey,
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
export function getHistoryVersion(processDefinitionKey) {
|
||||
return request({
|
||||
url: "/workflow/process/definition/history/" + processDefinitionKey,
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
|
||||
export function deleteHistoryVersion(deploymentId) {
|
||||
return request({
|
||||
url: "/workflow/process/definition/" + deploymentId,
|
||||
method: "delete",
|
||||
})
|
||||
}
|
||||
|
||||
export function suspendProcessDefinition(processDefinitionId) {
|
||||
return request({
|
||||
url: "/workflow/process/definition/suspend",
|
||||
method: "put",
|
||||
data: processDefinitionId
|
||||
})
|
||||
}
|
||||
|
||||
export function activateProcessDefinition(processDefinitionId) {
|
||||
return request({
|
||||
url: "/workflow/process/definition/activate",
|
||||
method: "put",
|
||||
data: processDefinitionId
|
||||
})
|
||||
}
|
||||
|
||||
export function addProcessDefinition(param) {
|
||||
return request({
|
||||
url: "/workflow/process/definition",
|
||||
method: "post",
|
||||
data: param
|
||||
})
|
||||
}
|
||||
|
||||
export function getTypeOption() {
|
||||
return request({
|
||||
url: "/workflow/process/definition/type/option",
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
|
||||
export function getFromPerm(processKey) {
|
||||
return request({
|
||||
url: "/workflow/process/definition/from/perm/"+processKey,
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export function getProcessDefinitionList(param) {
|
||||
return request({
|
||||
url: "/workflow/process/definition",
|
||||
method: "get",
|
||||
params: param
|
||||
})
|
||||
}
|
||||
|
||||
export function getProcessDefinitionInfo(deploymentId) {
|
||||
return request({
|
||||
url: "/workflow/process/definition/" + deploymentId,
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
|
||||
export function getInitiateInfo(processDefinitionKey) {
|
||||
return request({
|
||||
url: "/workflow/process/definition/key/" + processDefinitionKey,
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
export function getHistoryVersion(processDefinitionKey) {
|
||||
return request({
|
||||
url: "/workflow/process/definition/history/" + processDefinitionKey,
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
|
||||
export function deleteHistoryVersion(deploymentId) {
|
||||
return request({
|
||||
url: "/workflow/process/definition/" + deploymentId,
|
||||
method: "delete",
|
||||
})
|
||||
}
|
||||
|
||||
export function suspendProcessDefinition(processDefinitionId) {
|
||||
return request({
|
||||
url: "/workflow/process/definition/suspend",
|
||||
method: "put",
|
||||
data: processDefinitionId
|
||||
})
|
||||
}
|
||||
|
||||
export function activateProcessDefinition(processDefinitionId) {
|
||||
return request({
|
||||
url: "/workflow/process/definition/activate",
|
||||
method: "put",
|
||||
data: processDefinitionId
|
||||
})
|
||||
}
|
||||
|
||||
export function addProcessDefinition(param) {
|
||||
return request({
|
||||
url: "/workflow/process/definition",
|
||||
method: "post",
|
||||
data: param
|
||||
})
|
||||
}
|
||||
|
||||
export function getTypeOption() {
|
||||
return request({
|
||||
url: "/workflow/process/definition/type/option",
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
|
||||
export function getFromPerm(processKey) {
|
||||
return request({
|
||||
url: "/workflow/process/definition/from/perm/"+processKey,
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export function deleteFile(fileId) {
|
||||
// 删除文件
|
||||
return request({
|
||||
url: '/workflow/process/file/' + fileId,
|
||||
method: 'delete',
|
||||
})
|
||||
}
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export function deleteFile(fileId) {
|
||||
// 删除文件
|
||||
return request({
|
||||
url: '/workflow/process/file/' + fileId,
|
||||
method: 'delete',
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,53 +1,53 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
|
||||
/**
|
||||
* 开始实例流程
|
||||
* @param param
|
||||
* @returns {*}
|
||||
*/
|
||||
export function startProcessInstance(param) {
|
||||
return request({
|
||||
url: "/workflow/process/instance/start",
|
||||
method: "post",
|
||||
data: param
|
||||
})
|
||||
}
|
||||
export function restartProcessInstance(param) {
|
||||
return request({
|
||||
url: "/workflow/process/instance/restart",
|
||||
method: "post",
|
||||
data: param
|
||||
})
|
||||
}
|
||||
|
||||
export function getAboutInstanceList(param) {
|
||||
return request({
|
||||
url: "/workflow/process/instance/about",
|
||||
method: "get",
|
||||
params: param
|
||||
})
|
||||
}
|
||||
|
||||
export function getInitiatedInstanceList(param) {
|
||||
return request({
|
||||
url: "/workflow/process/instance/self",
|
||||
method: "get",
|
||||
params: param
|
||||
})
|
||||
}
|
||||
|
||||
export function getInitiatedInstanceInfo(processInstanceId) {
|
||||
return request({
|
||||
url: "/workflow/process/instance/info/"+processInstanceId,
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
export function getInitiatedInstanceReInfo(instanceId) {
|
||||
return request({
|
||||
url: "/workflow/process/instance/re/info/"+instanceId,
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
|
||||
/**
|
||||
* 开始实例流程
|
||||
* @param param
|
||||
* @returns {*}
|
||||
*/
|
||||
export function startProcessInstance(param) {
|
||||
return request({
|
||||
url: "/workflow/process/instance/start",
|
||||
method: "post",
|
||||
data: param
|
||||
})
|
||||
}
|
||||
export function restartProcessInstance(param) {
|
||||
return request({
|
||||
url: "/workflow/process/instance/restart",
|
||||
method: "post",
|
||||
data: param
|
||||
})
|
||||
}
|
||||
|
||||
export function getAboutInstanceList(param) {
|
||||
return request({
|
||||
url: "/workflow/process/instance/about",
|
||||
method: "get",
|
||||
params: param
|
||||
})
|
||||
}
|
||||
|
||||
export function getInitiatedInstanceList(param) {
|
||||
return request({
|
||||
url: "/workflow/process/instance/self",
|
||||
method: "get",
|
||||
params: param
|
||||
})
|
||||
}
|
||||
|
||||
export function getInitiatedInstanceInfo(processInstanceId) {
|
||||
return request({
|
||||
url: "/workflow/process/instance/info/"+processInstanceId,
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
export function getInitiatedInstanceReInfo(instanceId) {
|
||||
return request({
|
||||
url: "/workflow/process/instance/re/info/"+instanceId,
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,46 +1,46 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
// 请求系统内置监听器list
|
||||
export const getProcessListenerList = (params) => {
|
||||
return request({
|
||||
url: '/workflow/process/listener',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
//获取到option列表
|
||||
|
||||
// 获取系统内置监听器详情
|
||||
export const getProcessListenerDetails = (processListenerId) => {
|
||||
return request({
|
||||
url: '/workflow/process/listener/' + processListenerId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增系统内置监听器
|
||||
export const addProcessListener = (data) => {
|
||||
return request({
|
||||
url: '/workflow/process/listener',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改系统内置监听器
|
||||
export const editProcessListener = (data) => {
|
||||
return request({
|
||||
url: '/workflow/process/listener',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除系统内置监听器
|
||||
export const delProcessListener =(processListenerId) => {
|
||||
return request({
|
||||
url: '/workflow/process/listener/' + processListenerId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
// 请求系统内置监听器list
|
||||
export const getProcessListenerList = (params) => {
|
||||
return request({
|
||||
url: '/workflow/process/listener',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
//获取到option列表
|
||||
|
||||
// 获取系统内置监听器详情
|
||||
export const getProcessListenerDetails = (processListenerId) => {
|
||||
return request({
|
||||
url: '/workflow/process/listener/' + processListenerId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增系统内置监听器
|
||||
export const addProcessListener = (data) => {
|
||||
return request({
|
||||
url: '/workflow/process/listener',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改系统内置监听器
|
||||
export const editProcessListener = (data) => {
|
||||
return request({
|
||||
url: '/workflow/process/listener',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除系统内置监听器
|
||||
export const delProcessListener =(processListenerId) => {
|
||||
return request({
|
||||
url: '/workflow/process/listener/' + processListenerId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,45 +1,45 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export function getTaskList() {
|
||||
return request({
|
||||
url: "/workflow/process/task",
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
|
||||
export function getTaskInfo(taskId) {
|
||||
return request({
|
||||
url: "/workflow/process/task/"+taskId,
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
export function completeTask(params) {
|
||||
return request({
|
||||
url: "/workflow/process/task/complete",
|
||||
method: "put",
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function refuseTask(params) {
|
||||
return request({
|
||||
url: "/workflow/process/task/refuse",
|
||||
method: "put",
|
||||
data: params
|
||||
})
|
||||
}
|
||||
|
||||
export function rollBackTask(params) {
|
||||
return request({
|
||||
url: "/workflow/process/task/rollback",
|
||||
method: "put",
|
||||
data: params
|
||||
})
|
||||
}
|
||||
|
||||
export function addComment(params) {
|
||||
return request({
|
||||
url: "/workflow/process/task/comment",
|
||||
method: "post",
|
||||
data: params
|
||||
})
|
||||
}
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
export function getTaskList() {
|
||||
return request({
|
||||
url: "/workflow/process/task",
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
|
||||
export function getTaskInfo(taskId) {
|
||||
return request({
|
||||
url: "/workflow/process/task/"+taskId,
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
export function completeTask(params) {
|
||||
return request({
|
||||
url: "/workflow/process/task/complete",
|
||||
method: "put",
|
||||
data: params
|
||||
})
|
||||
}
|
||||
export function refuseTask(params) {
|
||||
return request({
|
||||
url: "/workflow/process/task/refuse",
|
||||
method: "put",
|
||||
data: params
|
||||
})
|
||||
}
|
||||
|
||||
export function rollBackTask(params) {
|
||||
return request({
|
||||
url: "/workflow/process/task/rollback",
|
||||
method: "put",
|
||||
data: params
|
||||
})
|
||||
}
|
||||
|
||||
export function addComment(params) {
|
||||
return request({
|
||||
url: "/workflow/process/task/comment",
|
||||
method: "post",
|
||||
data: params
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,49 +1,47 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
//根据角色或者部门获取到对应的数据
|
||||
export function getUserTree(type, chooseId) {
|
||||
return request({
|
||||
url: `/admin/user/choose/${type}/${chooseId}`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 查询系统角色
|
||||
export function getRole() {
|
||||
return request({
|
||||
url: 'admin/role/option',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
//获取采取树形控件的部门option
|
||||
export function getDepartmentTree() {
|
||||
return request({
|
||||
url: 'admin/dept/option',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export function getMosrUser(params) {
|
||||
return request({
|
||||
url: '/admin/mosr/user/choose',
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function getOrganizationStructure(params) {
|
||||
return request({
|
||||
url: '/admin/organizational/structure/choose',
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
export function getOrganizationStructureTree(params) {
|
||||
return request({
|
||||
url: '/admin/organizational/structure/tree',
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
//根据角色或者部门获取到对应的数据
|
||||
export function getUserTree(type,chooseId){
|
||||
return request({
|
||||
url:`/admin/user/choose/${type}/${chooseId}`,
|
||||
method:'get'
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
// 查询系统角色
|
||||
export function getRole() {
|
||||
return request({
|
||||
url: 'admin/role/option',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
//获取采取树形控件的部门option
|
||||
export function getDepartmentTree() {
|
||||
return request({
|
||||
url: 'admin/dept/option',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
export function getMosrUser(params) {
|
||||
return request({
|
||||
url: '/admin/mosr/user/choose',
|
||||
method: 'get',
|
||||
params:params
|
||||
})
|
||||
}
|
||||
|
||||
export function getOrganizationStructure(params) {
|
||||
return request({
|
||||
url: '/admin/organizational/structure/choose',
|
||||
method: 'get',
|
||||
params:params
|
||||
})
|
||||
}
|
||||
export function getOrganizationStructureTree(params) {
|
||||
return request({
|
||||
url: '/admin/organizational/structure/tree',
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
77
src/assets/axupimgs/plugin.js
Normal file
@@ -0,0 +1,77 @@
|
||||
tinymce.PluginManager.add('axupimgs', function (editor, url) {
|
||||
var pluginName = '多图片上传';
|
||||
window.axupimgs = {}; //扔外部公共变量,也可以扔一个自定义的位置
|
||||
const baseURL = import.meta.env.VITE_BASE_URL
|
||||
|
||||
// var baseURL=tinymce.baseURL;
|
||||
var iframe1 = '/upfiles.html';
|
||||
console.log('editor',editor)
|
||||
axupimgs.images_upload_handler = editor.getParam('images_upload_handler_not_loading', undefined, 'function');
|
||||
axupimgs.images_upload_base_path = editor.getParam('images_upload_base_path', '', 'string');
|
||||
axupimgs.axupimgs_filetype = editor.getParam('axupimgs_filetype', '.png,.gif,.jpg,.jpeg', 'string');
|
||||
axupimgs.res = [];
|
||||
var openDialog = function () {
|
||||
return editor.windowManager.openUrl({
|
||||
title: pluginName,
|
||||
size: 'large',
|
||||
url: iframe1,
|
||||
buttons: [
|
||||
{
|
||||
type: 'cancel',
|
||||
text: 'Close'
|
||||
},
|
||||
{
|
||||
type: 'custom',
|
||||
text: 'Save',
|
||||
name: 'save',
|
||||
primary: true
|
||||
},
|
||||
],
|
||||
onAction: function (api, details) {
|
||||
switch (details.name) {
|
||||
case 'save':
|
||||
var html = '';
|
||||
var imgs = axupimgs.res;
|
||||
var len = imgs.length;
|
||||
for (let i = 0; i < len; i++) {
|
||||
if (imgs[i].url) {
|
||||
html += '<img src="' + imgs[i].url + '" />';
|
||||
}
|
||||
}
|
||||
editor.insertContent(html);
|
||||
axupimgs.res = [];
|
||||
api.close();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
editor.ui.registry.getAll().icons.axupimgs || editor.ui.registry.addIcon('axupimgs', '<svg viewBox="0 0 1280 1024" xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path d="M1126.2,779.8V87.6c0-24-22.6-86.9-83.5-86.9H83.5C14.7,0.7,0,63.7,0,87.7v692c0,36.2,29.2,89.7,83.5,89.7l959.3-1.3c51.7,0,83.5-42.5,83.5-88.3zm-1044,4V86.3h961.6V783.7H82.2v0.1z" fill="#53565A"/><path d="M603,461.6L521.1,366.3,313,629.8,227.2,546.8,102.4,716.8H972.8v-170L768.2,235.2,603.1,461.6zM284.6,358.4a105.4,105.4,0,0,0,73.5-30c19.5-19.1,30.3-45,30.2-71.8,0-56.8-45.9-103-102.4-103-56.6,0-102.4,46.1-102.4,103C183.4,313.5,228,358.4,284.6,358.4z" fill="#9598A0"/><path d="M1197.7,153.6l-0.3,669.3s13.5,113.9-67.4,113.9H153.6c0,24.1,23.9,87.2,83.5,87.2h959.3c58.3,0,83.6-49.5,83.6-89.9V240.8c-0.1-41.8-44.9-87.2-82.3-87.2z" fill="#53565A"/></svg>');
|
||||
|
||||
editor.ui.registry.addButton('axupimgs', {
|
||||
icon: 'axupimgs',
|
||||
tooltip: pluginName,
|
||||
onAction: function () {
|
||||
openDialog();
|
||||
}
|
||||
});
|
||||
editor.ui.registry.addMenuItem('axupimgs', {
|
||||
icon: 'axupimgs',
|
||||
text: '图片批量上传...',
|
||||
onAction: function () {
|
||||
openDialog();
|
||||
}
|
||||
});
|
||||
return {
|
||||
getMetadata: function () {
|
||||
return {
|
||||
name: pluginName,
|
||||
url: "http://tinymce.ax-z.cn/more-plugins/axupimgs.php",
|
||||
};
|
||||
}
|
||||
};
|
||||
});
|
||||
75
src/assets/axupimgs/plugin.min.js
vendored
Normal file
@@ -0,0 +1,75 @@
|
||||
tinymce.PluginManager.add('axupimgs', function(editor, url) {
|
||||
var pluginName='Ax多图片上传';
|
||||
window.axupimgs={}; //扔外部公共变量,也可以扔一个自定义的位置
|
||||
|
||||
var baseURL=tinymce.baseURL;
|
||||
var iframe1 = baseURL+'/plugins/axupimgs/upfiles.html';
|
||||
axupimgs.images_upload_handler = editor.getParam('images_upload_handler', undefined, 'function');
|
||||
axupimgs.images_upload_base_path = editor.getParam('images_upload_base_path', '', 'string');
|
||||
axupimgs.axupimgs_filetype = editor.getParam('axupimgs_filetype', '.png,.gif,.jpg,.jpeg', 'string');
|
||||
axupimgs.res=[];
|
||||
var openDialog = function() {
|
||||
return editor.windowManager.openUrl({
|
||||
title: pluginName,
|
||||
size: 'large',
|
||||
url:iframe1,
|
||||
buttons: [
|
||||
{
|
||||
type: 'cancel',
|
||||
text: 'Close'
|
||||
},
|
||||
{
|
||||
type: 'custom',
|
||||
text: 'Save',
|
||||
name: 'save',
|
||||
primary: true
|
||||
},
|
||||
],
|
||||
onAction: function (api, details) {
|
||||
switch (details.name) {
|
||||
case 'save':
|
||||
var html = '';
|
||||
var imgs = axupimgs.res;
|
||||
var len = imgs.length;
|
||||
for(let i=0;i<len;i++){
|
||||
if( imgs[i].url ){
|
||||
html += '<img src="'+imgs[i].url+'" />';
|
||||
}
|
||||
}
|
||||
editor.insertContent(html);
|
||||
axupimgs.res=[];
|
||||
api.close();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
editor.ui.registry.getAll().icons.axupimgs || editor.ui.registry.addIcon('axupimgs','<svg viewBox="0 0 1280 1024" xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path d="M1126.2,779.8V87.6c0-24-22.6-86.9-83.5-86.9H83.5C14.7,0.7,0,63.7,0,87.7v692c0,36.2,29.2,89.7,83.5,89.7l959.3-1.3c51.7,0,83.5-42.5,83.5-88.3zm-1044,4V86.3h961.6V783.7H82.2v0.1z" fill="#53565A"/><path d="M603,461.6L521.1,366.3,313,629.8,227.2,546.8,102.4,716.8H972.8v-170L768.2,235.2,603.1,461.6zM284.6,358.4a105.4,105.4,0,0,0,73.5-30c19.5-19.1,30.3-45,30.2-71.8,0-56.8-45.9-103-102.4-103-56.6,0-102.4,46.1-102.4,103C183.4,313.5,228,358.4,284.6,358.4z" fill="#9598A0"/><path d="M1197.7,153.6l-0.3,669.3s13.5,113.9-67.4,113.9H153.6c0,24.1,23.9,87.2,83.5,87.2h959.3c58.3,0,83.6-49.5,83.6-89.9V240.8c-0.1-41.8-44.9-87.2-82.3-87.2z" fill="#53565A"/></svg>');
|
||||
|
||||
editor.ui.registry.addButton('axupimgs', {
|
||||
icon: 'axupimgs',
|
||||
tooltip: pluginName,
|
||||
onAction: function() {
|
||||
openDialog();
|
||||
}
|
||||
});
|
||||
editor.ui.registry.addMenuItem('axupimgs', {
|
||||
icon: 'axupimgs',
|
||||
text: '图片批量上传...',
|
||||
onAction: function() {
|
||||
openDialog();
|
||||
}
|
||||
});
|
||||
return {
|
||||
getMetadata: function() {
|
||||
return {
|
||||
name: pluginName,
|
||||
url: "http://tinymce.ax-z.cn/more-plugins/axupimgs.php",
|
||||
};
|
||||
}
|
||||
};
|
||||
});
|
||||
BIN
src/assets/home/home1.png
Normal file
|
After Width: | Height: | Size: 750 KiB |
BIN
src/assets/home/home2.png
Normal file
|
After Width: | Height: | Size: 736 KiB |
BIN
src/assets/home/home3.png
Normal file
|
After Width: | Height: | Size: 743 KiB |
BIN
src/assets/home/home4.png
Normal file
|
After Width: | Height: | Size: 733 KiB |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 261.76 226.69"><path d="M161.096.001l-30.225 52.351L100.647.001H-.005l130.877 226.688L261.749.001z" fill="#41b883"/><path d="M161.096.001l-30.225 52.351L100.647.001H52.346l78.526 136.01L209.398.001z" fill="#34495e"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 261.76 226.69"><path d="M161.096.001l-30.225 52.351L100.647.001H-.005l130.877 226.688L261.749.001z" fill="#41b883"/><path d="M161.096.001l-30.225 52.351L100.647.001H52.346l78.526 136.01L209.398.001z" fill="#34495e"/></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 276 B After Width: | Height: | Size: 277 B |
@@ -1,144 +1,144 @@
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
|
||||
/* ==============X轴/Y轴区域样式=============*/
|
||||
.box-card-h {
|
||||
height: 390px !important;
|
||||
}
|
||||
.box-card::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
}
|
||||
|
||||
// 滚动条轨道
|
||||
.box-card::-webkit-scrollbar-track {
|
||||
background: rgb(239, 239, 239);
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
// 小滑块
|
||||
.box-card::-webkit-scrollbar-thumb {
|
||||
background: rgba(80, 81, 82, 0.29);
|
||||
border-radius: 10px;
|
||||
}
|
||||
.box-card {
|
||||
font-size: 15px;
|
||||
height: 350px;
|
||||
overflow-y: auto;
|
||||
|
||||
.el-card__body {
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.x-y-axis {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.list-group {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.cards {
|
||||
margin-bottom: 10px;
|
||||
|
||||
span:last-child {
|
||||
color: #2a99ff;
|
||||
}
|
||||
|
||||
.update-color {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-around;
|
||||
> span{
|
||||
white-space: pre
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
.card-active {
|
||||
outline: none; /* 隐藏默认的蓝色外边框 */
|
||||
box-shadow: 0 0 5px blue; /* 添加阴影效果,颜色为蓝色 */
|
||||
}
|
||||
|
||||
.x-y-cards {
|
||||
.el-card__body {
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
.cards-right {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
|
||||
> span:first-child {
|
||||
color: #2a99ff;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//扩大拖拽区域
|
||||
.drag-block {
|
||||
height: 329px;
|
||||
}
|
||||
.red-bgc {
|
||||
background-color: red;
|
||||
}
|
||||
|
||||
.yellow-bgc {
|
||||
background-color: yellow;
|
||||
}
|
||||
|
||||
/* ==============基础设置样式=============*/
|
||||
.basic-setup {
|
||||
font-weight: bold;
|
||||
font-size: 18px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.setting {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
margin-bottom: 10px;
|
||||
|
||||
.setting-title {
|
||||
font-weight: bold;
|
||||
font-size: 16px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.setting-item {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
}
|
||||
/* ==============高级设置样式=============*/
|
||||
.advanced-setting{
|
||||
.el-form-item {
|
||||
display: block;
|
||||
|
||||
.el-form-item__label {
|
||||
font-weight: bold;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.el-form-item__content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
font-size: 15px;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* ==============echarts样式=============*/
|
||||
#container {
|
||||
box-sizing: border-box;
|
||||
height: 450px;
|
||||
width: 80%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
|
||||
/* ==============X轴/Y轴区域样式=============*/
|
||||
.box-card-h {
|
||||
height: 390px !important;
|
||||
}
|
||||
.box-card::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
}
|
||||
|
||||
// 滚动条轨道
|
||||
.box-card::-webkit-scrollbar-track {
|
||||
background: rgb(239, 239, 239);
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
// 小滑块
|
||||
.box-card::-webkit-scrollbar-thumb {
|
||||
background: rgba(80, 81, 82, 0.29);
|
||||
border-radius: 10px;
|
||||
}
|
||||
.box-card {
|
||||
font-size: 15px;
|
||||
height: 350px;
|
||||
overflow-y: auto;
|
||||
|
||||
.el-card__body {
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.x-y-axis {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.list-group {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.cards {
|
||||
margin-bottom: 10px;
|
||||
|
||||
span:last-child {
|
||||
color: #2a99ff;
|
||||
}
|
||||
|
||||
.update-color {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-around;
|
||||
> span{
|
||||
white-space: pre
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
.card-active {
|
||||
outline: none; /* 隐藏默认的蓝色外边框 */
|
||||
box-shadow: 0 0 5px blue; /* 添加阴影效果,颜色为蓝色 */
|
||||
}
|
||||
|
||||
.x-y-cards {
|
||||
.el-card__body {
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
.cards-right {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
|
||||
> span:first-child {
|
||||
color: #2a99ff;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//扩大拖拽区域
|
||||
.drag-block {
|
||||
height: 329px;
|
||||
}
|
||||
.red-bgc {
|
||||
background-color: red;
|
||||
}
|
||||
|
||||
.yellow-bgc {
|
||||
background-color: yellow;
|
||||
}
|
||||
|
||||
/* ==============基础设置样式=============*/
|
||||
.basic-setup {
|
||||
font-weight: bold;
|
||||
font-size: 18px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.setting {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
margin-bottom: 10px;
|
||||
|
||||
.setting-title {
|
||||
font-weight: bold;
|
||||
font-size: 16px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.setting-item {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
}
|
||||
/* ==============高级设置样式=============*/
|
||||
.advanced-setting{
|
||||
.el-form-item {
|
||||
display: block;
|
||||
|
||||
.el-form-item__label {
|
||||
font-weight: bold;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.el-form-item__content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
font-size: 15px;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* ==============echarts样式=============*/
|
||||
#container {
|
||||
box-sizing: border-box;
|
||||
height: 450px;
|
||||
width: 80%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
@@ -1,53 +1,53 @@
|
||||
.el-side {
|
||||
border-radius: 10px;
|
||||
}
|
||||
.logo {
|
||||
height: 65px;
|
||||
background-color: #BEA266;
|
||||
color: #ffffff;
|
||||
font-weight: bold;
|
||||
font-size: 26px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
box-sizing: border-box;
|
||||
padding: 10px;
|
||||
& > img {
|
||||
object-fit: scale-down;
|
||||
width: 100%;
|
||||
height: 40px;
|
||||
}
|
||||
}
|
||||
.port-link{
|
||||
display: block;
|
||||
width: 200px;
|
||||
height: 50px;
|
||||
margin-left: -40px;
|
||||
padding-left: 40px;
|
||||
}
|
||||
.el-menu {
|
||||
border: none !important;
|
||||
.el-sub-menu {
|
||||
.el-sub-menu__title {
|
||||
display: block;
|
||||
font-size: 14px;
|
||||
&:hover{
|
||||
//background-color: #1F315F;
|
||||
}
|
||||
}
|
||||
|
||||
.el-menu-item {
|
||||
font-size: 14px;
|
||||
justify-content: flex-start;
|
||||
align-items: center;
|
||||
&:hover {
|
||||
//background-color: #373350 !important;
|
||||
//color: #EDC49A;
|
||||
}
|
||||
}
|
||||
.el-menu-item.is-active {
|
||||
background: rgba(190,162,102,0.5);
|
||||
//background-color: #373350 !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
.el-side {
|
||||
border-radius: 10px;
|
||||
}
|
||||
.logo {
|
||||
height: 65px;
|
||||
background-color: #BEA266;
|
||||
color: #ffffff;
|
||||
font-weight: bold;
|
||||
font-size: 26px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
box-sizing: border-box;
|
||||
padding: 10px;
|
||||
& > img {
|
||||
object-fit: scale-down;
|
||||
width: 100%;
|
||||
height: 40px;
|
||||
}
|
||||
}
|
||||
.port-link{
|
||||
display: block;
|
||||
width: 200px;
|
||||
height: 50px;
|
||||
margin-left: -40px;
|
||||
padding-left: 40px;
|
||||
}
|
||||
.el-menu {
|
||||
border: none !important;
|
||||
.el-sub-menu {
|
||||
.el-sub-menu__title {
|
||||
display: block;
|
||||
font-size: 14px;
|
||||
&:hover{
|
||||
//background-color: #1F315F;
|
||||
}
|
||||
}
|
||||
|
||||
.el-menu-item {
|
||||
font-size: 14px;
|
||||
justify-content: flex-start;
|
||||
align-items: center;
|
||||
&:hover {
|
||||
//background-color: #373350 !important;
|
||||
//color: #EDC49A;
|
||||
}
|
||||
}
|
||||
.el-menu-item.is-active {
|
||||
background: rgba(190,162,102,0.5);
|
||||
//background-color: #373350 !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
1
src/assets/svg/home-time.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1726060385019" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8147" data-spm-anchor-id="a313x.search_index.0.i14.42e13a81ABrE1q" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M514 514m-448 0a448 448 0 1 0 896 0 448 448 0 1 0-896 0Z" fill="#bfbfbf" p-id="8148" data-spm-anchor-id="a313x.search_index.0.i9.42e13a81ABrE1q" class=""></path><path d="M542 543.4h-56v-310c0-16.6 13.4-30 30-30 14.4 0 26 11.6 26 26v314z" fill="#ffffff" p-id="8149" data-spm-anchor-id="a313x.search_index.0.i10.42e13a81ABrE1q" class="selected"></path><path d="M809.4 515.7v-4c0-14.4-11.6-26-26-26h-284v56h284c14.4 0 26-11.6 26-26z" fill="#ffffff" p-id="8150" data-spm-anchor-id="a313x.search_index.0.i8.42e13a81ABrE1q" class=""></path></svg>
|
||||
|
After Width: | Height: | Size: 934 B |
@@ -1,6 +0,0 @@
|
||||
<svg width="71" height="68" viewBox="0 0 71 68" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g id="Group 229">
|
||||
<ellipse id="Ellipse 12" cx="35.3747" cy="33.663" rx="35.3747" ry="33.663" fill="#87C3ED"/>
|
||||
<path id="Subtract" fill-rule="evenodd" clip-rule="evenodd" d="M23.3174 21.8325C23.3174 20.7279 24.2128 19.8325 25.3174 19.8325H28.485V23.3688C28.485 23.9211 28.9327 24.3688 29.485 24.3688H32.7358C33.288 24.3688 33.7358 23.9211 33.7358 23.3688V19.8325H45.4049C46.5094 19.8325 47.4049 20.7279 47.4049 21.8325V44.741C47.4049 45.8456 46.5094 46.741 45.4049 46.741H25.3174C24.2128 46.741 23.3174 45.8456 23.3174 44.741V21.8325ZM32.7358 19.8325H29.485V23.3688L32.7358 23.3688V19.8325ZM28.876 29.1297H39.9933V28.1297H28.876V29.1297ZM41.8462 34.4079H28.876V33.4079H41.8462V34.4079ZM41.8462 39.6862H28.876V38.6862H41.8462V39.6862Z" fill="#0043C5"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 860 B |
@@ -1,6 +0,0 @@
|
||||
<svg width="71" height="68" viewBox="0 0 71 68" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g id="Group 230">
|
||||
<ellipse id="Ellipse 13" cx="35.3747" cy="33.663" rx="35.3747" ry="33.663" fill="#B487ED"/>
|
||||
<path id="Subtract" fill-rule="evenodd" clip-rule="evenodd" d="M41.1045 20.8325C41.1045 20.2802 40.6568 19.8325 40.1045 19.8325H26.1016C24.997 19.8325 24.1016 20.7279 24.1016 21.8325V44.741C24.1016 45.8456 24.997 46.741 26.1016 46.741H46.189C47.2936 46.741 48.189 45.8456 48.189 44.741V27.5596C48.189 27.0073 47.7413 26.5596 47.189 26.5596H42.1045C41.5522 26.5596 41.1045 26.1118 41.1045 25.5596V20.8325ZM43.9383 31.0958H31.1861V30.0958H43.9383V31.0958ZM35.4369 23.0234H39.6876V22.0234H35.4369V23.0234ZM43.9383 36.4777H31.1861V35.4777H43.9383V36.4777ZM31.1861 41.8593H43.9383V40.8593H31.1861V41.8593Z" fill="#8600C5"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 838 B |
@@ -1,6 +0,0 @@
|
||||
<svg width="71" height="68" viewBox="0 0 71 68" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g id="Group 231">
|
||||
<ellipse id="Ellipse 14" cx="35.3747" cy="33.663" rx="35.3747" ry="33.663" fill="#FDCB9D"/>
|
||||
<path id="Subtract" fill-rule="evenodd" clip-rule="evenodd" d="M54.4044 32.614C54.4044 40.4161 46.1575 46.741 35.9845 46.741C32.9189 46.741 30.0281 46.1666 27.4852 45.1505C27.3501 45.3211 27.1528 45.4524 26.9047 45.5078L19.6131 47.1386C18.844 47.3106 18.1654 46.6256 18.393 45.9072L20.2692 39.9868C18.5537 37.8406 17.5647 35.3159 17.5647 32.614C17.5647 24.8119 25.8115 18.4871 35.9845 18.4871C46.1575 18.4871 54.4044 24.8119 54.4044 32.614ZM28.1916 34.6321C29.3654 34.6321 30.317 33.7286 30.317 32.614C30.317 31.4994 29.3654 30.5958 28.1916 30.5958C27.0178 30.5958 26.0662 31.4994 26.0662 32.614C26.0662 33.7286 27.0178 34.6321 28.1916 34.6321ZM38.8184 32.614C38.8184 33.7286 37.8669 34.6321 36.6931 34.6321C35.5193 34.6321 34.5677 33.7286 34.5677 32.614C34.5677 31.4994 35.5193 30.5958 36.6931 30.5958C37.8669 30.5958 38.8184 31.4994 38.8184 32.614ZM45.1945 34.6321C46.3683 34.6321 47.3198 33.7286 47.3198 32.614C47.3198 31.4994 46.3683 30.5958 45.1945 30.5958C44.0207 30.5958 43.0691 31.4994 43.0691 32.614C43.0691 33.7286 44.0207 34.6321 45.1945 34.6321Z" fill="#F47D0E"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
@@ -1,6 +0,0 @@
|
||||
<svg width="71" height="68" viewBox="0 0 71 68" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g id="Group 232">
|
||||
<ellipse id="Ellipse 19" cx="35.3747" cy="33.663" rx="35.3747" ry="33.663" fill="#87EDBC"/>
|
||||
<path id="Subtract" fill-rule="evenodd" clip-rule="evenodd" d="M18.7023 20.134C18.1358 20.4872 17.7588 21.1158 17.7588 21.8325V42.0502C17.7588 43.1547 18.6542 44.0502 19.7588 44.0502H48.3477C49.4523 44.0502 50.3477 43.1547 50.3477 42.0502V21.8325C50.3477 21.1082 49.9627 20.4738 49.3861 20.1229L49.9153 20.9221L35.7553 30.2976C34.9339 30.8415 33.8697 30.8523 33.0374 30.3252L18.1997 20.9276L18.7023 20.134ZM18.7605 20.0991L33.5725 29.4804C34.0718 29.7966 34.7104 29.7902 35.2032 29.4638L49.3465 20.0993C49.0526 19.9296 48.7115 19.8325 48.3477 19.8325H19.7588C19.3952 19.8325 19.0543 19.9295 18.7605 20.0991Z" fill="#01A054"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 845 B |
1
src/assets/svg/research_fund.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1726897356959" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4330" xmlns:xlink="http://www.w3.org/1999/xlink" width="256" height="256"><path d="M26.293 1022.219c-14.41 0-26.122-11.652-26.122-26.006 0-14.41 11.712-26.182 26.122-26.182h818.455c69.64 0 126.306-58.5 126.306-130.379l-0.174-679.348c0-14.525 11.654-26.236 26.009-26.236 14.41 0 26.178 11.711 26.178 26.236l0.115 679.348c0 100.699-80.03 182.566-178.434 182.566H26.293z" fill="#2c2c2c" p-id="4331"></path><path d="M679.977 873.811c-14.41 0-26.063-11.654-26.063-26.006V674.537c0-14.352 11.653-26.006 26.063-26.006s26.124 11.654 26.124 26.006v173.268c0 14.351-11.714 26.006-26.124 26.006zM504.759 873.811c-14.354 0-26.009-11.654-26.009-26.006v-186.76c0-14.352 11.655-26.006 26.009-26.006 14.41 0 26.065 11.654 26.065 26.006v186.76c0 14.351-11.655 26.006-26.065 26.006zM336.313 873.811c-14.41 0-26.122-11.654-26.122-26.006v-92.26c0-14.412 11.712-26.123 26.122-26.123 14.354 0 25.894 11.711 25.894 26.123v92.26c0 14.351-11.54 26.006-25.894 26.006zM174.357 873.811c-14.354 0-26.009-11.654-26.009-26.006v-85.658c0-14.352 11.655-25.949 26.009-25.949 14.41 0 26.178 11.598 26.178 25.949v85.658c0 14.351-11.767 26.006-26.178 26.006zM50.637 873.811c-14.354 0-26.01-11.654-26.01-26.006v-85.658c0-14.352 11.655-25.949 26.01-25.949 14.41 0 26.121 11.598 26.121 25.949v85.658c0 14.351-11.711 26.006-26.121 26.006zM848.652 873.754c-14.41 0-26.124-11.598-26.124-25.949V573.379c0-14.354 11.714-26.006 26.124-26.006 14.352 0 26.007 11.652 26.007 26.006v274.426c0 14.351-11.655 25.949-26.007 25.949zM26.121 675.111C11.711 675.111 0 663.514 0 649.219c0-14.41 11.711-26.121 26.121-26.121h289.696l169.65-186.988c5.053-5.453 12.172-8.555 19.406-8.555 4.132 0 8.209 1.033 12.169 3.041l142.667 77.391 168.503-212.135c4.65-6.313 12.573-10.217 20.782-10.217 12.287 1.436 20.555 7.348 24.229 16.648 3.331 8.783 1.722 18.717-4.134 25.951l-182.05 229.299c-5.111 6.201-12.458 9.76-20.381 9.76-4.42 0-8.67-1.09-12.517-3.271L510.385 486.4 346.59 666.729c-4.648 5.283-11.768 8.383-19.289 8.383H26.121zM245.316 381.566c-10.333 0-18.716-8.439-18.716-18.715v-57.697h-62.578c-10.276 0-18.716-8.439-18.716-18.717 0-10.334 8.439-18.658 18.716-18.658h62.637v-38.064h-62.637c-10.22 0-18.659-8.439-18.659-18.715 0-10.221 8.439-18.604 18.659-18.604h66.884l-63.21-58.846c-5.109-4.592-7.291-11.369-5.741-17.854 1.379-6.717 6.258-12 12.688-13.896 1.551-0.112 3.042-0.112 4.362-0.112 7.234 0 10.967 1.662 13.896 4.535l51.842 47.994 45.986-47.307c3.445-3.673 8.268-5.625 13.32-5.625 4.878 0 9.588 1.837 12.975 5.28 3.674 3.446 5.626 8.097 5.74 12.976 0.057 4.996-1.78 9.818-5.282 13.436l-57.983 59.418h60.912c10.218 0 18.657 8.383 18.657 18.604 0 10.275-8.439 18.715-18.657 18.715h-56.436v38.064h56.436c10.218 0 18.657 8.324 18.657 18.658 0 10.277-8.439 18.717-18.657 18.717h-56.436v57.697c0.001 10.277-8.382 18.716-18.659 18.716z" fill="#2c2c2c" p-id="4332"></path><path d="M241.699 476.182c-61.602 0-121.94-25.145-165.517-68.721C16.648 348.27-6.89 261.291 14.696 180.229c21.586-80.896 85.313-144.619 166.32-166.38 19.808-5.282 40.015-7.866 60.455-7.866 62.176 0 122.858 25.262 166.606 69.411 67.459 67.284 87.438 167.755 50.866 255.882-36.341 87.955-121.482 144.906-216.785 144.906h-0.459z m0.46-432.193c-108.853 0-197.379 88.528-197.379 197.382 0 108.965 88.526 197.494 197.379 197.494 108.909 0 197.438-88.529 197.438-197.494 0-108.853-88.529-197.382-197.438-197.382z" fill="#2c2c2c" p-id="4333"></path></svg>
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
@@ -1,407 +1,556 @@
|
||||
<template>
|
||||
<el-form :model="formData" ref="applyForm" :rules="rules" :label-position="labelPosition">
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item :label="label" prop="attachment" label-width="125">
|
||||
<template v-if="preview&&JSON.stringify(singleFile) !== '{}'&&JSON.stringify(singleFile)!=='null'">
|
||||
<el-button type="primary" link @click="handleDownload(singleFile)" style="font-size: 16px">
|
||||
{{ singleFile ? singleFile?.originalFileName : formData.singleFile?.originalFileName }}
|
||||
</el-button>
|
||||
<el-button type="danger" link @click="deleteSingleFile(singleFile?singleFile:formData.singleFile,1)">删除
|
||||
</el-button>
|
||||
</template>
|
||||
<template
|
||||
v-else-if="!preview||JSON.stringify(singleFile) == '{}'||singleFile==null||formData.singleFile==null">
|
||||
<file-upload @getFile="getAttachment" :multiple="false"
|
||||
:disabled="isSingleFile" ref="fileUploadRef"/>
|
||||
<!-- :showFileList="showFileList" @delete="deleteAttachment"-->
|
||||
<fvTable style="width: 100%;max-height: 80px;" v-if="showSingleTable" height="80" :tableConfig="singleTableConfig"
|
||||
:data="_singleFileValue" :isSettingCol="false" :pagination="false">
|
||||
</fvTable>
|
||||
</template>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="其他文件" label-width="125">
|
||||
<file-upload @getFile="getOtherFile"/>
|
||||
<fvTable style="width: 100%;max-height: 162px;" v-if="showTable" height="162" :tableConfig="tableConfig"
|
||||
:data="allFileList" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
||||
</template>
|
||||
</fvTable>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import FileUpload from '@/components/FileUpload.vue'
|
||||
import {deleteFile, downloadFile} from "@/api/project-demand";
|
||||
import {ElMessageBox, ElNotification} from "element-plus";
|
||||
|
||||
|
||||
const props = defineProps({
|
||||
showFileList: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
label: {
|
||||
type: String,
|
||||
default: '项目附件'
|
||||
},
|
||||
showTable: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
showSingleTable: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
preview: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
singleList: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
otherFileList: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
formData: {
|
||||
type: Object,
|
||||
default: {}
|
||||
},
|
||||
labelPosition: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
tag: {
|
||||
type: String,
|
||||
default: ''
|
||||
}
|
||||
})
|
||||
const emit = defineEmits(["getAttachment", "getOtherFile","update:singleList"])
|
||||
const tableConfig = reactive({
|
||||
columns: [
|
||||
{
|
||||
prop: 'index',
|
||||
type: 'index',
|
||||
label: '序号',
|
||||
align: 'center',
|
||||
width: '80',
|
||||
},
|
||||
{
|
||||
prop: 'originalFileName',
|
||||
label: '文件名',
|
||||
align: 'center',
|
||||
},
|
||||
{
|
||||
prop: 'tag',
|
||||
label: '标签',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'size',
|
||||
label: '文件大小',
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
||||
},
|
||||
{
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
let btn = []
|
||||
btn.push({label: '下载', func: () => handleDownload(row), type: 'primary'})
|
||||
// if (row.newFile) {
|
||||
// btn.push({label: '删除', func: () => handleDelete(row), type: 'primary'})
|
||||
// }
|
||||
return (
|
||||
<div style={{width: '100%'}}>
|
||||
{
|
||||
btn.map(item => (
|
||||
<el-button
|
||||
type={item.type}
|
||||
onClick={() => item.func()}
|
||||
link
|
||||
>
|
||||
{item.label}
|
||||
</el-button>
|
||||
))
|
||||
}
|
||||
{
|
||||
row.newFile || props.preview || !props.preview ?
|
||||
<popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
||||
// perm={['']}
|
||||
onDelete={() => handleDelete(row)}/>
|
||||
: ''
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
const singleTableConfig = reactive({
|
||||
columns: [
|
||||
{
|
||||
prop: 'index',
|
||||
type: 'index',
|
||||
label: '序号',
|
||||
align: 'center',
|
||||
width: '80',
|
||||
},
|
||||
{
|
||||
prop: 'originalFileName',
|
||||
label: '文件名',
|
||||
align: 'center',
|
||||
},
|
||||
{
|
||||
prop: 'tag',
|
||||
label: '标签',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'size',
|
||||
label: '文件大小',
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
||||
},
|
||||
{
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
let btn = []
|
||||
btn.push({label: '下载', func: () => handleDownload(row), type: 'primary'})
|
||||
// if (row.newFile) {
|
||||
// btn.push({label: '删除', func: () => handleDelete(row), type: 'primary'})
|
||||
// }
|
||||
return (
|
||||
<div style={{width: '100%'}}>
|
||||
{
|
||||
btn.map(item => (
|
||||
<el-button
|
||||
type={item.type}
|
||||
onClick={() => item.func()}
|
||||
link
|
||||
>
|
||||
{item.label}
|
||||
</el-button>
|
||||
))
|
||||
}
|
||||
{
|
||||
row.newFile || props.preview || !props.preview ?
|
||||
<popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
||||
// perm={['']}
|
||||
onDelete={() => handleSingleDelete(row)}/>
|
||||
: ''
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
const fileUploadRef = ref()
|
||||
const rules = reactive({
|
||||
attachment: [{required: true, message: '请上传附件', trigger: ['blur', 'change']}],
|
||||
})
|
||||
const applyForm = ref()
|
||||
const singleFile = ref(props.formData.singleFile)
|
||||
const isSingleFile = ref(false)
|
||||
const allFileList = ref([])
|
||||
const deleteFileVal = ref({})
|
||||
const singleFileList = ref([])
|
||||
if(localStorage.getItem('singleFile')){
|
||||
singleFile.value = JSON.parse(localStorage.getItem('singleFile'))
|
||||
}
|
||||
const _singleFileValue = computed({
|
||||
get() {
|
||||
return props.singleList;
|
||||
},
|
||||
set(value) {
|
||||
emit('update:singleList', value)
|
||||
}
|
||||
})
|
||||
|
||||
// console.log('_singleFileValue',_singleFileValue.value)
|
||||
const _otherFileListValue = computed({
|
||||
get() {
|
||||
return props.otherFileList;
|
||||
},
|
||||
set(value) {
|
||||
emit('update:otherFileList', value)
|
||||
}
|
||||
})
|
||||
if(_otherFileListValue.value&&_otherFileListValue.value.length>0){
|
||||
_otherFileListValue.value.forEach(item=>{
|
||||
allFileList.value.push(item)
|
||||
})
|
||||
}
|
||||
watch(() => props.showSingleTable, (newVal) => {
|
||||
props.showSingleTable = newVal
|
||||
}, {deep: true})
|
||||
watch(() => props.formData.fileList, (newVal) => {
|
||||
if (props.preview) {
|
||||
newVal?.forEach(item => {
|
||||
allFileList.value.push(item)
|
||||
})
|
||||
}
|
||||
}, {immediate: true})
|
||||
// watch(() => props.otherFileList, (newVal) => {
|
||||
// props.otherFileList=newVal
|
||||
// if (props.preview) {
|
||||
// console.log('newotherFileList', newVal,props.preview,props.formData.fileList)
|
||||
// if (props.formData.fileList === null || props.formData.fileList?.length === 0) {
|
||||
// allFileList.value = newVal
|
||||
// } else {
|
||||
// console.log('props.otherFileList',props.otherFileList)
|
||||
// // props.otherFileList?.forEach(item => {
|
||||
// // allFileList.value.push(item)
|
||||
// // })
|
||||
// }
|
||||
// } else {
|
||||
// allFileList.value = newVal
|
||||
// }
|
||||
// }, {deep: true})
|
||||
watch(() => props.showTable, (newVal) => {
|
||||
props.showTable = newVal
|
||||
}, {deep: true})
|
||||
// watch(() => props.singleList, (newVal) => {
|
||||
// console.log('singleFile', newVal)
|
||||
// singleFileList.value = newVal
|
||||
// }, {deep: true})
|
||||
watch(() => props.formData.singleFile, (newVal) => {
|
||||
// console.log('singleFile', newVal)
|
||||
singleFile.value = newVal
|
||||
props.formData.singleFile=newVal
|
||||
}, {deep: true})
|
||||
watch(() => isSingleFile.value, (newVal) => {
|
||||
isSingleFile.value = newVal
|
||||
}, {deep: true})
|
||||
watch(() => singleFile.value, (newVal) => {
|
||||
singleFile.value = newVal
|
||||
}, {deep: true})
|
||||
const handleDelete = (row, type) => {
|
||||
deleteFile(row.fileId).then(res => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
if (type === 'single') {
|
||||
_singleFileValue.value.splice(_singleFileValue.value.findIndex((item) => item.fileId === row.fileId), 1);
|
||||
isSingleFile.value = false
|
||||
} else {
|
||||
allFileList.value.splice(allFileList.value.findIndex((item) => item.fileId === row.fileId), 1);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
const handleSingleDelete = (row) => {
|
||||
// console.log('row',row)
|
||||
// fileUploadRef.value.handleRemove(deleteFileVal.value.id)
|
||||
handleDelete(row, 'single')
|
||||
}
|
||||
const getAttachment = (val) => {
|
||||
// console.log('getAttachment', val)
|
||||
isSingleFile.value = true
|
||||
// deleteFileVal.value=val
|
||||
emit('getAttachment', val)
|
||||
}
|
||||
const compositeParam = (item) => {
|
||||
return {
|
||||
fileId: item.id,
|
||||
size: item.size,
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: true,
|
||||
tag: props.tag
|
||||
}
|
||||
}
|
||||
const getOtherFile = (val) => {
|
||||
if (props.preview) {
|
||||
allFileList.value.push(compositeParam(val))
|
||||
} else {
|
||||
allFileList.value = _otherFileListValue.value
|
||||
}
|
||||
emit('getOtherFile', val)
|
||||
}
|
||||
const deleteAttachment = (val) => {
|
||||
deleteFile(val).then(res => {
|
||||
if (res.code === 1000) {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: "删除成功",
|
||||
type: 'success'
|
||||
})
|
||||
isSingleFile.value = false
|
||||
singleFile.value = null
|
||||
}
|
||||
});
|
||||
}
|
||||
const deleteSingleFile = (row, type) => {
|
||||
ElMessageBox.confirm(`确认删除名称为${row.originalFileName}的文件吗?`, '系统提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
deleteFile(row.fileId).then(res => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
isSingleFile.value = false
|
||||
if (type === 1) {
|
||||
singleFile.value = null
|
||||
} else {
|
||||
props.otherFileList.splice(props.otherFileList.findIndex((item) => item.fileId === row.fileId), 1);
|
||||
}
|
||||
}
|
||||
});
|
||||
}).catch(() => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: "用户取消删除! ",
|
||||
type: 'warning'
|
||||
})
|
||||
})
|
||||
}
|
||||
const handleDownload = (row) => {
|
||||
downloadFile(row.fileId).then(res => {
|
||||
const blob = new Blob([res])
|
||||
let a = document.createElement('a')
|
||||
a.href = URL.createObjectURL(blob)
|
||||
a.download = row.originalFileName
|
||||
a.click()
|
||||
})
|
||||
}
|
||||
defineExpose({
|
||||
validate() {
|
||||
return applyForm.value.validate()
|
||||
},
|
||||
clearValidate() {
|
||||
return applyForm.value.clearValidate()
|
||||
},
|
||||
allFileList,
|
||||
singleFile,
|
||||
isSingleFile
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
:deep(.el-table--fit ) {
|
||||
height: 300px !important;
|
||||
}
|
||||
</style>
|
||||
<template>
|
||||
<el-form :model="formData" ref="applyForm" :rules="rules" :label-position="labelPosition" :style="{marginLeft: label==='项目验收附件'?'25px': label==='项目立项附件'?'25px':'5px'}">
|
||||
<el-row>
|
||||
<!-- <el-col :span="24">-->
|
||||
<!-- <el-form-item :label="label" prop="attachment" >-->
|
||||
<!-- <template v-if="preview">-->
|
||||
<!-- <file-upload @getFile="getAttachment" :multiple="false"-->
|
||||
<!-- :disabled="singleFileArray?.length>0?true:false" title="如需修改需求申请书附件,请先删除文件再上传!"/>-->
|
||||
<!-- <fvTable style="width: 100%;max-height: 80px;" height="80" v-if="singleFileArray?.length>0"-->
|
||||
<!-- :tableConfig="editSingleTableConfig"-->
|
||||
<!-- :data="singleFileArray" :isSettingCol="false" :pagination="false">-->
|
||||
<!-- </fvTable>-->
|
||||
<!-- </template>-->
|
||||
<!-- <template v-else-if="!preview">-->
|
||||
<!-- <file-upload @getFile="getAttachment" :multiple="false"-->
|
||||
<!-- :disabled="isSingleFile"/>-->
|
||||
<!-- <fvTable style="width: 100%;max-height: 80px;" v-if="showSingleTable" height="80"-->
|
||||
<!-- :tableConfig="singleTableConfig"-->
|
||||
<!-- :data="_singleFileValue" :isSettingCol="false" :pagination="false">-->
|
||||
<!-- </fvTable>-->
|
||||
<!-- </template>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
<el-col :span="24">
|
||||
<el-form-item :label="label" prop="" :required="label!='项目归档附件'">
|
||||
<file-upload @getFile="getOtherFile"/>
|
||||
<el-button color="#DED0B2" v-if="templateDownloadBtnShow" @click="handleImportTemplateDownload"
|
||||
style="margin-left: 10px">模板下载
|
||||
</el-button>
|
||||
<fvTable style="width: 100%;" :height="label=='项目立项附件'?'160':'160'" :scrollbar-always-on="true" :style="{maxHeight:label=='项目立项附件'?'160px':'160px',height:label=='项目立项附件'?'160px':'160px'}" v-if="showTable" :tableConfig="tableConfig"
|
||||
:data="allFileList" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
||||
</template>
|
||||
</fvTable>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<file-preview ref="filePreviewRef" v-if="filePreviewShow" :fileName="filePreviewParam.fileName"
|
||||
:fileUrl="filePreviewParam.fileUrl"
|
||||
:fileType="filePreviewParam.fileType"/>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import FileUpload from '@/components/FileUpload.vue'
|
||||
import {deleteFile, downloadFile, downloadTemplate, downloadTemplateZip} from "@/api/project-demand";
|
||||
import {ElMessageBox, ElNotification} from "element-plus";
|
||||
|
||||
|
||||
const props = defineProps({
|
||||
showFileList: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
label: {
|
||||
type: String,
|
||||
default: '项目附件'
|
||||
},
|
||||
showTable: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
showSingleTable: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
preview: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
//是否显示模板下载按钮
|
||||
templateDownloadBtnShow: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
//模板下载时的文件名
|
||||
templateName: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
singleList: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
otherFileList: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
formData: {
|
||||
type: Object,
|
||||
default: {}
|
||||
},
|
||||
labelPosition: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
tag: {
|
||||
type: String,
|
||||
default: ''
|
||||
}
|
||||
})
|
||||
const emit = defineEmits(["getAttachment", "getOtherFile", "update:singleList"])
|
||||
|
||||
const baseTableConf = reactive(
|
||||
[
|
||||
{
|
||||
prop: 'index',
|
||||
type: 'index',
|
||||
label: '序号',
|
||||
align: 'center',
|
||||
width: '80',
|
||||
},
|
||||
{
|
||||
prop: 'originalFileName',
|
||||
label: '文件名',
|
||||
align: 'center',
|
||||
width: 400,
|
||||
currentRender: ({row, index}) => (
|
||||
<div style="color: #2a99ff;cursor: pointer;"
|
||||
onClick={() => clickToPreview(row)}>{row.originalFileName}</div>)
|
||||
},
|
||||
{
|
||||
prop: 'tag',
|
||||
label: '标签',
|
||||
align: 'center',
|
||||
// currentRender: ({row, index}) => (
|
||||
// <el-input placeholder={row.tag} onClick={() => {}}></el-input>)
|
||||
},
|
||||
{
|
||||
prop: 'size',
|
||||
label: '文件大小',
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
||||
},
|
||||
]
|
||||
)
|
||||
const tableConfig = reactive({
|
||||
columns: [
|
||||
...baseTableConf,
|
||||
{
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
let btn = []
|
||||
btn.push({label: '下载', func: () => handleDownload(row), type: 'primary'})
|
||||
// if (row.newFile) {
|
||||
// btn.push({label: '删除', func: () => handleDelete(row), type: 'primary'})
|
||||
// }
|
||||
return (
|
||||
<div style={{width: '100%'}}>
|
||||
{
|
||||
btn.map(item => (
|
||||
<el-button
|
||||
type={item.type}
|
||||
onClick={() => item.func()}
|
||||
link
|
||||
>
|
||||
{item.label}
|
||||
</el-button>
|
||||
))
|
||||
}
|
||||
{
|
||||
row.newFile || props.preview || !props.preview ?
|
||||
<popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
||||
// perm={['']}
|
||||
onDelete={() => handleDelete(row)}/>
|
||||
: ''
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
const singleTableConfig = reactive({
|
||||
columns: [
|
||||
...baseTableConf,
|
||||
{
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
let btn = []
|
||||
btn.push({label: '下载', func: () => handleDownload(row), type: 'primary'})
|
||||
// if (row.newFile) {
|
||||
// btn.push({label: '删除', func: () => handleDelete(row), type: 'primary'})
|
||||
// }
|
||||
return (
|
||||
<div style={{width: '100%'}}>
|
||||
{
|
||||
btn.map(item => (
|
||||
<el-button
|
||||
type={item.type}
|
||||
onClick={() => item.func()}
|
||||
link
|
||||
>
|
||||
{item.label}
|
||||
</el-button>
|
||||
))
|
||||
}
|
||||
{
|
||||
row.newFile || props.preview || !props.preview ?
|
||||
<popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
||||
// perm={['']}
|
||||
onDelete={() => handleSingleDelete(row)}/>
|
||||
: ''
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
const editSingleTableConfig = reactive({
|
||||
columns: [
|
||||
...baseTableConf,
|
||||
{
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
let btn = []
|
||||
btn.push({label: '下载', func: () => handleDownload(row), type: 'primary'})
|
||||
// if (row.newFile) {
|
||||
// btn.push({label: '删除', func: () => handleDelete(row), type: 'primary'})
|
||||
// }
|
||||
return (
|
||||
<div style={{width: '100%'}}>
|
||||
{
|
||||
btn.map(item => (
|
||||
<el-button
|
||||
type={item.type}
|
||||
onClick={() => item.func()}
|
||||
link
|
||||
>
|
||||
{item.label}
|
||||
</el-button>
|
||||
))
|
||||
}
|
||||
{
|
||||
row.newFile || props.preview || !props.preview ?
|
||||
<popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
||||
// perm={['']}
|
||||
onDelete={() => deleteSingleFile(row, 1)}/>
|
||||
: ''
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
const singleFileArray = ref([])
|
||||
const rules = reactive({
|
||||
// attachment: [{required: true, message: '请上传附件', trigger: ['blur', 'change']}],
|
||||
})
|
||||
const applyForm = ref()
|
||||
const singleFile = ref({})
|
||||
const isSingleFile = ref(false)
|
||||
const isHaveOneFile = ref(false)
|
||||
const allFileList = ref([])
|
||||
if (localStorage.getItem('singleFile')) {
|
||||
singleFileArray.value.push(JSON.parse(localStorage.getItem('singleFile')))
|
||||
singleFile.value = JSON.parse(localStorage.getItem('singleFile'))
|
||||
}
|
||||
|
||||
const filePreviewParam = ref({
|
||||
fileUrl: '',
|
||||
fileName: '',
|
||||
fileType: 'pdf'
|
||||
})
|
||||
const filePreviewRef = ref()
|
||||
const filePreviewShow = ref(false)
|
||||
|
||||
const _singleFileValue = computed({
|
||||
get() {
|
||||
return props.singleList;
|
||||
},
|
||||
set(value) {
|
||||
emit('update:singleList', value)
|
||||
}
|
||||
})
|
||||
const _otherFileListValue = computed({
|
||||
get() {
|
||||
return props.otherFileList;
|
||||
},
|
||||
set(value) {
|
||||
emit('update:otherFileList', value)
|
||||
}
|
||||
})
|
||||
if (_otherFileListValue.value && _otherFileListValue.value.length > 0) {
|
||||
isHaveOneFile.value = true
|
||||
_otherFileListValue.value.forEach(item => {
|
||||
allFileList.value.push(item)
|
||||
})
|
||||
}
|
||||
// watch(() => props.showSingleTable, (newVal) => {
|
||||
// props.showSingleTable = newVal
|
||||
// }, {deep: true})
|
||||
watch(() => props.formData.fileList, (newVal) => {
|
||||
if (props.preview) {
|
||||
newVal?.forEach(item => {
|
||||
isHaveOneFile.value = true
|
||||
allFileList.value.push(item)
|
||||
})
|
||||
}
|
||||
}, {immediate: true})
|
||||
|
||||
watch(() => props.formData.singleFile, (newVal) => {
|
||||
props.formData.singleFile = newVal
|
||||
if (newVal != null) {
|
||||
singleFileArray.value.push(newVal)
|
||||
} else {
|
||||
singleFileArray.value = []
|
||||
}
|
||||
singleFile.value = newVal
|
||||
}, {immediate: true})
|
||||
|
||||
|
||||
// watch(() => props.otherFileList, (newVal) => {
|
||||
// props.otherFileList=newVal
|
||||
// if (props.preview) {
|
||||
// console.log('newotherFileList', newVal,props.preview,props.formData.fileList)
|
||||
// if (props.formData.fileList === null || props.formData.fileList?.length === 0) {
|
||||
// allFileList.value = newVal
|
||||
// } else {
|
||||
// console.log('props.otherFileList',props.otherFileList)
|
||||
// // props.otherFileList?.forEach(item => {
|
||||
// // allFileList.value.push(item)
|
||||
// // })
|
||||
// }
|
||||
// } else {
|
||||
// allFileList.value = newVal
|
||||
// }
|
||||
// }, {deep: true})
|
||||
watch(() => props.showTable, (newVal) => {
|
||||
props.showTable = newVal
|
||||
}, {deep: true})
|
||||
// watch(() => props.singleList, (newVal) => {
|
||||
// console.log('singleFile', newVal)
|
||||
// singleFileList.value = newVal
|
||||
// }, {deep: true})
|
||||
|
||||
watch(() => isSingleFile.value, (newVal) => {
|
||||
isSingleFile.value = newVal
|
||||
}, {deep: true})
|
||||
watch(() => isHaveOneFile.value, (newVal) => {
|
||||
isHaveOneFile.value = newVal
|
||||
}, {deep: true})
|
||||
// watch(() => singleFile.value, (newVal) => {
|
||||
// singleFile.value = newVal
|
||||
// }, {deep: true})
|
||||
|
||||
|
||||
const handleImportTemplateDownload = async () => {
|
||||
console.info("🚀 ~method:handleImportTemplateDownload -----", props.tag)
|
||||
let templateType = ''
|
||||
let templateTypeList = ''
|
||||
let isZip = false
|
||||
if (props.tag === '需求上报') {
|
||||
templateType = '2'
|
||||
isZip = false
|
||||
} else if (props.tag === '项目立项') {
|
||||
templateTypeList = '5,6'
|
||||
isZip = true
|
||||
} else if (props.tag === '项目验收') {
|
||||
templateType = '7'
|
||||
isZip = false
|
||||
} else if (props.tag === '阶段变更') {
|
||||
templateTypeList = '8,9'
|
||||
isZip = true
|
||||
}
|
||||
let res = ''
|
||||
if (isZip) {
|
||||
res = await downloadTemplateZip(templateTypeList)
|
||||
let fileName = props.templateName +'.zip'
|
||||
const blob = new Blob([res.data])
|
||||
let a = document.createElement('a')
|
||||
a.href = URL.createObjectURL(blob)
|
||||
a.download = fileName
|
||||
a.click()
|
||||
} else {
|
||||
res = await downloadTemplate(templateType)
|
||||
const blob = new Blob([res])
|
||||
let a = document.createElement('a')
|
||||
a.href = URL.createObjectURL(blob)
|
||||
a.download = props.templateName + ".docx"
|
||||
a.click()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
const clickToPreview = (row) => {
|
||||
filePreviewShow.value = false
|
||||
console.log('clickToPreview', row, row.fileType)
|
||||
filePreviewParam.value = {
|
||||
fileUrl: row.url,
|
||||
fileName: row.originalFileName,
|
||||
fileType: row.fileType
|
||||
}
|
||||
nextTick(() => {
|
||||
filePreviewShow.value = true
|
||||
})
|
||||
// filePreviewRef.value.show()
|
||||
}
|
||||
|
||||
|
||||
const handleDelete = (row, type) => {
|
||||
// deleteFile(row.fileId).then(res => {
|
||||
// ElNotification({
|
||||
// title: '提示',
|
||||
// message: res.msg,
|
||||
// type: res.code === 1000 ? 'success' : 'error'
|
||||
// })
|
||||
// if (res.code === 1000) {
|
||||
if (type === 'single') {
|
||||
_singleFileValue.value.splice(_singleFileValue.value.findIndex((item) => item.fileId === row.fileId), 1);
|
||||
isSingleFile.value = false
|
||||
} else {
|
||||
allFileList.value.splice(allFileList.value.findIndex((item) => item.fileId === row.fileId), 1);
|
||||
isHaveOneFile.value = !(allFileList.value && allFileList.value?.length == 0);
|
||||
console.log('allFileList.value',allFileList.value)
|
||||
localStorage.setItem('deleteFileRow', JSON.stringify(row))
|
||||
if (localStorage.getItem('collectData')) {
|
||||
let collectData = JSON.parse(localStorage.getItem('collectData'))
|
||||
collectData.fileList = allFileList.value
|
||||
localStorage.setItem('collectData', JSON.stringify(collectData))
|
||||
}
|
||||
if (localStorage.getItem('otherFileList')) {
|
||||
localStorage.setItem('otherFileList', JSON.stringify(allFileList.value))
|
||||
}
|
||||
}
|
||||
// }
|
||||
// });
|
||||
}
|
||||
const handleSingleDelete = (row) => {
|
||||
handleDelete(row, 'single')
|
||||
}
|
||||
const getAttachment = (val) => {
|
||||
isSingleFile.value = true
|
||||
emit('getAttachment', val)
|
||||
}
|
||||
const compositeParam = (item) => {
|
||||
return {
|
||||
fileId: item.id,
|
||||
size: item.size,
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: true,
|
||||
tag: props.tag
|
||||
}
|
||||
}
|
||||
const getOtherFile = (val) => {
|
||||
if (props.preview) {
|
||||
allFileList.value.push(compositeParam(val))
|
||||
} else {
|
||||
allFileList.value = _otherFileListValue.value
|
||||
}
|
||||
|
||||
isHaveOneFile.value = true
|
||||
emit('getOtherFile', val)
|
||||
}
|
||||
const deleteAttachment = (val) => {
|
||||
deleteFile(val).then(res => {
|
||||
if (res.code === 1000) {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: "删除成功",
|
||||
type: 'success'
|
||||
})
|
||||
isSingleFile.value = false
|
||||
singleFile.value = null
|
||||
singleFileArray.value = []
|
||||
}
|
||||
});
|
||||
}
|
||||
const deleteSingleFile = (row, type) => {
|
||||
ElMessageBox.confirm(`确认删除名称为${row.originalFileName}的文件吗?`, '系统提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
deleteFile(row.fileId).then(res => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
isSingleFile.value = false
|
||||
if (type === 1) {
|
||||
singleFile.value = null
|
||||
singleFileArray.value = []
|
||||
} else {
|
||||
props.otherFileList.splice(props.otherFileList.findIndex((item) => item.fileId === row.fileId), 1);
|
||||
}
|
||||
}
|
||||
});
|
||||
}).catch(() => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: "用户取消删除! ",
|
||||
type: 'warning'
|
||||
})
|
||||
})
|
||||
}
|
||||
const handleDownload = (row) => {
|
||||
downloadFile(row.fileId).then(res => {
|
||||
const blob = new Blob([res])
|
||||
let a = document.createElement('a')
|
||||
a.href = URL.createObjectURL(blob)
|
||||
a.download = row.originalFileName
|
||||
a.click()
|
||||
})
|
||||
}
|
||||
defineExpose({
|
||||
validate() {
|
||||
return applyForm.value.validate()
|
||||
},
|
||||
clearValidate() {
|
||||
return applyForm.value.clearValidate()
|
||||
},
|
||||
allFileList,
|
||||
singleFile,
|
||||
isSingleFile,
|
||||
isHaveOneFile,
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
:deep(.el-table--fit ) {
|
||||
height: 160px !important;
|
||||
}
|
||||
:deep(.el-table__header) {
|
||||
.is-leaf:first-child {
|
||||
.cell {
|
||||
margin-left: -22px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
:deep(.el-table__body) {
|
||||
.el-table__cell:first-child {
|
||||
.cell {
|
||||
margin-left: -11px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,111 +1,110 @@
|
||||
<template>
|
||||
<el-button color="#DED0B2" style="float: right;margin: 0 10px 10px 0" @click="exportExcelHandler">导出</el-button>
|
||||
<el-table ref="table" :data="tableData" style="width: 100%;height: 479px" :show-summary="true" border
|
||||
:summary-method="getSummaries" v-loading="loading" :header-cell-style="{background:'#f5f7fa'}">
|
||||
<el-table-column type="index" label="序号" align="center" width="60"/>
|
||||
<el-table-column prop="projectName" label="项目名称" align="center"/>
|
||||
<el-table-column prop="projectCost" label="费用性质" align="center">
|
||||
<template #default="scope">
|
||||
<div v-if="scope.row.projectCost !== null">
|
||||
<Tag dictType="project_cost" :value="scope.row.projectCost"/>
|
||||
</div>
|
||||
<div v-else>--</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="researchStage" label="研发阶段" align="center">
|
||||
<template #default="scope">
|
||||
<div v-if="scope.row.researchStage !== null && scope.row.researchStage !== null && scope.row.researchStage !== undefined">
|
||||
<el-tag effect="plain">{{scope.row.researchStage==1?'开发阶段':'研究阶段'}}</el-tag>
|
||||
</div>
|
||||
<div v-else>--</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="afterTax" label="分摊金额" align="center">
|
||||
<template #default="scope">
|
||||
<div v-if="scope.row.afterTax !== null">
|
||||
<!-- {{ toThousands(scope.row.afterTax) }}-->
|
||||
{{ scope.row.afterTax }}
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!-- <Tag dictType="research_stage" :value="scope.row.researchStage"/>-->
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {getAllocationSummaryDetails} from "@/api/expense-manage";
|
||||
import {shareExportExcel} from "@/api/expense-manage";
|
||||
|
||||
const props = defineProps({
|
||||
allocationName :{
|
||||
type: String,
|
||||
default: ''
|
||||
}
|
||||
})
|
||||
|
||||
const tableData = ref()
|
||||
const loading = ref(false)
|
||||
const table = ref()
|
||||
const route = useRoute()
|
||||
const getSummaries = (param) => {
|
||||
const {columns, data} = param
|
||||
const sums = []
|
||||
columns.forEach((column, index) => {
|
||||
if (index === 0) {
|
||||
sums[index] = '小计'
|
||||
} else if (index === 4) {
|
||||
const values = data.map((item) => Number(item[column.property]))
|
||||
if (!values.every((value) => Number.isNaN(value))) {
|
||||
sums[index] = `${values.reduce((prev, curr) => {
|
||||
const value = Number(curr)
|
||||
if (!Number.isNaN(value)) {
|
||||
return prev + curr
|
||||
} else {
|
||||
return prev
|
||||
}
|
||||
}, 0)}`
|
||||
sums[index] = parseFloat(sums[index]).toFixed(2)
|
||||
// sums[index] = toThousands(sums[index])
|
||||
} else {
|
||||
sums[index] = '-'
|
||||
}
|
||||
}
|
||||
})
|
||||
return sums
|
||||
}
|
||||
// const exportTable = () => {
|
||||
// const $e = table.value.$el
|
||||
// let $table = $e.querySelector('.el-table__fixed')
|
||||
// if (!$table) {
|
||||
// $table = $e
|
||||
// }
|
||||
// exportExcel($table, (5 + (Object.keys(tableData.value[0]).length - 5) * 5), "四川省国有资产经营投资管理有限责任公司科技创新项目费用分摊表", 2)
|
||||
// }
|
||||
const exportExcelHandler = () => {
|
||||
shareExportExcel(route.query.id).then(res => {
|
||||
console.log(res)
|
||||
let fileName = `科技创新项目费用分摊表-${props.allocationName}.zip`
|
||||
const blob = new Blob([res.data])
|
||||
let a = document.createElement('a')
|
||||
a.href = URL.createObjectURL(blob)
|
||||
a.download = fileName
|
||||
a.click()
|
||||
})
|
||||
}
|
||||
const init = () => {
|
||||
loading.value = true
|
||||
let params = {
|
||||
allocationId: route.query.id
|
||||
}
|
||||
getAllocationSummaryDetails(params).then(res => {
|
||||
tableData.value = res.data
|
||||
loading.value = false
|
||||
})
|
||||
}
|
||||
init()
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
<template>
|
||||
<el-button color="#DED0B2" style="float: right;margin: 0 10px 10px 0" @click="exportExcelHandler">导出</el-button>
|
||||
<el-table ref="table" :data="tableData" style="width: 100%;height: 479px" :show-summary="true" border
|
||||
:summary-method="getSummaries" v-loading="loading" :header-cell-style="{background:'#f5f7fa'}">
|
||||
<el-table-column type="index" label="序号" align="center" width="60"/>
|
||||
<el-table-column prop="projectName" label="项目名称" align="center"/>
|
||||
<el-table-column prop="projectCost" label="费用性质" align="center">
|
||||
<template #default="scope">
|
||||
<div v-if="scope.row.projectCost !== null">
|
||||
<Tag dictType="project_cost" :value="scope.row.projectCost"/>
|
||||
</div>
|
||||
<div v-else>--</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="researchStage" label="研发阶段" align="center">
|
||||
<template #default="scope">
|
||||
<div v-if="scope.row.researchStage !== null && scope.row.researchStage !== null && scope.row.researchStage !== undefined">
|
||||
<el-tag effect="plain">{{scope.row.researchStage==1?'开发阶段':'研究阶段'}}</el-tag>
|
||||
</div>
|
||||
<div v-else>--</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="afterTax" label="分摊金额" align="center">
|
||||
<template #default="scope">
|
||||
<div v-if="scope.row.afterTax !== null">
|
||||
<!-- {{ toThousands(scope.row.afterTax) }}-->
|
||||
{{ scope.row.afterTax }}
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!-- <Tag dictType="research_stage" :value="scope.row.researchStage"/>-->
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {getAllocationSummaryDetails} from "@/api/expense-manage";
|
||||
import {shareExportExcel} from "@/api/expense-manage";
|
||||
|
||||
const props = defineProps({
|
||||
allocationName :{
|
||||
type: String,
|
||||
default: ''
|
||||
}
|
||||
})
|
||||
|
||||
const tableData = ref()
|
||||
const loading = ref(false)
|
||||
const table = ref()
|
||||
const route = useRoute()
|
||||
const getSummaries = (param) => {
|
||||
const {columns, data} = param
|
||||
const sums = []
|
||||
columns.forEach((column, index) => {
|
||||
if (index === 0) {
|
||||
sums[index] = '小计'
|
||||
} else if (index === 4) {
|
||||
const values = data.map((item) => Number(item[column.property]))
|
||||
if (!values.every((value) => Number.isNaN(value))) {
|
||||
sums[index] = `${values.reduce((prev, curr) => {
|
||||
const value = Number(curr)
|
||||
if (!Number.isNaN(value)) {
|
||||
return prev + curr
|
||||
} else {
|
||||
return prev
|
||||
}
|
||||
}, 0)}`
|
||||
sums[index] = parseFloat(sums[index]).toFixed(2)
|
||||
// sums[index] = toThousands(sums[index])
|
||||
} else {
|
||||
sums[index] = '-'
|
||||
}
|
||||
}
|
||||
})
|
||||
return sums
|
||||
}
|
||||
// const exportTable = () => {
|
||||
// const $e = table.value.$el
|
||||
// let $table = $e.querySelector('.el-table__fixed')
|
||||
// if (!$table) {
|
||||
// $table = $e
|
||||
// }
|
||||
// exportExcel($table, (5 + (Object.keys(tableData.value[0]).length - 5) * 5), "四川省国有资产经营投资管理有限责任公司科技创新项目费用分摊表", 2)
|
||||
// }
|
||||
const exportExcelHandler = () => {
|
||||
shareExportExcel(route.query.id).then(res => {
|
||||
let fileName = `科技创新项目费用分摊表-${props.allocationName}.zip`
|
||||
const blob = new Blob([res.data])
|
||||
let a = document.createElement('a')
|
||||
a.href = URL.createObjectURL(blob)
|
||||
a.download = fileName
|
||||
a.click()
|
||||
})
|
||||
}
|
||||
const init = () => {
|
||||
loading.value = true
|
||||
let params = {
|
||||
allocationId: route.query.id
|
||||
}
|
||||
getAllocationSummaryDetails(params).then(res => {
|
||||
tableData.value = res.data
|
||||
loading.value = false
|
||||
})
|
||||
}
|
||||
init()
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
|
||||
@@ -1,194 +1,208 @@
|
||||
<template>
|
||||
<div v-loading="loading">
|
||||
<baseTitle title="需求征集信息" v-if="type!=='singleDetail'"></baseTitle>
|
||||
<el-form :model="formData">
|
||||
<el-row>
|
||||
<el-col :span="6" v-if="type==='singleDetail'">
|
||||
<el-form-item label="征集名称">
|
||||
<span>{{ formData.requirementName }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="征集类型">
|
||||
<span>{{ formData.collectType }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="需求上报截止时间">
|
||||
<span>{{ formData.deadline }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6" v-if="formData.isSpecialFund">
|
||||
<el-form-item label="专项资金名称">
|
||||
<span>{{ formData.specialFund }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" v-if="type==='singleDetail'">
|
||||
<el-form-item label="征集公司">
|
||||
<span :class="showExpendClass(showMoreCompany,formData.companyIds)">{{
|
||||
getCompanyName(formData.companyIds)
|
||||
}}</span>
|
||||
<div style="color: #2a99ff;text-align: center;width: 100%;font-size: 15px;cursor: pointer"
|
||||
@click="handleExpend">{{ showExpendText }}
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24">
|
||||
<baseTitle title="征集说明"></baseTitle>
|
||||
<el-form-item>
|
||||
<el-card style="width: 100%">
|
||||
<div v-html="formData.collectExplain">
|
||||
</div>
|
||||
</el-card>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<baseTitle v-if="fileListShow === 'READ' || fileListShow === 'EDIT'" title="附件列表"></baseTitle>
|
||||
<el-col :span="24">
|
||||
<file-component title="" tag="需求征集"
|
||||
v-model:value="formData.fileList" :processViewer="processViewer"
|
||||
:file-list-show="fileListShow"/>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<div v-if="data.taskId">
|
||||
<baseTitle title="审核意见"></baseTitle>
|
||||
<el-form-item prop="_value">
|
||||
<el-input
|
||||
v-model="_value"
|
||||
:rows="3"
|
||||
type="textarea"
|
||||
placeholder="请输入审核意见"
|
||||
/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<div class="approval-record">
|
||||
<div class="approval-title">
|
||||
<baseTitle title="审批记录"></baseTitle>
|
||||
<div class="diagram">
|
||||
<div class="base-title">流程图</div>
|
||||
<el-switch
|
||||
v-model="changeDiagram"
|
||||
style="--el-switch-on-color:#BEA266; --el-switch-off-color:#cecdcd"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="process">
|
||||
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
|
||||
:operation-list="data.operationList"
|
||||
:state="data.state"/>
|
||||
<process-diagram-viewer v-if="processViewer&&changeDiagram" id-name="collectionProcess"/>
|
||||
</div>
|
||||
</div>
|
||||
</el-form>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'
|
||||
import {downloadFile} from "@/api/project-demand";
|
||||
|
||||
const emit = defineEmits(['update:value'])
|
||||
const showExpendText = ref('')
|
||||
const showMoreCompany = ref(false)
|
||||
const props = defineProps({
|
||||
formData: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
data: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
processViewer: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
companyOption: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
loading: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
fileListShow: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
type: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
value: {
|
||||
type: String,
|
||||
default: ''
|
||||
}
|
||||
})
|
||||
const changeDiagram = ref(false)
|
||||
const _value = computed({
|
||||
get() {
|
||||
return props.value;
|
||||
},
|
||||
set(val) {
|
||||
emit("update:value", val);
|
||||
}
|
||||
})
|
||||
const getCompanyName = (data) => {
|
||||
if (data) {
|
||||
return data.join(',')
|
||||
}
|
||||
}
|
||||
const handleExpend = () => {
|
||||
showMoreCompany.value = !showMoreCompany.value;
|
||||
showExpendClass(showMoreCompany.value, props.formData.companyIds)
|
||||
}
|
||||
const showExpendClass = (showMoreCompany, data) => {
|
||||
if (!showMoreCompany) {
|
||||
if (data && data.length > 14) {
|
||||
showExpendText.value = '展开'
|
||||
return 'company-style'
|
||||
}
|
||||
} else {
|
||||
showExpendText.value = '收缩'
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
const handleDownload = (row) => {
|
||||
downloadFile(row.fileId).then(res => {
|
||||
const blob = new Blob([res])
|
||||
let a = document.createElement('a')
|
||||
a.href = URL.createObjectURL(blob)
|
||||
a.download = row.originalFileName
|
||||
a.click()
|
||||
})
|
||||
}
|
||||
|
||||
watch(() => props.loading, (newVal) => {
|
||||
props.loading = newVal
|
||||
}, {deep: true})
|
||||
|
||||
watch(() => props.processViewer, (newVal) => {
|
||||
props.processViewer = newVal
|
||||
}, {deep: true})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
:deep(.el-empty__description) {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.company-style {
|
||||
//width: 98%;
|
||||
min-height: 30px;
|
||||
max-height: 60px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
-webkit-line-clamp: 2;
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
}
|
||||
</style>
|
||||
<template>
|
||||
<div v-loading="loading" :style="type==='singleDetail'?'padding: 0 30px':''">
|
||||
<baseTitle title="需求征集信息" v-if="type!=='singleDetail'"></baseTitle>
|
||||
<el-form :model="formData" >
|
||||
<el-row gutter="20" style="margin-left: 5px">
|
||||
<el-col :span="6">
|
||||
<el-form-item label="征集名称">
|
||||
<span>{{ formData.requirementName }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="征集类型">
|
||||
<span>{{ formData.collectType }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="需求上报截止时间">
|
||||
<span>{{ formData.deadline }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6" v-if="formData.isSpecialFund">
|
||||
<el-form-item label="专项资金名称">
|
||||
<span>{{ formData.specialFund }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" v-if="type==='singleDetail'">
|
||||
<el-form-item label="征集公司">
|
||||
<span :class="showExpendClass(showMoreCompany,formData.companyIds)">{{
|
||||
getCompanyName(formData.companyIds)
|
||||
}}</span>
|
||||
<div style="color: #2a99ff;text-align: center;width: 100%;font-size: 15px;cursor: pointer"
|
||||
@click="handleExpend">{{ showExpendText }}
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" style="margin-bottom: -15px">
|
||||
<el-form-item label="征集说明">
|
||||
<div v-if="formData.collectExplain" v-html="formData.collectExplain" style="white-space: pre-wrap;">
|
||||
</div>
|
||||
<div v-else>--</div>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<baseTitle v-if="fileListShow === 'READ' || fileListShow === 'EDIT'" title="附件文件" style="margin-bottom: 0"></baseTitle>
|
||||
<file-component title="" tag="需求征集"
|
||||
v-model:value="formData.fileList" :processViewer="processViewer"
|
||||
:file-list-show="fileListShow"/>
|
||||
</el-col>
|
||||
<el-col :span="24" style="margin-top: -15px">
|
||||
<div v-if="data.taskId">
|
||||
<baseTitle title="审核意见"></baseTitle>
|
||||
<el-form-item prop="_value">
|
||||
<el-input
|
||||
v-model="_value"
|
||||
:rows="3"
|
||||
type="textarea"
|
||||
placeholder="请输入审核意见"
|
||||
/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<div class="approval-record" style="margin-top: -15px">
|
||||
<div class="approval-title">
|
||||
<baseTitle title="审批记录"></baseTitle>
|
||||
<div class="diagram">
|
||||
<div class="base-title">流程图</div>
|
||||
<el-switch
|
||||
v-model="changeDiagram"
|
||||
style="--el-switch-on-color:#BEA266; --el-switch-off-color:#cecdcd"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="process">
|
||||
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
|
||||
:operation-list="data.operationList"
|
||||
:state="data.state"/>
|
||||
<process-diagram-viewer v-if="processViewer&&changeDiagram" id-name="collectionProcess"/>
|
||||
</div>
|
||||
</div>
|
||||
</el-form>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'
|
||||
import {downloadFile} from "@/api/project-demand";
|
||||
|
||||
const emit = defineEmits(['update:value'])
|
||||
const showExpendText = ref('')
|
||||
const showMoreCompany = ref(false)
|
||||
const props = defineProps({
|
||||
formData: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
data: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
processViewer: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
companyOption: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
loading: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
fileListShow: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
type: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
value: {
|
||||
type: String,
|
||||
default: ''
|
||||
}
|
||||
})
|
||||
const changeDiagram = ref(false)
|
||||
const _value = computed({
|
||||
get() {
|
||||
return props.value;
|
||||
},
|
||||
set(val) {
|
||||
emit("update:value", val);
|
||||
}
|
||||
})
|
||||
const getCompanyName = (data) => {
|
||||
if (data) {
|
||||
return data.join(',')
|
||||
}
|
||||
}
|
||||
const handleExpend = () => {
|
||||
showMoreCompany.value = !showMoreCompany.value;
|
||||
showExpendClass(showMoreCompany.value, props.formData.companyIds)
|
||||
}
|
||||
const showExpendClass = (showMoreCompany, data) => {
|
||||
if (!showMoreCompany) {
|
||||
if (data && data.length > 14) {
|
||||
showExpendText.value = '展开'
|
||||
return 'company-style'
|
||||
}
|
||||
} else {
|
||||
showExpendText.value = '收缩'
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
const handleDownload = (row) => {
|
||||
downloadFile(row.fileId).then(res => {
|
||||
const blob = new Blob([res])
|
||||
let a = document.createElement('a')
|
||||
a.href = URL.createObjectURL(blob)
|
||||
a.download = row.originalFileName
|
||||
a.click()
|
||||
})
|
||||
}
|
||||
|
||||
watch(() => props.loading, (newVal) => {
|
||||
props.loading = newVal
|
||||
}, {deep: true})
|
||||
|
||||
watch(() => props.processViewer, (newVal) => {
|
||||
props.processViewer = newVal
|
||||
}, {deep: true})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
:deep(.el-empty__description) {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.company-style {
|
||||
//width: 98%;
|
||||
min-height: 30px;
|
||||
max-height: 60px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
-webkit-line-clamp: 2;
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
}
|
||||
:deep(.el-table__header) {
|
||||
.is-leaf:first-child {
|
||||
.cell {
|
||||
margin-left: -53px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
:deep(.el-table__body) {
|
||||
.el-table__cell:first-child {
|
||||
.cell {
|
||||
margin-left: -26px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,406 +1,424 @@
|
||||
<template>
|
||||
<el-dialog custom-class="custom-dialog" class="border" :border="false" width="1000px" style="height: 676px"
|
||||
:title="title" :show-close="false" :visible.sync="visible" v-model="visible" append-to-body :close-on-click-modal="true" @close="closeDialog">
|
||||
<div class="picker">
|
||||
<div class="candidate" v-loading="loading">
|
||||
<el-input v-model="filterText"
|
||||
clearable placeholder="输入公司进行搜索">
|
||||
<template #append>
|
||||
<el-button @click="getList()">搜索</el-button>
|
||||
</template>
|
||||
</el-input>
|
||||
<fvCheckbox style="margin-left: 10px" :options="checkOptions" v-model="checkList" @change="checkBoxChange"/>
|
||||
<!-- 人员选择 -->
|
||||
<el-empty :image-size="100" description="似乎没有数据" v-show="dataList.length === 0"/>
|
||||
<el-scrollbar style="height:87%;">
|
||||
<div class="tree">
|
||||
<el-tree :data="dataList" ref="tree" :props="defaultProps" empty-text="" node-key="value"
|
||||
:show-checkbox="showCheckbox" highlight-current default-expand-all
|
||||
:default-checked-keys="defaultChecked" :disabled="disabled"
|
||||
:check-strictly="!checkStrictly" @node-click="(node,check)=>handle(node,check)"
|
||||
@check-change="handleChange" :filter-node-method="filterNode">
|
||||
<template #default="{ node, data }">
|
||||
<div class="tree-node">
|
||||
<div style="display: flex;align-items: center;padding: 3px 0">
|
||||
{{ node.label }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</el-tree>
|
||||
</div>
|
||||
</el-scrollbar>
|
||||
</div>
|
||||
<div class="selected">
|
||||
<div class="count">
|
||||
<span>已选 {{ selectList.length }} 项</span>
|
||||
<span @click="clearSelected">清空</span>
|
||||
</div>
|
||||
<div class="org-items">
|
||||
<el-empty :image-size="100" description="请点击左侧列表选择数据" v-show="selectList.length === 0"/>
|
||||
<div v-for="(selectItem, selectIndex) in selectList" :key="selectIndex" class="org-item">
|
||||
{{ selectItem.label }}
|
||||
<el-icon @click="noSelected(selectItem)" size="20" style="margin-left: 10px;cursor: pointer;">
|
||||
<CircleClose/>
|
||||
</el-icon>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
<el-button size="mini" @click="visible = false">取 消</el-button>
|
||||
<el-button size="mini" color="#DED0B2" @click="selectConfirm">确 定</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {ElMessageBox} from "element-plus";
|
||||
import {getSubCompOpt} from "@/api/user/user";
|
||||
|
||||
const checkList = ref(['1'])
|
||||
const checkStrictly = ref(false)
|
||||
const isExpand = ref('展开')
|
||||
const expandedKeys = ref(['-1']);
|
||||
const checkOptions = ref([
|
||||
{
|
||||
label: isExpand.value,
|
||||
value: '1'
|
||||
},
|
||||
// {
|
||||
// label: '父子联动',
|
||||
// value: '2'
|
||||
// },
|
||||
])
|
||||
const props = defineProps({
|
||||
value: {
|
||||
type: Array,
|
||||
default: () => {
|
||||
return [];
|
||||
}
|
||||
},
|
||||
multiple: { //是否多选
|
||||
default: true,
|
||||
type: Boolean
|
||||
},
|
||||
showCheckbox: { //是否显示左侧选择框
|
||||
default: true,
|
||||
type: Boolean
|
||||
}
|
||||
});
|
||||
let selectItem = reactive({
|
||||
type: -1,
|
||||
value: "0"
|
||||
});
|
||||
const visible = ref(false);
|
||||
const loading = ref(false);
|
||||
const title = ref("请选择");
|
||||
const selectList = ref([]);
|
||||
const filterText = ref("");
|
||||
const dataList = ref([]);
|
||||
const defaultChecked = ref([]);
|
||||
const tree = ref([]);
|
||||
const defaultProps = {
|
||||
value: "value",
|
||||
label: "label",
|
||||
children: "children",
|
||||
disabled: "disabled",
|
||||
};
|
||||
const emit = defineEmits(['update:modelValue'])
|
||||
const _value = computed({
|
||||
get() {
|
||||
return props.value;
|
||||
},
|
||||
set(value) {
|
||||
emit('update:modelValue', value)
|
||||
}
|
||||
});
|
||||
|
||||
watch(() => filterText.value, (newVal) => {
|
||||
tree.value.filter(newVal);
|
||||
});
|
||||
const closeDialog=()=>{
|
||||
console.log('关闭')
|
||||
visible.value=false
|
||||
filterText.value=''
|
||||
}
|
||||
const checkBoxChange = (val) => {
|
||||
checkStrictly.value = val.includes('2')
|
||||
let nodes = tree.value.store.nodesMap
|
||||
if (val.includes('1')) {
|
||||
for (const node in nodes) {
|
||||
nodes[node].expanded = true;
|
||||
}
|
||||
isExpand.value = '折叠'
|
||||
} else {
|
||||
for (const node in nodes) {
|
||||
nodes[node].expanded = false;
|
||||
}
|
||||
isExpand.value = '展开'
|
||||
}
|
||||
}
|
||||
const getList = () => {
|
||||
getSubCompOpt().then(res => {
|
||||
dataList.value = [
|
||||
{
|
||||
label: "所有公司",
|
||||
value: -1,
|
||||
},
|
||||
...res.data
|
||||
]
|
||||
});
|
||||
};
|
||||
|
||||
//通过关键字过滤树节点
|
||||
const filterNode = (value, data) => {
|
||||
//通过关键字过滤树节点
|
||||
if (!value) return true;
|
||||
return data.label.indexOf(value) !== -1;
|
||||
};
|
||||
//用于用户选择
|
||||
const show = () => {
|
||||
//用于弹开部门选择
|
||||
visible.value = true;
|
||||
selectList.value = _value.value
|
||||
defaultChecked.value = _value.value.map(item => item.value)
|
||||
getList()
|
||||
};
|
||||
|
||||
const updateTreeCheck = (list, flag) => {
|
||||
list.forEach(item => {
|
||||
if (item.value !== -1) {
|
||||
tree.value.setChecked(item, flag)
|
||||
if (item.children !== undefined) {
|
||||
updateTreeCheck(item.children, flag)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
const handleChange = (data, checked) => {
|
||||
if (data.value == -1) {
|
||||
if(checked){
|
||||
updateTreeCheck(dataList.value, false)
|
||||
tree.value.setChecked(data,true);
|
||||
}
|
||||
}
|
||||
if(tree.value.getCheckedKeys().length>1&&tree.value.getCheckedKeys().indexOf(-1)!==-1){
|
||||
tree.value.setChecked(-1,false);
|
||||
}
|
||||
// 左侧有选择框 + 多选
|
||||
if (props.multiple) {
|
||||
//不添加重复的数据到右边
|
||||
for (let i = 0; i < selectList.value.length; i++) {
|
||||
if (selectList.value[i].value === data.value) {
|
||||
selectList.value.splice(i, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (checked) {
|
||||
// if (data.children === undefined) {
|
||||
selectList.value.push(data);
|
||||
// }
|
||||
} else if (data === "1") {
|
||||
tree.value.setCheckedKeys([]);
|
||||
selectList.value = [];
|
||||
}
|
||||
} else {// 左侧有选择框 + 单选
|
||||
//不添加重复的数据到右边
|
||||
for (let i = 0; i < selectList.value.length; i++) {
|
||||
if (selectList.value[i].value === data.value) {
|
||||
selectList.value.splice(i, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (checked) {
|
||||
tree.value.setCheckedNodes([data]);
|
||||
selectList.value = [data];
|
||||
} else if (data === "1") {
|
||||
selectList.value = [];
|
||||
tree.value.setCheckedKeys([]);
|
||||
}
|
||||
}
|
||||
};
|
||||
const handle = (node, check) => {
|
||||
if (check.isLeaf !== false) {
|
||||
if (props.multiple) {
|
||||
//不添加重复的数据到右边
|
||||
for (let i = 0; i < selectList.value.length; i++) {
|
||||
if (selectList.value[i].value === node.value) {
|
||||
selectList.value.splice(i, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
check.checked = true;
|
||||
selectList.value.push(node);
|
||||
} else {
|
||||
check.checked = true;
|
||||
selectList.value = [node];
|
||||
}
|
||||
}
|
||||
// _value.value = selectList.value
|
||||
};
|
||||
const noSelected = (selectItem) => {
|
||||
//左侧无选择框时,右侧显示×
|
||||
for (let i = 0; i < selectList.value.length; i++) {
|
||||
if (selectList.value[i].value === selectItem.value) {
|
||||
tree.value.setChecked(selectList.value[i].value, false);
|
||||
selectList.value.splice(i, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (props.showCheckbox) {
|
||||
// 左侧有选择框 + 单选
|
||||
if (props.multiple === false) {
|
||||
tree.value.setCheckedKeys([]);
|
||||
}
|
||||
}
|
||||
};
|
||||
const clearSelected = () => {
|
||||
//清空
|
||||
ElMessageBox.confirm("您确定要清空已选中的项?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(() => {
|
||||
if (!props.showCheckbox) {
|
||||
selectList.value = [];
|
||||
} else {
|
||||
handleChange("1");
|
||||
}
|
||||
});
|
||||
};
|
||||
const selectConfirm = () => {
|
||||
//确定按钮
|
||||
emit("ok", selectList.value);
|
||||
dataList.value = []
|
||||
visible.value = false;
|
||||
};
|
||||
defineExpose({
|
||||
show
|
||||
});
|
||||
getList()
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
$containWidth: 480px;
|
||||
:deep(.tree) {
|
||||
.el-tree-node__content {
|
||||
height: 34px;
|
||||
|
||||
.tree-node {
|
||||
font-size: 18px;
|
||||
}
|
||||
}
|
||||
|
||||
//.el-tree-node {
|
||||
// .is-leaf + .el-checkbox .el-checkbox__inner {
|
||||
// display: inline-block;
|
||||
// }
|
||||
//
|
||||
// .el-checkbox .el-checkbox__inner {
|
||||
// display: none;
|
||||
// }
|
||||
//}
|
||||
}
|
||||
|
||||
.footer {
|
||||
float: right;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.picker {
|
||||
height: 560px;
|
||||
position: relative;
|
||||
text-align: left;
|
||||
|
||||
.candidate {
|
||||
position: absolute;
|
||||
display: block;
|
||||
width: $containWidth;
|
||||
height: 100%;
|
||||
border: 1px solid #e8e8e8;
|
||||
|
||||
:deep(.el-input) {
|
||||
height: 40px;
|
||||
|
||||
.el-input__inner, .el-input-group__append {
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.selected {
|
||||
right: 0;
|
||||
top: 0;
|
||||
position: absolute;
|
||||
display: inline-block;
|
||||
width: 450px;
|
||||
height: 100%;
|
||||
border: 1px solid #e8e8e8;
|
||||
|
||||
.count {
|
||||
width: 100%;
|
||||
padding: 10px;
|
||||
display: inline-block;
|
||||
border-bottom: 1px solid #e8e8e8;
|
||||
margin-bottom: 5px;
|
||||
font-size: 16px;
|
||||
|
||||
> span:nth-child(2) {
|
||||
float: right;
|
||||
color: #c75450;
|
||||
cursor: pointer;
|
||||
margin-left: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.org-items {
|
||||
overflow-y: auto;
|
||||
height: 90%;
|
||||
|
||||
.el-icon-close {
|
||||
position: absolute;
|
||||
right: 5px;
|
||||
cursor: pointer;
|
||||
font-size: larger;
|
||||
}
|
||||
|
||||
.org-item {
|
||||
margin: 0 5px;
|
||||
border-radius: 5px;
|
||||
position: relative;
|
||||
padding: 7px 5px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 16px;
|
||||
|
||||
&:hover {
|
||||
background: #f1f1f1;
|
||||
}
|
||||
|
||||
> span {
|
||||
margin-left: 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.el-scrollbar .el-scrollbar__wrap {
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar {
|
||||
float: right;
|
||||
width: 4px;
|
||||
height: 4px;
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
border-radius: 16px;
|
||||
background-color: #efefef;
|
||||
}
|
||||
|
||||
</style>
|
||||
<template>
|
||||
<el-dialog custom-class="custom-dialog" class="border" :border="false" width="1000px" style="height: 676px"
|
||||
:title="title" :show-close="false" :visible.sync="visible" v-model="visible" append-to-body :close-on-click-modal="false" @close="closeDialog">
|
||||
<div class="picker">
|
||||
<div class="candidate" v-loading="loading">
|
||||
<el-input v-model="filterText"
|
||||
clearable placeholder="输入公司进行搜索">
|
||||
<template #append>
|
||||
<el-button @click="getList()">搜索</el-button>
|
||||
</template>
|
||||
</el-input>
|
||||
<fvCheckbox style="margin-left: 10px" :options="checkOptions" v-model="checkList" @change="checkBoxChange"/>
|
||||
<!-- 人员选择 -->
|
||||
<el-empty :image-size="100" description="似乎没有数据" v-show="dataList.length === 0"/>
|
||||
<el-scrollbar style="height:87%;">
|
||||
<div class="tree">
|
||||
<el-tree :data="dataList" ref="tree" :props="defaultProps" empty-text="" node-key="value"
|
||||
:show-checkbox="showCheckbox" highlight-current default-expand-all
|
||||
:default-checked-keys="defaultChecked" :disabled="disabled"
|
||||
:check-strictly="!checkStrictly" @node-click="(node,check)=>handleNodeClick(node,check)"
|
||||
@check-change="handleCheckClick" :filter-node-method="filterNode">
|
||||
<template #default="{ node, data }">
|
||||
<div class="tree-node">
|
||||
<div style="display: flex;align-items: center;padding: 3px 0">
|
||||
{{ node.label }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</el-tree>
|
||||
</div>
|
||||
</el-scrollbar>
|
||||
</div>
|
||||
<div class="selected">
|
||||
<div class="count">
|
||||
<span>已选 {{ selectList.length }} 项</span>
|
||||
<span @click="clearSelected">清空</span>
|
||||
</div>
|
||||
<div class="org-items">
|
||||
<el-empty :image-size="100" description="请点击左侧列表选择数据" v-show="selectList.length === 0"/>
|
||||
<div v-for="(selectItem, selectIndex) in selectList" :key="selectIndex" class="org-item">
|
||||
{{ selectItem.label }}
|
||||
<el-icon @click="removeSingleSelected(selectItem)" size="20" style="margin-left: 10px;cursor: pointer;">
|
||||
<CircleClose/>
|
||||
</el-icon>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
<el-button size="mini" @click="cancelUserPicker">取 消</el-button>
|
||||
<el-button size="mini" color="#DED0B2" @click="selectConfirm">确 定</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {ElMessageBox} from "element-plus";
|
||||
import {getSubCompOpt} from "@/api/user/user";
|
||||
|
||||
const checkList = ref(['1'])
|
||||
const checkStrictly = ref(false)
|
||||
const isExpand = ref('展开')
|
||||
const expandedKeys = ref(['-1']);
|
||||
const checkOptions = ref([
|
||||
{
|
||||
label: isExpand.value,
|
||||
value: '1'
|
||||
},
|
||||
// {
|
||||
// label: '父子联动',
|
||||
// value: '2'
|
||||
// },
|
||||
])
|
||||
const props = defineProps({
|
||||
value: {
|
||||
type: Array,
|
||||
default: () => {
|
||||
return [];
|
||||
}
|
||||
},
|
||||
multiple: { //是否多选
|
||||
default: true,
|
||||
type: Boolean
|
||||
},
|
||||
showCheckbox: { //是否显示左侧选择框
|
||||
default: true,
|
||||
type: Boolean
|
||||
}
|
||||
});
|
||||
let selectItem = reactive({
|
||||
type: -1,
|
||||
value: "0"
|
||||
});
|
||||
const visible = ref(false);
|
||||
const loading = ref(false);
|
||||
const title = ref("请选择");
|
||||
const selectList = ref([]);
|
||||
const filterText = ref("");
|
||||
const dataList = ref([]);
|
||||
const defaultChecked = ref([]);
|
||||
const tree = ref([]);
|
||||
const defaultProps = {
|
||||
value: "value",
|
||||
label: "label",
|
||||
children: "children",
|
||||
disabled: "disabled",
|
||||
};
|
||||
|
||||
const isRemoveSingleSelected = ref(false);
|
||||
const emit = defineEmits(['update:modelValue'])
|
||||
const _value = computed({
|
||||
get() {
|
||||
return props.value;
|
||||
},
|
||||
set(value) {
|
||||
emit('update:modelValue', value)
|
||||
}
|
||||
});
|
||||
|
||||
watch(() => filterText.value, (newVal) => {
|
||||
tree.value.filter(newVal);
|
||||
});
|
||||
const closeDialog=()=>{
|
||||
console.log('关闭')
|
||||
visible.value=false
|
||||
filterText.value=''
|
||||
}
|
||||
const checkBoxChange = (val) => {
|
||||
checkStrictly.value = val.includes('2')
|
||||
let nodes = tree.value.store.nodesMap
|
||||
if (val.includes('1')) {
|
||||
for (const node in nodes) {
|
||||
nodes[node].expanded = true;
|
||||
}
|
||||
isExpand.value = '折叠'
|
||||
} else {
|
||||
for (const node in nodes) {
|
||||
nodes[node].expanded = false;
|
||||
}
|
||||
isExpand.value = '展开'
|
||||
}
|
||||
}
|
||||
const getList = () => {
|
||||
getSubCompOpt().then(res => {
|
||||
dataList.value = [
|
||||
{
|
||||
label: "所有公司",
|
||||
value: -1,
|
||||
},
|
||||
...res.data
|
||||
]
|
||||
});
|
||||
};
|
||||
|
||||
//通过关键字过滤树节点
|
||||
const filterNode = (value, data) => {
|
||||
//通过关键字过滤树节点
|
||||
if (!value) return true;
|
||||
return data.label.indexOf(value) !== -1;
|
||||
};
|
||||
//用于用户选择
|
||||
const show = () => {
|
||||
//用于弹开部门选择
|
||||
visible.value = true;
|
||||
selectList.value = _value.value
|
||||
defaultChecked.value = _value.value.map(item => item.value)
|
||||
getList()
|
||||
};
|
||||
|
||||
const updateTreeCheck = (list, flag) => {
|
||||
list.forEach(item => {
|
||||
if (item.value !== -1) {
|
||||
tree.value.setChecked(item, flag)
|
||||
if (item.children !== undefined) {
|
||||
updateTreeCheck(item.children, flag)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
const handleCheckClick = (data, checked) => {
|
||||
if (data.value == -1) {
|
||||
if(checked){
|
||||
updateTreeCheck(dataList.value, false)
|
||||
tree.value.setChecked(data,true);
|
||||
}
|
||||
}
|
||||
if(tree.value.getCheckedKeys().length>1&&tree.value.getCheckedKeys().indexOf(-1)!==-1){
|
||||
tree.value.setChecked(-1,false);
|
||||
}
|
||||
// 左侧有选择框 + 多选
|
||||
if (props.multiple) {
|
||||
//不添加重复的数据到右边
|
||||
for (let i = 0; i < selectList.value.length; i++) {
|
||||
if (selectList.value[i].value === data.value) {
|
||||
selectList.value.splice(i, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (checked) {
|
||||
// if (data.children === undefined) {
|
||||
selectList.value.push(data);
|
||||
// }
|
||||
} else if (data === "1") {
|
||||
tree.value.setCheckedKeys([]);
|
||||
selectList.value = [];
|
||||
}
|
||||
} else {// 左侧有选择框 + 单选
|
||||
//不添加重复的数据到右边
|
||||
for (let i = 0; i < selectList.value.length; i++) {
|
||||
if (selectList.value[i].value === data.value) {
|
||||
selectList.value.splice(i, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (checked) {
|
||||
tree.value.setCheckedNodes([data]);
|
||||
selectList.value = [data];
|
||||
} else if (data === "1") {
|
||||
selectList.value = [];
|
||||
tree.value.setCheckedKeys([]);
|
||||
}
|
||||
}
|
||||
};
|
||||
const handleNodeClick = (node, check) => {
|
||||
if (check.isLeaf !== false) {
|
||||
if (props.multiple) {
|
||||
//不添加重复的数据到右边
|
||||
for (let i = 0; i < selectList.value.length; i++) {
|
||||
if (selectList.value[i].value === node.value) {
|
||||
selectList.value.splice(i, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
check.checked = true;
|
||||
selectList.value.push(node);
|
||||
} else {
|
||||
check.checked = true;
|
||||
selectList.value = [node];
|
||||
}
|
||||
}
|
||||
// _value.value = selectList.value
|
||||
};
|
||||
const removeSingleSelected = (selectItem) => {
|
||||
//左侧无选择框时,右侧显示×
|
||||
for (let i = 0; i < selectList.value.length; i++) {
|
||||
if (selectList.value[i].value === selectItem.value) {
|
||||
tree.value.setChecked(selectList.value[i].value, false);
|
||||
selectList.value.splice(i, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (props.showCheckbox) {
|
||||
// 左侧有选择框 + 单选
|
||||
if (props.multiple === false) {
|
||||
tree.value.setCheckedKeys([]);
|
||||
}
|
||||
}
|
||||
// isRemoveSingleSelected.value = true
|
||||
};
|
||||
const clearSelected = () => {
|
||||
//清空
|
||||
ElMessageBox.confirm("您确定要清空已选中的项?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(() => {
|
||||
// isRemoveSingleSelected.value = true
|
||||
if (!props.showCheckbox) {
|
||||
selectList.value = [];
|
||||
} else {
|
||||
handleCheckClick("1");
|
||||
}
|
||||
});
|
||||
};
|
||||
const cancelUserPicker = () => {
|
||||
if (localStorage.getItem('originallyCompanySelectedList')) {
|
||||
selectList.value = JSON.parse(localStorage.getItem('originallyCompanySelectedList'))
|
||||
}else{
|
||||
selectList.value=[]
|
||||
handleCheckClick("1");
|
||||
}
|
||||
emit("cancelOrClear", selectList.value);
|
||||
visible.value = false;
|
||||
// nextTick(()=>{
|
||||
// isRemoveSingleSelected.value=false
|
||||
// })
|
||||
}
|
||||
const selectConfirm = () => {
|
||||
//确定按钮
|
||||
emit("ok", selectList.value);
|
||||
dataList.value = []
|
||||
visible.value = false;
|
||||
localStorage.setItem('originallyCompanySelectedList', JSON.stringify(selectList.value))
|
||||
};
|
||||
defineExpose({
|
||||
show
|
||||
});
|
||||
getList()
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
$containWidth: 480px;
|
||||
:deep(.tree) {
|
||||
.el-tree-node__content {
|
||||
height: 34px;
|
||||
|
||||
.tree-node {
|
||||
font-size: 18px;
|
||||
}
|
||||
}
|
||||
|
||||
//.el-tree-node {
|
||||
// .is-leaf + .el-checkbox .el-checkbox__inner {
|
||||
// display: inline-block;
|
||||
// }
|
||||
//
|
||||
// .el-checkbox .el-checkbox__inner {
|
||||
// display: none;
|
||||
// }
|
||||
//}
|
||||
}
|
||||
|
||||
.footer {
|
||||
float: right;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.picker {
|
||||
height: 560px;
|
||||
position: relative;
|
||||
text-align: left;
|
||||
|
||||
.candidate {
|
||||
position: absolute;
|
||||
display: block;
|
||||
width: $containWidth;
|
||||
height: 100%;
|
||||
border: 1px solid #e8e8e8;
|
||||
|
||||
:deep(.el-input) {
|
||||
height: 40px;
|
||||
|
||||
.el-input__inner, .el-input-group__append {
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.selected {
|
||||
right: 0;
|
||||
top: 0;
|
||||
position: absolute;
|
||||
display: inline-block;
|
||||
width: 450px;
|
||||
height: 100%;
|
||||
border: 1px solid #e8e8e8;
|
||||
|
||||
.count {
|
||||
width: 100%;
|
||||
padding: 10px;
|
||||
display: inline-block;
|
||||
border-bottom: 1px solid #e8e8e8;
|
||||
margin-bottom: 5px;
|
||||
font-size: 16px;
|
||||
|
||||
> span:nth-child(2) {
|
||||
float: right;
|
||||
color: #c75450;
|
||||
cursor: pointer;
|
||||
margin-left: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.org-items {
|
||||
overflow-y: auto;
|
||||
height: 90%;
|
||||
|
||||
.el-icon-close {
|
||||
position: absolute;
|
||||
right: 5px;
|
||||
cursor: pointer;
|
||||
font-size: larger;
|
||||
}
|
||||
|
||||
.org-item {
|
||||
margin: 0 5px;
|
||||
border-radius: 5px;
|
||||
position: relative;
|
||||
padding: 7px 5px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 16px;
|
||||
|
||||
&:hover {
|
||||
background: #f1f1f1;
|
||||
}
|
||||
|
||||
> span {
|
||||
margin-left: 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.el-scrollbar .el-scrollbar__wrap {
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar {
|
||||
float: right;
|
||||
width: 4px;
|
||||
height: 4px;
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
border-radius: 16px;
|
||||
background-color: #efefef;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@@ -1,255 +1,255 @@
|
||||
<template>
|
||||
<el-button color="#DED0B2" style="float: right;margin: 0 10px 10px 0" @click="exportTable">导出</el-button>
|
||||
<el-table ref="reportTable" :data="tableData" style="width: 100%;height: 479px"
|
||||
:span-method="objectSpanMethod" v-loading="loading">
|
||||
<el-table-column label="四川省国有资产经营投资管理有限责任公司科技创新项目人工成本分摊明细表" align="center">
|
||||
<el-table-column v-for="column in columnInfo" :prop="column.prop" :label="column.label" align="center"
|
||||
:fixed="(!column.children) ? ((column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost') ? 'right' : 'left') : false"
|
||||
:width="(column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost') ? 160:130">
|
||||
<template #default="scope">
|
||||
<template v-if="column.children">
|
||||
<el-table-column v-for="childColumn in column.children"
|
||||
:prop="column.prop + '.'+ childColumn.prop"
|
||||
:label="childColumn.label"
|
||||
:width="childColumn.prop === 'subtotal' ? 160 : 130">
|
||||
<template #default="columnScope">
|
||||
<template v-if="(tableData.length -1) !== columnScope.$index">
|
||||
{{
|
||||
columnScope.row[column.prop][childColumn.prop] ? columnScope.row[column.prop][childColumn.prop] : '/'
|
||||
}}
|
||||
</template>
|
||||
<template v-else>
|
||||
{{ columnScope.row[column.prop][childColumn.prop] }}
|
||||
</template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</template>
|
||||
<template v-else>
|
||||
<!--分摊金额合计与分摊金额总计计算-->
|
||||
<template
|
||||
v-if="(column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost') && (tableData.length -1) !== scope.$index">
|
||||
{{ getTotalSeparation(scope.row, column.prop) }}
|
||||
</template>
|
||||
<template
|
||||
v-else-if="(tableData.length -1) === scope.$index && (column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost')">
|
||||
{{ getTotalSummary(scope.row, column.prop) }}
|
||||
</template>
|
||||
<template v-else>
|
||||
{{ scope.row[column.prop] }}
|
||||
</template>
|
||||
</template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</template>
|
||||
|
||||
|
||||
<script setup lang="jsx">
|
||||
import {getResearchUser, getAllocationDetails} from "@/api/expense-manage";
|
||||
import {exportExcel} from "@/utils/export-excel";
|
||||
import {ElNotification} from "element-plus";
|
||||
|
||||
const route = useRoute()
|
||||
const tableIns = ref()
|
||||
const reportTable = ref({});
|
||||
const columnInfo = ref([])
|
||||
const monthConcat = new Map()
|
||||
const tableData = ref([])
|
||||
const loading = ref(false)
|
||||
const researchOptions = ref([])
|
||||
|
||||
const objectSpanMethod = ({row, column, rowIndex, columnIndex}) => {
|
||||
if (columnIndex === 0) {
|
||||
if (monthConcat.has(rowIndex)) {
|
||||
return {
|
||||
rowspan: monthConcat.get(rowIndex),
|
||||
colspan: 1,
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
rowspan: 0,
|
||||
colspan: 0,
|
||||
}
|
||||
}
|
||||
} else {
|
||||
let length = Object.keys(row).length
|
||||
// console.log(length)
|
||||
if (length > 5) {
|
||||
if (concatColumn(columnIndex, length, rowIndex)) {
|
||||
if (rowIndex % 5 === 0) {
|
||||
return {
|
||||
rowspan: 5,
|
||||
colspan: 1,
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
rowspan: 0,
|
||||
colspan: 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const getTotalSeparation = (row, prop) => {
|
||||
let totalSeparation = 0.00
|
||||
for (let key of Object.keys(row)) {
|
||||
if (key.startsWith('personInfo')) {
|
||||
let value = prop === 'totalSeparation' ? (row[key].separationAmount ? row[key].separationAmount : 0) : row[key].subtotal
|
||||
if ("/" !== value) {
|
||||
try {
|
||||
totalSeparation += parseFloat(value)
|
||||
} catch (e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (totalSeparation !== 0) {
|
||||
return totalSeparation.toFixed(2);
|
||||
} else {
|
||||
return "/"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const getTotalSummary = (row, prop) => {
|
||||
let key;
|
||||
if (prop === 'totalSeparation') {
|
||||
key = 'separationAmount'
|
||||
} else {
|
||||
key = 'subtotal'
|
||||
}
|
||||
let result = 0
|
||||
for (const rowKey of Object.keys(row)) {
|
||||
if (rowKey.startsWith('personInfo')) {
|
||||
let value = row[rowKey][key]
|
||||
if (value && "/" !== value) {
|
||||
try {
|
||||
result += parseFloat(value)
|
||||
} catch (e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return result.toFixed(2);
|
||||
}
|
||||
|
||||
const concatColumn = (columnIndex, length, rowIndex) => {
|
||||
if (rowIndex === tableData.value.length - 1) {
|
||||
return false
|
||||
}
|
||||
let columnLength = 5 + (length - 5) * 5
|
||||
if (columnIndex === 1
|
||||
|| columnIndex === columnLength - 1) {
|
||||
return true;
|
||||
}
|
||||
for (let i = 0; i < length - 5; i++) {
|
||||
if (columnIndex === 4 + (i * 5)
|
||||
|| columnIndex === 5 + (i * 5)
|
||||
|| columnIndex === 7 + (i * 5)) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
const init = () => {
|
||||
loading.value = true
|
||||
getAllocationDetails(route.query.id).then(res => {
|
||||
if (res.code !== 1000) {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
columnInfo.value = res.data.columns
|
||||
let tableDataLet = res.data.tableData;
|
||||
let personInfoKey = []
|
||||
columnInfo.value.forEach(item => {
|
||||
if (item.prop.startsWith('personInfo')) {
|
||||
personInfoKey.push(item.prop)
|
||||
}
|
||||
})
|
||||
tableData.value = []
|
||||
let rowIndex = 0;
|
||||
let summary = {
|
||||
month: "",
|
||||
salaryType: '',
|
||||
projectName: "合计",
|
||||
totalSeparation: 10,
|
||||
totalSeparationCost: 10
|
||||
}
|
||||
for (const key of personInfoKey) {
|
||||
summary[key] = {
|
||||
researchDuration: "",
|
||||
separationAmount: 0,
|
||||
subtotal: 0,
|
||||
wagesPayable: "",
|
||||
workday: "",
|
||||
}
|
||||
}
|
||||
tableDataLet.forEach((tableDatum) => {
|
||||
let rowspan = tableDatum.rows.length * 5
|
||||
monthConcat.set(rowIndex, rowspan)
|
||||
rowIndex += rowspan
|
||||
for (const tableDatumElement of tableDatum.rows) {
|
||||
tableData.value = tableData.value.concat(tableDatumElement)
|
||||
let row = tableDatumElement[0]
|
||||
for (const key of personInfoKey) {
|
||||
try {
|
||||
if (row[key].subtotal && '/' !== row[key].subtotal) {
|
||||
summary[key].subtotal += parseFloat(row[key].subtotal)
|
||||
}
|
||||
} catch (e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
for (const row of tableData.value) {
|
||||
for (const key of personInfoKey) {
|
||||
try {
|
||||
if (row[key].separationAmount && '/' !== row[key].separationAmount) {
|
||||
summary[key].separationAmount += parseFloat(row[key].separationAmount)
|
||||
}
|
||||
} catch (e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
for (const key of personInfoKey) {
|
||||
summary[key].subtotal = summary[key].subtotal.toFixed(2)
|
||||
summary[key].separationAmount = summary[key].separationAmount.toFixed(2)
|
||||
}
|
||||
monthConcat.set(rowIndex, 1)
|
||||
tableData.value.push(summary)
|
||||
loading.value = false
|
||||
})
|
||||
}
|
||||
|
||||
const getResearchOptions = async () => {
|
||||
const res = await getResearchUser()
|
||||
researchOptions.value = res.data
|
||||
}
|
||||
const search = (val) => {
|
||||
tableConfig.params = {
|
||||
allocationId: route.query.id,
|
||||
...val
|
||||
}
|
||||
tableIns.value.refresh()
|
||||
}
|
||||
getResearchOptions()
|
||||
init()
|
||||
|
||||
|
||||
const exportTable = () => {
|
||||
const $e = reportTable.value.$el
|
||||
let $table = $e.querySelector('.el-table__fixed')
|
||||
if (!$table) {
|
||||
$table = $e
|
||||
}
|
||||
exportExcel($table, (5 + (Object.keys(tableData.value[0]).length - 5) * 5), "四川省国有资产经营投资管理有限责任公司科技创新项目人工成本分摊明细表", 2)
|
||||
}
|
||||
</script>
|
||||
<template>
|
||||
<el-button color="#DED0B2" style="float: right;margin: 0 10px 10px 0" @click="exportTable">导出</el-button>
|
||||
<el-table ref="reportTable" :data="tableData" style="width: 100%;height: 479px"
|
||||
:span-method="objectSpanMethod" v-loading="loading">
|
||||
<el-table-column label="四川省国有资产经营投资管理有限责任公司科技创新项目人工成本分摊明细表" align="center">
|
||||
<el-table-column v-for="column in columnInfo" :prop="column.prop" :label="column.label" align="center"
|
||||
:fixed="(!column.children) ? ((column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost') ? 'right' : 'left') : false"
|
||||
:width="(column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost') ? 160:130">
|
||||
<template #default="scope">
|
||||
<template v-if="column.children">
|
||||
<el-table-column v-for="childColumn in column.children"
|
||||
:prop="column.prop + '.'+ childColumn.prop"
|
||||
:label="childColumn.label"
|
||||
:width="childColumn.prop === 'subtotal' ? 160 : 130">
|
||||
<template #default="columnScope">
|
||||
<template v-if="(tableData.length -1) !== columnScope.$index">
|
||||
{{
|
||||
columnScope.row[column.prop][childColumn.prop] ? columnScope.row[column.prop][childColumn.prop] : '/'
|
||||
}}
|
||||
</template>
|
||||
<template v-else>
|
||||
{{ columnScope.row[column.prop][childColumn.prop] }}
|
||||
</template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</template>
|
||||
<template v-else>
|
||||
<!--分摊金额合计与分摊金额总计计算-->
|
||||
<template
|
||||
v-if="(column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost') && (tableData.length -1) !== scope.$index">
|
||||
{{ getTotalSeparation(scope.row, column.prop) }}
|
||||
</template>
|
||||
<template
|
||||
v-else-if="(tableData.length -1) === scope.$index && (column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost')">
|
||||
{{ getTotalSummary(scope.row, column.prop) }}
|
||||
</template>
|
||||
<template v-else>
|
||||
{{ scope.row[column.prop] }}
|
||||
</template>
|
||||
</template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</template>
|
||||
|
||||
|
||||
<script setup lang="jsx">
|
||||
import {getResearchUser, getAllocationDetails} from "@/api/expense-manage";
|
||||
import {exportExcel} from "@/utils/export-excel";
|
||||
import {ElNotification} from "element-plus";
|
||||
|
||||
const route = useRoute()
|
||||
const tableIns = ref()
|
||||
const reportTable = ref({});
|
||||
const columnInfo = ref([])
|
||||
const monthConcat = new Map()
|
||||
const tableData = ref([])
|
||||
const loading = ref(false)
|
||||
const researchOptions = ref([])
|
||||
|
||||
const objectSpanMethod = ({row, column, rowIndex, columnIndex}) => {
|
||||
if (columnIndex === 0) {
|
||||
if (monthConcat.has(rowIndex)) {
|
||||
return {
|
||||
rowspan: monthConcat.get(rowIndex),
|
||||
colspan: 1,
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
rowspan: 0,
|
||||
colspan: 0,
|
||||
}
|
||||
}
|
||||
} else {
|
||||
let length = Object.keys(row).length
|
||||
// console.log(length)
|
||||
if (length > 5) {
|
||||
if (concatColumn(columnIndex, length, rowIndex)) {
|
||||
if (rowIndex % 5 === 0) {
|
||||
return {
|
||||
rowspan: 5,
|
||||
colspan: 1,
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
rowspan: 0,
|
||||
colspan: 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const getTotalSeparation = (row, prop) => {
|
||||
let totalSeparation = 0.00
|
||||
for (let key of Object.keys(row)) {
|
||||
if (key.startsWith('personInfo')) {
|
||||
let value = prop === 'totalSeparation' ? (row[key].separationAmount ? row[key].separationAmount : 0) : row[key].subtotal
|
||||
if ("/" !== value) {
|
||||
try {
|
||||
totalSeparation += parseFloat(value)
|
||||
} catch (e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (totalSeparation !== 0) {
|
||||
return totalSeparation.toFixed(2);
|
||||
} else {
|
||||
return "/"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const getTotalSummary = (row, prop) => {
|
||||
let key;
|
||||
if (prop === 'totalSeparation') {
|
||||
key = 'separationAmount'
|
||||
} else {
|
||||
key = 'subtotal'
|
||||
}
|
||||
let result = 0
|
||||
for (const rowKey of Object.keys(row)) {
|
||||
if (rowKey.startsWith('personInfo')) {
|
||||
let value = row[rowKey][key]
|
||||
if (value && "/" !== value) {
|
||||
try {
|
||||
result += parseFloat(value)
|
||||
} catch (e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return result.toFixed(2);
|
||||
}
|
||||
|
||||
const concatColumn = (columnIndex, length, rowIndex) => {
|
||||
if (rowIndex === tableData.value.length - 1) {
|
||||
return false
|
||||
}
|
||||
let columnLength = 5 + (length - 5) * 5
|
||||
if (columnIndex === 1
|
||||
|| columnIndex === columnLength - 1) {
|
||||
return true;
|
||||
}
|
||||
for (let i = 0; i < length - 5; i++) {
|
||||
if (columnIndex === 4 + (i * 5)
|
||||
|| columnIndex === 5 + (i * 5)
|
||||
|| columnIndex === 7 + (i * 5)) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
const init = () => {
|
||||
loading.value = true
|
||||
getAllocationDetails(route.query.id).then(res => {
|
||||
if (res.code !== 1000) {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
columnInfo.value = res.data.columns
|
||||
let tableDataLet = res.data.tableData;
|
||||
let personInfoKey = []
|
||||
columnInfo.value.forEach(item => {
|
||||
if (item.prop.startsWith('personInfo')) {
|
||||
personInfoKey.push(item.prop)
|
||||
}
|
||||
})
|
||||
tableData.value = []
|
||||
let rowIndex = 0;
|
||||
let summary = {
|
||||
month: "",
|
||||
salaryType: '',
|
||||
projectName: "合计",
|
||||
totalSeparation: 10,
|
||||
totalSeparationCost: 10
|
||||
}
|
||||
for (const key of personInfoKey) {
|
||||
summary[key] = {
|
||||
researchDuration: "",
|
||||
separationAmount: 0,
|
||||
subtotal: 0,
|
||||
wagesPayable: "",
|
||||
workday: "",
|
||||
}
|
||||
}
|
||||
tableDataLet.forEach((tableDatum) => {
|
||||
let rowspan = tableDatum.rows.length * 5
|
||||
monthConcat.set(rowIndex, rowspan)
|
||||
rowIndex += rowspan
|
||||
for (const tableDatumElement of tableDatum.rows) {
|
||||
tableData.value = tableData.value.concat(tableDatumElement)
|
||||
let row = tableDatumElement[0]
|
||||
for (const key of personInfoKey) {
|
||||
try {
|
||||
if (row[key].subtotal && '/' !== row[key].subtotal) {
|
||||
summary[key].subtotal += parseFloat(row[key].subtotal)
|
||||
}
|
||||
} catch (e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
for (const row of tableData.value) {
|
||||
for (const key of personInfoKey) {
|
||||
try {
|
||||
if (row[key].separationAmount && '/' !== row[key].separationAmount) {
|
||||
summary[key].separationAmount += parseFloat(row[key].separationAmount)
|
||||
}
|
||||
} catch (e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
for (const key of personInfoKey) {
|
||||
summary[key].subtotal = summary[key].subtotal.toFixed(2)
|
||||
summary[key].separationAmount = summary[key].separationAmount.toFixed(2)
|
||||
}
|
||||
monthConcat.set(rowIndex, 1)
|
||||
tableData.value.push(summary)
|
||||
loading.value = false
|
||||
})
|
||||
}
|
||||
|
||||
const getResearchOptions = async () => {
|
||||
const res = await getResearchUser()
|
||||
researchOptions.value = res.data
|
||||
}
|
||||
const search = (val) => {
|
||||
tableConfig.params = {
|
||||
allocationId: route.query.id,
|
||||
...val
|
||||
}
|
||||
tableIns.value.refresh()
|
||||
}
|
||||
getResearchOptions()
|
||||
init()
|
||||
|
||||
|
||||
const exportTable = () => {
|
||||
const $e = reportTable.value.$el
|
||||
let $table = $e.querySelector('.el-table__fixed')
|
||||
if (!$table) {
|
||||
$table = $e
|
||||
}
|
||||
exportExcel($table, (5 + (Object.keys(tableData.value[0]).length - 5) * 5), "四川省国有资产经营投资管理有限责任公司科技创新项目人工成本分摊明细表", 2)
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -1,169 +1,212 @@
|
||||
<template>
|
||||
<el-form :label-position="labelAlign">
|
||||
<el-form-item :label="title?'其他文件':''" v-if="fileListShow === 'READ' || fileListShow === 'EDIT'" :label-position="labelAlign" :label-width="title?95:''">
|
||||
<file-upload @getFile="getOtherFile" v-if="fileListShow === 'EDIT'"/>
|
||||
<fvTable style="width: 100%;max-height: 162px;" v-if="processViewer" height="162" :tableConfig="tableConfig"
|
||||
:data="_value" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
||||
</template>
|
||||
</fvTable>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import {downloadFile, deleteFile} from "@/api/project-demand";
|
||||
import {ElNotification} from "element-plus";
|
||||
|
||||
const props = defineProps({
|
||||
title: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
tag: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
fileListShow: {
|
||||
type: String,
|
||||
default: 'READ'
|
||||
},
|
||||
value: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
processViewer: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
labelAlign: {
|
||||
type: String,
|
||||
default: 'right'
|
||||
}
|
||||
})
|
||||
const emit = defineEmits(['update:value'])
|
||||
const tableConfig = reactive({
|
||||
columns: [
|
||||
{
|
||||
prop: 'index',
|
||||
type: 'index',
|
||||
label: '序号',
|
||||
align: 'center',
|
||||
width: 85,
|
||||
},
|
||||
{
|
||||
prop: 'originalFileName',
|
||||
label: '文件名',
|
||||
align: 'center',
|
||||
},
|
||||
{
|
||||
prop: 'tag',
|
||||
label: '标签',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'size',
|
||||
label: '文件大小',
|
||||
align: 'center',
|
||||
width: 150,
|
||||
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
||||
},
|
||||
{
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
let btn = []
|
||||
btn.push({label: '下载', func: () => handleDownload(row), type: 'primary'})
|
||||
// if (row.newFile) {
|
||||
// btn.push({label: '删除', func: () => handleDelete(row), type: 'primary'})
|
||||
// }
|
||||
return (
|
||||
<div style={{width: '100%'}}>
|
||||
{
|
||||
btn.map(item => (
|
||||
<el-button
|
||||
type={item.type}
|
||||
onClick={() => item.func()}
|
||||
link>
|
||||
{item.label}
|
||||
</el-button>
|
||||
))
|
||||
}
|
||||
{
|
||||
row.newFile ? <popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
||||
perm={['mosr:requirement:del']}
|
||||
onDelete={() => handleDelete(row)}/>
|
||||
: ''
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
|
||||
const _value = computed({
|
||||
get() {
|
||||
return props.value;
|
||||
},
|
||||
set(val) {
|
||||
emit("update:value", val);
|
||||
}
|
||||
})
|
||||
|
||||
const getOtherFile = (val) => {
|
||||
props.processViewer = false
|
||||
let fileObj = compositeParam(val)
|
||||
_value.value.push(fileObj)
|
||||
nextTick(() => {
|
||||
props.processViewer = true
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
const compositeParam = (item, type) => {
|
||||
return {
|
||||
fileId: item.id,
|
||||
size: item.size,
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: true,
|
||||
tag: props.tag
|
||||
}
|
||||
}
|
||||
const handleDownload = (row) => {
|
||||
downloadFile(row.fileId).then(res => {
|
||||
const blob = new Blob([res])
|
||||
let a = document.createElement('a')
|
||||
a.href = URL.createObjectURL(blob)
|
||||
a.download = row.originalFileName
|
||||
a.click()
|
||||
})
|
||||
}
|
||||
const handleDelete = (row) => {
|
||||
deleteFile(row.fileId).then(res => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
_value.value.splice(_value.value.findIndex((item) => item.fileId === row.fileId), 1);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
watch(() => props.processViewer, (newVal) => {
|
||||
props.processViewer = newVal
|
||||
}, {deep: true})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
:deep(.el-table--fit ) {
|
||||
height: 162px !important;
|
||||
}
|
||||
</style>
|
||||
<template>
|
||||
<el-form :label-position="labelAlign">
|
||||
<el-form-item :label="title" v-if="fileListShow === 'READ' || fileListShow === 'EDIT'" :label-position="labelAlign" :style="{marginTop: '10px',marginLeft: tag!=='需求上报'?'15px':'0'}">
|
||||
<file-upload @getFile="getOtherFile" v-if="fileListShow === 'EDIT'"/>
|
||||
<!-- :style="{width:isOpenPrint?'610px': '100%'}" table-layout="auto" id="printTable"-->
|
||||
<fvTable style="width:100%;" :height="tag=='项目立项'?'160':'160'" :style="{maxHeight:tag=='项目立项'?'160px':'160px',height:tag=='项目立项'?'160px':'160px'}" v-if="processViewer" :scrollbar-always-on="true" :tableConfig="tableConfig"
|
||||
:data="_value" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
||||
</template>
|
||||
</fvTable>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<file-preview ref="filePreviewRef" :fullscreen="fullscreen" v-if="filePreviewShow" :fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
|
||||
:fileType="filePreviewParam.fileType"/>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import {downloadFile, deleteFile} from "@/api/project-demand";
|
||||
import {ElNotification} from "element-plus";
|
||||
import FilePreview from "../filePreview/index.vue";
|
||||
|
||||
const props = defineProps({
|
||||
title: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
tag: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
fileNameTableWidth: {
|
||||
type: String,
|
||||
default: '400'
|
||||
},
|
||||
fileListShow: {
|
||||
type: String,
|
||||
default: 'READ'
|
||||
},
|
||||
value: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
processViewer: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
labelAlign: {
|
||||
type: String,
|
||||
default: 'right'
|
||||
},
|
||||
//弹窗是否铺满全屏
|
||||
fullscreen: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
//是否开始打印
|
||||
isOpenPrint: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
})
|
||||
const emit = defineEmits(['update:value'])
|
||||
const tableConfig = reactive({
|
||||
columns: [
|
||||
{
|
||||
prop: 'index',
|
||||
type: 'index',
|
||||
label: '序号',
|
||||
align: 'center',
|
||||
width: 85,
|
||||
},
|
||||
{
|
||||
prop: 'originalFileName',
|
||||
label: '文件名',
|
||||
align: 'center',
|
||||
width: props.fileNameTableWidth,
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => (<div style="color: #2a99ff;cursor: pointer;" onClick={()=>clickToPreview(row)}>{row.originalFileName}</div>)
|
||||
},
|
||||
{
|
||||
prop: 'tag',
|
||||
label: '标签',
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
minWidth: props.fileNameTableWidth,
|
||||
},
|
||||
{
|
||||
prop: 'size',
|
||||
label: '文件大小',
|
||||
align: 'center',
|
||||
width: 150,
|
||||
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
||||
},
|
||||
{
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
let btn = []
|
||||
btn.push({label: '下载', func: () => handleDownload(row), type: 'primary'})
|
||||
// if (row.newFile) {
|
||||
// btn.push({label: '删除', func: () => handleDelete(row), type: 'primary'})
|
||||
// }
|
||||
return (
|
||||
<div style={{width: '100%'}}>
|
||||
{
|
||||
btn.map(item => (
|
||||
<el-button
|
||||
type={item.type}
|
||||
onClick={() => item.func()}
|
||||
link>
|
||||
{item.label}
|
||||
</el-button>
|
||||
))
|
||||
}
|
||||
{
|
||||
row.newFile ? <popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
||||
onDelete={() => handleDelete(row)}/>
|
||||
: ''
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
const filePreviewParam = ref({
|
||||
fileUrl: '',
|
||||
fileName: '',
|
||||
fileType: 'pdf'
|
||||
})
|
||||
const filePreviewShow = ref(false)
|
||||
const _value = computed({
|
||||
get() {
|
||||
return props.value;
|
||||
},
|
||||
set(val) {
|
||||
emit("update:value", val);
|
||||
}
|
||||
})
|
||||
const clickToPreview=(row)=>{
|
||||
filePreviewShow.value = false
|
||||
filePreviewParam.value = {
|
||||
fileUrl: row.url,
|
||||
fileName: row.originalFileName,
|
||||
fileType: row.fileType
|
||||
}
|
||||
nextTick(()=>{
|
||||
filePreviewShow.value = true
|
||||
})
|
||||
}
|
||||
const getOtherFile = (val) => {
|
||||
props.processViewer = false
|
||||
let fileObj = compositeParam(val)
|
||||
_value.value.push(fileObj)
|
||||
nextTick(() => {
|
||||
props.processViewer = true
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
const compositeParam = (item, type) => {
|
||||
return {
|
||||
fileId: item.id,
|
||||
size: item.size,
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: true,
|
||||
tag: props.tag
|
||||
}
|
||||
}
|
||||
const handleDownload = (row) => {
|
||||
downloadFile(row.fileId).then(res => {
|
||||
const blob = new Blob([res])
|
||||
let a = document.createElement('a')
|
||||
a.href = URL.createObjectURL(blob)
|
||||
a.download = row.originalFileName
|
||||
a.click()
|
||||
})
|
||||
}
|
||||
const handleDelete = (row) => {
|
||||
deleteFile(row.fileId).then(res => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
_value.value.splice(_value.value.findIndex((item) => item.fileId === row.fileId), 1);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
watch(() => props.processViewer, (newVal) => {
|
||||
props.processViewer = newVal
|
||||
}, {deep: true})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
:deep(.el-table--fit ) {
|
||||
height: 160px !important;
|
||||
}
|
||||
@media print {
|
||||
//#printTable{
|
||||
// width: 400px!important;
|
||||
//}
|
||||
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,168 +1,242 @@
|
||||
<template>
|
||||
<!-- <baseTitle title="审核意见"></baseTitle>-->
|
||||
<!-- <fvForm :schema="schema" @getInstance="(e)=>form = e"></fvForm>-->
|
||||
<div class="oper-page-btn">
|
||||
<el-button type="danger" @click="handleReject">驳回</el-button>
|
||||
<el-button color="#DED0B2" @click="handleAgree">同意</el-button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import {ElNotification} from 'element-plus';
|
||||
import {agreeTask, rejectTask} from "@/api/project-demand/index.js";
|
||||
import {useTagsView} from '@/stores/tagsview.js'
|
||||
|
||||
const tagsViewStore = useTagsView()
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const props = defineProps({
|
||||
taskId: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
formData: {
|
||||
type: Object,
|
||||
default: {}
|
||||
},
|
||||
value: {
|
||||
type: String,
|
||||
default: ''
|
||||
}
|
||||
})
|
||||
|
||||
const form = ref()
|
||||
const schema = computed(() => {
|
||||
return [
|
||||
{
|
||||
label: '',
|
||||
prop: 'auditOpinion',
|
||||
component: 'el-input',
|
||||
colProps: {
|
||||
span: 24
|
||||
},
|
||||
props: {
|
||||
placeholder: '请输入审核意见',
|
||||
type: 'textarea',
|
||||
rows: 3
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
const _value = computed({
|
||||
get() {
|
||||
return props.value;
|
||||
},
|
||||
set(val) {
|
||||
emit("update:value", val);
|
||||
}
|
||||
})
|
||||
const back = () => {
|
||||
switch (route.name) {
|
||||
case 'Initiation/detail':
|
||||
router.push({name: 'Initiation'})
|
||||
break;
|
||||
case 'Filing/detail':
|
||||
router.push({name: 'Filing'})
|
||||
break;
|
||||
case 'Implementation/detail':
|
||||
if (route.query.source === 'home') {
|
||||
router.push('/home')
|
||||
} else {
|
||||
if (route.query.step === '10') {
|
||||
router.push({name: 'Summary'})
|
||||
} else if (route.query.step === '20') {
|
||||
router.push({name: 'Initiation'})
|
||||
} else if (route.query.step === '40') {
|
||||
router.push({name: 'Implementation'})
|
||||
} else if (route.query.step === '50') {
|
||||
router.push({name: 'Filing'})
|
||||
} else if (route.query.step === '00') {
|
||||
router.push({name: 'Requirement'})
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'Summary/detail':
|
||||
if (route.query.source === 'home') {
|
||||
router.push('/home')
|
||||
} else {
|
||||
router.push({name: 'Summary'})
|
||||
}
|
||||
break;
|
||||
case 'Requirement/detail':
|
||||
if (route.query.source === 'home') {
|
||||
router.push('/home')
|
||||
} else {
|
||||
router.push({name: 'Requirement'})
|
||||
}
|
||||
break;
|
||||
case 'Fund/detail':
|
||||
if (route.query.source === 'home') {
|
||||
router.push('/home')
|
||||
} else {
|
||||
router.push({name: 'Fund'})
|
||||
}
|
||||
break;
|
||||
case 'Share/detail':
|
||||
if (route.query.source === 'home') {
|
||||
router.push('/home')
|
||||
} else {
|
||||
router.push({name: 'Expense/share'})
|
||||
}
|
||||
break;
|
||||
case 'Phase/detail':
|
||||
if (route.query.source === 'home') {
|
||||
router.push('/home')
|
||||
} else {
|
||||
router.push({name: 'Implementation'})
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
// 驳回
|
||||
const handleReject = async () => {
|
||||
// const values = form.value.getValues()
|
||||
if (!_value.value) {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '请填写审核意见',
|
||||
type: 'warning'
|
||||
})
|
||||
return
|
||||
}
|
||||
const params = {
|
||||
taskId: props.taskId,
|
||||
// ...values
|
||||
auditOpinion: _value.value
|
||||
}
|
||||
// console.log('params', params)
|
||||
const res = await rejectTask(params)
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||
back()
|
||||
}
|
||||
|
||||
const handleAgree = async () => {
|
||||
// const values = form.value.getValues()
|
||||
const params = {
|
||||
taskId: props.taskId,
|
||||
formData: props.formData,
|
||||
auditOpinion: _value.value
|
||||
}
|
||||
const res = await agreeTask(params)
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||
back()
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
</style>
|
||||
<template>
|
||||
<!-- <baseTitle title="审核意见"></baseTitle>-->
|
||||
<!-- <fvForm :schema="schema" @getInstance="(e)=>form = e"></fvForm>-->
|
||||
<div class="oper-page-btn" style="display: flex">
|
||||
<el-button type="danger" @click="handleReject">驳回</el-button>
|
||||
<el-button color="#DED0B2" @click="handleAgree">同意</el-button>
|
||||
</div>
|
||||
<div class="opinion-dialog">
|
||||
<el-dialog v-model="showBackNode" title="请选择退回节点" width="400">
|
||||
<el-table :data="taskUserOptionList" style="width: 100%"
|
||||
:header-cell-style="{background:'#f5f7fa'}">
|
||||
<el-table-column width="55">
|
||||
<template #default="scope">
|
||||
<el-radio
|
||||
class="radio"
|
||||
:label="scope.row"
|
||||
v-model="backNode"
|
||||
>   
|
||||
</el-radio>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="nodeName"
|
||||
label="节点名称">
|
||||
<!-- <template #default="scope">-->
|
||||
<!-- {{scope.row.nodeId==-1?'发起节点':scope.row.nodeName}}-->
|
||||
<!-- </template>-->
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="name"
|
||||
label="操作者">
|
||||
<template #default="scope">
|
||||
<el-tag v-if="scope.row.userInfo" type="success">{{ scope.row.userInfo.name }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div class="oper" style="display: flex;justify-content: flex-end;margin-top: 10px">
|
||||
<el-button type="danger" @click="rollbackHandler">确定</el-button>
|
||||
<el-button @click="showBackNode=false">取消</el-button>
|
||||
</div>
|
||||
<!-- <el-select v-if="taskUserOptionList?.length>0" v-model="backNode" placeholder="请选择退回节点" clearable>-->
|
||||
<!-- <el-option-->
|
||||
<!-- v-for="item in taskUserOptionList"-->
|
||||
<!-- :key="item.nodeId"-->
|
||||
<!-- :label="item.nodeName + (item.userInfo ? ':' + item.userInfo.name : '')"-->
|
||||
<!-- :value="item.nodeId">-->
|
||||
<!-- </el-option>-->
|
||||
<!-- </el-select>-->
|
||||
<!-- <el-button type="danger" @click="rollbackHandler">确认</el-button>-->
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import {ElNotification} from 'element-plus';
|
||||
import {agreeTask, rejectTask} from "@/api/project-demand/index.js";
|
||||
import {useTagsView} from '@/stores/tagsview.js'
|
||||
|
||||
const tagsViewStore = useTagsView()
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const props = defineProps({
|
||||
taskId: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
formData: {
|
||||
type: Object,
|
||||
default: {}
|
||||
},
|
||||
value: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
//退回节点选择框数据
|
||||
taskUserOptionList: {
|
||||
type: Array,
|
||||
default: []
|
||||
}
|
||||
})
|
||||
|
||||
const form = ref()
|
||||
const backNode = ref({})
|
||||
const showBackNode = ref(false)
|
||||
const schema = computed(() => {
|
||||
return [
|
||||
{
|
||||
label: '',
|
||||
prop: 'auditOpinion',
|
||||
component: 'el-input',
|
||||
colProps: {
|
||||
span: 24
|
||||
},
|
||||
props: {
|
||||
placeholder: '请输入审核意见',
|
||||
type: 'textarea',
|
||||
rows: 3
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
const _value = computed({
|
||||
get() {
|
||||
return props.value;
|
||||
},
|
||||
set(val) {
|
||||
emit("update:value", val);
|
||||
}
|
||||
})
|
||||
const back = () => {
|
||||
switch (route.name) {
|
||||
case 'Initiation/detail':
|
||||
router.push({name: 'Initiation'})
|
||||
break;
|
||||
case 'Filing/detail':
|
||||
router.push({name: 'Filing'})
|
||||
break;
|
||||
case 'Implementation/detail':
|
||||
if (route.query.source === 'home') {
|
||||
router.push('/home')
|
||||
} else {
|
||||
if (route.query.step === '10') {
|
||||
router.push({name: 'Summary'})
|
||||
} else if (route.query.step === '20') {
|
||||
router.push({name: 'Initiation'})
|
||||
} else if (route.query.step === '40') {
|
||||
router.push({name: 'Implementation'})
|
||||
} else if (route.query.step === '50') {
|
||||
router.push({name: 'Filing'})
|
||||
} else if (route.query.step === '00') {
|
||||
router.push({name: 'Requirement'})
|
||||
}
|
||||
}
|
||||
break;
|
||||
// case 'Summary/detail':
|
||||
// if (route.query.source === 'home') {
|
||||
// router.push('/home')
|
||||
// } else {
|
||||
// router.push({name: 'Summary'})
|
||||
// }
|
||||
// break;
|
||||
case 'Requirement/detail':
|
||||
if (route.query.source === 'home') {
|
||||
router.push('/home')
|
||||
} else {
|
||||
router.push({name: 'Requirement'})
|
||||
}
|
||||
break;
|
||||
case 'Fund/detail':
|
||||
if (route.query.source === 'home') {
|
||||
router.push('/home')
|
||||
} else {
|
||||
router.push({name: 'Fund'})
|
||||
}
|
||||
break;
|
||||
case 'Share/detail':
|
||||
if (route.query.source === 'home') {
|
||||
router.push('/home')
|
||||
} else {
|
||||
router.push({name: 'Expense/share'})
|
||||
}
|
||||
break;
|
||||
case 'Phase/detail':
|
||||
if (route.query.source === 'home') {
|
||||
router.push('/home')
|
||||
} else {
|
||||
router.push({name: 'Implementation'})
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
// 驳回
|
||||
const handleReject = async () => {
|
||||
if (!_value.value) {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '请填写审核意见',
|
||||
type: 'warning'
|
||||
})
|
||||
return
|
||||
}
|
||||
showBackNode.value = true
|
||||
backNode.value = {}
|
||||
}
|
||||
//回退节点
|
||||
const rollbackHandler = async () => {
|
||||
// const values = form.value.getValues()
|
||||
|
||||
const params = {
|
||||
taskId: props.taskId,
|
||||
// ...values
|
||||
auditOpinion: _value.value,
|
||||
rollBackId: backNode.value.nodeId
|
||||
}
|
||||
// console.log('params', params)
|
||||
const res = await rejectTask(params)
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||
back()
|
||||
}
|
||||
}
|
||||
|
||||
const handleAgree = async () => {
|
||||
if (!_value.value) {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '请填写审核意见',
|
||||
type: 'warning'
|
||||
})
|
||||
return
|
||||
}
|
||||
// const values = form.value.getValues()
|
||||
const params = {
|
||||
taskId: props.taskId,
|
||||
formData: props.formData,
|
||||
auditOpinion: _value.value
|
||||
}
|
||||
const res = await agreeTask(params)
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||
back()
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.opinion-dialog {
|
||||
.el-dialog__body {
|
||||
padding: 0 !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
610
src/components/DetailComponent/ProjectAttachment.vue
Normal file
@@ -0,0 +1,610 @@
|
||||
<template>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<baseTitle :title="'项目附件'"></baseTitle>
|
||||
</el-col>
|
||||
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleTabClick" @tab-remove="tabRemove"
|
||||
style="margin-left: 15px;margin-top: -10px">
|
||||
<el-tab-pane name="all" :closable="false" label="全部">
|
||||
</el-tab-pane>
|
||||
<el-tab-pane v-for="item in tagsOption" :closable="item.isClose==1&&uploadState"
|
||||
:key="item.tagId"
|
||||
:label="item.fileTag"
|
||||
:name="item.tagId">
|
||||
<div class="tag-title">
|
||||
<div></div>
|
||||
{{ item.fileTag }}
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
|
||||
<el-tab-pane name="plus" v-if="uploadState" :closable="false">
|
||||
<template #label>
|
||||
<div style="margin-top: 4px;">
|
||||
<el-icon color="#BEA266">
|
||||
<Plus/>
|
||||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</el-row>
|
||||
<div style="margin-top:10px;margin-bottom: 8px;margin-left: 15px;display: flex">
|
||||
<!-- <el-button color="#DED0B2" @click="handleUpload">上传附件</el-button>-->
|
||||
<file-upload v-if="!isLineBtn&&uploadState&&activeName!='plus'&&activeName!='all'" @getFile="getFile"/>
|
||||
|
||||
<el-button color="#DED0B2" @click="handleEditTag"
|
||||
v-if="activeName!='all'&&activeName!='plus'&&uploadState&&!isDefault"
|
||||
style="margin-left: 10px;">编辑
|
||||
</el-button>
|
||||
</div>
|
||||
<fvTable style="width: 100%;min-height:311px;max-height: 311px" v-if="showAttachmentTable" height="311"
|
||||
:scrollbar-always-on="true"
|
||||
:tableConfig="executeTableConfig" class="execute-apply-table"
|
||||
:data="otherAttachmentList" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="90" description="暂无数据" style="padding: 0"/>
|
||||
</template>
|
||||
</fvTable>
|
||||
<div class="oper-page-btn" style="margin-right: 90px" v-if="uploadState">
|
||||
<el-button color="#DED0B2" @click="handleSubmit()">提交</el-button>
|
||||
</div>
|
||||
|
||||
<file-preview ref="filePreviewRef" :fullscreen="false" v-if="filePreviewShow" :fileName="filePreviewParam.fileName"
|
||||
:fileUrl="filePreviewParam.fileUrl"
|
||||
:fileType="filePreviewParam.fileType"/>
|
||||
<el-dialog v-model="tagNameShow" center width="450" top="40vh">
|
||||
<div style="display: flex;align-items: center">标签:
|
||||
<el-input v-model="fileParam.tagName" placeholder="请输入标签名称" style="width: 335px;" clearable/>
|
||||
</div>
|
||||
|
||||
<div class="oper" style="display: flex;justify-content: flex-end;margin-top: 10px">
|
||||
<el-button color="#DED0B2" @click="changeTag()">确定</el-button>
|
||||
<el-button @click="tagNameShow=false">取消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import {addTag, delTag, getTagList, updateTag} from "@/api/project-manage";
|
||||
import {ElLoading, ElMessageBox, ElNotification} from "element-plus";
|
||||
import {searchImplementationFileList, uploadFileList} from "@/api/project-manage/attachment";
|
||||
import {deleteFile, downloadFile} from "@/api/project-demand";
|
||||
import {nextTick, onActivated} from "vue";
|
||||
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
const attachmentParam = reactive({
|
||||
tag: ''
|
||||
})
|
||||
const fileParam = ref({
|
||||
tagName: ''
|
||||
})
|
||||
const uploadState = ref(false)
|
||||
const tagNameShow = ref(false)
|
||||
const isDefault = ref(false)
|
||||
const tagsOption = ref([])
|
||||
const fileList = ref([])
|
||||
const allFiles = ref([])
|
||||
const showAttachmentTable = ref(true)
|
||||
const activeName = ref('all')
|
||||
|
||||
const props = defineProps({
|
||||
fileNameTableWidth: {
|
||||
type: String,
|
||||
default: '400'
|
||||
},
|
||||
isLineBtn: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
})
|
||||
const executeTableConfig = reactive({
|
||||
columns: [
|
||||
{
|
||||
prop: 'index',
|
||||
type: 'index',
|
||||
label: '序号',
|
||||
align: 'center',
|
||||
width: 85,
|
||||
},
|
||||
{
|
||||
prop: 'originalFileName',
|
||||
label: '文件名',
|
||||
align: 'center',
|
||||
width: props.fileNameTableWidth,
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => (
|
||||
<div style="color: #2a99ff;cursor: pointer;" onClick={() => clickToPreview(row)}>{row.originalFileName}</div>)
|
||||
},
|
||||
{
|
||||
prop: 'tag',
|
||||
label: '标签',
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
},
|
||||
{
|
||||
prop: 'size',
|
||||
label: '文件大小',
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
||||
},
|
||||
{
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
return (
|
||||
<div>
|
||||
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
|
||||
{
|
||||
uploadState.value ?
|
||||
<popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
||||
onDelete={() => deleteSingleFile(row)}/> : ''
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
// row.newFile ?: ''
|
||||
const otherAttachmentList = ref([])
|
||||
|
||||
const filePreviewParam = ref({
|
||||
fileUrl: '',
|
||||
fileName: '',
|
||||
fileType: 'pdf'
|
||||
})
|
||||
const filePreviewShow = ref(false)
|
||||
const uploadLoading = ref(false)
|
||||
const isEdit = ref(false)
|
||||
const isCloseByList = (index) => {
|
||||
// otherAttachmentList.length>0?false:true
|
||||
return otherAttachmentList.value.length == 0;
|
||||
}
|
||||
const handleDownload = (row) => {
|
||||
downloadFile(row.fileId).then(res => {
|
||||
const blob = new Blob([res])
|
||||
let a = document.createElement('a')
|
||||
a.href = URL.createObjectURL(blob)
|
||||
a.download = row.originalFileName
|
||||
a.click()
|
||||
})
|
||||
}
|
||||
const deleteSingleFile = (row) => {
|
||||
console.log("🚀 ~ file: ", row,otherAttachmentList.value)
|
||||
console.log("🚀 row.newFile ", row.newFile)
|
||||
deleteFile(row.fileId).then(res => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
if (row.newFile) {
|
||||
const finalList = getLocalList().filter(item => item.fileId !== row.fileId);
|
||||
otherAttachmentList.value.splice(otherAttachmentList.value.findIndex((item) => item.fileId === row.fileId), 1);
|
||||
localStorage.setItem(`implementAllFileList-${route.query.projectId}`, JSON.stringify(finalList))
|
||||
} else {
|
||||
otherAttachmentList.value.splice(otherAttachmentList.value.findIndex((item) => item.fileId === row.fileId), 1);
|
||||
allFiles.value.splice(allFiles.value.findIndex((item) => item.fileId === row.fileId), 1);
|
||||
}
|
||||
|
||||
// getAttachmentList()
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const changeTag = async () => {
|
||||
let res = null
|
||||
if (isEdit.value) {
|
||||
res = await updateTag({
|
||||
tagId: activeName.value,
|
||||
fileTag: fileParam.value.tagName,
|
||||
projectId: route.query.projectId,
|
||||
})
|
||||
changeFileList(fileParam.value.tagName, true)
|
||||
} else {
|
||||
res = await addTag({
|
||||
projectId: route.query.projectId,
|
||||
fileTag: fileParam.value.tagName
|
||||
})
|
||||
|
||||
getAttachmentList()
|
||||
fileParam.value.tagName = ''
|
||||
activeName.value = 'all'
|
||||
}
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
tagNameShow.value = false;
|
||||
}
|
||||
const tabRemove = async (val) => {
|
||||
if (otherAttachmentList.value && otherAttachmentList.value.length > 0) {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '该标签下存在文件,不能删除标签。如需删除标签,请先删除该标签下的所有文件。',
|
||||
type: 'error'
|
||||
})
|
||||
return;
|
||||
}
|
||||
ElMessageBox.confirm(`确认删除名称为${getTagName(val)}的标签吗?`, '系统提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(async () => {
|
||||
let res = await delTag(val)
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
getTagsOption()
|
||||
otherAttachmentList.value = allFiles.value
|
||||
}
|
||||
})
|
||||
}
|
||||
const handleEditTag = () => {
|
||||
fileParam.value.tagName = getTagName(activeName.value)
|
||||
if (otherAttachmentList.value && otherAttachmentList.value.length > 0) {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '该标签下存在文件,不能编辑标签。如需编辑标签,请先删除该标签下的所有文件。',
|
||||
type: 'error'
|
||||
})
|
||||
return;
|
||||
}
|
||||
tagNameShow.value = true
|
||||
isEdit.value = true
|
||||
}
|
||||
const getTagName = (name) => {
|
||||
const tagArray = tagsOption.value.filter((item1) => item1.tagId == name)
|
||||
let tagName = ''
|
||||
if (tagArray && tagArray.length > 0) {
|
||||
tagName = tagArray[0].fileTag
|
||||
}
|
||||
return tagName
|
||||
}
|
||||
const handleTabClick = (item, e) => {
|
||||
const defaultArray = tagsOption.value.filter(item1 => item1.tagId == item.props.name)
|
||||
if (defaultArray && defaultArray.length > 0) {
|
||||
isDefault.value = defaultArray[0].isDefault == 1
|
||||
} else {
|
||||
isDefault.value = false
|
||||
}
|
||||
tagNameShow.value = item.props.name == 'plus';
|
||||
if (item.props.name == 'plus') {
|
||||
isEdit.value = false
|
||||
fileParam.value.tagName = ''
|
||||
}
|
||||
if (item.props.name != 'plus') {
|
||||
if (item.props.name == 'all') {
|
||||
changeFileList('all')
|
||||
} else {
|
||||
changeFileList(getTagName(item.props.name))
|
||||
}
|
||||
// if (item.props.name == 'all') {
|
||||
// otherAttachmentList.value = allFiles.value
|
||||
// } else {
|
||||
// otherAttachmentList.value = allFiles.value.filter(item1 => item1.tag == getTagName(item.props.name))
|
||||
// }
|
||||
}
|
||||
// showAttachmentTable.value = false
|
||||
// nextTick(() => {
|
||||
// showAttachmentTable.value = true
|
||||
// })
|
||||
}
|
||||
const compositeParam = (item) => {
|
||||
return {
|
||||
fileId: item.id,
|
||||
size: item.size,
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: true,
|
||||
tag: getTagName(activeName.value) || '项目实施',
|
||||
}
|
||||
}
|
||||
const getFile = (val) => {
|
||||
|
||||
console.log('上传文件', val)
|
||||
fileList.value = getLocalList()
|
||||
let fileObj = compositeParam(val)
|
||||
fileList.value.push(fileObj)
|
||||
localStorage.setItem(`implementAllFileList-${route.query.projectId}`, JSON.stringify(fileList.value))
|
||||
otherAttachmentList.value.push(fileObj)
|
||||
// handleSubmit([fileObj])
|
||||
}
|
||||
|
||||
const handleSubmit = async () => {
|
||||
if (getLocalList().length == 0) {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '暂无文件可提交',
|
||||
type: 'warning'
|
||||
})
|
||||
return;
|
||||
} else {
|
||||
let params = {
|
||||
fileList: getLocalList(),
|
||||
projectId: route.query.projectId,
|
||||
targetState: "30"
|
||||
}
|
||||
let res = await uploadFileList(params)
|
||||
if (res.code !== 1000) {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: 'error'
|
||||
})
|
||||
} else {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: 'success'
|
||||
})
|
||||
localStorage.removeItem(`implementAllFileList-${route.query.projectId}`)
|
||||
// list.forEach(item => {
|
||||
// otherAttachmentList.value.push(item)
|
||||
// })
|
||||
getAttachmentList()
|
||||
fileList.value = []
|
||||
}
|
||||
// changeFileList('all',true)
|
||||
}
|
||||
}
|
||||
const clickToPreview = (row) => {
|
||||
filePreviewShow.value = false
|
||||
filePreviewParam.value = {
|
||||
fileUrl: row.url,
|
||||
fileName: row.originalFileName,
|
||||
fileType: row.fileType
|
||||
}
|
||||
nextTick(() => {
|
||||
filePreviewShow.value = true
|
||||
})
|
||||
}
|
||||
const changeFileList = (tag, flag) => {
|
||||
let params = {}
|
||||
if (tag == 'all') {
|
||||
otherAttachmentList.value = allFiles.value
|
||||
// params = {
|
||||
// targetId: route.query.projectId,
|
||||
// targetState: "30",
|
||||
// }
|
||||
|
||||
otherAttachmentList.value = [...otherAttachmentList.value, ...getLocalList()];
|
||||
} else {
|
||||
const filw = getLocalList().filter(item1 => item1.tag === tag);
|
||||
const filteredAllFiles = allFiles.value.filter(item1 => item1.tag === tag);
|
||||
|
||||
// 使用 fileId 作为唯一标识进行去重
|
||||
const seen = new Set();
|
||||
const uniqueFiles = [...filteredAllFiles, ...filw].filter(item => {
|
||||
if (!seen.has(item.fileId)) {
|
||||
seen.add(item.fileId);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
otherAttachmentList.value = uniqueFiles;
|
||||
// params = {
|
||||
// targetId: route.query.projectId,
|
||||
// targetState: "30",
|
||||
// tag: tag
|
||||
// }
|
||||
}
|
||||
showAttachmentTable.value = false
|
||||
|
||||
// searchImplementationFileList(params).then(res => {
|
||||
// if (res.code === 1000) {
|
||||
// if(tag == 'all'&&flag){
|
||||
// // allFiles.value = res.data.fileList
|
||||
// }else{
|
||||
// otherAttachmentList.value =res.data.fileList
|
||||
// }
|
||||
if (flag) {
|
||||
getTagsOption(flag)
|
||||
}
|
||||
nextTick(() => {
|
||||
showAttachmentTable.value = true
|
||||
})
|
||||
// }
|
||||
// })
|
||||
}
|
||||
const getLocalList = () => {
|
||||
if (localStorage.getItem(`implementAllFileList-${route.query.projectId}`) && JSON.parse(localStorage.getItem(`implementAllFileList-${route.query.projectId}`))) {
|
||||
return JSON.parse(localStorage.getItem(`implementAllFileList-${route.query.projectId}`))
|
||||
} else {
|
||||
return []
|
||||
}
|
||||
}
|
||||
const getAttachmentList = () => {
|
||||
const loading = ElLoading.service({fullscreen: true})
|
||||
let params = {
|
||||
targetId: route.query.projectId,
|
||||
targetState: "30"
|
||||
}
|
||||
showAttachmentTable.value = false
|
||||
searchImplementationFileList(params).then(res => {
|
||||
if (res.code === 1000) {
|
||||
otherAttachmentList.value = [...res.data.fileList, ...getLocalList()]
|
||||
allFiles.value = [...res.data.fileList, ...getLocalList()]
|
||||
uploadState.value = res.data.upload
|
||||
getTagsOption()
|
||||
nextTick(() => {
|
||||
showAttachmentTable.value = true
|
||||
})
|
||||
activeName.value = 'all'
|
||||
loading.close()
|
||||
} else {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: 'error'
|
||||
})
|
||||
loading.close()
|
||||
}
|
||||
})
|
||||
}
|
||||
const getTagsOption = (flag) => {
|
||||
if (!route.query.projectId) return
|
||||
getTagList(route.query.projectId).then(res => {
|
||||
if (res.code === 1000) {
|
||||
|
||||
tagsOption.value = res.data.rows
|
||||
let list = []
|
||||
if (flag) {
|
||||
|
||||
list = allFiles.value
|
||||
} else {
|
||||
list = otherAttachmentList.value
|
||||
}
|
||||
tagsOption.value.forEach((tag, index) => {
|
||||
// const filterArray = list.filter(item => tag.fileTag == item.tag)
|
||||
// console.log("🚀 ~ file:filterArray ", filterArray)
|
||||
tagsOption.value[index].isClose = 1
|
||||
// tagsOption.value[index].isClose = filterArray.length > 0 ? 0 : 1
|
||||
})
|
||||
console.log("🚀 otherAttachmentList.value", allFiles.value)
|
||||
console.log("🚀 ~ file:\tagsOption.value ", tagsOption.value)
|
||||
let defaultArray = [
|
||||
{
|
||||
tagId: 'd1',
|
||||
fileTag: '合同(专项任务书)',
|
||||
isDefault: 1,
|
||||
isClose: 2
|
||||
},
|
||||
{
|
||||
tagId: 'd2',
|
||||
fileTag: '周报',
|
||||
isDefault: 1,
|
||||
isClose: 2
|
||||
},
|
||||
{
|
||||
tagId: 'd3',
|
||||
fileTag: '阶段性验收',
|
||||
isDefault: 1,
|
||||
isClose: 2
|
||||
},
|
||||
{
|
||||
tagId: 'd4',
|
||||
fileTag: '科研成果',
|
||||
isDefault: 1,
|
||||
isClose: 2
|
||||
}
|
||||
]
|
||||
tagsOption.value = [...defaultArray, ...tagsOption.value]
|
||||
// if (!res.data.rows || res.data.rows.length == 0) return;
|
||||
// activeName.value=res.data.rows[0].tagId
|
||||
} else {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
const handleUpload = () => {
|
||||
router.push({
|
||||
name: 'Implementation/upload',
|
||||
query: {
|
||||
id: route.query.id,
|
||||
projectId: route.query.projectId,
|
||||
state: route.query.state,
|
||||
step: '30'
|
||||
}
|
||||
})
|
||||
}
|
||||
getAttachmentList()
|
||||
onActivated(() => {
|
||||
getAttachmentList()
|
||||
})
|
||||
</script>
|
||||
<style lang="scss">
|
||||
.execute-apply-table {
|
||||
//.el-table__header {
|
||||
// .el-table__cell:last-child {
|
||||
// .cell {
|
||||
// margin-left: -108px !important;
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
//.el-table__body {
|
||||
// .el-table__cell:last-child {
|
||||
// .cell {
|
||||
// margin-left: -108px !important;
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
.is-leaf:first-child {
|
||||
.cell {
|
||||
margin-left: -25px !important;
|
||||
}
|
||||
}
|
||||
|
||||
.el-table__body {
|
||||
.el-table__cell:first-child {
|
||||
.cell {
|
||||
margin-left: -13px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<style scoped lang="scss">
|
||||
:deep(.el-dialog__body) {
|
||||
padding: 0 !important;
|
||||
}
|
||||
|
||||
.tag-title {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-top: 15px;
|
||||
|
||||
> div {
|
||||
margin-right: 5px;
|
||||
width: 4px;
|
||||
height: 20px;
|
||||
background-color: #BEA266;
|
||||
}
|
||||
}
|
||||
|
||||
:deep(.el-table--fit ) {
|
||||
height: 311px !important;
|
||||
}
|
||||
|
||||
:deep(.el-tabs__nav) {
|
||||
//width: 75vw;
|
||||
}
|
||||
|
||||
:deep(.el-tabs__item) {
|
||||
flex: none !important;
|
||||
}
|
||||
|
||||
:deep(.el-tabs__header) {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
:deep(.el-tabs__item.is-active) {
|
||||
color: #BEA266;
|
||||
}
|
||||
|
||||
:deep(.el-tabs__active-bar) {
|
||||
background-color: #BEA266;
|
||||
}
|
||||
|
||||
.file-tag {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
border-bottom: 2px solid #f6f6f6;
|
||||
/*align-items: center;*/
|
||||
}
|
||||
</style>
|
||||
@@ -1,234 +1,275 @@
|
||||
<template>
|
||||
<div v-loading="loading">
|
||||
<baseTitle title="专项资金详情"></baseTitle>
|
||||
<el-form :model="formData" ref="form" label-width="auto">
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="专项名称">
|
||||
<span>{{ formData.name }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="金额(元)">
|
||||
<span>{{ toThousands(formData.fundAmount) }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="剩余金额(元)">
|
||||
<span>{{ toThousands(formData.residualAmount) }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<baseTitle title="介绍"></baseTitle>
|
||||
<el-col :span="24">
|
||||
<el-form-item>
|
||||
<el-card style="width: 100%">
|
||||
<div v-html="formData.introduce">
|
||||
</div>
|
||||
</el-card>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<baseTitle title="关联项目" v-if="!data.taskId"></baseTitle>
|
||||
<el-col :span="24" v-if="!data.taskId">
|
||||
<el-form-item>
|
||||
<fvTable style="width: 100%;max-height:162px" height="162" v-if="showTable" :tableConfig="projectTable"
|
||||
:data="formData.projects" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
||||
</template>
|
||||
</fvTable>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<baseTitle title="附件列表"></baseTitle>
|
||||
<el-col :span="24">
|
||||
<el-form-item>
|
||||
<fvTable style="width: 100%;max-height: 162px;" height="162" v-if="showTable" :tableConfig="fileTable"
|
||||
:data="formData.files" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
||||
</template>
|
||||
</fvTable>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<div v-if="data.taskId">
|
||||
<baseTitle title="审核意见"></baseTitle>
|
||||
<el-form-item prop="auditOpinion">
|
||||
<el-input
|
||||
v-model="formData.auditOpinion"
|
||||
:rows="3"
|
||||
type="textarea"
|
||||
placeholder="请输入审核意见"
|
||||
/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<div class="approval-record">
|
||||
<div class="approval-title">
|
||||
<baseTitle title="审批记录"></baseTitle>
|
||||
<div class="diagram">
|
||||
<div class="base-title">流程图</div>
|
||||
<el-switch
|
||||
v-model="changeDiagram"
|
||||
style="--el-switch-on-color:#BEA266 ; --el-switch-off-color:#cecdcd"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="process">
|
||||
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
|
||||
:operation-list="data.operationList"
|
||||
:state="data.state"/>
|
||||
<process-diagram-viewer v-if="processViewer&&changeDiagram" id-name="fundProcess"/>
|
||||
</div>
|
||||
</div>
|
||||
</el-form>
|
||||
<opinion v-if="data.taskId" :formData="data.formData" :taskId="data.taskId"
|
||||
v-model:value="formData.auditOpinion"></opinion>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import {toThousands} from '@/utils/changePrice.js'
|
||||
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'
|
||||
import {downloadFile} from "@/api/project-demand";
|
||||
|
||||
const changeDiagram = ref(false)
|
||||
const emit = defineEmits(['getInfo', "update:formData"])
|
||||
const form = ref()
|
||||
const router = useRouter()
|
||||
|
||||
const props = defineProps({
|
||||
formData: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
data: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
processViewer: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}, showTable: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
loading: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
})
|
||||
const projectTable = reactive({
|
||||
columns: [
|
||||
{
|
||||
prop: 'index',
|
||||
type: 'index',
|
||||
label: '序号',
|
||||
align: 'center',
|
||||
width: '80',
|
||||
},
|
||||
{
|
||||
prop: 'projectName',
|
||||
label: '项目名称',
|
||||
align: 'center',
|
||||
},
|
||||
{
|
||||
prop: 'specialFundAmount',
|
||||
label: '项目金额',
|
||||
align: 'center',
|
||||
currentRender:({row})=>{
|
||||
return <span>{toThousands(row.specialFundAmount)}</span>
|
||||
}
|
||||
},
|
||||
{
|
||||
prop: 'startTime',
|
||||
label: '项目时间',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => {
|
||||
return (
|
||||
<el-button type="primary" link onClick={() => handleView(row)}>查看</el-button>
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
const fileTable = reactive({
|
||||
columns: [
|
||||
{
|
||||
prop: 'index',
|
||||
type: 'index',
|
||||
label: '序号',
|
||||
align: 'center',
|
||||
width: '80',
|
||||
},
|
||||
{
|
||||
prop: 'originalFileName',
|
||||
label: '文件名',
|
||||
align: 'center',
|
||||
},
|
||||
{
|
||||
prop: 'tag',
|
||||
label: '标签',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'size',
|
||||
label: '文件大小',
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
||||
},
|
||||
{
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => {
|
||||
return (
|
||||
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
const handleView=(row)=>{
|
||||
router.push({
|
||||
name: 'Implementation/detail',
|
||||
query: {
|
||||
id: row.requirementId,
|
||||
projectId: row.projectId,
|
||||
step: '10'
|
||||
}
|
||||
})
|
||||
}
|
||||
const handleDownload = (row) => {
|
||||
downloadFile(row.fileId).then(res => {
|
||||
const blob = new Blob([res])
|
||||
let a = document.createElement('a')
|
||||
a.href = URL.createObjectURL(blob)
|
||||
a.download = row.originalFileName
|
||||
a.click()
|
||||
})
|
||||
}
|
||||
|
||||
watch(() => props.loading, (newVal) => {
|
||||
props.loading = newVal
|
||||
}, {deep: true})
|
||||
|
||||
watch(() => props.processViewer, (newVal) => {
|
||||
props.processViewer = newVal
|
||||
}, {deep: true})
|
||||
watch(() => props.showTable, (newVal) => {
|
||||
props.showTable = newVal
|
||||
}, {deep: true})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
:deep(.el-table--fit ) {
|
||||
height: 300px !important;
|
||||
}
|
||||
</style>
|
||||
<template>
|
||||
<div v-loading="loading" style="padding: 0 30px">
|
||||
<baseTitle title="专项资金详情"></baseTitle>
|
||||
<el-form :model="formData" ref="form" >
|
||||
<el-row style="margin-left: 15px;margin-bottom: -18px">
|
||||
<el-col :span="6">
|
||||
<el-form-item label="专项名称">
|
||||
<span>{{ formData.name }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="金额(元)">
|
||||
<span>{{ toThousands(formData.fundAmount) }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="剩余金额(元)">
|
||||
<span>{{ toThousands(formData.residualAmount) }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="专项资金情况说明" >
|
||||
<div style="white-space: pre-wrap">{{formData.introduce}}
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row style="margin-bottom: -18px" class="projects">
|
||||
<baseTitle title="关联项目" v-if="!data.taskId"></baseTitle>
|
||||
<el-col :span="24" v-if="!data.taskId" >
|
||||
<el-form-item >
|
||||
<fvTable style="width: 100%;max-height:160px" height="160" v-if="showTable" :tableConfig="projectTable"
|
||||
:data="formData.projects" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
||||
</template>
|
||||
</fvTable>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<baseTitle title="附件文件"></baseTitle>
|
||||
<el-col :span="24">
|
||||
<el-form-item>
|
||||
<fvTable style="width: 100%;max-height: 160px;" height="160" v-if="showTable" :tableConfig="fileTable"
|
||||
:data="formData.files" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
||||
</template>
|
||||
</fvTable>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" style="margin-top: -18px">
|
||||
<div v-if="data.taskId">
|
||||
<baseTitle title="审核意见"></baseTitle>
|
||||
<el-form-item prop="auditOpinion">
|
||||
<el-input
|
||||
v-model="formData.auditOpinion"
|
||||
:rows="3"
|
||||
type="textarea"
|
||||
placeholder="请输入审核意见"
|
||||
/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<div class="approval-record">
|
||||
<div class="approval-title">
|
||||
<baseTitle title="审批记录"></baseTitle>
|
||||
<div class="diagram">
|
||||
<div class="base-title">流程图</div>
|
||||
<el-switch
|
||||
v-model="changeDiagram"
|
||||
style="--el-switch-on-color:#BEA266 ; --el-switch-off-color:#cecdcd"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="process">
|
||||
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
|
||||
:operation-list="data.operationList"
|
||||
:state="data.state"/>
|
||||
<process-diagram-viewer v-if="processViewer&&changeDiagram" id-name="fundProcess"/>
|
||||
</div>
|
||||
</div>
|
||||
</el-form>
|
||||
<opinion v-if="data.taskId" :formData="data.formData" :taskId="data.taskId"
|
||||
:taskUserOptionList="data.taskUserOptionList"
|
||||
v-model:value="formData.auditOpinion"></opinion>
|
||||
<file-preview ref="filePreviewRef" v-if="filePreviewShow" :fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
|
||||
:fileType="filePreviewParam.fileType"/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import {toThousands} from '@/utils/changePrice.js'
|
||||
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'
|
||||
import {downloadFile} from "@/api/project-demand";
|
||||
|
||||
const changeDiagram = ref(false)
|
||||
const emit = defineEmits(['getInfo', "update:formData"])
|
||||
const form = ref()
|
||||
const router = useRouter()
|
||||
|
||||
const props = defineProps({
|
||||
formData: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
data: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
processViewer: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}, showTable: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
loading: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
})
|
||||
const projectTable = reactive({
|
||||
columns: [
|
||||
{
|
||||
prop: 'index',
|
||||
type: 'index',
|
||||
label: '序号',
|
||||
align: 'center',
|
||||
width: '80',
|
||||
},
|
||||
{
|
||||
prop: 'projectName',
|
||||
label: '项目名称',
|
||||
align: 'center',
|
||||
width: 400
|
||||
},
|
||||
{
|
||||
prop: 'specialFundAmount',
|
||||
label: '项目金额',
|
||||
align: 'center',
|
||||
currentRender:({row})=>{
|
||||
return <span>{toThousands(row.specialFundAmount)}</span>
|
||||
}
|
||||
},
|
||||
{
|
||||
prop: 'startTime',
|
||||
label: '项目时间',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => {
|
||||
return (
|
||||
<el-button type="primary" link onClick={() => handleView(row)}>查看</el-button>
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
const fileTable = reactive({
|
||||
columns: [
|
||||
{
|
||||
prop: 'index',
|
||||
type: 'index',
|
||||
label: '序号',
|
||||
align: 'center',
|
||||
width: '80',
|
||||
},
|
||||
{
|
||||
prop: 'originalFileName',
|
||||
label: '文件名',
|
||||
align: 'center',
|
||||
width: 400,
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => (<div style="color: #2a99ff;cursor: pointer;" onClick={()=>clickToPreview(row)}>{row.originalFileName}</div>)
|
||||
},
|
||||
{
|
||||
prop: 'tag',
|
||||
label: '标签',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'size',
|
||||
label: '文件大小',
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
||||
},
|
||||
{
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => {
|
||||
return (
|
||||
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
const filePreviewParam = ref({
|
||||
fileUrl: '',
|
||||
fileName: '',
|
||||
fileType: 'pdf'
|
||||
})
|
||||
const filePreviewShow = ref(false)
|
||||
const clickToPreview=(row)=>{
|
||||
filePreviewShow.value = false
|
||||
filePreviewParam.value = {
|
||||
fileUrl: row.url,
|
||||
fileName: row.originalFileName,
|
||||
fileType: row.fileType
|
||||
}
|
||||
nextTick(()=>{
|
||||
filePreviewShow.value = true
|
||||
})
|
||||
}
|
||||
const handleView=(row)=>{
|
||||
router.push({
|
||||
name: 'Implementation/detail',
|
||||
query: {
|
||||
id: row.requirementId,
|
||||
projectId: row.projectId,
|
||||
step: '10'
|
||||
}
|
||||
})
|
||||
}
|
||||
const handleDownload = (row) => {
|
||||
downloadFile(row.fileId).then(res => {
|
||||
const blob = new Blob([res])
|
||||
let a = document.createElement('a')
|
||||
a.href = URL.createObjectURL(blob)
|
||||
a.download = row.originalFileName
|
||||
a.click()
|
||||
})
|
||||
}
|
||||
|
||||
watch(() => props.loading, (newVal) => {
|
||||
props.loading = newVal
|
||||
}, {deep: true})
|
||||
|
||||
watch(() => props.processViewer, (newVal) => {
|
||||
props.processViewer = newVal
|
||||
}, {deep: true})
|
||||
watch(() => props.showTable, (newVal) => {
|
||||
props.showTable = newVal
|
||||
}, {deep: true})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.projects{
|
||||
:deep(.el-table--fit ) {
|
||||
height: 300px !important;
|
||||
}
|
||||
}
|
||||
|
||||
:deep(.el-table__header) {
|
||||
.is-leaf:first-child {
|
||||
.cell {
|
||||
margin-left: -20px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
:deep(.el-table__body) {
|
||||
.el-table__cell:first-child {
|
||||
.cell {
|
||||
margin-left: -10px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,370 +1,442 @@
|
||||
<template>
|
||||
<div class="detail-block" v-loading="loading">
|
||||
<baseTitle title="需求上报信息"></baseTitle>
|
||||
<el-form :model="localFormData" ref="summaryForm" :rules="rules">
|
||||
<el-row gutter="50">
|
||||
<el-col :span="8">
|
||||
<el-form-item label="项目名称" prop="projectName">
|
||||
<span>{{ localFormData.projectName }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="开始时间" prop="startTime">
|
||||
<span>{{ localFormData.startTime }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="结束时间" prop="endTime">
|
||||
<span>{{ localFormData.endTime }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="项目类型" prop="projectType">
|
||||
<span>{{ filterDict(cacheStore.getDict('project_type'), localFormData.projectType) }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="研发主体" prop="rdSubject">
|
||||
<span>{{ filterDict(cacheStore.getDict('rd_subject'), localFormData.rdSubject) }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="出资类型" prop="investmentType">
|
||||
<span>{{ filterDict(cacheStore.getDict('invest_type'), localFormData.investmentType) }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<!-- <el-col :span="8">-->
|
||||
<!-- <el-form-item label="项目影响" prop="projectImpact">-->
|
||||
<!-- <span>{{ filterDict(cacheStore.getDict('project_impact'), localFormData.projectImpact) }}</span>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
<el-col :span="8">
|
||||
<el-form-item label="所属业务板块" prop="businessSegment">
|
||||
<span>{{ filterDict(cacheStore.getDict('business_segment'), localFormData.businessSegment) }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="预期技术标准制定" prop="technicalStandard">
|
||||
<span>{{ filterDict(cacheStore.getDict('technical_standard'), localFormData.technicalStandard) }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="产学研联合" prop="industryUniversityResearch">
|
||||
<span>{{
|
||||
filterDict(cacheStore.getDict('industry_university'), localFormData.industryUniversityResearch)
|
||||
}}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="开展政府申报" prop="governmentDeclaration">
|
||||
<span>{{
|
||||
filterDict(cacheStore.getDict('government_declaration'), localFormData.governmentDeclaration)
|
||||
}}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8" v-if="localFormData.isSpecialFund">
|
||||
<el-form-item label="专项资金名称" prop="specialFund">
|
||||
<span>{{
|
||||
localFormData.specialFundId === 0 ? localFormData.specialFund : changeName(fundOption, localFormData.specialFundId)
|
||||
}}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="知识产权状况" prop="intellectualProperty">
|
||||
<span>{{
|
||||
filterDict(cacheStore.getDict('intellectual_property'), localFormData.intellectualProperty)
|
||||
}}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="16">
|
||||
<el-form-item label="预期成果形式" prop="resultForm">
|
||||
<span>{{ filterDict(cacheStore.getDict('result_form'), localFormData.resultForm) }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<baseTitle title="预期知识产权"></baseTitle>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="发明专利(项)" prop="inventionPatent">
|
||||
<span>{{ localFormData.inventionPatent }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="实用性新型专利(项)" prop="newPatent">
|
||||
<span>{{ localFormData.newPatent }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="软件著作权(项)" prop="softwareCopyright">
|
||||
<span>{{ localFormData.softwareCopyright }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="著作权(项)" prop="copyright">
|
||||
<span>{{ localFormData.copyright }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="其他(项)" prop="other">
|
||||
<span>{{ localFormData.other }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="经济预算(元)" prop="economicEstimate">
|
||||
<span>{{ toThousands(localFormData.economicEstimate) }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="其中申请公司总部科技创新专项资金(元)" prop="specialFundAmount"
|
||||
v-if="localFormData.isSpecialFund">
|
||||
<span>{{ toThousands(localFormData.specialFundAmount) }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="现有业务描述" prop="serviceDescription">
|
||||
<span>{{ localFormData.serviceDescription }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="研发项目关键内容描述" prop="contentDescription">
|
||||
<span>{{ localFormData.contentDescription }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<baseTitle title="需求上报申请书"></baseTitle>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item>
|
||||
<el-button type="primary" link @click="handleDownload(localFormData.singleFile)" style="font-size: 16px">
|
||||
{{ localFormData.singleFile?.originalFileName }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<baseTitle title="附件列表"></baseTitle>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<file-component tag="需求上报"
|
||||
v-model:value="localFormData.fileList" :processViewer="processViewer"
|
||||
:file-list-show="fileListShow"/>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<div v-if="data.taskId||data.state==='4'">
|
||||
<baseTitle title="审核意见"></baseTitle>
|
||||
<el-form-item prop="_value">
|
||||
<el-input
|
||||
v-model="_value"
|
||||
:rows="3"
|
||||
type="textarea"
|
||||
placeholder="请输入审核意见"
|
||||
/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<div class="approval-record">
|
||||
<div class="approval-title">
|
||||
<baseTitle title="审批记录"></baseTitle>
|
||||
<div class="diagram">
|
||||
<div class="base-title">流程图</div>
|
||||
<el-switch
|
||||
v-model="changeDiagram"
|
||||
style="--el-switch-on-color:#BEA266 ; --el-switch-off-color:#cecdcd"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="process">
|
||||
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
|
||||
:operation-list="data.operationList"
|
||||
:step="'report'"
|
||||
:state="data.state"/>
|
||||
<process-diagram-viewer v-if="processViewer&&changeDiagram" id-name="summaryProcess"/>
|
||||
</div>
|
||||
</div>
|
||||
</el-form>
|
||||
<div class="oper-page-btn" v-perm="['annual:plan:approve']" v-if="data.state==='4'">
|
||||
<el-button type="danger" @click="handleRejectPlan">驳回年度计划</el-button>
|
||||
<el-button color="#DED0B2" @click="handleAgreePlan">通过年度计划</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import {toThousands} from '@/utils/changePrice.js'
|
||||
import {downloadFile, deleteFile} from "@/api/project-demand";
|
||||
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'
|
||||
import {useTagsView} from '@/stores/tagsview.js'
|
||||
import {getFundOption} from "@/api/special-fund";
|
||||
import {useCacheStore} from '@/stores/cache.js'
|
||||
import {getSubCompOpt} from "@/api/user/user";
|
||||
import FileComponent from "./FileComponent.vue";
|
||||
import {ElNotification} from "element-plus";
|
||||
import {approvePlan} from "@/api/project-demand/summary";
|
||||
|
||||
const emit = defineEmits(['update:value'])
|
||||
const tagsViewStore = useTagsView()
|
||||
const cacheStore = useCacheStore()
|
||||
const props = defineProps({
|
||||
formData: {
|
||||
type: Object,
|
||||
default: {}
|
||||
},
|
||||
data: {
|
||||
type: Object,
|
||||
default: {
|
||||
state: '1'
|
||||
}
|
||||
},
|
||||
processViewer: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
fileListShow: {
|
||||
type: String,
|
||||
default: 'READ'
|
||||
},
|
||||
loading: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
value: {
|
||||
type: String,
|
||||
default: ''
|
||||
}
|
||||
})
|
||||
const changeDiagram = ref(false)
|
||||
const localFormData = ref({})
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const fundOption = ref([])
|
||||
const companyOption = ref([])
|
||||
const dictName = ref({})
|
||||
const rules = reactive({
|
||||
auditOpinion: [{required: true, message: '请输入审核意见', trigger: 'blur'}],
|
||||
})
|
||||
const _value = computed({
|
||||
get() {
|
||||
return props.value;
|
||||
},
|
||||
set(val) {
|
||||
emit("update:value", val);
|
||||
}
|
||||
})
|
||||
const handleRejectPlan = async () => {
|
||||
// const values = form.value.getValues()
|
||||
// console.log('route',route.query.projectId)
|
||||
if (!_value.value) {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '请填写审核意见',
|
||||
type: 'warning'
|
||||
})
|
||||
return
|
||||
}
|
||||
const params = {
|
||||
auditOpinion:_value.value,
|
||||
projectId:parseInt(route.query.projectId),
|
||||
state:false
|
||||
}
|
||||
// console.log('params', params)
|
||||
const res = await approvePlan(params)
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||
router.push({
|
||||
name: 'Summary'
|
||||
})
|
||||
}
|
||||
const handleAgreePlan = async () => {
|
||||
const params = {
|
||||
auditOpinion:_value.value,
|
||||
projectId:parseInt(route.query.projectId),
|
||||
state:true
|
||||
}
|
||||
// console.log('params', params)
|
||||
const res = await approvePlan(params)
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||
router.push({
|
||||
name: 'Summary'
|
||||
})
|
||||
}
|
||||
const filterDict = (data, value) => {
|
||||
if (data === undefined || value === undefined) return;
|
||||
let label = ''
|
||||
let result = []
|
||||
if (value instanceof Array) {
|
||||
value.forEach(item1 => {
|
||||
data.find(item => {
|
||||
if (item.value == item1) {
|
||||
result.push(item.label)
|
||||
}
|
||||
})
|
||||
})
|
||||
label = result.map(item => item).join(',')
|
||||
} else {
|
||||
if (data instanceof Array) {
|
||||
data.find(item => {
|
||||
if (item.value == value) {
|
||||
label = item.label
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
return label
|
||||
}
|
||||
const getFundOptions = async () => {
|
||||
const resFund = await getFundOption()
|
||||
fundOption.value = resFund.data
|
||||
const res = await getSubCompOpt()
|
||||
companyOption.value = res.data
|
||||
}
|
||||
const changeName = (option, value) => {
|
||||
let name = ''
|
||||
option.forEach(item => {
|
||||
if (item.value == value) {
|
||||
name = item.label
|
||||
}
|
||||
})
|
||||
return name
|
||||
}
|
||||
const handleDownload = (row) => {
|
||||
downloadFile(row.fileId).then(res => {
|
||||
const blob = new Blob([res])
|
||||
let a = document.createElement('a')
|
||||
a.href = URL.createObjectURL(blob)
|
||||
a.download = row.originalFileName
|
||||
a.click()
|
||||
})
|
||||
}
|
||||
|
||||
watch(() => props.processViewer, (newVal) => {
|
||||
props.processViewer = newVal
|
||||
}, {deep: true})
|
||||
|
||||
watch(() => props.loading, (newVal) => {
|
||||
props.loading = newVal
|
||||
}, {deep: true})
|
||||
|
||||
watchEffect(() => {
|
||||
return Object.keys(props.formData).length && (localFormData.value = props.formData)
|
||||
})
|
||||
|
||||
getFundOptions()
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.detail-block {
|
||||
overflow-x: hidden;
|
||||
overflow-y: auto;
|
||||
padding-bottom: 0!important;
|
||||
}
|
||||
</style>
|
||||
<template>
|
||||
<div class="detail-block" v-loading="loading">
|
||||
<el-form :model="localFormData" ref="summaryForm" :rules="rules">
|
||||
<baseTitle title="预期知识产权"></baseTitle>
|
||||
<el-row gutter="20" style="margin-bottom: -18px;margin-left: 5px">
|
||||
<!-- <el-col :span="6">-->
|
||||
<!-- <el-form-item label="预期成果形式" prop="resultForm">-->
|
||||
<!-- <span>{{ filterDict(cacheStore.getDict('result_form'), localFormData.resultForm) }}</span>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
<el-col :span="6">
|
||||
<el-form-item label="知识产权归属" prop="intellectualProperty">
|
||||
<span>{{
|
||||
filterDict(cacheStore.getDict('intellectual_property'), localFormData.intellectualProperty)
|
||||
}}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="预估专利(项)" prop="newPatent">
|
||||
<span>{{ localFormData.newPatent }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="6">
|
||||
<el-form-item label="预估软件著作权(项)" prop="softwareCopyright">
|
||||
<span>{{ localFormData.softwareCopyright }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
|
||||
<el-col :span="6">
|
||||
<el-form-item label="预估技术标准(项)" prop="technicalNorms">
|
||||
<span>{{ localFormData.technicalNorms }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="6">
|
||||
<el-form-item label="预估新产品(项)" prop="newProduct">
|
||||
<span>{{ localFormData.newProduct }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="6">
|
||||
<el-form-item label="预估新工艺(项)" prop="newProcess">
|
||||
<span>{{ localFormData.newProcess }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="6">
|
||||
<el-form-item label="预估新装置(项)" prop="newDevice">
|
||||
<span>{{ localFormData.newDevice }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="6">
|
||||
<el-form-item label="预估新材料(项)" prop="newMaterials">
|
||||
<span>{{ localFormData.newMaterials }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="6">
|
||||
<el-form-item label="预估计算机软件(项)" prop="computerSoftware">
|
||||
<span>{{ localFormData.computerSoftware }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="6">
|
||||
<el-form-item label="预估论文论著(项)" prop="thesis">
|
||||
<span>{{ localFormData.thesis }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="6">
|
||||
<el-form-item label="预估研究报告(项)" prop="researchReport">
|
||||
<span>{{ localFormData.researchReport }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="6">
|
||||
<el-form-item label="预估商标(项)" prop="trademark">
|
||||
<span>{{ localFormData.trademark }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="6">
|
||||
<el-form-item label="预估其他(项)" prop="other">
|
||||
<span style="white-space: pre-wrap">{{ localFormData.other }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<baseTitle title="项目描述"></baseTitle>
|
||||
<el-row gutter="20" style="margin-left: 5px;margin-bottom: -18px;">
|
||||
<el-col :span="24">
|
||||
<el-form-item label="现有业务描述" prop="serviceDescription">
|
||||
<span style="white-space: pre-wrap">{{ localFormData.serviceDescription }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="建设目标描述" prop="contentDescription">
|
||||
<span style="white-space: pre-wrap">{{ localFormData.contentDescription }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<baseTitle title="需求上报申请书" style="margin-bottom: -3px;"></baseTitle>
|
||||
<!-- <el-row gutter="20" style="margin-bottom: -15px;">-->
|
||||
<!-- <el-col :span="24">-->
|
||||
<!-- <single-file-component tag="需求上报" v-model:value="localFormData.singleFile" :processViewer="processViewer"/>-->
|
||||
<!-- <!– <el-form-item>–>-->
|
||||
<!-- <!– {{localFormData.singleFile}}–>-->
|
||||
<!-- <!– <el-button type="primary" link @click="handleDownload(localFormData.singleFile)" style="font-size: 16px">–>-->
|
||||
<!-- <!– {{ localFormData.singleFile?.originalFileName }}–>-->
|
||||
<!-- <!– </el-button>–>-->
|
||||
<!-- <!– </el-form-item>–>-->
|
||||
<!-- </el-col>-->
|
||||
<!-- </el-row>-->
|
||||
<!--/* <baseTitle title="附件文件" style="margin-bottom: 0"></baseTitle>*/-->
|
||||
<el-row gutter="20" style="margin-bottom: -18px;">
|
||||
<el-col :span="24" class="file-table-style">
|
||||
<file-component tag="需求上报"
|
||||
v-model:value="localFormData.fileList" :processViewer="processViewer"
|
||||
:file-list-show="fileListShow"/>
|
||||
</el-col>
|
||||
<el-col :span="24" style="margin-top: -15px">
|
||||
<div v-if="data.taskId">
|
||||
<baseTitle title="审核意见"></baseTitle>
|
||||
<el-form-item prop="_value">
|
||||
<el-input
|
||||
v-model="_value"
|
||||
:rows="3"
|
||||
type="textarea"
|
||||
placeholder="请输入审核意见"
|
||||
/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
<div v-if="data.state==='5'" style="margin-bottom: 15px">
|
||||
<baseTitle title="前置流程" v-if="localFormData.preProcess"></baseTitle>
|
||||
<div style="display: flex;align-items: center;flex-wrap: wrap;">
|
||||
<div v-for="(item,index) in localFormData.preProcess" :key="item.requestId">
|
||||
<a :href="item.baseUrl" target="_blank"
|
||||
style="color: #2a99ff;cursor: pointer">{{ item.requestName }}<span
|
||||
v-if="index != localFormData.preProcess.length -1">,</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-perm="['annual:plan:approve']" v-if="data.state==='4'">
|
||||
<!-- <baseTitle title="前置流程"></baseTitle>-->
|
||||
<!-- <select-pre-process :formData="localFormData"/>-->
|
||||
<baseTitle title="审核意见"></baseTitle>
|
||||
<el-form-item prop="_value">
|
||||
<el-input
|
||||
v-model="_value"
|
||||
:rows="3"
|
||||
type="textarea"
|
||||
placeholder="请输入审核意见"
|
||||
/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<div class="approval-record">
|
||||
<div class="approval-title" style="margin-top: -12px">
|
||||
<baseTitle title="审批记录"></baseTitle>
|
||||
<div class="diagram">
|
||||
<div class="base-title">流程图</div>
|
||||
<el-switch
|
||||
v-model="changeDiagram"
|
||||
style="--el-switch-on-color:#BEA266 ; --el-switch-off-color:#cecdcd"
|
||||
/>
|
||||
</div>
|
||||
<el-button color="#DED0B2" style="margin-left: 10px"
|
||||
@click="handleCarbonCopy()">立即抄送
|
||||
</el-button>
|
||||
</div>
|
||||
<div class="process">
|
||||
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
|
||||
:operation-list="data.operationList"
|
||||
:step="'report'"
|
||||
:state="data.state"/>
|
||||
<process-diagram-viewer v-if="processViewer&&changeDiagram" id-name="summaryProcess"/>
|
||||
</div>
|
||||
</div>
|
||||
</el-form>
|
||||
<user-picker :multiple="true" ref="carbonCopyUserRef" title="请选择抄送人员"
|
||||
v-model:value="carbonCopyUserList" @ok="carbonCopyUserPickerOk"
|
||||
@cancelOrClear="carbonCopyUserPickerOk"/>
|
||||
|
||||
<div class="oper-page-btn" v-perm="['annual:plan:approve']" v-if="data.state==='4'">
|
||||
<el-button type="danger" @click="handleRejectPlan">驳回项目计划</el-button>
|
||||
<el-button color="#DED0B2" @click="handleAgreePlan">通过项目计划</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import {toThousands} from '@/utils/changePrice.js'
|
||||
import {downloadFile, deleteFile} from "@/api/project-demand";
|
||||
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'
|
||||
import {useTagsView} from '@/stores/tagsview.js'
|
||||
import {getFundOption} from "@/api/special-fund";
|
||||
import {useCacheStore} from '@/stores/cache.js'
|
||||
import {getSubCompOpt} from "@/api/user/user";
|
||||
import FileComponent from "./FileComponent.vue";
|
||||
import {ElNotification} from "element-plus";
|
||||
import {approvePlan} from "@/api/project-demand/summary";
|
||||
import SelectPreProcess from "@/components/SelectPreProcess.vue";
|
||||
import {applyCcSend} from "@/api/expense-manage";
|
||||
import UserPicker from "@/views/workflow/process/common/UserPicker.vue";
|
||||
|
||||
const emit = defineEmits(['update:value','ccSend'])
|
||||
const tagsViewStore = useTagsView()
|
||||
const cacheStore = useCacheStore()
|
||||
const props = defineProps({
|
||||
formData: {
|
||||
type: Object,
|
||||
default: {}
|
||||
},
|
||||
data: {
|
||||
type: Object,
|
||||
default: {
|
||||
state: '1'
|
||||
}
|
||||
},
|
||||
processViewer: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
fileListShow: {
|
||||
type: String,
|
||||
default: 'READ'
|
||||
},
|
||||
loading: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
value: {
|
||||
type: String,
|
||||
default: ''
|
||||
}
|
||||
})
|
||||
const changeDiagram = ref(false)
|
||||
const localFormData = ref({})
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const fundOption = ref([])
|
||||
const companyOption = ref([])
|
||||
const dictName = ref({})
|
||||
const carbonCopyUserList = ref([])
|
||||
const carbonCopyUserRef = ref()
|
||||
const rules = reactive({
|
||||
auditOpinion: [{required: true, message: '请输入审核意见', trigger: 'blur'}],
|
||||
})
|
||||
const _value = computed({
|
||||
get() {
|
||||
return props.value;
|
||||
},
|
||||
set(val) {
|
||||
emit("update:value", val);
|
||||
}
|
||||
})
|
||||
const handleCarbonCopy = () => {
|
||||
carbonCopyUserRef.value.showUserPicker()
|
||||
}
|
||||
const carbonCopyUserPickerOk = (userList) => {
|
||||
carbonCopyUserList.value = userList.map(item => item.id)
|
||||
console.log('localFormData.value', props.data)
|
||||
console.log("🚀 ~ file:'carbonCopyUserList.value ", carbonCopyUserList.value)
|
||||
|
||||
addUser()
|
||||
}
|
||||
const addUser = async () => {
|
||||
const res = await applyCcSend({
|
||||
instanceId: props.data.processInstanceId,
|
||||
projectId: route.query.projectId,
|
||||
state: route.query.step,
|
||||
userIds: carbonCopyUserList.value
|
||||
})
|
||||
console.log('res', res)
|
||||
if (res.code === 1000) {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '抄送成功',
|
||||
type: 'success'
|
||||
})
|
||||
emit('ccSend')
|
||||
} else {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
}
|
||||
const handleRejectPlan = async () => {
|
||||
// const values = form.value.getValues()
|
||||
// console.log('route',route.query.projectId)
|
||||
if (!_value.value) {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '请填写审核意见',
|
||||
type: 'warning'
|
||||
})
|
||||
return
|
||||
}
|
||||
const params = {
|
||||
auditOpinion: _value.value,
|
||||
projectId: parseInt(route.query.projectId),
|
||||
state: false
|
||||
}
|
||||
// console.log('params', params)
|
||||
const res = await approvePlan(params)
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||
router.push({
|
||||
name: 'Summary'
|
||||
})
|
||||
}
|
||||
const handleAgreePlan = async () => {
|
||||
if (!_value.value) {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '请填写审核意见',
|
||||
type: 'warning'
|
||||
})
|
||||
return
|
||||
}
|
||||
const params = {
|
||||
auditOpinion: _value.value,
|
||||
projectId: parseInt(route.query.projectId),
|
||||
preProcess: JSON.stringify(localFormData.value.preProcess),
|
||||
state: true
|
||||
}
|
||||
|
||||
const res = await approvePlan(params)
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||
router.push({
|
||||
name: 'Summary'
|
||||
})
|
||||
}
|
||||
const filterDict = (data, value) => {
|
||||
if (data === undefined || value === undefined) return;
|
||||
let label = ''
|
||||
let result = []
|
||||
if (value instanceof Array) {
|
||||
value.forEach(item1 => {
|
||||
data.find(item => {
|
||||
if (item.value == item1) {
|
||||
result.push(item.label)
|
||||
}
|
||||
})
|
||||
})
|
||||
label = result.map(item => item).join(',')
|
||||
} else {
|
||||
if (data instanceof Array) {
|
||||
data.find(item => {
|
||||
if (item.value == value) {
|
||||
label = item.label
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
return label
|
||||
}
|
||||
const getFundOptions = async () => {
|
||||
const resFund = await getFundOption()
|
||||
fundOption.value = resFund.data
|
||||
const res = await getSubCompOpt()
|
||||
companyOption.value = res.data
|
||||
}
|
||||
const changeName = (option, value) => {
|
||||
let name = ''
|
||||
option.forEach(item => {
|
||||
if (item.value == value) {
|
||||
name = item.label
|
||||
}
|
||||
})
|
||||
return name
|
||||
}
|
||||
const handleDownload = (row) => {
|
||||
downloadFile(row.fileId).then(res => {
|
||||
const blob = new Blob([res])
|
||||
let a = document.createElement('a')
|
||||
a.href = URL.createObjectURL(blob)
|
||||
a.download = row.originalFileName
|
||||
a.click()
|
||||
})
|
||||
}
|
||||
|
||||
watch(() => props.processViewer, (newVal) => {
|
||||
props.processViewer = newVal
|
||||
}, {deep: true})
|
||||
|
||||
watch(() => props.loading, (newVal) => {
|
||||
props.loading = newVal
|
||||
}, {deep: true})
|
||||
|
||||
watchEffect(() => {
|
||||
props.formData.singleFile = [props.formData.singleFile]
|
||||
return Object.keys(props.formData).length && (localFormData.value = props.formData)
|
||||
})
|
||||
|
||||
getFundOptions()
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.detail-block {
|
||||
overflow-x: hidden;
|
||||
overflow-y: auto;
|
||||
padding-bottom: 0 !important;
|
||||
}
|
||||
|
||||
.file-table-style {
|
||||
:deep(.el-table__header) {
|
||||
.is-leaf:first-child {
|
||||
.cell {
|
||||
margin-left: -25px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
:deep(.el-table__body) {
|
||||
.el-table__cell:first-child {
|
||||
.cell {
|
||||
margin-left: -13px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
209
src/components/DetailComponent/singleFileComponent.vue
Normal file
@@ -0,0 +1,209 @@
|
||||
<template>
|
||||
<el-form :label-position="labelAlign">
|
||||
<el-form-item :label="title?'其他文件':''" :label-position="labelAlign" :label-width="title?95:''">
|
||||
<fvTable style="width: 100%;max-height: 80px;" v-if="processViewer" height="80" :tableConfig="tableConfig"
|
||||
:data="_value" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
||||
</template>
|
||||
</fvTable>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<file-preview ref="filePreviewRef" :fullscreen="fullscreen" v-if="filePreviewShow" :fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
|
||||
:fileType="filePreviewParam.fileType"/>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import {downloadFile, deleteFile} from "@/api/project-demand";
|
||||
import {ElNotification} from "element-plus";
|
||||
|
||||
const props = defineProps({
|
||||
title: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
tag: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
fileNameTableWidth: {
|
||||
type: String,
|
||||
default: '400'
|
||||
},
|
||||
value: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
processViewer: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
labelAlign: {
|
||||
type: String,
|
||||
default: 'right'
|
||||
},
|
||||
//弹窗是否铺满全屏
|
||||
fullscreen: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
})
|
||||
const emit = defineEmits(['update:value'])
|
||||
const tableConfig = reactive({
|
||||
columns: [
|
||||
{
|
||||
prop: 'index',
|
||||
type: 'index',
|
||||
label: '序号',
|
||||
align: 'center',
|
||||
width: 85,
|
||||
},
|
||||
{
|
||||
prop: 'originalFileName',
|
||||
label: '文件名',
|
||||
align: 'center',
|
||||
width: props.fileNameTableWidth,
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => (<div style="color: #2a99ff;cursor: pointer;" onClick={()=>clickToPreview(row)}>{row.originalFileName}</div>)
|
||||
|
||||
},
|
||||
{
|
||||
prop: 'tag',
|
||||
label: '标签',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'size',
|
||||
label: '文件大小',
|
||||
align: 'center',
|
||||
width: 150,
|
||||
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
||||
},
|
||||
{
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
let btn = []
|
||||
btn.push({label: '下载', func: () => handleDownload(row), type: 'primary'})
|
||||
// if (row.newFile) {
|
||||
// btn.push({label: '删除', func: () => handleDelete(row), type: 'primary'})
|
||||
// }
|
||||
return (
|
||||
<div style={{width: '100%'}}>
|
||||
{
|
||||
btn.map(item => (
|
||||
<el-button
|
||||
type={item.type}
|
||||
onClick={() => item.func()}
|
||||
link>
|
||||
{item.label}
|
||||
</el-button>
|
||||
))
|
||||
}
|
||||
{
|
||||
row.newFile ? <popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
||||
onDelete={() => handleDelete(row)}/>
|
||||
: ''
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
const filePreviewParam = ref({
|
||||
fileUrl: '',
|
||||
fileName: '',
|
||||
fileType: 'pdf'
|
||||
})
|
||||
const filePreviewShow = ref(false)
|
||||
const clickToPreview=(row)=>{
|
||||
filePreviewShow.value = false
|
||||
filePreviewParam.value = {
|
||||
fileUrl: row.url,
|
||||
fileName: row.originalFileName,
|
||||
fileType: row.fileType
|
||||
}
|
||||
nextTick(()=>{
|
||||
filePreviewShow.value = true
|
||||
})
|
||||
}
|
||||
const _value = computed({
|
||||
get() {
|
||||
return props.value;
|
||||
},
|
||||
set(val) {
|
||||
emit("update:value", val);
|
||||
}
|
||||
})
|
||||
|
||||
const getOtherFile = (val) => {
|
||||
props.processViewer = false
|
||||
let fileObj = compositeParam(val)
|
||||
_value.value.push(fileObj)
|
||||
nextTick(() => {
|
||||
props.processViewer = true
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
const compositeParam = (item, type) => {
|
||||
return {
|
||||
fileId: item.id,
|
||||
size: item.size,
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: true,
|
||||
tag: props.tag
|
||||
}
|
||||
}
|
||||
const handleDownload = (row) => {
|
||||
downloadFile(row.fileId).then(res => {
|
||||
const blob = new Blob([res])
|
||||
let a = document.createElement('a')
|
||||
a.href = URL.createObjectURL(blob)
|
||||
a.download = row.originalFileName
|
||||
a.click()
|
||||
})
|
||||
}
|
||||
const handleDelete = (row) => {
|
||||
deleteFile(row.fileId).then(res => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
_value.value.splice(_value.value.findIndex((item) => item.fileId === row.fileId), 1);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
watch(() => props.processViewer, (newVal) => {
|
||||
props.processViewer = newVal
|
||||
}, {deep: true})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
:deep(.el-table--fit ) {
|
||||
height: 80px !important;
|
||||
}
|
||||
:deep(.el-table__header) {
|
||||
.is-leaf:first-child {
|
||||
.cell {
|
||||
margin-left: -25px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
:deep(.el-table__body) {
|
||||
.el-table__cell:first-child {
|
||||
.cell {
|
||||
margin-left: -13px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,117 +1,210 @@
|
||||
<template>
|
||||
<el-upload :file-list="_value"
|
||||
:action="uploadFileUrl"
|
||||
:headers="headers"
|
||||
:limit="maxSize"
|
||||
with-credentials
|
||||
:multiple="multiple"
|
||||
:data="uploadParams"
|
||||
:show-file-list="showFileList"
|
||||
:auto-upload="true"
|
||||
:before-upload="beforeUpload"
|
||||
:on-success="handleUploadSuccess"
|
||||
:on-error="uploadError"
|
||||
:before-remove="beforeRemove"
|
||||
:on-remove="handleRemove"
|
||||
>
|
||||
<el-button color="#DED0B2" :loading="loading" :disabled="disabled">上传文件</el-button>
|
||||
</el-upload>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ElMessageBox, ElNotification} from "element-plus";
|
||||
import {getToken} from '@/utils/auth'
|
||||
|
||||
const baseURL = import.meta.env.VITE_BASE_URL
|
||||
const uploadFileUrl = ref(baseURL + "/workflow/process/file/upload")
|
||||
const headers = reactive({
|
||||
authorization: getToken()
|
||||
})
|
||||
const loading = ref(false)
|
||||
const showTable = ref(false)
|
||||
const uploadParams = ref({})
|
||||
const props = defineProps({
|
||||
value: {
|
||||
type: Array,
|
||||
default: () => {
|
||||
return []
|
||||
}
|
||||
},
|
||||
maxSize: {
|
||||
type: Number,
|
||||
default: 30
|
||||
},
|
||||
showFileList: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
disabled: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
multiple: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
}
|
||||
})
|
||||
|
||||
const emit = defineEmits(["input", "getFile", "delete"])
|
||||
const fileList = ref([])
|
||||
const _value = computed({
|
||||
get() {
|
||||
return props.value;
|
||||
},
|
||||
set(val) {
|
||||
emit("input", val);
|
||||
}
|
||||
})
|
||||
const beforeRemove = (file) => {
|
||||
return ElMessageBox.confirm(`确认删除名称为${file.name}的文件吗?`, '系统提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(() => true)
|
||||
}
|
||||
|
||||
const handleRemove = (file) => {
|
||||
emit("delete", file.response.data.id)
|
||||
}
|
||||
const beforeUpload = () => {
|
||||
loading.value = true
|
||||
return true
|
||||
}
|
||||
const handleUploadSuccess = (res) => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.code === 1000 ? '上传成功' : '上传失败',
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
loading.value = false
|
||||
showTable.value = true
|
||||
let data = res.data
|
||||
fileList.value.push(data)
|
||||
emit("getFile", res.data)
|
||||
}
|
||||
const uploadError = () => {
|
||||
loading.value = false
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: "上传失败,请稍后再试!",
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
defineExpose({
|
||||
handleRemove
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
a {
|
||||
font-size: 14px;
|
||||
color: #2a99ff;
|
||||
}
|
||||
|
||||
:deep(.el-upload-list) {
|
||||
width: 400px;
|
||||
}
|
||||
</style>
|
||||
<template>
|
||||
<el-upload :file-list="_value" ref="uploadRef"
|
||||
action="#"
|
||||
:headers="headers"
|
||||
:limit="maxSize"
|
||||
with-credentials
|
||||
:multiple="multiple"
|
||||
:data="uploadParams" :on-change="handleChange"
|
||||
:http-request="customUpload"
|
||||
:show-file-list="showFileList"
|
||||
:auto-upload="false"
|
||||
:before-upload="beforeUpload"
|
||||
:on-error="uploadError"
|
||||
:before-remove="beforeRemove"
|
||||
:on-remove="handleRemove"
|
||||
>
|
||||
<!-- :on-success="handleUploadSuccess"-->
|
||||
<el-button color="#DED0B2" :loading="loading" :disabled="disabled">上传文件</el-button>
|
||||
</el-upload>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {ElLoading, ElMessage, ElMessageBox, ElNotification} from "element-plus";
|
||||
import {getToken} from '@/utils/auth'
|
||||
import {nextTick} from "vue";
|
||||
import axios from "axios";
|
||||
|
||||
const baseURL = import.meta.env.VITE_BASE_URL
|
||||
const uploadFileUrl = ref(baseURL + "/workflow/process/file/upload")
|
||||
const headers = reactive({
|
||||
'Content-Type': 'multipart/form-data',
|
||||
authorization: getToken()
|
||||
})
|
||||
const loading = ref(false)
|
||||
const showTable = ref(false)
|
||||
const uploadIndex = ref(0)
|
||||
const uploadParams = ref({})
|
||||
const props = defineProps({
|
||||
value: {
|
||||
type: Array,
|
||||
default: () => {
|
||||
return []
|
||||
}
|
||||
},
|
||||
maxSize: {
|
||||
type: Number,
|
||||
default: 999999
|
||||
},
|
||||
showFileList: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
disabled: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
multiple: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
}
|
||||
})
|
||||
const uploadRef = ref(null); // el-upload 的 ref
|
||||
const uploadPromises = ref([]); // 跟踪每个文件的上传状态
|
||||
const emit = defineEmits(["input", "beforeUpload", "getFile", "delete"])
|
||||
const fileList = ref([])
|
||||
const _value = computed({
|
||||
get() {
|
||||
return props.value;
|
||||
},
|
||||
set(val) {
|
||||
emit("input", val);
|
||||
}
|
||||
})
|
||||
const beforeRemove = (file) => {
|
||||
return ElMessageBox.confirm(`确认删除名称为${file.name}的文件吗?`, '系统提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(() => true)
|
||||
}
|
||||
|
||||
const uploadLoading = ref(false)
|
||||
const uploadFile = ref([])
|
||||
const handleRemove = (file) => {
|
||||
emit("delete", file.response.data.id)
|
||||
}
|
||||
|
||||
// 文件选择变化时触发
|
||||
const handleChange = (file, files) => {
|
||||
const deleteFileRow = JSON.parse(localStorage.getItem('deleteFileRow'));
|
||||
console.log("🚀 ~ file:deleteFileRow ", deleteFileRow, uploadFile.value)
|
||||
let deleteIndex = null
|
||||
if (deleteFileRow) {
|
||||
deleteIndex = uploadFile.value.findIndex((item) => item.name === deleteFileRow.originalFileName && item.size === deleteFileRow.size)
|
||||
console.log("🚀 ~ file:deleteIndex ", deleteIndex)
|
||||
|
||||
if (deleteIndex != -1) {
|
||||
uploadFile.value.splice(deleteIndex, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
console.log(file, files, 'files')
|
||||
uploadIndex.value++
|
||||
uploadFile.value.push(file)
|
||||
console.log("🚀 ~ file:uploadFile.value ", uploadFile.value)
|
||||
localStorage.removeItem('deleteFileRow')
|
||||
};
|
||||
watch(() => uploadIndex.value, (newVal) => {
|
||||
console.log('newVal', newVal)
|
||||
startUpload(uploadFile.value); // 自动触发上传
|
||||
}, {
|
||||
deep: true
|
||||
})
|
||||
// 自定义上传逻辑
|
||||
const customUpload = async (options) => {
|
||||
const formData = new FormData();
|
||||
formData.append('file', options.raw);
|
||||
try {
|
||||
const response = await axios.post(uploadFileUrl.value, formData, {
|
||||
headers: headers,
|
||||
});
|
||||
|
||||
fileList.value.push(response.data.data)
|
||||
|
||||
emit("getFile", response.data.data)
|
||||
return response.data; // 成功时返回响应
|
||||
} catch (error) {
|
||||
throw new Error('上传失败'); // 失败时抛出错误
|
||||
}
|
||||
};
|
||||
|
||||
// 触发所有文件上传
|
||||
const startUpload = (files) => {
|
||||
uploadLoading.value = ElLoading.service({
|
||||
fullscreen: true,
|
||||
text: '文件上传中...',
|
||||
})
|
||||
if (files.length === 0) {
|
||||
return; // 没有文件时直接返回
|
||||
}
|
||||
uploadPromises.value = []; // 重置 Promise 数组
|
||||
files.forEach((file) => {
|
||||
// 触发每个文件的上传
|
||||
const promise = new Promise((resolve, reject) => {
|
||||
customUpload(file).then(resolve)
|
||||
.catch(reject);
|
||||
});
|
||||
uploadPromises.value.push(promise);
|
||||
});
|
||||
|
||||
// 使用 Promise.all 监听所有文件上传完成
|
||||
Promise.all(uploadPromises.value)
|
||||
.then(() => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '所有文件上传完成!',
|
||||
type: 'success'
|
||||
})
|
||||
files = []; // 清空文件列表
|
||||
uploadRef.value.clearFiles(); // 清空上传组件
|
||||
uploadFile.value = [] // 清空文件列表
|
||||
nextTick(() => {
|
||||
uploadLoading.value.close()
|
||||
uploadLoading.value = null
|
||||
})
|
||||
})
|
||||
|
||||
};
|
||||
|
||||
const beforeUpload = () => {
|
||||
loading.value = true
|
||||
return true
|
||||
}
|
||||
const handleUploadSuccess = (res) => {
|
||||
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.code === 1000 ? '上传成功' : '上传失败',
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
loading.value = false
|
||||
showTable.value = true
|
||||
let data = res.data
|
||||
fileList.value.push(data)
|
||||
// emit("getFile", res.data)
|
||||
}
|
||||
const uploadError = () => {
|
||||
loading.value = false
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: "上传失败,请稍后再试!",
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
defineExpose({
|
||||
handleRemove
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
a {
|
||||
font-size: 14px;
|
||||
color: #2a99ff;
|
||||
}
|
||||
|
||||
:deep(.el-upload-list) {
|
||||
width: 400px;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,43 +1,43 @@
|
||||
<script setup>
|
||||
defineProps({
|
||||
msg: {
|
||||
type: String,
|
||||
required: true
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="greetings">
|
||||
<h1 class="green">{{ msg }}</h1>
|
||||
<h3>
|
||||
You’ve successfully created a project with
|
||||
<a href="https://vitejs.dev/" target="_blank" rel="noopener">Vite</a> +
|
||||
<a href="https://vuejs.org/" target="_blank" rel="noopener">Vue 3</a>.
|
||||
</h3>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
h1 {
|
||||
font-weight: 500;
|
||||
font-size: 2.6rem;
|
||||
top: -10px;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
.greetings h1,
|
||||
.greetings h3 {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
@media (min-width: 1024px) {
|
||||
.greetings h1,
|
||||
.greetings h3 {
|
||||
text-align: left;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<script setup>
|
||||
defineProps({
|
||||
msg: {
|
||||
type: String,
|
||||
required: true
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="greetings">
|
||||
<h1 class="green">{{ msg }}</h1>
|
||||
<h3>
|
||||
You’ve successfully created a project with
|
||||
<a href="https://vitejs.dev/" target="_blank" rel="noopener">Vite</a> +
|
||||
<a href="https://vuejs.org/" target="_blank" rel="noopener">Vue 3</a>.
|
||||
</h3>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
h1 {
|
||||
font-weight: 500;
|
||||
font-size: 2.6rem;
|
||||
top: -10px;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
.greetings h1,
|
||||
.greetings h3 {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
@media (min-width: 1024px) {
|
||||
.greetings h1,
|
||||
.greetings h3 {
|
||||
text-align: left;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||