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
|
### Java template
|
||||||
# Compiled class file
|
# Compiled class file
|
||||||
*.class
|
*.class
|
||||||
# Log file
|
# Log file
|
||||||
*.log
|
*.log
|
||||||
# BlueJ files
|
# BlueJ files
|
||||||
*.ctxt
|
*.ctxt
|
||||||
# Mobile Tools for Java (J2ME)
|
# Mobile Tools for Java (J2ME)
|
||||||
.mtj.tmp/
|
.mtj.tmp/
|
||||||
# Package Files #
|
# Package Files #
|
||||||
*.jar
|
*.jar
|
||||||
*.war
|
*.war
|
||||||
*.nar
|
*.nar
|
||||||
*.ear
|
*.ear
|
||||||
*.zip
|
*.zip
|
||||||
*.tar.gz
|
*.tar.gz
|
||||||
*.rar
|
*.rar
|
||||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||||
hs_err_pid*
|
hs_err_pid*
|
||||||
### Maven template
|
### Maven template
|
||||||
target/
|
target/
|
||||||
pom.xml.tag
|
pom.xml.tag
|
||||||
pom.xml.releaseBackup
|
pom.xml.releaseBackup
|
||||||
pom.xml.versionsBackup
|
pom.xml.versionsBackup
|
||||||
pom.xml.next
|
pom.xml.next
|
||||||
release.properties
|
release.properties
|
||||||
dependency-reduced-pom.xml
|
dependency-reduced-pom.xml
|
||||||
buildNumber.properties
|
buildNumber.properties
|
||||||
.mvn/timing.properties
|
.mvn/timing.properties
|
||||||
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
|
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
|
||||||
.mvn/wrapper/maven-wrapper.jar
|
.mvn/wrapper/maven-wrapper.jar
|
||||||
### Example user template template
|
### Example user template template
|
||||||
### Example user template
|
### Example user template
|
||||||
# IntelliJ project files
|
# IntelliJ project files
|
||||||
.idea
|
.idea
|
||||||
*.iml
|
*.iml
|
||||||
out
|
out
|
||||||
gen
|
gen
|
||||||
!build
|
!build
|
||||||
!default.conf
|
!default.conf
|
||||||
!nginx.conf
|
!nginx.conf
|
||||||
|
|||||||
17
.drone.yml
@@ -8,7 +8,7 @@ steps:
|
|||||||
|
|
||||||
|
|
||||||
- name: build-package
|
- name: build-package
|
||||||
image: node:16.20.0
|
image: node:18.19.0
|
||||||
volumes:
|
volumes:
|
||||||
- name: cache
|
- name: cache
|
||||||
path: /drone/src/node_modules
|
path: /drone/src/node_modules
|
||||||
@@ -23,11 +23,18 @@ steps:
|
|||||||
- cp docker.sh /app/build/$DRONE_REPO_NAME/
|
- cp docker.sh /app/build/$DRONE_REPO_NAME/
|
||||||
- cp nginx.conf /app/build/$DRONE_REPO_NAME/
|
- cp nginx.conf /app/build/$DRONE_REPO_NAME/
|
||||||
- npm -v
|
- npm -v
|
||||||
|
- node -v
|
||||||
- mkdir -p ./node_modules
|
- mkdir -p ./node_modules
|
||||||
- export NODE_MODULES_PATH=`pwd`/node_modules
|
- export NODE_MODULES_PATH=`pwd`/node_modules
|
||||||
# - npm config set registry https://registry.npmmirror.com
|
- npm config set registry https://registry.npmmirror.com
|
||||||
# - set NODE_OPTIONS=--openssl-legacy-provider
|
- set NODE_OPTIONS=--openssl-legacy-provider
|
||||||
# - npm install
|
- 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
|
- npm run build
|
||||||
- ls /app/build/$DRONE_REPO_NAME/
|
- ls /app/build/$DRONE_REPO_NAME/
|
||||||
- echo $NODE_MODULES_PATH
|
- echo $NODE_MODULES_PATH
|
||||||
@@ -35,7 +42,7 @@ steps:
|
|||||||
|
|
||||||
|
|
||||||
- name: build-docker-prod # 制作docker镜像
|
- name: build-docker-prod # 制作docker镜像
|
||||||
image: docker # 使用官方docker镜像
|
image: 10.7.127.190:38080/docker/docker # 使用官方docker镜像
|
||||||
volumes: # 将容器内目录挂载到宿主机
|
volumes: # 将容器内目录挂载到宿主机
|
||||||
- name: docker
|
- name: docker
|
||||||
path: /var/run/docker.sock # 挂载宿主机的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
|
||||||
logs
|
logs
|
||||||
*.log
|
*.log
|
||||||
npm-debug.log*
|
npm-debug.log*
|
||||||
yarn-debug.log*
|
yarn-debug.log*
|
||||||
yarn-error.log*
|
yarn-error.log*
|
||||||
pnpm-debug.log*
|
pnpm-debug.log*
|
||||||
lerna-debug.log*
|
lerna-debug.log*
|
||||||
|
|
||||||
node_modules
|
node_modules
|
||||||
.DS_Store
|
.DS_Store
|
||||||
dist
|
dist
|
||||||
dist-ssr
|
dist-ssr
|
||||||
coverage
|
coverage
|
||||||
*.local
|
*.local
|
||||||
|
|
||||||
/cypress/videos/
|
/cypress/videos/
|
||||||
/cypress/screenshots/
|
/cypress/screenshots/
|
||||||
|
|
||||||
# Editor directories and files
|
# Editor directories and files
|
||||||
.vscode
|
.vscode
|
||||||
!.vscode/extensions.json
|
!.vscode/extensions.json
|
||||||
.idea
|
.idea
|
||||||
*.suo
|
*.suo
|
||||||
*.ntvs*
|
*.ntvs*
|
||||||
*.njsproj
|
*.njsproj
|
||||||
*.sln
|
*.sln
|
||||||
*.sw?
|
*.sw?
|
||||||
|
|||||||
36
Dockerfile
@@ -1,17 +1,19 @@
|
|||||||
FROM nginx
|
FROM 10.7.127.190:38080/nginx:latest
|
||||||
|
|
||||||
RUN rm -rf /etc/nginx/conf.d/default.conf
|
RUN rm -rf /etc/nginx/conf.d/default.conf
|
||||||
RUN rm -rf /etc/nginx/nginx.conf
|
RUN rm -rf /etc/nginx/nginx.conf
|
||||||
COPY default.conf /etc/nginx/conf.d
|
COPY default.conf /etc/nginx/conf.d
|
||||||
COPY nginx.conf /etc/nginx/
|
COPY nginx.conf /etc/nginx/
|
||||||
|
#COPY mosr.feashow.cn_chain.crt /etc/nginx/
|
||||||
#RUN useradd -b /home/clay -m -s /bin/bash clay
|
#COPY private.key /etc/nginx/
|
||||||
#RUN chmod a+xr -R /home/clay && chown clay:clay -R /home/clay
|
|
||||||
#USER clay
|
#RUN useradd -b /home/clay -m -s /bin/bash clay
|
||||||
|
#RUN chmod a+xr -R /home/clay && chown clay:clay -R /home/clay
|
||||||
COPY ./dist /home/clay
|
#USER clay
|
||||||
|
|
||||||
WORKDIR /home/clay
|
COPY ./dist /home/clay
|
||||||
|
|
||||||
|
WORKDIR /home/clay
|
||||||
EXPOSE 80
|
|
||||||
|
|
||||||
|
EXPOSE 80
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
# <EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>ƽ̨
|
# 科技创新项目管理平台
|
||||||
|
|
||||||
|
|||||||
38
default.conf
@@ -1,19 +1,19 @@
|
|||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
listen [::]:80;
|
listen [::]:80;
|
||||||
|
|
||||||
location /api {
|
location /api {
|
||||||
proxy_pass http://gateway.dev.svc.cluster.local:8080;
|
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-For $proxy_add_x_forwarded_for;
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
proxy_set_header X-Forwarded-Port $server_port;
|
proxy_set_header X-Forwarded-Port $server_port;
|
||||||
#proxy_set_header Host $host;
|
#proxy_set_header Host $host;
|
||||||
rewrite "^/api/(.*)$" /$1 break;
|
rewrite "^/api/(.*)$" /$1 break;
|
||||||
}
|
}
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
root /home/clay;
|
root /home/clay;
|
||||||
index index.html index.htm;
|
index index.html index.htm;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
102
deployment.yml
@@ -1,51 +1,51 @@
|
|||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: $DRONE_REPO_NAME
|
name: $DRONE_REPO_NAME
|
||||||
spec:
|
spec:
|
||||||
type: NodePort
|
type: NodePort
|
||||||
ports:
|
ports:
|
||||||
- name: $PORTS_NAME
|
- name: $PORTS_NAME
|
||||||
nodePort: $PORTS_PORT
|
nodePort: $PORTS_PORT
|
||||||
port: 80
|
port: 80
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
targetPort: 80
|
targetPort: 80
|
||||||
selector:
|
selector:
|
||||||
app: $DRONE_REPO_NAME
|
app: $DRONE_REPO_NAME
|
||||||
|
|
||||||
---
|
---
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: $DRONE_REPO_NAME
|
name: $DRONE_REPO_NAME
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 1
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
app: $DRONE_REPO_NAME
|
app: $DRONE_REPO_NAME
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
app: $DRONE_REPO_NAME
|
app: $DRONE_REPO_NAME
|
||||||
spec:
|
spec:
|
||||||
imagePullSecrets:
|
imagePullSecrets:
|
||||||
- name: harbor
|
- name: harbor
|
||||||
containers:
|
containers:
|
||||||
- image: $REGISTRY/$REGISTRY_NAMESPACE/$DRONE_REPO_NAME:$DRONE_COMMIT
|
- image: $REGISTRY/$REGISTRY_NAMESPACE/$DRONE_REPO_NAME:$DRONE_COMMIT
|
||||||
name: $DRONE_REPO_NAME
|
name: $DRONE_REPO_NAME
|
||||||
imagePullPolicy: Always
|
imagePullPolicy: Always
|
||||||
env:
|
env:
|
||||||
- name: TIME_ZONE
|
- name: TIME_ZONE
|
||||||
value: Asia/Shanghai
|
value: Asia/Shanghai
|
||||||
- name: REF_NAME
|
- name: REF_NAME
|
||||||
value: dev
|
value: dev
|
||||||
resources:
|
resources:
|
||||||
requests:
|
requests:
|
||||||
memory: 0.1Gi
|
memory: 0.1Gi
|
||||||
cpu: 0.1
|
cpu: 0.1
|
||||||
limits:
|
limits:
|
||||||
memory: 2Gi
|
memory: 2Gi
|
||||||
cpu: 2
|
cpu: 2
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 80
|
- containerPort: 80
|
||||||
name: app-port
|
name: app-port
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ app_version=$DRONE_COMMIT
|
|||||||
echo ${app_version}
|
echo ${app_version}
|
||||||
# 打包编译docker镜像
|
# 打包编译docker镜像
|
||||||
echo '----build image start----'
|
echo '----build image start----'
|
||||||
|
echo ${group_name}/${app_name}
|
||||||
docker build -t ${group_name}/${app_name} .
|
docker build -t ${group_name}/${app_name} .
|
||||||
echo '----build image success----'
|
echo '----build image success----'
|
||||||
docker tag ${group_name}/${app_name} $REGISTRY/$REGISTRY_NAMESPACE/${app_name}:${app_version}
|
docker tag ${group_name}/${app_name} $REGISTRY/$REGISTRY_NAMESPACE/${app_name}:${app_version}
|
||||||
|
|||||||
26
index.html
@@ -1,13 +1,13 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<link rel="icon" href="/favicon.ico">
|
<link rel="icon" href="/favicon.ico">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>科研管理平台</title>
|
<title>科技创新项目管理平台</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="app"></div>
|
<div id="app"></div>
|
||||||
<script type="module" src="/src/main.js"></script>
|
<script type="module" src="/src/main.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</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;
|
user nginx;
|
||||||
worker_processes auto;
|
worker_processes auto;
|
||||||
|
|
||||||
error_log /var/log/nginx/error.log notice;
|
error_log /var/log/nginx/error.log notice;
|
||||||
pid /var/run/nginx.pid;
|
pid /var/run/nginx.pid;
|
||||||
|
|
||||||
|
|
||||||
events {
|
events {
|
||||||
worker_connections 1024;
|
worker_connections 1024;
|
||||||
}
|
}
|
||||||
http {
|
http {
|
||||||
include /etc/nginx/mime.types;
|
include /etc/nginx/mime.types;
|
||||||
default_type application/octet-stream;
|
default_type application/octet-stream;
|
||||||
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||||
'$status $body_bytes_sent "$http_referer" '
|
'$status $body_bytes_sent "$http_referer" '
|
||||||
'"$http_user_agent" "$http_x_forwarded_for"';
|
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||||
|
|
||||||
add_header 'Access-Control-Allow-Origin' '*';
|
add_header 'Access-Control-Allow-Origin' '*';
|
||||||
add_header 'Access-Control-Allow-Headers' '*';
|
add_header 'Access-Control-Allow-Headers' '*';
|
||||||
add_header 'Access-Control-Allow-Methods' '*';
|
add_header 'Access-Control-Allow-Methods' '*';
|
||||||
|
|
||||||
access_log /var/log/nginx/access.log main;
|
access_log /var/log/nginx/access.log main;
|
||||||
|
|
||||||
sendfile on;
|
sendfile on;
|
||||||
|
|
||||||
keepalive_timeout 65;
|
keepalive_timeout 65;
|
||||||
|
|
||||||
server {
|
|
||||||
listen 80;
|
server {
|
||||||
listen [::]:80;
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
location /api {
|
|
||||||
proxy_pass http://gateway.$PROFILES.svc.cluster.local:8080;
|
location /api {
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
proxy_pass http://gateway.$PROFILES.svc.cluster.local:8080;
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
proxy_set_header X-Forwarded-Port $server_port;
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
proxy_set_header Host $host;
|
proxy_set_header X-Forwarded-Port $server_port;
|
||||||
rewrite "^/api/(.*)$" /$1 break;
|
proxy_set_header Host $host;
|
||||||
proxy_http_version 1.1;
|
rewrite "^/api/(.*)$" /$1 break;
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
proxy_http_version 1.1;
|
||||||
proxy_set_header Connection 'upgrade';
|
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;
|
location / {
|
||||||
try_files $uri $uri/ /index.html;
|
root /home/clay;
|
||||||
}
|
index index.html index.htm;
|
||||||
}
|
try_files $uri $uri/ /index.html;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
109
package.json
@@ -1,50 +1,59 @@
|
|||||||
{
|
{
|
||||||
"name": "mosr-web",
|
"name": "mosr-web",
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"private": true,
|
"type": "module",
|
||||||
"scripts": {
|
"private": true,
|
||||||
"dev": "vite",
|
"scripts": {
|
||||||
"build": "vite build",
|
"dev": "vite",
|
||||||
"preview": "vite preview"
|
"build": "vite build --config vite.config.mjs",
|
||||||
},
|
"preview": "vite preview"
|
||||||
"dependencies": {
|
},
|
||||||
"@antv/g6": "^3.5.7",
|
"overrides": {
|
||||||
"@tinymce/tinymce-vue": "^4.0.7",
|
"package-manager-detector": "1.0.0",
|
||||||
"axios": "^1.4.0",
|
|
||||||
"d3": "^7.8.5",
|
"@iconify/utils": "2.2.1"
|
||||||
"echarts": "^5.4.2",
|
},
|
||||||
"element-plus": "^2.6.0",
|
"dependencies": {
|
||||||
"file-saver": "^2.0.5",
|
"@antv/g6": "^3.5.7",
|
||||||
"highlight.js": "9.18.5",
|
"@tinymce/tinymce-vue": "^4.0.7",
|
||||||
"jquery": "^3.6.0",
|
"axios": "^1.4.0",
|
||||||
"js-cookie": "^3.0.5",
|
"d3": "^7.8.5",
|
||||||
"nprogress": "^0.2.0",
|
"docx-preview": "^0.3.2",
|
||||||
"pinia": "^2.0.35",
|
"echarts": "^5.4.2",
|
||||||
"sass": "^1.62.1",
|
"element-plus": "^2.6.0",
|
||||||
"scss": "^0.2.4",
|
"file-saver": "^2.0.5",
|
||||||
"sql-formatter": "^2.3.4",
|
"highlight.js": "9.18.5",
|
||||||
"tinymce": "^5.0.4",
|
"jquery": "^3.6.0",
|
||||||
"unplugin-icons": "^0.16.1",
|
"js-cookie": "^3.0.5",
|
||||||
"vite-plugin-inspect": "^0.7.26",
|
"nprogress": "^0.2.0",
|
||||||
"vue": "^3.2.47",
|
"pinia": "^2.0.35",
|
||||||
"vue-clipboard3": "^2.0.0",
|
"sass": "^1.62.1",
|
||||||
"vue-codemirror": "^6.1.1",
|
"scss": "^0.2.4",
|
||||||
"vue-json-viewer": "^3.0.4",
|
"sql-formatter": "^2.3.4",
|
||||||
"vue-router": "^4.1.6",
|
"tinymce": "^5.0.4",
|
||||||
"vuedraggable": "^4.1.0",
|
"unplugin-icons": "^0.16.1",
|
||||||
"xlsx": "^0.18.5",
|
"vite-plugin-inspect": "^0.7.26",
|
||||||
"xlsx-style-vite": "^0.0.2"
|
"vue": "^3.2.47",
|
||||||
},
|
"vue-clipboard3": "^2.0.0",
|
||||||
"devDependencies": {
|
"vue-codemirror": "^6.1.1",
|
||||||
"@codemirror/lang-java": "^6.0.1",
|
"vue-json-viewer": "^3.0.4",
|
||||||
"@codemirror/lang-javascript": "^6.1.9",
|
"vue-router": "^4.1.6",
|
||||||
"@codemirror/lang-sql": "^6.5.4",
|
"vue3-pdf-app": "^1.0.3",
|
||||||
"@vitejs/plugin-vue": "^4.2.1",
|
"vue3-print-nb": "^0.1.4",
|
||||||
"@vitejs/plugin-vue-jsx": "^3.0.1",
|
"vuedraggable": "^4.1.0",
|
||||||
"lodash": "^4.17.21",
|
"xlsx": "^0.18.5",
|
||||||
"unplugin-auto-import": "^0.15.3",
|
"xlsx-style-vite": "^0.0.2"
|
||||||
"unplugin-vue-components": "^0.24.1",
|
},
|
||||||
"vite": "^4.3.4",
|
"devDependencies": {
|
||||||
"vite-plugin-svg-icons": "^0.4.0"
|
"@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 {
|
body {
|
||||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
||||||
line-height: 1.4;
|
line-height: 1.4;
|
||||||
margin: 1rem;
|
margin: 1rem;
|
||||||
}
|
}
|
||||||
table {
|
table {
|
||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
}
|
}
|
||||||
/* Apply a default padding if legacy cellpadding attribute is missing */
|
/* Apply a default padding if legacy cellpadding attribute is missing */
|
||||||
table:not([cellpadding]) th,
|
table:not([cellpadding]) th,
|
||||||
table:not([cellpadding]) td {
|
table:not([cellpadding]) td {
|
||||||
padding: 0.4rem;
|
padding: 0.4rem;
|
||||||
}
|
}
|
||||||
/* Set default table styles if a table has a positive border attribute
|
/* Set default table styles if a table has a positive border attribute
|
||||||
and no inline css */
|
and no inline css */
|
||||||
table[border]:not([border="0"]):not([style*="border-width"]) th,
|
table[border]:not([border="0"]):not([style*="border-width"]) th,
|
||||||
table[border]:not([border="0"]):not([style*="border-width"]) td {
|
table[border]:not([border="0"]):not([style*="border-width"]) td {
|
||||||
border-width: 1px;
|
border-width: 1px;
|
||||||
}
|
}
|
||||||
/* Set default table styles if a table has a positive border attribute
|
/* Set default table styles if a table has a positive border attribute
|
||||||
and no inline css */
|
and no inline css */
|
||||||
table[border]:not([border="0"]):not([style*="border-style"]) th,
|
table[border]:not([border="0"]):not([style*="border-style"]) th,
|
||||||
table[border]:not([border="0"]):not([style*="border-style"]) td {
|
table[border]:not([border="0"]):not([style*="border-style"]) td {
|
||||||
border-style: solid;
|
border-style: solid;
|
||||||
}
|
}
|
||||||
/* Set default table styles if a table has a positive border attribute
|
/* Set default table styles if a table has a positive border attribute
|
||||||
and no inline css */
|
and no inline css */
|
||||||
table[border]:not([border="0"]):not([style*="border-color"]) th,
|
table[border]:not([border="0"]):not([style*="border-color"]) th,
|
||||||
table[border]:not([border="0"]):not([style*="border-color"]) td {
|
table[border]:not([border="0"]):not([style*="border-color"]) td {
|
||||||
border-color: #ccc;
|
border-color: #ccc;
|
||||||
}
|
}
|
||||||
figure {
|
figure {
|
||||||
display: table;
|
display: table;
|
||||||
margin: 1rem auto;
|
margin: 1rem auto;
|
||||||
}
|
}
|
||||||
figure figcaption {
|
figure figcaption {
|
||||||
color: #999;
|
color: #999;
|
||||||
display: block;
|
display: block;
|
||||||
margin-top: 0.25rem;
|
margin-top: 0.25rem;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
hr {
|
hr {
|
||||||
border-color: #ccc;
|
border-color: #ccc;
|
||||||
border-style: solid;
|
border-style: solid;
|
||||||
border-width: 1px 0 0 0;
|
border-width: 1px 0 0 0;
|
||||||
}
|
}
|
||||||
code {
|
code {
|
||||||
background-color: #e8e8e8;
|
background-color: #e8e8e8;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
padding: 0.1rem 0.2rem;
|
padding: 0.1rem 0.2rem;
|
||||||
}
|
}
|
||||||
.mce-content-body:not([dir=rtl]) blockquote {
|
.mce-content-body:not([dir=rtl]) blockquote {
|
||||||
border-left: 2px solid #ccc;
|
border-left: 2px solid #ccc;
|
||||||
margin-left: 1.5rem;
|
margin-left: 1.5rem;
|
||||||
padding-left: 1rem;
|
padding-left: 1rem;
|
||||||
}
|
}
|
||||||
.mce-content-body[dir=rtl] blockquote {
|
.mce-content-body[dir=rtl] blockquote {
|
||||||
border-right: 2px solid #ccc;
|
border-right: 2px solid #ccc;
|
||||||
margin-right: 1.5rem;
|
margin-right: 1.5rem;
|
||||||
padding-right: 1rem;
|
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>
|
<template>
|
||||||
<RouterView />
|
<RouterView />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import {usePermisstionStroe} from '@/stores/permisstion.js'
|
import {usePermisstionStroe} from '@/stores/permisstion.js'
|
||||||
window.addEventListener('beforeunload', e=>beforeunload(e))
|
window.addEventListener('beforeunload', e=>beforeunload(e))
|
||||||
const beforeunload = (()=>{
|
const beforeunload = (()=>{
|
||||||
const permisstionStore = usePermisstionStroe()
|
const permisstionStore = usePermisstionStroe()
|
||||||
permisstionStore.setIsLoadRoutes(true)
|
permisstionStore.setIsLoadRoutes(true)
|
||||||
permisstionStore.setIsSuccessReq()
|
permisstionStore.setIsSuccessReq()
|
||||||
})
|
})
|
||||||
</script>
|
</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";
|
import request from "@/utils/request.js";
|
||||||
|
|
||||||
export const initPassword=(data)=>{
|
export const initPassword=(data)=>{
|
||||||
return request({
|
return request({
|
||||||
url:'/admin/mosr/user/init/password',
|
url:'/admin/mosr/user/init/password',
|
||||||
method:'post',
|
method:'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
export const editPassword=(data)=>{
|
export const editPassword=(data)=>{
|
||||||
return request({
|
return request({
|
||||||
url:'/admin/mosr/user/update/password',
|
url:'/admin/mosr/user/update/password',
|
||||||
method:'post',
|
method:'post',
|
||||||
data
|
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'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
export const getCacheOpt = (cacheKey) => {
|
export const getCacheOpt = (cacheKey) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/dict/data/option/'+ cacheKey,
|
url: '/admin/dict/data/option/'+ cacheKey,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getCacheType = (cacheKey) => {
|
export const getCacheType = (cacheKey) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/dict/data/type/'+ cacheKey,
|
url: '/admin/dict/data/type/'+ cacheKey,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
import request from '@/utils/request.js'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
export const requestList = ( api, params, method = 'get' ) => {
|
export const requestList = ( api, params, method = 'get' ) => {
|
||||||
return request({
|
return request({
|
||||||
url: api,
|
url: api,
|
||||||
method,
|
method,
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -1,54 +1,54 @@
|
|||||||
import request from '@/utils/request.js'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
//获取部门信息
|
//获取部门信息
|
||||||
export const getDeptList = (params) => {
|
export const getDeptList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/dept',
|
url: '/admin/dept',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
//获取增加时的部门列表
|
//获取增加时的部门列表
|
||||||
export const getDeptOption = () => {
|
export const getDeptOption = () => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/dept/option',
|
url: '/admin/dept/option',
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
//获取修改时的部门列表
|
//获取修改时的部门列表
|
||||||
export const getDeptExcludeOption = (deptId) => {
|
export const getDeptExcludeOption = (deptId) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/dept/option/exclude/${deptId}`,
|
url: `/admin/dept/option/exclude/${deptId}`,
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
//新增部门
|
//新增部门
|
||||||
export const addDept = (data) => {
|
export const addDept = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/dept',
|
url: '/admin/dept',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
//编辑部门
|
//编辑部门
|
||||||
export const editDept = (data) => {
|
export const editDept = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/dept',
|
url: '/admin/dept',
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
//查询部门详情
|
//查询部门详情
|
||||||
export const getDeptDetail = (deptId) => {
|
export const getDeptDetail = (deptId) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/dept/${deptId}`,
|
url: `/admin/dept/${deptId}`,
|
||||||
method: "get"
|
method: "get"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
//删除部门
|
//删除部门
|
||||||
export const deleteDept = (deptId) => {
|
export const deleteDept = (deptId) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/dept/${deptId}`,
|
url: `/admin/dept/${deptId}`,
|
||||||
method: "delete"
|
method: "delete"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,81 +1,107 @@
|
|||||||
import request from '@/utils/request.js'
|
import request from '@/utils/request.js'
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import {getToken} from "@/utils/auth";
|
import {getToken} from "@/utils/auth";
|
||||||
|
|
||||||
export const addAllocation = (data) => {
|
export const addAllocation = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url:'/workflow/mosr/cost/allocation',
|
url:'/workflow/mosr/cost/allocation',
|
||||||
method: "post",
|
method: "post",
|
||||||
data
|
data
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
export const getAllocationDetail = (allocationId) => {
|
export const addShare = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/workflow/mosr/cost/allocation/info/${allocationId}`,
|
url:'/workflow/mosr/cost/share',
|
||||||
method: "get"
|
method: "post",
|
||||||
});
|
data
|
||||||
};
|
});
|
||||||
export const getAllocationDetails = (allocationId) => {
|
};
|
||||||
return request({
|
export const getAllocationDetail = (allocationId) => {
|
||||||
url: `/workflow/mosr/cost/allocation/usr/detail/${allocationId}`,
|
return request({
|
||||||
method: "get"
|
url: `/workflow/mosr/cost/allocation/info/${allocationId}`,
|
||||||
});
|
method: "get"
|
||||||
};
|
});
|
||||||
export const getAllocationSummaryDetails = (params) => {
|
};
|
||||||
return request({
|
export const getAllocationDetails = (allocationId) => {
|
||||||
url: '/workflow/mosr/cost/allocation/collect',
|
return request({
|
||||||
method: "get",
|
url: `/workflow/mosr/cost/allocation/usr/detail/${allocationId}`,
|
||||||
params:params
|
method: "get"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
export const getAllocationProcess = () => {
|
export const getAllocationSummaryDetails = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/mosr/cost/allocation/process',
|
url: '/workflow/mosr/cost/allocation/collect',
|
||||||
method: "get"
|
method: "get",
|
||||||
});
|
params:params
|
||||||
};
|
});
|
||||||
export const getAllocationDetailList = (params) => {
|
};
|
||||||
return request({
|
export const getAllocationProcess = () => {
|
||||||
url: '/workflow/mosr/cost/allocation/usr',
|
return request({
|
||||||
method: "get",
|
url: '/workflow/mosr/cost/allocation/process',
|
||||||
params:params
|
method: "get"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
export const getResearchUser = () => {
|
export const getAllocationDetailList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/mosr/user/research',
|
url: '/workflow/mosr/cost/allocation/usr',
|
||||||
method: "get"
|
method: "get",
|
||||||
});
|
params:params
|
||||||
};
|
});
|
||||||
export const getProjectOption = () => {
|
};
|
||||||
return request({
|
export const getResearchUser = () => {
|
||||||
url: '/workflow/mosr/project/implementation/in/implementation/option',
|
return request({
|
||||||
method: "get"
|
url: '/admin/mosr/user/research',
|
||||||
});
|
method: "get"
|
||||||
};
|
});
|
||||||
|
};
|
||||||
export const editAllocation = (data) => {
|
export const getProjectOption = () => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/mosr/cost/allocation/edit',
|
url: '/workflow/mosr/project/implementation/in/implementation/option',
|
||||||
method: "post",
|
method: "get"
|
||||||
data
|
});
|
||||||
});
|
};
|
||||||
};
|
|
||||||
export const deleteAllocation = (id) => {
|
export const editAllocation = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/workflow/mosr/cost/allocation/${id}`,
|
url: '/workflow/mosr/cost/allocation/edit',
|
||||||
method: "delete"
|
method: "post",
|
||||||
});
|
data
|
||||||
};
|
});
|
||||||
|
};
|
||||||
export const shareExportExcel = (allocationId) => {
|
export const applyCcSend = (data) => {
|
||||||
return axios.get(
|
return request({
|
||||||
`${import.meta.env.VITE_BASE_URL}/workflow/mosr/cost/allocation/collect/${allocationId}`,
|
url: '/workflow/mosr/cc/send',
|
||||||
{
|
method: "post",
|
||||||
responseType: 'blob',
|
data
|
||||||
headers: {
|
});
|
||||||
Authorization: getToken()
|
};
|
||||||
}
|
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'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
export const getHomeInfo = () => {
|
export const getHomeTaskInfo = () => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/mosr/process/task',
|
url: '/workflow/mosr/process/task',
|
||||||
method: "get"
|
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'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
// 获取list
|
// 获取list
|
||||||
export const getIPBlackList = (params) => {
|
export const getIPBlackList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/ip/back',
|
url: '/admin/ip/back',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新增
|
// 新增
|
||||||
export const addIPBlack = (data) => {
|
export const addIPBlack = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/ip/back',
|
url: '/admin/ip/back',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改
|
// 修改
|
||||||
export const editIPBlack = (data) => {
|
export const editIPBlack = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/ip/back',
|
url: '/admin/ip/back',
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除
|
// 删除
|
||||||
export const delIPBlack = (ids) => {
|
export const delIPBlack = (ids) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/ip/back/'+ids,
|
url: '/admin/ip/back/'+ids,
|
||||||
method: 'delete'
|
method: 'delete'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 详情
|
// 详情
|
||||||
export const getIPBlackDetail = (id) => {
|
export const getIPBlackDetail = (id) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/ip/back/'+id,
|
url: '/admin/ip/back/'+id,
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -1,24 +1,24 @@
|
|||||||
import request from "@/utils/request.js";
|
import request from "@/utils/request.js";
|
||||||
|
|
||||||
//查询登录日志
|
//查询登录日志
|
||||||
export const getLoginLogList = (params) => {
|
export const getLoginLogList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: "/log/login-info/list",
|
url: "/log/login-info/list",
|
||||||
method: "get",
|
method: "get",
|
||||||
params
|
params
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
//查询登录日志详情
|
//查询登录日志详情
|
||||||
export const getLoginLogDetail = (infoId) => {
|
export const getLoginLogDetail = (infoId) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/log/login-info/${infoId}`,
|
url: `/log/login-info/${infoId}`,
|
||||||
method: "get"
|
method: "get"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
//删除登录日志
|
//删除登录日志
|
||||||
export const deleteLoginLog = (infoIds) => {
|
export const deleteLoginLog = (infoIds) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/log/login-info/${infoIds}`,
|
url: `/log/login-info/${infoIds}`,
|
||||||
method: "delete"
|
method: "delete"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,24 +1,24 @@
|
|||||||
import request from "@/utils/request.js";
|
import request from "@/utils/request.js";
|
||||||
|
|
||||||
//查询操作日志
|
//查询操作日志
|
||||||
export const getOperateLog = (params) => {
|
export const getOperateLog = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: "/log/log/list",
|
url: "/log/log/list",
|
||||||
method: "get",
|
method: "get",
|
||||||
params
|
params
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
//查询操作日志详情
|
//查询操作日志详情
|
||||||
export const getOperateLogDetail = (operId) => {
|
export const getOperateLogDetail = (operId) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/log/log/${operId}`,
|
url: `/log/log/${operId}`,
|
||||||
method: "get"
|
method: "get"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
//删除操作日志
|
//删除操作日志
|
||||||
export const deleteOperateLog = (operIds) => {
|
export const deleteOperateLog = (operIds) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/log/log/${operIds}`,
|
url: `/log/log/${operIds}`,
|
||||||
method: "delete"
|
method: "delete"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,36 +1,36 @@
|
|||||||
import request from '@/utils/request.js'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
export const getCodeImg = () => {
|
export const getCodeImg = () => {
|
||||||
return request({
|
return request({
|
||||||
url: '/auth/captchaImage',
|
url: '/auth/captchaImage',
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export const login = (data) => {
|
export const login = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/auth/login',
|
url: '/auth/login',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
export const switchAccount = (userId) => {
|
export const switchAccount = (userId) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/auth/switch/account/${userId}`,
|
url: `/auth/switch/account/${userId}`,
|
||||||
method: 'post',
|
method: 'post',
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getUserInfo = () => {
|
export const getUserInfo = () => {
|
||||||
return request({
|
return request({
|
||||||
url: '/auth/info',
|
url: '/auth/info',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
export const getAuthInfo = () => {
|
export const getAuthInfo = () => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/mosr/user/detail/info',
|
url: '/admin/mosr/user/detail/info',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,30 +1,30 @@
|
|||||||
import request from '@/utils/request.js'
|
import request from '@/utils/request.js'
|
||||||
export const getNoticeList = (params) => {
|
export const getNoticeList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/notice/notice',
|
url: '/notice/notice',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
export const getNoticeDetail = (noticeId) => {
|
export const getNoticeDetail = (noticeId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/notice/notice/'+noticeId,
|
url: '/notice/notice/'+noticeId,
|
||||||
method: "get"
|
method: "get"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export const addNotice = (data) => {
|
export const addNotice = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/notice/notice',
|
url: '/notice/notice',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const deleteNotice = (noticeId) => {
|
export const deleteNotice = (noticeId) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/notice/notice/${noticeId}`,
|
url: `/notice/notice/${noticeId}`,
|
||||||
method: "delete"
|
method: "delete"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,43 +1,43 @@
|
|||||||
import request from '@/utils/request.js'
|
import request from '@/utils/request.js'
|
||||||
export const getNotifyList = (params) => {
|
export const getNotifyList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/notice/notify',
|
url: '/notice/notify',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
export const getNotifyDetail = (noticeId) => {
|
export const getNotifyDetail = (noticeId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/notice/notify/'+noticeId,
|
url: '/notice/notify/'+noticeId,
|
||||||
method: "get"
|
method: "get"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
//已读单个消息
|
//已读单个消息
|
||||||
export const readSingleNotify = (noticeId) => {
|
export const readSingleNotify = (noticeId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/notice/notify/read/'+noticeId,
|
url: '/notice/notify/read/'+noticeId,
|
||||||
method: 'put'
|
method: 'put'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
//已读全部消息
|
//已读全部消息
|
||||||
export const readAllNotify = () => {
|
export const readAllNotify = () => {
|
||||||
return request({
|
return request({
|
||||||
url: '/notice/notify/read/all',
|
url: '/notice/notify/read/all',
|
||||||
method: 'put'
|
method: 'put'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
//删除单个消息
|
//删除单个消息
|
||||||
export const deleteSingleNotify = (noticeId) => {
|
export const deleteSingleNotify = (noticeId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/notice/notify/'+noticeId,
|
url: '/notice/notify/'+noticeId,
|
||||||
method: "delete"
|
method: "delete"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
//删除多个消息
|
//删除多个消息
|
||||||
export const deleteMoreNotify = (noticeIds) => {
|
export const deleteMoreNotify = (noticeIds) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/notice/notify/batch/'+noticeIds,
|
url: '/notice/notify/batch/'+noticeIds,
|
||||||
method: "delete"
|
method: "delete"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
import request from "@/utils/request.js";
|
import request from "@/utils/request.js";
|
||||||
//查询在线用户
|
//查询在线用户
|
||||||
export const getOnlineList = (params) => {
|
export const getOnlineList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: "/admin/online/user",
|
url: "/admin/online/user",
|
||||||
method: "get",
|
method: "get",
|
||||||
params
|
params
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
//强制退出用户
|
//强制退出用户
|
||||||
export const deleteOnlineUser= (tokenId) => {
|
export const deleteOnlineUser= (tokenId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/online/user/'+tokenId,
|
url: '/admin/online/user/'+tokenId,
|
||||||
method: "delete"
|
method: "delete"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,48 +1,48 @@
|
|||||||
import request from '@/utils/request.js'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
//获取岗位信息
|
//获取岗位信息
|
||||||
export const getPostList = (params) => {
|
export const getPostList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/post',
|
url: '/admin/post',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
//查询岗位详情
|
//查询岗位详情
|
||||||
export const getPostDetail = (postId) => {
|
export const getPostDetail = (postId) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/post/info/${postId}`,
|
url: `/admin/post/info/${postId}`,
|
||||||
method: "get"
|
method: "get"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
//新增岗位
|
//新增岗位
|
||||||
export const addPost = (data) => {
|
export const addPost = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/post',
|
url: '/admin/post',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
//编辑岗位
|
//编辑岗位
|
||||||
export const editPost = (data) => {
|
export const editPost = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/post',
|
url: '/admin/post',
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
//获取select下拉框数据
|
//获取select下拉框数据
|
||||||
export const getSelectOption = () => {
|
export const getSelectOption = () => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/post/option',
|
url: '/admin/post/option',
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
//删除角色信息
|
//删除角色信息
|
||||||
export const deletePost = (postId) => {
|
export const deletePost = (postId) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/post/${postId}`,
|
url: `/admin/post/${postId}`,
|
||||||
method: "delete"
|
method: "delete"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,90 +1,128 @@
|
|||||||
import request from '@/utils/request.js'
|
import request from '@/utils/request.js'
|
||||||
//需求征集
|
import axios from "axios";
|
||||||
export const getDemandInfo = (param) => {
|
import {getToken} from "@/utils/auth";
|
||||||
return request({
|
|
||||||
url: '/workflow/mosr/requirement',
|
//需求征集
|
||||||
method: "get",
|
export const getDemandInfo = (param) => {
|
||||||
params: param
|
return request({
|
||||||
});
|
url: '/workflow/mosr/requirement',
|
||||||
};
|
method: "get",
|
||||||
export const getWorkflowInfo = () => {
|
params: param
|
||||||
return request({
|
});
|
||||||
url: '/workflow/mosr/requirement/process',
|
};
|
||||||
method: "get"
|
export const filterRequirementName = (requirementName) => {
|
||||||
});
|
return request({
|
||||||
};
|
url: `/workflow/mosr/requirement/match/${requirementName}`,
|
||||||
export const getInfo = (requirementId) => {
|
method: "get"
|
||||||
return request({
|
});
|
||||||
url: `/workflow/mosr/requirement/info/${requirementId}`,
|
};
|
||||||
method: "get"
|
export const getWorkflowInfo = () => {
|
||||||
});
|
return request({
|
||||||
};
|
url: '/workflow/mosr/requirement/process',
|
||||||
export const getFormInfo = (requirementId) => {
|
method: "get"
|
||||||
return request({
|
});
|
||||||
url: `/workflow/mosr/requirement/form/${requirementId}`,
|
};
|
||||||
method: "get"
|
export const getInfo = (requirementId) => {
|
||||||
});
|
return request({
|
||||||
};
|
url: `/workflow/mosr/requirement/info/${requirementId}`,
|
||||||
export const agreeTask = (data) => {
|
method: "get"
|
||||||
return request({
|
});
|
||||||
url: `/workflow/mosr/process/task/agree`,
|
};
|
||||||
method: "post",
|
export const getFormInfo = (requirementId) => {
|
||||||
data: data
|
return request({
|
||||||
});
|
url: `/workflow/mosr/requirement/form/${requirementId}`,
|
||||||
};
|
method: "get"
|
||||||
export const rejectTask = (data) => {
|
});
|
||||||
return request({
|
};
|
||||||
url: `/workflow/mosr/process/task/reject`,
|
export const agreeTask = (data) => {
|
||||||
method: "post",
|
return request({
|
||||||
data: data
|
url: `/workflow/mosr/process/task/agree`,
|
||||||
});
|
method: "post",
|
||||||
};
|
data: data
|
||||||
|
});
|
||||||
export const addRequirement = (data) => {
|
};
|
||||||
return request({
|
export const rejectTask = (data) => {
|
||||||
url: '/workflow/mosr/requirement',
|
return request({
|
||||||
method: "post",
|
url: `/workflow/mosr/process/task/reject`,
|
||||||
data: data
|
method: "post",
|
||||||
});
|
data: data
|
||||||
};
|
});
|
||||||
export const resubmit = (data) => {
|
};
|
||||||
return request({
|
|
||||||
url: '/workflow/mosr/requirement/resubmit',
|
export const addRequirement = (data) => {
|
||||||
method: "post",
|
return request({
|
||||||
data: data
|
url: '/workflow/mosr/requirement',
|
||||||
});
|
method: "post",
|
||||||
};
|
data: data
|
||||||
export const deleteFile = (fileId) => {
|
});
|
||||||
return request({
|
};
|
||||||
url: `/workflow/process/file/delete/${fileId}`,
|
export const resubmit = (data) => {
|
||||||
method: "delete"
|
return request({
|
||||||
});
|
url: '/workflow/mosr/requirement/resubmit',
|
||||||
};
|
method: "post",
|
||||||
export const downloadFile = (fileId) => {
|
data: data
|
||||||
return request({
|
});
|
||||||
url: '/workflow/process/file/download',
|
};
|
||||||
method: "get",
|
export const deleteFile = (fileId) => {
|
||||||
responseType:'blob',
|
return request({
|
||||||
params:{
|
url: `/workflow/process/file/delete/${fileId}`,
|
||||||
fileId:fileId
|
method: "delete"
|
||||||
}
|
});
|
||||||
});
|
};
|
||||||
};
|
export const downloadFile = (fileId) => {
|
||||||
export const getCompanyOption = () => {
|
return request({
|
||||||
return request({
|
url: '/workflow/process/file/download',
|
||||||
url: '/admin/mosr/sub/company/companyOption',
|
method: "get",
|
||||||
method: "get"
|
responseType:'blob',
|
||||||
});
|
params:{
|
||||||
};
|
fileId:fileId
|
||||||
export const deleteDemand = (id) => {
|
}
|
||||||
return request({
|
});
|
||||||
url: `/workflow/mosr/requirement/${id}`,
|
};
|
||||||
method: "delete"
|
export const getCompanyOption = () => {
|
||||||
});
|
return request({
|
||||||
};
|
url: '/admin/mosr/sub/company/companyOption',
|
||||||
export const getRequirementStatePerm = () => {
|
method: "get"
|
||||||
return request({
|
});
|
||||||
url: '/workflow/mosr/requirement/prem/state',
|
};
|
||||||
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'
|
import request from '@/utils/request'
|
||||||
|
|
||||||
export const fileUp = (url, data) => {
|
export const fileUp = (url, data) => {
|
||||||
return request({
|
return request({
|
||||||
url,
|
url,
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data,
|
data,
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'multipart/form-data'
|
'Content-Type': 'multipart/form-data'
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const requirementReported = (data) => {
|
export const requirementReported = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/mosr/requirement/reported',
|
url: '/workflow/mosr/requirement/reported',
|
||||||
method: "post",
|
method: "post",
|
||||||
data: data
|
data: data
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
//获取需求上报 流程信息
|
//需求汇总-征集名称关键词匹配
|
||||||
export const getProcessInfo = (specialFund) => {
|
export const getRequirementName = (requirementName) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/workflow/mosr/requirement/collect/process/${specialFund}`,
|
url: `/workflow/mosr/requirement/collect/project/match/${requirementName}`,
|
||||||
method: "get"
|
method: "get"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
export const getDetail = (projectId) => {
|
//需求汇总-项目名称关键词匹配
|
||||||
return request({
|
export const getProjectName = (projectName) => {
|
||||||
url: `/workflow/mosr/requirement/collect/info/${projectId}`,
|
return request({
|
||||||
method: "get"
|
url: `workflow/mosr/requirement/collect`,
|
||||||
});
|
method: "get",
|
||||||
};
|
params:{
|
||||||
|
projectName:projectName
|
||||||
export const resubmitReported = (data) => {
|
}
|
||||||
return request({
|
});
|
||||||
url: '/workflow/mosr/requirement/collect/resubmit',
|
};
|
||||||
method: "post",
|
//获取需求上报 流程信息
|
||||||
data: data
|
export const getProcessInfo = (specialFund) => {
|
||||||
});
|
return request({
|
||||||
};
|
url: `/workflow/mosr/requirement/collect/process/${specialFund}`,
|
||||||
|
method: "get"
|
||||||
export const getCollectAttachment = (params) => {
|
});
|
||||||
return request({
|
};
|
||||||
url: '/workflow/mosr/requirement/collect/attachments',
|
export const getDetail = (projectId) => {
|
||||||
method: "get",
|
return request({
|
||||||
params:params
|
url: `/workflow/mosr/requirement/collect/info/${projectId}`,
|
||||||
});
|
method: "get"
|
||||||
};
|
});
|
||||||
export const uploadCollectAttachment= (data) => {
|
};
|
||||||
return request({
|
|
||||||
url: '/workflow/mosr/requirement/collect/upload',
|
export const resubmitReported = (data) => {
|
||||||
method: "post",
|
return request({
|
||||||
data: data
|
url: '/workflow/mosr/requirement/collect/resubmit',
|
||||||
});
|
method: "post",
|
||||||
};
|
data: data
|
||||||
// 年度计划
|
});
|
||||||
export const addPlan= (data) => {
|
};
|
||||||
return request({
|
|
||||||
url: '/workflow/annual/plan',
|
export const getCollectAttachment = (params) => {
|
||||||
method: "post",
|
return request({
|
||||||
data: data
|
url: '/workflow/mosr/requirement/collect/attachments',
|
||||||
});
|
method: "get",
|
||||||
};
|
params:params
|
||||||
export const editPlan= (data) => {
|
});
|
||||||
return request({
|
};
|
||||||
url: '/workflow/annual/plan',
|
export const uploadCollectAttachment= (data) => {
|
||||||
method: "put",
|
return request({
|
||||||
data: data
|
url: '/workflow/mosr/requirement/collect/upload',
|
||||||
});
|
method: "post",
|
||||||
};
|
data: data
|
||||||
export const getPlan= (annualPlanId) => {
|
});
|
||||||
return request({
|
};
|
||||||
url: `/workflow/annual/plan/info/${annualPlanId}`,
|
// 项目计划
|
||||||
method: "get"
|
export const addPlan= (data) => {
|
||||||
});
|
return request({
|
||||||
};
|
url: '/workflow/annual/plan',
|
||||||
export const deletePlan= (annualPlanId) => {
|
method: "post",
|
||||||
return request({
|
data: data
|
||||||
url: `/workflow/annual/plan/${annualPlanId}`,
|
});
|
||||||
method: "delete"
|
};
|
||||||
});
|
export const editPlan= (data) => {
|
||||||
};
|
return request({
|
||||||
export const approvePlan= (data) => {
|
url: '/workflow/annual/plan',
|
||||||
return request({
|
method: "put",
|
||||||
url: '/workflow/annual/plan/approve',
|
data: data
|
||||||
method: "post",
|
});
|
||||||
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'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
|
|
||||||
export const searchFileList = (params) => {
|
export const searchFileList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/workflow/mosr/attachment/list`,
|
url: `/workflow/mosr/attachment/list`,
|
||||||
method: "get",
|
method: "get",
|
||||||
params: params
|
params: params
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
export const uploadFileList = (data) => {
|
export const searchAllFileList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/mosr/attachment/upload',
|
url: '/workflow/mosr/attachment/all',
|
||||||
method: "post",
|
method: "get",
|
||||||
data: data
|
params: params
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
export const searchImplementationFileList = (params) => {
|
export const uploadFileList = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/mosr/attachment/implementation/list',
|
url: '/workflow/mosr/attachment/upload',
|
||||||
method: "get",
|
method: "post",
|
||||||
params: params
|
data: data
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
export const switchAttachmentState = (data) => {
|
export const searchImplementationFileList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/mosr/project/filing/attachment/switch',
|
url: '/workflow/mosr/attachment/implementation/list',
|
||||||
method: "post",
|
method: "get",
|
||||||
data
|
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 request from '@/utils/request.js'
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import {getToken} from "@/utils/auth";
|
import {getToken} from "@/utils/auth";
|
||||||
//项目立项
|
//项目立项
|
||||||
export const getApplyProcess = (projectId) => {
|
export const getApplyProcess = (projectId) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/workflow/mosr/project/approval/initiation/process/${projectId}`,
|
url: `/workflow/mosr/project/approval/initiation/process/${projectId}`,
|
||||||
method: "get"
|
method: "get"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
export const projectApply = (data) => {
|
export const filterProjectName = (projectName,targetState) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/mosr/project/approval/initiation/apply',
|
url: `/workflow/mosr/project/approval/match/${projectName}/${targetState}`,
|
||||||
method: "post",
|
method: "get"
|
||||||
data: data
|
});
|
||||||
});
|
};
|
||||||
};
|
export const projectApply = (data) => {
|
||||||
export const getApplyDetail = (ProjectId) => {
|
return request({
|
||||||
return request({
|
url: '/workflow/mosr/project/approval/initiation/apply',
|
||||||
url: `/workflow/mosr/project/approval/info/${ProjectId}`,
|
method: "post",
|
||||||
method: "get"
|
data: data
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
export const getApplyDetail = (ProjectId) => {
|
||||||
export const resubmitApply = (data) => {
|
return request({
|
||||||
return request({
|
url: `/workflow/mosr/project/approval/info/${ProjectId}`,
|
||||||
url: '/workflow/mosr/project/approval/initiation/resubmit',
|
method: "get"
|
||||||
method: "post",
|
});
|
||||||
data: data
|
};
|
||||||
});
|
|
||||||
};
|
export const resubmitApply = (data) => {
|
||||||
export const getInitiationAttachment = (params) => {
|
return request({
|
||||||
return request({
|
url: '/workflow/mosr/project/approval/initiation/resubmit',
|
||||||
url: '/workflow/mosr/project/approval/attachments',
|
method: "post",
|
||||||
method: "get",
|
data: data
|
||||||
params: params
|
});
|
||||||
});
|
};
|
||||||
};
|
export const getInitiationAttachment = (params) => {
|
||||||
//项目实施
|
return request({
|
||||||
export const getCheckDetail = (projectId) => {
|
url: '/workflow/mosr/project/approval/attachments',
|
||||||
return request({
|
method: "get",
|
||||||
url: `/workflow/mosr/project/implementation/info/${projectId}`,
|
params: params
|
||||||
method: "get"
|
});
|
||||||
});
|
};
|
||||||
};
|
//项目实施
|
||||||
export const resubmitCheck = (data) => {
|
export const getCheckDetail = (projectId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/mosr/project/implementation/resubmit',
|
url: `/workflow/mosr/project/implementation/info/${projectId}`,
|
||||||
method: "post",
|
method: "get"
|
||||||
data: data
|
});
|
||||||
});
|
};
|
||||||
};
|
export const resubmitCheck = (data) => {
|
||||||
|
return request({
|
||||||
export const projectCheck = (data) => {
|
url: '/workflow/mosr/project/implementation/resubmit',
|
||||||
return request({
|
method: "post",
|
||||||
url: '/workflow/mosr/project/implementation/initiation/check',
|
data: data
|
||||||
method: "post",
|
});
|
||||||
data: data
|
};
|
||||||
});
|
|
||||||
};
|
export const projectCheck = (data) => {
|
||||||
export const getProjectCheckProcess = (projectId) => {
|
return request({
|
||||||
return request({
|
url: '/workflow/mosr/project/implementation/initiation/check',
|
||||||
url: `/workflow/mosr/project/implementation/process/${projectId}`,
|
method: "post",
|
||||||
method: "get"
|
data: data
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
export const getProjectCheckProcess = (projectId) => {
|
||||||
export const addLedger = (data) => {
|
return request({
|
||||||
return request({
|
url: `/workflow/mosr/project/implementation/process/${projectId}`,
|
||||||
url: '/workflow/mosr/expense/ledger',
|
method: "get"
|
||||||
method: "post",
|
});
|
||||||
data: data
|
};
|
||||||
});
|
|
||||||
};
|
export const addLedger = (data) => {
|
||||||
|
return request({
|
||||||
export const getTags = (projectId) => {
|
url: '/workflow/mosr/expense/ledger',
|
||||||
return request({
|
method: "post",
|
||||||
url: `/workflow/mosr/attachment/option/${projectId}`,
|
data: data
|
||||||
method: "get"
|
});
|
||||||
});
|
};
|
||||||
};
|
|
||||||
export const getPhaseProcess = () => {
|
export const getTags = (projectId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/phase/change/process',
|
url: `/workflow/mosr/attachment/option/${projectId}`,
|
||||||
method: "get"
|
method: "get"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
export const submitPhaseChange = (data) => {
|
export const getTagList = (projectId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/phase/change',
|
url: `/workflow/mosr/file/tag/list`,
|
||||||
method: "post",
|
method: "get",
|
||||||
data: data
|
params:{
|
||||||
});
|
projectId: projectId
|
||||||
};
|
}
|
||||||
export const getPhaseDetail = (projectId) => {
|
});
|
||||||
return request({
|
};
|
||||||
url: `/workflow/phase/change/info/${projectId}`,
|
export const addTag = (data) => {
|
||||||
method: "get"
|
return request({
|
||||||
});
|
url: '/workflow/mosr/file/tag/add',
|
||||||
};
|
method: "post",
|
||||||
export const getPhaseForm = (projectId) => {
|
data:data
|
||||||
return request({
|
});
|
||||||
url: `/workflow/phase/change/from/${projectId}`,
|
};
|
||||||
method: "get"
|
export const updateTag = (data) => {
|
||||||
});
|
return request({
|
||||||
};
|
url: '/workflow/mosr/file/tag/update',
|
||||||
export const resubmitPhaseForm = (data) => {
|
method: "post",
|
||||||
return request({
|
data:data
|
||||||
url: '/workflow/phase/change/resubmit',
|
});
|
||||||
method: "post",
|
};
|
||||||
data: data
|
export const delTag = (tageId) => {
|
||||||
});
|
return request({
|
||||||
};
|
url: `/workflow/mosr/file/tag/${tageId}`,
|
||||||
|
method: "delete"
|
||||||
//项目归档
|
});
|
||||||
export const getConclusionDetail = (ProjectId) => {
|
};
|
||||||
return request({
|
export const getPhaseProcess = () => {
|
||||||
url: `/workflow/mosr/project/filing/info/${ProjectId}`,
|
return request({
|
||||||
method: "get"
|
url: '/workflow/phase/change/process',
|
||||||
});
|
method: "get"
|
||||||
};
|
});
|
||||||
export const resubmitConclusion = (data) => {
|
};
|
||||||
return request({
|
export const submitPhaseChange = (data) => {
|
||||||
url: '/workflow/mosr/project/filing/resubmit',
|
return request({
|
||||||
method: "post",
|
url: '/workflow/phase/change',
|
||||||
data: data
|
method: "post",
|
||||||
});
|
data: data
|
||||||
};
|
});
|
||||||
|
};
|
||||||
export const projectConclusion = (data) => {
|
export const getPhaseDetail = (projectId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/mosr/project/filing/project/entry',
|
url: `/workflow/phase/change/info/${projectId}`,
|
||||||
method: "post",
|
method: "get"
|
||||||
data: data
|
});
|
||||||
});
|
};
|
||||||
};
|
export const getPhaseForm = (projectId) => {
|
||||||
export const getProjectConclusionProcess = () => {
|
return request({
|
||||||
return request({
|
url: `/workflow/phase/change/from/${projectId}`,
|
||||||
url: '/workflow/mosr/project/filing/process',
|
method: "get"
|
||||||
method: "get"
|
});
|
||||||
});
|
};
|
||||||
};
|
export const resubmitPhaseForm = (data) => {
|
||||||
//获取前置流程
|
return request({
|
||||||
export const getPreProcess = () => {
|
url: '/workflow/phase/change/resubmit',
|
||||||
return request({
|
method: "post",
|
||||||
url: '/workflow/details/pre/process',
|
data: data
|
||||||
method: "get"
|
});
|
||||||
});
|
};
|
||||||
};
|
|
||||||
export const updateLedger = (data) => {
|
//项目归档
|
||||||
return request({
|
export const getConclusionDetail = (ProjectId) => {
|
||||||
url: '/workflow/mosr/expense/ledger/replenishment',
|
return request({
|
||||||
method: "post",
|
url: `/workflow/mosr/project/filing/info/${ProjectId}`,
|
||||||
data: data
|
method: "get"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
export const searchUpdateLedgerData = (projectId) => {
|
export const resubmitConclusion = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/workflow/mosr/expense/ledger/${projectId}`,
|
url: '/workflow/mosr/project/filing/resubmit',
|
||||||
method: "get"
|
method: "post",
|
||||||
});
|
data: data
|
||||||
};
|
});
|
||||||
//
|
};
|
||||||
// export const searchUpdateLedgerData = (projectId) => {
|
|
||||||
// return request({
|
export const projectConclusion = (data) => {
|
||||||
// url: '/workflow/mosr/expense/ledger/import',
|
return request({
|
||||||
// method: "get"
|
url: '/workflow/mosr/project/filing/project/entry',
|
||||||
// });
|
method: "post",
|
||||||
// };
|
data: data
|
||||||
|
});
|
||||||
export const exportExcel = (data) => {
|
};
|
||||||
return axios.post(
|
export const getProjectConclusionProcess = () => {
|
||||||
`${import.meta.env.VITE_BASE_URL}/workflow/mosr/project/implementation/export`,
|
return request({
|
||||||
data, {
|
url: '/workflow/mosr/project/filing/process',
|
||||||
responseType: 'blob',
|
method: "get"
|
||||||
headers: {
|
});
|
||||||
Authorization: getToken()
|
};
|
||||||
}
|
//获取前置流程
|
||||||
}
|
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'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
export const getTableList = (params) => {
|
export const getTableList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/code-gen/table',
|
url: '/code-gen/table',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getDynamicTable = (params) => {
|
export const getDynamicTable = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/code-gen/dynamic-table',
|
url: '/code-gen/dynamic-table',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getTableDetail = (tableId) => {
|
export const getTableDetail = (tableId) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/code-gen/table/${tableId}`,
|
url: `/code-gen/table/${tableId}`,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const previewCode = (tableId) => {
|
export const previewCode = (tableId) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/code-gen/table/preview/${tableId}`,
|
url: `/code-gen/table/preview/${tableId}`,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export const deleteMoreTable = (params) => {
|
export const deleteMoreTable = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/code-gen/table',
|
url: '/code-gen/table',
|
||||||
method: 'delete',
|
method: 'delete',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
export const deleteTable = (tableId) => {
|
export const deleteTable = (tableId) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/code-gen/table/${tableId}`,
|
url: `/code-gen/table/${tableId}`,
|
||||||
method: 'delete',
|
method: 'delete',
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
export const importTable = (data) => {
|
export const importTable = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: "/code-gen/table/import-table",
|
url: "/code-gen/table/import-table",
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const editCodeGen = (data) => {
|
export const editCodeGen = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/code-gen/table',
|
url: '/code-gen/table',
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
export const syncDatabase = (tableId) => {
|
export const syncDatabase = (tableId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/code-gen/table/sync/'+tableId,
|
url: '/code-gen/table/sync/'+tableId,
|
||||||
method: 'put'
|
method: 'put'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,54 +1,54 @@
|
|||||||
import request from '@/utils/request.js'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
|
|
||||||
export const getDataSourceList = (params) => {
|
export const getDataSourceList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/code-gen/data-source',
|
url: '/code-gen/data-source',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getDataSourceOption = () => {
|
export const getDataSourceOption = () => {
|
||||||
return request({
|
return request({
|
||||||
url: '/code-gen/data-source/option',
|
url: '/code-gen/data-source/option',
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getDataSourceOptionType=()=>{
|
export const getDataSourceOptionType=()=>{
|
||||||
return request({
|
return request({
|
||||||
url:'/code-gen/data-source/option/type',
|
url:'/code-gen/data-source/option/type',
|
||||||
method:'get'
|
method:'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getDataSource = (dsId) => {
|
export const getDataSource = (dsId) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/code-gen/data-source/${dsId}`,
|
url: `/code-gen/data-source/${dsId}`,
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const addDataSource = (data) => {
|
export const addDataSource = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/code-gen/data-source',
|
url: '/code-gen/data-source',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
export const editDataSource = (data) => {
|
export const editDataSource = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/code-gen/data-source',
|
url: '/code-gen/data-source',
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const deleteDataSource = (dsId) => {
|
export const deleteDataSource = (dsId) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/code-gen/data-source/${dsId}`,
|
url: `/code-gen/data-source/${dsId}`,
|
||||||
method: 'delete'
|
method: 'delete'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,52 +1,52 @@
|
|||||||
import request from '@/utils/request.js'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
// 请求校验规则表list
|
// 请求校验规则表list
|
||||||
export const getRegularList = (params) => {
|
export const getRegularList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/code-gen/rapid/regular',
|
url: '/code-gen/rapid/regular',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取校验规则表详情
|
// 获取校验规则表详情
|
||||||
export const getRegularDetails = (regularId) => {
|
export const getRegularDetails = (regularId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/code-gen/rapid/regular/' + regularId,
|
url: '/code-gen/rapid/regular/' + regularId,
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取校验规则选项列表
|
// 获取校验规则选项列表
|
||||||
export const getRegularOpt = (regularId) => {
|
export const getRegularOpt = (regularId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/code-gen/rapid/regular/option',
|
url: '/code-gen/rapid/regular/option',
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新增校验规则表
|
// 新增校验规则表
|
||||||
export const addRegular = (data) => {
|
export const addRegular = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/code-gen/rapid/regular',
|
url: '/code-gen/rapid/regular',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改校验规则表
|
// 修改校验规则表
|
||||||
export const editRegular = (data) => {
|
export const editRegular = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/code-gen/rapid/regular',
|
url: '/code-gen/rapid/regular',
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除校验规则表
|
// 删除校验规则表
|
||||||
export const delRegular =(regularId) => {
|
export const delRegular =(regularId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/code-gen/rapid/regular/' + regularId,
|
url: '/code-gen/rapid/regular/' + regularId,
|
||||||
method: 'delete'
|
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'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
export const getRoleList = (params) => {
|
export const getRoleList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/role',
|
url: '/admin/role',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
//查询角色option
|
//查询角色option
|
||||||
export const getRoleOption = () => {
|
export const getRoleOption = () => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/role/option',
|
url: '/admin/role/option',
|
||||||
method: "get"
|
method: "get"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getTemRoleOption = () => {
|
export const getTemRoleOption = () => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/role/option/template',
|
url: '/admin/role/option/template',
|
||||||
method: "get"
|
method: "get"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
//查询角色信息
|
//查询角色信息
|
||||||
export const getRoleDetail = (roleId) => {
|
export const getRoleDetail = (roleId) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/role/${roleId}`,
|
url: `/admin/role/${roleId}`,
|
||||||
method: "get"
|
method: "get"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
//根据菜单id获取分配的角色信息
|
//根据菜单id获取分配的角色信息
|
||||||
export const getRoleInfoByMenuId = (params) => {
|
export const getRoleInfoByMenuId = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/role/menu',
|
url: '/admin/role/menu',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
//获取排除在外的角色
|
//获取排除在外的角色
|
||||||
export const getRoleExcludeMenuId = (params) => {
|
export const getRoleExcludeMenuId = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/role/menu/list',
|
url: '/admin/role/menu/list',
|
||||||
method: "get",
|
method: "get",
|
||||||
params
|
params
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// 新增修改
|
// 新增修改
|
||||||
export const operate = (data) => {
|
export const operate = (data) => {
|
||||||
if(data.roleId) return editRole(data)
|
if(data.roleId) return editRole(data)
|
||||||
return addRole(data)
|
return addRole(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新增角色
|
// 新增角色
|
||||||
export const addRole = (data) => {
|
export const addRole = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/role',
|
url: '/admin/role',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改角色
|
// 修改角色
|
||||||
export const editRole = (data) => {
|
export const editRole = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/role',
|
url: '/admin/role',
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
//解除当前角色对应的所有菜单的绑定关系
|
//解除当前角色对应的所有菜单的绑定关系
|
||||||
export const unbindAllRole = (menuId) => {
|
export const unbindAllRole = (menuId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/role/all/unbind/menu',
|
url: '/admin/role/all/unbind/menu',
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data: {
|
data: {
|
||||||
id: menuId
|
id: menuId
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
// 解除角色与菜单之间的绑定状态
|
// 解除角色与菜单之间的绑定状态
|
||||||
export const cancelAuthorization = (menuId, roleIds) => {
|
export const cancelAuthorization = (menuId, roleIds) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/role/unbind/menu',
|
url: '/admin/role/unbind/menu',
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data: {
|
data: {
|
||||||
id: menuId,
|
id: menuId,
|
||||||
ids: roleIds
|
ids: roleIds
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
//建立角色用户绑定关系
|
//建立角色用户绑定关系
|
||||||
export const bindRoleAndMenu = (menuId, roleIds) => {
|
export const bindRoleAndMenu = (menuId, roleIds) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/role/bind/menu',
|
url: '/admin/role/bind/menu',
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data: {
|
data: {
|
||||||
id: menuId,
|
id: menuId,
|
||||||
ids: roleIds
|
ids: roleIds
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
//删除角色信息
|
//删除角色信息
|
||||||
export const deleteRole = (roleId) => {
|
export const deleteRole = (roleId) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/role/${roleId}`,
|
url: `/admin/role/${roleId}`,
|
||||||
method: "delete"
|
method: "delete"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,46 +1,46 @@
|
|||||||
import request from '@/utils/request.js'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
export const getFundDetail = (specialFundId) => {
|
export const getFundDetail = (specialFundId) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/workflow/mosr/special/fund/from/${specialFundId}`,
|
url: `/workflow/mosr/special/fund/from/${specialFundId}`,
|
||||||
method: "get"
|
method: "get"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
export const getFundDetailProcess = (specialFundId) => {
|
export const getFundDetailProcess = (specialFundId) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/workflow/mosr/special/fund/info/${specialFundId}`,
|
url: `/workflow/mosr/special/fund/info/${specialFundId}`,
|
||||||
method: "get"
|
method: "get"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
export const getFundOption = () => {
|
export const getFundOption = () => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/mosr/special/fund/option',
|
url: '/workflow/mosr/special/fund/option',
|
||||||
method: "get"
|
method: "get"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
export const getFundProcess = (specialFundId) => {
|
export const getFundProcess = (specialFundId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/mosr/special/fund/process',
|
url: '/workflow/mosr/special/fund/process',
|
||||||
method: "get"
|
method: "get"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
export const addFund= (data) => {
|
export const addFund= (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/mosr/special/fund',
|
url: '/workflow/mosr/special/fund',
|
||||||
method: "post",
|
method: "post",
|
||||||
data
|
data
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
export const resubmitFund= (data) => {
|
export const resubmitFund= (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/mosr/special/fund/resubmit',
|
url: '/workflow/mosr/special/fund/resubmit',
|
||||||
method: "post",
|
method: "post",
|
||||||
data
|
data
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
export const deleteFund = (id) => {
|
export const deleteFund = (id) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/workflow/mosr/special/fund/${id}`,
|
url: `/workflow/mosr/special/fund/${id}`,
|
||||||
method: "delete"
|
method: "delete"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,22 +1,30 @@
|
|||||||
import request from "@/utils/request.js";
|
import request from "@/utils/request.js";
|
||||||
|
|
||||||
export const getSubCompanyList=(params)=>{
|
export const getSubCompanyList=(params)=>{
|
||||||
return request({
|
return request({
|
||||||
url:'/admin/mosr/sub/company',
|
url:'/admin/mosr/sub/company',
|
||||||
method:'get',
|
method:'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
export const getDepartmentList=(params)=>{
|
export const getDepartmentList=(params)=>{
|
||||||
return request({
|
return request({
|
||||||
url:'/admin/mosr/department',
|
url:'/admin/mosr/department',
|
||||||
method:'get',
|
method:'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
export const getCompanyDetail=(companyId)=>{
|
export const getCompanyDetail=(companyId)=>{
|
||||||
return request({
|
return request({
|
||||||
url:`/admin/mosr/sub/company/info/${companyId}`,
|
url:`/admin/mosr/sub/company/info/${companyId}`,
|
||||||
method:'get'
|
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'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
// 请求参数配置表list
|
// 请求参数配置表list
|
||||||
export const getConfigList = (params) => {
|
export const getConfigList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/config',
|
url: '/admin/config',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
//获取到option列表
|
//获取到option列表
|
||||||
|
|
||||||
// 获取参数配置表详情
|
// 获取参数配置表详情
|
||||||
export const getConfigDetails = (configId) => {
|
export const getConfigDetails = (configId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/config/' + configId,
|
url: '/admin/config/' + configId,
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
// 获取参数配置表详情
|
// 获取参数配置表详情
|
||||||
export const getConfigByKey = (configKey) => {
|
export const getConfigByKey = (configKey) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/config/key/' + configKey,
|
url: '/admin/config/key/' + configKey,
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新增参数配置表
|
// 新增参数配置表
|
||||||
export const addConfig = (data) => {
|
export const addConfig = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/config',
|
url: '/admin/config',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改参数配置表
|
// 修改参数配置表
|
||||||
export const editConfig = (data) => {
|
export const editConfig = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/config',
|
url: '/admin/config',
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除参数配置表
|
// 删除参数配置表
|
||||||
export const delConfig =(configId) => {
|
export const delConfig =(configId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/config/' + configId,
|
url: '/admin/config/' + configId,
|
||||||
method: 'delete'
|
method: 'delete'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,44 +1,44 @@
|
|||||||
import request from '@/utils/request.js'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
// 请求字典类型表list
|
// 请求字典类型表list
|
||||||
export const getDictDataList = (params) => {
|
export const getDictDataList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/dict/data',
|
url: '/admin/dict/data',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取字典数据表详情
|
// 获取字典数据表详情
|
||||||
export const getDictDataDetails = (dictCode) => {
|
export const getDictDataDetails = (dictCode) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/dict/data/' + dictCode,
|
url: '/admin/dict/data/' + dictCode,
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新增字典数据表
|
// 新增字典数据表
|
||||||
export const addDictData = (data) => {
|
export const addDictData = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/dict/data',
|
url: '/admin/dict/data',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改字典类型表
|
// 修改字典类型表
|
||||||
export const editDictData = (data) => {
|
export const editDictData = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/dict/data',
|
url: '/admin/dict/data',
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除字典类型表
|
// 删除字典类型表
|
||||||
export const delDictData = (dictCode) => {
|
export const delDictData = (dictCode) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/dict/data/${dictCode}`,
|
url: `/admin/dict/data/${dictCode}`,
|
||||||
method: 'delete'
|
method: 'delete'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,58 +1,58 @@
|
|||||||
import request from '@/utils/request.js'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
export const getDictOption = () => {
|
export const getDictOption = () => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/dict/type/option',
|
url: '/admin/dict/type/option',
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 请求字典类型表list
|
// 请求字典类型表list
|
||||||
export const getDictTypeList = (params) => {
|
export const getDictTypeList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/dict/type',
|
url: '/admin/dict/type',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取字典类型表详情
|
// 获取字典类型表详情
|
||||||
export const getDictTypeDetails = (dictTypeId) => {
|
export const getDictTypeDetails = (dictTypeId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/dict/type/' + dictTypeId,
|
url: '/admin/dict/type/' + dictTypeId,
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新增字典类型表
|
// 新增字典类型表
|
||||||
export const addDictType = (data) => {
|
export const addDictType = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/dict/type',
|
url: '/admin/dict/type',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改字典类型表
|
// 修改字典类型表
|
||||||
export const editDictType = (data) => {
|
export const editDictType = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/dict/type',
|
url: '/admin/dict/type',
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除字典类型表
|
// 删除字典类型表
|
||||||
export const delDictType =(dictTypeId) => {
|
export const delDictType =(dictTypeId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/dict/type/' + dictTypeId,
|
url: '/admin/dict/type/' + dictTypeId,
|
||||||
method: 'delete'
|
method: 'delete'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
//字典刷新缓存
|
//字典刷新缓存
|
||||||
export const refreshDict =() => {
|
export const refreshDict =() => {
|
||||||
return request({
|
return request({
|
||||||
url: 'admin/dict/type/refresh',
|
url: 'admin/dict/type/refresh',
|
||||||
method: 'post'
|
method: 'post'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
import request from '@/utils/request.js'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
export const getMappingList = (params) => {
|
export const getMappingList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/mapping/switch',
|
url: '/admin/mapping/switch',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
export const editMappingSwitch = (data) => {
|
export const editMappingSwitch = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/mapping/switch',
|
url: '/admin/mapping/switch',
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import request from '@/utils/request'
|
import request from '@/utils/request'
|
||||||
|
|
||||||
export const getRouters = () => {
|
export const getRouters = () => {
|
||||||
return request({
|
return request({
|
||||||
url: '/auth/router',
|
url: '/auth/router',
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -1,53 +1,53 @@
|
|||||||
import request from '@/utils/request.js'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
export const getMenuList = (params) => {
|
export const getMenuList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/menu',
|
url: '/admin/menu',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const editMenu = (data) => {
|
export const editMenu = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/menu',
|
url: '/admin/menu',
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const addMenu = (data) => {
|
export const addMenu = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/menu',
|
url: '/admin/menu',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const delMenu = (menuId) => {
|
export const delMenu = (menuId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/menu/'+menuId,
|
url: '/admin/menu/'+menuId,
|
||||||
method: 'delete'
|
method: 'delete'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getMenuInfo = (menuId) => {
|
export const getMenuInfo = (menuId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/menu/info/'+menuId,
|
url: '/admin/menu/info/'+menuId,
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getMenuOpt = (excludeId=0) => {
|
export const getMenuOpt = (excludeId=0) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/menu/option/'+excludeId,
|
url: '/admin/menu/option/'+excludeId,
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getMenuOptRole = (roleId) => {
|
export const getMenuOptRole = (roleId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/menu/option/role/'+roleId,
|
url: '/admin/menu/option/role/'+roleId,
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,208 +1,251 @@
|
|||||||
import request from '@/utils/request.js'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
// 根据角色或者部门id获取对应数据
|
// 根据角色或者部门id获取对应数据
|
||||||
export const getDeptOpt = (params = {}) => {
|
export const getDeptOpt = (params = {}) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/mosr/department/option`,
|
url: `/admin/mosr/department/option`,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getSubCompOpt = () => {
|
export const getSubCompOpt = () => {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/mosr/sub/company/option`,
|
url: `/admin/mosr/sub/company/option`,
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
export const getUserAccount = () => {
|
export const getUserAccount = () => {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/mosr/user/account/list`,
|
url: `/admin/mosr/user/account/list`,
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
export const judgeIsSameRole = (userId) => {
|
||||||
// 查询角色信息
|
return request({
|
||||||
export const getRolesOpt = () => {
|
url: `/admin/mosr/user/company/same/${userId}`,
|
||||||
return request({
|
method: 'get'
|
||||||
url: '/admin/role/option',
|
})
|
||||||
method: 'get',
|
}
|
||||||
})
|
|
||||||
}
|
// 查询角色信息
|
||||||
|
export const getRolesOpt = () => {
|
||||||
// 获取岗位下拉
|
return request({
|
||||||
export const getJobOpt = () => {
|
url: '/admin/role/option',
|
||||||
return request({
|
method: 'get',
|
||||||
url: '/admin/job/option',
|
})
|
||||||
method: 'get',
|
}
|
||||||
})
|
|
||||||
}
|
// 获取岗位下拉
|
||||||
|
export const getJobOpt = () => {
|
||||||
export const getUserList = (params) => {
|
return request({
|
||||||
return request({
|
url: '/admin/job/option',
|
||||||
url: '/admin/user',
|
method: 'get',
|
||||||
method: 'get',
|
})
|
||||||
params
|
}
|
||||||
})
|
|
||||||
}
|
export const getMosrUserList = (params) => {
|
||||||
//获取用户详情
|
return request({
|
||||||
export const getUserDetail = (userId) => {
|
url: '/admin/mosr/user',
|
||||||
return request({
|
method: 'get',
|
||||||
url: `/admin/mosr/user/info/${userId}`,
|
params
|
||||||
method: "get"
|
})
|
||||||
});
|
}
|
||||||
};
|
export const getUserList = (params) => {
|
||||||
|
return request({
|
||||||
// 操作
|
url: '/admin/user',
|
||||||
export const operate = (data, type) => {
|
method: 'get',
|
||||||
// console.log(type ,'type');
|
params
|
||||||
if (data.userId && type !== '0') return editUser(data)
|
})
|
||||||
else if (type == '0') return editUserOA(data)
|
}
|
||||||
return addUser(data)
|
//获取用户详情
|
||||||
}
|
export const getUserDetail = (userId) => {
|
||||||
|
return request({
|
||||||
// 新增用户
|
url: `/admin/mosr/user/info/${userId}`,
|
||||||
export const addUser = (data) => {
|
method: "get"
|
||||||
return request({
|
});
|
||||||
url: '/admin/mosr/user',
|
};
|
||||||
method: 'post',
|
|
||||||
data
|
// 操作
|
||||||
})
|
export const operate = (data, type) => {
|
||||||
}
|
// console.log(type ,'type');
|
||||||
// 修改用户
|
if (data.userId && type !== '0') return editUser(data)
|
||||||
export const editUser = (data) => {
|
else if (type == '0') return editUserOA(data)
|
||||||
return request({
|
return addUser(data)
|
||||||
url: '/admin/mosr/user',
|
}
|
||||||
method: 'put',
|
|
||||||
data
|
// 新增用户
|
||||||
})
|
export const addUser = (data) => {
|
||||||
}
|
return request({
|
||||||
|
url: '/admin/mosr/user',
|
||||||
// 修改OA用户
|
method: 'post',
|
||||||
export const editUserOA = (data) => {
|
data
|
||||||
return request({
|
})
|
||||||
url: '/admin/mosr/user/oa',
|
}
|
||||||
method: 'put',
|
// 修改用户
|
||||||
data
|
export const editUser = (data) => {
|
||||||
})
|
return request({
|
||||||
}
|
url: '/admin/mosr/user',
|
||||||
|
method: 'put',
|
||||||
//删除用户信息
|
data
|
||||||
export const deleteUser = (userId) => {
|
})
|
||||||
return request({
|
}
|
||||||
url: `/admin/user/${userId}`,
|
|
||||||
method: "delete"
|
// 修改OA用户
|
||||||
});
|
export const editUserOA = (data) => {
|
||||||
};
|
return request({
|
||||||
//根据roleId获取用户信息
|
url: '/admin/mosr/user/oa',
|
||||||
export const getUserByRoleId = (roleId, params) => {
|
method: 'put',
|
||||||
return request({
|
data
|
||||||
url: `/admin/user/role/${roleId}`,
|
})
|
||||||
method: "get",
|
}
|
||||||
params
|
|
||||||
});
|
//删除用户信息
|
||||||
};
|
export const deleteUser = (userId) => {
|
||||||
//排除角色id获取用户信息
|
return request({
|
||||||
export const getUserExcludeRoleId = (roleId, params) => {
|
url: `/admin/user/${userId}`,
|
||||||
return request({
|
method: "delete"
|
||||||
url: `/admin/user/role/exclude/${roleId}`,
|
});
|
||||||
method: "get",
|
};
|
||||||
params
|
//根据roleId获取用户信息
|
||||||
});
|
export const getUserByRoleId = (roleId, params) => {
|
||||||
};
|
return request({
|
||||||
//建立角色用户绑定关系
|
url: `/admin/user/role/${roleId}`,
|
||||||
export const roleBindUser = (data) => {
|
method: "get",
|
||||||
return request({
|
params
|
||||||
url: '/admin/user/bind/role',
|
});
|
||||||
method: 'put',
|
};
|
||||||
data
|
//排除角色id获取用户信息
|
||||||
})
|
export const getUserExcludeRoleId = (roleId, params) => {
|
||||||
}
|
return request({
|
||||||
// 解除角色与用户之间的绑定状态
|
url: `/admin/user/role/exclude/${roleId}`,
|
||||||
export const cancelAuthorization = (data) => {
|
method: "get",
|
||||||
return request({
|
params
|
||||||
url: '/admin/user/unbind/role',
|
});
|
||||||
method: 'put',
|
};
|
||||||
data
|
//建立角色用户绑定关系
|
||||||
})
|
export const roleBindUser = (data) => {
|
||||||
}
|
return request({
|
||||||
//解除当前角色对应的所有用户的绑定关系
|
url: '/admin/user/bind/role',
|
||||||
export const unbindAllUser = (roleId) => {
|
method: 'put',
|
||||||
return request({
|
data
|
||||||
url: '/admin/user/all/unbind/role',
|
})
|
||||||
method: 'put',
|
}
|
||||||
data: {
|
// 解除角色与用户之间的绑定状态
|
||||||
id: roleId
|
export const cancelAuthorization = (data) => {
|
||||||
}
|
return request({
|
||||||
})
|
url: '/admin/user/unbind/role',
|
||||||
}
|
method: 'put',
|
||||||
|
data
|
||||||
//根据岗位id获取分配的用户信息
|
})
|
||||||
export const getUserInfoByPostId = (postId, params) => {
|
}
|
||||||
return request({
|
//解除当前角色对应的所有用户的绑定关系
|
||||||
url: `/admin/user/post/${postId}`,
|
export const unbindAllUser = (roleId) => {
|
||||||
method: 'get',
|
return request({
|
||||||
params
|
url: '/admin/user/all/unbind/role',
|
||||||
})
|
method: 'put',
|
||||||
}
|
data: {
|
||||||
//排除岗位id获取用户信息
|
id: roleId
|
||||||
export const getUserExcludePostId = (postId, params) => {
|
}
|
||||||
return request({
|
})
|
||||||
url: `/admin/user/post/exclude/${postId}`,
|
}
|
||||||
method: "get",
|
|
||||||
params
|
//根据岗位id获取分配的用户信息
|
||||||
});
|
export const getUserInfoByPostId = (postId, params) => {
|
||||||
};
|
return request({
|
||||||
//建立岗位与用户绑定关系
|
url: `/admin/user/post/${postId}`,
|
||||||
export const postBindUser = (userIds, postId) => {
|
method: 'get',
|
||||||
return request({
|
params
|
||||||
url: '/admin/user/bind/post',
|
})
|
||||||
method: 'put',
|
}
|
||||||
data: {
|
//排除岗位id获取用户信息
|
||||||
ids: userIds,
|
export const getUserExcludePostId = (postId, params) => {
|
||||||
id: postId
|
return request({
|
||||||
}
|
url: `/admin/user/post/exclude/${postId}`,
|
||||||
})
|
method: "get",
|
||||||
}
|
params
|
||||||
// 解除岗位与用户之间的绑定状态
|
});
|
||||||
export const cancelPostAndUserAuthorization = (userIds, postId) => {
|
};
|
||||||
return request({
|
//建立岗位与用户绑定关系
|
||||||
url: '/admin/user/unbind/post',
|
export const postBindUser = (userIds, postId) => {
|
||||||
method: 'put',
|
return request({
|
||||||
data: {
|
url: '/admin/user/bind/post',
|
||||||
ids: userIds,
|
method: 'put',
|
||||||
id: postId
|
data: {
|
||||||
}
|
ids: userIds,
|
||||||
})
|
id: postId
|
||||||
}
|
}
|
||||||
//解除当前岗位对应的所有用户的绑定关系
|
})
|
||||||
export const unbindAllUserByPost = (postId) => {
|
}
|
||||||
return request({
|
// 解除岗位与用户之间的绑定状态
|
||||||
url: '/admin/user/all/unbind/post',
|
export const cancelPostAndUserAuthorization = (userIds, postId) => {
|
||||||
method: 'put',
|
return request({
|
||||||
data: {
|
url: '/admin/user/unbind/post',
|
||||||
id: postId
|
method: 'put',
|
||||||
}
|
data: {
|
||||||
})
|
ids: userIds,
|
||||||
}
|
id: postId
|
||||||
|
}
|
||||||
export const bindAccount = (data) => {
|
})
|
||||||
return request({
|
}
|
||||||
url: '/admin/mosr/user/bind/account',
|
//解除当前岗位对应的所有用户的绑定关系
|
||||||
method: 'post',
|
export const unbindAllUserByPost = (postId) => {
|
||||||
data
|
return request({
|
||||||
})
|
url: '/admin/user/all/unbind/post',
|
||||||
}
|
method: 'put',
|
||||||
export const getBindAccount = (userId) => {
|
data: {
|
||||||
return request({
|
id: postId
|
||||||
url: `/admin/mosr/user/bind/account/info/${userId}`,
|
}
|
||||||
method: 'get'
|
})
|
||||||
})
|
}
|
||||||
}
|
|
||||||
|
export const bindAccount = (data) => {
|
||||||
export const checkMatrix = (userId) => {
|
return request({
|
||||||
return request({
|
url: '/admin/mosr/user/bind/account',
|
||||||
url: `/admin/mosr/user/matrix?userId=` + userId,
|
method: 'post',
|
||||||
method: 'get'
|
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'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
export function getProcessDefinitionList(param) {
|
export function getProcessDefinitionList(param) {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/definition",
|
url: "/workflow/process/definition",
|
||||||
method: "get",
|
method: "get",
|
||||||
params: param
|
params: param
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getProcessDefinitionInfo(deploymentId) {
|
export function getProcessDefinitionInfo(deploymentId) {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/definition/" + deploymentId,
|
url: "/workflow/process/definition/" + deploymentId,
|
||||||
method: "get",
|
method: "get",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getInitiateInfo(processDefinitionKey) {
|
export function getInitiateInfo(processDefinitionKey) {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/definition/key/" + processDefinitionKey,
|
url: "/workflow/process/definition/key/" + processDefinitionKey,
|
||||||
method: "get",
|
method: "get",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export function getHistoryVersion(processDefinitionKey) {
|
export function getHistoryVersion(processDefinitionKey) {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/definition/history/" + processDefinitionKey,
|
url: "/workflow/process/definition/history/" + processDefinitionKey,
|
||||||
method: "get",
|
method: "get",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function deleteHistoryVersion(deploymentId) {
|
export function deleteHistoryVersion(deploymentId) {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/definition/" + deploymentId,
|
url: "/workflow/process/definition/" + deploymentId,
|
||||||
method: "delete",
|
method: "delete",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function suspendProcessDefinition(processDefinitionId) {
|
export function suspendProcessDefinition(processDefinitionId) {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/definition/suspend",
|
url: "/workflow/process/definition/suspend",
|
||||||
method: "put",
|
method: "put",
|
||||||
data: processDefinitionId
|
data: processDefinitionId
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function activateProcessDefinition(processDefinitionId) {
|
export function activateProcessDefinition(processDefinitionId) {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/definition/activate",
|
url: "/workflow/process/definition/activate",
|
||||||
method: "put",
|
method: "put",
|
||||||
data: processDefinitionId
|
data: processDefinitionId
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function addProcessDefinition(param) {
|
export function addProcessDefinition(param) {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/definition",
|
url: "/workflow/process/definition",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: param
|
data: param
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getTypeOption() {
|
export function getTypeOption() {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/definition/type/option",
|
url: "/workflow/process/definition/type/option",
|
||||||
method: "get",
|
method: "get",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getFromPerm(processKey) {
|
export function getFromPerm(processKey) {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/definition/from/perm/"+processKey,
|
url: "/workflow/process/definition/from/perm/"+processKey,
|
||||||
method: "get",
|
method: "get",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import request from '@/utils/request.js'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
export function deleteFile(fileId) {
|
export function deleteFile(fileId) {
|
||||||
// 删除文件
|
// 删除文件
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/process/file/' + fileId,
|
url: '/workflow/process/file/' + fileId,
|
||||||
method: 'delete',
|
method: 'delete',
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,53 +1,53 @@
|
|||||||
import request from '@/utils/request.js'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 开始实例流程
|
* 开始实例流程
|
||||||
* @param param
|
* @param param
|
||||||
* @returns {*}
|
* @returns {*}
|
||||||
*/
|
*/
|
||||||
export function startProcessInstance(param) {
|
export function startProcessInstance(param) {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/instance/start",
|
url: "/workflow/process/instance/start",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: param
|
data: param
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
export function restartProcessInstance(param) {
|
export function restartProcessInstance(param) {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/instance/restart",
|
url: "/workflow/process/instance/restart",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: param
|
data: param
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getAboutInstanceList(param) {
|
export function getAboutInstanceList(param) {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/instance/about",
|
url: "/workflow/process/instance/about",
|
||||||
method: "get",
|
method: "get",
|
||||||
params: param
|
params: param
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getInitiatedInstanceList(param) {
|
export function getInitiatedInstanceList(param) {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/instance/self",
|
url: "/workflow/process/instance/self",
|
||||||
method: "get",
|
method: "get",
|
||||||
params: param
|
params: param
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getInitiatedInstanceInfo(processInstanceId) {
|
export function getInitiatedInstanceInfo(processInstanceId) {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/instance/info/"+processInstanceId,
|
url: "/workflow/process/instance/info/"+processInstanceId,
|
||||||
method: "get",
|
method: "get",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export function getInitiatedInstanceReInfo(instanceId) {
|
export function getInitiatedInstanceReInfo(instanceId) {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/instance/re/info/"+instanceId,
|
url: "/workflow/process/instance/re/info/"+instanceId,
|
||||||
method: "get",
|
method: "get",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,46 +1,46 @@
|
|||||||
import request from '@/utils/request.js'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
// 请求系统内置监听器list
|
// 请求系统内置监听器list
|
||||||
export const getProcessListenerList = (params) => {
|
export const getProcessListenerList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/process/listener',
|
url: '/workflow/process/listener',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
//获取到option列表
|
//获取到option列表
|
||||||
|
|
||||||
// 获取系统内置监听器详情
|
// 获取系统内置监听器详情
|
||||||
export const getProcessListenerDetails = (processListenerId) => {
|
export const getProcessListenerDetails = (processListenerId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/process/listener/' + processListenerId,
|
url: '/workflow/process/listener/' + processListenerId,
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新增系统内置监听器
|
// 新增系统内置监听器
|
||||||
export const addProcessListener = (data) => {
|
export const addProcessListener = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/process/listener',
|
url: '/workflow/process/listener',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改系统内置监听器
|
// 修改系统内置监听器
|
||||||
export const editProcessListener = (data) => {
|
export const editProcessListener = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/process/listener',
|
url: '/workflow/process/listener',
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除系统内置监听器
|
// 删除系统内置监听器
|
||||||
export const delProcessListener =(processListenerId) => {
|
export const delProcessListener =(processListenerId) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workflow/process/listener/' + processListenerId,
|
url: '/workflow/process/listener/' + processListenerId,
|
||||||
method: 'delete'
|
method: 'delete'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,45 +1,45 @@
|
|||||||
import request from '@/utils/request.js'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
export function getTaskList() {
|
export function getTaskList() {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/task",
|
url: "/workflow/process/task",
|
||||||
method: "get",
|
method: "get",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getTaskInfo(taskId) {
|
export function getTaskInfo(taskId) {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/task/"+taskId,
|
url: "/workflow/process/task/"+taskId,
|
||||||
method: "get",
|
method: "get",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
export function completeTask(params) {
|
export function completeTask(params) {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/task/complete",
|
url: "/workflow/process/task/complete",
|
||||||
method: "put",
|
method: "put",
|
||||||
data: params
|
data: params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
export function refuseTask(params) {
|
export function refuseTask(params) {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/task/refuse",
|
url: "/workflow/process/task/refuse",
|
||||||
method: "put",
|
method: "put",
|
||||||
data: params
|
data: params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function rollBackTask(params) {
|
export function rollBackTask(params) {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/task/rollback",
|
url: "/workflow/process/task/rollback",
|
||||||
method: "put",
|
method: "put",
|
||||||
data: params
|
data: params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function addComment(params) {
|
export function addComment(params) {
|
||||||
return request({
|
return request({
|
||||||
url: "/workflow/process/task/comment",
|
url: "/workflow/process/task/comment",
|
||||||
method: "post",
|
method: "post",
|
||||||
data: params
|
data: params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,49 +1,47 @@
|
|||||||
import request from '@/utils/request.js'
|
import request from '@/utils/request.js'
|
||||||
|
|
||||||
//根据角色或者部门获取到对应的数据
|
//根据角色或者部门获取到对应的数据
|
||||||
export function getUserTree(type, chooseId) {
|
export function getUserTree(type,chooseId){
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/user/choose/${type}/${chooseId}`,
|
url:`/admin/user/choose/${type}/${chooseId}`,
|
||||||
method: 'get'
|
method:'get'
|
||||||
})
|
|
||||||
}
|
})
|
||||||
|
}
|
||||||
// 查询系统角色
|
|
||||||
export function getRole() {
|
// 查询系统角色
|
||||||
return request({
|
export function getRole() {
|
||||||
url: 'admin/role/option',
|
return request({
|
||||||
method: 'get'
|
url: 'admin/role/option',
|
||||||
})
|
method: 'get'
|
||||||
}
|
})
|
||||||
|
}
|
||||||
//获取采取树形控件的部门option
|
//获取采取树形控件的部门option
|
||||||
export function getDepartmentTree() {
|
export function getDepartmentTree() {
|
||||||
return request({
|
return request({
|
||||||
url: 'admin/dept/option',
|
url: 'admin/dept/option',
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
export function getMosrUser(params) {
|
||||||
export function getMosrUser(params) {
|
return request({
|
||||||
return request({
|
url: '/admin/mosr/user/choose',
|
||||||
url: '/admin/mosr/user/choose',
|
method: 'get',
|
||||||
method: 'get',
|
params:params
|
||||||
params: params
|
})
|
||||||
})
|
}
|
||||||
}
|
|
||||||
|
export function getOrganizationStructure(params) {
|
||||||
export function getOrganizationStructure(params) {
|
return request({
|
||||||
return request({
|
url: '/admin/organizational/structure/choose',
|
||||||
url: '/admin/organizational/structure/choose',
|
method: 'get',
|
||||||
method: 'get',
|
params:params
|
||||||
params: params
|
})
|
||||||
})
|
}
|
||||||
}
|
export function getOrganizationStructureTree(params) {
|
||||||
|
return request({
|
||||||
export function getOrganizationStructureTree(params) {
|
url: '/admin/organizational/structure/tree',
|
||||||
return request({
|
method: 'get',
|
||||||
url: '/admin/organizational/structure/tree',
|
params: params
|
||||||
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;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
list-style: none;
|
list-style: none;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ==============X轴/Y轴区域样式=============*/
|
/* ==============X轴/Y轴区域样式=============*/
|
||||||
.box-card-h {
|
.box-card-h {
|
||||||
height: 390px !important;
|
height: 390px !important;
|
||||||
}
|
}
|
||||||
.box-card::-webkit-scrollbar {
|
.box-card::-webkit-scrollbar {
|
||||||
width: 6px;
|
width: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 滚动条轨道
|
// 滚动条轨道
|
||||||
.box-card::-webkit-scrollbar-track {
|
.box-card::-webkit-scrollbar-track {
|
||||||
background: rgb(239, 239, 239);
|
background: rgb(239, 239, 239);
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 小滑块
|
// 小滑块
|
||||||
.box-card::-webkit-scrollbar-thumb {
|
.box-card::-webkit-scrollbar-thumb {
|
||||||
background: rgba(80, 81, 82, 0.29);
|
background: rgba(80, 81, 82, 0.29);
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
}
|
}
|
||||||
.box-card {
|
.box-card {
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
height: 350px;
|
height: 350px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
|
||||||
.el-card__body {
|
.el-card__body {
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.x-y-axis {
|
.x-y-axis {
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.list-group {
|
.list-group {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cards {
|
.cards {
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
|
|
||||||
span:last-child {
|
span:last-child {
|
||||||
color: #2a99ff;
|
color: #2a99ff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.update-color {
|
.update-color {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-around;
|
justify-content: space-around;
|
||||||
> span{
|
> span{
|
||||||
white-space: pre
|
white-space: pre
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-active {
|
.card-active {
|
||||||
outline: none; /* 隐藏默认的蓝色外边框 */
|
outline: none; /* 隐藏默认的蓝色外边框 */
|
||||||
box-shadow: 0 0 5px blue; /* 添加阴影效果,颜色为蓝色 */
|
box-shadow: 0 0 5px blue; /* 添加阴影效果,颜色为蓝色 */
|
||||||
}
|
}
|
||||||
|
|
||||||
.x-y-cards {
|
.x-y-cards {
|
||||||
.el-card__body {
|
.el-card__body {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-around;
|
justify-content: space-around;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
height: 50px;
|
height: 50px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cards-right {
|
.cards-right {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
|
|
||||||
> span:first-child {
|
> span:first-child {
|
||||||
color: #2a99ff;
|
color: #2a99ff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//扩大拖拽区域
|
//扩大拖拽区域
|
||||||
.drag-block {
|
.drag-block {
|
||||||
height: 329px;
|
height: 329px;
|
||||||
}
|
}
|
||||||
.red-bgc {
|
.red-bgc {
|
||||||
background-color: red;
|
background-color: red;
|
||||||
}
|
}
|
||||||
|
|
||||||
.yellow-bgc {
|
.yellow-bgc {
|
||||||
background-color: yellow;
|
background-color: yellow;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ==============基础设置样式=============*/
|
/* ==============基础设置样式=============*/
|
||||||
.basic-setup {
|
.basic-setup {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
.setting {
|
.setting {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
|
|
||||||
.setting-title {
|
.setting-title {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.setting-item {
|
.setting-item {
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* ==============高级设置样式=============*/
|
/* ==============高级设置样式=============*/
|
||||||
.advanced-setting{
|
.advanced-setting{
|
||||||
.el-form-item {
|
.el-form-item {
|
||||||
display: block;
|
display: block;
|
||||||
|
|
||||||
.el-form-item__label {
|
.el-form-item__label {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-form-item__content {
|
.el-form-item__content {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* ==============echarts样式=============*/
|
/* ==============echarts样式=============*/
|
||||||
#container {
|
#container {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
height: 450px;
|
height: 450px;
|
||||||
width: 80%;
|
width: 80%;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,53 +1,53 @@
|
|||||||
.el-side {
|
.el-side {
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
}
|
}
|
||||||
.logo {
|
.logo {
|
||||||
height: 65px;
|
height: 65px;
|
||||||
background-color: #BEA266;
|
background-color: #BEA266;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 26px;
|
font-size: 26px;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
& > img {
|
& > img {
|
||||||
object-fit: scale-down;
|
object-fit: scale-down;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.port-link{
|
.port-link{
|
||||||
display: block;
|
display: block;
|
||||||
width: 200px;
|
width: 200px;
|
||||||
height: 50px;
|
height: 50px;
|
||||||
margin-left: -40px;
|
margin-left: -40px;
|
||||||
padding-left: 40px;
|
padding-left: 40px;
|
||||||
}
|
}
|
||||||
.el-menu {
|
.el-menu {
|
||||||
border: none !important;
|
border: none !important;
|
||||||
.el-sub-menu {
|
.el-sub-menu {
|
||||||
.el-sub-menu__title {
|
.el-sub-menu__title {
|
||||||
display: block;
|
display: block;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
&:hover{
|
&:hover{
|
||||||
//background-color: #1F315F;
|
//background-color: #1F315F;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-menu-item {
|
.el-menu-item {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
&:hover {
|
&:hover {
|
||||||
//background-color: #373350 !important;
|
//background-color: #373350 !important;
|
||||||
//color: #EDC49A;
|
//color: #EDC49A;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.el-menu-item.is-active {
|
.el-menu-item.is-active {
|
||||||
background: rgba(190,162,102,0.5);
|
background: rgba(190,162,102,0.5);
|
||||||
//background-color: #373350 !important;
|
//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>
|
<template>
|
||||||
<el-form :model="formData" ref="applyForm" :rules="rules" :label-position="labelPosition">
|
<el-form :model="formData" ref="applyForm" :rules="rules" :label-position="labelPosition" :style="{marginLeft: label==='项目验收附件'?'25px': label==='项目立项附件'?'25px':'5px'}">
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="24">
|
<!-- <el-col :span="24">-->
|
||||||
<el-form-item :label="label" prop="attachment" label-width="125">
|
<!-- <el-form-item :label="label" prop="attachment" >-->
|
||||||
<template v-if="preview&&JSON.stringify(singleFile) !== '{}'&&JSON.stringify(singleFile)!=='null'">
|
<!-- <template v-if="preview">-->
|
||||||
<el-button type="primary" link @click="handleDownload(singleFile)" style="font-size: 16px">
|
<!-- <file-upload @getFile="getAttachment" :multiple="false"-->
|
||||||
{{ singleFile ? singleFile?.originalFileName : formData.singleFile?.originalFileName }}
|
<!-- :disabled="singleFileArray?.length>0?true:false" title="如需修改需求申请书附件,请先删除文件再上传!"/>-->
|
||||||
</el-button>
|
<!-- <fvTable style="width: 100%;max-height: 80px;" height="80" v-if="singleFileArray?.length>0"-->
|
||||||
<el-button type="danger" link @click="deleteSingleFile(singleFile?singleFile:formData.singleFile,1)">删除
|
<!-- :tableConfig="editSingleTableConfig"-->
|
||||||
</el-button>
|
<!-- :data="singleFileArray" :isSettingCol="false" :pagination="false">-->
|
||||||
</template>
|
<!-- </fvTable>-->
|
||||||
<template
|
<!-- </template>-->
|
||||||
v-else-if="!preview||JSON.stringify(singleFile) == '{}'||singleFile==null||formData.singleFile==null">
|
<!-- <template v-else-if="!preview">-->
|
||||||
<file-upload @getFile="getAttachment" :multiple="false"
|
<!-- <file-upload @getFile="getAttachment" :multiple="false"-->
|
||||||
:disabled="isSingleFile" ref="fileUploadRef"/>
|
<!-- :disabled="isSingleFile"/>-->
|
||||||
<!-- :showFileList="showFileList" @delete="deleteAttachment"-->
|
<!-- <fvTable style="width: 100%;max-height: 80px;" v-if="showSingleTable" height="80"-->
|
||||||
<fvTable style="width: 100%;max-height: 80px;" v-if="showSingleTable" height="80" :tableConfig="singleTableConfig"
|
<!-- :tableConfig="singleTableConfig"-->
|
||||||
:data="_singleFileValue" :isSettingCol="false" :pagination="false">
|
<!-- :data="_singleFileValue" :isSettingCol="false" :pagination="false">-->
|
||||||
</fvTable>
|
<!-- </fvTable>-->
|
||||||
</template>
|
<!-- </template>-->
|
||||||
</el-form-item>
|
<!-- </el-form-item>-->
|
||||||
</el-col>
|
<!-- </el-col>-->
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item label="其他文件" label-width="125">
|
<el-form-item :label="label" prop="" :required="label!='项目归档附件'">
|
||||||
<file-upload @getFile="getOtherFile"/>
|
<file-upload @getFile="getOtherFile"/>
|
||||||
<fvTable style="width: 100%;max-height: 162px;" v-if="showTable" height="162" :tableConfig="tableConfig"
|
<el-button color="#DED0B2" v-if="templateDownloadBtnShow" @click="handleImportTemplateDownload"
|
||||||
:data="allFileList" :isSettingCol="false" :pagination="false">
|
style="margin-left: 10px">模板下载
|
||||||
<template #empty>
|
</el-button>
|
||||||
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
<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"
|
||||||
</template>
|
:data="allFileList" :isSettingCol="false" :pagination="false">
|
||||||
</fvTable>
|
<template #empty>
|
||||||
</el-form-item>
|
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
||||||
</el-col>
|
</template>
|
||||||
</el-row>
|
</fvTable>
|
||||||
</el-form>
|
</el-form-item>
|
||||||
</template>
|
</el-col>
|
||||||
|
</el-row>
|
||||||
<script setup lang="jsx">
|
</el-form>
|
||||||
import FileUpload from '@/components/FileUpload.vue'
|
<file-preview ref="filePreviewRef" v-if="filePreviewShow" :fileName="filePreviewParam.fileName"
|
||||||
import {deleteFile, downloadFile} from "@/api/project-demand";
|
:fileUrl="filePreviewParam.fileUrl"
|
||||||
import {ElMessageBox, ElNotification} from "element-plus";
|
:fileType="filePreviewParam.fileType"/>
|
||||||
|
</template>
|
||||||
|
|
||||||
const props = defineProps({
|
<script setup lang="jsx">
|
||||||
showFileList: {
|
import FileUpload from '@/components/FileUpload.vue'
|
||||||
type: Boolean,
|
import {deleteFile, downloadFile, downloadTemplate, downloadTemplateZip} from "@/api/project-demand";
|
||||||
default: false
|
import {ElMessageBox, ElNotification} from "element-plus";
|
||||||
},
|
|
||||||
label: {
|
|
||||||
type: String,
|
const props = defineProps({
|
||||||
default: '项目附件'
|
showFileList: {
|
||||||
},
|
type: Boolean,
|
||||||
showTable: {
|
default: false
|
||||||
type: Boolean,
|
},
|
||||||
default: false
|
label: {
|
||||||
},
|
type: String,
|
||||||
showSingleTable: {
|
default: '项目附件'
|
||||||
type: Boolean,
|
},
|
||||||
default: false
|
showTable: {
|
||||||
},
|
type: Boolean,
|
||||||
preview: {
|
default: false
|
||||||
type: Boolean,
|
},
|
||||||
default: false
|
showSingleTable: {
|
||||||
},
|
type: Boolean,
|
||||||
singleList: {
|
default: false
|
||||||
type: Array,
|
},
|
||||||
default: []
|
preview: {
|
||||||
},
|
type: Boolean,
|
||||||
otherFileList: {
|
default: false
|
||||||
type: Array,
|
},
|
||||||
default: []
|
//是否显示模板下载按钮
|
||||||
},
|
templateDownloadBtnShow: {
|
||||||
formData: {
|
type: Boolean,
|
||||||
type: Object,
|
default: false
|
||||||
default: {}
|
},
|
||||||
},
|
//模板下载时的文件名
|
||||||
labelPosition: {
|
templateName: {
|
||||||
type: String,
|
type: String,
|
||||||
default: ''
|
default: ''
|
||||||
},
|
},
|
||||||
tag: {
|
singleList: {
|
||||||
type: String,
|
type: Array,
|
||||||
default: ''
|
default: []
|
||||||
}
|
},
|
||||||
})
|
otherFileList: {
|
||||||
const emit = defineEmits(["getAttachment", "getOtherFile","update:singleList"])
|
type: Array,
|
||||||
const tableConfig = reactive({
|
default: []
|
||||||
columns: [
|
},
|
||||||
{
|
formData: {
|
||||||
prop: 'index',
|
type: Object,
|
||||||
type: 'index',
|
default: {}
|
||||||
label: '序号',
|
},
|
||||||
align: 'center',
|
labelPosition: {
|
||||||
width: '80',
|
type: String,
|
||||||
},
|
default: ''
|
||||||
{
|
},
|
||||||
prop: 'originalFileName',
|
tag: {
|
||||||
label: '文件名',
|
type: String,
|
||||||
align: 'center',
|
default: ''
|
||||||
},
|
}
|
||||||
{
|
})
|
||||||
prop: 'tag',
|
const emit = defineEmits(["getAttachment", "getOtherFile", "update:singleList"])
|
||||||
label: '标签',
|
|
||||||
align: 'center'
|
const baseTableConf = reactive(
|
||||||
},
|
[
|
||||||
{
|
{
|
||||||
prop: 'size',
|
prop: 'index',
|
||||||
label: '文件大小',
|
type: 'index',
|
||||||
align: 'center',
|
label: '序号',
|
||||||
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
align: 'center',
|
||||||
},
|
width: '80',
|
||||||
{
|
},
|
||||||
prop: 'oper',
|
{
|
||||||
label: '操作',
|
prop: 'originalFileName',
|
||||||
align: 'center',
|
label: '文件名',
|
||||||
showOverflowTooltip: false,
|
align: 'center',
|
||||||
currentRender: ({row, index}) => {
|
width: 400,
|
||||||
let btn = []
|
currentRender: ({row, index}) => (
|
||||||
btn.push({label: '下载', func: () => handleDownload(row), type: 'primary'})
|
<div style="color: #2a99ff;cursor: pointer;"
|
||||||
// if (row.newFile) {
|
onClick={() => clickToPreview(row)}>{row.originalFileName}</div>)
|
||||||
// btn.push({label: '删除', func: () => handleDelete(row), type: 'primary'})
|
},
|
||||||
// }
|
{
|
||||||
return (
|
prop: 'tag',
|
||||||
<div style={{width: '100%'}}>
|
label: '标签',
|
||||||
{
|
align: 'center',
|
||||||
btn.map(item => (
|
// currentRender: ({row, index}) => (
|
||||||
<el-button
|
// <el-input placeholder={row.tag} onClick={() => {}}></el-input>)
|
||||||
type={item.type}
|
},
|
||||||
onClick={() => item.func()}
|
{
|
||||||
link
|
prop: 'size',
|
||||||
>
|
label: '文件大小',
|
||||||
{item.label}
|
align: 'center',
|
||||||
</el-button>
|
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
||||||
))
|
},
|
||||||
}
|
]
|
||||||
{
|
)
|
||||||
row.newFile || props.preview || !props.preview ?
|
const tableConfig = reactive({
|
||||||
<popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
columns: [
|
||||||
// perm={['']}
|
...baseTableConf,
|
||||||
onDelete={() => handleDelete(row)}/>
|
{
|
||||||
: ''
|
prop: 'oper',
|
||||||
}
|
label: '操作',
|
||||||
</div>
|
align: 'center',
|
||||||
)
|
showOverflowTooltip: false,
|
||||||
}
|
currentRender: ({row, index}) => {
|
||||||
}
|
let btn = []
|
||||||
]
|
btn.push({label: '下载', func: () => handleDownload(row), type: 'primary'})
|
||||||
})
|
// if (row.newFile) {
|
||||||
const singleTableConfig = reactive({
|
// btn.push({label: '删除', func: () => handleDelete(row), type: 'primary'})
|
||||||
columns: [
|
// }
|
||||||
{
|
return (
|
||||||
prop: 'index',
|
<div style={{width: '100%'}}>
|
||||||
type: 'index',
|
{
|
||||||
label: '序号',
|
btn.map(item => (
|
||||||
align: 'center',
|
<el-button
|
||||||
width: '80',
|
type={item.type}
|
||||||
},
|
onClick={() => item.func()}
|
||||||
{
|
link
|
||||||
prop: 'originalFileName',
|
>
|
||||||
label: '文件名',
|
{item.label}
|
||||||
align: 'center',
|
</el-button>
|
||||||
},
|
))
|
||||||
{
|
}
|
||||||
prop: 'tag',
|
{
|
||||||
label: '标签',
|
row.newFile || props.preview || !props.preview ?
|
||||||
align: 'center'
|
<popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
||||||
},
|
// perm={['']}
|
||||||
{
|
onDelete={() => handleDelete(row)}/>
|
||||||
prop: 'size',
|
: ''
|
||||||
label: '文件大小',
|
}
|
||||||
align: 'center',
|
</div>
|
||||||
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
)
|
||||||
},
|
}
|
||||||
{
|
}
|
||||||
prop: 'oper',
|
]
|
||||||
label: '操作',
|
})
|
||||||
align: 'center',
|
const singleTableConfig = reactive({
|
||||||
showOverflowTooltip: false,
|
columns: [
|
||||||
currentRender: ({row, index}) => {
|
...baseTableConf,
|
||||||
let btn = []
|
{
|
||||||
btn.push({label: '下载', func: () => handleDownload(row), type: 'primary'})
|
prop: 'oper',
|
||||||
// if (row.newFile) {
|
label: '操作',
|
||||||
// btn.push({label: '删除', func: () => handleDelete(row), type: 'primary'})
|
align: 'center',
|
||||||
// }
|
showOverflowTooltip: false,
|
||||||
return (
|
currentRender: ({row, index}) => {
|
||||||
<div style={{width: '100%'}}>
|
let btn = []
|
||||||
{
|
btn.push({label: '下载', func: () => handleDownload(row), type: 'primary'})
|
||||||
btn.map(item => (
|
// if (row.newFile) {
|
||||||
<el-button
|
// btn.push({label: '删除', func: () => handleDelete(row), type: 'primary'})
|
||||||
type={item.type}
|
// }
|
||||||
onClick={() => item.func()}
|
return (
|
||||||
link
|
<div style={{width: '100%'}}>
|
||||||
>
|
{
|
||||||
{item.label}
|
btn.map(item => (
|
||||||
</el-button>
|
<el-button
|
||||||
))
|
type={item.type}
|
||||||
}
|
onClick={() => item.func()}
|
||||||
{
|
link
|
||||||
row.newFile || props.preview || !props.preview ?
|
>
|
||||||
<popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
{item.label}
|
||||||
// perm={['']}
|
</el-button>
|
||||||
onDelete={() => handleSingleDelete(row)}/>
|
))
|
||||||
: ''
|
}
|
||||||
}
|
{
|
||||||
</div>
|
row.newFile || props.preview || !props.preview ?
|
||||||
)
|
<popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
||||||
}
|
// perm={['']}
|
||||||
}
|
onDelete={() => handleSingleDelete(row)}/>
|
||||||
]
|
: ''
|
||||||
})
|
}
|
||||||
const fileUploadRef = ref()
|
</div>
|
||||||
const rules = reactive({
|
)
|
||||||
attachment: [{required: true, message: '请上传附件', trigger: ['blur', 'change']}],
|
}
|
||||||
})
|
}
|
||||||
const applyForm = ref()
|
]
|
||||||
const singleFile = ref(props.formData.singleFile)
|
})
|
||||||
const isSingleFile = ref(false)
|
const editSingleTableConfig = reactive({
|
||||||
const allFileList = ref([])
|
columns: [
|
||||||
const deleteFileVal = ref({})
|
...baseTableConf,
|
||||||
const singleFileList = ref([])
|
{
|
||||||
if(localStorage.getItem('singleFile')){
|
prop: 'oper',
|
||||||
singleFile.value = JSON.parse(localStorage.getItem('singleFile'))
|
label: '操作',
|
||||||
}
|
align: 'center',
|
||||||
const _singleFileValue = computed({
|
showOverflowTooltip: false,
|
||||||
get() {
|
currentRender: ({row, index}) => {
|
||||||
return props.singleList;
|
let btn = []
|
||||||
},
|
btn.push({label: '下载', func: () => handleDownload(row), type: 'primary'})
|
||||||
set(value) {
|
// if (row.newFile) {
|
||||||
emit('update:singleList', value)
|
// btn.push({label: '删除', func: () => handleDelete(row), type: 'primary'})
|
||||||
}
|
// }
|
||||||
})
|
return (
|
||||||
|
<div style={{width: '100%'}}>
|
||||||
// console.log('_singleFileValue',_singleFileValue.value)
|
{
|
||||||
const _otherFileListValue = computed({
|
btn.map(item => (
|
||||||
get() {
|
<el-button
|
||||||
return props.otherFileList;
|
type={item.type}
|
||||||
},
|
onClick={() => item.func()}
|
||||||
set(value) {
|
link
|
||||||
emit('update:otherFileList', value)
|
>
|
||||||
}
|
{item.label}
|
||||||
})
|
</el-button>
|
||||||
if(_otherFileListValue.value&&_otherFileListValue.value.length>0){
|
))
|
||||||
_otherFileListValue.value.forEach(item=>{
|
}
|
||||||
allFileList.value.push(item)
|
{
|
||||||
})
|
row.newFile || props.preview || !props.preview ?
|
||||||
}
|
<popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
||||||
watch(() => props.showSingleTable, (newVal) => {
|
// perm={['']}
|
||||||
props.showSingleTable = newVal
|
onDelete={() => deleteSingleFile(row, 1)}/>
|
||||||
}, {deep: true})
|
: ''
|
||||||
watch(() => props.formData.fileList, (newVal) => {
|
}
|
||||||
if (props.preview) {
|
</div>
|
||||||
newVal?.forEach(item => {
|
)
|
||||||
allFileList.value.push(item)
|
}
|
||||||
})
|
}
|
||||||
}
|
]
|
||||||
}, {immediate: true})
|
})
|
||||||
// watch(() => props.otherFileList, (newVal) => {
|
const singleFileArray = ref([])
|
||||||
// props.otherFileList=newVal
|
const rules = reactive({
|
||||||
// if (props.preview) {
|
// attachment: [{required: true, message: '请上传附件', trigger: ['blur', 'change']}],
|
||||||
// console.log('newotherFileList', newVal,props.preview,props.formData.fileList)
|
})
|
||||||
// if (props.formData.fileList === null || props.formData.fileList?.length === 0) {
|
const applyForm = ref()
|
||||||
// allFileList.value = newVal
|
const singleFile = ref({})
|
||||||
// } else {
|
const isSingleFile = ref(false)
|
||||||
// console.log('props.otherFileList',props.otherFileList)
|
const isHaveOneFile = ref(false)
|
||||||
// // props.otherFileList?.forEach(item => {
|
const allFileList = ref([])
|
||||||
// // allFileList.value.push(item)
|
if (localStorage.getItem('singleFile')) {
|
||||||
// // })
|
singleFileArray.value.push(JSON.parse(localStorage.getItem('singleFile')))
|
||||||
// }
|
singleFile.value = JSON.parse(localStorage.getItem('singleFile'))
|
||||||
// } else {
|
}
|
||||||
// allFileList.value = newVal
|
|
||||||
// }
|
const filePreviewParam = ref({
|
||||||
// }, {deep: true})
|
fileUrl: '',
|
||||||
watch(() => props.showTable, (newVal) => {
|
fileName: '',
|
||||||
props.showTable = newVal
|
fileType: 'pdf'
|
||||||
}, {deep: true})
|
})
|
||||||
// watch(() => props.singleList, (newVal) => {
|
const filePreviewRef = ref()
|
||||||
// console.log('singleFile', newVal)
|
const filePreviewShow = ref(false)
|
||||||
// singleFileList.value = newVal
|
|
||||||
// }, {deep: true})
|
const _singleFileValue = computed({
|
||||||
watch(() => props.formData.singleFile, (newVal) => {
|
get() {
|
||||||
// console.log('singleFile', newVal)
|
return props.singleList;
|
||||||
singleFile.value = newVal
|
},
|
||||||
props.formData.singleFile=newVal
|
set(value) {
|
||||||
}, {deep: true})
|
emit('update:singleList', value)
|
||||||
watch(() => isSingleFile.value, (newVal) => {
|
}
|
||||||
isSingleFile.value = newVal
|
})
|
||||||
}, {deep: true})
|
const _otherFileListValue = computed({
|
||||||
watch(() => singleFile.value, (newVal) => {
|
get() {
|
||||||
singleFile.value = newVal
|
return props.otherFileList;
|
||||||
}, {deep: true})
|
},
|
||||||
const handleDelete = (row, type) => {
|
set(value) {
|
||||||
deleteFile(row.fileId).then(res => {
|
emit('update:otherFileList', value)
|
||||||
ElNotification({
|
}
|
||||||
title: '提示',
|
})
|
||||||
message: res.msg,
|
if (_otherFileListValue.value && _otherFileListValue.value.length > 0) {
|
||||||
type: res.code === 1000 ? 'success' : 'error'
|
isHaveOneFile.value = true
|
||||||
})
|
_otherFileListValue.value.forEach(item => {
|
||||||
if (res.code === 1000) {
|
allFileList.value.push(item)
|
||||||
if (type === 'single') {
|
})
|
||||||
_singleFileValue.value.splice(_singleFileValue.value.findIndex((item) => item.fileId === row.fileId), 1);
|
}
|
||||||
isSingleFile.value = false
|
// watch(() => props.showSingleTable, (newVal) => {
|
||||||
} else {
|
// props.showSingleTable = newVal
|
||||||
allFileList.value.splice(allFileList.value.findIndex((item) => item.fileId === row.fileId), 1);
|
// }, {deep: true})
|
||||||
}
|
watch(() => props.formData.fileList, (newVal) => {
|
||||||
}
|
if (props.preview) {
|
||||||
});
|
newVal?.forEach(item => {
|
||||||
}
|
isHaveOneFile.value = true
|
||||||
const handleSingleDelete = (row) => {
|
allFileList.value.push(item)
|
||||||
// console.log('row',row)
|
})
|
||||||
// fileUploadRef.value.handleRemove(deleteFileVal.value.id)
|
}
|
||||||
handleDelete(row, 'single')
|
}, {immediate: true})
|
||||||
}
|
|
||||||
const getAttachment = (val) => {
|
watch(() => props.formData.singleFile, (newVal) => {
|
||||||
// console.log('getAttachment', val)
|
props.formData.singleFile = newVal
|
||||||
isSingleFile.value = true
|
if (newVal != null) {
|
||||||
// deleteFileVal.value=val
|
singleFileArray.value.push(newVal)
|
||||||
emit('getAttachment', val)
|
} else {
|
||||||
}
|
singleFileArray.value = []
|
||||||
const compositeParam = (item) => {
|
}
|
||||||
return {
|
singleFile.value = newVal
|
||||||
fileId: item.id,
|
}, {immediate: true})
|
||||||
size: item.size,
|
|
||||||
originalFileName: item.originalFilename,
|
|
||||||
fileType: item.fileType,
|
// watch(() => props.otherFileList, (newVal) => {
|
||||||
url: item.url,
|
// props.otherFileList=newVal
|
||||||
newFile: true,
|
// if (props.preview) {
|
||||||
tag: props.tag
|
// console.log('newotherFileList', newVal,props.preview,props.formData.fileList)
|
||||||
}
|
// if (props.formData.fileList === null || props.formData.fileList?.length === 0) {
|
||||||
}
|
// allFileList.value = newVal
|
||||||
const getOtherFile = (val) => {
|
// } else {
|
||||||
if (props.preview) {
|
// console.log('props.otherFileList',props.otherFileList)
|
||||||
allFileList.value.push(compositeParam(val))
|
// // props.otherFileList?.forEach(item => {
|
||||||
} else {
|
// // allFileList.value.push(item)
|
||||||
allFileList.value = _otherFileListValue.value
|
// // })
|
||||||
}
|
// }
|
||||||
emit('getOtherFile', val)
|
// } else {
|
||||||
}
|
// allFileList.value = newVal
|
||||||
const deleteAttachment = (val) => {
|
// }
|
||||||
deleteFile(val).then(res => {
|
// }, {deep: true})
|
||||||
if (res.code === 1000) {
|
watch(() => props.showTable, (newVal) => {
|
||||||
ElNotification({
|
props.showTable = newVal
|
||||||
title: '提示',
|
}, {deep: true})
|
||||||
message: "删除成功",
|
// watch(() => props.singleList, (newVal) => {
|
||||||
type: 'success'
|
// console.log('singleFile', newVal)
|
||||||
})
|
// singleFileList.value = newVal
|
||||||
isSingleFile.value = false
|
// }, {deep: true})
|
||||||
singleFile.value = null
|
|
||||||
}
|
watch(() => isSingleFile.value, (newVal) => {
|
||||||
});
|
isSingleFile.value = newVal
|
||||||
}
|
}, {deep: true})
|
||||||
const deleteSingleFile = (row, type) => {
|
watch(() => isHaveOneFile.value, (newVal) => {
|
||||||
ElMessageBox.confirm(`确认删除名称为${row.originalFileName}的文件吗?`, '系统提示', {
|
isHaveOneFile.value = newVal
|
||||||
confirmButtonText: '确定',
|
}, {deep: true})
|
||||||
cancelButtonText: '取消',
|
// watch(() => singleFile.value, (newVal) => {
|
||||||
type: 'warning'
|
// singleFile.value = newVal
|
||||||
}).then(() => {
|
// }, {deep: true})
|
||||||
deleteFile(row.fileId).then(res => {
|
|
||||||
ElNotification({
|
|
||||||
title: '提示',
|
const handleImportTemplateDownload = async () => {
|
||||||
message: res.msg,
|
console.info("🚀 ~method:handleImportTemplateDownload -----", props.tag)
|
||||||
type: res.code === 1000 ? 'success' : 'error'
|
let templateType = ''
|
||||||
})
|
let templateTypeList = ''
|
||||||
if (res.code === 1000) {
|
let isZip = false
|
||||||
isSingleFile.value = false
|
if (props.tag === '需求上报') {
|
||||||
if (type === 1) {
|
templateType = '2'
|
||||||
singleFile.value = null
|
isZip = false
|
||||||
} else {
|
} else if (props.tag === '项目立项') {
|
||||||
props.otherFileList.splice(props.otherFileList.findIndex((item) => item.fileId === row.fileId), 1);
|
templateTypeList = '5,6'
|
||||||
}
|
isZip = true
|
||||||
}
|
} else if (props.tag === '项目验收') {
|
||||||
});
|
templateType = '7'
|
||||||
}).catch(() => {
|
isZip = false
|
||||||
ElNotification({
|
} else if (props.tag === '阶段变更') {
|
||||||
title: '提示',
|
templateTypeList = '8,9'
|
||||||
message: "用户取消删除! ",
|
isZip = true
|
||||||
type: 'warning'
|
}
|
||||||
})
|
let res = ''
|
||||||
})
|
if (isZip) {
|
||||||
}
|
res = await downloadTemplateZip(templateTypeList)
|
||||||
const handleDownload = (row) => {
|
let fileName = props.templateName +'.zip'
|
||||||
downloadFile(row.fileId).then(res => {
|
const blob = new Blob([res.data])
|
||||||
const blob = new Blob([res])
|
let a = document.createElement('a')
|
||||||
let a = document.createElement('a')
|
a.href = URL.createObjectURL(blob)
|
||||||
a.href = URL.createObjectURL(blob)
|
a.download = fileName
|
||||||
a.download = row.originalFileName
|
a.click()
|
||||||
a.click()
|
} else {
|
||||||
})
|
res = await downloadTemplate(templateType)
|
||||||
}
|
const blob = new Blob([res])
|
||||||
defineExpose({
|
let a = document.createElement('a')
|
||||||
validate() {
|
a.href = URL.createObjectURL(blob)
|
||||||
return applyForm.value.validate()
|
a.download = props.templateName + ".docx"
|
||||||
},
|
a.click()
|
||||||
clearValidate() {
|
}
|
||||||
return applyForm.value.clearValidate()
|
|
||||||
},
|
}
|
||||||
allFileList,
|
|
||||||
singleFile,
|
|
||||||
isSingleFile
|
const clickToPreview = (row) => {
|
||||||
})
|
filePreviewShow.value = false
|
||||||
</script>
|
console.log('clickToPreview', row, row.fileType)
|
||||||
|
filePreviewParam.value = {
|
||||||
<style scoped>
|
fileUrl: row.url,
|
||||||
:deep(.el-table--fit ) {
|
fileName: row.originalFileName,
|
||||||
height: 300px !important;
|
fileType: row.fileType
|
||||||
}
|
}
|
||||||
</style>
|
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>
|
<template>
|
||||||
<el-button color="#DED0B2" style="float: right;margin: 0 10px 10px 0" @click="exportExcelHandler">导出</el-button>
|
<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
|
<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'}">
|
:summary-method="getSummaries" v-loading="loading" :header-cell-style="{background:'#f5f7fa'}">
|
||||||
<el-table-column type="index" label="序号" align="center" width="60"/>
|
<el-table-column type="index" label="序号" align="center" width="60"/>
|
||||||
<el-table-column prop="projectName" label="项目名称" align="center"/>
|
<el-table-column prop="projectName" label="项目名称" align="center"/>
|
||||||
<el-table-column prop="projectCost" label="费用性质" align="center">
|
<el-table-column prop="projectCost" label="费用性质" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<div v-if="scope.row.projectCost !== null">
|
<div v-if="scope.row.projectCost !== null">
|
||||||
<Tag dictType="project_cost" :value="scope.row.projectCost"/>
|
<Tag dictType="project_cost" :value="scope.row.projectCost"/>
|
||||||
</div>
|
</div>
|
||||||
<div v-else>--</div>
|
<div v-else>--</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="researchStage" label="研发阶段" align="center">
|
<el-table-column prop="researchStage" label="研发阶段" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<div v-if="scope.row.researchStage !== null && scope.row.researchStage !== null && scope.row.researchStage !== undefined">
|
<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>
|
<el-tag effect="plain">{{scope.row.researchStage==1?'开发阶段':'研究阶段'}}</el-tag>
|
||||||
</div>
|
</div>
|
||||||
<div v-else>--</div>
|
<div v-else>--</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="afterTax" label="分摊金额" align="center">
|
<el-table-column prop="afterTax" label="分摊金额" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<div v-if="scope.row.afterTax !== null">
|
<div v-if="scope.row.afterTax !== null">
|
||||||
<!-- {{ toThousands(scope.row.afterTax) }}-->
|
<!-- {{ toThousands(scope.row.afterTax) }}-->
|
||||||
{{ scope.row.afterTax }}
|
{{ scope.row.afterTax }}
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
|
||||||
<!-- <Tag dictType="research_stage" :value="scope.row.researchStage"/>-->
|
<!-- <Tag dictType="research_stage" :value="scope.row.researchStage"/>-->
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import {getAllocationSummaryDetails} from "@/api/expense-manage";
|
import {getAllocationSummaryDetails} from "@/api/expense-manage";
|
||||||
import {shareExportExcel} from "@/api/expense-manage";
|
import {shareExportExcel} from "@/api/expense-manage";
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
allocationName :{
|
allocationName :{
|
||||||
type: String,
|
type: String,
|
||||||
default: ''
|
default: ''
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const tableData = ref()
|
const tableData = ref()
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
const table = ref()
|
const table = ref()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const getSummaries = (param) => {
|
const getSummaries = (param) => {
|
||||||
const {columns, data} = param
|
const {columns, data} = param
|
||||||
const sums = []
|
const sums = []
|
||||||
columns.forEach((column, index) => {
|
columns.forEach((column, index) => {
|
||||||
if (index === 0) {
|
if (index === 0) {
|
||||||
sums[index] = '小计'
|
sums[index] = '小计'
|
||||||
} else if (index === 4) {
|
} else if (index === 4) {
|
||||||
const values = data.map((item) => Number(item[column.property]))
|
const values = data.map((item) => Number(item[column.property]))
|
||||||
if (!values.every((value) => Number.isNaN(value))) {
|
if (!values.every((value) => Number.isNaN(value))) {
|
||||||
sums[index] = `${values.reduce((prev, curr) => {
|
sums[index] = `${values.reduce((prev, curr) => {
|
||||||
const value = Number(curr)
|
const value = Number(curr)
|
||||||
if (!Number.isNaN(value)) {
|
if (!Number.isNaN(value)) {
|
||||||
return prev + curr
|
return prev + curr
|
||||||
} else {
|
} else {
|
||||||
return prev
|
return prev
|
||||||
}
|
}
|
||||||
}, 0)}`
|
}, 0)}`
|
||||||
sums[index] = parseFloat(sums[index]).toFixed(2)
|
sums[index] = parseFloat(sums[index]).toFixed(2)
|
||||||
// sums[index] = toThousands(sums[index])
|
// sums[index] = toThousands(sums[index])
|
||||||
} else {
|
} else {
|
||||||
sums[index] = '-'
|
sums[index] = '-'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
return sums
|
return sums
|
||||||
}
|
}
|
||||||
// const exportTable = () => {
|
// const exportTable = () => {
|
||||||
// const $e = table.value.$el
|
// const $e = table.value.$el
|
||||||
// let $table = $e.querySelector('.el-table__fixed')
|
// let $table = $e.querySelector('.el-table__fixed')
|
||||||
// if (!$table) {
|
// if (!$table) {
|
||||||
// $table = $e
|
// $table = $e
|
||||||
// }
|
// }
|
||||||
// exportExcel($table, (5 + (Object.keys(tableData.value[0]).length - 5) * 5), "四川省国有资产经营投资管理有限责任公司科技创新项目费用分摊表", 2)
|
// exportExcel($table, (5 + (Object.keys(tableData.value[0]).length - 5) * 5), "四川省国有资产经营投资管理有限责任公司科技创新项目费用分摊表", 2)
|
||||||
// }
|
// }
|
||||||
const exportExcelHandler = () => {
|
const exportExcelHandler = () => {
|
||||||
shareExportExcel(route.query.id).then(res => {
|
shareExportExcel(route.query.id).then(res => {
|
||||||
console.log(res)
|
let fileName = `科技创新项目费用分摊表-${props.allocationName}.zip`
|
||||||
let fileName = `科技创新项目费用分摊表-${props.allocationName}.zip`
|
const blob = new Blob([res.data])
|
||||||
const blob = new Blob([res.data])
|
let a = document.createElement('a')
|
||||||
let a = document.createElement('a')
|
a.href = URL.createObjectURL(blob)
|
||||||
a.href = URL.createObjectURL(blob)
|
a.download = fileName
|
||||||
a.download = fileName
|
a.click()
|
||||||
a.click()
|
})
|
||||||
})
|
}
|
||||||
}
|
const init = () => {
|
||||||
const init = () => {
|
loading.value = true
|
||||||
loading.value = true
|
let params = {
|
||||||
let params = {
|
allocationId: route.query.id
|
||||||
allocationId: route.query.id
|
}
|
||||||
}
|
getAllocationSummaryDetails(params).then(res => {
|
||||||
getAllocationSummaryDetails(params).then(res => {
|
tableData.value = res.data
|
||||||
tableData.value = res.data
|
loading.value = false
|
||||||
loading.value = false
|
})
|
||||||
})
|
}
|
||||||
}
|
init()
|
||||||
init()
|
</script>
|
||||||
</script>
|
|
||||||
|
<style scoped>
|
||||||
<style scoped>
|
|
||||||
|
</style>
|
||||||
</style>
|
|
||||||
|
|||||||
@@ -1,194 +1,208 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-loading="loading">
|
<div v-loading="loading" :style="type==='singleDetail'?'padding: 0 30px':''">
|
||||||
<baseTitle title="需求征集信息" v-if="type!=='singleDetail'"></baseTitle>
|
<baseTitle title="需求征集信息" v-if="type!=='singleDetail'"></baseTitle>
|
||||||
<el-form :model="formData">
|
<el-form :model="formData" >
|
||||||
<el-row>
|
<el-row gutter="20" style="margin-left: 5px">
|
||||||
<el-col :span="6" v-if="type==='singleDetail'">
|
<el-col :span="6">
|
||||||
<el-form-item label="征集名称">
|
<el-form-item label="征集名称">
|
||||||
<span>{{ formData.requirementName }}</span>
|
<span>{{ formData.requirementName }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="征集类型">
|
<el-form-item label="征集类型">
|
||||||
<span>{{ formData.collectType }}</span>
|
<span>{{ formData.collectType }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="需求上报截止时间">
|
<el-form-item label="需求上报截止时间">
|
||||||
<span>{{ formData.deadline }}</span>
|
<span>{{ formData.deadline }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6" v-if="formData.isSpecialFund">
|
<el-col :span="6" v-if="formData.isSpecialFund">
|
||||||
<el-form-item label="专项资金名称">
|
<el-form-item label="专项资金名称">
|
||||||
<span>{{ formData.specialFund }}</span>
|
<span>{{ formData.specialFund }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="24" v-if="type==='singleDetail'">
|
<el-col :span="24" v-if="type==='singleDetail'">
|
||||||
<el-form-item label="征集公司">
|
<el-form-item label="征集公司">
|
||||||
<span :class="showExpendClass(showMoreCompany,formData.companyIds)">{{
|
<span :class="showExpendClass(showMoreCompany,formData.companyIds)">{{
|
||||||
getCompanyName(formData.companyIds)
|
getCompanyName(formData.companyIds)
|
||||||
}}</span>
|
}}</span>
|
||||||
<div style="color: #2a99ff;text-align: center;width: 100%;font-size: 15px;cursor: pointer"
|
<div style="color: #2a99ff;text-align: center;width: 100%;font-size: 15px;cursor: pointer"
|
||||||
@click="handleExpend">{{ showExpendText }}
|
@click="handleExpend">{{ showExpendText }}
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
<el-col :span="24" style="margin-bottom: -15px">
|
||||||
<el-col :span="24">
|
<el-form-item label="征集说明">
|
||||||
<baseTitle title="征集说明"></baseTitle>
|
<div v-if="formData.collectExplain" v-html="formData.collectExplain" style="white-space: pre-wrap;">
|
||||||
<el-form-item>
|
</div>
|
||||||
<el-card style="width: 100%">
|
<div v-else>--</div>
|
||||||
<div v-html="formData.collectExplain">
|
</el-form-item>
|
||||||
</div>
|
</el-col>
|
||||||
</el-card>
|
</el-row>
|
||||||
</el-form-item>
|
<el-row>
|
||||||
</el-col>
|
<el-col :span="24">
|
||||||
<baseTitle v-if="fileListShow === 'READ' || fileListShow === 'EDIT'" title="附件列表"></baseTitle>
|
<baseTitle v-if="fileListShow === 'READ' || fileListShow === 'EDIT'" title="附件文件" style="margin-bottom: 0"></baseTitle>
|
||||||
<el-col :span="24">
|
<file-component title="" tag="需求征集"
|
||||||
<file-component title="" tag="需求征集"
|
v-model:value="formData.fileList" :processViewer="processViewer"
|
||||||
v-model:value="formData.fileList" :processViewer="processViewer"
|
:file-list-show="fileListShow"/>
|
||||||
:file-list-show="fileListShow"/>
|
</el-col>
|
||||||
</el-col>
|
<el-col :span="24" style="margin-top: -15px">
|
||||||
<el-col :span="24">
|
<div v-if="data.taskId">
|
||||||
<div v-if="data.taskId">
|
<baseTitle title="审核意见"></baseTitle>
|
||||||
<baseTitle title="审核意见"></baseTitle>
|
<el-form-item prop="_value">
|
||||||
<el-form-item prop="_value">
|
<el-input
|
||||||
<el-input
|
v-model="_value"
|
||||||
v-model="_value"
|
:rows="3"
|
||||||
:rows="3"
|
type="textarea"
|
||||||
type="textarea"
|
placeholder="请输入审核意见"
|
||||||
placeholder="请输入审核意见"
|
/>
|
||||||
/>
|
</el-form-item>
|
||||||
</el-form-item>
|
</div>
|
||||||
</div>
|
</el-col>
|
||||||
</el-col>
|
</el-row>
|
||||||
</el-row>
|
<div class="approval-record" style="margin-top: -15px">
|
||||||
<div class="approval-record">
|
<div class="approval-title">
|
||||||
<div class="approval-title">
|
<baseTitle title="审批记录"></baseTitle>
|
||||||
<baseTitle title="审批记录"></baseTitle>
|
<div class="diagram">
|
||||||
<div class="diagram">
|
<div class="base-title">流程图</div>
|
||||||
<div class="base-title">流程图</div>
|
<el-switch
|
||||||
<el-switch
|
v-model="changeDiagram"
|
||||||
v-model="changeDiagram"
|
style="--el-switch-on-color:#BEA266; --el-switch-off-color:#cecdcd"
|
||||||
style="--el-switch-on-color:#BEA266; --el-switch-off-color:#cecdcd"
|
/>
|
||||||
/>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="process">
|
||||||
<div class="process">
|
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
|
||||||
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
|
:operation-list="data.operationList"
|
||||||
:operation-list="data.operationList"
|
:state="data.state"/>
|
||||||
:state="data.state"/>
|
<process-diagram-viewer v-if="processViewer&&changeDiagram" id-name="collectionProcess"/>
|
||||||
<process-diagram-viewer v-if="processViewer&&changeDiagram" id-name="collectionProcess"/>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</el-form>
|
||||||
</el-form>
|
</div>
|
||||||
</div>
|
</template>
|
||||||
</template>
|
|
||||||
|
<script setup lang="jsx">
|
||||||
<script setup lang="jsx">
|
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
||||||
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'
|
||||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'
|
import {downloadFile} from "@/api/project-demand";
|
||||||
import {downloadFile} from "@/api/project-demand";
|
|
||||||
|
const emit = defineEmits(['update:value'])
|
||||||
const emit = defineEmits(['update:value'])
|
const showExpendText = ref('')
|
||||||
const showExpendText = ref('')
|
const showMoreCompany = ref(false)
|
||||||
const showMoreCompany = ref(false)
|
const props = defineProps({
|
||||||
const props = defineProps({
|
formData: {
|
||||||
formData: {
|
type: Array,
|
||||||
type: Array,
|
default: []
|
||||||
default: []
|
},
|
||||||
},
|
data: {
|
||||||
data: {
|
type: Array,
|
||||||
type: Array,
|
default: []
|
||||||
default: []
|
},
|
||||||
},
|
processViewer: {
|
||||||
processViewer: {
|
type: Boolean,
|
||||||
type: Boolean,
|
default: false
|
||||||
default: false
|
},
|
||||||
},
|
companyOption: {
|
||||||
companyOption: {
|
type: Array,
|
||||||
type: Array,
|
default: []
|
||||||
default: []
|
},
|
||||||
},
|
loading: {
|
||||||
loading: {
|
type: Boolean,
|
||||||
type: Boolean,
|
default: false
|
||||||
default: false
|
},
|
||||||
},
|
fileListShow: {
|
||||||
fileListShow: {
|
type: String,
|
||||||
type: String,
|
default: ''
|
||||||
default: ''
|
},
|
||||||
},
|
type: {
|
||||||
type: {
|
type: String,
|
||||||
type: String,
|
default: ''
|
||||||
default: ''
|
},
|
||||||
},
|
value: {
|
||||||
value: {
|
type: String,
|
||||||
type: String,
|
default: ''
|
||||||
default: ''
|
}
|
||||||
}
|
})
|
||||||
})
|
const changeDiagram = ref(false)
|
||||||
const changeDiagram = ref(false)
|
const _value = computed({
|
||||||
const _value = computed({
|
get() {
|
||||||
get() {
|
return props.value;
|
||||||
return props.value;
|
},
|
||||||
},
|
set(val) {
|
||||||
set(val) {
|
emit("update:value", val);
|
||||||
emit("update:value", val);
|
}
|
||||||
}
|
})
|
||||||
})
|
const getCompanyName = (data) => {
|
||||||
const getCompanyName = (data) => {
|
if (data) {
|
||||||
if (data) {
|
return data.join(',')
|
||||||
return data.join(',')
|
}
|
||||||
}
|
}
|
||||||
}
|
const handleExpend = () => {
|
||||||
const handleExpend = () => {
|
showMoreCompany.value = !showMoreCompany.value;
|
||||||
showMoreCompany.value = !showMoreCompany.value;
|
showExpendClass(showMoreCompany.value, props.formData.companyIds)
|
||||||
showExpendClass(showMoreCompany.value, props.formData.companyIds)
|
}
|
||||||
}
|
const showExpendClass = (showMoreCompany, data) => {
|
||||||
const showExpendClass = (showMoreCompany, data) => {
|
if (!showMoreCompany) {
|
||||||
if (!showMoreCompany) {
|
if (data && data.length > 14) {
|
||||||
if (data && data.length > 14) {
|
showExpendText.value = '展开'
|
||||||
showExpendText.value = '展开'
|
return 'company-style'
|
||||||
return 'company-style'
|
}
|
||||||
}
|
} else {
|
||||||
} else {
|
showExpendText.value = '收缩'
|
||||||
showExpendText.value = '收缩'
|
return ''
|
||||||
return ''
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
const handleDownload = (row) => {
|
||||||
const handleDownload = (row) => {
|
downloadFile(row.fileId).then(res => {
|
||||||
downloadFile(row.fileId).then(res => {
|
const blob = new Blob([res])
|
||||||
const blob = new Blob([res])
|
let a = document.createElement('a')
|
||||||
let a = document.createElement('a')
|
a.href = URL.createObjectURL(blob)
|
||||||
a.href = URL.createObjectURL(blob)
|
a.download = row.originalFileName
|
||||||
a.download = row.originalFileName
|
a.click()
|
||||||
a.click()
|
})
|
||||||
})
|
}
|
||||||
}
|
|
||||||
|
watch(() => props.loading, (newVal) => {
|
||||||
watch(() => props.loading, (newVal) => {
|
props.loading = newVal
|
||||||
props.loading = newVal
|
}, {deep: true})
|
||||||
}, {deep: true})
|
|
||||||
|
watch(() => props.processViewer, (newVal) => {
|
||||||
watch(() => props.processViewer, (newVal) => {
|
props.processViewer = newVal
|
||||||
props.processViewer = newVal
|
}, {deep: true})
|
||||||
}, {deep: true})
|
</script>
|
||||||
</script>
|
|
||||||
|
<style scoped lang="scss">
|
||||||
<style scoped lang="scss">
|
:deep(.el-empty__description) {
|
||||||
:deep(.el-empty__description) {
|
margin-top: 0;
|
||||||
margin-top: 0;
|
}
|
||||||
}
|
|
||||||
|
.company-style {
|
||||||
.company-style {
|
//width: 98%;
|
||||||
//width: 98%;
|
min-height: 30px;
|
||||||
min-height: 30px;
|
max-height: 60px;
|
||||||
max-height: 60px;
|
overflow: hidden;
|
||||||
overflow: hidden;
|
text-overflow: ellipsis;
|
||||||
text-overflow: ellipsis;
|
-webkit-line-clamp: 2;
|
||||||
-webkit-line-clamp: 2;
|
display: -webkit-box;
|
||||||
display: -webkit-box;
|
-webkit-box-orient: vertical;
|
||||||
-webkit-box-orient: vertical;
|
}
|
||||||
}
|
:deep(.el-table__header) {
|
||||||
</style>
|
.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>
|
<template>
|
||||||
<el-dialog custom-class="custom-dialog" class="border" :border="false" width="1000px" style="height: 676px"
|
<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">
|
: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="picker">
|
||||||
<div class="candidate" v-loading="loading">
|
<div class="candidate" v-loading="loading">
|
||||||
<el-input v-model="filterText"
|
<el-input v-model="filterText"
|
||||||
clearable placeholder="输入公司进行搜索">
|
clearable placeholder="输入公司进行搜索">
|
||||||
<template #append>
|
<template #append>
|
||||||
<el-button @click="getList()">搜索</el-button>
|
<el-button @click="getList()">搜索</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-input>
|
</el-input>
|
||||||
<fvCheckbox style="margin-left: 10px" :options="checkOptions" v-model="checkList" @change="checkBoxChange"/>
|
<fvCheckbox style="margin-left: 10px" :options="checkOptions" v-model="checkList" @change="checkBoxChange"/>
|
||||||
<!-- 人员选择 -->
|
<!-- 人员选择 -->
|
||||||
<el-empty :image-size="100" description="似乎没有数据" v-show="dataList.length === 0"/>
|
<el-empty :image-size="100" description="似乎没有数据" v-show="dataList.length === 0"/>
|
||||||
<el-scrollbar style="height:87%;">
|
<el-scrollbar style="height:87%;">
|
||||||
<div class="tree">
|
<div class="tree">
|
||||||
<el-tree :data="dataList" ref="tree" :props="defaultProps" empty-text="" node-key="value"
|
<el-tree :data="dataList" ref="tree" :props="defaultProps" empty-text="" node-key="value"
|
||||||
:show-checkbox="showCheckbox" highlight-current default-expand-all
|
:show-checkbox="showCheckbox" highlight-current default-expand-all
|
||||||
:default-checked-keys="defaultChecked" :disabled="disabled"
|
:default-checked-keys="defaultChecked" :disabled="disabled"
|
||||||
:check-strictly="!checkStrictly" @node-click="(node,check)=>handle(node,check)"
|
:check-strictly="!checkStrictly" @node-click="(node,check)=>handleNodeClick(node,check)"
|
||||||
@check-change="handleChange" :filter-node-method="filterNode">
|
@check-change="handleCheckClick" :filter-node-method="filterNode">
|
||||||
<template #default="{ node, data }">
|
<template #default="{ node, data }">
|
||||||
<div class="tree-node">
|
<div class="tree-node">
|
||||||
<div style="display: flex;align-items: center;padding: 3px 0">
|
<div style="display: flex;align-items: center;padding: 3px 0">
|
||||||
{{ node.label }}
|
{{ node.label }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-tree>
|
</el-tree>
|
||||||
</div>
|
</div>
|
||||||
</el-scrollbar>
|
</el-scrollbar>
|
||||||
</div>
|
</div>
|
||||||
<div class="selected">
|
<div class="selected">
|
||||||
<div class="count">
|
<div class="count">
|
||||||
<span>已选 {{ selectList.length }} 项</span>
|
<span>已选 {{ selectList.length }} 项</span>
|
||||||
<span @click="clearSelected">清空</span>
|
<span @click="clearSelected">清空</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="org-items">
|
<div class="org-items">
|
||||||
<el-empty :image-size="100" description="请点击左侧列表选择数据" v-show="selectList.length === 0"/>
|
<el-empty :image-size="100" description="请点击左侧列表选择数据" v-show="selectList.length === 0"/>
|
||||||
<div v-for="(selectItem, selectIndex) in selectList" :key="selectIndex" class="org-item">
|
<div v-for="(selectItem, selectIndex) in selectList" :key="selectIndex" class="org-item">
|
||||||
{{ selectItem.label }}
|
{{ selectItem.label }}
|
||||||
<el-icon @click="noSelected(selectItem)" size="20" style="margin-left: 10px;cursor: pointer;">
|
<el-icon @click="removeSingleSelected(selectItem)" size="20" style="margin-left: 10px;cursor: pointer;">
|
||||||
<CircleClose/>
|
<CircleClose/>
|
||||||
</el-icon>
|
</el-icon>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<el-button size="mini" @click="visible = false">取 消</el-button>
|
<el-button size="mini" @click="cancelUserPicker">取 消</el-button>
|
||||||
<el-button size="mini" color="#DED0B2" @click="selectConfirm">确 定</el-button>
|
<el-button size="mini" color="#DED0B2" @click="selectConfirm">确 定</el-button>
|
||||||
</div>
|
</div>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import {ElMessageBox} from "element-plus";
|
import {ElMessageBox} from "element-plus";
|
||||||
import {getSubCompOpt} from "@/api/user/user";
|
import {getSubCompOpt} from "@/api/user/user";
|
||||||
|
|
||||||
const checkList = ref(['1'])
|
const checkList = ref(['1'])
|
||||||
const checkStrictly = ref(false)
|
const checkStrictly = ref(false)
|
||||||
const isExpand = ref('展开')
|
const isExpand = ref('展开')
|
||||||
const expandedKeys = ref(['-1']);
|
const expandedKeys = ref(['-1']);
|
||||||
const checkOptions = ref([
|
const checkOptions = ref([
|
||||||
{
|
{
|
||||||
label: isExpand.value,
|
label: isExpand.value,
|
||||||
value: '1'
|
value: '1'
|
||||||
},
|
},
|
||||||
// {
|
// {
|
||||||
// label: '父子联动',
|
// label: '父子联动',
|
||||||
// value: '2'
|
// value: '2'
|
||||||
// },
|
// },
|
||||||
])
|
])
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
value: {
|
value: {
|
||||||
type: Array,
|
type: Array,
|
||||||
default: () => {
|
default: () => {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
multiple: { //是否多选
|
multiple: { //是否多选
|
||||||
default: true,
|
default: true,
|
||||||
type: Boolean
|
type: Boolean
|
||||||
},
|
},
|
||||||
showCheckbox: { //是否显示左侧选择框
|
showCheckbox: { //是否显示左侧选择框
|
||||||
default: true,
|
default: true,
|
||||||
type: Boolean
|
type: Boolean
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
let selectItem = reactive({
|
let selectItem = reactive({
|
||||||
type: -1,
|
type: -1,
|
||||||
value: "0"
|
value: "0"
|
||||||
});
|
});
|
||||||
const visible = ref(false);
|
const visible = ref(false);
|
||||||
const loading = ref(false);
|
const loading = ref(false);
|
||||||
const title = ref("请选择");
|
const title = ref("请选择");
|
||||||
const selectList = ref([]);
|
const selectList = ref([]);
|
||||||
const filterText = ref("");
|
const filterText = ref("");
|
||||||
const dataList = ref([]);
|
const dataList = ref([]);
|
||||||
const defaultChecked = ref([]);
|
const defaultChecked = ref([]);
|
||||||
const tree = ref([]);
|
const tree = ref([]);
|
||||||
const defaultProps = {
|
const defaultProps = {
|
||||||
value: "value",
|
value: "value",
|
||||||
label: "label",
|
label: "label",
|
||||||
children: "children",
|
children: "children",
|
||||||
disabled: "disabled",
|
disabled: "disabled",
|
||||||
};
|
};
|
||||||
const emit = defineEmits(['update:modelValue'])
|
|
||||||
const _value = computed({
|
const isRemoveSingleSelected = ref(false);
|
||||||
get() {
|
const emit = defineEmits(['update:modelValue'])
|
||||||
return props.value;
|
const _value = computed({
|
||||||
},
|
get() {
|
||||||
set(value) {
|
return props.value;
|
||||||
emit('update:modelValue', value)
|
},
|
||||||
}
|
set(value) {
|
||||||
});
|
emit('update:modelValue', value)
|
||||||
|
}
|
||||||
watch(() => filterText.value, (newVal) => {
|
});
|
||||||
tree.value.filter(newVal);
|
|
||||||
});
|
watch(() => filterText.value, (newVal) => {
|
||||||
const closeDialog=()=>{
|
tree.value.filter(newVal);
|
||||||
console.log('关闭')
|
});
|
||||||
visible.value=false
|
const closeDialog=()=>{
|
||||||
filterText.value=''
|
console.log('关闭')
|
||||||
}
|
visible.value=false
|
||||||
const checkBoxChange = (val) => {
|
filterText.value=''
|
||||||
checkStrictly.value = val.includes('2')
|
}
|
||||||
let nodes = tree.value.store.nodesMap
|
const checkBoxChange = (val) => {
|
||||||
if (val.includes('1')) {
|
checkStrictly.value = val.includes('2')
|
||||||
for (const node in nodes) {
|
let nodes = tree.value.store.nodesMap
|
||||||
nodes[node].expanded = true;
|
if (val.includes('1')) {
|
||||||
}
|
for (const node in nodes) {
|
||||||
isExpand.value = '折叠'
|
nodes[node].expanded = true;
|
||||||
} else {
|
}
|
||||||
for (const node in nodes) {
|
isExpand.value = '折叠'
|
||||||
nodes[node].expanded = false;
|
} else {
|
||||||
}
|
for (const node in nodes) {
|
||||||
isExpand.value = '展开'
|
nodes[node].expanded = false;
|
||||||
}
|
}
|
||||||
}
|
isExpand.value = '展开'
|
||||||
const getList = () => {
|
}
|
||||||
getSubCompOpt().then(res => {
|
}
|
||||||
dataList.value = [
|
const getList = () => {
|
||||||
{
|
getSubCompOpt().then(res => {
|
||||||
label: "所有公司",
|
dataList.value = [
|
||||||
value: -1,
|
{
|
||||||
},
|
label: "所有公司",
|
||||||
...res.data
|
value: -1,
|
||||||
]
|
},
|
||||||
});
|
...res.data
|
||||||
};
|
]
|
||||||
|
});
|
||||||
//通过关键字过滤树节点
|
};
|
||||||
const filterNode = (value, data) => {
|
|
||||||
//通过关键字过滤树节点
|
//通过关键字过滤树节点
|
||||||
if (!value) return true;
|
const filterNode = (value, data) => {
|
||||||
return data.label.indexOf(value) !== -1;
|
//通过关键字过滤树节点
|
||||||
};
|
if (!value) return true;
|
||||||
//用于用户选择
|
return data.label.indexOf(value) !== -1;
|
||||||
const show = () => {
|
};
|
||||||
//用于弹开部门选择
|
//用于用户选择
|
||||||
visible.value = true;
|
const show = () => {
|
||||||
selectList.value = _value.value
|
//用于弹开部门选择
|
||||||
defaultChecked.value = _value.value.map(item => item.value)
|
visible.value = true;
|
||||||
getList()
|
selectList.value = _value.value
|
||||||
};
|
defaultChecked.value = _value.value.map(item => item.value)
|
||||||
|
getList()
|
||||||
const updateTreeCheck = (list, flag) => {
|
};
|
||||||
list.forEach(item => {
|
|
||||||
if (item.value !== -1) {
|
const updateTreeCheck = (list, flag) => {
|
||||||
tree.value.setChecked(item, flag)
|
list.forEach(item => {
|
||||||
if (item.children !== undefined) {
|
if (item.value !== -1) {
|
||||||
updateTreeCheck(item.children, flag)
|
tree.value.setChecked(item, flag)
|
||||||
}
|
if (item.children !== undefined) {
|
||||||
}
|
updateTreeCheck(item.children, flag)
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
const handleChange = (data, checked) => {
|
})
|
||||||
if (data.value == -1) {
|
}
|
||||||
if(checked){
|
const handleCheckClick = (data, checked) => {
|
||||||
updateTreeCheck(dataList.value, false)
|
if (data.value == -1) {
|
||||||
tree.value.setChecked(data,true);
|
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(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 (props.multiple) {
|
||||||
if (selectList.value[i].value === data.value) {
|
//不添加重复的数据到右边
|
||||||
selectList.value.splice(i, 1);
|
for (let i = 0; i < selectList.value.length; i++) {
|
||||||
break;
|
if (selectList.value[i].value === data.value) {
|
||||||
}
|
selectList.value.splice(i, 1);
|
||||||
}
|
break;
|
||||||
if (checked) {
|
}
|
||||||
// if (data.children === undefined) {
|
}
|
||||||
selectList.value.push(data);
|
if (checked) {
|
||||||
// }
|
// if (data.children === undefined) {
|
||||||
} else if (data === "1") {
|
selectList.value.push(data);
|
||||||
tree.value.setCheckedKeys([]);
|
// }
|
||||||
selectList.value = [];
|
} else if (data === "1") {
|
||||||
}
|
tree.value.setCheckedKeys([]);
|
||||||
} else {// 左侧有选择框 + 单选
|
selectList.value = [];
|
||||||
//不添加重复的数据到右边
|
}
|
||||||
for (let i = 0; i < selectList.value.length; i++) {
|
} else {// 左侧有选择框 + 单选
|
||||||
if (selectList.value[i].value === data.value) {
|
//不添加重复的数据到右边
|
||||||
selectList.value.splice(i, 1);
|
for (let i = 0; i < selectList.value.length; i++) {
|
||||||
break;
|
if (selectList.value[i].value === data.value) {
|
||||||
}
|
selectList.value.splice(i, 1);
|
||||||
}
|
break;
|
||||||
if (checked) {
|
}
|
||||||
tree.value.setCheckedNodes([data]);
|
}
|
||||||
selectList.value = [data];
|
if (checked) {
|
||||||
} else if (data === "1") {
|
tree.value.setCheckedNodes([data]);
|
||||||
selectList.value = [];
|
selectList.value = [data];
|
||||||
tree.value.setCheckedKeys([]);
|
} else if (data === "1") {
|
||||||
}
|
selectList.value = [];
|
||||||
}
|
tree.value.setCheckedKeys([]);
|
||||||
};
|
}
|
||||||
const handle = (node, check) => {
|
}
|
||||||
if (check.isLeaf !== false) {
|
};
|
||||||
if (props.multiple) {
|
const handleNodeClick = (node, check) => {
|
||||||
//不添加重复的数据到右边
|
if (check.isLeaf !== false) {
|
||||||
for (let i = 0; i < selectList.value.length; i++) {
|
if (props.multiple) {
|
||||||
if (selectList.value[i].value === node.value) {
|
//不添加重复的数据到右边
|
||||||
selectList.value.splice(i, 1);
|
for (let i = 0; i < selectList.value.length; i++) {
|
||||||
break;
|
if (selectList.value[i].value === node.value) {
|
||||||
}
|
selectList.value.splice(i, 1);
|
||||||
}
|
break;
|
||||||
check.checked = true;
|
}
|
||||||
selectList.value.push(node);
|
}
|
||||||
} else {
|
check.checked = true;
|
||||||
check.checked = true;
|
selectList.value.push(node);
|
||||||
selectList.value = [node];
|
} else {
|
||||||
}
|
check.checked = true;
|
||||||
}
|
selectList.value = [node];
|
||||||
// _value.value = selectList.value
|
}
|
||||||
};
|
}
|
||||||
const noSelected = (selectItem) => {
|
// _value.value = selectList.value
|
||||||
//左侧无选择框时,右侧显示×
|
};
|
||||||
for (let i = 0; i < selectList.value.length; i++) {
|
const removeSingleSelected = (selectItem) => {
|
||||||
if (selectList.value[i].value === selectItem.value) {
|
//左侧无选择框时,右侧显示×
|
||||||
tree.value.setChecked(selectList.value[i].value, false);
|
for (let i = 0; i < selectList.value.length; i++) {
|
||||||
selectList.value.splice(i, 1);
|
if (selectList.value[i].value === selectItem.value) {
|
||||||
break;
|
tree.value.setChecked(selectList.value[i].value, false);
|
||||||
}
|
selectList.value.splice(i, 1);
|
||||||
}
|
break;
|
||||||
if (props.showCheckbox) {
|
}
|
||||||
// 左侧有选择框 + 单选
|
}
|
||||||
if (props.multiple === false) {
|
if (props.showCheckbox) {
|
||||||
tree.value.setCheckedKeys([]);
|
// 左侧有选择框 + 单选
|
||||||
}
|
if (props.multiple === false) {
|
||||||
}
|
tree.value.setCheckedKeys([]);
|
||||||
};
|
}
|
||||||
const clearSelected = () => {
|
}
|
||||||
//清空
|
// isRemoveSingleSelected.value = true
|
||||||
ElMessageBox.confirm("您确定要清空已选中的项?", "提示", {
|
};
|
||||||
confirmButtonText: "确定",
|
const clearSelected = () => {
|
||||||
cancelButtonText: "取消",
|
//清空
|
||||||
type: "warning"
|
ElMessageBox.confirm("您确定要清空已选中的项?", "提示", {
|
||||||
}).then(() => {
|
confirmButtonText: "确定",
|
||||||
if (!props.showCheckbox) {
|
cancelButtonText: "取消",
|
||||||
selectList.value = [];
|
type: "warning"
|
||||||
} else {
|
}).then(() => {
|
||||||
handleChange("1");
|
// isRemoveSingleSelected.value = true
|
||||||
}
|
if (!props.showCheckbox) {
|
||||||
});
|
selectList.value = [];
|
||||||
};
|
} else {
|
||||||
const selectConfirm = () => {
|
handleCheckClick("1");
|
||||||
//确定按钮
|
}
|
||||||
emit("ok", selectList.value);
|
});
|
||||||
dataList.value = []
|
};
|
||||||
visible.value = false;
|
const cancelUserPicker = () => {
|
||||||
};
|
if (localStorage.getItem('originallyCompanySelectedList')) {
|
||||||
defineExpose({
|
selectList.value = JSON.parse(localStorage.getItem('originallyCompanySelectedList'))
|
||||||
show
|
}else{
|
||||||
});
|
selectList.value=[]
|
||||||
getList()
|
handleCheckClick("1");
|
||||||
</script>
|
}
|
||||||
|
emit("cancelOrClear", selectList.value);
|
||||||
<style lang="scss" scoped>
|
visible.value = false;
|
||||||
$containWidth: 480px;
|
// nextTick(()=>{
|
||||||
:deep(.tree) {
|
// isRemoveSingleSelected.value=false
|
||||||
.el-tree-node__content {
|
// })
|
||||||
height: 34px;
|
}
|
||||||
|
const selectConfirm = () => {
|
||||||
.tree-node {
|
//确定按钮
|
||||||
font-size: 18px;
|
emit("ok", selectList.value);
|
||||||
}
|
dataList.value = []
|
||||||
}
|
visible.value = false;
|
||||||
|
localStorage.setItem('originallyCompanySelectedList', JSON.stringify(selectList.value))
|
||||||
//.el-tree-node {
|
};
|
||||||
// .is-leaf + .el-checkbox .el-checkbox__inner {
|
defineExpose({
|
||||||
// display: inline-block;
|
show
|
||||||
// }
|
});
|
||||||
//
|
getList()
|
||||||
// .el-checkbox .el-checkbox__inner {
|
</script>
|
||||||
// display: none;
|
|
||||||
// }
|
<style lang="scss" scoped>
|
||||||
//}
|
$containWidth: 480px;
|
||||||
}
|
:deep(.tree) {
|
||||||
|
.el-tree-node__content {
|
||||||
.footer {
|
height: 34px;
|
||||||
float: right;
|
|
||||||
margin-top: 10px;
|
.tree-node {
|
||||||
}
|
font-size: 18px;
|
||||||
|
}
|
||||||
.picker {
|
}
|
||||||
height: 560px;
|
|
||||||
position: relative;
|
//.el-tree-node {
|
||||||
text-align: left;
|
// .is-leaf + .el-checkbox .el-checkbox__inner {
|
||||||
|
// display: inline-block;
|
||||||
.candidate {
|
// }
|
||||||
position: absolute;
|
//
|
||||||
display: block;
|
// .el-checkbox .el-checkbox__inner {
|
||||||
width: $containWidth;
|
// display: none;
|
||||||
height: 100%;
|
// }
|
||||||
border: 1px solid #e8e8e8;
|
//}
|
||||||
|
}
|
||||||
:deep(.el-input) {
|
|
||||||
height: 40px;
|
.footer {
|
||||||
|
float: right;
|
||||||
.el-input__inner, .el-input-group__append {
|
margin-top: 10px;
|
||||||
font-size: 16px;
|
}
|
||||||
}
|
|
||||||
}
|
.picker {
|
||||||
}
|
height: 560px;
|
||||||
|
position: relative;
|
||||||
.selected {
|
text-align: left;
|
||||||
right: 0;
|
|
||||||
top: 0;
|
.candidate {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
display: inline-block;
|
display: block;
|
||||||
width: 450px;
|
width: $containWidth;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
border: 1px solid #e8e8e8;
|
border: 1px solid #e8e8e8;
|
||||||
|
|
||||||
.count {
|
:deep(.el-input) {
|
||||||
width: 100%;
|
height: 40px;
|
||||||
padding: 10px;
|
|
||||||
display: inline-block;
|
.el-input__inner, .el-input-group__append {
|
||||||
border-bottom: 1px solid #e8e8e8;
|
font-size: 16px;
|
||||||
margin-bottom: 5px;
|
}
|
||||||
font-size: 16px;
|
}
|
||||||
|
}
|
||||||
> span:nth-child(2) {
|
|
||||||
float: right;
|
.selected {
|
||||||
color: #c75450;
|
right: 0;
|
||||||
cursor: pointer;
|
top: 0;
|
||||||
margin-left: 10px;
|
position: absolute;
|
||||||
}
|
display: inline-block;
|
||||||
}
|
width: 450px;
|
||||||
|
height: 100%;
|
||||||
.org-items {
|
border: 1px solid #e8e8e8;
|
||||||
overflow-y: auto;
|
|
||||||
height: 90%;
|
.count {
|
||||||
|
width: 100%;
|
||||||
.el-icon-close {
|
padding: 10px;
|
||||||
position: absolute;
|
display: inline-block;
|
||||||
right: 5px;
|
border-bottom: 1px solid #e8e8e8;
|
||||||
cursor: pointer;
|
margin-bottom: 5px;
|
||||||
font-size: larger;
|
font-size: 16px;
|
||||||
}
|
|
||||||
|
> span:nth-child(2) {
|
||||||
.org-item {
|
float: right;
|
||||||
margin: 0 5px;
|
color: #c75450;
|
||||||
border-radius: 5px;
|
cursor: pointer;
|
||||||
position: relative;
|
margin-left: 10px;
|
||||||
padding: 7px 5px;
|
}
|
||||||
display: flex;
|
}
|
||||||
align-items: center;
|
|
||||||
font-size: 16px;
|
.org-items {
|
||||||
|
overflow-y: auto;
|
||||||
&:hover {
|
height: 90%;
|
||||||
background: #f1f1f1;
|
|
||||||
}
|
.el-icon-close {
|
||||||
|
position: absolute;
|
||||||
> span {
|
right: 5px;
|
||||||
margin-left: 5px;
|
cursor: pointer;
|
||||||
}
|
font-size: larger;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
.org-item {
|
||||||
}
|
margin: 0 5px;
|
||||||
|
border-radius: 5px;
|
||||||
}
|
position: relative;
|
||||||
|
padding: 7px 5px;
|
||||||
.el-scrollbar .el-scrollbar__wrap {
|
display: flex;
|
||||||
overflow-x: hidden;
|
align-items: center;
|
||||||
}
|
font-size: 16px;
|
||||||
|
|
||||||
::-webkit-scrollbar {
|
&:hover {
|
||||||
float: right;
|
background: #f1f1f1;
|
||||||
width: 4px;
|
}
|
||||||
height: 4px;
|
|
||||||
background-color: white;
|
> span {
|
||||||
}
|
margin-left: 5px;
|
||||||
|
}
|
||||||
::-webkit-scrollbar-thumb {
|
}
|
||||||
border-radius: 16px;
|
}
|
||||||
background-color: #efefef;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
}
|
||||||
|
|
||||||
|
.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>
|
<template>
|
||||||
<el-button color="#DED0B2" style="float: right;margin: 0 10px 10px 0" @click="exportTable">导出</el-button>
|
<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"
|
<el-table ref="reportTable" :data="tableData" style="width: 100%;height: 479px"
|
||||||
:span-method="objectSpanMethod" v-loading="loading">
|
:span-method="objectSpanMethod" v-loading="loading">
|
||||||
<el-table-column label="四川省国有资产经营投资管理有限责任公司科技创新项目人工成本分摊明细表" align="center">
|
<el-table-column label="四川省国有资产经营投资管理有限责任公司科技创新项目人工成本分摊明细表" align="center">
|
||||||
<el-table-column v-for="column in columnInfo" :prop="column.prop" :label="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"
|
:fixed="(!column.children) ? ((column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost') ? 'right' : 'left') : false"
|
||||||
:width="(column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost') ? 160:130">
|
:width="(column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost') ? 160:130">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<template v-if="column.children">
|
<template v-if="column.children">
|
||||||
<el-table-column v-for="childColumn in column.children"
|
<el-table-column v-for="childColumn in column.children"
|
||||||
:prop="column.prop + '.'+ childColumn.prop"
|
:prop="column.prop + '.'+ childColumn.prop"
|
||||||
:label="childColumn.label"
|
:label="childColumn.label"
|
||||||
:width="childColumn.prop === 'subtotal' ? 160 : 130">
|
:width="childColumn.prop === 'subtotal' ? 160 : 130">
|
||||||
<template #default="columnScope">
|
<template #default="columnScope">
|
||||||
<template v-if="(tableData.length -1) !== columnScope.$index">
|
<template v-if="(tableData.length -1) !== columnScope.$index">
|
||||||
{{
|
{{
|
||||||
columnScope.row[column.prop][childColumn.prop] ? columnScope.row[column.prop][childColumn.prop] : '/'
|
columnScope.row[column.prop][childColumn.prop] ? columnScope.row[column.prop][childColumn.prop] : '/'
|
||||||
}}
|
}}
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
{{ columnScope.row[column.prop][childColumn.prop] }}
|
{{ columnScope.row[column.prop][childColumn.prop] }}
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<!--分摊金额合计与分摊金额总计计算-->
|
<!--分摊金额合计与分摊金额总计计算-->
|
||||||
<template
|
<template
|
||||||
v-if="(column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost') && (tableData.length -1) !== scope.$index">
|
v-if="(column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost') && (tableData.length -1) !== scope.$index">
|
||||||
{{ getTotalSeparation(scope.row, column.prop) }}
|
{{ getTotalSeparation(scope.row, column.prop) }}
|
||||||
</template>
|
</template>
|
||||||
<template
|
<template
|
||||||
v-else-if="(tableData.length -1) === scope.$index && (column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost')">
|
v-else-if="(tableData.length -1) === scope.$index && (column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost')">
|
||||||
{{ getTotalSummary(scope.row, column.prop) }}
|
{{ getTotalSummary(scope.row, column.prop) }}
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
{{ scope.row[column.prop] }}
|
{{ scope.row[column.prop] }}
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
||||||
<script setup lang="jsx">
|
<script setup lang="jsx">
|
||||||
import {getResearchUser, getAllocationDetails} from "@/api/expense-manage";
|
import {getResearchUser, getAllocationDetails} from "@/api/expense-manage";
|
||||||
import {exportExcel} from "@/utils/export-excel";
|
import {exportExcel} from "@/utils/export-excel";
|
||||||
import {ElNotification} from "element-plus";
|
import {ElNotification} from "element-plus";
|
||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const tableIns = ref()
|
const tableIns = ref()
|
||||||
const reportTable = ref({});
|
const reportTable = ref({});
|
||||||
const columnInfo = ref([])
|
const columnInfo = ref([])
|
||||||
const monthConcat = new Map()
|
const monthConcat = new Map()
|
||||||
const tableData = ref([])
|
const tableData = ref([])
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
const researchOptions = ref([])
|
const researchOptions = ref([])
|
||||||
|
|
||||||
const objectSpanMethod = ({row, column, rowIndex, columnIndex}) => {
|
const objectSpanMethod = ({row, column, rowIndex, columnIndex}) => {
|
||||||
if (columnIndex === 0) {
|
if (columnIndex === 0) {
|
||||||
if (monthConcat.has(rowIndex)) {
|
if (monthConcat.has(rowIndex)) {
|
||||||
return {
|
return {
|
||||||
rowspan: monthConcat.get(rowIndex),
|
rowspan: monthConcat.get(rowIndex),
|
||||||
colspan: 1,
|
colspan: 1,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return {
|
return {
|
||||||
rowspan: 0,
|
rowspan: 0,
|
||||||
colspan: 0,
|
colspan: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let length = Object.keys(row).length
|
let length = Object.keys(row).length
|
||||||
// console.log(length)
|
// console.log(length)
|
||||||
if (length > 5) {
|
if (length > 5) {
|
||||||
if (concatColumn(columnIndex, length, rowIndex)) {
|
if (concatColumn(columnIndex, length, rowIndex)) {
|
||||||
if (rowIndex % 5 === 0) {
|
if (rowIndex % 5 === 0) {
|
||||||
return {
|
return {
|
||||||
rowspan: 5,
|
rowspan: 5,
|
||||||
colspan: 1,
|
colspan: 1,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return {
|
return {
|
||||||
rowspan: 0,
|
rowspan: 0,
|
||||||
colspan: 0,
|
colspan: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const getTotalSeparation = (row, prop) => {
|
const getTotalSeparation = (row, prop) => {
|
||||||
let totalSeparation = 0.00
|
let totalSeparation = 0.00
|
||||||
for (let key of Object.keys(row)) {
|
for (let key of Object.keys(row)) {
|
||||||
if (key.startsWith('personInfo')) {
|
if (key.startsWith('personInfo')) {
|
||||||
let value = prop === 'totalSeparation' ? (row[key].separationAmount ? row[key].separationAmount : 0) : row[key].subtotal
|
let value = prop === 'totalSeparation' ? (row[key].separationAmount ? row[key].separationAmount : 0) : row[key].subtotal
|
||||||
if ("/" !== value) {
|
if ("/" !== value) {
|
||||||
try {
|
try {
|
||||||
totalSeparation += parseFloat(value)
|
totalSeparation += parseFloat(value)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (totalSeparation !== 0) {
|
if (totalSeparation !== 0) {
|
||||||
return totalSeparation.toFixed(2);
|
return totalSeparation.toFixed(2);
|
||||||
} else {
|
} else {
|
||||||
return "/"
|
return "/"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const getTotalSummary = (row, prop) => {
|
const getTotalSummary = (row, prop) => {
|
||||||
let key;
|
let key;
|
||||||
if (prop === 'totalSeparation') {
|
if (prop === 'totalSeparation') {
|
||||||
key = 'separationAmount'
|
key = 'separationAmount'
|
||||||
} else {
|
} else {
|
||||||
key = 'subtotal'
|
key = 'subtotal'
|
||||||
}
|
}
|
||||||
let result = 0
|
let result = 0
|
||||||
for (const rowKey of Object.keys(row)) {
|
for (const rowKey of Object.keys(row)) {
|
||||||
if (rowKey.startsWith('personInfo')) {
|
if (rowKey.startsWith('personInfo')) {
|
||||||
let value = row[rowKey][key]
|
let value = row[rowKey][key]
|
||||||
if (value && "/" !== value) {
|
if (value && "/" !== value) {
|
||||||
try {
|
try {
|
||||||
result += parseFloat(value)
|
result += parseFloat(value)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result.toFixed(2);
|
return result.toFixed(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
const concatColumn = (columnIndex, length, rowIndex) => {
|
const concatColumn = (columnIndex, length, rowIndex) => {
|
||||||
if (rowIndex === tableData.value.length - 1) {
|
if (rowIndex === tableData.value.length - 1) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
let columnLength = 5 + (length - 5) * 5
|
let columnLength = 5 + (length - 5) * 5
|
||||||
if (columnIndex === 1
|
if (columnIndex === 1
|
||||||
|| columnIndex === columnLength - 1) {
|
|| columnIndex === columnLength - 1) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
for (let i = 0; i < length - 5; i++) {
|
for (let i = 0; i < length - 5; i++) {
|
||||||
if (columnIndex === 4 + (i * 5)
|
if (columnIndex === 4 + (i * 5)
|
||||||
|| columnIndex === 5 + (i * 5)
|
|| columnIndex === 5 + (i * 5)
|
||||||
|| columnIndex === 7 + (i * 5)) {
|
|| columnIndex === 7 + (i * 5)) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
const init = () => {
|
const init = () => {
|
||||||
loading.value = true
|
loading.value = true
|
||||||
getAllocationDetails(route.query.id).then(res => {
|
getAllocationDetails(route.query.id).then(res => {
|
||||||
if (res.code !== 1000) {
|
if (res.code !== 1000) {
|
||||||
ElNotification({
|
ElNotification({
|
||||||
title: '提示',
|
title: '提示',
|
||||||
message: res.msg,
|
message: res.msg,
|
||||||
type: 'error'
|
type: 'error'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
columnInfo.value = res.data.columns
|
columnInfo.value = res.data.columns
|
||||||
let tableDataLet = res.data.tableData;
|
let tableDataLet = res.data.tableData;
|
||||||
let personInfoKey = []
|
let personInfoKey = []
|
||||||
columnInfo.value.forEach(item => {
|
columnInfo.value.forEach(item => {
|
||||||
if (item.prop.startsWith('personInfo')) {
|
if (item.prop.startsWith('personInfo')) {
|
||||||
personInfoKey.push(item.prop)
|
personInfoKey.push(item.prop)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
tableData.value = []
|
tableData.value = []
|
||||||
let rowIndex = 0;
|
let rowIndex = 0;
|
||||||
let summary = {
|
let summary = {
|
||||||
month: "",
|
month: "",
|
||||||
salaryType: '',
|
salaryType: '',
|
||||||
projectName: "合计",
|
projectName: "合计",
|
||||||
totalSeparation: 10,
|
totalSeparation: 10,
|
||||||
totalSeparationCost: 10
|
totalSeparationCost: 10
|
||||||
}
|
}
|
||||||
for (const key of personInfoKey) {
|
for (const key of personInfoKey) {
|
||||||
summary[key] = {
|
summary[key] = {
|
||||||
researchDuration: "",
|
researchDuration: "",
|
||||||
separationAmount: 0,
|
separationAmount: 0,
|
||||||
subtotal: 0,
|
subtotal: 0,
|
||||||
wagesPayable: "",
|
wagesPayable: "",
|
||||||
workday: "",
|
workday: "",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tableDataLet.forEach((tableDatum) => {
|
tableDataLet.forEach((tableDatum) => {
|
||||||
let rowspan = tableDatum.rows.length * 5
|
let rowspan = tableDatum.rows.length * 5
|
||||||
monthConcat.set(rowIndex, rowspan)
|
monthConcat.set(rowIndex, rowspan)
|
||||||
rowIndex += rowspan
|
rowIndex += rowspan
|
||||||
for (const tableDatumElement of tableDatum.rows) {
|
for (const tableDatumElement of tableDatum.rows) {
|
||||||
tableData.value = tableData.value.concat(tableDatumElement)
|
tableData.value = tableData.value.concat(tableDatumElement)
|
||||||
let row = tableDatumElement[0]
|
let row = tableDatumElement[0]
|
||||||
for (const key of personInfoKey) {
|
for (const key of personInfoKey) {
|
||||||
try {
|
try {
|
||||||
if (row[key].subtotal && '/' !== row[key].subtotal) {
|
if (row[key].subtotal && '/' !== row[key].subtotal) {
|
||||||
summary[key].subtotal += parseFloat(row[key].subtotal)
|
summary[key].subtotal += parseFloat(row[key].subtotal)
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
for (const row of tableData.value) {
|
for (const row of tableData.value) {
|
||||||
for (const key of personInfoKey) {
|
for (const key of personInfoKey) {
|
||||||
try {
|
try {
|
||||||
if (row[key].separationAmount && '/' !== row[key].separationAmount) {
|
if (row[key].separationAmount && '/' !== row[key].separationAmount) {
|
||||||
summary[key].separationAmount += parseFloat(row[key].separationAmount)
|
summary[key].separationAmount += parseFloat(row[key].separationAmount)
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (const key of personInfoKey) {
|
for (const key of personInfoKey) {
|
||||||
summary[key].subtotal = summary[key].subtotal.toFixed(2)
|
summary[key].subtotal = summary[key].subtotal.toFixed(2)
|
||||||
summary[key].separationAmount = summary[key].separationAmount.toFixed(2)
|
summary[key].separationAmount = summary[key].separationAmount.toFixed(2)
|
||||||
}
|
}
|
||||||
monthConcat.set(rowIndex, 1)
|
monthConcat.set(rowIndex, 1)
|
||||||
tableData.value.push(summary)
|
tableData.value.push(summary)
|
||||||
loading.value = false
|
loading.value = false
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const getResearchOptions = async () => {
|
const getResearchOptions = async () => {
|
||||||
const res = await getResearchUser()
|
const res = await getResearchUser()
|
||||||
researchOptions.value = res.data
|
researchOptions.value = res.data
|
||||||
}
|
}
|
||||||
const search = (val) => {
|
const search = (val) => {
|
||||||
tableConfig.params = {
|
tableConfig.params = {
|
||||||
allocationId: route.query.id,
|
allocationId: route.query.id,
|
||||||
...val
|
...val
|
||||||
}
|
}
|
||||||
tableIns.value.refresh()
|
tableIns.value.refresh()
|
||||||
}
|
}
|
||||||
getResearchOptions()
|
getResearchOptions()
|
||||||
init()
|
init()
|
||||||
|
|
||||||
|
|
||||||
const exportTable = () => {
|
const exportTable = () => {
|
||||||
const $e = reportTable.value.$el
|
const $e = reportTable.value.$el
|
||||||
let $table = $e.querySelector('.el-table__fixed')
|
let $table = $e.querySelector('.el-table__fixed')
|
||||||
if (!$table) {
|
if (!$table) {
|
||||||
$table = $e
|
$table = $e
|
||||||
}
|
}
|
||||||
exportExcel($table, (5 + (Object.keys(tableData.value[0]).length - 5) * 5), "四川省国有资产经营投资管理有限责任公司科技创新项目人工成本分摊明细表", 2)
|
exportExcel($table, (5 + (Object.keys(tableData.value[0]).length - 5) * 5), "四川省国有资产经营投资管理有限责任公司科技创新项目人工成本分摊明细表", 2)
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -1,169 +1,212 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-form :label-position="labelAlign">
|
<el-form :label-position="labelAlign">
|
||||||
<el-form-item :label="title?'其他文件':''" v-if="fileListShow === 'READ' || fileListShow === 'EDIT'" :label-position="labelAlign" :label-width="title?95:''">
|
<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'"/>
|
<file-upload @getFile="getOtherFile" v-if="fileListShow === 'EDIT'"/>
|
||||||
<fvTable style="width: 100%;max-height: 162px;" v-if="processViewer" height="162" :tableConfig="tableConfig"
|
<!-- :style="{width:isOpenPrint?'610px': '100%'}" table-layout="auto" id="printTable"-->
|
||||||
:data="_value" :isSettingCol="false" :pagination="false">
|
<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"
|
||||||
<template #empty>
|
:data="_value" :isSettingCol="false" :pagination="false">
|
||||||
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
<template #empty>
|
||||||
</template>
|
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
||||||
</fvTable>
|
</template>
|
||||||
</el-form-item>
|
</fvTable>
|
||||||
</el-form>
|
</el-form-item>
|
||||||
</template>
|
</el-form>
|
||||||
|
<file-preview ref="filePreviewRef" :fullscreen="fullscreen" v-if="filePreviewShow" :fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
|
||||||
<script setup lang="jsx">
|
:fileType="filePreviewParam.fileType"/>
|
||||||
import {downloadFile, deleteFile} from "@/api/project-demand";
|
</template>
|
||||||
import {ElNotification} from "element-plus";
|
|
||||||
|
<script setup lang="jsx">
|
||||||
const props = defineProps({
|
import {downloadFile, deleteFile} from "@/api/project-demand";
|
||||||
title: {
|
import {ElNotification} from "element-plus";
|
||||||
type: String,
|
import FilePreview from "../filePreview/index.vue";
|
||||||
default: ''
|
|
||||||
},
|
const props = defineProps({
|
||||||
tag: {
|
title: {
|
||||||
type: String,
|
type: String,
|
||||||
default: ''
|
default: ''
|
||||||
},
|
},
|
||||||
fileListShow: {
|
tag: {
|
||||||
type: String,
|
type: String,
|
||||||
default: 'READ'
|
default: ''
|
||||||
},
|
},
|
||||||
value: {
|
fileNameTableWidth: {
|
||||||
type: Array,
|
type: String,
|
||||||
default: []
|
default: '400'
|
||||||
},
|
},
|
||||||
processViewer: {
|
fileListShow: {
|
||||||
type: Boolean,
|
type: String,
|
||||||
default: false
|
default: 'READ'
|
||||||
},
|
},
|
||||||
labelAlign: {
|
value: {
|
||||||
type: String,
|
type: Array,
|
||||||
default: 'right'
|
default: []
|
||||||
}
|
},
|
||||||
})
|
processViewer: {
|
||||||
const emit = defineEmits(['update:value'])
|
type: Boolean,
|
||||||
const tableConfig = reactive({
|
default: false
|
||||||
columns: [
|
},
|
||||||
{
|
labelAlign: {
|
||||||
prop: 'index',
|
type: String,
|
||||||
type: 'index',
|
default: 'right'
|
||||||
label: '序号',
|
},
|
||||||
align: 'center',
|
//弹窗是否铺满全屏
|
||||||
width: 85,
|
fullscreen: {
|
||||||
},
|
type: Boolean,
|
||||||
{
|
default: false
|
||||||
prop: 'originalFileName',
|
},
|
||||||
label: '文件名',
|
//是否开始打印
|
||||||
align: 'center',
|
isOpenPrint: {
|
||||||
},
|
type: Boolean,
|
||||||
{
|
default: false
|
||||||
prop: 'tag',
|
},
|
||||||
label: '标签',
|
})
|
||||||
align: 'center'
|
const emit = defineEmits(['update:value'])
|
||||||
},
|
const tableConfig = reactive({
|
||||||
{
|
columns: [
|
||||||
prop: 'size',
|
{
|
||||||
label: '文件大小',
|
prop: 'index',
|
||||||
align: 'center',
|
type: 'index',
|
||||||
width: 150,
|
label: '序号',
|
||||||
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
align: 'center',
|
||||||
},
|
width: 85,
|
||||||
{
|
},
|
||||||
prop: 'oper',
|
{
|
||||||
label: '操作',
|
prop: 'originalFileName',
|
||||||
align: 'center',
|
label: '文件名',
|
||||||
showOverflowTooltip: false,
|
align: 'center',
|
||||||
currentRender: ({row, index}) => {
|
width: props.fileNameTableWidth,
|
||||||
let btn = []
|
showOverflowTooltip: false,
|
||||||
btn.push({label: '下载', func: () => handleDownload(row), type: 'primary'})
|
currentRender: ({row, index}) => (<div style="color: #2a99ff;cursor: pointer;" onClick={()=>clickToPreview(row)}>{row.originalFileName}</div>)
|
||||||
// if (row.newFile) {
|
},
|
||||||
// btn.push({label: '删除', func: () => handleDelete(row), type: 'primary'})
|
{
|
||||||
// }
|
prop: 'tag',
|
||||||
return (
|
label: '标签',
|
||||||
<div style={{width: '100%'}}>
|
align: 'center',
|
||||||
{
|
showOverflowTooltip: false,
|
||||||
btn.map(item => (
|
minWidth: props.fileNameTableWidth,
|
||||||
<el-button
|
},
|
||||||
type={item.type}
|
{
|
||||||
onClick={() => item.func()}
|
prop: 'size',
|
||||||
link>
|
label: '文件大小',
|
||||||
{item.label}
|
align: 'center',
|
||||||
</el-button>
|
width: 150,
|
||||||
))
|
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
||||||
}
|
},
|
||||||
{
|
{
|
||||||
row.newFile ? <popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
prop: 'oper',
|
||||||
perm={['mosr:requirement:del']}
|
label: '操作',
|
||||||
onDelete={() => handleDelete(row)}/>
|
align: 'center',
|
||||||
: ''
|
showOverflowTooltip: false,
|
||||||
}
|
currentRender: ({row, index}) => {
|
||||||
</div>
|
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%'}}>
|
||||||
const _value = computed({
|
{
|
||||||
get() {
|
btn.map(item => (
|
||||||
return props.value;
|
<el-button
|
||||||
},
|
type={item.type}
|
||||||
set(val) {
|
onClick={() => item.func()}
|
||||||
emit("update:value", val);
|
link>
|
||||||
}
|
{item.label}
|
||||||
})
|
</el-button>
|
||||||
|
))
|
||||||
const getOtherFile = (val) => {
|
}
|
||||||
props.processViewer = false
|
{
|
||||||
let fileObj = compositeParam(val)
|
row.newFile ? <popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
|
||||||
_value.value.push(fileObj)
|
onDelete={() => handleDelete(row)}/>
|
||||||
nextTick(() => {
|
: ''
|
||||||
props.processViewer = true
|
}
|
||||||
})
|
</div>
|
||||||
}
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
const compositeParam = (item, type) => {
|
]
|
||||||
return {
|
})
|
||||||
fileId: item.id,
|
const filePreviewParam = ref({
|
||||||
size: item.size,
|
fileUrl: '',
|
||||||
originalFileName: item.originalFilename,
|
fileName: '',
|
||||||
fileType: item.fileType,
|
fileType: 'pdf'
|
||||||
url: item.url,
|
})
|
||||||
newFile: true,
|
const filePreviewShow = ref(false)
|
||||||
tag: props.tag
|
const _value = computed({
|
||||||
}
|
get() {
|
||||||
}
|
return props.value;
|
||||||
const handleDownload = (row) => {
|
},
|
||||||
downloadFile(row.fileId).then(res => {
|
set(val) {
|
||||||
const blob = new Blob([res])
|
emit("update:value", val);
|
||||||
let a = document.createElement('a')
|
}
|
||||||
a.href = URL.createObjectURL(blob)
|
})
|
||||||
a.download = row.originalFileName
|
const clickToPreview=(row)=>{
|
||||||
a.click()
|
filePreviewShow.value = false
|
||||||
})
|
filePreviewParam.value = {
|
||||||
}
|
fileUrl: row.url,
|
||||||
const handleDelete = (row) => {
|
fileName: row.originalFileName,
|
||||||
deleteFile(row.fileId).then(res => {
|
fileType: row.fileType
|
||||||
ElNotification({
|
}
|
||||||
title: '提示',
|
nextTick(()=>{
|
||||||
message: res.msg,
|
filePreviewShow.value = true
|
||||||
type: res.code === 1000 ? 'success' : 'error'
|
})
|
||||||
})
|
}
|
||||||
if (res.code === 1000) {
|
const getOtherFile = (val) => {
|
||||||
_value.value.splice(_value.value.findIndex((item) => item.fileId === row.fileId), 1);
|
props.processViewer = false
|
||||||
}
|
let fileObj = compositeParam(val)
|
||||||
});
|
_value.value.push(fileObj)
|
||||||
}
|
nextTick(() => {
|
||||||
|
props.processViewer = true
|
||||||
watch(() => props.processViewer, (newVal) => {
|
})
|
||||||
props.processViewer = newVal
|
}
|
||||||
}, {deep: true})
|
|
||||||
</script>
|
|
||||||
|
const compositeParam = (item, type) => {
|
||||||
<style scoped lang="scss">
|
return {
|
||||||
:deep(.el-table--fit ) {
|
fileId: item.id,
|
||||||
height: 162px !important;
|
size: item.size,
|
||||||
}
|
originalFileName: item.originalFilename,
|
||||||
</style>
|
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>
|
<template>
|
||||||
<!-- <baseTitle title="审核意见"></baseTitle>-->
|
<!-- <baseTitle title="审核意见"></baseTitle>-->
|
||||||
<!-- <fvForm :schema="schema" @getInstance="(e)=>form = e"></fvForm>-->
|
<!-- <fvForm :schema="schema" @getInstance="(e)=>form = e"></fvForm>-->
|
||||||
<div class="oper-page-btn">
|
<div class="oper-page-btn" style="display: flex">
|
||||||
<el-button type="danger" @click="handleReject">驳回</el-button>
|
<el-button type="danger" @click="handleReject">驳回</el-button>
|
||||||
<el-button color="#DED0B2" @click="handleAgree">同意</el-button>
|
<el-button color="#DED0B2" @click="handleAgree">同意</el-button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
<div class="opinion-dialog">
|
||||||
|
<el-dialog v-model="showBackNode" title="请选择退回节点" width="400">
|
||||||
<script setup lang="jsx">
|
<el-table :data="taskUserOptionList" style="width: 100%"
|
||||||
import {ElNotification} from 'element-plus';
|
:header-cell-style="{background:'#f5f7fa'}">
|
||||||
import {agreeTask, rejectTask} from "@/api/project-demand/index.js";
|
<el-table-column width="55">
|
||||||
import {useTagsView} from '@/stores/tagsview.js'
|
<template #default="scope">
|
||||||
|
<el-radio
|
||||||
const tagsViewStore = useTagsView()
|
class="radio"
|
||||||
const route = useRoute()
|
:label="scope.row"
|
||||||
const router = useRouter()
|
v-model="backNode"
|
||||||
const props = defineProps({
|
>   
|
||||||
taskId: {
|
</el-radio>
|
||||||
type: String,
|
</template>
|
||||||
default: ''
|
</el-table-column>
|
||||||
},
|
<el-table-column
|
||||||
formData: {
|
prop="nodeName"
|
||||||
type: Object,
|
label="节点名称">
|
||||||
default: {}
|
<!-- <template #default="scope">-->
|
||||||
},
|
<!-- {{scope.row.nodeId==-1?'发起节点':scope.row.nodeName}}-->
|
||||||
value: {
|
<!-- </template>-->
|
||||||
type: String,
|
</el-table-column>
|
||||||
default: ''
|
<el-table-column
|
||||||
}
|
prop="name"
|
||||||
})
|
label="操作者">
|
||||||
|
<template #default="scope">
|
||||||
const form = ref()
|
<el-tag v-if="scope.row.userInfo" type="success">{{ scope.row.userInfo.name }}</el-tag>
|
||||||
const schema = computed(() => {
|
</template>
|
||||||
return [
|
</el-table-column>
|
||||||
{
|
</el-table>
|
||||||
label: '',
|
<div class="oper" style="display: flex;justify-content: flex-end;margin-top: 10px">
|
||||||
prop: 'auditOpinion',
|
<el-button type="danger" @click="rollbackHandler">确定</el-button>
|
||||||
component: 'el-input',
|
<el-button @click="showBackNode=false">取消</el-button>
|
||||||
colProps: {
|
</div>
|
||||||
span: 24
|
<!-- <el-select v-if="taskUserOptionList?.length>0" v-model="backNode" placeholder="请选择退回节点" clearable>-->
|
||||||
},
|
<!-- <el-option-->
|
||||||
props: {
|
<!-- v-for="item in taskUserOptionList"-->
|
||||||
placeholder: '请输入审核意见',
|
<!-- :key="item.nodeId"-->
|
||||||
type: 'textarea',
|
<!-- :label="item.nodeName + (item.userInfo ? ':' + item.userInfo.name : '')"-->
|
||||||
rows: 3
|
<!-- :value="item.nodeId">-->
|
||||||
}
|
<!-- </el-option>-->
|
||||||
}
|
<!-- </el-select>-->
|
||||||
]
|
<!-- <el-button type="danger" @click="rollbackHandler">确认</el-button>-->
|
||||||
})
|
</el-dialog>
|
||||||
const _value = computed({
|
</div>
|
||||||
get() {
|
</template>
|
||||||
return props.value;
|
|
||||||
},
|
<script setup lang="jsx">
|
||||||
set(val) {
|
import {ElNotification} from 'element-plus';
|
||||||
emit("update:value", val);
|
import {agreeTask, rejectTask} from "@/api/project-demand/index.js";
|
||||||
}
|
import {useTagsView} from '@/stores/tagsview.js'
|
||||||
})
|
|
||||||
const back = () => {
|
const tagsViewStore = useTagsView()
|
||||||
switch (route.name) {
|
const route = useRoute()
|
||||||
case 'Initiation/detail':
|
const router = useRouter()
|
||||||
router.push({name: 'Initiation'})
|
const props = defineProps({
|
||||||
break;
|
taskId: {
|
||||||
case 'Filing/detail':
|
type: String,
|
||||||
router.push({name: 'Filing'})
|
default: ''
|
||||||
break;
|
},
|
||||||
case 'Implementation/detail':
|
formData: {
|
||||||
if (route.query.source === 'home') {
|
type: Object,
|
||||||
router.push('/home')
|
default: {}
|
||||||
} else {
|
},
|
||||||
if (route.query.step === '10') {
|
value: {
|
||||||
router.push({name: 'Summary'})
|
type: String,
|
||||||
} else if (route.query.step === '20') {
|
default: ''
|
||||||
router.push({name: 'Initiation'})
|
},
|
||||||
} else if (route.query.step === '40') {
|
//退回节点选择框数据
|
||||||
router.push({name: 'Implementation'})
|
taskUserOptionList: {
|
||||||
} else if (route.query.step === '50') {
|
type: Array,
|
||||||
router.push({name: 'Filing'})
|
default: []
|
||||||
} else if (route.query.step === '00') {
|
}
|
||||||
router.push({name: 'Requirement'})
|
})
|
||||||
}
|
|
||||||
}
|
const form = ref()
|
||||||
break;
|
const backNode = ref({})
|
||||||
case 'Summary/detail':
|
const showBackNode = ref(false)
|
||||||
if (route.query.source === 'home') {
|
const schema = computed(() => {
|
||||||
router.push('/home')
|
return [
|
||||||
} else {
|
{
|
||||||
router.push({name: 'Summary'})
|
label: '',
|
||||||
}
|
prop: 'auditOpinion',
|
||||||
break;
|
component: 'el-input',
|
||||||
case 'Requirement/detail':
|
colProps: {
|
||||||
if (route.query.source === 'home') {
|
span: 24
|
||||||
router.push('/home')
|
},
|
||||||
} else {
|
props: {
|
||||||
router.push({name: 'Requirement'})
|
placeholder: '请输入审核意见',
|
||||||
}
|
type: 'textarea',
|
||||||
break;
|
rows: 3
|
||||||
case 'Fund/detail':
|
}
|
||||||
if (route.query.source === 'home') {
|
}
|
||||||
router.push('/home')
|
]
|
||||||
} else {
|
})
|
||||||
router.push({name: 'Fund'})
|
const _value = computed({
|
||||||
}
|
get() {
|
||||||
break;
|
return props.value;
|
||||||
case 'Share/detail':
|
},
|
||||||
if (route.query.source === 'home') {
|
set(val) {
|
||||||
router.push('/home')
|
emit("update:value", val);
|
||||||
} else {
|
}
|
||||||
router.push({name: 'Expense/share'})
|
})
|
||||||
}
|
const back = () => {
|
||||||
break;
|
switch (route.name) {
|
||||||
case 'Phase/detail':
|
case 'Initiation/detail':
|
||||||
if (route.query.source === 'home') {
|
router.push({name: 'Initiation'})
|
||||||
router.push('/home')
|
break;
|
||||||
} else {
|
case 'Filing/detail':
|
||||||
router.push({name: 'Implementation'})
|
router.push({name: 'Filing'})
|
||||||
}
|
break;
|
||||||
break;
|
case 'Implementation/detail':
|
||||||
}
|
if (route.query.source === 'home') {
|
||||||
}
|
router.push('/home')
|
||||||
// 驳回
|
} else {
|
||||||
const handleReject = async () => {
|
if (route.query.step === '10') {
|
||||||
// const values = form.value.getValues()
|
router.push({name: 'Summary'})
|
||||||
if (!_value.value) {
|
} else if (route.query.step === '20') {
|
||||||
ElNotification({
|
router.push({name: 'Initiation'})
|
||||||
title: '提示',
|
} else if (route.query.step === '40') {
|
||||||
message: '请填写审核意见',
|
router.push({name: 'Implementation'})
|
||||||
type: 'warning'
|
} else if (route.query.step === '50') {
|
||||||
})
|
router.push({name: 'Filing'})
|
||||||
return
|
} else if (route.query.step === '00') {
|
||||||
}
|
router.push({name: 'Requirement'})
|
||||||
const params = {
|
}
|
||||||
taskId: props.taskId,
|
}
|
||||||
// ...values
|
break;
|
||||||
auditOpinion: _value.value
|
// case 'Summary/detail':
|
||||||
}
|
// if (route.query.source === 'home') {
|
||||||
// console.log('params', params)
|
// router.push('/home')
|
||||||
const res = await rejectTask(params)
|
// } else {
|
||||||
ElNotification({
|
// router.push({name: 'Summary'})
|
||||||
title: '提示',
|
// }
|
||||||
message: res.msg,
|
// break;
|
||||||
type: res.code === 1000 ? 'success' : 'error'
|
case 'Requirement/detail':
|
||||||
})
|
if (route.query.source === 'home') {
|
||||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
router.push('/home')
|
||||||
back()
|
} else {
|
||||||
}
|
router.push({name: 'Requirement'})
|
||||||
|
}
|
||||||
const handleAgree = async () => {
|
break;
|
||||||
// const values = form.value.getValues()
|
case 'Fund/detail':
|
||||||
const params = {
|
if (route.query.source === 'home') {
|
||||||
taskId: props.taskId,
|
router.push('/home')
|
||||||
formData: props.formData,
|
} else {
|
||||||
auditOpinion: _value.value
|
router.push({name: 'Fund'})
|
||||||
}
|
}
|
||||||
const res = await agreeTask(params)
|
break;
|
||||||
ElNotification({
|
case 'Share/detail':
|
||||||
title: '提示',
|
if (route.query.source === 'home') {
|
||||||
message: res.msg,
|
router.push('/home')
|
||||||
type: res.code === 1000 ? 'success' : 'error'
|
} else {
|
||||||
})
|
router.push({name: 'Expense/share'})
|
||||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
}
|
||||||
back()
|
break;
|
||||||
}
|
case 'Phase/detail':
|
||||||
</script>
|
if (route.query.source === 'home') {
|
||||||
|
router.push('/home')
|
||||||
<style lang="scss" scoped>
|
} else {
|
||||||
|
router.push({name: 'Implementation'})
|
||||||
</style>
|
}
|
||||||
|
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>
|
<template>
|
||||||
<div v-loading="loading">
|
<div v-loading="loading" style="padding: 0 30px">
|
||||||
<baseTitle title="专项资金详情"></baseTitle>
|
<baseTitle title="专项资金详情"></baseTitle>
|
||||||
<el-form :model="formData" ref="form" label-width="auto">
|
<el-form :model="formData" ref="form" >
|
||||||
<el-row>
|
<el-row style="margin-left: 15px;margin-bottom: -18px">
|
||||||
<el-col :span="12">
|
<el-col :span="6">
|
||||||
<el-form-item label="专项名称">
|
<el-form-item label="专项名称">
|
||||||
<span>{{ formData.name }}</span>
|
<span>{{ formData.name }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="6">
|
||||||
<el-form-item label="金额(元)">
|
<el-form-item label="金额(元)">
|
||||||
<span>{{ toThousands(formData.fundAmount) }}</span>
|
<span>{{ toThousands(formData.fundAmount) }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="24">
|
<el-col :span="6">
|
||||||
<el-form-item label="剩余金额(元)">
|
<el-form-item label="剩余金额(元)">
|
||||||
<span>{{ toThousands(formData.residualAmount) }}</span>
|
<span>{{ toThousands(formData.residualAmount) }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<baseTitle title="介绍"></baseTitle>
|
<el-col :span="24">
|
||||||
<el-col :span="24">
|
<el-form-item label="专项资金情况说明" >
|
||||||
<el-form-item>
|
<div style="white-space: pre-wrap">{{formData.introduce}}
|
||||||
<el-card style="width: 100%">
|
</div>
|
||||||
<div v-html="formData.introduce">
|
</el-form-item>
|
||||||
</div>
|
</el-col>
|
||||||
</el-card>
|
</el-row>
|
||||||
</el-form-item>
|
<el-row style="margin-bottom: -18px" class="projects">
|
||||||
</el-col>
|
<baseTitle title="关联项目" v-if="!data.taskId"></baseTitle>
|
||||||
<baseTitle title="关联项目" v-if="!data.taskId"></baseTitle>
|
<el-col :span="24" v-if="!data.taskId" >
|
||||||
<el-col :span="24" v-if="!data.taskId">
|
<el-form-item >
|
||||||
<el-form-item>
|
<fvTable style="width: 100%;max-height:160px" height="160" v-if="showTable" :tableConfig="projectTable"
|
||||||
<fvTable style="width: 100%;max-height:162px" height="162" v-if="showTable" :tableConfig="projectTable"
|
:data="formData.projects" :isSettingCol="false" :pagination="false">
|
||||||
:data="formData.projects" :isSettingCol="false" :pagination="false">
|
<template #empty>
|
||||||
<template #empty>
|
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
||||||
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
</template>
|
||||||
</template>
|
</fvTable>
|
||||||
</fvTable>
|
</el-form-item>
|
||||||
</el-form-item>
|
</el-col>
|
||||||
</el-col>
|
<baseTitle title="附件文件"></baseTitle>
|
||||||
<baseTitle title="附件列表"></baseTitle>
|
<el-col :span="24">
|
||||||
<el-col :span="24">
|
<el-form-item>
|
||||||
<el-form-item>
|
<fvTable style="width: 100%;max-height: 160px;" height="160" v-if="showTable" :tableConfig="fileTable"
|
||||||
<fvTable style="width: 100%;max-height: 162px;" height="162" v-if="showTable" :tableConfig="fileTable"
|
:data="formData.files" :isSettingCol="false" :pagination="false">
|
||||||
:data="formData.files" :isSettingCol="false" :pagination="false">
|
<template #empty>
|
||||||
<template #empty>
|
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
||||||
<el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
|
</template>
|
||||||
</template>
|
</fvTable>
|
||||||
</fvTable>
|
</el-form-item>
|
||||||
</el-form-item>
|
</el-col>
|
||||||
</el-col>
|
<el-col :span="24" style="margin-top: -18px">
|
||||||
<el-col :span="24">
|
<div v-if="data.taskId">
|
||||||
<div v-if="data.taskId">
|
<baseTitle title="审核意见"></baseTitle>
|
||||||
<baseTitle title="审核意见"></baseTitle>
|
<el-form-item prop="auditOpinion">
|
||||||
<el-form-item prop="auditOpinion">
|
<el-input
|
||||||
<el-input
|
v-model="formData.auditOpinion"
|
||||||
v-model="formData.auditOpinion"
|
:rows="3"
|
||||||
:rows="3"
|
type="textarea"
|
||||||
type="textarea"
|
placeholder="请输入审核意见"
|
||||||
placeholder="请输入审核意见"
|
/>
|
||||||
/>
|
</el-form-item>
|
||||||
</el-form-item>
|
</div>
|
||||||
</div>
|
</el-col>
|
||||||
</el-col>
|
</el-row>
|
||||||
</el-row>
|
<div class="approval-record">
|
||||||
<div class="approval-record">
|
<div class="approval-title">
|
||||||
<div class="approval-title">
|
<baseTitle title="审批记录"></baseTitle>
|
||||||
<baseTitle title="审批记录"></baseTitle>
|
<div class="diagram">
|
||||||
<div class="diagram">
|
<div class="base-title">流程图</div>
|
||||||
<div class="base-title">流程图</div>
|
<el-switch
|
||||||
<el-switch
|
v-model="changeDiagram"
|
||||||
v-model="changeDiagram"
|
style="--el-switch-on-color:#BEA266 ; --el-switch-off-color:#cecdcd"
|
||||||
style="--el-switch-on-color:#BEA266 ; --el-switch-off-color:#cecdcd"
|
/>
|
||||||
/>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="process">
|
||||||
<div class="process">
|
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
|
||||||
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
|
:operation-list="data.operationList"
|
||||||
:operation-list="data.operationList"
|
:state="data.state"/>
|
||||||
:state="data.state"/>
|
<process-diagram-viewer v-if="processViewer&&changeDiagram" id-name="fundProcess"/>
|
||||||
<process-diagram-viewer v-if="processViewer&&changeDiagram" id-name="fundProcess"/>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</el-form>
|
||||||
</el-form>
|
<opinion v-if="data.taskId" :formData="data.formData" :taskId="data.taskId"
|
||||||
<opinion v-if="data.taskId" :formData="data.formData" :taskId="data.taskId"
|
:taskUserOptionList="data.taskUserOptionList"
|
||||||
v-model:value="formData.auditOpinion"></opinion>
|
v-model:value="formData.auditOpinion"></opinion>
|
||||||
</div>
|
<file-preview ref="filePreviewRef" v-if="filePreviewShow" :fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
|
||||||
</template>
|
:fileType="filePreviewParam.fileType"/>
|
||||||
|
</div>
|
||||||
<script setup lang="jsx">
|
</template>
|
||||||
import {toThousands} from '@/utils/changePrice.js'
|
|
||||||
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
<script setup lang="jsx">
|
||||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'
|
import {toThousands} from '@/utils/changePrice.js'
|
||||||
import {downloadFile} from "@/api/project-demand";
|
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
||||||
|
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'
|
||||||
const changeDiagram = ref(false)
|
import {downloadFile} from "@/api/project-demand";
|
||||||
const emit = defineEmits(['getInfo', "update:formData"])
|
|
||||||
const form = ref()
|
const changeDiagram = ref(false)
|
||||||
const router = useRouter()
|
const emit = defineEmits(['getInfo', "update:formData"])
|
||||||
|
const form = ref()
|
||||||
const props = defineProps({
|
const router = useRouter()
|
||||||
formData: {
|
|
||||||
type: Array,
|
const props = defineProps({
|
||||||
default: []
|
formData: {
|
||||||
},
|
type: Array,
|
||||||
data: {
|
default: []
|
||||||
type: Array,
|
},
|
||||||
default: []
|
data: {
|
||||||
},
|
type: Array,
|
||||||
processViewer: {
|
default: []
|
||||||
type: Boolean,
|
},
|
||||||
default: false
|
processViewer: {
|
||||||
}, showTable: {
|
type: Boolean,
|
||||||
type: Boolean,
|
default: false
|
||||||
default: false
|
}, showTable: {
|
||||||
},
|
type: Boolean,
|
||||||
loading: {
|
default: false
|
||||||
type: Boolean,
|
},
|
||||||
default: false
|
loading: {
|
||||||
}
|
type: Boolean,
|
||||||
})
|
default: false
|
||||||
const projectTable = reactive({
|
}
|
||||||
columns: [
|
})
|
||||||
{
|
const projectTable = reactive({
|
||||||
prop: 'index',
|
columns: [
|
||||||
type: 'index',
|
{
|
||||||
label: '序号',
|
prop: 'index',
|
||||||
align: 'center',
|
type: 'index',
|
||||||
width: '80',
|
label: '序号',
|
||||||
},
|
align: 'center',
|
||||||
{
|
width: '80',
|
||||||
prop: 'projectName',
|
},
|
||||||
label: '项目名称',
|
{
|
||||||
align: 'center',
|
prop: 'projectName',
|
||||||
},
|
label: '项目名称',
|
||||||
{
|
align: 'center',
|
||||||
prop: 'specialFundAmount',
|
width: 400
|
||||||
label: '项目金额',
|
},
|
||||||
align: 'center',
|
{
|
||||||
currentRender:({row})=>{
|
prop: 'specialFundAmount',
|
||||||
return <span>{toThousands(row.specialFundAmount)}</span>
|
label: '项目金额',
|
||||||
}
|
align: 'center',
|
||||||
},
|
currentRender:({row})=>{
|
||||||
{
|
return <span>{toThousands(row.specialFundAmount)}</span>
|
||||||
prop: 'startTime',
|
}
|
||||||
label: '项目时间',
|
},
|
||||||
align: 'center'
|
{
|
||||||
},
|
prop: 'startTime',
|
||||||
{
|
label: '项目时间',
|
||||||
prop: 'oper',
|
align: 'center'
|
||||||
label: '操作',
|
},
|
||||||
align: 'center',
|
{
|
||||||
currentRender: ({row, index}) => {
|
prop: 'oper',
|
||||||
return (
|
label: '操作',
|
||||||
<el-button type="primary" link onClick={() => handleView(row)}>查看</el-button>
|
align: 'center',
|
||||||
)
|
currentRender: ({row, index}) => {
|
||||||
}
|
return (
|
||||||
}
|
<el-button type="primary" link onClick={() => handleView(row)}>查看</el-button>
|
||||||
]
|
)
|
||||||
})
|
}
|
||||||
const fileTable = reactive({
|
}
|
||||||
columns: [
|
]
|
||||||
{
|
})
|
||||||
prop: 'index',
|
const fileTable = reactive({
|
||||||
type: 'index',
|
columns: [
|
||||||
label: '序号',
|
{
|
||||||
align: 'center',
|
prop: 'index',
|
||||||
width: '80',
|
type: 'index',
|
||||||
},
|
label: '序号',
|
||||||
{
|
align: 'center',
|
||||||
prop: 'originalFileName',
|
width: '80',
|
||||||
label: '文件名',
|
},
|
||||||
align: 'center',
|
{
|
||||||
},
|
prop: 'originalFileName',
|
||||||
{
|
label: '文件名',
|
||||||
prop: 'tag',
|
align: 'center',
|
||||||
label: '标签',
|
width: 400,
|
||||||
align: 'center'
|
showOverflowTooltip: false,
|
||||||
},
|
currentRender: ({row, index}) => (<div style="color: #2a99ff;cursor: pointer;" onClick={()=>clickToPreview(row)}>{row.originalFileName}</div>)
|
||||||
{
|
},
|
||||||
prop: 'size',
|
{
|
||||||
label: '文件大小',
|
prop: 'tag',
|
||||||
align: 'center',
|
label: '标签',
|
||||||
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
align: 'center'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'oper',
|
prop: 'size',
|
||||||
label: '操作',
|
label: '文件大小',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
currentRender: ({row, index}) => {
|
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
||||||
return (
|
},
|
||||||
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
|
{
|
||||||
)
|
prop: 'oper',
|
||||||
}
|
label: '操作',
|
||||||
}
|
align: 'center',
|
||||||
]
|
currentRender: ({row, index}) => {
|
||||||
})
|
return (
|
||||||
const handleView=(row)=>{
|
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
|
||||||
router.push({
|
)
|
||||||
name: 'Implementation/detail',
|
}
|
||||||
query: {
|
}
|
||||||
id: row.requirementId,
|
]
|
||||||
projectId: row.projectId,
|
})
|
||||||
step: '10'
|
const filePreviewParam = ref({
|
||||||
}
|
fileUrl: '',
|
||||||
})
|
fileName: '',
|
||||||
}
|
fileType: 'pdf'
|
||||||
const handleDownload = (row) => {
|
})
|
||||||
downloadFile(row.fileId).then(res => {
|
const filePreviewShow = ref(false)
|
||||||
const blob = new Blob([res])
|
const clickToPreview=(row)=>{
|
||||||
let a = document.createElement('a')
|
filePreviewShow.value = false
|
||||||
a.href = URL.createObjectURL(blob)
|
filePreviewParam.value = {
|
||||||
a.download = row.originalFileName
|
fileUrl: row.url,
|
||||||
a.click()
|
fileName: row.originalFileName,
|
||||||
})
|
fileType: row.fileType
|
||||||
}
|
}
|
||||||
|
nextTick(()=>{
|
||||||
watch(() => props.loading, (newVal) => {
|
filePreviewShow.value = true
|
||||||
props.loading = newVal
|
})
|
||||||
}, {deep: true})
|
}
|
||||||
|
const handleView=(row)=>{
|
||||||
watch(() => props.processViewer, (newVal) => {
|
router.push({
|
||||||
props.processViewer = newVal
|
name: 'Implementation/detail',
|
||||||
}, {deep: true})
|
query: {
|
||||||
watch(() => props.showTable, (newVal) => {
|
id: row.requirementId,
|
||||||
props.showTable = newVal
|
projectId: row.projectId,
|
||||||
}, {deep: true})
|
step: '10'
|
||||||
</script>
|
}
|
||||||
|
})
|
||||||
<style scoped lang="scss">
|
}
|
||||||
:deep(.el-table--fit ) {
|
const handleDownload = (row) => {
|
||||||
height: 300px !important;
|
downloadFile(row.fileId).then(res => {
|
||||||
}
|
const blob = new Blob([res])
|
||||||
</style>
|
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>
|
<template>
|
||||||
<div class="detail-block" v-loading="loading">
|
<div class="detail-block" v-loading="loading">
|
||||||
<baseTitle title="需求上报信息"></baseTitle>
|
<el-form :model="localFormData" ref="summaryForm" :rules="rules">
|
||||||
<el-form :model="localFormData" ref="summaryForm" :rules="rules">
|
<baseTitle title="预期知识产权"></baseTitle>
|
||||||
<el-row gutter="50">
|
<el-row gutter="20" style="margin-bottom: -18px;margin-left: 5px">
|
||||||
<el-col :span="8">
|
<!-- <el-col :span="6">-->
|
||||||
<el-form-item label="项目名称" prop="projectName">
|
<!-- <el-form-item label="预期成果形式" prop="resultForm">-->
|
||||||
<span>{{ localFormData.projectName }}</span>
|
<!-- <span>{{ filterDict(cacheStore.getDict('result_form'), localFormData.resultForm) }}</span>-->
|
||||||
</el-form-item>
|
<!-- </el-form-item>-->
|
||||||
</el-col>
|
<!-- </el-col>-->
|
||||||
<el-col :span="8">
|
<el-col :span="6">
|
||||||
<el-form-item label="开始时间" prop="startTime">
|
<el-form-item label="知识产权归属" prop="intellectualProperty">
|
||||||
<span>{{ localFormData.startTime }}</span>
|
<span>{{
|
||||||
</el-form-item>
|
filterDict(cacheStore.getDict('intellectual_property'), localFormData.intellectualProperty)
|
||||||
</el-col>
|
}}</span>
|
||||||
<el-col :span="8">
|
</el-form-item>
|
||||||
<el-form-item label="结束时间" prop="endTime">
|
</el-col>
|
||||||
<span>{{ localFormData.endTime }}</span>
|
<el-col :span="6">
|
||||||
</el-form-item>
|
<el-form-item label="预估专利(项)" prop="newPatent">
|
||||||
</el-col>
|
<span>{{ localFormData.newPatent }}</span>
|
||||||
<el-col :span="8">
|
</el-form-item>
|
||||||
<el-form-item label="项目类型" prop="projectType">
|
</el-col>
|
||||||
<span>{{ filterDict(cacheStore.getDict('project_type'), localFormData.projectType) }}</span>
|
|
||||||
</el-form-item>
|
<el-col :span="6">
|
||||||
</el-col>
|
<el-form-item label="预估软件著作权(项)" prop="softwareCopyright">
|
||||||
<el-col :span="8">
|
<span>{{ localFormData.softwareCopyright }}</span>
|
||||||
<el-form-item label="研发主体" prop="rdSubject">
|
</el-form-item>
|
||||||
<span>{{ filterDict(cacheStore.getDict('rd_subject'), localFormData.rdSubject) }}</span>
|
</el-col>
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="8">
|
<el-col :span="6">
|
||||||
<el-form-item label="出资类型" prop="investmentType">
|
<el-form-item label="预估技术标准(项)" prop="technicalNorms">
|
||||||
<span>{{ filterDict(cacheStore.getDict('invest_type'), localFormData.investmentType) }}</span>
|
<span>{{ localFormData.technicalNorms }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<!-- <el-col :span="8">-->
|
|
||||||
<!-- <el-form-item label="项目影响" prop="projectImpact">-->
|
<el-col :span="6">
|
||||||
<!-- <span>{{ filterDict(cacheStore.getDict('project_impact'), localFormData.projectImpact) }}</span>-->
|
<el-form-item label="预估新产品(项)" prop="newProduct">
|
||||||
<!-- </el-form-item>-->
|
<span>{{ localFormData.newProduct }}</span>
|
||||||
<!-- </el-col>-->
|
</el-form-item>
|
||||||
<el-col :span="8">
|
</el-col>
|
||||||
<el-form-item label="所属业务板块" prop="businessSegment">
|
|
||||||
<span>{{ filterDict(cacheStore.getDict('business_segment'), localFormData.businessSegment) }}</span>
|
<el-col :span="6">
|
||||||
</el-form-item>
|
<el-form-item label="预估新工艺(项)" prop="newProcess">
|
||||||
</el-col>
|
<span>{{ localFormData.newProcess }}</span>
|
||||||
<el-col :span="8">
|
</el-form-item>
|
||||||
<el-form-item label="预期技术标准制定" prop="technicalStandard">
|
</el-col>
|
||||||
<span>{{ filterDict(cacheStore.getDict('technical_standard'), localFormData.technicalStandard) }}</span>
|
|
||||||
</el-form-item>
|
<el-col :span="6">
|
||||||
</el-col>
|
<el-form-item label="预估新装置(项)" prop="newDevice">
|
||||||
<el-col :span="8">
|
<span>{{ localFormData.newDevice }}</span>
|
||||||
<el-form-item label="产学研联合" prop="industryUniversityResearch">
|
</el-form-item>
|
||||||
<span>{{
|
</el-col>
|
||||||
filterDict(cacheStore.getDict('industry_university'), localFormData.industryUniversityResearch)
|
|
||||||
}}</span>
|
<el-col :span="6">
|
||||||
</el-form-item>
|
<el-form-item label="预估新材料(项)" prop="newMaterials">
|
||||||
</el-col>
|
<span>{{ localFormData.newMaterials }}</span>
|
||||||
<el-col :span="8">
|
</el-form-item>
|
||||||
<el-form-item label="开展政府申报" prop="governmentDeclaration">
|
</el-col>
|
||||||
<span>{{
|
|
||||||
filterDict(cacheStore.getDict('government_declaration'), localFormData.governmentDeclaration)
|
<el-col :span="6">
|
||||||
}}</span>
|
<el-form-item label="预估计算机软件(项)" prop="computerSoftware">
|
||||||
</el-form-item>
|
<span>{{ localFormData.computerSoftware }}</span>
|
||||||
</el-col>
|
</el-form-item>
|
||||||
<el-col :span="8" v-if="localFormData.isSpecialFund">
|
</el-col>
|
||||||
<el-form-item label="专项资金名称" prop="specialFund">
|
|
||||||
<span>{{
|
<el-col :span="6">
|
||||||
localFormData.specialFundId === 0 ? localFormData.specialFund : changeName(fundOption, localFormData.specialFundId)
|
<el-form-item label="预估论文论著(项)" prop="thesis">
|
||||||
}}</span>
|
<span>{{ localFormData.thesis }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="8">
|
|
||||||
<el-form-item label="知识产权状况" prop="intellectualProperty">
|
<el-col :span="6">
|
||||||
<span>{{
|
<el-form-item label="预估研究报告(项)" prop="researchReport">
|
||||||
filterDict(cacheStore.getDict('intellectual_property'), localFormData.intellectualProperty)
|
<span>{{ localFormData.researchReport }}</span>
|
||||||
}}</span>
|
</el-form-item>
|
||||||
</el-form-item>
|
</el-col>
|
||||||
</el-col>
|
|
||||||
<el-col :span="16">
|
<el-col :span="6">
|
||||||
<el-form-item label="预期成果形式" prop="resultForm">
|
<el-form-item label="预估商标(项)" prop="trademark">
|
||||||
<span>{{ filterDict(cacheStore.getDict('result_form'), localFormData.resultForm) }}</span>
|
<span>{{ localFormData.trademark }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="24">
|
|
||||||
<baseTitle title="预期知识产权"></baseTitle>
|
<el-col :span="6">
|
||||||
</el-col>
|
<el-form-item label="预估其他(项)" prop="other">
|
||||||
<el-col :span="8">
|
<span style="white-space: pre-wrap">{{ localFormData.other }}</span>
|
||||||
<el-form-item label="发明专利(项)" prop="inventionPatent">
|
</el-form-item>
|
||||||
<span>{{ localFormData.inventionPatent }}</span>
|
</el-col>
|
||||||
</el-form-item>
|
</el-row>
|
||||||
</el-col>
|
|
||||||
<el-col :span="8">
|
<baseTitle title="项目描述"></baseTitle>
|
||||||
<el-form-item label="实用性新型专利(项)" prop="newPatent">
|
<el-row gutter="20" style="margin-left: 5px;margin-bottom: -18px;">
|
||||||
<span>{{ localFormData.newPatent }}</span>
|
<el-col :span="24">
|
||||||
</el-form-item>
|
<el-form-item label="现有业务描述" prop="serviceDescription">
|
||||||
</el-col>
|
<span style="white-space: pre-wrap">{{ localFormData.serviceDescription }}</span>
|
||||||
<el-col :span="8">
|
</el-form-item>
|
||||||
<el-form-item label="软件著作权(项)" prop="softwareCopyright">
|
</el-col>
|
||||||
<span>{{ localFormData.softwareCopyright }}</span>
|
<el-col :span="24">
|
||||||
</el-form-item>
|
<el-form-item label="建设目标描述" prop="contentDescription">
|
||||||
</el-col>
|
<span style="white-space: pre-wrap">{{ localFormData.contentDescription }}</span>
|
||||||
<el-col :span="8">
|
</el-form-item>
|
||||||
<el-form-item label="著作权(项)" prop="copyright">
|
</el-col>
|
||||||
<span>{{ localFormData.copyright }}</span>
|
</el-row>
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
<baseTitle title="需求上报申请书" style="margin-bottom: -3px;"></baseTitle>
|
||||||
<el-col :span="8">
|
<!-- <el-row gutter="20" style="margin-bottom: -15px;">-->
|
||||||
<el-form-item label="其他(项)" prop="other">
|
<!-- <el-col :span="24">-->
|
||||||
<span>{{ localFormData.other }}</span>
|
<!-- <single-file-component tag="需求上报" v-model:value="localFormData.singleFile" :processViewer="processViewer"/>-->
|
||||||
</el-form-item>
|
<!-- <!– <el-form-item>–>-->
|
||||||
</el-col>
|
<!-- <!– {{localFormData.singleFile}}–>-->
|
||||||
<el-col :span="8">
|
<!-- <!– <el-button type="primary" link @click="handleDownload(localFormData.singleFile)" style="font-size: 16px">–>-->
|
||||||
<el-form-item label="经济预算(元)" prop="economicEstimate">
|
<!-- <!– {{ localFormData.singleFile?.originalFileName }}–>-->
|
||||||
<span>{{ toThousands(localFormData.economicEstimate) }}</span>
|
<!-- <!– </el-button>–>-->
|
||||||
</el-form-item>
|
<!-- <!– </el-form-item>–>-->
|
||||||
</el-col>
|
<!-- </el-col>-->
|
||||||
<el-col :span="8">
|
<!-- </el-row>-->
|
||||||
<el-form-item label="其中申请公司总部科技创新专项资金(元)" prop="specialFundAmount"
|
<!--/* <baseTitle title="附件文件" style="margin-bottom: 0"></baseTitle>*/-->
|
||||||
v-if="localFormData.isSpecialFund">
|
<el-row gutter="20" style="margin-bottom: -18px;">
|
||||||
<span>{{ toThousands(localFormData.specialFundAmount) }}</span>
|
<el-col :span="24" class="file-table-style">
|
||||||
</el-form-item>
|
<file-component tag="需求上报"
|
||||||
</el-col>
|
v-model:value="localFormData.fileList" :processViewer="processViewer"
|
||||||
<el-col :span="24">
|
:file-list-show="fileListShow"/>
|
||||||
<el-form-item label="现有业务描述" prop="serviceDescription">
|
</el-col>
|
||||||
<span>{{ localFormData.serviceDescription }}</span>
|
<el-col :span="24" style="margin-top: -15px">
|
||||||
</el-form-item>
|
<div v-if="data.taskId">
|
||||||
</el-col>
|
<baseTitle title="审核意见"></baseTitle>
|
||||||
<el-col :span="24">
|
<el-form-item prop="_value">
|
||||||
<el-form-item label="研发项目关键内容描述" prop="contentDescription">
|
<el-input
|
||||||
<span>{{ localFormData.contentDescription }}</span>
|
v-model="_value"
|
||||||
</el-form-item>
|
:rows="3"
|
||||||
</el-col>
|
type="textarea"
|
||||||
<el-col :span="24">
|
placeholder="请输入审核意见"
|
||||||
<baseTitle title="需求上报申请书"></baseTitle>
|
/>
|
||||||
</el-col>
|
</el-form-item>
|
||||||
<el-col :span="24">
|
</div>
|
||||||
<el-form-item>
|
<div v-if="data.state==='5'" style="margin-bottom: 15px">
|
||||||
<el-button type="primary" link @click="handleDownload(localFormData.singleFile)" style="font-size: 16px">
|
<baseTitle title="前置流程" v-if="localFormData.preProcess"></baseTitle>
|
||||||
{{ localFormData.singleFile?.originalFileName }}
|
<div style="display: flex;align-items: center;flex-wrap: wrap;">
|
||||||
</el-button>
|
<div v-for="(item,index) in localFormData.preProcess" :key="item.requestId">
|
||||||
</el-form-item>
|
<a :href="item.baseUrl" target="_blank"
|
||||||
</el-col>
|
style="color: #2a99ff;cursor: pointer">{{ item.requestName }}<span
|
||||||
<el-col :span="24">
|
v-if="index != localFormData.preProcess.length -1">,</span>
|
||||||
<baseTitle title="附件列表"></baseTitle>
|
</a>
|
||||||
</el-col>
|
</div>
|
||||||
<el-col :span="24">
|
</div>
|
||||||
<file-component tag="需求上报"
|
</div>
|
||||||
v-model:value="localFormData.fileList" :processViewer="processViewer"
|
<div v-perm="['annual:plan:approve']" v-if="data.state==='4'">
|
||||||
:file-list-show="fileListShow"/>
|
<!-- <baseTitle title="前置流程"></baseTitle>-->
|
||||||
</el-col>
|
<!-- <select-pre-process :formData="localFormData"/>-->
|
||||||
<el-col :span="24">
|
<baseTitle title="审核意见"></baseTitle>
|
||||||
<div v-if="data.taskId||data.state==='4'">
|
<el-form-item prop="_value">
|
||||||
<baseTitle title="审核意见"></baseTitle>
|
<el-input
|
||||||
<el-form-item prop="_value">
|
v-model="_value"
|
||||||
<el-input
|
:rows="3"
|
||||||
v-model="_value"
|
type="textarea"
|
||||||
:rows="3"
|
placeholder="请输入审核意见"
|
||||||
type="textarea"
|
/>
|
||||||
placeholder="请输入审核意见"
|
</el-form-item>
|
||||||
/>
|
</div>
|
||||||
</el-form-item>
|
</el-col>
|
||||||
</div>
|
</el-row>
|
||||||
</el-col>
|
<div class="approval-record">
|
||||||
</el-row>
|
<div class="approval-title" style="margin-top: -12px">
|
||||||
<div class="approval-record">
|
<baseTitle title="审批记录"></baseTitle>
|
||||||
<div class="approval-title">
|
<div class="diagram">
|
||||||
<baseTitle title="审批记录"></baseTitle>
|
<div class="base-title">流程图</div>
|
||||||
<div class="diagram">
|
<el-switch
|
||||||
<div class="base-title">流程图</div>
|
v-model="changeDiagram"
|
||||||
<el-switch
|
style="--el-switch-on-color:#BEA266 ; --el-switch-off-color:#cecdcd"
|
||||||
v-model="changeDiagram"
|
/>
|
||||||
style="--el-switch-on-color:#BEA266 ; --el-switch-off-color:#cecdcd"
|
</div>
|
||||||
/>
|
<el-button color="#DED0B2" style="margin-left: 10px"
|
||||||
</div>
|
@click="handleCarbonCopy()">立即抄送
|
||||||
</div>
|
</el-button>
|
||||||
<div class="process">
|
</div>
|
||||||
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
|
<div class="process">
|
||||||
:operation-list="data.operationList"
|
<operation-render v-if="processViewer && data.operationList && data.operationList.length > 0&&!changeDiagram"
|
||||||
:step="'report'"
|
:operation-list="data.operationList"
|
||||||
:state="data.state"/>
|
:step="'report'"
|
||||||
<process-diagram-viewer v-if="processViewer&&changeDiagram" id-name="summaryProcess"/>
|
:state="data.state"/>
|
||||||
</div>
|
<process-diagram-viewer v-if="processViewer&&changeDiagram" id-name="summaryProcess"/>
|
||||||
</div>
|
</div>
|
||||||
</el-form>
|
</div>
|
||||||
<div class="oper-page-btn" v-perm="['annual:plan:approve']" v-if="data.state==='4'">
|
</el-form>
|
||||||
<el-button type="danger" @click="handleRejectPlan">驳回年度计划</el-button>
|
<user-picker :multiple="true" ref="carbonCopyUserRef" title="请选择抄送人员"
|
||||||
<el-button color="#DED0B2" @click="handleAgreePlan">通过年度计划</el-button>
|
v-model:value="carbonCopyUserList" @ok="carbonCopyUserPickerOk"
|
||||||
</div>
|
@cancelOrClear="carbonCopyUserPickerOk"/>
|
||||||
</div>
|
|
||||||
</template>
|
<div class="oper-page-btn" v-perm="['annual:plan:approve']" v-if="data.state==='4'">
|
||||||
|
<el-button type="danger" @click="handleRejectPlan">驳回项目计划</el-button>
|
||||||
<script setup lang="jsx">
|
<el-button color="#DED0B2" @click="handleAgreePlan">通过项目计划</el-button>
|
||||||
import {toThousands} from '@/utils/changePrice.js'
|
</div>
|
||||||
import {downloadFile, deleteFile} from "@/api/project-demand";
|
</div>
|
||||||
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
</template>
|
||||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'
|
|
||||||
import {useTagsView} from '@/stores/tagsview.js'
|
<script setup lang="jsx">
|
||||||
import {getFundOption} from "@/api/special-fund";
|
import {toThousands} from '@/utils/changePrice.js'
|
||||||
import {useCacheStore} from '@/stores/cache.js'
|
import {downloadFile, deleteFile} from "@/api/project-demand";
|
||||||
import {getSubCompOpt} from "@/api/user/user";
|
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
||||||
import FileComponent from "./FileComponent.vue";
|
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'
|
||||||
import {ElNotification} from "element-plus";
|
import {useTagsView} from '@/stores/tagsview.js'
|
||||||
import {approvePlan} from "@/api/project-demand/summary";
|
import {getFundOption} from "@/api/special-fund";
|
||||||
|
import {useCacheStore} from '@/stores/cache.js'
|
||||||
const emit = defineEmits(['update:value'])
|
import {getSubCompOpt} from "@/api/user/user";
|
||||||
const tagsViewStore = useTagsView()
|
import FileComponent from "./FileComponent.vue";
|
||||||
const cacheStore = useCacheStore()
|
import {ElNotification} from "element-plus";
|
||||||
const props = defineProps({
|
import {approvePlan} from "@/api/project-demand/summary";
|
||||||
formData: {
|
import SelectPreProcess from "@/components/SelectPreProcess.vue";
|
||||||
type: Object,
|
import {applyCcSend} from "@/api/expense-manage";
|
||||||
default: {}
|
import UserPicker from "@/views/workflow/process/common/UserPicker.vue";
|
||||||
},
|
|
||||||
data: {
|
const emit = defineEmits(['update:value','ccSend'])
|
||||||
type: Object,
|
const tagsViewStore = useTagsView()
|
||||||
default: {
|
const cacheStore = useCacheStore()
|
||||||
state: '1'
|
const props = defineProps({
|
||||||
}
|
formData: {
|
||||||
},
|
type: Object,
|
||||||
processViewer: {
|
default: {}
|
||||||
type: Boolean,
|
},
|
||||||
default: false
|
data: {
|
||||||
},
|
type: Object,
|
||||||
fileListShow: {
|
default: {
|
||||||
type: String,
|
state: '1'
|
||||||
default: 'READ'
|
}
|
||||||
},
|
},
|
||||||
loading: {
|
processViewer: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
value: {
|
fileListShow: {
|
||||||
type: String,
|
type: String,
|
||||||
default: ''
|
default: 'READ'
|
||||||
}
|
},
|
||||||
})
|
loading: {
|
||||||
const changeDiagram = ref(false)
|
type: Boolean,
|
||||||
const localFormData = ref({})
|
default: false
|
||||||
const route = useRoute()
|
},
|
||||||
const router = useRouter()
|
value: {
|
||||||
const fundOption = ref([])
|
type: String,
|
||||||
const companyOption = ref([])
|
default: ''
|
||||||
const dictName = ref({})
|
}
|
||||||
const rules = reactive({
|
})
|
||||||
auditOpinion: [{required: true, message: '请输入审核意见', trigger: 'blur'}],
|
const changeDiagram = ref(false)
|
||||||
})
|
const localFormData = ref({})
|
||||||
const _value = computed({
|
const route = useRoute()
|
||||||
get() {
|
const router = useRouter()
|
||||||
return props.value;
|
const fundOption = ref([])
|
||||||
},
|
const companyOption = ref([])
|
||||||
set(val) {
|
const dictName = ref({})
|
||||||
emit("update:value", val);
|
const carbonCopyUserList = ref([])
|
||||||
}
|
const carbonCopyUserRef = ref()
|
||||||
})
|
const rules = reactive({
|
||||||
const handleRejectPlan = async () => {
|
auditOpinion: [{required: true, message: '请输入审核意见', trigger: 'blur'}],
|
||||||
// const values = form.value.getValues()
|
})
|
||||||
// console.log('route',route.query.projectId)
|
const _value = computed({
|
||||||
if (!_value.value) {
|
get() {
|
||||||
ElNotification({
|
return props.value;
|
||||||
title: '提示',
|
},
|
||||||
message: '请填写审核意见',
|
set(val) {
|
||||||
type: 'warning'
|
emit("update:value", val);
|
||||||
})
|
}
|
||||||
return
|
})
|
||||||
}
|
const handleCarbonCopy = () => {
|
||||||
const params = {
|
carbonCopyUserRef.value.showUserPicker()
|
||||||
auditOpinion:_value.value,
|
}
|
||||||
projectId:parseInt(route.query.projectId),
|
const carbonCopyUserPickerOk = (userList) => {
|
||||||
state:false
|
carbonCopyUserList.value = userList.map(item => item.id)
|
||||||
}
|
console.log('localFormData.value', props.data)
|
||||||
// console.log('params', params)
|
console.log("🚀 ~ file:'carbonCopyUserList.value ", carbonCopyUserList.value)
|
||||||
const res = await approvePlan(params)
|
|
||||||
ElNotification({
|
addUser()
|
||||||
title: '提示',
|
}
|
||||||
message: res.msg,
|
const addUser = async () => {
|
||||||
type: res.code === 1000 ? 'success' : 'error'
|
const res = await applyCcSend({
|
||||||
})
|
instanceId: props.data.processInstanceId,
|
||||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
projectId: route.query.projectId,
|
||||||
router.push({
|
state: route.query.step,
|
||||||
name: 'Summary'
|
userIds: carbonCopyUserList.value
|
||||||
})
|
})
|
||||||
}
|
console.log('res', res)
|
||||||
const handleAgreePlan = async () => {
|
if (res.code === 1000) {
|
||||||
const params = {
|
ElNotification({
|
||||||
auditOpinion:_value.value,
|
title: '提示',
|
||||||
projectId:parseInt(route.query.projectId),
|
message: '抄送成功',
|
||||||
state:true
|
type: 'success'
|
||||||
}
|
})
|
||||||
// console.log('params', params)
|
emit('ccSend')
|
||||||
const res = await approvePlan(params)
|
} else {
|
||||||
ElNotification({
|
ElNotification({
|
||||||
title: '提示',
|
title: '提示',
|
||||||
message: res.msg,
|
message: res.msg,
|
||||||
type: res.code === 1000 ? 'success' : 'error'
|
type: 'error'
|
||||||
})
|
})
|
||||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
}
|
||||||
router.push({
|
}
|
||||||
name: 'Summary'
|
const handleRejectPlan = async () => {
|
||||||
})
|
// const values = form.value.getValues()
|
||||||
}
|
// console.log('route',route.query.projectId)
|
||||||
const filterDict = (data, value) => {
|
if (!_value.value) {
|
||||||
if (data === undefined || value === undefined) return;
|
ElNotification({
|
||||||
let label = ''
|
title: '提示',
|
||||||
let result = []
|
message: '请填写审核意见',
|
||||||
if (value instanceof Array) {
|
type: 'warning'
|
||||||
value.forEach(item1 => {
|
})
|
||||||
data.find(item => {
|
return
|
||||||
if (item.value == item1) {
|
}
|
||||||
result.push(item.label)
|
const params = {
|
||||||
}
|
auditOpinion: _value.value,
|
||||||
})
|
projectId: parseInt(route.query.projectId),
|
||||||
})
|
state: false
|
||||||
label = result.map(item => item).join(',')
|
}
|
||||||
} else {
|
// console.log('params', params)
|
||||||
if (data instanceof Array) {
|
const res = await approvePlan(params)
|
||||||
data.find(item => {
|
ElNotification({
|
||||||
if (item.value == value) {
|
title: '提示',
|
||||||
label = item.label
|
message: res.msg,
|
||||||
}
|
type: res.code === 1000 ? 'success' : 'error'
|
||||||
})
|
})
|
||||||
}
|
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||||
}
|
router.push({
|
||||||
return label
|
name: 'Summary'
|
||||||
}
|
})
|
||||||
const getFundOptions = async () => {
|
}
|
||||||
const resFund = await getFundOption()
|
const handleAgreePlan = async () => {
|
||||||
fundOption.value = resFund.data
|
if (!_value.value) {
|
||||||
const res = await getSubCompOpt()
|
ElNotification({
|
||||||
companyOption.value = res.data
|
title: '提示',
|
||||||
}
|
message: '请填写审核意见',
|
||||||
const changeName = (option, value) => {
|
type: 'warning'
|
||||||
let name = ''
|
})
|
||||||
option.forEach(item => {
|
return
|
||||||
if (item.value == value) {
|
}
|
||||||
name = item.label
|
const params = {
|
||||||
}
|
auditOpinion: _value.value,
|
||||||
})
|
projectId: parseInt(route.query.projectId),
|
||||||
return name
|
preProcess: JSON.stringify(localFormData.value.preProcess),
|
||||||
}
|
state: true
|
||||||
const handleDownload = (row) => {
|
}
|
||||||
downloadFile(row.fileId).then(res => {
|
|
||||||
const blob = new Blob([res])
|
const res = await approvePlan(params)
|
||||||
let a = document.createElement('a')
|
ElNotification({
|
||||||
a.href = URL.createObjectURL(blob)
|
title: '提示',
|
||||||
a.download = row.originalFileName
|
message: res.msg,
|
||||||
a.click()
|
type: res.code === 1000 ? 'success' : 'error'
|
||||||
})
|
})
|
||||||
}
|
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||||
|
router.push({
|
||||||
watch(() => props.processViewer, (newVal) => {
|
name: 'Summary'
|
||||||
props.processViewer = newVal
|
})
|
||||||
}, {deep: true})
|
}
|
||||||
|
const filterDict = (data, value) => {
|
||||||
watch(() => props.loading, (newVal) => {
|
if (data === undefined || value === undefined) return;
|
||||||
props.loading = newVal
|
let label = ''
|
||||||
}, {deep: true})
|
let result = []
|
||||||
|
if (value instanceof Array) {
|
||||||
watchEffect(() => {
|
value.forEach(item1 => {
|
||||||
return Object.keys(props.formData).length && (localFormData.value = props.formData)
|
data.find(item => {
|
||||||
})
|
if (item.value == item1) {
|
||||||
|
result.push(item.label)
|
||||||
getFundOptions()
|
}
|
||||||
</script>
|
})
|
||||||
|
})
|
||||||
<style scoped lang="scss">
|
label = result.map(item => item).join(',')
|
||||||
.detail-block {
|
} else {
|
||||||
overflow-x: hidden;
|
if (data instanceof Array) {
|
||||||
overflow-y: auto;
|
data.find(item => {
|
||||||
padding-bottom: 0!important;
|
if (item.value == value) {
|
||||||
}
|
label = item.label
|
||||||
</style>
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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>
|
<template>
|
||||||
<el-upload :file-list="_value"
|
<el-upload :file-list="_value" ref="uploadRef"
|
||||||
:action="uploadFileUrl"
|
action="#"
|
||||||
:headers="headers"
|
:headers="headers"
|
||||||
:limit="maxSize"
|
:limit="maxSize"
|
||||||
with-credentials
|
with-credentials
|
||||||
:multiple="multiple"
|
:multiple="multiple"
|
||||||
:data="uploadParams"
|
:data="uploadParams" :on-change="handleChange"
|
||||||
:show-file-list="showFileList"
|
:http-request="customUpload"
|
||||||
:auto-upload="true"
|
:show-file-list="showFileList"
|
||||||
:before-upload="beforeUpload"
|
:auto-upload="false"
|
||||||
:on-success="handleUploadSuccess"
|
:before-upload="beforeUpload"
|
||||||
:on-error="uploadError"
|
:on-error="uploadError"
|
||||||
:before-remove="beforeRemove"
|
:before-remove="beforeRemove"
|
||||||
:on-remove="handleRemove"
|
:on-remove="handleRemove"
|
||||||
>
|
>
|
||||||
<el-button color="#DED0B2" :loading="loading" :disabled="disabled">上传文件</el-button>
|
<!-- :on-success="handleUploadSuccess"-->
|
||||||
</el-upload>
|
<el-button color="#DED0B2" :loading="loading" :disabled="disabled">上传文件</el-button>
|
||||||
</template>
|
</el-upload>
|
||||||
|
</template>
|
||||||
<script setup>
|
|
||||||
import { ElMessageBox, ElNotification} from "element-plus";
|
<script setup>
|
||||||
import {getToken} from '@/utils/auth'
|
import {ElLoading, ElMessage, ElMessageBox, ElNotification} from "element-plus";
|
||||||
|
import {getToken} from '@/utils/auth'
|
||||||
const baseURL = import.meta.env.VITE_BASE_URL
|
import {nextTick} from "vue";
|
||||||
const uploadFileUrl = ref(baseURL + "/workflow/process/file/upload")
|
import axios from "axios";
|
||||||
const headers = reactive({
|
|
||||||
authorization: getToken()
|
const baseURL = import.meta.env.VITE_BASE_URL
|
||||||
})
|
const uploadFileUrl = ref(baseURL + "/workflow/process/file/upload")
|
||||||
const loading = ref(false)
|
const headers = reactive({
|
||||||
const showTable = ref(false)
|
'Content-Type': 'multipart/form-data',
|
||||||
const uploadParams = ref({})
|
authorization: getToken()
|
||||||
const props = defineProps({
|
})
|
||||||
value: {
|
const loading = ref(false)
|
||||||
type: Array,
|
const showTable = ref(false)
|
||||||
default: () => {
|
const uploadIndex = ref(0)
|
||||||
return []
|
const uploadParams = ref({})
|
||||||
}
|
const props = defineProps({
|
||||||
},
|
value: {
|
||||||
maxSize: {
|
type: Array,
|
||||||
type: Number,
|
default: () => {
|
||||||
default: 30
|
return []
|
||||||
},
|
}
|
||||||
showFileList: {
|
},
|
||||||
type: Boolean,
|
maxSize: {
|
||||||
default: false
|
type: Number,
|
||||||
},
|
default: 999999
|
||||||
disabled: {
|
},
|
||||||
type: Boolean,
|
showFileList: {
|
||||||
default: false
|
type: Boolean,
|
||||||
},
|
default: false
|
||||||
multiple: {
|
},
|
||||||
type: Boolean,
|
disabled: {
|
||||||
default: true
|
type: Boolean,
|
||||||
}
|
default: false
|
||||||
})
|
},
|
||||||
|
multiple: {
|
||||||
const emit = defineEmits(["input", "getFile", "delete"])
|
type: Boolean,
|
||||||
const fileList = ref([])
|
default: true
|
||||||
const _value = computed({
|
}
|
||||||
get() {
|
})
|
||||||
return props.value;
|
const uploadRef = ref(null); // el-upload 的 ref
|
||||||
},
|
const uploadPromises = ref([]); // 跟踪每个文件的上传状态
|
||||||
set(val) {
|
const emit = defineEmits(["input", "beforeUpload", "getFile", "delete"])
|
||||||
emit("input", val);
|
const fileList = ref([])
|
||||||
}
|
const _value = computed({
|
||||||
})
|
get() {
|
||||||
const beforeRemove = (file) => {
|
return props.value;
|
||||||
return ElMessageBox.confirm(`确认删除名称为${file.name}的文件吗?`, '系统提示', {
|
},
|
||||||
confirmButtonText: '确定',
|
set(val) {
|
||||||
cancelButtonText: '取消',
|
emit("input", val);
|
||||||
type: 'warning'
|
}
|
||||||
}).then(() => true)
|
})
|
||||||
}
|
const beforeRemove = (file) => {
|
||||||
|
return ElMessageBox.confirm(`确认删除名称为${file.name}的文件吗?`, '系统提示', {
|
||||||
const handleRemove = (file) => {
|
confirmButtonText: '确定',
|
||||||
emit("delete", file.response.data.id)
|
cancelButtonText: '取消',
|
||||||
}
|
type: 'warning'
|
||||||
const beforeUpload = () => {
|
}).then(() => true)
|
||||||
loading.value = true
|
}
|
||||||
return true
|
|
||||||
}
|
const uploadLoading = ref(false)
|
||||||
const handleUploadSuccess = (res) => {
|
const uploadFile = ref([])
|
||||||
ElNotification({
|
const handleRemove = (file) => {
|
||||||
title: '提示',
|
emit("delete", file.response.data.id)
|
||||||
message: res.code === 1000 ? '上传成功' : '上传失败',
|
}
|
||||||
type: res.code === 1000 ? 'success' : 'error'
|
|
||||||
})
|
// 文件选择变化时触发
|
||||||
loading.value = false
|
const handleChange = (file, files) => {
|
||||||
showTable.value = true
|
const deleteFileRow = JSON.parse(localStorage.getItem('deleteFileRow'));
|
||||||
let data = res.data
|
console.log("🚀 ~ file:deleteFileRow ", deleteFileRow, uploadFile.value)
|
||||||
fileList.value.push(data)
|
let deleteIndex = null
|
||||||
emit("getFile", res.data)
|
if (deleteFileRow) {
|
||||||
}
|
deleteIndex = uploadFile.value.findIndex((item) => item.name === deleteFileRow.originalFileName && item.size === deleteFileRow.size)
|
||||||
const uploadError = () => {
|
console.log("🚀 ~ file:deleteIndex ", deleteIndex)
|
||||||
loading.value = false
|
|
||||||
ElNotification({
|
if (deleteIndex != -1) {
|
||||||
title: '提示',
|
uploadFile.value.splice(deleteIndex, 1);
|
||||||
message: "上传失败,请稍后再试!",
|
}
|
||||||
type: 'error'
|
}
|
||||||
})
|
|
||||||
}
|
|
||||||
defineExpose({
|
console.log(file, files, 'files')
|
||||||
handleRemove
|
uploadIndex.value++
|
||||||
})
|
uploadFile.value.push(file)
|
||||||
</script>
|
console.log("🚀 ~ file:uploadFile.value ", uploadFile.value)
|
||||||
|
localStorage.removeItem('deleteFileRow')
|
||||||
<style lang="scss" scoped>
|
};
|
||||||
a {
|
watch(() => uploadIndex.value, (newVal) => {
|
||||||
font-size: 14px;
|
console.log('newVal', newVal)
|
||||||
color: #2a99ff;
|
startUpload(uploadFile.value); // 自动触发上传
|
||||||
}
|
}, {
|
||||||
|
deep: true
|
||||||
:deep(.el-upload-list) {
|
})
|
||||||
width: 400px;
|
// 自定义上传逻辑
|
||||||
}
|
const customUpload = async (options) => {
|
||||||
</style>
|
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>
|
<script setup>
|
||||||
defineProps({
|
defineProps({
|
||||||
msg: {
|
msg: {
|
||||||
type: String,
|
type: String,
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="greetings">
|
<div class="greetings">
|
||||||
<h1 class="green">{{ msg }}</h1>
|
<h1 class="green">{{ msg }}</h1>
|
||||||
<h3>
|
<h3>
|
||||||
You’ve successfully created a project with
|
You’ve successfully created a project with
|
||||||
<a href="https://vitejs.dev/" target="_blank" rel="noopener">Vite</a> +
|
<a href="https://vitejs.dev/" target="_blank" rel="noopener">Vite</a> +
|
||||||
<a href="https://vuejs.org/" target="_blank" rel="noopener">Vue 3</a>.
|
<a href="https://vuejs.org/" target="_blank" rel="noopener">Vue 3</a>.
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
h1 {
|
h1 {
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
font-size: 2.6rem;
|
font-size: 2.6rem;
|
||||||
top: -10px;
|
top: -10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
h3 {
|
h3 {
|
||||||
font-size: 1.2rem;
|
font-size: 1.2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.greetings h1,
|
.greetings h1,
|
||||||
.greetings h3 {
|
.greetings h3 {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (min-width: 1024px) {
|
@media (min-width: 1024px) {
|
||||||
.greetings h1,
|
.greetings h1,
|
||||||
.greetings h3 {
|
.greetings h3 {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||