Compare commits
2688 Commits
revert-4cd
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 5261adbef9 | |||
| ffdd559370 | |||
| 58c709dc21 | |||
| f0bd08af83 | |||
| 8b262bd028 | |||
| f96d7284f3 | |||
| 73a834b91b | |||
| 76acf73ee1 | |||
| 008f5d88da | |||
| 6b590c6021 | |||
| d3362c9023 | |||
| 37184edfc5 | |||
| f817b41e0a | |||
| 0710e2cca2 | |||
| 664ee868ed | |||
| f36d66e80e | |||
| f7a6f32bbe | |||
| 993a664514 | |||
| 249fd97093 | |||
| b799ae1140 | |||
| 01a6f77138 | |||
| 59b6c52e8a | |||
| 4a920bf101 | |||
| 9860d06a06 | |||
| 839cae6594 | |||
| c388aa33c2 | |||
| 5f5d75c136 | |||
| 12d57e131f | |||
| 905b10d14a | |||
| f5b9bb5bca | |||
| bac30c03dc | |||
| eb47cc7c5d | |||
| 597c521583 | |||
| 33bffba6b2 | |||
| af14c7ab1a | |||
| a789b00790 | |||
| 0195a624c2 | |||
| a787ea5442 | |||
| 9bcdc22e45 | |||
| 3f76852e2f | |||
| 3815e9756d | |||
| 2304a30de0 | |||
| 1b2dd81fed | |||
| c86d700555 | |||
| 6dcb90f7f4 | |||
| f20df8ac89 | |||
| 867e2cc4ba | |||
| 49865f6426 | |||
| 9babeb38b1 | |||
| a7f3eb7eb1 | |||
| 77e8b09d2a | |||
| ec7374a5fd | |||
| 3601efccc0 | |||
| 616f3c64cd | |||
| dee0ad410f | |||
| 522c990d62 | |||
| c0e08a5136 | |||
| b40ca2f5ea | |||
| 7d92f8771f | |||
| 1f5d770714 | |||
| 1b0a7d4c95 | |||
| 32b60b6eb5 | |||
| a55b2dc7ca | |||
| 6968085081 | |||
| 5b033e0e07 | |||
| 8cee9c6fa0 | |||
| a5b97bc4ed | |||
| f4dfb848bf | |||
| e3aab0fc5b | |||
| e728f0346b | |||
| d04e52bb43 | |||
| f5b0e5dac5 | |||
| 29cbfb522a | |||
| a3b6ef258d | |||
| 693ef3e779 | |||
| 40527cabc1 | |||
| 5387281210 | |||
| 3fb6937c87 | |||
| b8870850b4 | |||
| 094ca57d6a | |||
| d948069b5e | |||
| a42cbf248b | |||
| 5677e6a371 | |||
| 94b658b834 | |||
| 70b8ef3262 | |||
| 44c34efc96 | |||
| 2ce3afa020 | |||
| 539a832228 | |||
| 2ab5f8cb58 | |||
| c49c3916be | |||
| 231224a5e5 | |||
| 08c00e7aa8 | |||
| 364c5f8391 | |||
| 46e49cbdc9 | |||
| dd35b3e786 | |||
| a554388123 | |||
| 30936c180d | |||
| 582ea2d3fa | |||
| 6aaf6517e4 | |||
| eb75a988af | |||
| 4068a3ece2 | |||
| 75aad09601 | |||
| 6addf5c416 | |||
| 876e1c061f | |||
| e44e999251 | |||
| bebb3b0533 | |||
| 771c2e51dc | |||
| 3c07963da5 | |||
| e98300c9a2 | |||
| ceccac616f | |||
| c5edc81049 | |||
| 0493d19972 | |||
| 43fd681f76 | |||
| 548460d986 | |||
| 6fcb57a45e | |||
| bc5a8cd240 | |||
| 013cd22d7b | |||
| f654f43f42 | |||
| d4e27d47eb | |||
| 99a83acacb | |||
| df934dbddd | |||
| ce002d94df | |||
| 2005110dcb | |||
| f6084ea1e6 | |||
| 95492cff61 | |||
| 82169c54e1 | |||
| 222ff384ce | |||
| 181d85c7eb | |||
| 35a82362e8 | |||
| 43bf5ea968 | |||
| 7e3783b479 | |||
| df09ed518a | |||
| 46835b6291 | |||
| 663da01396 | |||
| 9e5c7cc01f | |||
| 16ac865866 | |||
| 58375de2f7 | |||
| ff7a5a80fc | |||
| 792598efd4 | |||
| 5b1d849d31 | |||
| fe7010f227 | |||
| e1d266e9cc | |||
| 450892e79d | |||
| aacf116e4b | |||
| d6c66a21a2 | |||
| 1cc8bdda80 | |||
| 7c60afa122 | |||
| 7f8e5d748b | |||
| 4f15dc2d17 | |||
| ddfa9ae6ee | |||
| a08187ca0e | |||
| 28819215fd | |||
| 1cd0ff363c | |||
| 389a92c738 | |||
| 0a94c81031 | |||
| 87fe9ecb7f | |||
| 4a2d6de9f5 | |||
| f7953889ba | |||
| 925e2050d1 | |||
| a2f7ba9a4f | |||
| 46ae0c462a | |||
| fbc133f96d | |||
| e6f9136247 | |||
| fb12826a5d | |||
| f7a908f5c8 | |||
| bb95804f3c | |||
| f958cfe64b | |||
| 1f1db511e6 | |||
| 93b3e54035 | |||
| 3a30575fd5 | |||
| 9d486e9cc8 | |||
| 7f7f1f8ffc | |||
| 04ddc1c111 | |||
| db46e5c093 | |||
| fa3794437d | |||
| ffaf43a9ee | |||
| b4c2b2dc85 | |||
| f60831777c | |||
| c459a39053 | |||
| 7e50c5c770 | |||
| 831ca12558 | |||
| e98f198920 | |||
| fe44add18f | |||
| 5557787d77 | |||
| 80a0c69805 | |||
| 89c9f93daa | |||
| 2ef736324b | |||
| cf35a9c679 | |||
| 461532214c | |||
| bf21ac030b | |||
| d0e8ea1eac | |||
| cca5e02384 | |||
| dd3dd6ff4f | |||
| 67ca5f4cb3 | |||
| 503f68fec8 | |||
| f395483903 | |||
| c64ae3a93a | |||
| bfbcb144ae | |||
| 4a52639e79 | |||
| 540ea2ee58 | |||
| 6104c464e9 | |||
| 461bf39813 | |||
| faf399ca44 | |||
| 14c91d242b | |||
| e6a451c0a5 | |||
| b3cdcf5bff | |||
| 4006e70c37 | |||
| 177d1eefd5 | |||
| 8462c41b9c | |||
| 3670c8e515 | |||
| 3737d0e943 | |||
| a80b0513f2 | |||
| 66a53e62d9 | |||
| 70e63279aa | |||
| db597dc3b4 | |||
| 8b316d6157 | |||
| 89262801a8 | |||
| 23fc6a465d | |||
| 875a2414d2 | |||
| 7a035b61fd | |||
| 9161156e99 | |||
| 932db393cb | |||
| d9b7901b75 | |||
| d5e8e5eb60 | |||
| bd95bcc71f | |||
| 504f01d10e | |||
| 37ad46224d | |||
| 5e88772da7 | |||
| 36bb407c3f | |||
| 9fe45a2a96 | |||
| 023bfdf71d | |||
| a8fa9fd1af | |||
| d232174098 | |||
| fa27c4a601 | |||
| 10b05f7aac | |||
| cb9d0ed593 | |||
| 7f73ea2433 | |||
| 6919e5864b | |||
| 6f0a977a68 | |||
| 1d3f287e90 | |||
| 75fc4c9919 | |||
| bf1e9e1b91 | |||
| e8bc79ff9f | |||
| 6a150ee3a3 | |||
| f0f611f0be | |||
| b5896cfdaf | |||
| 2e0096b03b | |||
| 0750c07959 | |||
| 402bb51a41 | |||
| 16906ba5ad | |||
| 9e57671572 | |||
| eee6eb0581 | |||
| 5a980b216e | |||
| 1d9013260a | |||
| 0c0db501da | |||
| e4432a8ad0 | |||
| d75f859b50 | |||
| a086f5bc8c | |||
| 567f825e62 | |||
| 29b289b07c | |||
| e8172b12b1 | |||
| b97e27a2f4 | |||
| a8978500d5 | |||
| 4ec6d2b7ac | |||
| 5336f93d0a | |||
| 0d9affdf6f | |||
| 7a4e3d4a90 | |||
| e87678d036 | |||
| ab03f77fe4 | |||
| a3871e2b0f | |||
| 5c992ed4c6 | |||
| 72acb451e7 | |||
| aebaf7c724 | |||
| 5551d70879 | |||
| ebab63a988 | |||
| b82d58f40f | |||
| b2c41c13b5 | |||
| 80be7f8f03 | |||
| 5240a15504 | |||
| 08cecb1ac7 | |||
| 8b7edc68f0 | |||
| 42568efef5 | |||
| afd0af7c3b | |||
| 279a91b326 | |||
| 7cf641f948 | |||
| 79014159ea | |||
| 13d7859a2d | |||
| 28648fa672 | |||
| 3d576487d4 | |||
| 3cd8a56f49 | |||
| 553c9dceb1 | |||
| c4c740ed3a | |||
| d6cbe09cc7 | |||
| 0ef44d20f2 | |||
| f850722613 | |||
| 846959b798 | |||
| 859da91fac | |||
| 16f34a9d14 | |||
| 2c731c13c0 | |||
| 9422e97eb6 | |||
| 1544de5562 | |||
| 2cff827e3f | |||
| 82217dfc7b | |||
| 7178081da8 | |||
| 0aa3af32cd | |||
| dcd5a839c1 | |||
| 1233dfcf4d | |||
| 1e7d839973 | |||
| 1a5a6473c7 | |||
| c2ae93de14 | |||
| 434142d600 | |||
| 50d36b6c25 | |||
| 220df936f2 | |||
| 36ff657d03 | |||
| 475a36560d | |||
| 6b26d20bf4 | |||
| 500ecdd25f | |||
| 0d3f205c5a | |||
| d589d0cb22 | |||
| 8cfe09751e | |||
| abf23dfc56 | |||
| 727bdd191c | |||
| 56dad0348e | |||
| 307b6bd35b | |||
| ece2d3d547 | |||
| 10e171ee13 | |||
| 62ae40416c | |||
| 010978def8 | |||
| 08f6b42d17 | |||
| 2e94b562f2 | |||
| 29cdcd0294 | |||
| 075fa637dc | |||
| 87f2994e75 | |||
| 0e48a7ead2 | |||
| 719c8cae4c | |||
| 7f0d50e633 | |||
| 5294bc9228 | |||
| 40cce2781b | |||
| 7878c02f58 | |||
| 4f8a13c6a3 | |||
| f5d3f3ca3c | |||
| ab63688a05 | |||
| 0690582b2c | |||
| 57d87a6bca | |||
| 933b7b8e50 | |||
| 472849e532 | |||
| 09e55b2d1c | |||
| bcbf165268 | |||
| 837a858217 | |||
| 7cd6591a6b | |||
| 28a1a7c19f | |||
| 7fec4cdd26 | |||
| dd584274a2 | |||
| a3121678db | |||
| 18696c2cca | |||
| f6260bf4c1 | |||
| 9e9633f708 | |||
| 948d29534c | |||
| 08e52acf07 | |||
| 5f166bd769 | |||
| 1590e22ded | |||
| 55ce25dd5a | |||
| d01f8d30a5 | |||
| 269e66ee7e | |||
| 0150e940d3 | |||
| 6fd060e089 | |||
| 3bb613aa35 | |||
| 5daed2e6cf | |||
| b026363af3 | |||
| c29aadf0c6 | |||
| a2c057e016 | |||
| 0b73277d08 | |||
| 0806357172 | |||
| 068eee2278 | |||
| a8b130a0c9 | |||
| 1f7d096953 | |||
| 75fa18127b | |||
| 044f79cabc | |||
| d544667510 | |||
| ebd8fc816f | |||
| a5165f390d | |||
| dd2f87e97b | |||
| 8c477a6b94 | |||
| a1f2fb4c23 | |||
| 6158cc9381 | |||
| 4a2217b7ed | |||
| e8df63e1e6 | |||
| 529b5e328c | |||
| aebb7c28bd | |||
| 2f7c9dcdb5 | |||
| 3b17c7ad37 | |||
| 67f1c84f7e | |||
| d2c5eedfce | |||
| 6e5b2fd9b5 | |||
| 906c9adbd6 | |||
| 4f7cc7bc86 | |||
| 78676d06c3 | |||
| b850d28339 | |||
| c84011187a | |||
| 0c6049d629 | |||
| 66921d4de2 | |||
| f44f3768bc | |||
| 0f985a5d21 | |||
| 64492576aa | |||
| 57093aa400 | |||
| 5fe34208af | |||
| 18b7a30b17 | |||
| 2e5203df43 | |||
| 60e96b0fea | |||
| d8ec7e2b16 | |||
| 40ddeacd61 | |||
| 81de151125 | |||
| ec007f0428 | |||
| c1dd711df6 | |||
| 91653141c0 | |||
| f92ca6fe62 | |||
| f00ddf4bfb | |||
| 8ac4115e1d | |||
| 8e9b5f6832 | |||
| 5cafadb8e2 | |||
| 9d207f98cf | |||
| bc4f29f6cf | |||
| 50e9432b26 | |||
| 6172fc9b4d | |||
| 22bd704ae6 | |||
| 998e511f2f | |||
| 0b0a225034 | |||
| d276b7fc20 | |||
| bf4b65d7d8 | |||
| 670949c9c2 | |||
| 70ad64b4b4 | |||
| 2e6ede0405 | |||
| 155ca06ef3 | |||
| a39438d7dd | |||
| d39f4a3219 | |||
| 8bc867ee0e | |||
| 5c3ec8f436 | |||
| baea82bfbb | |||
| b26fd59881 | |||
| 620ac95b19 | |||
| 53975f1262 | |||
| 7101ec6df8 | |||
| 7e697415bc | |||
| 9c493b91d7 | |||
| 47a4dedb14 | |||
| 96cda6be32 | |||
| 466d6b4b5e | |||
| 15e200c787 | |||
| 54ef73b6db | |||
| 769f660e3a | |||
| ab9810d80b | |||
| 9ce58b394f | |||
| 7d1dfbd558 | |||
| 43eb54205d | |||
| dcde0dd367 | |||
| aec3517421 | |||
| 7d899c8d9d | |||
| 0a4591acc3 | |||
| b0c9165b66 | |||
| 29da0409e9 | |||
| a92677a5b9 | |||
| 1a397b28f3 | |||
| f2f4bd5066 | |||
| 21d23b8100 | |||
| b568ac9dd2 | |||
| 5316071a55 | |||
| 0b7e7b05c5 | |||
| 4fc505c885 | |||
| 3ed900f1be | |||
| 229b6d68b8 | |||
| cda4ce1765 | |||
| 817b940c24 | |||
| 10b4bc2305 | |||
| d182fc260e | |||
| c9f30c473f | |||
| 8bb5eb8ebd | |||
| b6c67e5353 | |||
| 1d56ba7158 | |||
| 81a4684a2c | |||
| 2a75dc0dc5 | |||
| 0874aad6a5 | |||
| c83e9aa189 | |||
| bba13a958d | |||
| 59ad407b89 | |||
| bcba6058e1 | |||
| 50beff0bbb | |||
| 165f67cc5b | |||
| 7b17286222 | |||
| 3cdd46cdce | |||
| 34d33028ec | |||
| 38d66931f5 | |||
| ae1ca9ad7f | |||
| 210a6d51a5 | |||
| 5c9ba7b7f1 | |||
| 8c167c313a | |||
| 417bf3667c | |||
| 0c180afadd | |||
| e18cfb89d6 | |||
| cc9a1a1760 | |||
| a240d39e19 | |||
| 7f012015cd | |||
| f0cfb3b874 | |||
| df9fda1057 | |||
| 1c1bfad35e | |||
| 7b0f2d49b5 | |||
| 617896a85b | |||
| 8b70140c71 | |||
| deec1b0bd6 | |||
| 465ae51f6c | |||
| b6a156b353 | |||
| a959b4708b | |||
| 977e153c5d | |||
| 77e5044a63 | |||
| 5f9f2e3861 | |||
| 94b692621f | |||
| a8ca0fa98e | |||
| d2e8926ca6 | |||
| ff978b77d4 | |||
| 35e80620b2 | |||
| 2ed180822c | |||
| a477278651 | |||
| 6e40152bc9 | |||
| 29d964cafd | |||
| 952397783b | |||
| 58ed5b4ec8 | |||
| 675a750ae6 | |||
| 680a156838 | |||
| 902e35e6db | |||
| 9fefb78dd8 | |||
| 8502a8c540 | |||
| e0073230e5 | |||
| d74845021f | |||
| 6fa1c0364d | |||
| 7a459bb031 | |||
| eb7ba37bf3 | |||
| c484687413 | |||
| fa25714764 | |||
| 72d9cd0f42 | |||
| 55bd97f7f6 | |||
| 62978c681e | |||
| 0e1b70a774 | |||
| 1137cf5443 | |||
| 83bba86b56 | |||
| be16c04fc6 | |||
| a64112037d | |||
| c8c2184003 | |||
| 1d1331d6db | |||
| 99cef99cf0 | |||
| bd08e5978a | |||
| bea56eb9f4 | |||
| f80a62c29e | |||
| 170501f16d | |||
| 5a2a668168 | |||
| a2becf2105 | |||
| 3f4bd0da1b | |||
| 14fe3b0fd0 | |||
| 7032dd71e8 | |||
| 7933b1ad54 | |||
| ddd3b7167b | |||
| be0653a6f2 | |||
| be8a1dafb9 | |||
| d67ba84af0 | |||
| ab9b88046d | |||
| 6007b0b727 | |||
| 422fe61a53 | |||
| 407a7b624b | |||
| 0cb20131b4 | |||
| 3e2e9ff834 | |||
| 9d5f87ea57 | |||
| 3b5ddb5a0c | |||
| dbb1ea9192 | |||
| 4b04a4ca93 | |||
| 6bb5695f56 | |||
| 6863464467 | |||
| 8f1565e920 | |||
| e11dd25d68 | |||
| 3548558a64 | |||
| 6e923a6a46 | |||
| 5f06aaf4a4 | |||
| 45d96c1dbd | |||
| 8e157193f0 | |||
| 5c9f68c967 | |||
| 27b2048f03 | |||
| 3cdbd545ff | |||
| 7737cb1246 | |||
| 7798b51ee9 | |||
| b2a03a42d1 | |||
| a543097734 | |||
| 09e4aae936 | |||
| ffede3caf1 | |||
| 846d321151 | |||
| d960d9f1fb | |||
| f3224014a4 | |||
| 9128d9f9a5 | |||
| 1f2e9ad706 | |||
| 48cc4ba137 | |||
| a3293f7a54 | |||
| 032f214345 | |||
| 2c4e4ea703 | |||
| 5e92efc70f | |||
| 0b7de5d43e | |||
| cd7b1775f6 | |||
| 627f790edc | |||
| 4deec2010d | |||
| 05cb535943 | |||
| 54597de58c | |||
| 0fc8b927a1 | |||
| 1088f62d16 | |||
| 2ad18a13c0 | |||
| 6742b603cb | |||
| 599fe261f2 | |||
| 46ceb837f6 | |||
| c2ecb57f37 | |||
| d0a48896b0 | |||
| 67969a1d89 | |||
| 765f2fa723 | |||
| 2e1ee9d901 | |||
| 0772564f08 | |||
| 6e00f7a135 | |||
| f38355927a | |||
| e5102b5edb | |||
| 27524bfd19 | |||
| 9063a38770 | |||
| ca66f403e7 | |||
| 43d8f637b2 | |||
| 1d1418ac44 | |||
| a1b294eb8a | |||
| 98926ea2cc | |||
| 6baec746a8 | |||
| 1fc6bb90eb | |||
| 1b7addaa6e | |||
| 18f9769662 | |||
| d34c9f21a8 | |||
| d1da209214 | |||
| f4d53b86fd | |||
| a8267e7fe4 | |||
| d394888cfa | |||
| 9c9985fced | |||
| dec3592a67 | |||
| 5baa6b5f12 | |||
| 3908fc321a | |||
| 5f0942f1e9 | |||
| 49258fd3d7 | |||
| 495b5e2b0b | |||
| e0fc78e849 | |||
| c0a087584f | |||
| e8bf51ffc3 | |||
| 44ca28dd4c | |||
| dfb734529d | |||
| 791b19ff68 | |||
| a5cc8bd34a | |||
| 9b2af9bafd | |||
| 2be9591824 | |||
| 180abc2fe2 | |||
| abf59f38e7 | |||
| 3141de1357 | |||
| 1eef137381 | |||
| 60e26f7792 | |||
| 2767780dec | |||
| 3348e72b58 | |||
| ca10c07690 | |||
| 228adb1656 | |||
| f62a87528f | |||
| 4426659fac | |||
| 214ca1de9f | |||
| 16c86c21a9 | |||
| a92b3bade0 | |||
| 866273b11c | |||
| d2fe559c7c | |||
| 41e675ae6a | |||
| 8e1169a8d9 | |||
| 6de4675aa9 | |||
| 19e6a1929b | |||
| b817782b9b | |||
| 2324e5d7a9 | |||
| b585793c46 | |||
| 31923bec62 | |||
| 48b2345a98 | |||
| dafe2a811f | |||
| 87465906b4 | |||
| 18c571dd97 | |||
| 2d668eb4fa | |||
| 26e3893f3a | |||
| 6bbbc68ff7 | |||
| bd55b5fd74 | |||
| b91095ed9a | |||
| 28087d6363 | |||
| 83a7b5d45c | |||
| a51b724288 | |||
| b6a5b083c1 | |||
| d5de70daf6 | |||
| eb12dd8db7 | |||
| d29aa5293b | |||
| ab29dc7af6 | |||
| e17ca0a906 | |||
| f4d4c19754 | |||
| d1c0f7a05f | |||
| 995afc0a0b | |||
| 950155c799 | |||
| 69daae8e32 | |||
| f9f4b11da5 | |||
| 4b69759518 | |||
| f5fc1b901d | |||
| ca0cc0f24c | |||
| 970a4c8b83 | |||
| fb21d5fdeb | |||
| ff02b82dc4 | |||
| ed90f4090a | |||
| 527c96b31a | |||
| 7fd86fde99 | |||
| 3c4f2251d2 | |||
| f4aa043eed | |||
| 696ad9847b | |||
| 8452e4b2af | |||
| dd60f6c1f3 | |||
| 4439f94956 | |||
| b87e2f6898 | |||
| a6340fc43b | |||
| d6fb98752c | |||
| 414cfedb3e | |||
| da02f085e2 | |||
| ac7eb6e3db | |||
| 3e2f850711 | |||
| f2c9ad8982 | |||
| afd993db51 | |||
| 6bb5f3808e | |||
| c7824fba5a | |||
| 30143b24bf | |||
| cb50d0c36b | |||
| 66e12a6eb3 | |||
| dc5c0a666b | |||
| e2c8bfde55 | |||
| 1c6c75d05d | |||
| c04469f150 | |||
| fd743bd70e | |||
| 0497f281bc | |||
| 460e21e4b7 | |||
| 74befaef51 | |||
| fd0099fb64 | |||
| 86d2ac0e66 | |||
| 5693c85f30 | |||
| 3308386da5 | |||
| 3de3f4dd35 | |||
| 75db016c07 | |||
| 8ebd0b289d | |||
| 64f178c81c | |||
| 07638e9ee2 | |||
| c00d41c25e | |||
| 7d54cf22ea | |||
| 27df213f2b | |||
| 9020192e82 | |||
| b624bea048 | |||
| d0f51f7999 | |||
| a51ed2559c | |||
| f7cf2797e8 | |||
| 2f9ce76435 | |||
| 052ca6e1a7 | |||
| a115d81fa7 | |||
| d6b0f9359c | |||
| dc19b07de7 | |||
| 3c6d526dc2 | |||
| 84b0bc7e84 | |||
| 5b95e6416f | |||
| 54ba0288e1 | |||
| 0cbc13389f | |||
| c1fb620227 | |||
| 9a0c58504c | |||
| 4c0724fb90 | |||
| 670543f8cf | |||
| 5412720930 | |||
| 73f9f1a6a4 | |||
| a81d685b67 | |||
| 441eaacecf | |||
| 4faecb7e94 | |||
| c60f909bc0 | |||
| ff29668daa | |||
| ce615db5cc | |||
| c87ca9f9e6 | |||
| af6135f1ed | |||
| b4423eef37 | |||
| 3935efb5ab | |||
| 24a87e913c | |||
| 11527ff5d6 | |||
| b042def28c | |||
| e4e72de99a | |||
| d70b97e841 | |||
| 81c42f2cea | |||
| fe713e8c12 | |||
| 99dddaac1e | |||
| 41a6e83487 | |||
| 19bf28d403 | |||
| d785fb4ef8 | |||
| 75b69a1a1a | |||
| a3c34fe7f7 | |||
| 152cb4bfd5 | |||
| 894dc4365f | |||
| d3ec9d8eae | |||
| 884040a950 | |||
| 1116990af4 | |||
| 87bb6a731d | |||
| cf8f3df998 | |||
| 85ed5e633e | |||
| 5cfe0ed512 | |||
| 28cf54a525 | |||
| 94146b4211 | |||
| 4903a20abb | |||
| 2f19afe7fc | |||
| a16cff8d9b | |||
| eaa3651304 | |||
| 3870728572 | |||
| 34544e97e2 | |||
| 23e0a83c56 | |||
| d8d698125e | |||
| ae743ee020 | |||
| ef7fce7468 | |||
| aea2a84b09 | |||
| 9c21cabd45 | |||
| bce69d2c1f | |||
| 290e3a55f7 | |||
| ca4d1bd219 | |||
| 0dd36d8c7f | |||
| 5d60e80783 | |||
| aa1a043c22 | |||
| 746a843a8e | |||
| d64d0d7ed4 | |||
| e37601b0af | |||
| ba808581fb | |||
| 2b96f78d5d | |||
| 229e125e3f | |||
| 9cee3499e2 | |||
| 941a2bf68c | |||
| 79ec9901c1 | |||
| 076410a790 | |||
| 3e542dacbd | |||
| cc8cf5c64d | |||
| fcce660bea | |||
| 29fee8e3aa | |||
| cdb22c78f1 | |||
| 4d5de1e536 | |||
| 8378b547df | |||
| d79c81d0f8 | |||
| 7d48cde471 | |||
| 5607c2b820 | |||
| 3f27d0b1a1 | |||
| 786010bb59 | |||
| e30c920892 | |||
| 6791d345c3 | |||
| c8cab05b83 | |||
| f98e57c3aa | |||
| 5c317813ec | |||
| 559ba3955c | |||
| 50fcebb09a | |||
| f38a165c67 | |||
| 7a21e5ddf1 | |||
| 9092299b3d | |||
| 57cab8a928 | |||
| b21c7dd8d5 | |||
| 00d4cf328b | |||
| 859ebe036d | |||
| 3fcafcbbc4 | |||
| 488b4f6dab | |||
| 3aea263ba1 | |||
| 2023fd2b75 | |||
| 9100972c83 | |||
| 164bd4c333 | |||
| 1d3f903801 | |||
| 544ca8d4c3 | |||
| 0eb6409298 | |||
| e6221f9379 | |||
| a6c1472757 | |||
| 59be02c13b | |||
| 4f4667705c | |||
| 7d740ae559 | |||
| 571de29199 | |||
| b9c099d283 | |||
| 573abe5ff4 | |||
| 8b4e07a1ea | |||
| a57933b42c | |||
| 1067ad68ec | |||
| 257fd6e92c | |||
| de4e0c4de6 | |||
| ecea562ed8 | |||
| 47d6deb1f6 | |||
| 5875c8416f | |||
| f5f64038c2 | |||
| f85da30008 | |||
| ba81d9be29 | |||
| ff99a1dfb7 | |||
| 3ad13aba00 | |||
| 5dfe804a17 | |||
| e01abcd905 | |||
| ecbaeed77e | |||
| ecd56bc160 | |||
| 8e32119abb | |||
| 106e32189a | |||
| 10733e0240 | |||
| 2822ee9920 | |||
| 7e2b37ef85 | |||
| 8c4761f078 | |||
| ae3a8de5a2 | |||
| 2a065d7c6d | |||
| 8d31f21547 | |||
| d2c350f6d1 | |||
| 0cce1559f3 | |||
| d2a6ca1c8a | |||
| ba63f3250d | |||
| 5d9b136898 | |||
| cd84e321e2 | |||
| 549fb8a5c4 | |||
| c9e8779418 | |||
| 697a1dd432 | |||
| 6fb554bd5f | |||
| ae5ca4497e | |||
| eea408944c | |||
| 2b2b2f3ca7 | |||
| 3d8c027de9 | |||
| 95dc8075eb | |||
| 131a8caceb | |||
| 40d46bfc6c | |||
| c5e7182978 | |||
| e3a14bb57f | |||
| 678d15519a | |||
| 0ca940305b | |||
| 054f630f2e | |||
| c338af78bc | |||
| 39c6420921 | |||
| 9c3a9ec3a3 | |||
| 33200a38c3 | |||
| 6b08457f6c | |||
| ab86f198e9 | |||
| 1e3e5ea830 | |||
| b6b0529fc0 | |||
| 9cbd590ec0 | |||
| 873ff7f61b | |||
| 2c996dae05 | |||
| b468bf197f | |||
| a85946fad0 | |||
| eb41537083 | |||
| 761e712c51 | |||
| 2bb8081af4 | |||
| 6dffa159ef | |||
| c5298f2eec | |||
| 41b5ba41b0 | |||
| 6ba71ef342 | |||
| 73eb480138 | |||
| a78db667e6 | |||
| 9c97943076 | |||
| cd48729a4b | |||
| 4ba7269e6f | |||
| bc6b0ef9ba | |||
| 1589bb4c82 | |||
| 957a3b1adb | |||
| bc48403573 | |||
| f242420f3a | |||
| 6cecb167ea | |||
| 2ae16dce5c | |||
| 28d48ec390 | |||
| 825b591c67 | |||
| 0778aabadd | |||
| 7a3b01c4e6 | |||
| 18a4740380 | |||
| 303f74c176 | |||
| 5bf1767e6e | |||
| ead9ebb012 | |||
| ab5258501a | |||
| f14441f420 | |||
| a4e4aeb26e | |||
| c6e3be24f1 | |||
| 150489598e | |||
| b3831e88d8 | |||
| 5fa519fdbd | |||
| 74968d658c | |||
| 6ac6f01fce | |||
| ba4310e079 | |||
| 3284eeea24 | |||
| 504078a7ec | |||
| 54e8ff1660 | |||
| 3590e8c7d1 | |||
| ace758617f | |||
| 57e18b18b1 | |||
| e259f53bc2 | |||
| 4ac1eeab24 | |||
| f298ead5bb | |||
| 68ab611223 | |||
| 4f220563a1 | |||
| 567cf4b15a | |||
| 911f4971f3 | |||
| 7cdb840b5a | |||
| 634c4bc6cc | |||
| 4b89007ea6 | |||
| a6193fbddc | |||
| 8396fa724c | |||
| 8f4646501d | |||
| cadf4acd85 | |||
| 759c829c4d | |||
| d9d9ea2733 | |||
| bdd3b9cc3b | |||
| 9c5fdabab9 | |||
| b49480ef7b | |||
| f18d53130a | |||
| 259effd5b5 | |||
| 46bfecfdc2 | |||
| a59df85c64 | |||
| 17420e5351 | |||
| c0336eb26a | |||
| b394d976a0 | |||
| 48d7a9ba78 | |||
| 01ac9f4e99 | |||
| 376005df54 | |||
| 3539bd2a07 | |||
| 6ccb5ced18 | |||
| 5777290bf2 | |||
| 59dbb5443c | |||
| 70d1ad980e | |||
| cfe1b803ec | |||
| 5fcdba486e | |||
| 4aadbec7cc | |||
| 9e473d2116 | |||
| 87d1523c31 | |||
| 97a3aca60c | |||
| 23226b2df0 | |||
| afe542a6a0 | |||
| 8a80a1de3c | |||
| d2bad04985 | |||
| 8311b7c783 | |||
| 182e547ffe | |||
| 98281b6b3a | |||
| 47522368ed | |||
| 6e2b7d0b03 | |||
| 4883a55ce8 | |||
| 851da10cfb | |||
| b605210b11 | |||
| e330724811 | |||
| dd8f5afaa1 | |||
| ec9bf57d12 | |||
| 22ca0b0fb1 | |||
| 5fdcfaa1ee | |||
| e03ae573da | |||
| f9b176c3c4 | |||
| 8940aec409 | |||
| b1d769e215 | |||
| 95ed59c7d2 | |||
| 98a709c3f1 | |||
| 6d703cf325 | |||
| e4e76db5d8 | |||
| 5ebf478c35 | |||
| 120e12c246 | |||
| 63ab601233 | |||
| d5f9c14c3a | |||
| 867a975a92 | |||
| e1732480cd | |||
| 8805564acc | |||
| 35b4fafd24 | |||
| 2422bd47b2 | |||
| 06deeb01ce | |||
| cf4d181c02 | |||
| 14cf740b8c | |||
| 9eab67502f | |||
| 2eb9ef930a | |||
| 25b346a81d | |||
| 2d4eb18350 | |||
| 79a1e172dd | |||
| 172a0a0f24 | |||
| 0adf32a01a | |||
| a8d25c4302 | |||
| 05dfb81a20 | |||
| 3b976844f0 | |||
| 5e26d4a24b | |||
| 06cbff566a | |||
| 59c911b639 | |||
| 737dd8d9b1 | |||
| 4f3c5640b5 | |||
| d8de5bfe8b | |||
| a31290acf8 | |||
| 403c45c388 | |||
| 2f67f0ae0b | |||
| d1e01fb203 | |||
| a719dfd6dc | |||
| b0de026701 | |||
| 2d98e91e02 | |||
| 64ac472716 | |||
| eaaa3c9858 | |||
| efa9a6bbad | |||
| 3d762c82b7 | |||
| bacba43fd2 | |||
| 1db85b00b9 | |||
| d0f418adc4 | |||
| 688fd03a92 | |||
| ae22b93ac7 | |||
| d499b524f7 | |||
| 6bdcd4e0e6 | |||
| e5b0436a27 | |||
| 56c74c37f2 | |||
| 547918ddaa | |||
| bdfbca6fc0 | |||
| 6ef3718fbc | |||
| 28a20973d3 | |||
| 268919bda5 | |||
| d81ae173e2 | |||
| 001455303e | |||
| 36f07fc430 | |||
| 7b5ad7970c | |||
| bc20f1e970 | |||
| 0d49a8e9d0 | |||
| 006a59122b | |||
| ab385dea60 | |||
| 2d17152c43 | |||
| 87dc390eaf | |||
| 09462cc750 | |||
| 8c06e1f9de | |||
| caf0f98a0e | |||
| 15937316dd | |||
| 7406f1234a | |||
| c3afc62cb1 | |||
| 1a353f4c93 | |||
| 8f3e54a812 | |||
| 5e93d5de64 | |||
| 1dc6d31ba8 | |||
| 9095126af4 | |||
| 09a22bab29 | |||
| 451d142d0f | |||
| 31cb7bd194 | |||
| a6c357e77a | |||
| 85530ad527 | |||
| 152c139041 | |||
| 7ce80e8036 | |||
| a125eec1d3 | |||
| 7e4dc24ca9 | |||
| 01290836dc | |||
| da3b427a77 | |||
| 20a4a91444 | |||
| fa6fd67157 | |||
| 5988856e23 | |||
| fcdc765e69 | |||
| 18fc33ad00 | |||
| 500126f019 | |||
| 0230886f3a | |||
| a2abb79379 | |||
| fecb9692b3 | |||
| e7cd51ae30 | |||
| 14d38960b8 | |||
| 7bc18f6469 | |||
| 4dd7acb53a | |||
| 89c03c417d | |||
| 2320ab0960 | |||
| 61b73497a6 | |||
| 7550e9ceae | |||
| b0a7611ae4 | |||
| 95604e68df | |||
| cb3bf2389c | |||
| 44ae7f40c1 | |||
| 206ffaa9b9 | |||
| da7912ea1a | |||
| ebdad86950 | |||
| ae80432b23 | |||
| ed84583bac | |||
| 21009db39b | |||
| 236a69cdd0 | |||
| 4a8fe7df04 | |||
| 7d48edd72b | |||
| 737cfd55bb | |||
| b848978d70 | |||
| 2769384b9f | |||
| 2d0b000242 | |||
| abeed6f4c6 | |||
| 3c39e4395e | |||
| 70213fc40d | |||
| f5b51e9d2c | |||
| c8fef47035 | |||
| bd75592478 | |||
| 957a66254f | |||
| 98e10f6767 | |||
| 647d42690c | |||
| e1f4be6b8b | |||
| c97712027d | |||
| 6c47267388 | |||
| 26ae59d300 | |||
| fed2710f5c | |||
| 7b93976dbf | |||
| 2191dbc899 | |||
| 498ff78ae2 | |||
| d97800841d | |||
| ecc9dfe5cf | |||
| cf2e3c6351 | |||
| a11bb90f20 | |||
| 9c9b45f96a | |||
| 75e4c51846 | |||
| ce4f1e1ed1 | |||
| 334a8bf58c | |||
| 0a649e65c2 | |||
| bbd531326a | |||
| 14cba100e4 | |||
| 83deb7c465 | |||
| cc2dc19a3d | |||
| 5d07a64d3b | |||
| 8781bcf586 | |||
| 5fd558627f | |||
| 3db73b9509 | |||
| e6efbd0d20 | |||
| cfba5ed3ad | |||
| 29a18967c9 | |||
| 96a23ebbcf | |||
| 07589c8452 | |||
| 9b7b07397b | |||
| 9894aafcc1 | |||
| cf4498db3e | |||
| f09404d89b | |||
| b5ef3908e8 | |||
| 1e7171cb23 | |||
| 658f1666be | |||
| 83d43d2f15 | |||
| be1e86601a | |||
| 476d3f6587 | |||
| 12cc256741 | |||
| 258fe9f356 | |||
| add1a9bae3 | |||
| 7cfa2cc415 | |||
| 0d12b0bfa1 | |||
| 4d61c136ff | |||
| 31959f9cbf | |||
| 4593e3240e | |||
| e61ba7f25e | |||
| ef1f8e98e7 | |||
| 28837d56a6 | |||
| 1481a0ffd4 | |||
| e231debd6a | |||
| e01ed4dc55 | |||
| d97347e720 | |||
| e066cb7850 | |||
| 2c1ae2ba1f | |||
| 092f0d41e8 | |||
| 1457c37fb5 | |||
| 74e43e1157 | |||
| 77252eb351 | |||
| 916e0f9c0f | |||
| 0230134320 | |||
| 0d36482e6d | |||
| 7b9de7fffc | |||
| 431eb70c66 | |||
| 119408bcf7 | |||
| 07c5ba0884 | |||
| 70d7746f83 | |||
| c3ebf69caa | |||
| 02014f4b21 | |||
| c11d9f3fa0 | |||
| 9f0b3da44c | |||
| 60b101f2bb | |||
| 101eca6093 | |||
| 2bb30f16b3 | |||
| 740d7317d4 | |||
| 198d9bf776 | |||
| abfaba97b0 | |||
| dc8f5eb36c | |||
| 17341ddbee | |||
| ff020f5a35 | |||
| bcb4f3cf56 | |||
| 3f80d30e34 | |||
| c402fedde3 | |||
| c4b7953692 | |||
| 9b22d97696 | |||
| ac5bb6ab7e | |||
| 855615d1ff | |||
| 99d00bafa8 | |||
| d4dd453308 | |||
| dabe8ba00e | |||
| 0307a0852a | |||
| 17ce3dd481 | |||
| ea95821644 | |||
| 3341787481 | |||
| 2c46fd77bd | |||
| 5db0abb42e | |||
| 07553918d0 | |||
| 05b878ddcd | |||
| c32f0ea95b | |||
| 021ce61aca | |||
| 3387c37e6a | |||
| 7463eb6425 | |||
| 9bc65559a1 | |||
| 0270e41c4a | |||
| 52f0f576ac | |||
| b721df986a | |||
| bd6fa847fa | |||
| a98a0592ea | |||
| a1a73bebfa | |||
| 2a3a59737c | |||
| 3b884de222 | |||
| 3ae4aa04e2 | |||
| 779c29fe6c | |||
| 51e7ebf4d3 | |||
| ff9a59a759 | |||
| 82dc8255c1 | |||
| a44a441203 | |||
| 3274d6b5b0 | |||
| 1f806432d1 | |||
| 43a9d48930 | |||
| 2d7f75d90c | |||
| 46227ebd48 | |||
| ad9ee653df | |||
| 2296944130 | |||
| df1bcf4654 | |||
| 263a8323de | |||
| 691567904b | |||
| fc83ed140f | |||
| a6153323dd | |||
| 73c3ce6c4f | |||
| c69e21bd62 | |||
| d57d146689 | |||
| 23b0512e9c | |||
| 9afb89b82b | |||
| d1fa642b83 | |||
| 21cef66d34 | |||
| 805ac57f02 | |||
| d840353041 | |||
| f2926288fa | |||
| 581303f794 | |||
| c66e1ae3a9 | |||
| c37bbdaf56 | |||
| 2e5164fe3c | |||
| 8e8dac953c | |||
| 69ba80fd81 | |||
| 5bb4c67981 | |||
| c1347bd394 | |||
| 60dff3a432 | |||
| dc42b429cf | |||
| 399db8c601 | |||
| b746d33dd2 | |||
| b60bdb4b9d | |||
| 5387c5d882 | |||
| 946bd59ffb | |||
| 90a626c601 | |||
| 60d00f960c | |||
| a8ed4b0000 | |||
| f5c85c6cfc | |||
| a017104170 | |||
| 67e54f2a13 | |||
| bf14ddd7eb | |||
| 6d43d3af33 | |||
| 5a7e7df5c5 | |||
| c7e25414bf | |||
| ec47e67b21 | |||
| 899c708482 | |||
| f3ede6c5f0 | |||
| ce57fe029e | |||
| 3b016972b0 | |||
| 6bcc71ab8e | |||
| 35c459895e | |||
| 01a406dcef | |||
| 46f30b73d1 | |||
| 1155b23859 | |||
| 6b890e638c | |||
| 8994bf293b | |||
| 6908a84e25 | |||
| 1db6ff1c4e | |||
| 4b5e42e7c9 | |||
| a9e132a581 | |||
| ea2b5eec18 | |||
| 82c3801cc6 | |||
| f3e01dcfc1 | |||
| 0ea96ff327 | |||
| 3e08b87143 | |||
| 7b557900b5 | |||
| e2f5538da9 | |||
| 38e3b08b5b | |||
| ce3cb31a3c | |||
| 4b601bda42 | |||
| d04868e8b7 | |||
| 1541b399ba | |||
| 1fb6d0e872 | |||
| ad612a0c82 | |||
| 84a7cd4ddc | |||
| 0d73bbde38 | |||
| ab6f1c6865 | |||
| e66779ecb3 | |||
| 0ae6f030be | |||
| c16b7e82c8 | |||
| 6eeb714434 | |||
| 62e15f69ea | |||
| 38310cb8b6 | |||
| 5731b47703 | |||
| ad13d4b11f | |||
| e2aeba236f | |||
| 8ad305a271 | |||
| ebf2443425 | |||
| b060c0e53c | |||
| 79e79e56e1 | |||
| 90b4337d48 | |||
| 8344c23453 | |||
| 803e3f3f77 | |||
| 59fe0d3b2f | |||
| f2ac497c48 | |||
| dcfb0e08cb | |||
| b61340b451 | |||
| dfda671a33 | |||
| b98ab6cebe | |||
| 024a251cf8 | |||
| e983ba5457 | |||
| ba3cede3d8 | |||
| 9239beba33 | |||
| 1c15aa0813 | |||
| 4553ead247 | |||
| 61960380e8 | |||
| 31b1cf15c4 | |||
| 9aaa481380 | |||
| 36c38de600 | |||
| a6d213b07c | |||
| 4a2a9fa1c0 | |||
| caa7dac493 | |||
| 3608442c40 | |||
| 886a81a19b | |||
| b729266c6a | |||
| 3845400bfa | |||
| 5f8594c3ac | |||
| 73b1521523 | |||
| 36937f229f | |||
| 1866410a23 | |||
| 8aaf8b8ab4 | |||
| 615b70a494 | |||
| 201b0eaa1a | |||
| adbe2a402f | |||
| b9f582e383 | |||
| c56013d9ea | |||
| c20220da1d | |||
| 7c9217dbaa | |||
| 650fe2cbdb | |||
| 46ee90bc8d | |||
| 9be4b2a5f1 | |||
| dfff01a8ee | |||
| 192ed6dfbf | |||
| d974a06c10 | |||
| bbd4daa4f6 | |||
| b405f2403e | |||
| f31b8a0d12 | |||
| ee21385d16 | |||
| b03ed166ed | |||
| 317efcdb2a | |||
| 3088476b67 | |||
| 1253266e23 | |||
| 84d7cf5658 | |||
| bc5e72bc77 | |||
| 4af2374189 | |||
| 88f4d1f195 | |||
| 8b03d58fa2 | |||
| d7742c86df | |||
| 2c42d31ea5 | |||
| 28f4c8077c | |||
| 57d567a8f5 | |||
| b22ef98056 | |||
| 438484699d | |||
| 389c5cd7cf | |||
| 7a6a2454a0 | |||
| 9e439827a5 | |||
| f181229238 | |||
| 857320d5d3 | |||
| 524610ed8a | |||
| c4ea948c73 | |||
| f08a45af4f | |||
| 172ecc6263 | |||
| 804f25d245 | |||
| 5418e008d6 | |||
| 635ead98ce | |||
| cad95183d5 | |||
| a0827b825a | |||
| 8555bb7f39 | |||
| 8e0ea9bf23 | |||
| f3a1e96d86 | |||
| 545b867fc1 | |||
| 756bed1e72 | |||
| 394aba4ba1 | |||
| 6e15440832 | |||
| 03b1d6da82 | |||
| 74e223270e | |||
| abe096d5b5 | |||
| aee194c49a | |||
| a084105110 | |||
| d9e8618848 | |||
| 121ce5c789 | |||
| d88c7f8a70 | |||
| 5b30dc34bb | |||
| eaaa448e3f | |||
| 56ca4e7305 | |||
| a8a160c1cd | |||
| 484a67fbd7 | |||
| f3062a3cad | |||
| d55ff3f838 | |||
| 33b695729a | |||
| be1053eb70 | |||
| cba70f810e | |||
| 23df1cc8fc | |||
| e9c75fdba6 | |||
| dbb52f85bf | |||
| 2b013e0e48 | |||
| 17357934fb | |||
| bd9cf612ff | |||
| 5452dc7f1f | |||
| d5b6e01748 | |||
| 66eb9ad99d | |||
| 579b158b04 | |||
| 5b2d025ee1 | |||
| 064fbc0113 | |||
| c3250853c5 | |||
| 73758b266f | |||
| 8d4c408e95 | |||
| db73552c90 | |||
| 9955d29d76 | |||
| 19a0e94828 | |||
| 5a0ee17710 | |||
| 4685f7ed60 | |||
| a93c4fa051 | |||
| e9e4941bf9 | |||
| 52440f9f66 | |||
| f3a30b5e0e | |||
| 2ac8c31341 | |||
| 9b4c13f596 | |||
| 8da9e7a56f | |||
| deb9848fb7 | |||
| da6bf03ad8 | |||
| d734ec5f72 | |||
| d79ff8fc01 | |||
| 385bbaa82b | |||
| 4520daabe9 | |||
| c7b73031c8 | |||
| 9629a9ee72 | |||
| 5830166b7b | |||
| 30b24c2e7a | |||
| a6c2aa38c4 | |||
| 9d62915ead | |||
| 3c44e98401 | |||
| 0b2c96e212 | |||
| ca31caa229 | |||
| d6238b7fc0 | |||
| 673df55bfe | |||
| 1aa240b296 | |||
| be1ffd4cee | |||
| c1ee31e729 | |||
| 61458da6eb | |||
| 552966a087 | |||
| 891d346ad1 | |||
| 762cdc41e5 | |||
| f666675c47 | |||
| c75f26fcf7 | |||
| 4cd04a0671 | |||
| e7e0d68dcd | |||
| f7cfe15de3 | |||
| 2c2715acf0 | |||
| 7f7ee30ff3 | |||
| 5687f333aa | |||
| c1c36543e7 | |||
| f69d4595a9 | |||
| 42dd2e6e05 | |||
| 3a90d710eb | |||
| d370708e98 | |||
| c1749e383c | |||
| 2107de50d7 | |||
| 36166726ed | |||
| 6dcbdfaf94 | |||
| 90461ee459 | |||
| 97fde5d6b9 | |||
| 607ee45d88 | |||
| 984a9a85f0 | |||
| f7efbe28c0 | |||
| c1f01ad245 | |||
| 51c750a712 | |||
| a37e60ad9f | |||
| 4bf8e47206 | |||
| 24596c388d | |||
| 68806a8d60 | |||
| f39b829d5d | |||
| b0a301564b | |||
| 0e4a6c792b | |||
| 2870adbe6e | |||
| af019cb962 | |||
| d06b7ca974 | |||
| d1b933fc2d | |||
| 5fc5dd07a7 | |||
| d6a5eab320 | |||
| 1c7944a48c | |||
| d198a69eef | |||
| cbecaeaa15 | |||
| 522043df21 | |||
| 0eb12cdf75 | |||
| 329bca0f9a | |||
| ad8134c120 | |||
| a4a2b45911 | |||
| 6881329df6 | |||
| 0147e0034d | |||
| f1fde49ea8 | |||
| 18de3e1fbe | |||
| ded7f094e5 | |||
| 3597eff6c8 | |||
| 55f751a22e | |||
| 6f8929037e | |||
| 6fffab32a4 | |||
| f40c5a53a4 | |||
| 01d4c7bc0b | |||
| a1b8ca48cc | |||
| 91a547c570 | |||
| 53a8809f64 | |||
| f763db279d | |||
| 0c7b051d75 | |||
| b9981b5fb1 | |||
| c27874bb3f | |||
| aae2bb67e4 | |||
| b6a19bce22 | |||
| 5832cc4fba | |||
| c8e2c088ea | |||
| 85895343f5 | |||
| 307ee2a12a | |||
| 7cbc7b1b2e | |||
| b868555ef4 | |||
| 8ef9e67941 | |||
| 6ff6a7d2bb | |||
| be36b14da2 | |||
| c9a79cfbdc | |||
| ef798b16b5 | |||
| 6c4ccbd840 | |||
| 6bbe864c56 | |||
| 1eb30c37ba | |||
| 8067580e8c | |||
| 0e687a4c68 | |||
| 09c054a8d3 | |||
| e8adac0d4f | |||
| 38d03bc213 | |||
| 4160cf8f52 | |||
| 8ad4883533 | |||
| bc19cadc3c | |||
| 1037567ab0 | |||
| 55c22bd3d6 | |||
| a33112d166 | |||
| 2d185ebd19 | |||
| 12be5d37b5 | |||
| d86c80d5c5 | |||
| 212be1e066 | |||
| 197f6729aa | |||
| 9c415c0b21 | |||
| e599d1404e | |||
| 6285aa085c | |||
| c3d673380b | |||
| b46ad16d1b | |||
| d6ca4586f5 | |||
| fd55d5a97b | |||
| 79e6c6bd7e | |||
| 1e898b4672 | |||
| 1a49a3bcd5 | |||
| a95fc633c5 | |||
| 25be51884f | |||
| 78273efc25 | |||
| 088817d1e1 | |||
| c2ff30bb38 | |||
| f3eb1b272c | |||
| 1d5f6d274d | |||
| 4a5c11dc92 | |||
| 2edc16eb08 | |||
| c9be671576 | |||
| 87ac5d9bd2 | |||
| 8a623115aa | |||
| 38b0e711e2 | |||
| 29da0fbb41 | |||
| 7df2419c7e | |||
| 67bb8b3ccf | |||
| 478739e51a | |||
| 8251848a6f | |||
| da79b65fc5 | |||
| 24edc34a3d | |||
| 998c59ad73 | |||
| 61d00a5c54 | |||
| 602be660ce | |||
| a75f0872fe | |||
| a735f6947b | |||
| a5b7c16a73 | |||
| 85ff5d3c78 | |||
| 901a5f0cdb | |||
| 5a3ea6ca50 | |||
| ece0d578e1 | |||
| a079a8f8f0 | |||
| 28af119a6d | |||
| 2c593c17a9 | |||
| bd6b01775d | |||
| 716193fe70 | |||
| 32baf50a5a | |||
| 9e01d52198 | |||
| cf6d0c5158 | |||
| 13fab9e062 | |||
| ea407440b6 | |||
| 967c972f5f | |||
| e699a6b8a0 | |||
| 2c70028eb3 | |||
| f855154875 | |||
| 488f4c5f6b | |||
| ba408730bf | |||
| 5808200d77 | |||
| ba7df731ff | |||
| 85c771f9b0 | |||
| f5f682b2ed | |||
| 5f87986be5 | |||
| b56784f483 | |||
| 369e41380b | |||
| 569236e6f9 | |||
| 29b50850f9 | |||
| c8e1bc6dd4 | |||
| 70caafa45e | |||
| d7062ad688 | |||
| 46812b44e0 | |||
| 12802191fa | |||
| 380f2f953d | |||
| ccaa5006b5 | |||
| 619a9ef9b7 | |||
| bad68c45a8 | |||
| d8655a51dd | |||
| 90d7104d2c | |||
| 5903d75bbc | |||
| 1b7f2f2ac9 | |||
| fe6f460d62 | |||
| dc5c4e44c8 | |||
| 3b70f219e1 | |||
| 57962d1de9 | |||
| 84f5641cce | |||
| b8cbbbb4c0 | |||
| ff94f81ab8 | |||
| 3c86e83ca7 | |||
| f5e4c6d4ae | |||
| a25687a5de | |||
| d37693cbda | |||
| a9b59fe1b0 | |||
| 7c8e15a1cf | |||
| a88876a7bb | |||
| d985c233b1 | |||
| 05b4ad46e6 | |||
| fc951f218f | |||
| 149742b163 | |||
| cd4d216ec7 | |||
| 35d19d4d7e | |||
| 2f01da8ccc | |||
| c2d067be00 | |||
| 430574fd72 | |||
| 2660fea880 | |||
| 27ab44a2e6 | |||
| e6618f7ce1 | |||
| 7a24657bc1 | |||
| b729574342 | |||
| 2dbcbb6fac | |||
| e3f19fb9ff | |||
| 7e330ba2df | |||
| cf34bd5146 | |||
| c56e0218ac | |||
| b1a18bbc54 | |||
| d884571904 | |||
| 13415b9260 | |||
| dd93822325 | |||
| e40e1de488 | |||
| 4a23973789 | |||
| b9495a8753 | |||
| b67e17f1d8 | |||
| 2e4e4d1574 | |||
| 825a3deea6 | |||
| 7ebf38bc1f | |||
| 370c7ad97f | |||
| 021dcc3f83 | |||
| 4e563b4474 | |||
| 970f0d0a8e | |||
| 38db93088a | |||
| 5a6b684e76 | |||
| 760e0a2ceb | |||
| 51832918a0 | |||
| ae821883b4 | |||
| 21166544af | |||
| 57b12bf54a | |||
| 6ea9c97d08 | |||
| a10aebd083 | |||
| 1852cdb67e | |||
| 512765189e | |||
| 228203ea49 | |||
| 82871dbe7d | |||
| 8d4fa3553d | |||
| 6c2271c3d2 | |||
| 83bbef0ada | |||
| 464f6e2b28 | |||
| 8c8eb3faa6 | |||
| e45dfcd818 | |||
| 9e58dddf07 | |||
| 566cc63fed | |||
| 163d279187 | |||
| c0801a94d6 | |||
| 888103ed65 | |||
| 7d1c0d754e | |||
| c4b8e0cd31 | |||
| 33fd6b3aac | |||
| 8572f3449d | |||
| 8632aea3b7 | |||
| 56068f5337 | |||
| f1dc67f92a | |||
| 331c3207a7 | |||
| d8064e3f67 | |||
| 36393ca86e | |||
| a42498eb2b | |||
| ce48326072 | |||
| a550a520e2 | |||
| 5b49aeae04 | |||
| af9a1c4bf4 | |||
| 6cea9b6086 | |||
| 769eee319e | |||
| 2b97ad5bb5 | |||
| d84522f4e5 | |||
| faae5ca73b | |||
| 693c2b5cd5 | |||
| 5f36f92aa7 | |||
| 9eb716ecd2 | |||
| c1049e75a4 | |||
| 6857f9a9da | |||
| e431261f9d | |||
| 5da35efeb0 | |||
| e500a188a9 | |||
| 69f9cb9377 | |||
| db43513998 | |||
| 8ddd06d330 | |||
| 8ccfb9e813 | |||
| 2ec7169598 | |||
| bb331fa4b8 | |||
| bfd843de01 | |||
| 9e2900ad75 | |||
| 68fd65f6dc | |||
| 8b3bec3c95 | |||
| 1d23af8af6 | |||
| 52e09f2b52 | |||
| d2ba3f393f | |||
| 3d06073501 | |||
| b964004ee2 | |||
| 510f8f25a5 | |||
| 4b99e7ba59 | |||
| 386bcccae8 | |||
| 2220c62f00 | |||
| d00c9a2aeb | |||
| 5eaf3cf0bf | |||
| 9f538f9346 | |||
| eda51eb741 | |||
| f2e04197c4 | |||
| f8cc73fb51 | |||
| 950f60f717 | |||
| 2fa750982c | |||
| 01cd9dbbde | |||
| ad083aa405 | |||
| df5b4ad0ad | |||
| 72d289d728 | |||
| ce0dc4c68a | |||
| 5badfe8207 | |||
| 6fba1aeb13 | |||
| 3c90f63e8a | |||
| 3edbff21e4 | |||
| 98f9799643 | |||
| e3563635ea | |||
| fc661bd697 | |||
| cf1ae122fc | |||
| 63572e11f9 | |||
| 038e0f5891 | |||
| 16aebd5930 | |||
| f0ec72ef5f | |||
| 1c2218927d | |||
| bbd47bd2b7 | |||
| 8e834a3da6 | |||
| b2925be94d | |||
| 4089096207 | |||
| e2ef3366a9 | |||
| aa1ac020bb | |||
| 8d8cae8424 | |||
| 57e2efca94 | |||
| 079e222ca9 | |||
| 5e57929e3d | |||
| 50ab4e4747 | |||
| 0019e4730d | |||
| a110d88814 | |||
| b99fc687ab | |||
| ee1db2e57f | |||
| ac1138c8d8 | |||
| 969c75f4d7 | |||
| 00872adf10 | |||
| db3013c809 | |||
| 22228e623a | |||
| 78ed555551 | |||
| 72ff7ccc12 | |||
| 421c458eab | |||
| cc736c7b3d | |||
| 598bb5739e | |||
| 73737ef3f2 | |||
| ca821d51c9 | |||
| 6709a00c1f | |||
| 10b7496b27 | |||
| 1162a54f3a | |||
| 18b1c0da61 | |||
| 10c083f328 | |||
| 885e9eacb5 | |||
| e59ad0a4e0 | |||
| 306952a850 | |||
| b27cb58959 | |||
| e5fd7489cf | |||
| 84b4ef6810 | |||
| ac29c0363d | |||
| f538024bf3 | |||
| 208f7f7c8e | |||
| de20e1859a | |||
| aa44534eab | |||
| cb7ef02e64 | |||
| 29f656184a | |||
| a51249f32c | |||
| 48d0232eef | |||
| b8e2d21f4b | |||
| 3a37e012a6 | |||
| 9b2c25524a | |||
| b733972e11 | |||
| b9277b64c4 | |||
| 1b5453669f | |||
| e8d0bb8d35 | |||
| 026b9c51d9 | |||
| b17d109057 | |||
| f158c94cca | |||
| bb61708d7a | |||
| a837d6e434 | |||
| 8a25947901 | |||
| e0afdb2ea2 | |||
| 5b7261022b | |||
| 5b6737f76a | |||
| 35717ca650 | |||
| f468d98cda | |||
| a5c4458f75 | |||
| 5ae390dae5 | |||
| 6cf934c175 | |||
| e3eb03ac60 | |||
| 2dbfef7d8c | |||
| 4844efec30 | |||
| 0aa4e28e36 | |||
| e300ba26dc | |||
| eeb6fdcf61 | |||
| 1692eaa1e4 | |||
| f2779a13d6 | |||
| 4b2521ccdf | |||
| eb893786f1 | |||
| e943c2f4d2 | |||
| a486a40b80 | |||
| d55e607d55 | |||
| 03c77e2695 | |||
| 7d4875707b | |||
| bc8304e930 | |||
| a4e402fea6 | |||
| 36757adc20 | |||
| ec2e1516f4 | |||
| 66177af625 | |||
| 89e05507b6 | |||
| 41a3c528f4 | |||
| 89242d8d15 | |||
| 220ffa2d6d | |||
| ea8e4ac7e8 | |||
| 203701315d | |||
| ac97fab679 | |||
| f6a74eceda | |||
| 57e5b1f3d3 | |||
| e46bff7579 | |||
| 0e8b1def3f | |||
| da1f474e57 | |||
| 5ce1b29126 | |||
| 9dd6530c5b | |||
| 0d2c5eccf0 | |||
| 9ae9f9894d | |||
| eff67c4b0f | |||
| 4c75dd3a77 | |||
| 6b92227e4a | |||
| bb18cc386e | |||
| da62ad6fce | |||
| 17b457cd0d | |||
| d0eadd3f0d | |||
| 5ffcf27259 | |||
| fbeb7ce765 | |||
| fb3aab3de2 | |||
| 034a3bc695 | |||
| d743a9af68 | |||
| a3698bdc0d | |||
| 30587959b9 | |||
| 1774fd7ced | |||
| 06043e703a | |||
| ec41f11e47 | |||
| 12f0c31d62 | |||
| 2c3d76e439 | |||
| 11307ad764 | |||
| 8d296f1dcf | |||
| 090606cf67 | |||
| a409f9a613 | |||
| 7cfbcf2db2 | |||
| b6e8520a35 | |||
| d919231f87 | |||
| eed0749612 | |||
| 7c821be050 | |||
| 869c01b1a9 | |||
| cdfa96bc87 | |||
| 624ceec32b | |||
| a6c4b19165 | |||
| 7fa76b52fc | |||
| 2bc832186a | |||
| cf084ff97c | |||
| 571fe1c696 | |||
| 77086c2ce8 | |||
| 96e2e5297b | |||
| c05a8eb2ba | |||
| 369d591b63 | |||
| 9bd9de7bf8 | |||
| f2f88ba7f1 | |||
| ff1b644c23 | |||
| 34dc8c83c6 | |||
| f86f4cc801 | |||
| cb9e56892b | |||
| 64eebb5c4a | |||
| ba4d1e9217 | |||
| f638ba2682 | |||
| 121fcce44c | |||
| 7e498fe364 | |||
| 5818711df5 | |||
| 12c8510a5e | |||
| 7e0259a0cc | |||
| 96bdd7f602 | |||
| 267bf8a693 | |||
| d9a3bb581c | |||
| 440c8d38dc | |||
| 60544b8896 | |||
| 9232c4cc0e | |||
| c6ebb6b0e6 | |||
| 61dccdd3d3 | |||
| a68612626b | |||
| d51c0d0801 | |||
| b6f2c2c449 | |||
| b96d3d5c39 | |||
| 3a0ae6a54e | |||
| a76a9f0718 | |||
| 6bfc719245 | |||
| 2d3d12bdac | |||
| a75f0acda0 | |||
| 10d2fc0150 | |||
| ec285a095b | |||
| 29e13a49be | |||
| 759b05471b | |||
| 35feb48d2b | |||
| f6ac750157 | |||
| c6f38f6391 | |||
| af0ffc08ea | |||
| fa3f79e60b | |||
| ed8547e827 | |||
| 9f7c536255 | |||
| 90887acf86 | |||
| 619eea6220 | |||
| a379828475 | |||
| d6f7fae989 | |||
| 50eeb36d64 | |||
| 2837f3ef07 | |||
| 05355b9412 | |||
| 42ed8b5f07 | |||
| 716b7f3aef | |||
| dbb0aa089f | |||
| 94c8c45126 | |||
| 48ce6a1d10 | |||
| f61162a63c | |||
| 321d14e9df | |||
| 175e48816a | |||
| 51a7014b2c | |||
| ccb410d145 | |||
| 065232539e | |||
| eca3b314df | |||
| ce64b48674 | |||
| 182e54e421 | |||
| 26a0b9cd99 | |||
| eb42a89f0f | |||
| 2c208636e6 | |||
| 7c8578a106 | |||
| fce0c56506 | |||
| a212b6200f | |||
| 432e334c10 | |||
| 3f83aa5cd6 | |||
| d3246222f7 | |||
| 54565374c0 | |||
| fa37d5c255 | |||
| d708aa67b5 | |||
| 90ea64ab85 | |||
| 79ff8ddbd7 | |||
| d718a7ff08 | |||
| 15fafe787c | |||
| f68400f42c | |||
| c442051454 | |||
| 4ccb9db42a | |||
| 7a7af4f763 | |||
| ca2e639b77 | |||
| 9f61585a67 | |||
| 1f4d59c56e | |||
| 661cd59af3 | |||
| 4786d7d1f3 | |||
| 5e6f55b7dc | |||
| d18d3bf3ec | |||
| c4e4441354 | |||
| 958b468a51 | |||
| 47a90970f5 | |||
| b699292cc9 | |||
| 3ce3677b86 | |||
| 0eab6eacc3 | |||
| 8bf3a60425 | |||
| d37c5ac2b0 | |||
| 09e1dd38f1 | |||
| a8a9565b40 | |||
| ae8d1eef2a | |||
| bcad306ae5 | |||
| 924441482f | |||
| 5e56b43da0 | |||
| 7d0d2fb7da | |||
| 9d1ba35333 | |||
| e3ffe66a67 | |||
| f6ccc1285c | |||
| aebd899f51 | |||
| 545d674d44 | |||
| 7775b39bc6 | |||
| 191301aa00 | |||
| d8b381a4f0 | |||
| 47a0cecb9a | |||
| 2246e31d68 | |||
| b26a6a8b2c | |||
| d93fd449af | |||
| f8a55a7068 | |||
| 3d220de130 | |||
| 0b5b638964 | |||
| c34f6ffd63 | |||
| e13233f99e | |||
| 835e42460f | |||
| 2442f6c014 | |||
| 7f20f59b0e | |||
| e72b3727af | |||
| 3a88615847 | |||
| c10d02316e | |||
| 05ebc15274 | |||
| 1d97fc658b | |||
| fcabc1ad84 | |||
| 1656578951 | |||
| 33ba9a0ead | |||
| 939503f1ff | |||
| 509f521c65 | |||
| 7e5661416a | |||
| 5cddf9a778 | |||
| 37108424e6 | |||
| 387c63bdb3 | |||
| b38cf032f8 | |||
| 78179621b4 | |||
| 56f916ffca | |||
| eb783b95f1 | |||
| 803835ba0a | |||
| d4d49d12b1 | |||
| 07c07e9537 | |||
| 6a902fad23 | |||
| 7659770852 | |||
| f03a738c98 | |||
| ea5a84c15f | |||
| 35c3135e52 | |||
| 2061944237 | |||
| 87453dfe12 | |||
| 63d76dd8cc | |||
| 672ec14b95 | |||
| 244c708a5f | |||
| 274af8abd9 | |||
| 2afbde6281 | |||
| 6ca38f4623 | |||
| bcff51a24a | |||
| 7e04c359a5 | |||
| 5d7f49966a | |||
| 872776514e | |||
| bd88cc2c3e | |||
| 8bab2011fd | |||
| 89c26cd829 | |||
| fe3d6b6f92 | |||
| 03af0d2dfb | |||
| db8208f63f | |||
| 07c936a089 | |||
| 1c1ee02e49 | |||
| 66655f298d | |||
| 46379ffe4f | |||
| 45f0869f1f | |||
| 6ae6403750 | |||
| dc7d0d5e1d | |||
| ec9123c805 | |||
| 6fc033cc95 | |||
| 08617ecfa1 | |||
| 772090017b | |||
| be43d47341 | |||
| 5bf20e71c1 | |||
| a917c83275 | |||
| bcd5543d77 | |||
| 074093760e | |||
| 4bd3baf238 | |||
| 4dc7b9490b | |||
| 73b7bd66a9 | |||
| 87967c7b24 | |||
| 948165710b | |||
| b8a8526d54 | |||
| 91ab995e44 | |||
| f216c25f7c | |||
| 6d8cf857fb | |||
| 7235c826e0 | |||
| df8c32b0eb | |||
| 8d3544a3e2 | |||
| a8c7b82a98 | |||
| 1fa11a5b3f | |||
| 8d887465fc | |||
| 3a0b624f03 | |||
| 18872aab7a | |||
| c918757a6c | |||
| 77b04db858 | |||
| f1abf0e91e | |||
| e1d53dbd1c | |||
| 5157974d35 | |||
| b57e8514c6 | |||
| 3b3886389f | |||
| e1dad9183e | |||
| bbad57aa07 | |||
| 3f422636da | |||
| 8907373b55 | |||
| 50090b6971 | |||
| 1ca5e81dad | |||
| c7eeba9ba9 | |||
| 0352cd2f08 | |||
| 22ee46d6b6 | |||
| 6b5180d083 | |||
| de44c74656 | |||
| f31144e246 | |||
| e6900e79fd | |||
| 9dd5d07c15 | |||
| b6291879ab | |||
| 4c544cbcd0 | |||
| e4ab54e330 | |||
| e6724d3557 | |||
| 673b27a935 | |||
| eaef5be8ff | |||
| a7ea496e4d | |||
| ad33c512f1 | |||
| 6eb92655d8 | |||
| 67a814eece | |||
| 126dd432cc | |||
| ea460ed554 | |||
| 03dbc7fce6 | |||
| 71a4cd86d1 | |||
| 7465b4f643 | |||
| 35b68ef287 | |||
| 75808bbaf5 | |||
| bb5006f723 | |||
| b6de1804c5 | |||
| ba78e70eaf | |||
| 9d8da4f37e | |||
| 4c73584af7 | |||
| cd037f29e8 | |||
| f52e7b2fc6 | |||
| 347cb109af | |||
| a69bdc3c60 | |||
| 43f6a81f2c | |||
| c142196137 | |||
| 8e93a648a2 | |||
| 0dde51a145 | |||
| 070d6bbf11 | |||
| ecaa2ae4e2 | |||
| 1e26e45bda | |||
| 928a623660 | |||
| 5150b79344 | |||
| ccf560f30b | |||
| eeb23fb975 | |||
| 195a8f6ca0 | |||
| ec1b76c8b9 | |||
| 275cd0c1bc | |||
| 2888828356 | |||
| d4d6579555 | |||
| 805a2aeb63 | |||
| 4e1a020569 | |||
| 5e445b7619 | |||
| ca12cd2f08 | |||
| 28cf90cf26 | |||
| e387c21f6f | |||
| 769f358df0 | |||
| 0c135d1ade | |||
| 926ab3bc03 | |||
| e19d5533e4 | |||
| 9389402f6a | |||
| 77d0a4b6e3 | |||
| f0987cadf8 | |||
| 5f63353599 | |||
| 682b58e738 | |||
| 01d8f27b3d | |||
| 61416df10f | |||
| dcc16ae5d9 | |||
| 7e03766eee | |||
| 8d8ec89632 | |||
| 5aaf422d54 | |||
| d0f2b30d5b | |||
| fb3a88fd4e | |||
| df5a8b71bf | |||
| ae813263d6 | |||
| 857697adc0 | |||
| 00ff2fc5ab | |||
| 4fec082b18 | |||
| 976e3a7b9b | |||
| 4c3485ada1 | |||
| 71e74eb657 | |||
| e3931d50f8 | |||
| a0c7db29a4 | |||
| 865534d2ab | |||
| 5fa122dd25 | |||
| b39118da5e | |||
| 11c5ab47b8 | |||
| 90e53e568c | |||
| 4400e545aa | |||
| 9d3a02a671 | |||
| 2068a1d723 | |||
| e4bb40839c | |||
| 24ee495bec | |||
| 3a39ad53fb | |||
| 024d7ff39d | |||
| f38bca116c | |||
| 3261a3fc5a | |||
| 55da844c79 | |||
| d865c99fc8 | |||
| 97f707a972 | |||
| d003166b31 | |||
| a87cadb815 | |||
| 52c59e2d69 | |||
| bfcbe348b6 | |||
| c83c1e7a8e | |||
| 9f13a0a263 | |||
| 23fdddcd34 | |||
| ad5236e676 | |||
| c2bba55a48 | |||
| 1ced203cb9 | |||
| 7609178295 | |||
| c5a15ed78d | |||
| 78329f292c | |||
| a777f43a56 | |||
| bf153ca635 | |||
| fb87845bde | |||
| d7ee2f56cf | |||
| f4e924e314 | |||
| 961c21f6df | |||
| cd0035940a | |||
| e4c007f0d5 | |||
| 7d07ca73dc | |||
| ecce96705e | |||
| b6755ec49f | |||
| 3be663b9af | |||
| badaa27cff | |||
| aad0fed832 | |||
| 9e129f9a3f | |||
| c7f9874e43 | |||
| 75e135c738 | |||
| a9c4c04f7c | |||
| 8618108b81 | |||
| 8843ca50bc | |||
| bbfa5d5fb5 | |||
| ae2bde8d33 | |||
| 94536ab262 | |||
| a6a0a9f7fb | |||
| 630813359b | |||
| aeaa15404a | |||
| 0c930be5fb | |||
| 9a6818fb7e | |||
| 429c7c3d0e | |||
| ba501195b9 | |||
| 251b40ece6 | |||
| 09f89f0226 | |||
| c276ce4726 | |||
| fb0b0036be | |||
| 4f51c487cc | |||
| 3168fd2dca | |||
| 5245db0b39 | |||
| 1561d4b6eb | |||
| 331219c6a0 | |||
| 98879c08d2 | |||
| bee71216b0 | |||
| 5cad416499 | |||
| b87b9d554a | |||
| 4e05ff50aa | |||
| b2794c80f0 | |||
| 12653a2961 | |||
| 6d173e8aa5 | |||
| 315a684dad | |||
| 838bf749d4 | |||
| 28cf1865d8 | |||
| 34a654a21d | |||
| dd5aa113dc | |||
| 6875d92f4b | |||
| 8bedb7e610 | |||
| 20e61482e4 | |||
| e363f96c88 | |||
| abdc899a29 | |||
| 95e53aa6e3 | |||
| 64096c02a1 | |||
| 6e33516cd4 | |||
| 9270ece824 | |||
| 9b27cfe76b | |||
| 7e5a3a84ae | |||
| c1e8dd6c4d | |||
| e50b2a3f88 | |||
| e2fbea997a | |||
| a99a15e570 | |||
| f6f17a410d | |||
| 5772be6e6f | |||
| 2ded33f4d6 | |||
| 929fda3253 | |||
| 981d622aaf | |||
| a82a0ba1ae | |||
| a3f3b2e9a8 | |||
| 0262716364 | |||
| 128e785a41 | |||
| 571bf8728d | |||
| 62313baf18 | |||
| 1b14dc6281 | |||
| e68d4cf6cb | |||
| 5aec1bf8f1 | |||
| 1587602f7e | |||
| 34efb8be23 | |||
| 1c5ca651ea | |||
| 8d381ef42a | |||
| 1a4a0bbf15 | |||
| 9ffc4c6f89 | |||
| ec51030da0 | |||
| 269355e7bc | |||
| c904aeba46 | |||
| 31a7d50f81 | |||
| b7d054ab18 | |||
| 2d67ea537d | |||
| 777e5dd101 | |||
| 1454acc726 | |||
| 8ead989ec1 | |||
| 786c2e1bad | |||
| 7e6d86d00e | |||
| 1a41c2999e | |||
| 61efaca517 | |||
| 0024f68903 | |||
| 94e76d3eac | |||
| 5163b786e8 | |||
| a1cf5944c1 | |||
| cac371baf3 | |||
| 0f532ad744 | |||
| 358ba2708e | |||
| ce13bc115e | |||
| 775114e4ef | |||
| 6a3f551509 | |||
| aefcd67313 | |||
| adaaebee99 | |||
| 724a78d601 | |||
| 0fd49f3c8b | |||
| 3fa2476b52 | |||
| 86ca0d4549 | |||
| 4011f13d30 | |||
| 5ef6635df8 | |||
| a08590e010 | |||
| 000d7d48ff | |||
| 78f4659a73 | |||
| c421bcd829 | |||
| 3c618492a9 | |||
| 15cb91f21e | |||
| 8905745828 | |||
| f45dfc4732 | |||
| 6339e3359a | |||
| 5fb5097acf | |||
| 1733c588cd | |||
| 1c627d5705 | |||
| 1026847317 | |||
| 858bcb2b11 | |||
| 336dfd81f5 | |||
| 6418d33dfb | |||
| 01bf9ec560 | |||
| dc28444d16 | |||
| 37daa23ae1 | |||
| eb432e521f | |||
| 386271289c | |||
| 532755c8a9 | |||
| e974ca1593 | |||
| 6beec8edb9 | |||
| 6ee9324cdb | |||
| 3de6b7805e | |||
| 4b4e54933e | |||
| 716bbea97c | |||
| 51326de661 | |||
| 5c8002a093 | |||
| c914ee023e | |||
| 2a91d9fd80 | |||
| 65a842767d | |||
| 1a3091eb1e | |||
| 2181b8e5cb | |||
| f0298edc7b | |||
| 3337204d01 | |||
| 9e54bb9e6d | |||
| 70aef3b778 | |||
| ad0abccf0f | |||
| 657cd16ab1 | |||
| 870a2119d8 | |||
| d2b42d961c | |||
| 6d1c880b2f | |||
| d40830c870 | |||
| 81987f56dc | |||
| 198fa1e9e8 | |||
| 4e5b5b7989 | |||
| 55f56f826a | |||
| 3dae93db94 | |||
| c79ea5261f | |||
| c9906c0588 | |||
| f95e9336b6 | |||
| 6dfc1e75fc | |||
| f27a6bddbc | |||
| d8b068229c | |||
| 9f54a16757 | |||
| 4aad1e6a47 | |||
| 0a31c9eb4e | |||
| 361dea1cbd | |||
| 581d7c44e7 | |||
| bce661246c | |||
| c3f31cc224 | |||
| f18f512aac | |||
| 19fa0ddbd5 | |||
| 70407631f1 | |||
| d45721e494 | |||
| 91dcc20d9a | |||
| 46fb4d51e8 | |||
| 4e29393386 | |||
| b47fe7a472 | |||
| 1969c9f434 | |||
| 17354d05ec | |||
| 49e4042c4c | |||
| da45d8ec04 | |||
| 7b80dced8b | |||
| 97c3bced33 | |||
| fbab4f6b57 | |||
| 99253cd327 | |||
| 92c844a2b5 | |||
| 4bb0520a73 | |||
| 6d65ead997 | |||
| 1642ef2334 | |||
| 76fcfb0682 | |||
| a9d80ddb29 | |||
| f7fa7e6981 | |||
| ee61a26e60 | |||
| 4350fecab1 | |||
| 75c541d74b | |||
| 0084570fd8 | |||
| 2e659b1d3c | |||
| 7150f45b31 | |||
| fc53095c17 | |||
| 05f3480d80 | |||
| af6675263a | |||
| 1a8468a8a9 | |||
| 3ba6d074cb | |||
| 7f65ee67ec | |||
| fbad9c32d8 | |||
| 78776dd2ac | |||
| 7ec9e03984 | |||
| a82c732e59 | |||
| 3ff0fef50e | |||
| 5f7df7339a | |||
| 3485744f47 | |||
| 54386497e5 | |||
| 3b81ba30f7 | |||
| e072377f5f | |||
| 12ef96df31 | |||
| 0201624265 | |||
| 1a611f3a69 | |||
| ad327c87ef | |||
| 12d4df947d | |||
| d0403784eb | |||
| 724f350955 | |||
| 7bbd8a8bc9 | |||
| 553d22a01e | |||
| feabfee6aa | |||
| fc0f4e3a4e | |||
| b887055dbe | |||
| 19fcbbed7c | |||
| cb276a4ee7 | |||
| 27ca6ba078 | |||
| 959773af11 | |||
| a0e0199cee | |||
| 9bc40fced0 | |||
| bcac90db18 | |||
| eec89375e9 | |||
| 64a3d18c88 | |||
| d1142fecc1 | |||
| c49ce32985 | |||
| 5c7a303abc | |||
| 44a391667e | |||
| a77b5f8c01 | |||
| abafcd8326 | |||
| c4b249fe94 | |||
| cc7f7c7649 | |||
| d13b27e76b | |||
| 7da8395f88 | |||
| 7d7f32aa8d | |||
| 144b2eb8b9 | |||
| e35df5f4ad | |||
| 8df3fcf013 | |||
| b513099359 | |||
| d4a4b45194 | |||
| 0c77591af8 | |||
| 8091d8e274 | |||
| 7152089562 | |||
| 5dcc2d0b4b | |||
| b074f72593 | |||
| 429c212255 | |||
| 2637bcbf02 | |||
| e94c4486ea | |||
| 1c77ab802a | |||
| 1d395b3a8a | |||
| b6093f354d | |||
| c369d42414 | |||
| a6b9c6b07f | |||
| a299e56181 | |||
| 55811ba396 | |||
| 305c15e4fa | |||
| 348d69d96b | |||
| 66283ddc3d | |||
| 4ad7282e51 | |||
| 01258211b3 | |||
| b5262f5a26 | |||
| f27735b72f | |||
| 30ce971501 | |||
| 69ff7dc306 | |||
| 647b288042 | |||
| 6214ebf4af | |||
| 4e0c3a3d03 | |||
| 94fe5ffaae | |||
| 86fe0b1f2b | |||
| aef47c0d77 | |||
| 841a0d2055 | |||
| 9167bb35f4 | |||
| 141345b1d6 | |||
| ffbacadff4 | |||
| 4613b502a9 | |||
| 485686c4ab | |||
| 0ab4631163 | |||
| 74f7526984 | |||
| f490075fdd | |||
| 2af0eedb2d | |||
| da9ad95fe3 | |||
| a413db0bcc | |||
| d24543d3f1 | |||
| 34c9809e3e | |||
| a80c348022 | |||
| fb71a1a066 | |||
| df352618aa | |||
| 19d73293b9 | |||
| 1d79ed291c | |||
| 474f0ead3b | |||
| 322aca7b43 | |||
| 2be2d330a9 | |||
| 76951f250c | |||
| 24de0ea9ea | |||
| 1c5643b7e9 | |||
| 72708a6f91 | |||
| 6867ba8332 | |||
| 7fbab89388 | |||
| 8b5d9f1a8f | |||
| f704037fe4 | |||
| c34b8f7bc4 | |||
| db95de90fb | |||
| 24895e552e | |||
| a9ef21e333 | |||
| 1169034130 | |||
| 436dd750d3 | |||
| d1467d4f45 | |||
| df711ddcb8 | |||
| acee22b1f3 | |||
| 3e4e9ee49e | |||
| eda6196972 | |||
| d4efbe4468 | |||
| 1ea3377be7 | |||
| b88e313785 | |||
| 741912c630 | |||
| 4d0627ff35 | |||
| b1814a722f | |||
| 8aca1f7b83 | |||
| fc86bb36c5 | |||
| db7426089f | |||
| 540c845ca9 | |||
| a0845f956f | |||
| 8cb0cb7865 | |||
| 3c753a3b4f | |||
| 83208b4934 | |||
| 7998c8f3f7 | |||
| 30dcfbb4f1 | |||
| 08d5b09401 | |||
| d18633a1a8 | |||
| b0ed9bf5c2 | |||
| c5eaff493d | |||
| 7649109b29 | |||
| 2450c20151 | |||
| 8530a23707 | |||
| 1c3ed66e8c | |||
| b4b7481028 | |||
| d4bd35b9df |
1
.gitignore
vendored
1
.gitignore
vendored
@ -25,6 +25,7 @@ scripts/var.less
|
|||||||
|
|
||||||
# IDE - VSCode
|
# IDE - VSCode
|
||||||
.vscode/*
|
.vscode/*
|
||||||
|
.vscode
|
||||||
!.vscode/settings.json
|
!.vscode/settings.json
|
||||||
!.vscode/tasks.json
|
!.vscode/tasks.json
|
||||||
!.vscode/launch.json
|
!.vscode/launch.json
|
||||||
|
|||||||
1
.husky/.gitignore
vendored
Normal file
1
.husky/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
_
|
||||||
30
.husky/_/husky.sh
Normal file
30
.husky/_/husky.sh
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
if [ -z "$husky_skip_init" ]; then
|
||||||
|
debug () {
|
||||||
|
[ "$HUSKY_DEBUG" = "1" ] && echo "husky (debug) - $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
readonly hook_name="$(basename "$0")"
|
||||||
|
debug "starting $hook_name..."
|
||||||
|
|
||||||
|
if [ "$HUSKY" = "0" ]; then
|
||||||
|
debug "HUSKY env variable is set to 0, skipping hook"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f ~/.huskyrc ]; then
|
||||||
|
debug "sourcing ~/.huskyrc"
|
||||||
|
. ~/.huskyrc
|
||||||
|
fi
|
||||||
|
|
||||||
|
export readonly husky_skip_init=1
|
||||||
|
sh -e "$0" "$@"
|
||||||
|
exitCode="$?"
|
||||||
|
|
||||||
|
if [ $exitCode != 0 ]; then
|
||||||
|
echo "husky - $hook_name hook exited with code $exitCode (error)"
|
||||||
|
exit $exitCode
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
3
.vscode/settings.json
vendored
Normal file
3
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"compile-hero.disable-compile-files-on-did-save-code": true
|
||||||
|
}
|
||||||
@ -10,7 +10,7 @@ for (let i = 0; i < 46; i += 1) {
|
|||||||
href: 'https://ant.design',
|
href: 'https://ant.design',
|
||||||
avatar: [
|
avatar: [
|
||||||
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
|
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
|
||||||
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
|
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png'
|
||||||
][i % 2],
|
][i % 2],
|
||||||
no: `TradeCode ${i}`,
|
no: `TradeCode ${i}`,
|
||||||
title: `一个任务名称 ${i}`,
|
title: `一个任务名称 ${i}`,
|
||||||
@ -20,11 +20,11 @@ for (let i = 0; i < 46; i += 1) {
|
|||||||
status: Math.floor(Math.random() * 10) % 4,
|
status: Math.floor(Math.random() * 10) % 4,
|
||||||
updatedAt: new Date(`2017-07-${i < 18 ? '0' + (Math.floor(i / 2) + 1) : Math.floor(i / 2) + 1}`),
|
updatedAt: new Date(`2017-07-${i < 18 ? '0' + (Math.floor(i / 2) + 1) : Math.floor(i / 2) + 1}`),
|
||||||
createdAt: new Date(`2017-07-${i < 18 ? '0' + (Math.floor(i / 2) + 1) : Math.floor(i / 2) + 1}`),
|
createdAt: new Date(`2017-07-${i < 18 ? '0' + (Math.floor(i / 2) + 1) : Math.floor(i / 2) + 1}`),
|
||||||
progress: Math.ceil(Math.random() * 100),
|
progress: Math.ceil(Math.random() * 100)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getRule(params: any): any[] {
|
function getRule(params: any): any {
|
||||||
let ret = [...list];
|
let ret = [...list];
|
||||||
if (params.sorter) {
|
if (params.sorter) {
|
||||||
const s = params.sorter.split('_');
|
const s = params.sorter.split('_');
|
||||||
@ -36,22 +36,23 @@ function getRule(params: any): any[] {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (params.statusList && params.statusList.length > 0) {
|
if (params.statusList && params.statusList.length > 0) {
|
||||||
ret = ret.filter((data) => params.statusList.indexOf(data.status) > -1);
|
ret = ret.filter(data => params.statusList.indexOf(data.status) > -1);
|
||||||
}
|
}
|
||||||
if (params.no) {
|
if (params.no) {
|
||||||
ret = ret.filter((data) => data.no.indexOf(params.no) > -1);
|
ret = ret.filter(data => data.no.indexOf(params.no) > -1);
|
||||||
}
|
}
|
||||||
return ret;
|
return { data: { records: ret, total: ret.length }, success: true };
|
||||||
}
|
}
|
||||||
|
|
||||||
function removeRule(nos: string): boolean {
|
function removeRule(nos: string): any {
|
||||||
nos.split(',').forEach((no) => {
|
nos.split(',').forEach(no => {
|
||||||
const idx = list.findIndex((w) => w.no === no);
|
const idx = list.findIndex(w => w.no === no);
|
||||||
if (idx !== -1) {
|
if (idx !== -1) {
|
||||||
list.splice(idx, 1);
|
list.splice(idx, 1);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return true;
|
|
||||||
|
return { data: true, success: true };
|
||||||
}
|
}
|
||||||
|
|
||||||
function saveRule(description: string): void {
|
function saveRule(description: string): void {
|
||||||
@ -61,7 +62,7 @@ function saveRule(description: string): void {
|
|||||||
href: 'https://ant.design',
|
href: 'https://ant.design',
|
||||||
avatar: [
|
avatar: [
|
||||||
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
|
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
|
||||||
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
|
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png'
|
||||||
][i % 2],
|
][i % 2],
|
||||||
no: `TradeCode ${i}`,
|
no: `TradeCode ${i}`,
|
||||||
title: `一个任务名称 ${i}`,
|
title: `一个任务名称 ${i}`,
|
||||||
@ -71,12 +72,12 @@ function saveRule(description: string): void {
|
|||||||
status: Math.floor(Math.random() * 10) % 2,
|
status: Math.floor(Math.random() * 10) % 2,
|
||||||
updatedAt: new Date(),
|
updatedAt: new Date(),
|
||||||
createdAt: new Date(),
|
createdAt: new Date(),
|
||||||
progress: Math.ceil(Math.random() * 100),
|
progress: Math.ceil(Math.random() * 100)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export const RULES = {
|
export const RULES = {
|
||||||
'/rule': (req: MockRequest) => getRule(req.queryString),
|
'POST /rule': (req: MockRequest) => getRule(req.queryString),
|
||||||
'DELETE /rule': (req: MockRequest) => removeRule(req.queryString.nos),
|
'POST /delete/rule': (req: MockRequest) => removeRule(req.body.nos)
|
||||||
'POST /rule': (req: MockRequest) => saveRule(req.body.description),
|
// 'POST /rule': (req: MockRequest) => saveRule(req.body.description)
|
||||||
};
|
};
|
||||||
|
|||||||
68
angular.json
68
angular.json
@ -35,11 +35,23 @@
|
|||||||
"styles": [
|
"styles": [
|
||||||
"node_modules/perfect-scrollbar/css/perfect-scrollbar.css",
|
"node_modules/perfect-scrollbar/css/perfect-scrollbar.css",
|
||||||
"node_modules/quill/dist/quill.snow.css",
|
"node_modules/quill/dist/quill.snow.css",
|
||||||
"src/styles.less"
|
"src/styles.less",
|
||||||
|
{
|
||||||
|
"input": "src/styles/default.less",
|
||||||
|
"bundleName": "default",
|
||||||
|
"inject": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "src/styles/compact.less",
|
||||||
|
"bundleName": "compact",
|
||||||
|
"inject": false
|
||||||
|
}
|
||||||
],
|
],
|
||||||
|
|
||||||
"scripts": [
|
"scripts": [
|
||||||
"node_modules/quill/dist/quill.min.js",
|
"node_modules/quill/dist/quill.min.js",
|
||||||
"node_modules/perfect-scrollbar/dist/perfect-scrollbar.js"
|
"node_modules/perfect-scrollbar/dist/perfect-scrollbar.js",
|
||||||
|
"node_modules/qrious/dist/qrious.min.js"
|
||||||
],
|
],
|
||||||
"allowedCommonJsDependencies": [
|
"allowedCommonJsDependencies": [
|
||||||
"ajv",
|
"ajv",
|
||||||
@ -48,20 +60,40 @@
|
|||||||
},
|
},
|
||||||
"configurations": {
|
"configurations": {
|
||||||
"production": {
|
"production": {
|
||||||
"fileReplacements": [
|
"fileReplacements": [{
|
||||||
{
|
"replace": "src/environments/environment.ts",
|
||||||
"replace": "src/environments/environment.ts",
|
"with": "src/environments/environment.prod.ts"
|
||||||
"with": "src/environments/environment.prod.ts"
|
}],
|
||||||
}
|
|
||||||
],
|
|
||||||
"outputHashing": "all",
|
"outputHashing": "all",
|
||||||
"budgets": [
|
"budgets": [{
|
||||||
{
|
"type": "initial",
|
||||||
"type": "initial",
|
"maximumWarning": "4mb",
|
||||||
"maximumWarning": "2mb",
|
"maximumError": "10mb"
|
||||||
"maximumError": "5mb"
|
}]
|
||||||
}
|
},
|
||||||
]
|
"dev": {
|
||||||
|
"fileReplacements": [{
|
||||||
|
"replace": "src/environments/environment.ts",
|
||||||
|
"with": "src/environments/eascs/environment.dev.ts"
|
||||||
|
}],
|
||||||
|
"outputHashing": "all",
|
||||||
|
"budgets": [{
|
||||||
|
"type": "initial",
|
||||||
|
"maximumWarning": "4mb",
|
||||||
|
"maximumError": "10mb"
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
"test": {
|
||||||
|
"fileReplacements": [{
|
||||||
|
"replace": "src/environments/environment.ts",
|
||||||
|
"with": "src/environments/eascs/environment.test.ts"
|
||||||
|
}],
|
||||||
|
"outputHashing": "all",
|
||||||
|
"budgets": [{
|
||||||
|
"type": "initial",
|
||||||
|
"maximumWarning": "4mb",
|
||||||
|
"maximumError": "10mb"
|
||||||
|
}]
|
||||||
},
|
},
|
||||||
"development": {
|
"development": {
|
||||||
"buildOptimizer": false,
|
"buildOptimizer": false,
|
||||||
@ -84,6 +116,9 @@
|
|||||||
"production": {
|
"production": {
|
||||||
"browserTarget": "ng-alain:build:production"
|
"browserTarget": "ng-alain:build:production"
|
||||||
},
|
},
|
||||||
|
"dev": {
|
||||||
|
"browserTarget": "app:build:dev"
|
||||||
|
},
|
||||||
"development": {
|
"development": {
|
||||||
"browserTarget": "ng-alain:build:development"
|
"browserTarget": "ng-alain:build:development"
|
||||||
}
|
}
|
||||||
@ -131,6 +166,9 @@
|
|||||||
"configurations": {
|
"configurations": {
|
||||||
"production": {
|
"production": {
|
||||||
"devServerTarget": "ng-alain:serve:production"
|
"devServerTarget": "ng-alain:serve:production"
|
||||||
|
},
|
||||||
|
"dev": {
|
||||||
|
"devServerTarget": "app:build:dev"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
101
package-lock.json
generated
101
package-lock.json
generated
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "ng-alain-pro",
|
"name": "tms-obc-web",
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
@ -19,6 +19,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@amap/amap-jsapi-loader": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.nlark.com/@amap/amap-jsapi-loader/download/@amap/amap-jsapi-loader-1.0.1.tgz",
|
||||||
|
"integrity": "sha1-nsS01dJGfqxFH2yFLjXbaen58MA="
|
||||||
|
},
|
||||||
"@ampproject/remapping": {
|
"@ampproject/remapping": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmmirror.com/@ampproject/remapping/download/@ampproject/remapping-1.0.1.tgz",
|
"resolved": "https://registry.npmmirror.com/@ampproject/remapping/download/@ampproject/remapping-1.0.1.tgz",
|
||||||
@ -2728,11 +2733,46 @@
|
|||||||
"integrity": "sha1-ayxRCnrXA56Y57jT1lmPQ1nlwIA=",
|
"integrity": "sha1-ayxRCnrXA56Y57jT1lmPQ1nlwIA=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"@types/d3-geo": {
|
||||||
|
"version": "3.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.2.tgz",
|
||||||
|
"integrity": "sha512-DbqK7MLYA8LpyHQfv6Klz0426bQEf7bRTvhMy44sNGVyZoWn//B0c+Qbeg8Osi2Obdc9BLLXYAKpyWege2/7LQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@types/geojson": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@types/d3-path": {
|
"@types/d3-path": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.nlark.com/@types/d3-path/download/@types/d3-path-2.0.1.tgz",
|
"resolved": "https://registry.nlark.com/@types/d3-path/download/@types/d3-path-2.0.1.tgz",
|
||||||
"integrity": "sha1-ygPfqLlNit2XrQzZfpbiAGtHY8s="
|
"integrity": "sha1-ygPfqLlNit2XrQzZfpbiAGtHY8s="
|
||||||
},
|
},
|
||||||
|
"@types/d3-sankey": {
|
||||||
|
"version": "0.11.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/d3-sankey/-/d3-sankey-0.11.2.tgz",
|
||||||
|
"integrity": "sha512-U6SrTWUERSlOhnpSrgvMX64WblX1AxX6nEjI2t3mLK2USpQrnbwYYK+AS9SwiE7wgYmOsSSKoSdr8aoKBH0HgQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@types/d3-shape": "^1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@types/d3-path": {
|
||||||
|
"version": "1.0.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.9.tgz",
|
||||||
|
"integrity": "sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"@types/d3-shape": {
|
||||||
|
"version": "1.3.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.8.tgz",
|
||||||
|
"integrity": "sha512-gqfnMz6Fd5H6GOLYixOZP/xlrMtJms9BaS+6oWxTKHNqPGZ93BkWWupQSCYm6YHqx6h9wjRupuJb90bun6ZaYg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@types/d3-path": "^1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"@types/d3-shape": {
|
"@types/d3-shape": {
|
||||||
"version": "2.1.3",
|
"version": "2.1.3",
|
||||||
"resolved": "https://registry.npmmirror.com/@types/d3-shape/download/@types/d3-shape-2.1.3.tgz",
|
"resolved": "https://registry.npmmirror.com/@types/d3-shape/download/@types/d3-shape-2.1.3.tgz",
|
||||||
@ -2778,6 +2818,12 @@
|
|||||||
"integrity": "sha512-sPZYQEIF/SOnLAvaz9lTuydniP+afBMtElRTdYkeV1QtEgvtJ7qolCPjly6O32QI8CbEmP5O/fztMXEDWfEcrg==",
|
"integrity": "sha512-sPZYQEIF/SOnLAvaz9lTuydniP+afBMtElRTdYkeV1QtEgvtJ7qolCPjly6O32QI8CbEmP5O/fztMXEDWfEcrg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"@types/geojson": {
|
||||||
|
"version": "7946.0.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.8.tgz",
|
||||||
|
"integrity": "sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"@types/glob": {
|
"@types/glob": {
|
||||||
"version": "7.2.0",
|
"version": "7.2.0",
|
||||||
"resolved": "https://registry.npmmirror.com/@types/glob/download/@types/glob-7.2.0.tgz?cache=0&sync_timestamp=1637267477186&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fglob%2Fdownload%2F%40types%2Fglob-7.2.0.tgz",
|
"resolved": "https://registry.npmmirror.com/@types/glob/download/@types/glob-7.2.0.tgz?cache=0&sync_timestamp=1637267477186&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fglob%2Fdownload%2F%40types%2Fglob-7.2.0.tgz",
|
||||||
@ -3426,14 +3472,6 @@
|
|||||||
"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
|
"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"angular-baidu-maps": {
|
|
||||||
"version": "12.0.0",
|
|
||||||
"resolved": "https://registry.nlark.com/angular-baidu-maps/download/angular-baidu-maps-12.0.0.tgz",
|
|
||||||
"integrity": "sha1-I/Sn52ggJcLJRnGdIR6eNmt6sXQ=",
|
|
||||||
"requires": {
|
|
||||||
"tslib": "^2.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ansi-colors": {
|
"ansi-colors": {
|
||||||
"version": "4.1.1",
|
"version": "4.1.1",
|
||||||
"resolved": "https://registry.nlark.com/ansi-colors/download/ansi-colors-4.1.1.tgz",
|
"resolved": "https://registry.nlark.com/ansi-colors/download/ansi-colors-4.1.1.tgz",
|
||||||
@ -5175,6 +5213,14 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"css-line-break": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==",
|
||||||
|
"requires": {
|
||||||
|
"utrie": "^1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"css-loader": {
|
"css-loader": {
|
||||||
"version": "6.2.0",
|
"version": "6.2.0",
|
||||||
"resolved": "https://registry.npmmirror.com/css-loader/download/css-loader-6.2.0.tgz?cache=0&sync_timestamp=1635967924209&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcss-loader%2Fdownload%2Fcss-loader-6.2.0.tgz",
|
"resolved": "https://registry.npmmirror.com/css-loader/download/css-loader-6.2.0.tgz?cache=0&sync_timestamp=1635967924209&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcss-loader%2Fdownload%2Fcss-loader-6.2.0.tgz",
|
||||||
@ -8116,6 +8162,15 @@
|
|||||||
"integrity": "sha1-e15vfmZen7QfMAB+2eDUHpf7IUA=",
|
"integrity": "sha1-e15vfmZen7QfMAB+2eDUHpf7IUA=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"html2canvas": {
|
||||||
|
"version": "1.4.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz",
|
||||||
|
"integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==",
|
||||||
|
"requires": {
|
||||||
|
"css-line-break": "^2.1.0",
|
||||||
|
"text-segmentation": "^1.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
"htmlparser2": {
|
"htmlparser2": {
|
||||||
"version": "3.10.1",
|
"version": "3.10.1",
|
||||||
"resolved": "https://registry.npmmirror.com/htmlparser2/download/htmlparser2-3.10.1.tgz?cache=0&sync_timestamp=1636640940074&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-3.10.1.tgz",
|
"resolved": "https://registry.npmmirror.com/htmlparser2/download/htmlparser2-3.10.1.tgz?cache=0&sync_timestamp=1636640940074&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-3.10.1.tgz",
|
||||||
@ -14814,6 +14869,11 @@
|
|||||||
"integrity": "sha1-xF6cYYAL0IfviNfiVkI73Unl0HE=",
|
"integrity": "sha1-xF6cYYAL0IfviNfiVkI73Unl0HE=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"qrious": {
|
||||||
|
"version": "4.0.2",
|
||||||
|
"resolved": "http://npm.eascs.com/qrious/-/qrious-4.0.2.tgz",
|
||||||
|
"integrity": "sha1-CcTUB50rlhYX9ixpz/O5u2ajlpM="
|
||||||
|
},
|
||||||
"qs": {
|
"qs": {
|
||||||
"version": "6.7.0",
|
"version": "6.7.0",
|
||||||
"resolved": "https://registry.nlark.com/qs/download/qs-6.7.0.tgz",
|
"resolved": "https://registry.nlark.com/qs/download/qs-6.7.0.tgz",
|
||||||
@ -22660,6 +22720,14 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"text-segmentation": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz",
|
||||||
|
"integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==",
|
||||||
|
"requires": {
|
||||||
|
"utrie": "^1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"text-table": {
|
"text-table": {
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"resolved": "https://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz",
|
"resolved": "https://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz",
|
||||||
@ -23209,6 +23277,21 @@
|
|||||||
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
|
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"utrie": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz",
|
||||||
|
"integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==",
|
||||||
|
"requires": {
|
||||||
|
"base64-arraybuffer": "^1.0.2"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"base64-arraybuffer": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
|
||||||
|
"integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"uuid": {
|
"uuid": {
|
||||||
"version": "3.4.0",
|
"version": "3.4.0",
|
||||||
"resolved": "https://registry.npmmirror.com/uuid/download/uuid-3.4.0.tgz",
|
"resolved": "https://registry.npmmirror.com/uuid/download/uuid-3.4.0.tgz",
|
||||||
|
|||||||
71
package.json
71
package.json
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "ng-alain-pro",
|
"name": "tms-obc-web",
|
||||||
"version": "0.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Ng-alain business theme, ng-zorro-antd admin panel front-end framework",
|
"description": "运营后台-WEB",
|
||||||
"author": "cipchk <cipchk@qq.com>",
|
"author": "cipchk <cipchk@qq.com>",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -11,9 +11,12 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"ng-high-memory": "node --max_old_space_size=8000 ./node_modules/@angular/cli/bin/ng",
|
"ng-high-memory": "node --max_old_space_size=8000 ./node_modules/@angular/cli/bin/ng",
|
||||||
"ng": "ng",
|
"ng": "ng",
|
||||||
"start": "ng s -o --port 4202",
|
"start": "ng s -o --port 4202 --host 0.0.0.0",
|
||||||
|
"startIp": "ng serve -o --port 4202 --host 172.29.9.71 --open",
|
||||||
"hmr": "ng s -o --hmr",
|
"hmr": "ng s -o --hmr",
|
||||||
"build": "npm run ng-high-memory build",
|
"build": "npm run ng-high-memory build --",
|
||||||
|
"build:dev": "npm run build -- -c dev",
|
||||||
|
"build:test": "npm run build -- -c test",
|
||||||
"analyze": "npm run ng-high-memory build -- --source-map",
|
"analyze": "npm run ng-high-memory build -- --source-map",
|
||||||
"analyze:view": "source-map-explorer dist/**/*.js",
|
"analyze:view": "source-map-explorer dist/**/*.js",
|
||||||
"lint": "npm run lint:ts && npm run lint:style",
|
"lint": "npm run lint:ts && npm run lint:style",
|
||||||
@ -29,6 +32,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@agm/core": "^1.1.0",
|
"@agm/core": "^1.1.0",
|
||||||
|
"@amap/amap-jsapi-loader": "^1.0.1",
|
||||||
"@angular/animations": "~12.2.0",
|
"@angular/animations": "~12.2.0",
|
||||||
"@angular/common": "~12.2.0",
|
"@angular/common": "~12.2.0",
|
||||||
"@angular/compiler": "~12.2.0",
|
"@angular/compiler": "~12.2.0",
|
||||||
@ -53,8 +57,8 @@
|
|||||||
"@fullcalendar/timegrid": "^5.9.0",
|
"@fullcalendar/timegrid": "^5.9.0",
|
||||||
"@swimlane/ngx-charts": "^18.0.1",
|
"@swimlane/ngx-charts": "^18.0.1",
|
||||||
"ajv": "^8.6.2",
|
"ajv": "^8.6.2",
|
||||||
"angular-baidu-maps": "^12.0.0",
|
|
||||||
"file-saver": "^2.0.5",
|
"file-saver": "^2.0.5",
|
||||||
|
"html2canvas": "^1.4.1",
|
||||||
"js-base64": "^3.6.1",
|
"js-base64": "^3.6.1",
|
||||||
"masonry-layout": "^4.2.2",
|
"masonry-layout": "^4.2.2",
|
||||||
"ng-gallery": "^5.0.0",
|
"ng-gallery": "^5.0.0",
|
||||||
@ -62,6 +66,7 @@
|
|||||||
"ngx-tinymce": "^12.0.0",
|
"ngx-tinymce": "^12.0.0",
|
||||||
"ngx-trend": "^7.0.0",
|
"ngx-trend": "^7.0.0",
|
||||||
"perfect-scrollbar": "^1.5.2",
|
"perfect-scrollbar": "^1.5.2",
|
||||||
|
"qrious": "^4.0.2",
|
||||||
"quill": "^1.3.7",
|
"quill": "^1.3.7",
|
||||||
"quill-image-resize-module": "^3.0.0",
|
"quill-image-resize-module": "^3.0.0",
|
||||||
"rxjs": "~6.6.0",
|
"rxjs": "~6.6.0",
|
||||||
@ -71,22 +76,22 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@angular-devkit/build-angular": "~12.2.0",
|
"@angular-devkit/build-angular": "~12.2.0",
|
||||||
"@angular/cli": "~12.2.0",
|
|
||||||
"@angular/compiler-cli": "~12.2.0",
|
|
||||||
"@types/jasmine": "~3.8.0",
|
|
||||||
"@types/node": "^12.11.1",
|
|
||||||
"jasmine-core": "~3.8.0",
|
|
||||||
"karma": "~6.3.0",
|
|
||||||
"karma-chrome-launcher": "~3.1.0",
|
|
||||||
"karma-coverage": "~2.0.3",
|
|
||||||
"karma-jasmine": "~4.0.0",
|
|
||||||
"karma-jasmine-html-reporter": "~1.7.0",
|
|
||||||
"typescript": "~4.3.5",
|
|
||||||
"@angular-eslint/builder": "~12.3.1",
|
"@angular-eslint/builder": "~12.3.1",
|
||||||
"@angular-eslint/eslint-plugin": "~12.3.1",
|
"@angular-eslint/eslint-plugin": "~12.3.1",
|
||||||
"@angular-eslint/eslint-plugin-template": "~12.3.1",
|
"@angular-eslint/eslint-plugin-template": "~12.3.1",
|
||||||
"@angular-eslint/schematics": "~12.3.1",
|
"@angular-eslint/schematics": "~12.3.1",
|
||||||
"@angular-eslint/template-parser": "~12.3.1",
|
"@angular-eslint/template-parser": "~12.3.1",
|
||||||
|
"@angular/cli": "~12.2.0",
|
||||||
|
"@angular/compiler-cli": "~12.2.0",
|
||||||
|
"@angular/language-service": "~12.2.0",
|
||||||
|
"@delon/testing": "^12.3.0",
|
||||||
|
"@types/d3-geo": "^3.0.2",
|
||||||
|
"@types/d3-sankey": "^0.11.2",
|
||||||
|
"@types/file-saver": "^2.0.3",
|
||||||
|
"@types/jasmine": "~3.8.0",
|
||||||
|
"@types/jasminewd2": "~2.0.3",
|
||||||
|
"@types/js-base64": "^3.0.0",
|
||||||
|
"@types/node": "^12.11.1",
|
||||||
"@typescript-eslint/eslint-plugin": "~4.29.2",
|
"@typescript-eslint/eslint-plugin": "~4.29.2",
|
||||||
"@typescript-eslint/parser": "~4.29.2",
|
"@typescript-eslint/parser": "~4.29.2",
|
||||||
"eslint": "^7.32.0",
|
"eslint": "^7.32.0",
|
||||||
@ -95,29 +100,31 @@
|
|||||||
"eslint-plugin-jsdoc": "~36.0.7",
|
"eslint-plugin-jsdoc": "~36.0.7",
|
||||||
"eslint-plugin-prefer-arrow": "~1.2.3",
|
"eslint-plugin-prefer-arrow": "~1.2.3",
|
||||||
"eslint-plugin-prettier": "~3.4.1",
|
"eslint-plugin-prettier": "~3.4.1",
|
||||||
"@angular/language-service": "~12.2.0",
|
"husky": "^6.0.0",
|
||||||
"source-map-explorer": "^2.5.2",
|
"jasmine-core": "~3.8.0",
|
||||||
|
"jasmine-spec-reporter": "~5.0.0",
|
||||||
|
"karma": "~6.3.0",
|
||||||
|
"karma-chrome-launcher": "~3.1.0",
|
||||||
|
"karma-coverage": "~2.0.3",
|
||||||
|
"karma-coverage-istanbul-reporter": "~3.0.2",
|
||||||
|
"karma-jasmine": "~4.0.0",
|
||||||
|
"karma-jasmine-html-reporter": "~1.7.0",
|
||||||
|
"lint-staged": "^11.1.2",
|
||||||
|
"ng-alain": "^12.3.0",
|
||||||
|
"ng-alain-plugin-theme": "^12.0.0",
|
||||||
|
"ng-alain-sts": "^0.0.1",
|
||||||
|
"node-fetch": "^2.6.1",
|
||||||
"prettier": "^2.2.1",
|
"prettier": "^2.2.1",
|
||||||
|
"protractor": "~7.0.0",
|
||||||
|
"source-map-explorer": "^2.5.2",
|
||||||
"stylelint": "^13.13.1",
|
"stylelint": "^13.13.1",
|
||||||
"stylelint-config-prettier": "^8.0.2",
|
"stylelint-config-prettier": "^8.0.2",
|
||||||
"stylelint-config-rational-order": "^0.1.2",
|
"stylelint-config-rational-order": "^0.1.2",
|
||||||
"stylelint-config-standard": "^22.0.0",
|
"stylelint-config-standard": "^22.0.0",
|
||||||
"stylelint-declaration-block-no-ignored-properties": "^2.4.0",
|
"stylelint-declaration-block-no-ignored-properties": "^2.4.0",
|
||||||
"stylelint-order": "^4.1.0",
|
"stylelint-order": "^4.1.0",
|
||||||
"@delon/testing": "^12.3.0",
|
|
||||||
"ng-alain": "^12.3.0",
|
|
||||||
"ng-alain-plugin-theme": "^12.0.0",
|
|
||||||
"ng-alain-sts": "^0.0.1",
|
|
||||||
"@types/jasminewd2": "~2.0.3",
|
|
||||||
"jasmine-spec-reporter": "~5.0.0",
|
|
||||||
"karma-coverage-istanbul-reporter": "~3.0.2",
|
|
||||||
"protractor": "~7.0.0",
|
|
||||||
"ts-node": "~8.3.0",
|
"ts-node": "~8.3.0",
|
||||||
"node-fetch": "^2.6.1",
|
"typescript": "~4.3.5"
|
||||||
"husky": "^6.0.0",
|
|
||||||
"lint-staged": "^11.1.2",
|
|
||||||
"@types/file-saver": "^2.0.3",
|
|
||||||
"@types/js-base64": "^3.0.0"
|
|
||||||
},
|
},
|
||||||
"lint-staged": {
|
"lint-staged": {
|
||||||
"(src)/**/*.{html,ts}": [
|
"(src)/**/*.{html,ts}": [
|
||||||
|
|||||||
@ -1,10 +1,14 @@
|
|||||||
/**
|
/*
|
||||||
* For more configuration, please refer to https://angular.io/guide/build#proxying-to-a-backend-server
|
* @Description :
|
||||||
*
|
* @Version : 1.0
|
||||||
* 更多配置描述请参考 https://angular.cn/guide/build#proxying-to-a-backend-server
|
* @Author : Shiming
|
||||||
*
|
* @Date : 2022-01-18 09:51:21
|
||||||
* Note: The proxy is only valid for real requests, Mock does not actually generate requests, so the priority of Mock will be higher than the proxy
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-04-20 14:18:40
|
||||||
|
* @FilePath : \\tms-obc-web\\proxy.conf.js
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
/**
|
/**
|
||||||
* The following means that all requests are directed to the backend `https://localhost:9000/`
|
* The following means that all requests are directed to the backend `https://localhost:9000/`
|
||||||
@ -14,4 +18,24 @@ module.exports = {
|
|||||||
// secure: false, // Ignore invalid SSL certificates
|
// secure: false, // Ignore invalid SSL certificates
|
||||||
// changeOrigin: true
|
// changeOrigin: true
|
||||||
// }
|
// }
|
||||||
|
// '//api': {
|
||||||
|
// target: {
|
||||||
|
// host: 'tms-api.yunduoxing.com',
|
||||||
|
// protocol: 'https:',
|
||||||
|
// port: 443
|
||||||
|
// },
|
||||||
|
// secure: false,
|
||||||
|
// changeOrigin: true,
|
||||||
|
// logLevel: 'debug'
|
||||||
|
// },
|
||||||
|
'//api': {
|
||||||
|
target: {
|
||||||
|
host: 'tms-api-test.eascs.com',
|
||||||
|
protocol: 'https:',
|
||||||
|
port: 443
|
||||||
|
},
|
||||||
|
secure: false,
|
||||||
|
changeOrigin: true,
|
||||||
|
logLevel: 'debug'
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@ -2,8 +2,10 @@ import { Component, ElementRef, OnInit, Renderer2 } from '@angular/core';
|
|||||||
import { NavigationEnd, NavigationError, RouteConfigLoadStart, Router } from '@angular/router';
|
import { NavigationEnd, NavigationError, RouteConfigLoadStart, Router } from '@angular/router';
|
||||||
import { TitleService, VERSION as VERSION_ALAIN } from '@delon/theme';
|
import { TitleService, VERSION as VERSION_ALAIN } from '@delon/theme';
|
||||||
import { environment } from '@env/environment';
|
import { environment } from '@env/environment';
|
||||||
|
import { NzIconService } from 'ng-zorro-antd/icon';
|
||||||
import { NzModalService } from 'ng-zorro-antd/modal';
|
import { NzModalService } from 'ng-zorro-antd/modal';
|
||||||
import { VERSION as VERSION_ZORRO } from 'ng-zorro-antd/version';
|
import { VERSION as VERSION_ZORRO } from 'ng-zorro-antd/version';
|
||||||
|
import { ThemeService } from './theme.service';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-root',
|
selector: 'app-root',
|
||||||
@ -15,10 +17,15 @@ export class AppComponent implements OnInit {
|
|||||||
renderer: Renderer2,
|
renderer: Renderer2,
|
||||||
private router: Router,
|
private router: Router,
|
||||||
private titleSrv: TitleService,
|
private titleSrv: TitleService,
|
||||||
private modalSrv: NzModalService
|
private modalSrv: NzModalService,
|
||||||
|
private iconService: NzIconService,
|
||||||
|
private themeService: ThemeService
|
||||||
) {
|
) {
|
||||||
renderer.setAttribute(el.nativeElement, 'ng-alain-version', VERSION_ALAIN.full);
|
renderer.setAttribute(el.nativeElement, 'ng-alain-version', VERSION_ALAIN.full);
|
||||||
renderer.setAttribute(el.nativeElement, 'ng-zorro-version', VERSION_ZORRO.full);
|
renderer.setAttribute(el.nativeElement, 'ng-zorro-version', VERSION_ZORRO.full);
|
||||||
|
this.iconService.fetchFromIconfont({
|
||||||
|
scriptUrl: 'https://at.alicdn.com/t/font_3153207_udngwyp35db.js'
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit(): void {
|
ngOnInit(): void {
|
||||||
@ -42,5 +49,15 @@ export class AppComponent implements OnInit {
|
|||||||
this.modalSrv.closeAll();
|
this.modalSrv.closeAll();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
// 适配放大150%的屏幕
|
||||||
|
const screen: any = window.screen
|
||||||
|
var zoom = window.devicePixelRatio || screen.deviceXDPI / screen?.logicalXDPI;
|
||||||
|
// console.log(zoom)
|
||||||
|
if (document.body.clientWidth >= 1280) {
|
||||||
|
if (zoom != 1 && zoom != 2 && zoom != 3) {
|
||||||
|
this.themeService.toggleTheme().then();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,12 +2,13 @@
|
|||||||
/* eslint-disable import/no-duplicates */
|
/* eslint-disable import/no-duplicates */
|
||||||
import { HttpClientModule } from '@angular/common/http';
|
import { HttpClientModule } from '@angular/common/http';
|
||||||
import { default as ngLang } from '@angular/common/locales/zh';
|
import { default as ngLang } from '@angular/common/locales/zh';
|
||||||
import { APP_INITIALIZER, LOCALE_ID, NgModule, Type } from '@angular/core';
|
import { APP_INITIALIZER, DEFAULT_CURRENCY_CODE, LOCALE_ID, NgModule, Type } from '@angular/core';
|
||||||
import { BrowserModule } from '@angular/platform-browser';
|
import { BrowserModule } from '@angular/platform-browser';
|
||||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||||
import { SimpleInterceptor } from '@delon/auth';
|
import { SimpleInterceptor } from '@delon/auth';
|
||||||
import { NzNotificationModule } from 'ng-zorro-antd/notification';
|
import { NzNotificationModule } from 'ng-zorro-antd/notification';
|
||||||
|
import zh from '@angular/common/locales/zh';
|
||||||
|
registerLocaleData(zh);
|
||||||
// #region global third module
|
// #region global third module
|
||||||
|
|
||||||
import { BidiModule } from '@angular/cdk/bidi';
|
import { BidiModule } from '@angular/cdk/bidi';
|
||||||
@ -18,10 +19,11 @@ const GLOBAL_THIRD_MODULES: Array<Type<any>> = [BidiModule];
|
|||||||
// #region Http Interceptors
|
// #region Http Interceptors
|
||||||
import { HTTP_INTERCEPTORS } from '@angular/common/http';
|
import { HTTP_INTERCEPTORS } from '@angular/common/http';
|
||||||
|
|
||||||
import { DefaultInterceptor } from '@core';
|
import { BusinessInterceptor, DefaultInterceptor } from '@core';
|
||||||
|
|
||||||
const INTERCEPTOR_PROVIDES = [
|
const INTERCEPTOR_PROVIDES = [
|
||||||
{ provide: HTTP_INTERCEPTORS, useClass: SimpleInterceptor, multi: true },
|
{ provide: HTTP_INTERCEPTORS, useClass: SimpleInterceptor, multi: true },
|
||||||
|
{ provide: HTTP_INTERCEPTORS, useClass: BusinessInterceptor, multi: true },
|
||||||
{ provide: HTTP_INTERCEPTORS, useClass: DefaultInterceptor, multi: true }
|
{ provide: HTTP_INTERCEPTORS, useClass: DefaultInterceptor, multi: true }
|
||||||
];
|
];
|
||||||
// #endregion
|
// #endregion
|
||||||
@ -38,7 +40,9 @@ const APPINIT_PROVIDES = [
|
|||||||
useFactory: StartupServiceFactory,
|
useFactory: StartupServiceFactory,
|
||||||
deps: [StartupService],
|
deps: [StartupService],
|
||||||
multi: true
|
multi: true
|
||||||
}
|
},
|
||||||
|
{ provide: DEFAULT_CURRENCY_CODE, useValue: '¥' },
|
||||||
|
AuthGuard
|
||||||
];
|
];
|
||||||
// #endregion
|
// #endregion
|
||||||
|
|
||||||
@ -49,7 +53,8 @@ import { LayoutModule } from './layout/layout.module';
|
|||||||
import { RoutesModule } from './routes/routes.module';
|
import { RoutesModule } from './routes/routes.module';
|
||||||
import { SharedModule } from './shared/shared.module';
|
import { SharedModule } from './shared/shared.module';
|
||||||
import { STWidgetModule } from './shared/widget/st-widget.module';
|
import { STWidgetModule } from './shared/widget/st-widget.module';
|
||||||
import { Observable } from 'rxjs';
|
import { registerLocaleData } from '@angular/common';
|
||||||
|
import { AuthGuard } from './core/guards/auth.guard';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
declarations: [AppComponent],
|
declarations: [AppComponent],
|
||||||
|
|||||||
@ -1,9 +1,10 @@
|
|||||||
import { NgModule, Optional, SkipSelf } from '@angular/core';
|
import { NgModule, Optional, SkipSelf } from '@angular/core';
|
||||||
|
import { EATokenGuard } from './guards/token.guard';
|
||||||
|
|
||||||
import { throwIfAlreadyLoaded } from './module-import-guard';
|
import { throwIfAlreadyLoaded } from './module-import-guard';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
providers: []
|
providers: [EATokenGuard]
|
||||||
})
|
})
|
||||||
export class CoreModule {
|
export class CoreModule {
|
||||||
constructor(@Optional() @SkipSelf() parentModule: CoreModule) {
|
constructor(@Optional() @SkipSelf() parentModule: CoreModule) {
|
||||||
|
|||||||
@ -15,14 +15,16 @@ import { EnvironmentService } from '@env/environment.service';
|
|||||||
import { NzMessageService } from 'ng-zorro-antd/message';
|
import { NzMessageService } from 'ng-zorro-antd/message';
|
||||||
|
|
||||||
@Injectable({
|
@Injectable({
|
||||||
providedIn: 'root',
|
providedIn: 'root'
|
||||||
})
|
})
|
||||||
export class CoreService {
|
export class CoreService {
|
||||||
// 获取当前登录用户信息
|
// 获取当前登录用户信息
|
||||||
public $api_get_current_user_info = `/scm/cuc/cuc/user/getUserDetail`;
|
public $api_get_current_user_info = `/scm/cuc/cuc/user/getUserDetail`;
|
||||||
|
|
||||||
// 获取当前用户所拥有的菜单
|
// 获取当前用户所拥有的菜单
|
||||||
public $api_get_current_user_menus = `/scm/cuc/cuc/functionInfo/getUserHaveFunctionsList`;
|
public $api_get_current_user_menus = `/api/mdc/cuc/functionInfo/getUserHaveFunctionsList`;
|
||||||
|
|
||||||
|
position = { lat: '', lng: '' };
|
||||||
|
|
||||||
constructor(private injector: Injector) {}
|
constructor(private injector: Injector) {}
|
||||||
// 注入路由
|
// 注入路由
|
||||||
|
|||||||
89
src/app/core/guards/auth.guard.ts
Normal file
89
src/app/core/guards/auth.guard.ts
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
import { Injectable, Injector } from '@angular/core';
|
||||||
|
import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router';
|
||||||
|
import { ACLGuard, ACLService } from '@delon/acl';
|
||||||
|
import { MenuService, SettingsService } from '@delon/theme';
|
||||||
|
import { EAUserService } from '@shared';
|
||||||
|
import { Observable, of } from 'rxjs';
|
||||||
|
import { switchMap } from 'rxjs/operators';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class AuthGuard extends ACLGuard {
|
||||||
|
constructor(
|
||||||
|
srv: ACLService,
|
||||||
|
public srv1: ACLService,
|
||||||
|
private menuService: MenuService,
|
||||||
|
private settings: SettingsService,
|
||||||
|
private userService: EAUserService,
|
||||||
|
router: Router,
|
||||||
|
private inject: Injector
|
||||||
|
) {
|
||||||
|
super(srv, router, inject);
|
||||||
|
}
|
||||||
|
|
||||||
|
canActivate(route: ActivatedRouteSnapshot, _state: RouterStateSnapshot): Observable<boolean> {
|
||||||
|
// if (Object.keys(route.params)?.length > 0 || !route.routeConfig?.path) {
|
||||||
|
// return super.canActivate(route, _state);
|
||||||
|
// } else {
|
||||||
|
// return super.canActivate(route, _state);
|
||||||
|
// }
|
||||||
|
return super.canActivate(route, _state);
|
||||||
|
}
|
||||||
|
|
||||||
|
canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
|
||||||
|
if (childRoute.routeConfig?.loadChildren || childRoute.routeConfig?.children) {
|
||||||
|
return super.canActivateChild(childRoute, state);
|
||||||
|
} else {
|
||||||
|
return this.handle(childRoute, state, 2, this.settingRoute(childRoute.params, state.url));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private handle(route: ActivatedRouteSnapshot, state: RouterStateSnapshot, type: 1 | 2, router?: string): Observable<boolean> {
|
||||||
|
if (!router) {
|
||||||
|
return type === 1 ? super.canActivate(route, state) : super.canActivateChild(route, state);
|
||||||
|
}
|
||||||
|
return this.userService
|
||||||
|
.request('/api/mdc/cuc/userAuthority/isUserAdmin', {
|
||||||
|
appUserId: this.settings.user.appUserId
|
||||||
|
})
|
||||||
|
.pipe(
|
||||||
|
switchMap(res => {
|
||||||
|
if (res) {
|
||||||
|
// 超级管理员赋值全量权限
|
||||||
|
this.srv1.setFull(true);
|
||||||
|
return of(true);
|
||||||
|
} else {
|
||||||
|
// 如果不是超级管理员 获取权限
|
||||||
|
return this.userService.request('/api/mdc/cuc/functionButton/getUserFunctionButton', { link: router });
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
switchMap(res => {
|
||||||
|
if (res?.abilities) {
|
||||||
|
this.srv1.setAbility(res.abilities || []);
|
||||||
|
// this.menuService.resume();
|
||||||
|
this.userService.loadUserMenus();
|
||||||
|
}
|
||||||
|
return type === 1 ? super.canActivate(route, state) : super.canActivateChild(route, state);
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据参数拼接原始路由
|
||||||
|
* @param params 参数
|
||||||
|
* @param route 实际路由
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
private settingRoute(params: any, route: string) {
|
||||||
|
let _route = route;
|
||||||
|
if (_route.indexOf('?') > -1) {
|
||||||
|
_route = route.split('?')[0];
|
||||||
|
}
|
||||||
|
for (const key of Object.keys(params)) {
|
||||||
|
if (_route.indexOf(params[key]) > -1) {
|
||||||
|
_route = _route.replace(params[key], ':' + key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return _route;
|
||||||
|
}
|
||||||
|
}
|
||||||
38
src/app/core/guards/token.guard.ts
Normal file
38
src/app/core/guards/token.guard.ts
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import { Inject, Injectable, Injector } from '@angular/core';
|
||||||
|
import { ActivatedRouteSnapshot, CanActivate, CanActivateChild, Router, RouterStateSnapshot } from '@angular/router';
|
||||||
|
import { sysConf } from '@conf/sys.conf';
|
||||||
|
import { CoreService } from '@core';
|
||||||
|
import { ACLGuard, ACLService } from '@delon/acl';
|
||||||
|
import { EAUserService } from '@shared';
|
||||||
|
import { Observable, of } from 'rxjs';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class EATokenGuard implements CanActivate, CanActivateChild {
|
||||||
|
constructor(srv: ACLService, router: Router, private eaUserSrv: CoreService, private router2: Router, private inject: Injector) {}
|
||||||
|
|
||||||
|
canActivate(route: ActivatedRouteSnapshot, _state: RouterStateSnapshot | null): Observable<boolean> {
|
||||||
|
const canOpen = this.eaUserSrv.loginStatus;
|
||||||
|
if (!canOpen) {
|
||||||
|
this.router2.navigate([sysConf.login_url], {
|
||||||
|
queryParams: {
|
||||||
|
returnUrl: _state?.url
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return of(!canOpen);
|
||||||
|
}
|
||||||
|
return of(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
|
||||||
|
const canOpen = this.eaUserSrv.loginStatus;
|
||||||
|
if (!canOpen) {
|
||||||
|
this.router2.navigate([sysConf.login_url], {
|
||||||
|
queryParams: {
|
||||||
|
returnUrl: state?.url
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return of(!canOpen);
|
||||||
|
}
|
||||||
|
return of(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,6 +1,9 @@
|
|||||||
export * from './module-import-guard';
|
export * from './module-import-guard';
|
||||||
export * from './net/default.interceptor';
|
export * from './net/default.interceptor';
|
||||||
|
export * from './net/business.interceptor';
|
||||||
|
|
||||||
// Services
|
// Services
|
||||||
export * from './core.service';
|
export * from './core.service';
|
||||||
export * from './startup/startup.service';
|
export * from './startup/startup.service';
|
||||||
|
|
||||||
|
export * from './guards/token.guard';
|
||||||
|
|||||||
108
src/app/core/net/business.interceptor.ts
Normal file
108
src/app/core/net/business.interceptor.ts
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
import {
|
||||||
|
HttpErrorResponse,
|
||||||
|
HttpEvent,
|
||||||
|
HttpHandler,
|
||||||
|
HttpInterceptor,
|
||||||
|
HttpRequest,
|
||||||
|
HttpResponse,
|
||||||
|
HttpResponseBase
|
||||||
|
} from '@angular/common/http';
|
||||||
|
import { Inject, Injectable, Optional } from '@angular/core';
|
||||||
|
import { DA_SERVICE_TOKEN, ITokenService } from '@delon/auth';
|
||||||
|
import { environment } from '@env/environment';
|
||||||
|
import { EAEnvironmentService, EAUserService } from '@shared';
|
||||||
|
import { Observable, of } from 'rxjs';
|
||||||
|
import { catchError, mergeMap } from 'rxjs/operators';
|
||||||
|
import { CoreService } from '../core.service';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class BusinessInterceptor implements HttpInterceptor {
|
||||||
|
constructor(
|
||||||
|
private envSrv: EAEnvironmentService,
|
||||||
|
private eaUserSrv: EAUserService,
|
||||||
|
@Optional()
|
||||||
|
@Inject(DA_SERVICE_TOKEN)
|
||||||
|
private tokenSrv: ITokenService,
|
||||||
|
private coreSrv: CoreService
|
||||||
|
) {}
|
||||||
|
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
|
||||||
|
// 构造新的请求URL
|
||||||
|
req = this.constructNewRequestUrl(req);
|
||||||
|
// 附加额外的请求头
|
||||||
|
req = this.attachAdditionalHeaders(req);
|
||||||
|
// 后续操作
|
||||||
|
return next.handle(req).pipe(
|
||||||
|
mergeMap(ev => this.handlingBussinessResponseData(ev)),
|
||||||
|
catchError((err: HttpErrorResponse) => this.handlingBusinessErrors(err))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造新的请求URL
|
||||||
|
*/
|
||||||
|
private constructNewRequestUrl(req: HttpRequest<any>): HttpRequest<any> {
|
||||||
|
let url = req.url;
|
||||||
|
if (!url.startsWith('https://') && !url.startsWith('http://')) {
|
||||||
|
if (!url.startsWith('assets')) {
|
||||||
|
url = environment.api.baseUrl + url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return req.clone({ url });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 附加额外的请求头
|
||||||
|
*/
|
||||||
|
private attachAdditionalHeaders(req: HttpRequest<any>): HttpRequest<any> {
|
||||||
|
let position = {};
|
||||||
|
if (this.coreSrv.position.lat && this.coreSrv.position.lng) {
|
||||||
|
position = { lat: this.coreSrv.position.lat.toString(), lng: this.coreSrv.position.lng.toString() };
|
||||||
|
}
|
||||||
|
// 附加环境变量
|
||||||
|
const header: any = {
|
||||||
|
appId: this.envSrv.env.appId,
|
||||||
|
tenantId: this.envSrv.env.tenantId,
|
||||||
|
enterpriseId: this.envSrv.env.enterpriseId,
|
||||||
|
...position
|
||||||
|
};
|
||||||
|
|
||||||
|
// 附加授权声明
|
||||||
|
const token = this.tokenSrv.get()?.token;
|
||||||
|
if (token) {
|
||||||
|
header.Authorization = `Bearer ${token}`;
|
||||||
|
}
|
||||||
|
return req.clone({ setHeaders: header });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理业务数据
|
||||||
|
*/
|
||||||
|
private handlingBussinessResponseData(ev: HttpEvent<any>): Observable<any> {
|
||||||
|
if (ev instanceof HttpResponseBase) {
|
||||||
|
const body = (ev as HttpResponse<any>).body;
|
||||||
|
if (body) {
|
||||||
|
switch (body.status) {
|
||||||
|
case 505001:
|
||||||
|
case 505002:
|
||||||
|
this.eaUserSrv.logout();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ev instanceof HttpErrorResponse) {
|
||||||
|
return this.handlingBusinessErrors(ev);
|
||||||
|
}
|
||||||
|
return of(ev);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理响应错误
|
||||||
|
*/
|
||||||
|
private handlingBusinessErrors(err: HttpErrorResponse): Observable<any> {
|
||||||
|
/** Http响应异常已在默认拦截器处理完成 ,该处不再处理 */
|
||||||
|
|
||||||
|
return of(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,20 +1,8 @@
|
|||||||
import {
|
import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponseBase } from '@angular/common/http';
|
||||||
HttpErrorResponse,
|
import { Injectable } from '@angular/core';
|
||||||
HttpEvent,
|
import { Observable, of } from 'rxjs';
|
||||||
HttpHandler,
|
import { catchError, mergeMap } from 'rxjs/operators';
|
||||||
HttpHeaders,
|
import { CoreService } from './../core.service';
|
||||||
HttpInterceptor,
|
|
||||||
HttpRequest,
|
|
||||||
HttpResponseBase
|
|
||||||
} from '@angular/common/http';
|
|
||||||
import { Injectable, Injector } from '@angular/core';
|
|
||||||
import { Router } from '@angular/router';
|
|
||||||
import { DA_SERVICE_TOKEN, ITokenService } from '@delon/auth';
|
|
||||||
import { _HttpClient } from '@delon/theme';
|
|
||||||
import { environment } from '@env/environment';
|
|
||||||
import { NzNotificationService } from 'ng-zorro-antd/notification';
|
|
||||||
import { BehaviorSubject, Observable, of, throwError } from 'rxjs';
|
|
||||||
import { catchError, filter, mergeMap, switchMap, take } from 'rxjs/operators';
|
|
||||||
|
|
||||||
const CODEMESSAGE: { [key: number]: string } = {
|
const CODEMESSAGE: { [key: number]: string } = {
|
||||||
200: '服务器成功返回请求的数据。',
|
200: '服务器成功返回请求的数据。',
|
||||||
@ -34,228 +22,38 @@ const CODEMESSAGE: { [key: number]: string } = {
|
|||||||
504: '网关超时。'
|
504: '网关超时。'
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* 默认HTTP拦截器,其注册细节见 `app.module.ts`
|
|
||||||
*/
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class DefaultInterceptor implements HttpInterceptor {
|
export class DefaultInterceptor implements HttpInterceptor {
|
||||||
private refreshTokenEnabled = environment.api.refreshTokenEnabled;
|
constructor(private coreSrv: CoreService) {}
|
||||||
private refreshTokenType: 're-request' | 'auth-refresh' = environment.api.refreshTokenType;
|
|
||||||
private refreshToking = false;
|
|
||||||
private refreshToken$: BehaviorSubject<any> = new BehaviorSubject<any>(null);
|
|
||||||
|
|
||||||
constructor(private injector: Injector) {
|
|
||||||
if (this.refreshTokenType === 'auth-refresh') {
|
|
||||||
this.buildAuthRefresh();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private get notification(): NzNotificationService {
|
|
||||||
return this.injector.get(NzNotificationService);
|
|
||||||
}
|
|
||||||
|
|
||||||
private get tokenSrv(): ITokenService {
|
|
||||||
return this.injector.get(DA_SERVICE_TOKEN);
|
|
||||||
}
|
|
||||||
|
|
||||||
private get http(): _HttpClient {
|
|
||||||
return this.injector.get(_HttpClient);
|
|
||||||
}
|
|
||||||
|
|
||||||
private goTo(url: string): void {
|
|
||||||
setTimeout(() => this.injector.get(Router).navigateByUrl(url));
|
|
||||||
}
|
|
||||||
|
|
||||||
private checkStatus(ev: HttpResponseBase): void {
|
|
||||||
if ((ev.status >= 200 && ev.status < 300) || ev.status === 401) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const errortext = CODEMESSAGE[ev.status] || ev.statusText;
|
|
||||||
this.notification.error(`请求错误 ${ev.status}: ${ev.url}`, errortext);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 刷新 Token 请求
|
|
||||||
*/
|
|
||||||
private refreshTokenRequest(): Observable<any> {
|
|
||||||
const model = this.tokenSrv.get();
|
|
||||||
return this.http.post(`/api/auth/refresh`, null, null, { headers: { refresh_token: model?.refresh_token || '' } });
|
|
||||||
}
|
|
||||||
|
|
||||||
// #region 刷新Token方式一:使用 401 重新刷新 Token
|
|
||||||
|
|
||||||
private tryRefreshToken(ev: HttpResponseBase, req: HttpRequest<any>, next: HttpHandler): Observable<any> {
|
|
||||||
// 1、若请求为刷新Token请求,表示来自刷新Token可以直接跳转登录页
|
|
||||||
if ([`/api/auth/refresh`].some(url => req.url.includes(url))) {
|
|
||||||
this.toLogin();
|
|
||||||
return throwError(ev);
|
|
||||||
}
|
|
||||||
// 2、如果 `refreshToking` 为 `true` 表示已经在请求刷新 Token 中,后续所有请求转入等待状态,直至结果返回后再重新发起请求
|
|
||||||
if (this.refreshToking) {
|
|
||||||
return this.refreshToken$.pipe(
|
|
||||||
filter(v => !!v),
|
|
||||||
take(1),
|
|
||||||
switchMap(() => next.handle(this.reAttachToken(req)))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// 3、尝试调用刷新 Token
|
|
||||||
this.refreshToking = true;
|
|
||||||
this.refreshToken$.next(null);
|
|
||||||
|
|
||||||
return this.refreshTokenRequest().pipe(
|
|
||||||
switchMap(res => {
|
|
||||||
// 通知后续请求继续执行
|
|
||||||
this.refreshToking = false;
|
|
||||||
this.refreshToken$.next(res);
|
|
||||||
// 重新保存新 token
|
|
||||||
this.tokenSrv.set(res);
|
|
||||||
// 重新发起请求
|
|
||||||
return next.handle(this.reAttachToken(req));
|
|
||||||
}),
|
|
||||||
catchError(err => {
|
|
||||||
this.refreshToking = false;
|
|
||||||
this.toLogin();
|
|
||||||
return throwError(err);
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 重新附加新 Token 信息
|
|
||||||
*
|
|
||||||
* > 由于已经发起的请求,不会再走一遍 `@delon/auth` 因此需要结合业务情况重新附加新的 Token
|
|
||||||
*/
|
|
||||||
private reAttachToken(req: HttpRequest<any>): HttpRequest<any> {
|
|
||||||
// 以下示例是以 NG-ALAIN 默认使用 `SimpleInterceptor`
|
|
||||||
const token = this.tokenSrv.get()?.token;
|
|
||||||
return req.clone({
|
|
||||||
setHeaders: {
|
|
||||||
token: `Bearer ${token}`
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// #endregion
|
|
||||||
|
|
||||||
// #region 刷新Token方式二:使用 `@delon/auth` 的 `refresh` 接口
|
|
||||||
|
|
||||||
private buildAuthRefresh(): void {
|
|
||||||
if (!this.refreshTokenEnabled) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.tokenSrv.refresh
|
|
||||||
.pipe(
|
|
||||||
filter(() => !this.refreshToking),
|
|
||||||
switchMap(res => {
|
|
||||||
console.log(res);
|
|
||||||
this.refreshToking = true;
|
|
||||||
return this.refreshTokenRequest();
|
|
||||||
})
|
|
||||||
)
|
|
||||||
.subscribe(
|
|
||||||
res => {
|
|
||||||
// TODO: Mock expired value
|
|
||||||
res.expired = +new Date() + 1000 * 60 * 5;
|
|
||||||
this.refreshToking = false;
|
|
||||||
this.tokenSrv.set(res);
|
|
||||||
},
|
|
||||||
() => this.toLogin()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// #endregion
|
|
||||||
|
|
||||||
private toLogin(): void {
|
|
||||||
this.notification.error(`未登录或登录已过期,请重新登录。`, ``);
|
|
||||||
this.goTo(this.tokenSrv.login_url!);
|
|
||||||
}
|
|
||||||
|
|
||||||
private handleData(ev: HttpResponseBase, req: HttpRequest<any>, next: HttpHandler): Observable<any> {
|
|
||||||
this.checkStatus(ev);
|
|
||||||
// 业务处理:一些通用操作
|
|
||||||
switch (ev.status) {
|
|
||||||
case 200:
|
|
||||||
// 业务层级错误处理,以下是假定restful有一套统一输出格式(指不管成功与否都有相应的数据格式)情况下进行处理
|
|
||||||
// 例如响应内容:
|
|
||||||
// 错误内容:{ status: 1, msg: '非法参数' }
|
|
||||||
// 正确内容:{ status: 0, response: { } }
|
|
||||||
// 则以下代码片断可直接适用
|
|
||||||
// if (ev instanceof HttpResponse) {
|
|
||||||
// const body = ev.body;
|
|
||||||
// if (body && body.status !== 0) {
|
|
||||||
// this.injector.get(NzMessageService).error(body.msg);
|
|
||||||
// // 注意:这里如果继续抛出错误会被行254的 catchError 二次拦截,导致外部实现的 Pipe、subscribe 操作被中断,例如:this.http.get('/').subscribe() 不会触发
|
|
||||||
// // 如果你希望外部实现,需要手动移除行254
|
|
||||||
// return throwError({});
|
|
||||||
// } else {
|
|
||||||
// // 忽略 Blob 文件体
|
|
||||||
// if (ev.body instanceof Blob) {
|
|
||||||
// return of(ev);
|
|
||||||
// }
|
|
||||||
// // 重新修改 `body` 内容为 `response` 内容,对于绝大多数场景已经无须再关心业务状态码
|
|
||||||
// return of(new HttpResponse(Object.assign(ev, { body: body.response })));
|
|
||||||
// // 或者依然保持完整的格式
|
|
||||||
// return of(ev);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
break;
|
|
||||||
case 401:
|
|
||||||
if (this.refreshTokenEnabled && this.refreshTokenType === 're-request') {
|
|
||||||
return this.tryRefreshToken(ev, req, next);
|
|
||||||
}
|
|
||||||
this.toLogin();
|
|
||||||
break;
|
|
||||||
case 403:
|
|
||||||
case 404:
|
|
||||||
case 500:
|
|
||||||
this.goTo(`/exception/${ev.status}`);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (ev instanceof HttpErrorResponse) {
|
|
||||||
console.warn(
|
|
||||||
'未可知错误,大部分是由于后端不支持跨域CORS或无效配置引起,请参考 https://ng-alain.com/docs/server 解决跨域问题',
|
|
||||||
ev
|
|
||||||
);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (ev instanceof HttpErrorResponse) {
|
|
||||||
return throwError(ev);
|
|
||||||
} else {
|
|
||||||
return of(ev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private getAdditionalHeaders(headers?: HttpHeaders): { [name: string]: string } {
|
|
||||||
const res: { [name: string]: string } = {};
|
|
||||||
// const lang = this.injector.get(ALAIN_I18N_TOKEN).currentLang;
|
|
||||||
// if (!headers?.has('Accept-Language') && lang) {
|
|
||||||
// res['Accept-Language'] = lang;
|
|
||||||
// }
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
|
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
|
||||||
// 统一加上服务端前缀
|
return next.handle(req).pipe(
|
||||||
let url = req.url;
|
mergeMap(ev => this.handlingHttpResponseData(ev)),
|
||||||
if (!url.startsWith('https://') && !url.startsWith('http://')) {
|
catchError((err: HttpErrorResponse) => this.handlingHttpErrorResponse(err))
|
||||||
const { baseUrl } = environment.api;
|
|
||||||
url = baseUrl + (baseUrl.endsWith('/') && url.startsWith('/') ? url.substring(1) : url);
|
|
||||||
}
|
|
||||||
|
|
||||||
const newReq = req.clone({ url, setHeaders: this.getAdditionalHeaders(req.headers) });
|
|
||||||
return next.handle(newReq).pipe(
|
|
||||||
mergeMap(ev => {
|
|
||||||
// 允许统一对请求错误处理
|
|
||||||
if (ev instanceof HttpResponseBase) {
|
|
||||||
return this.handleData(ev, newReq, next);
|
|
||||||
}
|
|
||||||
// 若一切都正常,则后续操作
|
|
||||||
return of(ev);
|
|
||||||
}),
|
|
||||||
catchError((err: HttpErrorResponse) => this.handleData(err, newReq, next))
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理Http响应数据
|
||||||
|
*/
|
||||||
|
private handlingHttpResponseData(ev: HttpEvent<any>): Observable<any> {
|
||||||
|
if (ev instanceof HttpResponseBase) {
|
||||||
|
// 正常情况直接返回到下个业务拦截器处理
|
||||||
|
if (ev.status >= 200 && ev.status < 300) {
|
||||||
|
return of(ev);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 所有状态不是2xx和3xx都当作异常处理
|
||||||
|
if (ev instanceof HttpErrorResponse) {
|
||||||
|
return this.handlingHttpErrorResponse(ev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return of(ev);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理默认Http响应错误
|
||||||
|
*/
|
||||||
|
private handlingHttpErrorResponse(err: HttpErrorResponse): Observable<any> {
|
||||||
|
return of(err);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,9 +1,16 @@
|
|||||||
import { HttpClient } from '@angular/common/http';
|
import { HttpClient } from '@angular/common/http';
|
||||||
import { Inject, Injectable } from '@angular/core';
|
import { Inject, Injectable } from '@angular/core';
|
||||||
|
import { cacheConf } from '@conf/cache.conf';
|
||||||
|
import { sysConf } from '@conf/sys.conf';
|
||||||
import { ACLService } from '@delon/acl';
|
import { ACLService } from '@delon/acl';
|
||||||
import { MenuService, SettingsService, TitleService, _HttpClient } from '@delon/theme';
|
import { MenuService, SettingsService, TitleService, _HttpClient } from '@delon/theme';
|
||||||
|
import { AlainConfigService } from '@delon/util';
|
||||||
|
import { environment } from '@env/environment';
|
||||||
|
import { AmapService, EACacheService, EAUserService } from '@shared';
|
||||||
import { NzSafeAny } from 'ng-zorro-antd/core/types';
|
import { NzSafeAny } from 'ng-zorro-antd/core/types';
|
||||||
import { NzIconService } from 'ng-zorro-antd/icon';
|
import { NzIconService } from 'ng-zorro-antd/icon';
|
||||||
|
import { NzImageService } from 'ng-zorro-antd/image';
|
||||||
|
import { NzUploadFile } from 'ng-zorro-antd/upload';
|
||||||
import { Observable, zip } from 'rxjs';
|
import { Observable, zip } from 'rxjs';
|
||||||
import { catchError, map } from 'rxjs/operators';
|
import { catchError, map } from 'rxjs/operators';
|
||||||
|
|
||||||
@ -24,15 +31,37 @@ export class StartupService {
|
|||||||
private aclService: ACLService,
|
private aclService: ACLService,
|
||||||
private titleService: TitleService,
|
private titleService: TitleService,
|
||||||
private httpClient: _HttpClient,
|
private httpClient: _HttpClient,
|
||||||
private coreSrv: CoreService
|
private userSrv: EAUserService,
|
||||||
|
private amapService: AmapService,
|
||||||
|
public cacheSrv: EACacheService,
|
||||||
|
private coreSrv: CoreService,
|
||||||
|
private nzImageService: NzImageService,
|
||||||
|
private alainConfigService: AlainConfigService
|
||||||
) {
|
) {
|
||||||
iconSrv.addIcon(...ICONS_AUTO, ...ICONS);
|
iconSrv.addIcon(...ICONS_AUTO, ...ICONS);
|
||||||
|
this.settingService.setLayout('fixSiderbar', true);
|
||||||
|
// 全局修改sf图片预览方式
|
||||||
|
alainConfigService.set('sf', {
|
||||||
|
ui: {
|
||||||
|
preview: (file: NzUploadFile) => {
|
||||||
|
if (file.url) {
|
||||||
|
this.nzImageService.preview([{ src: file.url }]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: 退出登录时需要清理用户信息
|
// TODO: 退出登录时需要清理用户信息
|
||||||
|
|
||||||
load(): Promise<void> {
|
load(): Promise<void> {
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
|
this.amapService.getCurrentPosition().subscribe(res => {
|
||||||
|
if (res.position) {
|
||||||
|
this.coreSrv.position = { lat: res.position.lat, lng: res.position.lng };
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
let data;
|
let data;
|
||||||
if (this.coreSrv.loginStatus) {
|
if (this.coreSrv.loginStatus) {
|
||||||
// 本地菜单
|
// 本地菜单
|
||||||
@ -74,10 +103,17 @@ export class StartupService {
|
|||||||
this.settingService.setApp(appData);
|
this.settingService.setApp(appData);
|
||||||
// 用户信息:包括姓名、头像、邮箱地址
|
// 用户信息:包括姓名、头像、邮箱地址
|
||||||
this.settingService.setUser(userData);
|
this.settingService.setUser(userData);
|
||||||
|
this.cacheSrv.set(cacheConf.env, {
|
||||||
|
appId: sysConf.appId,
|
||||||
|
tenantId: userData?.tenantId || sysConf.tenantId,
|
||||||
|
enterpriseId: userData?.enterpriseId || sysConf.enterpriseId
|
||||||
|
});
|
||||||
// ACL:设置权限为全量
|
// ACL:设置权限为全量
|
||||||
this.aclService.setFull(true);
|
this.aclService.setFull(false);
|
||||||
// 初始化菜单
|
// 初始化菜单
|
||||||
this.menuService.add(menuData);
|
if (menuData) {
|
||||||
|
this.menuService.add(menuData);
|
||||||
|
}
|
||||||
// 设置页面标题的后缀
|
// 设置页面标题的后缀
|
||||||
this.titleService.default = '';
|
this.titleService.default = '';
|
||||||
this.titleService.suffix = appData.name;
|
this.titleService.suffix = appData.name;
|
||||||
@ -94,12 +130,10 @@ export class StartupService {
|
|||||||
const appData = this.httpClient.get(`assets/mocks/app-data.json`).pipe(map((res: any) => res.app));
|
const appData = this.httpClient.get(`assets/mocks/app-data.json`).pipe(map((res: any) => res.app));
|
||||||
|
|
||||||
// 用户数据
|
// 用户数据
|
||||||
const userData = this.coreSrv.loginStatus
|
const userData = this.httpClient.get('assets/mocks/user-data.json').pipe(map((res: any) => res.user));
|
||||||
? this.httpClient.post(this.coreSrv.$api_get_current_user_info, {}).pipe(map((res: any) => res.data))
|
|
||||||
: this.httpClient.get('assets/mocks/user-data.json').pipe(map((res: any) => res.user));
|
|
||||||
|
|
||||||
// 菜单数据
|
// 菜单数据
|
||||||
const menuData = this.httpClient.get('assets/mocks/menu-data.json').pipe(map((res: any) => res.menu));
|
const menuData = this.httpClient.get('assets/mocks/menu-data.json').pipe(map((res: any) => res.data.menu));
|
||||||
|
|
||||||
return zip(appData, userData, menuData);
|
return zip(appData, userData, menuData);
|
||||||
}
|
}
|
||||||
@ -115,9 +149,7 @@ export class StartupService {
|
|||||||
const appData = this.httpClient.get(`assets/mocks/app-data.json`).pipe(map((res: any) => res.app));
|
const appData = this.httpClient.get(`assets/mocks/app-data.json`).pipe(map((res: any) => res.app));
|
||||||
|
|
||||||
// 用户数据
|
// 用户数据
|
||||||
const userData = this.coreSrv.loginStatus
|
const userData = this.httpClient.post(this.userSrv.$api_get_user_by_token, {}).pipe(map((res: any) => res.data));
|
||||||
? this.httpClient.post(this.coreSrv.$api_get_current_user_info, {}).pipe(map((res: any) => res.data))
|
|
||||||
: this.httpClient.get('assets/mocks/user-data.json').pipe(map((res: any) => res.user));
|
|
||||||
|
|
||||||
// 菜单数据
|
// 菜单数据
|
||||||
const menuData = this.httpClient
|
const menuData = this.httpClient
|
||||||
@ -125,6 +157,7 @@ export class StartupService {
|
|||||||
appId: this.coreSrv.envSrv.getEnvironment().appId
|
appId: this.coreSrv.envSrv.getEnvironment().appId
|
||||||
})
|
})
|
||||||
.pipe(map((res: any) => res.data));
|
.pipe(map((res: any) => res.data));
|
||||||
|
// const menuData = this.httpClient.get('assets/mocks/menu-data.json').pipe(map((res: any) => res.data.menu));
|
||||||
|
|
||||||
return zip(appData, userData, menuData);
|
return zip(appData, userData, menuData);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,9 +11,23 @@ import { environment } from '@env/environment';
|
|||||||
// #region NG-ALAIN Config
|
// #region NG-ALAIN Config
|
||||||
|
|
||||||
const alainConfig: AlainConfig = {
|
const alainConfig: AlainConfig = {
|
||||||
st: { modal: { size: 'lg' } },
|
st: {
|
||||||
|
req: { method: 'POST', allInBody: true, reName: { pi: 'pageIndex', ps: 'pageSize' } },
|
||||||
|
res: { reName: { list: 'data.records', total: 'data.total' } },
|
||||||
|
page: { show: true, showSize: true, pageSizes: [10, 20, 30, 50, 100, 200, 300, 500, 1000], toTop: false },
|
||||||
|
modal: { size: 'lg' }
|
||||||
|
},
|
||||||
|
sf: { button: { search: '查询' } },
|
||||||
pageHeader: { homeI18n: 'home', recursiveBreadcrumb: true },
|
pageHeader: { homeI18n: 'home', recursiveBreadcrumb: true },
|
||||||
auth: { login_url: '/passport/login' }
|
auth: { login_url: '/passport/login' },
|
||||||
|
acl: { guard_url: '/exception/403' },
|
||||||
|
chart: {
|
||||||
|
// 以下是默认配置,如果项目无法外网访问,可以根据 `angular.json` 配置将依赖包直接使用 `./assets***` 路径
|
||||||
|
libs: [
|
||||||
|
'https://gw.alipayobjects.com/os/lib/antv/g2/4.1.4/dist/g2.min.js',
|
||||||
|
'https://gw.alipayobjects.com/os/lib/antv/data-set/0.11.7/dist/data-set.js'
|
||||||
|
]
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const alainModules = [AlainThemeModule.forRoot(), DelonACLModule.forRoot()];
|
const alainModules = [AlainThemeModule.forRoot(), DelonACLModule.forRoot()];
|
||||||
@ -21,12 +35,12 @@ const alainProvides = [{ provide: ALAIN_CONFIG, useValue: alainConfig }];
|
|||||||
|
|
||||||
// #region reuse-tab
|
// #region reuse-tab
|
||||||
|
|
||||||
import { RouteReuseStrategy } from '@angular/router';
|
// import { RouteReuseStrategy } from '@angular/router';
|
||||||
alainProvides.push({
|
// alainProvides.push({
|
||||||
provide: RouteReuseStrategy,
|
// provide: RouteReuseStrategy,
|
||||||
useClass: ReuseTabStrategy,
|
// useClass: ReuseTabStrategy,
|
||||||
deps: [ReuseTabService]
|
// deps: [ReuseTabService]
|
||||||
} as any);
|
// } as any);
|
||||||
|
|
||||||
// #endregion
|
// #endregion
|
||||||
|
|
||||||
@ -51,9 +65,9 @@ export class GlobalConfigModule {
|
|||||||
throwIfAlreadyLoaded(parentModule, 'GlobalConfigModule');
|
throwIfAlreadyLoaded(parentModule, 'GlobalConfigModule');
|
||||||
// NOTICE: Only valid for menus with reuse property
|
// NOTICE: Only valid for menus with reuse property
|
||||||
// Pls refer to the E-Mail demo effect
|
// Pls refer to the E-Mail demo effect
|
||||||
reuseTabService.mode = ReuseTabMatchMode.MenuForce;
|
// reuseTabService.mode = ReuseTabMatchMode.MenuForce;
|
||||||
// Shouled be trigger init, you can ingore when used `reuse-tab` component in layout component
|
// Shouled be trigger init, you can ingore when used `reuse-tab` component in layout component
|
||||||
reuseTabService.init();
|
// reuseTabService.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
static forRoot(): ModuleWithProviders<GlobalConfigModule> {
|
static forRoot(): ModuleWithProviders<GlobalConfigModule> {
|
||||||
|
|||||||
@ -24,7 +24,7 @@ import { NzSpinModule } from 'ng-zorro-antd/spin';
|
|||||||
import { NzSwitchModule } from 'ng-zorro-antd/switch';
|
import { NzSwitchModule } from 'ng-zorro-antd/switch';
|
||||||
import { NzTimelineModule } from 'ng-zorro-antd/timeline';
|
import { NzTimelineModule } from 'ng-zorro-antd/timeline';
|
||||||
import { NzToolTipModule } from 'ng-zorro-antd/tooltip';
|
import { NzToolTipModule } from 'ng-zorro-antd/tooltip';
|
||||||
|
import { NzGridModule } from 'ng-zorro-antd/grid';
|
||||||
import { LayoutPassportComponent } from './passport/passport.component';
|
import { LayoutPassportComponent } from './passport/passport.component';
|
||||||
import { PRO_COMPONENTS } from './pro/index';
|
import { PRO_COMPONENTS } from './pro/index';
|
||||||
|
|
||||||
@ -56,6 +56,7 @@ const COMPONENTS: Array<Type<any>> = [...PRO_COMPONENTS, LayoutPassportComponent
|
|||||||
NoticeIconModule,
|
NoticeIconModule,
|
||||||
ThemeBtnModule,
|
ThemeBtnModule,
|
||||||
ScrollbarModule,
|
ScrollbarModule,
|
||||||
|
NzGridModule,
|
||||||
NzMessageModule
|
NzMessageModule
|
||||||
],
|
],
|
||||||
declarations: COMPONENTS,
|
declarations: COMPONENTS,
|
||||||
|
|||||||
@ -1,13 +1,15 @@
|
|||||||
<div class="container">
|
<nz-layout class="layout">
|
||||||
<!-- <pro-langs class="langs" btnClass></pro-langs> -->
|
<nz-header>
|
||||||
<div class="wrap">
|
<div nz-row>
|
||||||
<div class="top">
|
<div nz-col nzSpan="24" style="display: flex;align-items: center;">
|
||||||
<div class="head">
|
<img width="32" height="32" src="./assets/images/user/logo.svg" [routerLink]="['/']" />
|
||||||
<img class="logo" src="./assets/logo-color.svg">
|
<label class="title ml-sm">运多星网络货运管理平台</label>
|
||||||
<span class="title">ng-alain pro</span>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="desc">武林中最有影响力的《葵花宝典》;欲练神功,挥刀自宫</div>
|
|
||||||
</div>
|
</div>
|
||||||
<router-outlet></router-outlet>
|
</nz-header>
|
||||||
</div>
|
<nz-content class="content">
|
||||||
</div>
|
<div class="inner-content">
|
||||||
|
<router-outlet></router-outlet>
|
||||||
|
</div>
|
||||||
|
</nz-content>
|
||||||
|
</nz-layout>
|
||||||
@ -1,74 +1,22 @@
|
|||||||
@import '~@delon/theme/index';
|
@import '~@delon/theme/index';
|
||||||
|
|
||||||
:host {
|
:host {
|
||||||
::ng-deep {
|
::ng-deep {
|
||||||
.container {
|
.layout {
|
||||||
display: flex;
|
height: 100%;
|
||||||
flex-direction: column;
|
|
||||||
min-height: 100%;
|
|
||||||
background: #f0f2f5;
|
|
||||||
}
|
|
||||||
.langs {
|
|
||||||
width: 100%;
|
|
||||||
height: 40px;
|
|
||||||
line-height: 44px;
|
|
||||||
text-align: right;
|
|
||||||
.ant-dropdown-trigger {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
.anticon {
|
|
||||||
margin-top: 24px;
|
|
||||||
margin-right: 24px;
|
|
||||||
font-size: 14px;
|
|
||||||
vertical-align: top;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.wrap {
|
|
||||||
flex: 1;
|
|
||||||
padding: 32px 0;
|
|
||||||
}
|
|
||||||
.ant-form-item {
|
|
||||||
margin-bottom: 24px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (min-width: @screen-md-min) {
|
.ant-layout-header {
|
||||||
.container {
|
background: #ffffff;
|
||||||
background-image: url('https://gw.alipayobjects.com/zos/rmsportal/TVYTbAXWheQpRcWDaDMu.svg');
|
box-shadow: 0px 5px 5px #d1d1d1;
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-position: center 110px;
|
|
||||||
background-size: 100%;
|
|
||||||
}
|
|
||||||
.wrap {
|
|
||||||
padding: 32px 0 24px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.top {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.header {
|
|
||||||
height: 44px;
|
|
||||||
line-height: 44px;
|
|
||||||
a {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.logo {
|
|
||||||
height: 44px;
|
|
||||||
margin-right: 16px;
|
|
||||||
}
|
|
||||||
.title {
|
|
||||||
position: relative;
|
|
||||||
color: @heading-color;
|
|
||||||
font-weight: 600;
|
|
||||||
font-size: 33px;
|
|
||||||
font-family: 'Myriad Pro', 'Helvetica Neue', Arial, Helvetica, sans-serif;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.desc {
|
|
||||||
margin-top: 12px;
|
|
||||||
margin-bottom: 40px;
|
|
||||||
color: @text-color-secondary;
|
|
||||||
font-size: @font-size-base;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size : 18px;
|
||||||
|
font-weight: 600;
|
||||||
|
color : #26282A;
|
||||||
|
}
|
||||||
@ -7,24 +7,9 @@ import { DA_SERVICE_TOKEN, ITokenService } from '@delon/auth';
|
|||||||
styleUrls: ['./passport.component.less']
|
styleUrls: ['./passport.component.less']
|
||||||
})
|
})
|
||||||
export class LayoutPassportComponent implements OnInit {
|
export class LayoutPassportComponent implements OnInit {
|
||||||
links = [
|
constructor() {}
|
||||||
{
|
|
||||||
title: '帮助',
|
|
||||||
href: ''
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '隐私',
|
|
||||||
href: ''
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '条款',
|
|
||||||
href: ''
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
constructor(@Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService) {}
|
|
||||||
|
|
||||||
ngOnInit(): void {
|
ngOnInit(): void {
|
||||||
this.tokenService.clear();
|
// this.tokenService.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
<div *ngIf="pro.isTopMenu" class="alain-pro__top-nav">
|
<div *ngIf="pro.isTopMenu" class="alain-pro__top-nav">
|
||||||
<div class="alain-pro__top-nav-main" [ngClass]="{ 'alain-pro__top-nav-main-wide': pro.isFixed }">
|
<div class="alain-pro__top-nav-main" [ngClass]="{ 'alain-pro__top-nav-main-wide': pro.isFixed }">
|
||||||
<div class="alain-pro__top-nav-main-left">
|
<div class="alain-pro__top-nav-main-left">
|
||||||
<layout-pro-logo class="alain-pro__top-nav-logo"></layout-pro-logo>
|
<layout-pro-logo class="alain-pro__top-nav-logo" style="width: 195px;"></layout-pro-logo>
|
||||||
<div class="alain-pro__menu-wrap">
|
<div class="alain-pro__menu-wrap">
|
||||||
<div layout-pro-menu mode="horizontal"></div>
|
<div layout-pro-menu mode="horizontal"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
<a [routerLink]="['/']" class="d-flex align-items-center">
|
<a [routerLink]="['/']" class="d-flex align-items-center">
|
||||||
<img src="./assets/logo-color.svg" alt="{{ name }}" height="32" />
|
<img src="./assets/images/user/logo.png" alt="{{ name }}" height="32" />
|
||||||
<h1>{{ name }}</h1>
|
<h1>{{ name }}</h1>
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
<ng-template #icon let-i>
|
<ng-template #icon let-i>
|
||||||
<ng-container *ngIf="i" [ngSwitch]="i.type">
|
<ng-container *ngIf="i" [ngSwitch]="i.type">
|
||||||
<i *ngSwitchCase="'icon'" nz-icon [nzType]="i.value" class="alain-pro__menu-icon"></i>
|
<i *ngSwitchCase="'icon'" nz-icon [nzType]="i.value" class="alain-pro__menu-icon"></i>
|
||||||
<i *ngSwitchCase="'iconfont'" nz-icon [nzIconfont]="i.iconfont" class="alain-pro__menu-icon"></i>
|
<i *ngSwitchCase="'iconfont'" nz-icon [nzIconfont]="i.iconfont" class="alain-pro__menu-icon icon"></i>
|
||||||
<img *ngSwitchCase="'img'" src="{{ i.value }}" class="anticon alain-pro__menu-icon alain-pro__menu-img" />
|
<img *ngSwitchCase="'img'" src="{{ i.value }}" class="anticon alain-pro__menu-icon alain-pro__menu-img" />
|
||||||
<i *ngSwitchDefault class="anticon alain-pro__menu-icon {{ i.value }}"></i>
|
<i *ngSwitchDefault class="icon alain-pro__menu-icon {{ i.value }}"></i>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
<ng-template #mainLink let-i>
|
<ng-template #mainLink let-i>
|
||||||
@ -17,39 +17,22 @@
|
|||||||
<a *ngIf="!i.externalLink" [routerLink]="i.link" [target]="i.target">{{ i.text }} </a>
|
<a *ngIf="!i.externalLink" [routerLink]="i.link" [target]="i.target">{{ i.text }} </a>
|
||||||
<a *ngIf="i.externalLink" [attr.href]="i.externalLink" [attr.target]="i.target">{{ i.text }} </a>
|
<a *ngIf="i.externalLink" [attr.href]="i.externalLink" [attr.target]="i.target">{{ i.text }} </a>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
<ul *ngIf="menus" nz-menu [nzMode]="mode" [nzTheme]="pro.theme" [nzInlineCollapsed]="pro.isMobile ? false : pro.collapsed">
|
<ul *ngIf="menus" nz-menu [nzMode]="mode" [nzTheme]="pro.theme"
|
||||||
|
[nzInlineCollapsed]="pro.isMobile ? false : pro.collapsed">
|
||||||
<ng-container *ngFor="let l1 of menus">
|
<ng-container *ngFor="let l1 of menus">
|
||||||
<li
|
<li *ngIf="l1.children!.length === 0" nz-menu-item class="alain-pro__menu-item"
|
||||||
*ngIf="l1.children!.length === 0"
|
[class.alain-pro__menu-item--disabled]="l1.disabled" [nzSelected]="l1._selected" [nzDisabled]="l1.disabled">
|
||||||
nz-menu-item
|
|
||||||
class="alain-pro__menu-item"
|
|
||||||
[class.alain-pro__menu-item--disabled]="l1.disabled"
|
|
||||||
[nzSelected]="l1._selected"
|
|
||||||
[nzDisabled]="l1.disabled"
|
|
||||||
>
|
|
||||||
<a *ngIf="!l1.externalLink" [routerLink]="l1.link" (click)="closeCollapsed()" class="alain-pro__menu-title">
|
<a *ngIf="!l1.externalLink" [routerLink]="l1.link" (click)="closeCollapsed()" class="alain-pro__menu-title">
|
||||||
<ng-template [ngTemplateOutlet]="mainLink" [ngTemplateOutletContext]="{ $implicit: l1 }"></ng-template>
|
<ng-template [ngTemplateOutlet]="mainLink" [ngTemplateOutletContext]="{ $implicit: l1 }"></ng-template>
|
||||||
</a>
|
</a>
|
||||||
<a
|
<a *ngIf="l1.externalLink" [attr.href]="l1.externalLink" [attr.target]="l1.target" (click)="closeCollapsed()"
|
||||||
*ngIf="l1.externalLink"
|
class="alain-pro__menu-title">
|
||||||
[attr.href]="l1.externalLink"
|
|
||||||
[attr.target]="l1.target"
|
|
||||||
(click)="closeCollapsed()"
|
|
||||||
class="alain-pro__menu-title"
|
|
||||||
>
|
|
||||||
<ng-template [ngTemplateOutlet]="mainLink" [ngTemplateOutletContext]="{ $implicit: l1 }"></ng-template>
|
<ng-template [ngTemplateOutlet]="mainLink" [ngTemplateOutletContext]="{ $implicit: l1 }"></ng-template>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li
|
<li *ngIf="l1.children!.length > 0" nz-submenu [nzTitle]="l1TitleTpl" class="alain-pro__menu-item"
|
||||||
*ngIf="l1.children!.length > 0"
|
[class.text-white]="pro.theme === 'dark' && l1._selected" [nzOpen]="l1._open" [nzDisabled]="l1.disabled"
|
||||||
nz-submenu
|
(nzOpenChange)="openChange(l1, $event)">
|
||||||
[nzTitle]="l1TitleTpl"
|
|
||||||
class="alain-pro__menu-item"
|
|
||||||
[class.text-white]="pro.theme === 'dark' && l1._selected"
|
|
||||||
[nzOpen]="l1._open"
|
|
||||||
[nzDisabled]="l1.disabled"
|
|
||||||
(nzOpenChange)="openChange(l1, $event)"
|
|
||||||
>
|
|
||||||
<ng-template #l1TitleTpl>
|
<ng-template #l1TitleTpl>
|
||||||
<span title class="alain-pro__menu-title">
|
<span title class="alain-pro__menu-title">
|
||||||
<ng-template [ngTemplateOutlet]="icon" [ngTemplateOutletContext]="{ $implicit: l1.icon }"></ng-template>
|
<ng-template [ngTemplateOutlet]="icon" [ngTemplateOutletContext]="{ $implicit: l1.icon }"></ng-template>
|
||||||
@ -61,34 +44,17 @@
|
|||||||
</ng-template>
|
</ng-template>
|
||||||
<ul>
|
<ul>
|
||||||
<ng-container *ngFor="let l2 of l1.children">
|
<ng-container *ngFor="let l2 of l1.children">
|
||||||
<li
|
<li *ngIf="!l2._hidden && l2.children!.length === 0" nz-menu-item
|
||||||
*ngIf="!l2._hidden && l2.children!.length === 0"
|
[class.alain-pro__menu-item--disabled]="l2.disabled" [nzSelected]="l2._selected" [nzDisabled]="l2.disabled"
|
||||||
nz-menu-item
|
(click)="closeCollapsed()">
|
||||||
[class.alain-pro__menu-item--disabled]="l2.disabled"
|
|
||||||
[nzSelected]="l2._selected"
|
|
||||||
[nzDisabled]="l2.disabled"
|
|
||||||
(click)="closeCollapsed()"
|
|
||||||
>
|
|
||||||
<ng-template [ngTemplateOutlet]="subLink" [ngTemplateOutletContext]="{ $implicit: l2 }"></ng-template>
|
<ng-template [ngTemplateOutlet]="subLink" [ngTemplateOutletContext]="{ $implicit: l2 }"></ng-template>
|
||||||
</li>
|
</li>
|
||||||
<li
|
<li *ngIf="!l2._hidden && l2.children!.length > 0" nz-submenu [nzTitle]="l2.text!" [nzOpen]="l2._open"
|
||||||
*ngIf="!l2._hidden && l2.children!.length > 0"
|
[nzDisabled]="l2.disabled" (nzOpenChange)="openChange(l2, $event)">
|
||||||
nz-submenu
|
|
||||||
[nzTitle]="l2.text!"
|
|
||||||
[nzOpen]="l2._open"
|
|
||||||
[nzDisabled]="l2.disabled"
|
|
||||||
(nzOpenChange)="openChange(l2, $event)"
|
|
||||||
>
|
|
||||||
<ul>
|
<ul>
|
||||||
<ng-container *ngFor="let l3 of l2.children">
|
<ng-container *ngFor="let l3 of l2.children">
|
||||||
<li
|
<li *ngIf="!l3._hidden" nz-menu-item [class.alain-pro__menu-item--disabled]="l3.disabled"
|
||||||
*ngIf="!l3._hidden"
|
[nzSelected]="l3._selected" [nzDisabled]="l3.disabled" (click)="closeCollapsed()">
|
||||||
nz-menu-item
|
|
||||||
[class.alain-pro__menu-item--disabled]="l3.disabled"
|
|
||||||
[nzSelected]="l3._selected"
|
|
||||||
[nzDisabled]="l3.disabled"
|
|
||||||
(click)="closeCollapsed()"
|
|
||||||
>
|
|
||||||
<ng-template [ngTemplateOutlet]="subLink" [ngTemplateOutletContext]="{ $implicit: l3 }"></ng-template>
|
<ng-template [ngTemplateOutlet]="subLink" [ngTemplateOutletContext]="{ $implicit: l3 }"></ng-template>
|
||||||
</li>
|
</li>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
@ -98,4 +64,4 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</ul>
|
</ul>
|
||||||
@ -51,7 +51,6 @@ export class LayoutProMenuComponent implements OnInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.menus = res;
|
this.menus = res;
|
||||||
|
|
||||||
this.openStatus();
|
this.openStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,10 +1,4 @@
|
|||||||
<notice-icon
|
<notice-icon btnClass="alain-pro__header-item" btnIconClass="alain-pro__header-item-icon" [data]="data" [count]="count"
|
||||||
btnClass="alain-pro__header-item"
|
[loading]="loading" (select)="select($event)" (clear)="clear($event)" (popoverVisibleChange)="loadData()">
|
||||||
btnIconClass="alain-pro__header-item-icon"
|
</notice-icon>
|
||||||
[data]="data"
|
|
||||||
[count]="count"
|
|
||||||
[loading]="loading"
|
|
||||||
(select)="select($event)"
|
|
||||||
(clear)="clear($event)"
|
|
||||||
(popoverVisibleChange)="loadData()"
|
|
||||||
></notice-icon>
|
|
||||||
|
|||||||
@ -1,21 +1,21 @@
|
|||||||
<div nz-dropdown [nzDropdownMenu]="userMenu" nzPlacement="bottomRight" class="alain-pro__header-item">
|
<div nz-dropdown [nzDropdownMenu]="userMenu" nzPlacement="bottomRight" class="alain-pro__header-item">
|
||||||
<nz-avatar [nzSrc]="settings.user.avatar" nzSize="small" class="mr-sm"></nz-avatar>
|
<nz-avatar [nzSrc]="settings.user?.avatar" nzSize="small" class="mr-sm"></nz-avatar>
|
||||||
{{ settings.user.name }}
|
{{ settings.user?.realName }}
|
||||||
</div>
|
</div>
|
||||||
<nz-dropdown-menu #userMenu="nzDropdownMenu">
|
<nz-dropdown-menu #userMenu="nzDropdownMenu">
|
||||||
<div nz-menu class="width-sm">
|
<div nz-menu class="width-sm">
|
||||||
<div nz-menu-item routerLink="/pro/account/center">
|
<div nz-menu-item routerLink="/account/center">
|
||||||
<i nz-icon nzType="user" class="mr-sm"></i>
|
<i nz-icon nzType="user" class="mr-sm"></i>
|
||||||
个人中心
|
个人中心
|
||||||
</div>
|
</div>
|
||||||
<div nz-menu-item routerLink="/pro/account/settings">
|
<!-- <div nz-menu-item routerLink="/pro/account/settings">
|
||||||
<i nz-icon nzType="setting" class="mr-sm"></i>
|
<i nz-icon nzType="setting" class="mr-sm"></i>
|
||||||
个人设置
|
个人设置
|
||||||
</div>
|
</div>
|
||||||
<div nz-menu-item routerLink="/exception/trigger">
|
<div nz-menu-item routerLink="/exception/trigger">
|
||||||
<i nz-icon nzType="close-circle" class="mr-sm"></i>
|
<i nz-icon nzType="close-circle" class="mr-sm"></i>
|
||||||
触发错误
|
触发错误
|
||||||
</div>
|
</div> -->
|
||||||
<li nz-menu-divider></li>
|
<li nz-menu-divider></li>
|
||||||
<div nz-menu-item (click)="logout()">
|
<div nz-menu-item (click)="logout()">
|
||||||
<i nz-icon nzType="logout" class="mr-sm"></i>
|
<i nz-icon nzType="logout" class="mr-sm"></i>
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
<span class="mr-md">客服电话:0755-88393483</span>
|
||||||
<!--Search-->
|
<!--Search-->
|
||||||
<layout-pro-search class="hidden-xs"></layout-pro-search>
|
<layout-pro-search class="hidden-xs"></layout-pro-search>
|
||||||
<!--Link-->
|
<!--Link-->
|
||||||
@ -9,6 +10,10 @@
|
|||||||
<!-- <quick-chat-status class="hidden-xs"></quick-chat-status> -->
|
<!-- <quick-chat-status class="hidden-xs"></quick-chat-status> -->
|
||||||
<!--Notify-->
|
<!--Notify-->
|
||||||
<layout-pro-notify class="hidden-xs"></layout-pro-notify>
|
<layout-pro-notify class="hidden-xs"></layout-pro-notify>
|
||||||
|
<a nz-tooltip nzTooltipTitle="下载中心" nzTooltipPlacement="bottom" class="hidden-xs" target="_blank" href="/#/download"
|
||||||
|
rel="noopener noreferrer" class="alain-pro__header-item">
|
||||||
|
<i nz-icon nzType="cloud-download" nzTheme="outline" style="font-size: 18px;" ></i>
|
||||||
|
</a>
|
||||||
<!--RTL-->
|
<!--RTL-->
|
||||||
<!-- <layout-pro-rtl></layout-pro-rtl> -->
|
<!-- <layout-pro-rtl></layout-pro-rtl> -->
|
||||||
<!--User-->
|
<!--User-->
|
||||||
|
|||||||
@ -23,7 +23,7 @@ export class BrandService {
|
|||||||
* @alain-pro-sider-menu-width: 256px;
|
* @alain-pro-sider-menu-width: 256px;
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
readonly width = 256;
|
readonly width = 205;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specify width of the sidebar after collapsed, If you change it, muse be synchronize change less parameter:
|
* Specify width of the sidebar after collapsed, If you change it, muse be synchronize change less parameter:
|
||||||
|
|||||||
@ -29,7 +29,7 @@
|
|||||||
@alain-pro-light-color: #fff;
|
@alain-pro-light-color: #fff;
|
||||||
@alain-pro-light-slider-shadow: 2px 0 8px 0 rgba(29, 35, 41, 0.05);
|
@alain-pro-light-slider-shadow: 2px 0 8px 0 rgba(29, 35, 41, 0.05);
|
||||||
|
|
||||||
@alain-pro-logo-font-size: 20px;
|
@alain-pro-logo-font-size: 17px;
|
||||||
@alain-pro-logo-font-family: 'Myriad Pro', 'Helvetica Neue', Arial, Helvetica, sans-serif;
|
@alain-pro-logo-font-family: 'Myriad Pro', 'Helvetica Neue', Arial, Helvetica, sans-serif;
|
||||||
|
|
||||||
@alain-pro-content-margin: 24px;
|
@alain-pro-content-margin: 24px;
|
||||||
|
|||||||
31
src/app/routes/account/account-routing.module.ts
Normal file
31
src/app/routes/account/account-routing.module.ts
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-05 20:15:41
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-01-18 17:14:30
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\account\\account-routing.module.ts
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { NgModule } from '@angular/core';
|
||||||
|
import { RouterModule, Routes } from '@angular/router';
|
||||||
|
import { AccountComponentsCenterComponent } from './components/center/center.component';
|
||||||
|
|
||||||
|
const routes: Routes = [
|
||||||
|
{ path: '', redirectTo: 'center', pathMatch: 'full' },
|
||||||
|
{
|
||||||
|
path: 'center',
|
||||||
|
component: AccountComponentsCenterComponent,
|
||||||
|
data: {
|
||||||
|
title: '账户中心'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
imports: [RouterModule.forChild(routes)],
|
||||||
|
exports: [RouterModule]
|
||||||
|
})
|
||||||
|
export class AccountRoutingModule {}
|
||||||
30
src/app/routes/account/account.module.ts
Normal file
30
src/app/routes/account/account.module.ts
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2021-11-29 11:06:01
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-01-18 17:14:34
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\account\\account.module.ts
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { NgModule } from '@angular/core';
|
||||||
|
import { SharedModule } from '@shared';
|
||||||
|
import { AccountRoutingModule } from './account-routing.module';
|
||||||
|
import { AccountComponentsCenterComponent } from './components/center/center.component';
|
||||||
|
import { AccountComponentsEditNameComponent } from './components/edit-name/edit-name.component';
|
||||||
|
import { AccountComponentsCenterEditComponent } from './components/edit-password/edit-password.component';
|
||||||
|
|
||||||
|
const COMPONENTS = [
|
||||||
|
AccountComponentsCenterComponent,
|
||||||
|
AccountComponentsEditNameComponent,
|
||||||
|
AccountComponentsCenterEditComponent
|
||||||
|
];
|
||||||
|
const COMPONENTS_NOROUNT = [AccountComponentsEditNameComponent];
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
imports: [SharedModule, AccountRoutingModule],
|
||||||
|
declarations: [...COMPONENTS, ...COMPONENTS_NOROUNT],
|
||||||
|
})
|
||||||
|
export class AccountModule {}
|
||||||
@ -0,0 +1,48 @@
|
|||||||
|
<div class="main">
|
||||||
|
<nz-card style="margin-top: 20px; min-height: 780px;">
|
||||||
|
<h3 style="font-size: 20px; font-weight: 700;">个人中心</h3>
|
||||||
|
<nz-list style="border-bottom: 1px solid #f0f0f0">
|
||||||
|
<nz-list-item>
|
||||||
|
<nz-list-item-meta>
|
||||||
|
<nz-list-item-meta-title>
|
||||||
|
<div nz-row [nzGutter]="16">
|
||||||
|
<div nz-col [nzSpan]="4" class="li-label">
|
||||||
|
<span class="icon iconfont icon-shoujihao" style="color: #aaa"></span> 手机号码/账号
|
||||||
|
</div>
|
||||||
|
<div nz-col [nzSpan]="10">{{ infoData.phone }}</div>
|
||||||
|
<div nz-col [nzSpan]="10">
|
||||||
|
<span *ngIf="infoData.phone; else elsePhone"><i nz-icon [nzType]="'check-circle'" [nzTheme]="'fill'"
|
||||||
|
style="color: #52c41a"></i> 已绑定</span>
|
||||||
|
<ng-template #elsePhone><i nz-icon [nzType]="'question-circle'" [nzTheme]="'fill'"
|
||||||
|
style="color: #ccc"></i> 未绑定</ng-template>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nz-list-item-meta-title>
|
||||||
|
</nz-list-item-meta>
|
||||||
|
<div class="item-btn"><a (click)="edit('phone')">修改</a></div>
|
||||||
|
</nz-list-item>
|
||||||
|
<nz-list-item>
|
||||||
|
<nz-list-item-meta>
|
||||||
|
<nz-list-item-meta-title>
|
||||||
|
<div nz-row [nzGutter]="16">
|
||||||
|
<div nz-col [nzSpan]="4" class="li-label">
|
||||||
|
<span class="icon iconfont icon-mima" style="color: #aaa"></span> 账户密码
|
||||||
|
</div>
|
||||||
|
<div nz-col [nzSpan]="10">定期更换密码有助于账号安全</div>
|
||||||
|
<div nz-col [nzSpan]="10">
|
||||||
|
<span *ngIf="infoData.isPwd; else elsePwd"
|
||||||
|
><i nz-icon [nzType]="'check-circle'" [nzTheme]="'fill'" style="color: #52c41a"></i> 已设置</span
|
||||||
|
>
|
||||||
|
<ng-template #elsePwd
|
||||||
|
><i nz-icon [nzType]="'question-circle'" [nzTheme]="'fill'" style="color: #ccc"></i> 未设置</ng-template
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nz-list-item-meta-title>
|
||||||
|
</nz-list-item-meta>
|
||||||
|
<div class="item-btn"><a (click)="edit('password')">修改</a></div>
|
||||||
|
</nz-list-item>
|
||||||
|
</nz-list>
|
||||||
|
|
||||||
|
</nz-card>
|
||||||
|
</div>
|
||||||
@ -0,0 +1,46 @@
|
|||||||
|
:host {
|
||||||
|
::ng-deep {
|
||||||
|
.info-main {
|
||||||
|
padding: 30px;
|
||||||
|
}
|
||||||
|
.info-main h3 {
|
||||||
|
margin-bottom: 30px;
|
||||||
|
color: #333;
|
||||||
|
font-size: 24px;
|
||||||
|
}
|
||||||
|
.info {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.info-btn {
|
||||||
|
position: absolute;
|
||||||
|
top: 20px;
|
||||||
|
right: 20px;
|
||||||
|
}
|
||||||
|
.item-btn {
|
||||||
|
width: 28px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.li-label {
|
||||||
|
color: #333;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
page-grid {
|
||||||
|
background-color: #f0f3f7;
|
||||||
|
|
||||||
|
div.container {
|
||||||
|
width: 80%;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.info-row {
|
||||||
|
padding: 24px 0;
|
||||||
|
.info-icon {
|
||||||
|
margin-right: 15px;
|
||||||
|
color: #3875fb;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
import { AccountComponentsCenterComponent } from './center.component';
|
||||||
|
|
||||||
|
describe('AccountComponentsCenterComponent', () => {
|
||||||
|
let component: AccountComponentsCenterComponent;
|
||||||
|
let fixture: ComponentFixture<AccountComponentsCenterComponent>;
|
||||||
|
|
||||||
|
beforeEach(async(() => {
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
declarations: [AccountComponentsCenterComponent],
|
||||||
|
}).compileComponents();
|
||||||
|
}));
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(AccountComponentsCenterComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
202
src/app/routes/account/components/center/center.component.ts
Normal file
202
src/app/routes/account/components/center/center.component.ts
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
import { Component, OnInit, ViewChild } from '@angular/core';
|
||||||
|
import { Router } from '@angular/router';
|
||||||
|
import { SFComponent, SFSchema, SFSelectWidgetSchema, SFUISchema, SFUploadWidgetSchema } from '@delon/form';
|
||||||
|
import { ModalHelper, _HttpClient } from '@delon/theme';
|
||||||
|
import { Observable, Observer } from 'rxjs';
|
||||||
|
import { AccountService } from '../../services/account.service';
|
||||||
|
import { AccountComponentsEditNameComponent } from '../edit-name/edit-name.component';
|
||||||
|
import { NzModalService } from 'ng-zorro-antd/modal';
|
||||||
|
import { AccountComponentsCenterEditComponent } from '../edit-password/edit-password.component';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-account-components-center',
|
||||||
|
templateUrl: './center.component.html',
|
||||||
|
styleUrls: ['./center.component.less'],
|
||||||
|
})
|
||||||
|
export class AccountComponentsCenterComponent implements OnInit {
|
||||||
|
url = `/rule?_allow_anonymous=true`;
|
||||||
|
@ViewChild('sf', { static: false }) sf!: SFComponent;
|
||||||
|
i: any;
|
||||||
|
formDate: any = {};
|
||||||
|
schema!: SFSchema;
|
||||||
|
ui: SFUISchema = {};
|
||||||
|
infoData: any = {
|
||||||
|
appId: '',
|
||||||
|
appTypeId: 0,
|
||||||
|
appTypeName: '',
|
||||||
|
appUserId: 0,
|
||||||
|
avatar: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png?_allow_anonymous=true',
|
||||||
|
birthday: '',
|
||||||
|
cert: 0,
|
||||||
|
createTime: '',
|
||||||
|
email: '',
|
||||||
|
id: 0,
|
||||||
|
isPwd: true,
|
||||||
|
lastLoginDate: '',
|
||||||
|
name: '',
|
||||||
|
nickName: '',
|
||||||
|
openId: '',
|
||||||
|
phone: '',
|
||||||
|
remark: '',
|
||||||
|
sex: 0,
|
||||||
|
state: 0,
|
||||||
|
stateLocked: true,
|
||||||
|
token: '',
|
||||||
|
userType: 0,
|
||||||
|
};
|
||||||
|
tabs = [
|
||||||
|
{
|
||||||
|
name: '基本设置',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '安全设置',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
idx: any = 0;
|
||||||
|
constructor(public service: AccountService, private modal: ModalHelper, private http: _HttpClient, private router: Router, private modalService: NzModalService,) {}
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
this.initSF();
|
||||||
|
this.getInfo();
|
||||||
|
}
|
||||||
|
initSF() {
|
||||||
|
this.schema = {
|
||||||
|
properties: {
|
||||||
|
avatar: {
|
||||||
|
type: 'string',
|
||||||
|
title: '头像',
|
||||||
|
ui: {
|
||||||
|
action: `/cms/upload/multipartFile/fileModel?_allow_anonymous=true`,
|
||||||
|
fileType: 'image/png,image/jpeg,image/jpg,image/png,image/gif,image/bmp',
|
||||||
|
limit: 1,
|
||||||
|
limitFileCount: 1,
|
||||||
|
resReName: 'url',
|
||||||
|
urlReName: 'url',
|
||||||
|
widget: 'upload',
|
||||||
|
descriptionI18n: '支持JPG、GIF、PNG、JPEG、BMP格式,文件小于2M',
|
||||||
|
data: {
|
||||||
|
// appId: environment.appId,
|
||||||
|
},
|
||||||
|
name: 'multipartFile',
|
||||||
|
multiple: false,
|
||||||
|
listType: 'picture-card',
|
||||||
|
change: (args: any) => {
|
||||||
|
if (args.type === 'success') {
|
||||||
|
const avatar = [
|
||||||
|
{
|
||||||
|
uid: -1,
|
||||||
|
name: 'LOGO',
|
||||||
|
status: 'done',
|
||||||
|
url: args.fileList[0].response.url,
|
||||||
|
response: {
|
||||||
|
url: args.fileList[0].response.url,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
this.sf?.setValue('/avatar', avatar);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
beforeUpload: (file: any, _fileList) => {
|
||||||
|
return new Observable((observer: Observer<boolean>) => {
|
||||||
|
const isLt2M = file.size / 1024 / 1024 < 2;
|
||||||
|
if (!isLt2M) {
|
||||||
|
this.service.msgSrv.warning('图片大小超过2M!');
|
||||||
|
observer.complete();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
observer.next(isLt2M);
|
||||||
|
observer.complete();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
} as SFUploadWidgetSchema,
|
||||||
|
},
|
||||||
|
nickName: {
|
||||||
|
title: '昵称',
|
||||||
|
type: 'string',
|
||||||
|
minLength: 1,
|
||||||
|
maxLength: 18,
|
||||||
|
ui: {
|
||||||
|
placeholder: '请输入昵称',
|
||||||
|
width: 400,
|
||||||
|
errors: {
|
||||||
|
required: '请输入昵称',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
required: ['nickName', 'avatar'],
|
||||||
|
};
|
||||||
|
this.ui = {
|
||||||
|
'*': {
|
||||||
|
spanLabel: 5,
|
||||||
|
grid: { span: 24 },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
getInfo() {
|
||||||
|
this.service.http.post(this.service.$api_get_current_user_info).subscribe((res) => {
|
||||||
|
this.infoData = res.data;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
edit(tpye: string) {
|
||||||
|
if (tpye === 'phone') {
|
||||||
|
const modalRef = this.modalService.create({
|
||||||
|
nzTitle: '验证手机号码',
|
||||||
|
nzContent: AccountComponentsEditNameComponent,
|
||||||
|
nzComponentParams: {
|
||||||
|
i: this.infoData
|
||||||
|
},
|
||||||
|
nzFooter: null
|
||||||
|
});
|
||||||
|
modalRef.afterClose.subscribe((result: any) => {
|
||||||
|
if (result === true) {
|
||||||
|
// this.st.load(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (tpye === 'password') {
|
||||||
|
|
||||||
|
const modalRef = this.modalService.create({
|
||||||
|
nzTitle: '设置/修改登录密码',
|
||||||
|
nzContent: AccountComponentsCenterEditComponent,
|
||||||
|
nzComponentParams: {
|
||||||
|
record: this.infoData
|
||||||
|
},
|
||||||
|
});
|
||||||
|
modalRef.afterClose.subscribe((result: any) => {
|
||||||
|
if (result === true) {
|
||||||
|
// this.st.load(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// if (tpye === 'info') {
|
||||||
|
// this.router.navigate(['/account/editInfo'], {
|
||||||
|
// queryParams: { realName: this.infoData.realName, certificateNumber: this.infoData.certificateNumber },
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
// if (tpye === 'name') {
|
||||||
|
// this.modal
|
||||||
|
// .createStatic(AccountComponentsEditNameComponent, { i: { name: this.infoData.name, phone: this.infoData.phone } })
|
||||||
|
// .subscribe(() => {
|
||||||
|
// this.getInfo();
|
||||||
|
// // this.st.reload();
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
changeType(type: number): void {
|
||||||
|
this.idx = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
formSubmit(value: any): void {
|
||||||
|
const params = { ...value };
|
||||||
|
this.service.request(`${this.service.$api_get_current_user_info}`, params).subscribe((res) => {
|
||||||
|
if (res === true) {
|
||||||
|
this.service.msgSrv.success('保存成功');
|
||||||
|
this.getInfo();
|
||||||
|
// this.initSF();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,75 @@
|
|||||||
|
<!--
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2021-11-29 11:06:01
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-01-18 17:14:39
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\account\\components\\edit-name\\edit-name.component.html
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<sf #sf [compact]="true" [ui]="ui" [schema]="schema" [button]="'none'" [formData]="formData">
|
||||||
|
<ng-template sf-template="smsVerifyCode" let-me let-ui="ui" let-schema="schema">
|
||||||
|
<div class="valid-code">
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
maxlength="6"
|
||||||
|
nz-input
|
||||||
|
[ngModel]="me.formProperty.value"
|
||||||
|
(ngModelChange)="me.setValue($event)"
|
||||||
|
placeholder="请输入验证码"
|
||||||
|
/>
|
||||||
|
<button class="btn-code" nz-button nzType="link" [disabled]="count > 0" (click)="getCaptcha()">
|
||||||
|
{{ count > 0 ? '请等待' + count + 's' : '获取验证码' }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</ng-template>
|
||||||
|
</sf>
|
||||||
|
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button nz-button type="button" (click)="close()">关闭</button>
|
||||||
|
<button nz-button type="button" nzType="primary" (click)="submitForm()" [disabled]="!sf.valid">下一步</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<nz-modal [(nzVisible)]="isVisibleView" [nzWidth]="600" [nzFooter]="nzModalFooterview" nzTitle="修改手机号码" (nzOnOk)="handleOK()" (nzOnCancel)="handleCancel('1')">
|
||||||
|
<ng-container *nzModalContent>
|
||||||
|
<sf #sfView [schema]="schemaView" [ui]="uiView" [compact]="true" [button]="'none'">
|
||||||
|
<ng-template sf-template="smsVerifyCode" let-me let-ui="uiView" let-schema="schemaView">
|
||||||
|
<div style="position: relative;">
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
maxlength="6"
|
||||||
|
nz-input
|
||||||
|
[ngModel]="me.formProperty.value"
|
||||||
|
(ngModelChange)="me.setValue($event)"
|
||||||
|
placeholder="请输入验证码"
|
||||||
|
/>
|
||||||
|
<button style="position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
z-index: 9;" nz-button nzType="link" [disabled]="count2 > 0" (click)="getCaptcha2()">
|
||||||
|
{{ count2 > 0 ? '请等待' + count2 + 's' : '获取验证码' }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</ng-template>
|
||||||
|
</sf>
|
||||||
|
</ng-container>
|
||||||
|
<ng-template #nzModalFooterview>
|
||||||
|
<button nz-button nzType="default" (click)="handleCancel('1')">取消</button>
|
||||||
|
<button nz-button nzType="primary" (click)="handleNew()">确定</button>
|
||||||
|
</ng-template>
|
||||||
|
</nz-modal>
|
||||||
|
<nz-modal [(nzVisible)]="isVisibleOk" [nzWidth]="600" (nzOnCancel)="handleCancel('1')" [nzFooter]='null' >
|
||||||
|
<ng-container *nzModalContent>
|
||||||
|
<nz-result
|
||||||
|
nzStatus="success"
|
||||||
|
nzTitle="修改成功!"
|
||||||
|
nzSubTitle="您已绑定新手机号,以后可用新手机号登录!"
|
||||||
|
>
|
||||||
|
<div nz-result-extra>
|
||||||
|
<button nz-button nzType="primary" (click)="handleCancel('3')">确定</button>
|
||||||
|
</div>
|
||||||
|
</nz-result>
|
||||||
|
</ng-container>
|
||||||
|
</nz-modal>
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
:host {
|
||||||
|
.valid-code {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.btn-code {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
z-index: 9;
|
||||||
|
}
|
||||||
|
.valid-code2 {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.btn-code2 {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
z-index: 9;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2021-11-29 11:06:01
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-01-18 17:14:44
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\account\\components\\edit-name\\edit-name.component.spec.ts
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
import { AccountComponentsEditNameComponent } from './edit-name.component';
|
||||||
|
|
||||||
|
describe('AccountComponentsEditNameComponent', () => {
|
||||||
|
let component: AccountComponentsEditNameComponent;
|
||||||
|
let fixture: ComponentFixture<AccountComponentsEditNameComponent>;
|
||||||
|
|
||||||
|
beforeEach(async(() => {
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
declarations: [AccountComponentsEditNameComponent],
|
||||||
|
}).compileComponents();
|
||||||
|
}));
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(AccountComponentsEditNameComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -0,0 +1,271 @@
|
|||||||
|
import { AfterViewInit, ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core';
|
||||||
|
import { ErrorData, SFComponent, SFSchema, SFStringWidgetSchema, SFUISchema } from '@delon/form';
|
||||||
|
import { _HttpClient } from '@delon/theme';
|
||||||
|
// import { CaptchaComponent } from '@shared';
|
||||||
|
import { NzMessageService } from 'ng-zorro-antd/message';
|
||||||
|
import { NzModalRef } from 'ng-zorro-antd/modal';
|
||||||
|
import { interval, Observable, Observer } from 'rxjs';
|
||||||
|
import { take } from 'rxjs/operators';
|
||||||
|
import { AccountService } from '../../services/account.service';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-account-components-edit-name',
|
||||||
|
templateUrl: './edit-name.component.html',
|
||||||
|
styleUrls: ['./edit-name.component.less'],
|
||||||
|
})
|
||||||
|
export class AccountComponentsEditNameComponent implements OnInit, AfterViewInit {
|
||||||
|
// @ViewChild('dun', { static: false })
|
||||||
|
// private dun!: CaptchaComponent;
|
||||||
|
@ViewChild('sf', { static: false }) sf!: SFComponent;
|
||||||
|
@ViewChild('sfView', { static: false }) sfView!: SFComponent;
|
||||||
|
record: any = {};
|
||||||
|
i: any;
|
||||||
|
schema!: SFSchema;
|
||||||
|
schemaView!: SFSchema;
|
||||||
|
ui!: SFUISchema;
|
||||||
|
uiView: SFUISchema = {};
|
||||||
|
isVisibleView = false;
|
||||||
|
isVisibleOk = false;
|
||||||
|
formData: any = {};
|
||||||
|
count = 0;
|
||||||
|
count2 = 0;
|
||||||
|
oldName: any;
|
||||||
|
voucher: any;
|
||||||
|
codeTips: any;
|
||||||
|
interval$: any;
|
||||||
|
|
||||||
|
constructor(private modal: NzModalRef, public msgSrv: NzMessageService, public http: _HttpClient, public service: AccountService,private cdr: ChangeDetectorRef,) {}
|
||||||
|
ngAfterViewInit(): void {
|
||||||
|
// this.dun.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
this.codeTips = '为了账户安全,需您的手机验证(' + this.i?.phone + ')';
|
||||||
|
this.formData.oldName = this.i?.phone;
|
||||||
|
this.initSF();
|
||||||
|
this.initSFNew();
|
||||||
|
// this.getInfo();
|
||||||
|
}
|
||||||
|
initSF() {
|
||||||
|
this.schema = {
|
||||||
|
properties: {
|
||||||
|
oldName: {
|
||||||
|
title: '手机号',
|
||||||
|
type: 'string',
|
||||||
|
default: this.formData?.oldName,
|
||||||
|
ui: {
|
||||||
|
widget: 'text',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// userName: {
|
||||||
|
// title: '用户名(新)',
|
||||||
|
// type: 'string',
|
||||||
|
// minLength: 3,
|
||||||
|
// maxLength: 30,
|
||||||
|
// description: '3-30个字符,支持中英文、数字、符号“_”和“-”,只能修改一次',
|
||||||
|
// ui: {
|
||||||
|
// placeholder: '请输入新用户名',
|
||||||
|
// errors: {
|
||||||
|
// required: '请输入新用户名',
|
||||||
|
// },
|
||||||
|
// } as SFStringWidgetSchema,
|
||||||
|
// },
|
||||||
|
smsVerifyCode: {
|
||||||
|
title: '验证码',
|
||||||
|
type: 'string',
|
||||||
|
maxLength: 6,
|
||||||
|
minLength: 6,
|
||||||
|
description: this.codeTips,
|
||||||
|
ui: {
|
||||||
|
widget: 'custom',
|
||||||
|
placeholder: '请输入验证码',
|
||||||
|
errors: {
|
||||||
|
required: '请输入6位数字验证码',
|
||||||
|
minLength: '请输入6位数字验证码',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
required: ['userName', 'smsVerifyCode'],
|
||||||
|
};
|
||||||
|
this.ui = {
|
||||||
|
'*': {
|
||||||
|
spanLabelFixed: 100,
|
||||||
|
grid: { span: 24 },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
initSFNew() {
|
||||||
|
this.schemaView = {
|
||||||
|
properties: {
|
||||||
|
phone: {
|
||||||
|
title: '新手机号',
|
||||||
|
type: 'string',
|
||||||
|
format: 'mobile',
|
||||||
|
maxLength: 11,
|
||||||
|
ui: {
|
||||||
|
placeholder: '请输入新手机号',
|
||||||
|
errors: {
|
||||||
|
required: '请输入新手机号',
|
||||||
|
},
|
||||||
|
} as SFStringWidgetSchema,
|
||||||
|
},
|
||||||
|
smsVerifyCode: {
|
||||||
|
title: '验证码',
|
||||||
|
type: 'string',
|
||||||
|
maxLength: 6,
|
||||||
|
minLength: 6,
|
||||||
|
ui: {
|
||||||
|
widget: 'custom',
|
||||||
|
placeholder: '请输入验证码',
|
||||||
|
errors: {
|
||||||
|
required: '请输入6位验证码',
|
||||||
|
minLength: '请输入6位验证码',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
required: ['phone', 'smsVerifyCode'],
|
||||||
|
};
|
||||||
|
this.uiView = {
|
||||||
|
'*': {
|
||||||
|
spanLabelFixed: 100,
|
||||||
|
grid: { span: 24 },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
getCaptcha() {
|
||||||
|
const params = {
|
||||||
|
// phoneNumber: phone
|
||||||
|
};
|
||||||
|
this.service.request(this.service.$api_get_current_user_smVerification, params, 'POST', true, 'FORM').subscribe((res) => {
|
||||||
|
// code==503046 弹出网易盾
|
||||||
|
if (res && res.code === '1') {
|
||||||
|
this.service.msgSrv.success('发送成功');
|
||||||
|
this.createInterval();
|
||||||
|
} else if (res.code === '503046') {
|
||||||
|
// this.dun.popUp();
|
||||||
|
} else {
|
||||||
|
this.service.msgSrv.success(res.msg);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getCaptcha2() {
|
||||||
|
const params = {
|
||||||
|
phoneNumber: this.sfView.value.phone
|
||||||
|
};
|
||||||
|
this.service.request(this.service.$api_get_getSMVerificationCode, params, 'POST', true, 'FORM').subscribe((res) => {
|
||||||
|
// code==503046 弹出网易盾
|
||||||
|
if (res && res.code === '1') {
|
||||||
|
this.service.msgSrv.success('发送成功');
|
||||||
|
this.createInterval2();
|
||||||
|
} else if (res.code === '503046') {
|
||||||
|
// this.dun.popUp();
|
||||||
|
} else {
|
||||||
|
this.service.msgSrv.success(res.msg);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// /* code倒计时 */
|
||||||
|
// codeCountDown() {
|
||||||
|
// this.count = 59;
|
||||||
|
// this.interval$ = setInterval(() => {
|
||||||
|
// this.count -= 1;
|
||||||
|
// if (this.count <= 0) {
|
||||||
|
// clearInterval(this.interval$);
|
||||||
|
// }
|
||||||
|
// }, 1000);
|
||||||
|
// }
|
||||||
|
private createInterval() {
|
||||||
|
this.count = 59;
|
||||||
|
interval(1000)
|
||||||
|
.pipe(take(60))
|
||||||
|
.subscribe((x: any) => {
|
||||||
|
this.count = 59 - (x + 1);
|
||||||
|
this.cdr.detectChanges();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
private createInterval2() {
|
||||||
|
this.count2 = 59;
|
||||||
|
interval(1000)
|
||||||
|
.pipe(take(60))
|
||||||
|
.subscribe((x: any) => {
|
||||||
|
this.count2 = 59 - (x + 1);
|
||||||
|
this.cdr.detectChanges();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// codeCountDown2() {
|
||||||
|
// this.count2 = 59;
|
||||||
|
// this.interval$ = setInterval(() => {
|
||||||
|
// this.count2 -= 1;
|
||||||
|
// if (this.count <= 0) {
|
||||||
|
// clearInterval(this.interval$);
|
||||||
|
// }
|
||||||
|
// }, 1000);
|
||||||
|
// }
|
||||||
|
/* 网易盾验证通过 */
|
||||||
|
captchaDone(validate: any) {
|
||||||
|
this.createInterval();
|
||||||
|
}
|
||||||
|
|
||||||
|
getInfo() {
|
||||||
|
const params = {
|
||||||
|
// id: this.i.id,
|
||||||
|
};
|
||||||
|
this.service.http.post(this.service.$api_get_current_user_info, params).subscribe((res) => {
|
||||||
|
// if (res) {
|
||||||
|
// this.getCaptcha(res.data.phone);
|
||||||
|
// }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
close() {
|
||||||
|
this.modal.destroy();
|
||||||
|
}
|
||||||
|
submitForm() {
|
||||||
|
const params = {
|
||||||
|
smsVerifyCode: this.sf.value.smsVerifyCode,
|
||||||
|
};
|
||||||
|
|
||||||
|
this.service.http.post(this.service.$api_get_verifyPhone, params).subscribe((res) => {
|
||||||
|
if (res.success) {
|
||||||
|
// this.modal.close(true);
|
||||||
|
this.voucher = res.data.voucher
|
||||||
|
this.isVisibleView = true
|
||||||
|
} else {
|
||||||
|
this.service.msgSrv.error(res.msg)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
handleCancel(type: string) {
|
||||||
|
if(type === '1') {
|
||||||
|
this.isVisibleView = false
|
||||||
|
} else if(type === '2') {
|
||||||
|
console.log(type)
|
||||||
|
} else if(type === '3') {
|
||||||
|
this.modal.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
handleOK() {
|
||||||
|
|
||||||
|
}
|
||||||
|
handleNew() {
|
||||||
|
if(!this.sfView.valid) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const params = {
|
||||||
|
voucher: this.voucher,
|
||||||
|
...this.sfView.value,
|
||||||
|
}
|
||||||
|
this.service.http.post(this.service.$api_set_voucherUpdatePhone, params).subscribe((res) => {
|
||||||
|
if (res.success) {
|
||||||
|
this.isVisibleOk = true;
|
||||||
|
} else {
|
||||||
|
this.service.msgSrv.error(res.msg)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,94 @@
|
|||||||
|
<!--
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2021-11-29 13:50:46
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-01-18 17:14:50
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\account\\components\\edit-password\\edit-password.component.html
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<nz-alert style="margin-bottom: 15px;" nzType="info" nzMessage="密码为字母和数字组成的8-16个字符,支持符号“_”和“-”。" nzShowIcon></nz-alert>
|
||||||
|
<form nz-form [formGroup]="validateForm">
|
||||||
|
<nz-form-item>
|
||||||
|
<nz-form-label nzRequired>新密码</nz-form-label>
|
||||||
|
<nz-form-control nzErrorTip="密码格式错误">
|
||||||
|
<nz-input-group [nzSuffix]="suffixTemplate" name='passWord'>
|
||||||
|
<input
|
||||||
|
[type]="passwordVisible ? 'text' : 'password'"
|
||||||
|
nz-input
|
||||||
|
placeholder="请输入新密码"
|
||||||
|
[(ngModel)]="password"
|
||||||
|
formControlName="passWord"
|
||||||
|
/>
|
||||||
|
</nz-input-group>
|
||||||
|
<ng-template #suffixTemplate>
|
||||||
|
<i nz-icon [nzType]="passwordVisible ? 'eye-invisible' : 'eye'" (click)="passwordVisible = !passwordVisible"></i>
|
||||||
|
</ng-template>
|
||||||
|
</nz-form-control>
|
||||||
|
</nz-form-item>
|
||||||
|
<nz-form-item>
|
||||||
|
<nz-form-label nzRequired>确认新密码</nz-form-label>
|
||||||
|
<nz-form-control nzErrorTip="密码不一致">
|
||||||
|
<nz-input-group [nzSuffix]="suffixTemplate2" name='passWordTo'>
|
||||||
|
<input
|
||||||
|
[type]="passwordVisible2 ? 'text' : 'password'"
|
||||||
|
nz-input
|
||||||
|
formControlName="passWordTo"
|
||||||
|
placeholder="请确认输入新密码"
|
||||||
|
[(ngModel)]="password2"
|
||||||
|
/>
|
||||||
|
</nz-input-group>
|
||||||
|
<ng-template #suffixTemplate2>
|
||||||
|
<i nz-icon [nzType]="passwordVisible2 ? 'eye-invisible' : 'eye'" (click)="passwordVisible2 = !passwordVisible2"></i>
|
||||||
|
</ng-template>
|
||||||
|
</nz-form-control>
|
||||||
|
</nz-form-item>
|
||||||
|
<nz-form-item>
|
||||||
|
<nz-form-label nzRequired>手机号</nz-form-label>
|
||||||
|
{{this.record?.phone}}
|
||||||
|
</nz-form-item>
|
||||||
|
<nz-form-item>
|
||||||
|
<nz-form-label
|
||||||
|
nzFor="smsVerifyCode"
|
||||||
|
nzRequired
|
||||||
|
[nzTooltipIcon]="captchaTooltipIcon"
|
||||||
|
>
|
||||||
|
验证码
|
||||||
|
</nz-form-label>
|
||||||
|
<nz-form-control
|
||||||
|
[nzSm]="14"
|
||||||
|
[nzXs]="24"
|
||||||
|
>
|
||||||
|
<div nz-row [nzGutter]="8">
|
||||||
|
<div nz-col [nzSpan]="12">
|
||||||
|
<input nz-input [maxlength]="6" formControlName="smsVerifyCode" id="smsVerifyCode" />
|
||||||
|
</div>
|
||||||
|
<div nz-col [nzSpan]="12" style="display: flex; align-items: center;">
|
||||||
|
<button nz-button *ngIf="count < 1;" (click)="getCaptcha($event)">获取验证码</button>
|
||||||
|
<span *ngIf="count > 1;">{{ count > 0 ? '请等待' + count + 's' : '获取验证码' }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nz-form-control>
|
||||||
|
</nz-form-item>
|
||||||
|
</form>
|
||||||
|
<div *nzModalFooter>
|
||||||
|
<button nz-button nzType="default" (click)="destroyModal()">取消</button>
|
||||||
|
<button nz-button nzType="primary" (click)="save()" >确定</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<nz-modal [(nzVisible)]="isVisibleView" [nzWidth]="600" (nzOnCancel)="handleCancel()" [nzFooter]='null' >
|
||||||
|
<ng-container *nzModalContent>
|
||||||
|
<nz-result
|
||||||
|
nzStatus="success"
|
||||||
|
nzTitle="密码设置成功!"
|
||||||
|
nzSubTitle="请牢记您的新密码,修改密码后需重新登录,3秒后自动跳转至登录页..."
|
||||||
|
>
|
||||||
|
<div nz-result-extra>
|
||||||
|
<button nz-button nzType="primary" (click)="handleOK()">重新登录</button>
|
||||||
|
</div>
|
||||||
|
</nz-result>
|
||||||
|
</ng-container>
|
||||||
|
</nz-modal>
|
||||||
@ -0,0 +1,130 @@
|
|||||||
|
/*
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2021-12-27 10:30:56
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-01-18 17:14:54
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\account\\components\\edit-password\\edit-password.component.ts
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { Component, Inject, OnInit, ViewChild } from '@angular/core';
|
||||||
|
import { FormBuilder, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms';
|
||||||
|
import { ActivatedRoute, Router } from '@angular/router';
|
||||||
|
import { STChange, STColumn, STComponent, STData, STRequestOptions } from '@delon/abc/st';
|
||||||
|
import { DA_SERVICE_TOKEN, ITokenService } from '@delon/auth';
|
||||||
|
|
||||||
|
import { SFComponent, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form';
|
||||||
|
import { NzDrawerRef, NzDrawerService } from 'ng-zorro-antd/drawer';
|
||||||
|
import { NzFormTooltipIcon } from 'ng-zorro-antd/form';
|
||||||
|
import { NzModalRef } from 'ng-zorro-antd/modal';
|
||||||
|
import { AccountService } from '../../services/account.service';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-account-components-edit',
|
||||||
|
templateUrl: './edit-password.component.html'
|
||||||
|
})
|
||||||
|
export class AccountComponentsCenterEditComponent implements OnInit {
|
||||||
|
validateForm!: FormGroup;
|
||||||
|
record: any;
|
||||||
|
count = 0;
|
||||||
|
type = 'create';
|
||||||
|
isVisibleView = false
|
||||||
|
passwordVisible = false;
|
||||||
|
passwordVisible2 = false;
|
||||||
|
password: any;
|
||||||
|
password2: any;
|
||||||
|
interval$: any;
|
||||||
|
confirmationValidator =
|
||||||
|
(control: FormControl): { [s: string]: boolean } => {
|
||||||
|
if (!control.value) {
|
||||||
|
return { required: true };
|
||||||
|
} else if (control?.value !== this.validateForm?.value?.passWord) {
|
||||||
|
return { confirm: true, error: true };
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
};
|
||||||
|
captchaTooltipIcon: NzFormTooltipIcon = {
|
||||||
|
type: 'info-circle',
|
||||||
|
theme: 'twotone'
|
||||||
|
};
|
||||||
|
constructor(
|
||||||
|
public router: Router,
|
||||||
|
public ar: ActivatedRoute,
|
||||||
|
private modalRef: NzModalRef,
|
||||||
|
private fb: FormBuilder,
|
||||||
|
public service: AccountService,
|
||||||
|
@Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService
|
||||||
|
) {}
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
this.initForm();
|
||||||
|
}
|
||||||
|
initForm () {
|
||||||
|
this.validateForm = this.fb.group({
|
||||||
|
passWord: [null,
|
||||||
|
[
|
||||||
|
Validators.required,
|
||||||
|
Validators.maxLength(16),
|
||||||
|
Validators.minLength(8),
|
||||||
|
Validators.pattern('^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z-_]{8,16}$')
|
||||||
|
]],
|
||||||
|
passWordTo: [null, [ Validators.required, Validators.maxLength(16), Validators.minLength(8), this.confirmationValidator,]],
|
||||||
|
smsVerifyCode: [null, [Validators.required]],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
destroyModal(): void {
|
||||||
|
this.modalRef.destroy();
|
||||||
|
}
|
||||||
|
getCaptcha(e: MouseEvent): void {
|
||||||
|
this.service.request(this.service.$api_get_current_user_smVerification).subscribe(res => {
|
||||||
|
// code==503046 弹出网易盾
|
||||||
|
if (res && res.code === '1') {
|
||||||
|
this.service.msgSrv.success('发送成功');
|
||||||
|
e.preventDefault();
|
||||||
|
this.codeCountDown();
|
||||||
|
}else {
|
||||||
|
this.service.msgSrv.success(res.msg);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
save() {
|
||||||
|
if(!this.validateForm.valid) {
|
||||||
|
this.service.msgSrv.warning('必填项为空或格式错误,请检查!')
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const params = {
|
||||||
|
...this.validateForm.value
|
||||||
|
};
|
||||||
|
this.service.request(this.service.$api_set_phoneUpdatePassword, params).subscribe((res) => {
|
||||||
|
if (res) {
|
||||||
|
this.service.msgSrv.success('修改密码成功!');
|
||||||
|
this.isVisibleView = true;
|
||||||
|
setTimeout(() => {
|
||||||
|
this.tokenService.clear();
|
||||||
|
this.router.navigate(['/passport/login'])
|
||||||
|
this.modalRef.close()
|
||||||
|
}, 3000)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/* code倒计时 */
|
||||||
|
codeCountDown() {
|
||||||
|
this.count = 59;
|
||||||
|
this.interval$ = setInterval(() => {
|
||||||
|
this.count -= 1;
|
||||||
|
if (this.count <= 0) {
|
||||||
|
clearInterval(this.interval$);
|
||||||
|
}
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
handleCancel() {
|
||||||
|
this.isVisibleView = false
|
||||||
|
}
|
||||||
|
handleOK() {
|
||||||
|
this.modalRef.close()
|
||||||
|
this.tokenService.clear();
|
||||||
|
this.router.navigate(['/passport/login'])
|
||||||
|
}
|
||||||
|
}
|
||||||
42
src/app/routes/account/services/account.service.ts
Normal file
42
src/app/routes/account/services/account.service.ts
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2021-12-27 10:30:56
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-01-18 17:14:59
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\account\\services\\account.service.ts
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { Injectable, Injector } from '@angular/core';
|
||||||
|
import { _HttpClient } from '@delon/theme';
|
||||||
|
import { NzMessageService } from 'ng-zorro-antd/message';
|
||||||
|
import { map } from 'rxjs/operators';
|
||||||
|
import { BaseService } from 'src/app/shared/services/core/base.service';
|
||||||
|
import { EAFileUtil } from 'src/app/shared/utils/file.util';
|
||||||
|
|
||||||
|
@Injectable({
|
||||||
|
providedIn: 'root',
|
||||||
|
})
|
||||||
|
export class AccountService extends BaseService {
|
||||||
|
|
||||||
|
// 获取当前登录用户详情
|
||||||
|
$api_get_current_user_info = `/api/mdc/cuc/user/getUserInfo`;
|
||||||
|
|
||||||
|
// 根据当前登录用户绑定的手机号码获取短信验证码
|
||||||
|
$api_get_current_user_smVerification = `/api/mdc/pbc/smsSend/getSmVerificationCodeByToken`;
|
||||||
|
// 获取短信验证码
|
||||||
|
$api_get_getSMVerificationCode = `/api/mdc/pbc/smsSend/getSMVerificationCode`;
|
||||||
|
|
||||||
|
// 验证手机号
|
||||||
|
$api_get_verifyPhone = `/api/mdc/cuc/userBasicInfo/forgetPassword/verifyPhone`;
|
||||||
|
|
||||||
|
// 凭证修改手机号
|
||||||
|
$api_set_voucherUpdatePhone = `/api/mdc/cuc/userBasicInfo/forgetPassword/voucherUpdatePhone`;
|
||||||
|
// 凭证修改密码
|
||||||
|
$api_set_phoneUpdatePassword = `/api/mdc/cuc/userBasicInfo/phoneUpdatePassword`;
|
||||||
|
constructor(public injector: Injector) {
|
||||||
|
super(injector);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
import { AfterViewInit, Component, OnInit } from '@angular/core';
|
||||||
|
import { fromEvent } from 'rxjs';
|
||||||
|
import { debounceTime } from 'rxjs/operators';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
template: ''
|
||||||
|
})
|
||||||
|
export class BasicTableComponent implements AfterViewInit {
|
||||||
|
scrollY = '400px';
|
||||||
|
|
||||||
|
constructor() {}
|
||||||
|
|
||||||
|
ngAfterViewInit(): void {
|
||||||
|
setTimeout(() => {
|
||||||
|
this.getScrollY();
|
||||||
|
}, 100);
|
||||||
|
fromEvent(window, 'resize')
|
||||||
|
.pipe(debounceTime(100))
|
||||||
|
.subscribe(event => {
|
||||||
|
this.getScrollY();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getScrollY() {
|
||||||
|
const windowHeight = window.innerHeight || Math.max(document.documentElement.clientHeight, document.body.clientHeight);
|
||||||
|
const header = document.getElementsByTagName('layout-pro-header')?.[0];
|
||||||
|
if (windowHeight && header) {
|
||||||
|
let scrollY = windowHeight - header.clientHeight - 35 - 49;
|
||||||
|
const headerWrapper = document.getElementsByTagName('page-header-wrapper')?.[0];
|
||||||
|
if (headerWrapper) {
|
||||||
|
scrollY -= headerWrapper.clientHeight;
|
||||||
|
}
|
||||||
|
const tabset = document.getElementsByTagName('nz-tabset')?.[0];
|
||||||
|
if (tabset) {
|
||||||
|
scrollY -= tabset.clientHeight;
|
||||||
|
}
|
||||||
|
this.scrollY = scrollY + 'px';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
5
src/app/routes/commom/less/basic-board.less
Normal file
5
src/app/routes/commom/less/basic-board.less
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
:host::ng-deep {
|
||||||
|
.ant-form-item {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
42
src/app/routes/commom/less/box.less
Normal file
42
src/app/routes/commom/less/box.less
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
:host::ng-deep {
|
||||||
|
.search-box {
|
||||||
|
.ant-card-body {
|
||||||
|
padding-bottom: 18px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-box {
|
||||||
|
.ant-card-body {
|
||||||
|
padding-top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nz-range-picker {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-tabs-tab-btn {
|
||||||
|
padding-right: 16px;
|
||||||
|
padding-left : 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-truncate {
|
||||||
|
white-space: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bold {
|
||||||
|
.ant-statistic-title {
|
||||||
|
font-weight: 600;
|
||||||
|
color : #000;
|
||||||
|
font-size : 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.total-footer {
|
||||||
|
position : absolute;
|
||||||
|
bottom : 25px;
|
||||||
|
height : 32px;
|
||||||
|
margin : 16px 0;
|
||||||
|
line-height: 32px;
|
||||||
|
}
|
||||||
70
src/app/routes/commom/less/commom-table.less
Normal file
70
src/app/routes/commom/less/commom-table.less
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
:host {
|
||||||
|
::ng-deep {
|
||||||
|
nz-card {
|
||||||
|
margin: -24px -24px 0;
|
||||||
|
|
||||||
|
.ant-tabs-nav {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-tabs-tab {
|
||||||
|
margin: 0 0 0 16px;
|
||||||
|
padding: 12px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-table-body {
|
||||||
|
border-bottom: 1px solid #f0f0f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-box {
|
||||||
|
.ant-card-body {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-table-pagination.ant-pagination {
|
||||||
|
margin: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-table-thead > tr > th,
|
||||||
|
.ant-table-tbody > tr > td,
|
||||||
|
.ant-table tfoot > tr > th,
|
||||||
|
.ant-table tfoot > tr > td {
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-table.ant-table-bordered > .ant-table-container {
|
||||||
|
border-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-pagination-item {
|
||||||
|
min-width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
line-height: 21px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-pagination-total-text {
|
||||||
|
height: 24px;
|
||||||
|
line-height: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-pagination-prev,
|
||||||
|
.ant-pagination-next,
|
||||||
|
.ant-pagination-jump-prev,
|
||||||
|
.ant-pagination-jump-next {
|
||||||
|
min-width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
line-height: 21px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-select-single:not(.ant-select-customize-input) .ant-select-selector {
|
||||||
|
height: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-select-single .ant-select-selector .ant-select-selection-item,
|
||||||
|
.ant-select-single .ant-select-selector .ant-select-selection-placeholder {
|
||||||
|
line-height: 21px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
13
src/app/routes/commom/less/expend-but.less
Normal file
13
src/app/routes/commom/less/expend-but.less
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
.expend-options {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media (min-width: 1200px) {
|
||||||
|
.expend-options {
|
||||||
|
position : absolute;
|
||||||
|
right : 0;
|
||||||
|
bottom : 25px;
|
||||||
|
max-width: 450px;
|
||||||
|
}
|
||||||
|
}
|
||||||
48
src/app/routes/commom/less/trajectory.less
Normal file
48
src/app/routes/commom/less/trajectory.less
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
:host::ng-deep {
|
||||||
|
.text-truncate {
|
||||||
|
white-space: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.map_st {
|
||||||
|
max-height: 350px;
|
||||||
|
max-width : 360px;
|
||||||
|
position : absolute;
|
||||||
|
top : 20px;
|
||||||
|
right : 49px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.map_radio {
|
||||||
|
position : absolute;
|
||||||
|
top : 20px;
|
||||||
|
left : 20px;
|
||||||
|
background : #F4F4F5;
|
||||||
|
box-shadow : 0px 2px 8px 1px rgb(0 0 0 / 10%);
|
||||||
|
border-radius: 4px 4px 4px 4px;
|
||||||
|
|
||||||
|
.ant-radio-button-wrapper {
|
||||||
|
background: #F4F4F5;
|
||||||
|
border : unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-radio-button-wrapper-checked {
|
||||||
|
color : #CF3834;
|
||||||
|
background: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled)::before {
|
||||||
|
background-color: #d9d9d9;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.detail_title {
|
||||||
|
font-size : 16px;
|
||||||
|
font-weight: 500;
|
||||||
|
color : #252A3D;
|
||||||
|
line-height: 24px;
|
||||||
|
|
||||||
|
span {
|
||||||
|
color : #E60012;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
<!--
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-10 14:44:57
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-01-18 17:15:13
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-detail\\contract-detail.component.html
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- 页头 -->
|
||||||
|
<page-header-wrapper [logo]="logo" [title]="textStatus" >
|
||||||
|
<ng-template #logo>
|
||||||
|
<button nz-button nz-tooltip nzTooltipTitle="返回上一页" (click)="goBack()">
|
||||||
|
<i nz-icon nzType="left" nzTheme="outline"></i>
|
||||||
|
</button>
|
||||||
|
</ng-template>
|
||||||
|
</page-header-wrapper>
|
||||||
|
<nz-card>
|
||||||
|
<div nz-col nzSpan="20" style="overflow: scroll">
|
||||||
|
<nz-card class="card-height" >
|
||||||
|
<div [innerHTML]="detailList?.contractContent | safehtml"></div>
|
||||||
|
</nz-card>
|
||||||
|
</div>
|
||||||
|
</nz-card>
|
||||||
@ -0,0 +1,4 @@
|
|||||||
|
.title {
|
||||||
|
padding-right: 4px;
|
||||||
|
padding-left: 14px !important;
|
||||||
|
}
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-10 14:44:57
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-01-18 17:15:18
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-detail\\contract-detail.component.spec.ts
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
import { ContractManagementDetailComponent } from './contract-detail.component';
|
||||||
|
|
||||||
|
describe('ContractManagementDetailComponent', () => {
|
||||||
|
let component: ContractManagementDetailComponent;
|
||||||
|
let fixture: ComponentFixture<ContractManagementDetailComponent>;
|
||||||
|
|
||||||
|
beforeEach(async(() => {
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
declarations: [ContractManagementDetailComponent],
|
||||||
|
}).compileComponents();
|
||||||
|
}));
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(ContractManagementDetailComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-10 14:44:57
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-01-18 17:15:43
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-detail\\contract-detail.component.ts
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
*/
|
||||||
|
import { DatePipe } from '@angular/common';
|
||||||
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
import { ActivatedRoute, Router } from '@angular/router';
|
||||||
|
import { NzModalService } from 'ng-zorro-antd/modal';
|
||||||
|
import { ContractManagementService } from '../../services/contract-management.service';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-contract-management-detail-complaint',
|
||||||
|
templateUrl: './contract-detail.component.html',
|
||||||
|
styleUrls: ['./contract-detail.component.less'],
|
||||||
|
providers: [DatePipe]
|
||||||
|
})
|
||||||
|
export class ContractManagementDetailComponent implements OnInit {
|
||||||
|
constructor(
|
||||||
|
private nzModalService: NzModalService,
|
||||||
|
public service: ContractManagementService,
|
||||||
|
public route: ActivatedRoute,
|
||||||
|
private datePipe: DatePipe,
|
||||||
|
private router: Router
|
||||||
|
) {}
|
||||||
|
textStatus = '合同详情';
|
||||||
|
name: any;
|
||||||
|
code: any;
|
||||||
|
templateHTML: any;
|
||||||
|
detailList: any = {
|
||||||
|
templateName: ''
|
||||||
|
};
|
||||||
|
ngOnInit() {
|
||||||
|
this.initData(this.service.$api_contract_get);
|
||||||
|
}
|
||||||
|
goBack() {
|
||||||
|
window.history.go(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
initData(url: string) {
|
||||||
|
this.service.request(url, { id: this.route.snapshot.params.id }).subscribe(res => {
|
||||||
|
if (res) {
|
||||||
|
this.detailList = res;
|
||||||
|
this.detailList = res;
|
||||||
|
let value: any = JSON.parse(res.contractParameter);
|
||||||
|
this.code = value['${code}'];
|
||||||
|
this.name = value['${name}'];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
cancel() {
|
||||||
|
window.history.go(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,101 @@
|
|||||||
|
<!--
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-07 13:29:57
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-02-24 10:08:53
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-frame\\contract-frame.component.html
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
-->
|
||||||
|
<nz-card>
|
||||||
|
<div nz-row nzGutter="8">
|
||||||
|
<!-- 查询字段小于或等于3个时,不显示伸缩按钮 -->
|
||||||
|
<div nz-col nzSpan="24" *ngIf="queryFieldCount <= 4">
|
||||||
|
<sf
|
||||||
|
#sf
|
||||||
|
[schema]="schema"
|
||||||
|
[ui]="ui"
|
||||||
|
[mode]="'search'"
|
||||||
|
[disabled]="!sf?.valid"
|
||||||
|
[loading]="false"
|
||||||
|
(formSubmit)="st?.load(1)"
|
||||||
|
(formReset)="resetSF()"
|
||||||
|
></sf>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 查询字段大于3个时,根据展开状态调整布局 -->
|
||||||
|
<ng-container>
|
||||||
|
<div nz-col [nzSpan]="_$expand ? 24 : 18">
|
||||||
|
<sf #sf [schema]="schema" [ui]="ui" [compact]="true" [button]="'none'">
|
||||||
|
<ng-template sf-template="signTime" let-me let-ui="ui" let-schema="schema">
|
||||||
|
<ng-template sf-template="effectiveEndTime" let-me let-ui="ui" let-schema="schema">
|
||||||
|
<nz-range-picker [nzShowTime]="true" [(ngModel)]="sf.value.effectiveEndTime"></nz-range-picker>
|
||||||
|
</ng-template>
|
||||||
|
<nz-range-picker [nzShowTime]="true" [(ngModel)]="sf.value.signTime"></nz-range-picker>
|
||||||
|
</ng-template>
|
||||||
|
</sf>
|
||||||
|
</div>
|
||||||
|
<div nz-col [nzSpan]="_$expand ? 24 : 6" [class.text-right]="_$expand">
|
||||||
|
<button
|
||||||
|
nz-button
|
||||||
|
nzType="primary"
|
||||||
|
[disabled]="!sf.valid"
|
||||||
|
[nzLoading]="isLoading && st.loading"
|
||||||
|
(click)="st?.load(1)"
|
||||||
|
acl
|
||||||
|
[acl-ability]="['CONTRACT-INDEX-listFrame']"
|
||||||
|
>查询</button
|
||||||
|
>
|
||||||
|
<button nz-button (click)="resetSF()">重置</button>
|
||||||
|
<button nz-button nzType="link" (click)="expandToggle()">
|
||||||
|
{{ !_$expand ? '展开' : '收起' }}
|
||||||
|
<i nz-icon [nzType]="!_$expand ? 'down' : 'up'"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</ng-container>
|
||||||
|
</div>
|
||||||
|
</nz-card>
|
||||||
|
|
||||||
|
<nz-card class="content-box" nzBordered>
|
||||||
|
<div style="position: relative">
|
||||||
|
<nz-alert
|
||||||
|
nzType="info"
|
||||||
|
[nzMessage]="'当前共' + st?.total + '行记录,已选择' + selectedRows.length + '项'"
|
||||||
|
nzShowIcon
|
||||||
|
[ngStyle]="{ margin: '0 0 1rem 0' }"
|
||||||
|
>
|
||||||
|
</nz-alert>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<st
|
||||||
|
#st
|
||||||
|
[data]="service.$api_listFrame_page"
|
||||||
|
[columns]="columns"
|
||||||
|
[req]="{ method: 'POST', allInBody: true, reName: { pi: 'pageIndex', ps: 'pageSize' }, params: reqParams }"
|
||||||
|
[res]="{ reName: { list: 'data.records', total: 'data.total' } }"
|
||||||
|
[page]="{ show: true, showSize: true, pageSizes: [10, 20, 30, 50, 100, 200, 300, 500, 1000] }"
|
||||||
|
[loading]="service.http.loading"
|
||||||
|
[scroll]="{ x: '1200px', y: '370px' }"
|
||||||
|
(change)="stChange($event)"
|
||||||
|
>
|
||||||
|
<ng-template st-row="contractCode" let-item let-index="index">
|
||||||
|
<a [routerLink]="'/contract-management/index/detail/' + item.id">{{ item?.contractCode }}</a>
|
||||||
|
</ng-template>
|
||||||
|
</st>
|
||||||
|
</nz-card>
|
||||||
|
|
||||||
|
<ng-template #auditModal>
|
||||||
|
<div nz-row nzGutter="8">
|
||||||
|
<div nz-col nzSpan="24" se-container [labelWidth]="80">
|
||||||
|
<se [col]="1" label="备注">
|
||||||
|
<textarea
|
||||||
|
nz-input
|
||||||
|
rows="3"
|
||||||
|
placeholder="同意可以不用填写原因 ,拒绝必须说明原因"
|
||||||
|
style="width: 325px; margin-left: 14px"
|
||||||
|
></textarea>
|
||||||
|
</se>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</ng-template>
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
:host::ng-deep {
|
||||||
|
.search-box {
|
||||||
|
.ant-card-body {
|
||||||
|
padding-bottom: 18px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-box {
|
||||||
|
.ant-card-body {
|
||||||
|
padding-top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nz-range-picker {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-tabs-tab-btn {
|
||||||
|
padding-right: 16px;
|
||||||
|
padding-left : 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.expend-options {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media (min-width: 1200px) {
|
||||||
|
.expend-options {
|
||||||
|
z-index : -99;
|
||||||
|
margin-top: -40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,326 @@
|
|||||||
|
import { DatePipe } from '@angular/common';
|
||||||
|
import { Component, OnInit, ViewChild } from '@angular/core';
|
||||||
|
import { Router } from '@angular/router';
|
||||||
|
import { STComponent, STColumn, STChange } from '@delon/abc/st';
|
||||||
|
import { SFComponent, SFSchema, SFDateWidgetSchema, SFUISchema, SFSelectWidgetSchema } from '@delon/form';
|
||||||
|
import { ShipperBaseService } from '@shared';
|
||||||
|
import { NzModalService } from 'ng-zorro-antd/modal';
|
||||||
|
import { ContractManagementService } from '../../services/contract-management.service';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-contract-management-contract-frame',
|
||||||
|
templateUrl: './contract-frame.component.html',
|
||||||
|
styleUrls: ['./contract-frame.component.less'],
|
||||||
|
providers: [DatePipe]
|
||||||
|
})
|
||||||
|
export class ContractManagementFrameComponent implements OnInit {
|
||||||
|
url = `/rule?_allow_anonymous=true`;
|
||||||
|
@ViewChild('st', { static: true })
|
||||||
|
st!: STComponent;
|
||||||
|
@ViewChild('sf', { static: false })
|
||||||
|
sf!: SFComponent;
|
||||||
|
@ViewChild('auditModal', { static: false })
|
||||||
|
auditModal!: any;
|
||||||
|
schema: SFSchema = {};
|
||||||
|
columns: STColumn[] = [];
|
||||||
|
ui: SFUISchema = {};
|
||||||
|
_$expand = false;
|
||||||
|
selectedRows: any[] = [];
|
||||||
|
isLoading: boolean = false;
|
||||||
|
constructor(
|
||||||
|
public service: ContractManagementService,
|
||||||
|
private nzModalService: NzModalService,
|
||||||
|
private router: Router,
|
||||||
|
public shipperservice: ShipperBaseService,
|
||||||
|
private datePipe: DatePipe
|
||||||
|
) {}
|
||||||
|
|
||||||
|
ngOnInit(): void {
|
||||||
|
this.initST();
|
||||||
|
this.initSF();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 查询参数
|
||||||
|
*/
|
||||||
|
get reqParams() {
|
||||||
|
const params = {
|
||||||
|
...this.sf?.value
|
||||||
|
};
|
||||||
|
delete params.signTime;
|
||||||
|
delete params._$expand;
|
||||||
|
if (
|
||||||
|
this.datePipe.transform(this.sf?.value?.signTime?.[0], 'yyyy-MM-dd HH:mm:ss') &&
|
||||||
|
this.datePipe.transform(this.sf?.value?.signTime?.[1], 'yyyy-MM-dd HH:mm:ss')
|
||||||
|
) {
|
||||||
|
params.signTime = {
|
||||||
|
start: this.datePipe.transform(this.sf?.value?.signTime?.[0], 'yyyy-MM-dd HH:mm:ss'),
|
||||||
|
end: this.datePipe.transform(this.sf?.value?.signTime?.[1], 'yyyy-MM-dd HH:mm:ss')
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
this.datePipe.transform(this.sf?.value?.effectiveEndTime?.[0], 'yyyy-MM-dd HH:mm:ss') &&
|
||||||
|
this.datePipe.transform(this.sf?.value?.effectiveEndTime?.[1], 'yyyy-MM-dd HH:mm:ss')
|
||||||
|
) {
|
||||||
|
params.effectiveEndTime = {
|
||||||
|
start: this.datePipe.transform(this.sf?.value?.effectiveEndTime?.[0], 'yyyy-MM-dd HH:mm:ss'),
|
||||||
|
end: this.datePipe.transform(this.sf?.value?.effectiveEndTime?.[1], 'yyyy-MM-dd HH:mm:ss')
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
...params
|
||||||
|
};
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 初始化数据列表
|
||||||
|
*/
|
||||||
|
initST() {
|
||||||
|
this.columns = [
|
||||||
|
{
|
||||||
|
title: '合同编号',
|
||||||
|
width: '130px',
|
||||||
|
className: 'text-center',
|
||||||
|
render: 'contractCode'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '签约对象',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'signingObjectLabel'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '合同类型',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'contractTypeLabel'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '合同名称',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'contractName'
|
||||||
|
},
|
||||||
|
{ title: '网络货运人', index: 'enterpriseInfoName', width: '120px', className: 'text-center' },
|
||||||
|
{ title: '合同对象', index: 'contractObjectName', width: '120px', className: 'text-center' },
|
||||||
|
{
|
||||||
|
title: '有效期至',
|
||||||
|
className: 'text-center',
|
||||||
|
width: '120px',
|
||||||
|
index: 'effectiveEndTime'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '签署日期',
|
||||||
|
className: 'text-center',
|
||||||
|
width: '120px',
|
||||||
|
index: 'signTime'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '状态',
|
||||||
|
className: 'text-center',
|
||||||
|
width: '120px',
|
||||||
|
type: 'badge',
|
||||||
|
index: 'esignFlowStatus',
|
||||||
|
badge: {
|
||||||
|
'0': { text: '未发起', color: 'default' },
|
||||||
|
'1': { text: '待签章', color: 'default' },
|
||||||
|
'2': { text: '已生效', color: 'success' },
|
||||||
|
'3': { text: '已撤销', color: 'warning' },
|
||||||
|
'4': { text: '已作废', color: 'warning' },
|
||||||
|
'5': { text: '已过期', color: 'warning' },
|
||||||
|
'7': { text: '已拒签', color: 'warning' }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '操作',
|
||||||
|
className: 'text-center',
|
||||||
|
fixed: 'right',
|
||||||
|
width: '80px',
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
text: '签署',
|
||||||
|
iif: item => item.esignFlowStatus === '0' || item.esignFlowStatus === '1' || item.esignFlowStatus === '13',
|
||||||
|
click: item => this.service.StartTheProcessToESignById(item.id, () => this.st.load(1))
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 初始化查询表单
|
||||||
|
*/
|
||||||
|
initSF() {
|
||||||
|
this.schema = {
|
||||||
|
properties: {
|
||||||
|
_$expand: { type: 'boolean', ui: { hidden: true } },
|
||||||
|
contractCode: {
|
||||||
|
type: 'string',
|
||||||
|
title: '合同编号'
|
||||||
|
},
|
||||||
|
signingObject: {
|
||||||
|
type: 'string',
|
||||||
|
title: '签约对象',
|
||||||
|
enum: [
|
||||||
|
{ label: '全部', value: '' },
|
||||||
|
{ label: '货主', value: 1 },
|
||||||
|
{ label: '司机', value: 2 }
|
||||||
|
],
|
||||||
|
ui: {
|
||||||
|
widget: 'select',
|
||||||
|
placeholder: '请选择'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
contractType: {
|
||||||
|
title: '合同类型',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
ui: {
|
||||||
|
widget: 'dict-select',
|
||||||
|
containsAllLable: true,
|
||||||
|
params: { dictKey: 'contract:type' },
|
||||||
|
containAllLable: true
|
||||||
|
} as SFSelectWidgetSchema
|
||||||
|
},
|
||||||
|
enterpriseInfoId: {
|
||||||
|
type: 'string',
|
||||||
|
title: '网络货运人',
|
||||||
|
ui: {
|
||||||
|
widget: 'select',
|
||||||
|
placeholder: '请选择',
|
||||||
|
allowClear: true,
|
||||||
|
visibleIf: {
|
||||||
|
_$expand: (value: boolean) => value
|
||||||
|
},
|
||||||
|
asyncData: () => this.shipperservice.getNetworkFreightForwarder()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
contractObjectName: {
|
||||||
|
type: 'string',
|
||||||
|
title: '合同对象',
|
||||||
|
ui: {
|
||||||
|
visibleIf: {
|
||||||
|
_$expand: (value: boolean) => value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
signTime: {
|
||||||
|
title: '签署日期',
|
||||||
|
type: 'string',
|
||||||
|
ui: {
|
||||||
|
widget: 'custom',
|
||||||
|
visibleIf: {
|
||||||
|
_$expand: (value: boolean) => value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
effectiveEndTime: {
|
||||||
|
title: '有效期',
|
||||||
|
type: 'string',
|
||||||
|
ui: {
|
||||||
|
widget: 'custom',
|
||||||
|
visibleIf: {
|
||||||
|
_$expand: (value: boolean) => value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
esignFlowStatus: {
|
||||||
|
title: '状态',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
ui: {
|
||||||
|
widget: 'dict-select',
|
||||||
|
containsAllLable: true,
|
||||||
|
params: { dictKey: 'esign:flow:status' },
|
||||||
|
containAllLable: true,
|
||||||
|
visibleIf: {
|
||||||
|
_$expand: (value: boolean) => value
|
||||||
|
}
|
||||||
|
} as SFSelectWidgetSchema
|
||||||
|
}
|
||||||
|
},
|
||||||
|
type: 'object'
|
||||||
|
};
|
||||||
|
this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } };
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 查询字段个数
|
||||||
|
*/
|
||||||
|
get queryFieldCount(): number {
|
||||||
|
return Object.keys(this.schema?.properties || {}).length;
|
||||||
|
}
|
||||||
|
stChange(e: STChange): void {
|
||||||
|
switch (e.type) {
|
||||||
|
case 'checkbox':
|
||||||
|
this.selectedRows = e.checkbox!;
|
||||||
|
break;
|
||||||
|
case 'filter':
|
||||||
|
this.st.load();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
approval(): void {}
|
||||||
|
|
||||||
|
add(): void {}
|
||||||
|
|
||||||
|
routeTo(item: any) {
|
||||||
|
this.router.navigate(['/ticket/invoice-requested-detail/1']);
|
||||||
|
}
|
||||||
|
|
||||||
|
auditAction(item: any) {
|
||||||
|
const modal = this.nzModalService.create({
|
||||||
|
nzTitle: '审核',
|
||||||
|
nzContent: this.auditModal,
|
||||||
|
nzFooter: [
|
||||||
|
{
|
||||||
|
label: '拒绝',
|
||||||
|
type: 'default',
|
||||||
|
onClick: () => {
|
||||||
|
modal.destroy();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '通过',
|
||||||
|
type: 'primary',
|
||||||
|
onClick: () => {
|
||||||
|
modal.destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
modal.afterClose.subscribe(res => {
|
||||||
|
this.st.load();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
showReason(item: any) {
|
||||||
|
const modal = this.nzModalService.create({
|
||||||
|
nzTitle: '查看原因',
|
||||||
|
nzContent: '运单数据异常,暂时无法开票,请联系客服400-xxxx-xxxx',
|
||||||
|
nzFooter: [
|
||||||
|
{
|
||||||
|
label: '关闭',
|
||||||
|
type: 'primary',
|
||||||
|
onClick: () => {
|
||||||
|
modal.destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重置表单
|
||||||
|
*/
|
||||||
|
resetSF() {
|
||||||
|
this.sf.reset();
|
||||||
|
this._$expand = false;
|
||||||
|
this.isLoading = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 伸缩查询条件
|
||||||
|
*/
|
||||||
|
expandToggle(): void {
|
||||||
|
this._$expand = !this._$expand;
|
||||||
|
this.sf?.setValue('/_$expand', this._$expand);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,73 @@
|
|||||||
|
<!--
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2021-12-07 15:57:49
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-02-23 20:11:50
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-list\\contract-list.component.html
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<nz-card>
|
||||||
|
<div nz-row nzGutter="8">
|
||||||
|
<!-- 查询字段小于或等于3个时,不显示伸缩按钮 -->
|
||||||
|
<div nz-col nzSpan="24" *ngIf="queryFieldCount <= 4">
|
||||||
|
<sf #sf [schema]="schema" [ui]="ui" [mode]="'search'" [disabled]="!sf?.valid" [loading]="false"
|
||||||
|
(formSubmit)="st?.load(1)" (formReset)="resetSF()"></sf>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 查询字段大于3个时,根据展开状态调整布局 -->
|
||||||
|
<ng-container>
|
||||||
|
<div nz-col [nzSpan]="_$expand ? 24 : 18">
|
||||||
|
<sf #sf [schema]="schema" [ui]="ui" [compact]="true" [button]="'none'">
|
||||||
|
<ng-template sf-template="signTime" let-me let-ui="ui" let-schema="schema">
|
||||||
|
<!-- <input placeholder="请输入1-30" type="number" [ngModel]="sf.value.description3" style="width: 200px;" nz-input />
|
||||||
|
<span> 天内支付运费</span> -->
|
||||||
|
<nz-range-picker [nzShowTime]="true" [(ngModel)]="sf.value.signTime"></nz-range-picker>
|
||||||
|
</ng-template>
|
||||||
|
</sf>
|
||||||
|
</div>
|
||||||
|
<div nz-col [nzSpan]="_$expand ? 24 : 6" [class.text-right]="_$expand">
|
||||||
|
<button nz-button nzType="primary" [disabled]="!sf.valid" [nzLoading]="isLoading && st.loading"
|
||||||
|
(click)="st?.load(1)" acl [acl-ability]="['CONTRACT-INDEX-searchDetail']">查询</button>
|
||||||
|
<button nz-button (click)="resetSF()">重置</button>
|
||||||
|
<button nz-button nzType="link" (click)="expandToggle()">
|
||||||
|
{{ !_$expand ? '展开' : '收起' }}
|
||||||
|
<i nz-icon [nzType]="!_$expand ? 'down' : 'up'"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</ng-container>
|
||||||
|
</div>
|
||||||
|
</nz-card>
|
||||||
|
|
||||||
|
<nz-card class="content-box" nzBordered>
|
||||||
|
<div style="position: relative">
|
||||||
|
<nz-alert nzType="info" [nzMessage]="'当前共' + st?.total + '行记录,已选择' + selectedRows.length + '项'" nzShowIcon
|
||||||
|
[ngStyle]="{ margin: '0 0 1rem 0' }">
|
||||||
|
</nz-alert>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<st #st [data]="service.$api_listDetailed_page" [columns]="columns" [req]="{ params: reqParams }" [loading]="false"
|
||||||
|
[scroll]="{ x: '1200px', y: '370px' }" (change)="stChange($event)">
|
||||||
|
<ng-template st-row="contractCode" let-item let-index="index">
|
||||||
|
<a (click)="service.openURL(item?.contractFilePath)">{{ item?.contractCode }}</a>
|
||||||
|
<!-- <a [routerLink]="'/contract-management/index/detail/' + item.id">{{ item?.contractCode }}</a> -->
|
||||||
|
</ng-template>
|
||||||
|
<ng-template st-row="signingObject" let-item let-index="index">
|
||||||
|
<span *ngIf="item.signingObject == 0"></span>
|
||||||
|
<span></span>
|
||||||
|
</ng-template>
|
||||||
|
</st>
|
||||||
|
</nz-card>
|
||||||
|
|
||||||
|
<ng-template #auditModal>
|
||||||
|
<div nz-row nzGutter="8">
|
||||||
|
<div nz-col nzSpan="24" se-container [labelWidth]="80">
|
||||||
|
<se [col]="1" label="备注">
|
||||||
|
<textarea nz-input rows="3" placeholder="同意可以不用填写原因 ,拒绝必须说明原因"
|
||||||
|
style="width: 325px; margin-left: 14px"></textarea>
|
||||||
|
</se>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</ng-template>
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
:host::ng-deep {
|
||||||
|
.search-box {
|
||||||
|
.ant-card-body {
|
||||||
|
padding-bottom: 18px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-box {
|
||||||
|
.ant-card-body {
|
||||||
|
padding-top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nz-range-picker {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-tabs-tab-btn {
|
||||||
|
padding-left : 16px;
|
||||||
|
padding-right: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.expend-options {
|
||||||
|
margin-top: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media (min-width: 1200px) {
|
||||||
|
.expend-options {
|
||||||
|
margin-top: -40px;
|
||||||
|
z-index : -99;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,312 @@
|
|||||||
|
import { Component, OnInit, ViewChild } from '@angular/core';
|
||||||
|
import { Router } from '@angular/router';
|
||||||
|
import { STComponent, STColumn, STChange } from '@delon/abc/st';
|
||||||
|
import { SFComponent, SFSchema, SFDateWidgetSchema, SFUISchema, SFSelectWidgetSchema } from '@delon/form';
|
||||||
|
import { NzModalService } from 'ng-zorro-antd/modal';
|
||||||
|
import { ContractManagementService } from '../../services/contract-management.service';
|
||||||
|
import { DatePipe } from '@angular/common';
|
||||||
|
import { ShipperBaseService } from '@shared';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-contract-management-contract-list',
|
||||||
|
templateUrl: './contract-list.component.html',
|
||||||
|
styleUrls: ['./contract-list.component.less'],
|
||||||
|
providers: [DatePipe]
|
||||||
|
})
|
||||||
|
export class ContractManagementContractListComponent implements OnInit {
|
||||||
|
url = `/rule?_allow_anonymous=true`;
|
||||||
|
@ViewChild('st', { static: true })
|
||||||
|
st!: STComponent;
|
||||||
|
@ViewChild('sf', { static: false })
|
||||||
|
sf!: SFComponent;
|
||||||
|
@ViewChild('auditModal', { static: false })
|
||||||
|
auditModal!: any;
|
||||||
|
schema: SFSchema = {};
|
||||||
|
columns: STColumn[] = [];
|
||||||
|
ui: SFUISchema = {};
|
||||||
|
_$expand = false;
|
||||||
|
isLoading: boolean = false;
|
||||||
|
/**
|
||||||
|
* 查询参数
|
||||||
|
*/
|
||||||
|
get reqParams() {
|
||||||
|
const params = {
|
||||||
|
...this.sf?.value
|
||||||
|
};
|
||||||
|
delete params.signTime;
|
||||||
|
delete params._$expand;
|
||||||
|
if (
|
||||||
|
this.datePipe.transform(this.sf?.value?.signTime?.[0], 'yyyy-MM-dd HH:mm:ss') &&
|
||||||
|
this.datePipe.transform(this.sf?.value?.signTime?.[1], 'yyyy-MM-dd HH:mm:ss')
|
||||||
|
) {
|
||||||
|
params.signTime = {
|
||||||
|
start: this.datePipe.transform(this.sf?.value?.signTime?.[0], 'yyyy-MM-dd HH:mm:ss'),
|
||||||
|
end: this.datePipe.transform(this.sf?.value?.signTime?.[1], 'yyyy-MM-dd HH:mm:ss')
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
...params
|
||||||
|
};
|
||||||
|
}
|
||||||
|
selectedRows: any[] = [];
|
||||||
|
constructor(
|
||||||
|
public service: ContractManagementService,
|
||||||
|
private nzModalService: NzModalService,
|
||||||
|
public shipperservice: ShipperBaseService,
|
||||||
|
private router: Router,
|
||||||
|
private datePipe: DatePipe
|
||||||
|
) {}
|
||||||
|
|
||||||
|
ngOnInit(): void {
|
||||||
|
this.initST();
|
||||||
|
this.initSF();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 初始化数据列表
|
||||||
|
*/
|
||||||
|
initST() {
|
||||||
|
this.columns = [
|
||||||
|
{
|
||||||
|
title: '合同编号',
|
||||||
|
width: '130px',
|
||||||
|
className: 'text-center',
|
||||||
|
render: 'contractCode'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '签约对象',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'signingObjectLabel'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '合同类型',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'contractName'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '业务单号',
|
||||||
|
className: 'text-center',
|
||||||
|
width: '120px',
|
||||||
|
index: 'businessCode'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '签署日期',
|
||||||
|
className: 'text-center',
|
||||||
|
width: '120px',
|
||||||
|
index: 'signTime'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '状态',
|
||||||
|
className: 'text-center',
|
||||||
|
width: '120px',
|
||||||
|
type: 'badge',
|
||||||
|
index: 'esignFlowStatus',
|
||||||
|
badge: {
|
||||||
|
'0': { text: '未发起', color: 'default' },
|
||||||
|
'1': { text: '待签章', color: 'default' },
|
||||||
|
'2': { text: '已生效', color: 'success' },
|
||||||
|
'3': { text: '已撤销', color: 'warning' },
|
||||||
|
'4': { text: '已作废', color: 'warning' },
|
||||||
|
'5': { text: '已过期', color: 'warning' },
|
||||||
|
'7': { text: '已拒签', color: 'warning' }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '操作',
|
||||||
|
className: 'text-center',
|
||||||
|
fixed: 'right',
|
||||||
|
width: '80px',
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
text: '签署',
|
||||||
|
iif: item => item.esignFlowStatus === '0' || item.esignFlowStatus === '1' || item.esignFlowStatus === '13',
|
||||||
|
click: item => this.service.StartTheProcessToESignById(item.id, () => this.st.load(1))
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 初始化查询表单
|
||||||
|
*/
|
||||||
|
initSF() {
|
||||||
|
this.schema = {
|
||||||
|
properties: {
|
||||||
|
_$expand: { type: 'boolean', ui: { hidden: true } },
|
||||||
|
contractCode: {
|
||||||
|
type: 'string',
|
||||||
|
title: '合同编号'
|
||||||
|
},
|
||||||
|
businessCode: {
|
||||||
|
type: 'string',
|
||||||
|
title: '业务单号'
|
||||||
|
},
|
||||||
|
signingObject: {
|
||||||
|
type: 'string',
|
||||||
|
title: '签约对象',
|
||||||
|
enum: [
|
||||||
|
{ label: '全部', value: '' },
|
||||||
|
{ label: '货主', value: 1 },
|
||||||
|
{ label: '司机', value: 2 }
|
||||||
|
],
|
||||||
|
ui: {
|
||||||
|
widget: 'select',
|
||||||
|
placeholder: '请选择'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
contractType: {
|
||||||
|
title: '合同类型',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
ui: {
|
||||||
|
widget: 'dict-select',
|
||||||
|
containsAllLable: true,
|
||||||
|
params: { dictKey: 'contract:type' },
|
||||||
|
visibleIf: {
|
||||||
|
_$expand: (value: boolean) => value
|
||||||
|
},
|
||||||
|
containAllLable: true
|
||||||
|
} as SFSelectWidgetSchema
|
||||||
|
},
|
||||||
|
resourceType: {
|
||||||
|
title: '货源类型',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
ui: {
|
||||||
|
widget: 'dict-select',
|
||||||
|
params: { dictKey: 'goodresource:type' },
|
||||||
|
containsAllLable: true,
|
||||||
|
visibleIf: {
|
||||||
|
_$expand: (value: boolean) => value
|
||||||
|
}
|
||||||
|
} as SFSelectWidgetSchema
|
||||||
|
},
|
||||||
|
enterpriseInfoId: {
|
||||||
|
type: 'string',
|
||||||
|
title: '网络货运人',
|
||||||
|
ui: {
|
||||||
|
widget: 'select',
|
||||||
|
placeholder: '请选择',
|
||||||
|
allowClear: true,
|
||||||
|
visibleIf: {
|
||||||
|
_$expand: (value: boolean) => value
|
||||||
|
},
|
||||||
|
asyncData: () => this.shipperservice.getNetworkFreightForwarder()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
contractObjectName: {
|
||||||
|
type: 'string',
|
||||||
|
title: '合同对象',
|
||||||
|
ui: {
|
||||||
|
visibleIf: {
|
||||||
|
_$expand: (value: boolean) => value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
signTime: {
|
||||||
|
title: '签署日期',
|
||||||
|
type: 'string',
|
||||||
|
ui: {
|
||||||
|
widget: 'sl-from-to-search',
|
||||||
|
format: 'yyyy-MM-dd',
|
||||||
|
visibleIf: {
|
||||||
|
_$expand: (value: boolean) => value
|
||||||
|
}
|
||||||
|
} as SFDateWidgetSchema
|
||||||
|
},
|
||||||
|
esignFlowStatus: {
|
||||||
|
title: '状态',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
ui: {
|
||||||
|
widget: 'dict-select',
|
||||||
|
params: { dictKey: 'esign:flow:status' },
|
||||||
|
containsAllLable: true,
|
||||||
|
visibleIf: {
|
||||||
|
_$expand: (value: boolean) => value
|
||||||
|
}
|
||||||
|
} as SFSelectWidgetSchema
|
||||||
|
}
|
||||||
|
},
|
||||||
|
type: 'object'
|
||||||
|
};
|
||||||
|
this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } };
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 查询字段个数
|
||||||
|
*/
|
||||||
|
get queryFieldCount(): number {
|
||||||
|
return Object.keys(this.schema?.properties || {}).length;
|
||||||
|
}
|
||||||
|
stChange(e: STChange): void {
|
||||||
|
switch (e.type) {
|
||||||
|
case 'checkbox':
|
||||||
|
this.selectedRows = e.checkbox!;
|
||||||
|
break;
|
||||||
|
case 'filter':
|
||||||
|
this.st.load();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
routeTo(item: any) {
|
||||||
|
this.router.navigate(['/ticket/invoice-requested-detail/1']);
|
||||||
|
}
|
||||||
|
|
||||||
|
auditAction(item: any) {
|
||||||
|
const modal = this.nzModalService.create({
|
||||||
|
nzTitle: '审核',
|
||||||
|
nzContent: this.auditModal,
|
||||||
|
nzFooter: [
|
||||||
|
{
|
||||||
|
label: '拒绝',
|
||||||
|
type: 'default',
|
||||||
|
onClick: () => {
|
||||||
|
modal.destroy();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '通过',
|
||||||
|
type: 'primary',
|
||||||
|
onClick: () => {
|
||||||
|
modal.destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
modal.afterClose.subscribe(res => {
|
||||||
|
this.st.load();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
showReason(item: any) {
|
||||||
|
const modal = this.nzModalService.create({
|
||||||
|
nzTitle: '查看原因',
|
||||||
|
nzContent: '运单数据异常,暂时无法开票,请联系客服400-xxxx-xxxx',
|
||||||
|
nzFooter: [
|
||||||
|
{
|
||||||
|
label: '关闭',
|
||||||
|
type: 'primary',
|
||||||
|
onClick: () => {
|
||||||
|
modal.destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 重置表单
|
||||||
|
*/
|
||||||
|
resetSF() {
|
||||||
|
this.sf.reset();
|
||||||
|
this._$expand = false;
|
||||||
|
this.isLoading = true;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 伸缩查询条件
|
||||||
|
*/
|
||||||
|
expandToggle(): void {
|
||||||
|
this._$expand = !this._$expand;
|
||||||
|
this.sf?.setValue('/_$expand', this._$expand);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,101 @@
|
|||||||
|
<!--
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-07 13:29:57
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-02-24 10:08:28
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-partner\\contract-partner.component.html
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
-->
|
||||||
|
<nz-card>
|
||||||
|
<div nz-row nzGutter="8">
|
||||||
|
<!-- 查询字段小于或等于3个时,不显示伸缩按钮 -->
|
||||||
|
<div nz-col nzSpan="24" *ngIf="queryFieldCount <= 4">
|
||||||
|
<sf
|
||||||
|
#sf
|
||||||
|
[schema]="schema"
|
||||||
|
[ui]="ui"
|
||||||
|
[mode]="'search'"
|
||||||
|
[disabled]="!sf?.valid"
|
||||||
|
[loading]="false"
|
||||||
|
(formSubmit)="st?.load(1)"
|
||||||
|
(formReset)="resetSF()"
|
||||||
|
></sf>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 查询字段大于3个时,根据展开状态调整布局 -->
|
||||||
|
<ng-container>
|
||||||
|
<div nz-col [nzSpan]="_$expand ? 24 : 18">
|
||||||
|
<sf #sf [schema]="schema" [ui]="ui" [compact]="true" [button]="'none'">
|
||||||
|
<ng-template sf-template="signTime" let-me let-ui="ui" let-schema="schema">
|
||||||
|
<nz-range-picker [nzShowTime]="true" [(ngModel)]="sf.value.signTime"></nz-range-picker>
|
||||||
|
</ng-template>
|
||||||
|
<ng-template sf-template="effectiveEndTime" let-me let-ui="ui" let-schema="schema">
|
||||||
|
<nz-range-picker [nzShowTime]="true" [(ngModel)]="sf.value.effectiveEndTime"></nz-range-picker>
|
||||||
|
</ng-template>
|
||||||
|
</sf>
|
||||||
|
</div>
|
||||||
|
<div nz-col [nzSpan]="_$expand ? 24 : 6" [class.text-right]="_$expand">
|
||||||
|
<button
|
||||||
|
nz-button
|
||||||
|
nzType="primary"
|
||||||
|
[disabled]="!sf.valid"
|
||||||
|
[nzLoading]="service.http.loading"
|
||||||
|
(click)="st?.load(1)"
|
||||||
|
acl
|
||||||
|
[acl-ability]="['CONTRACT-INDEX-listFrame']"
|
||||||
|
>查询</button
|
||||||
|
>
|
||||||
|
<button nz-button (click)="resetSF()">重置</button>
|
||||||
|
<button nz-button nzType="link" (click)="expandToggle()">
|
||||||
|
{{ !_$expand ? '展开' : '收起' }}
|
||||||
|
<i nz-icon [nzType]="!_$expand ? 'down' : 'up'"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</ng-container>
|
||||||
|
</div>
|
||||||
|
</nz-card>
|
||||||
|
|
||||||
|
<nz-card class="content-box" nzBordered>
|
||||||
|
<div style="position: relative">
|
||||||
|
<nz-alert
|
||||||
|
nzType="info"
|
||||||
|
[nzMessage]="'当前共' + st?.total + '行记录,已选择' + selectedRows.length + '项'"
|
||||||
|
nzShowIcon
|
||||||
|
[ngStyle]="{ margin: '0 0 1rem 0' }"
|
||||||
|
>
|
||||||
|
</nz-alert>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<st
|
||||||
|
#st
|
||||||
|
[data]="service.$api_listPartner_page"
|
||||||
|
[columns]="columns"
|
||||||
|
[req]="{ method: 'POST', allInBody: true, reName: { pi: 'pageIndex', ps: 'pageSize' }, params: reqParams }"
|
||||||
|
[res]="{ reName: { list: 'data.records', total: 'data.total' } }"
|
||||||
|
[page]="{ show: true, showSize: true, pageSizes: [10, 20, 30, 50, 100, 200, 300, 500, 1000] }"
|
||||||
|
[loading]="false"
|
||||||
|
[scroll]="{ x: '1200px', y: '370px' }"
|
||||||
|
(change)="stChange($event)"
|
||||||
|
>
|
||||||
|
<ng-template st-row="contractCode" let-item let-index="index">
|
||||||
|
<a [routerLink]="'/contract-management/index/detail/' + item.id">{{ item?.contractCode }}</a>
|
||||||
|
</ng-template>
|
||||||
|
</st>
|
||||||
|
</nz-card>
|
||||||
|
|
||||||
|
<ng-template #auditModal>
|
||||||
|
<div nz-row nzGutter="8">
|
||||||
|
<div nz-col nzSpan="24" se-container [labelWidth]="80">
|
||||||
|
<se [col]="1" label="备注">
|
||||||
|
<textarea
|
||||||
|
nz-input
|
||||||
|
rows="3"
|
||||||
|
placeholder="同意可以不用填写原因 ,拒绝必须说明原因"
|
||||||
|
style="width: 325px; margin-left: 14px"
|
||||||
|
></textarea>
|
||||||
|
</se>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</ng-template>
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
:host::ng-deep {
|
||||||
|
.search-box {
|
||||||
|
.ant-card-body {
|
||||||
|
padding-bottom: 18px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-box {
|
||||||
|
.ant-card-body {
|
||||||
|
padding-top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nz-range-picker {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-tabs-tab-btn {
|
||||||
|
padding-right: 16px;
|
||||||
|
padding-left : 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.expend-options {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media (min-width: 1200px) {
|
||||||
|
.expend-options {
|
||||||
|
z-index : -99;
|
||||||
|
margin-top: -40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,318 @@
|
|||||||
|
import { DatePipe } from '@angular/common';
|
||||||
|
import { Component, OnInit, ViewChild } from '@angular/core';
|
||||||
|
import { Router } from '@angular/router';
|
||||||
|
import { STComponent, STColumn, STChange } from '@delon/abc/st';
|
||||||
|
import { SFComponent, SFSchema, SFDateWidgetSchema, SFUISchema, SFSelectWidgetSchema } from '@delon/form';
|
||||||
|
import { ShipperBaseService } from '@shared';
|
||||||
|
import { NzModalService } from 'ng-zorro-antd/modal';
|
||||||
|
import { ContractManagementService } from '../../services/contract-management.service';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-contract-management-contract-partner',
|
||||||
|
templateUrl: './contract-partner.component.html',
|
||||||
|
styleUrls: ['./contract-partner.component.less'],
|
||||||
|
providers: [DatePipe]
|
||||||
|
})
|
||||||
|
export class ContractManagementPartnerComponent implements OnInit {
|
||||||
|
url = `/rule?_allow_anonymous=true`;
|
||||||
|
@ViewChild('st', { static: true })
|
||||||
|
st!: STComponent;
|
||||||
|
@ViewChild('sf', { static: false })
|
||||||
|
sf!: SFComponent;
|
||||||
|
@ViewChild('auditModal', { static: false })
|
||||||
|
auditModal!: any;
|
||||||
|
schema: SFSchema = {};
|
||||||
|
columns: STColumn[] = [];
|
||||||
|
ui: SFUISchema = {};
|
||||||
|
_$expand = false;
|
||||||
|
selectedRows: any[] = [];
|
||||||
|
constructor(
|
||||||
|
public service: ContractManagementService,
|
||||||
|
private nzModalService: NzModalService,
|
||||||
|
private router: Router,
|
||||||
|
public shipperservice: ShipperBaseService,
|
||||||
|
private datePipe: DatePipe,
|
||||||
|
) {}
|
||||||
|
|
||||||
|
ngOnInit(): void {
|
||||||
|
this.initST();
|
||||||
|
this.initSF();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 查询参数
|
||||||
|
*/
|
||||||
|
get reqParams() {
|
||||||
|
const params = {
|
||||||
|
...this.sf?.value,
|
||||||
|
}
|
||||||
|
delete params.signTime;
|
||||||
|
delete params._$expand;
|
||||||
|
if(this.datePipe.transform(this.sf?.value?.signTime?.[0], 'yyyy-MM-dd HH:mm:ss') && this.datePipe.transform(this.sf?.value?.signTime?.[1], 'yyyy-MM-dd HH:mm:ss')) {
|
||||||
|
params.signTime = {
|
||||||
|
start: this.datePipe.transform(this.sf?.value?.signTime?.[0], 'yyyy-MM-dd HH:mm:ss'),
|
||||||
|
end: this.datePipe.transform(this.sf?.value?.signTime?.[1], 'yyyy-MM-dd HH:mm:ss'),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(this.datePipe.transform(this.sf?.value?.effectiveEndTime?.[0], 'yyyy-MM-dd HH:mm:ss') && this.datePipe.transform(this.sf?.value?.effectiveEndTime?.[1], 'yyyy-MM-dd HH:mm:ss')) {
|
||||||
|
params.effectiveEndTime = {
|
||||||
|
start: this.datePipe.transform(this.sf?.value?.effectiveEndTime?.[0], 'yyyy-MM-dd HH:mm:ss'),
|
||||||
|
end: this.datePipe.transform(this.sf?.value?.effectiveEndTime?.[1], 'yyyy-MM-dd HH:mm:ss'),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
...params
|
||||||
|
};
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 初始化数据列表
|
||||||
|
*/
|
||||||
|
initST() {
|
||||||
|
this.columns = [
|
||||||
|
{
|
||||||
|
title: '合同编号',
|
||||||
|
width: '130px',
|
||||||
|
className: 'text-center',
|
||||||
|
render: 'contractCode'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '签约对象',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'signingObjectLabel'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '合同类型',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'contractType'
|
||||||
|
},
|
||||||
|
{ title: '合同名称', index: 'contractName', width: '120px', className: 'text-center' },
|
||||||
|
{ title: '网络货运人', index: 'enterpriseInfoName', width: '120px', className: 'text-center' },
|
||||||
|
{
|
||||||
|
title: '合同对象',
|
||||||
|
className: 'text-center',
|
||||||
|
width: '120px',
|
||||||
|
index: 'contractObjectName'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '有效期至',
|
||||||
|
className: 'text-center',
|
||||||
|
width: '120px',
|
||||||
|
index: 'effectiveEndTime'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '签署日期',
|
||||||
|
className: 'text-center',
|
||||||
|
width: '120px',
|
||||||
|
index: 'signTime'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '状态',
|
||||||
|
className: 'text-center',
|
||||||
|
width: '120px',
|
||||||
|
type: 'badge',
|
||||||
|
index: 'esignFlowStatus',
|
||||||
|
badge: {
|
||||||
|
'0': { text: '未发起', color: 'default' },
|
||||||
|
'1': { text: '待签章', color: 'default' },
|
||||||
|
'2': { text: '已生效', color: 'success' },
|
||||||
|
'3': { text: '已撤销', color: 'warning' },
|
||||||
|
'4': { text: '已作废', color: 'warning' },
|
||||||
|
'5': { text: '已过期', color: 'warning' },
|
||||||
|
'7': { text: '已拒签', color: 'warning' }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '操作',
|
||||||
|
className: 'text-center',
|
||||||
|
fixed: 'right',
|
||||||
|
width: '80px',
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
text: '签署',
|
||||||
|
iif: item => item.esignFlowStatus === '0' || item.esignFlowStatus === '1' || item.esignFlowStatus === '13',
|
||||||
|
click: item => this.service.StartTheProcessToESignById(item.id, () => this.st.load(1))
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 初始化查询表单
|
||||||
|
*/
|
||||||
|
initSF() {
|
||||||
|
this.schema = {
|
||||||
|
properties: {
|
||||||
|
_$expand: { type: 'boolean', ui: { hidden: true } },
|
||||||
|
contractCode: {
|
||||||
|
type: 'string',
|
||||||
|
title: '合同编号'
|
||||||
|
},
|
||||||
|
signingObject: {
|
||||||
|
type: 'string',
|
||||||
|
title: '签约对象',
|
||||||
|
enum: [
|
||||||
|
{ label: '全部', value: '' },
|
||||||
|
{ label: '货主', value: 1 },
|
||||||
|
{ label: '司机', value: 2 }
|
||||||
|
],
|
||||||
|
ui: {
|
||||||
|
widget: 'select',
|
||||||
|
placeholder: '请选择'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
contractType: {
|
||||||
|
title: '合同类型',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
ui: {
|
||||||
|
widget: 'dict-select',
|
||||||
|
containsAllLable: true,
|
||||||
|
params: { dictKey: 'contract:type' },
|
||||||
|
containAllLable: true,
|
||||||
|
} as SFSelectWidgetSchema
|
||||||
|
},
|
||||||
|
enterpriseInfoId: {
|
||||||
|
type: 'string',
|
||||||
|
title: '网络货运人',
|
||||||
|
ui: {
|
||||||
|
widget: 'select',
|
||||||
|
placeholder: '请选择',
|
||||||
|
allowClear: true,
|
||||||
|
visibleIf: {
|
||||||
|
_$expand: (value: boolean) => value
|
||||||
|
},
|
||||||
|
asyncData: () => this.shipperservice.getNetworkFreightForwarder()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
contractObjectName: {
|
||||||
|
type: 'string',
|
||||||
|
title: '合同对象',
|
||||||
|
ui: {
|
||||||
|
visibleIf: {
|
||||||
|
_$expand: (value: boolean) => value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
signTime: {
|
||||||
|
title: '签署日期',
|
||||||
|
type: 'string',
|
||||||
|
ui: {
|
||||||
|
widget: 'custom',
|
||||||
|
visibleIf: {
|
||||||
|
_$expand: (value: boolean) => value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
effectiveEndTime: {
|
||||||
|
title: '有效期',
|
||||||
|
type: 'string',
|
||||||
|
ui: {
|
||||||
|
widget: 'custom',
|
||||||
|
visibleIf: {
|
||||||
|
_$expand: (value: boolean) => value,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
esignFlowStatus: {
|
||||||
|
title: '状态',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
ui: {
|
||||||
|
widget: 'dict-select',
|
||||||
|
containsAllLable: true,
|
||||||
|
params: { dictKey: 'esign:flow:status' },
|
||||||
|
containAllLable: true,
|
||||||
|
visibleIf: {
|
||||||
|
_$expand: (value: boolean) => value
|
||||||
|
}
|
||||||
|
} as SFSelectWidgetSchema
|
||||||
|
}
|
||||||
|
},
|
||||||
|
type: 'object'
|
||||||
|
};
|
||||||
|
this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } };
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 查询字段个数
|
||||||
|
*/
|
||||||
|
get queryFieldCount(): number {
|
||||||
|
return Object.keys(this.schema?.properties || {}).length;
|
||||||
|
}
|
||||||
|
stChange(e: STChange): void {
|
||||||
|
switch (e.type) {
|
||||||
|
case 'checkbox':
|
||||||
|
this.selectedRows = e.checkbox!;
|
||||||
|
break;
|
||||||
|
case 'filter':
|
||||||
|
this.st.load();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
approval(): void {}
|
||||||
|
|
||||||
|
add(): void {}
|
||||||
|
|
||||||
|
routeTo(item: any) {
|
||||||
|
this.router.navigate(['/ticket/invoice-requested-detail/1']);
|
||||||
|
}
|
||||||
|
|
||||||
|
auditAction(item: any) {
|
||||||
|
const modal = this.nzModalService.create({
|
||||||
|
nzTitle: '审核',
|
||||||
|
nzContent: this.auditModal,
|
||||||
|
nzFooter: [
|
||||||
|
{
|
||||||
|
label: '拒绝',
|
||||||
|
type: 'default',
|
||||||
|
onClick: () => {
|
||||||
|
modal.destroy();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '通过',
|
||||||
|
type: 'primary',
|
||||||
|
onClick: () => {
|
||||||
|
modal.destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
modal.afterClose.subscribe(res => {
|
||||||
|
this.st.load();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
showReason(item: any) {
|
||||||
|
const modal = this.nzModalService.create({
|
||||||
|
nzTitle: '查看原因',
|
||||||
|
nzContent: '运单数据异常,暂时无法开票,请联系客服400-xxxx-xxxx',
|
||||||
|
nzFooter: [
|
||||||
|
{
|
||||||
|
label: '关闭',
|
||||||
|
type: 'primary',
|
||||||
|
onClick: () => {
|
||||||
|
modal.destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重置表单
|
||||||
|
*/
|
||||||
|
resetSF() {
|
||||||
|
this.sf.reset();
|
||||||
|
this._$expand = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 伸缩查询条件
|
||||||
|
*/
|
||||||
|
expandToggle(): void {
|
||||||
|
this._$expand = !this._$expand;
|
||||||
|
this.sf?.setValue('/_$expand', this._$expand);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,57 @@
|
|||||||
|
<!--
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-05 11:01:55
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-04-15 14:07:19
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-template-detail\\contract-template-detail.component.html
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- 页头 -->
|
||||||
|
<page-header-wrapper [logo]="logo" [title]="textStatus" [content]="headerContent">
|
||||||
|
<ng-template #logo>
|
||||||
|
<button nz-button nz-tooltip nzTooltipTitle="返回上一页" (click)="goBack()">
|
||||||
|
<i nz-icon nzType="left" nzTheme="outline"></i>
|
||||||
|
</button>
|
||||||
|
</ng-template>
|
||||||
|
<ng-template #headerContent>
|
||||||
|
<div nz-row style="display: flex; justify-content: end;">
|
||||||
|
<div nz-col *ngIf="isUpdate">
|
||||||
|
<button nz-button nzSize="default" nzType="default" (click)="cancel()">取消</button>
|
||||||
|
<button class="ml-lg" nz-button nzSize="default" nzType="primary" (click)="save()">保存</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</ng-template>
|
||||||
|
</page-header-wrapper>
|
||||||
|
|
||||||
|
|
||||||
|
<nz-card >
|
||||||
|
<sf #sf [schema]="schema" [formData]="sfdata" [button]="'none'" [ui]="ui"></sf>
|
||||||
|
</nz-card>
|
||||||
|
|
||||||
|
<nz-card>
|
||||||
|
<div nz-col nzSpan="20" style="overflow: scroll">
|
||||||
|
<nz-card class="card-height" *ngIf="!isUpdate">
|
||||||
|
<div [innerHTML]="detailList?.templateContent | safehtml"></div>
|
||||||
|
</nz-card>
|
||||||
|
|
||||||
|
<nz-card class="card-height" *ngIf="isUpdate">
|
||||||
|
<div nz-row nzGutter="8">
|
||||||
|
<div class="title" style="width: 100%;">
|
||||||
|
<input style="width: 100%;" nz-input placeholder="请输入合同标题" [(ngModel)]="detailList.templateName" />
|
||||||
|
</div>
|
||||||
|
<div nz-col nzSpan="24" style="margin-top: 15px;">
|
||||||
|
<sf #sf2 mode="edit" [formData]="sfdata2" [schema]="schema2" [ui]="{ '*': { spanLabelFixed: 10, grid: { span: 24 }} }"
|
||||||
|
button="none"> </sf>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</nz-card>
|
||||||
|
</div>
|
||||||
|
</nz-card>
|
||||||
|
<!-- <div class="mb-md save-btn">
|
||||||
|
<button nz-button nzSize="large" nzType="default" (click)="cancel()">取消</button>
|
||||||
|
<button class="ml-lg" nz-button nzSize="large" nzType="primary" (click)="save()">保存</button>
|
||||||
|
</div> -->
|
||||||
@ -0,0 +1,4 @@
|
|||||||
|
.title {
|
||||||
|
padding-right: 4px;
|
||||||
|
padding-left: 14px !important;
|
||||||
|
}
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-05 11:01:55
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-01-18 17:16:31
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-template-detail\\contract-template-detail.component.spec.ts
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
import { ContractManagementTemplateDetailComponent } from './contract-template-detail.component';
|
||||||
|
|
||||||
|
describe('ContractManagementTemplateDetailComponent', () => {
|
||||||
|
let component: ContractManagementTemplateDetailComponent;
|
||||||
|
let fixture: ComponentFixture<ContractManagementTemplateDetailComponent>;
|
||||||
|
|
||||||
|
beforeEach(async(() => {
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
declarations: [ContractManagementTemplateDetailComponent],
|
||||||
|
}).compileComponents();
|
||||||
|
}));
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(ContractManagementTemplateDetailComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -0,0 +1,248 @@
|
|||||||
|
import { OnChanges } from '@angular/core';
|
||||||
|
/*
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-05 11:01:55
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-03-30 10:45:19
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-template-detail\\contract-template-detail.component.ts
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
*/
|
||||||
|
import { DatePipe } from '@angular/common';
|
||||||
|
import { Component, OnInit, ViewChild } from '@angular/core';
|
||||||
|
import { ActivatedRoute, Router } from '@angular/router';
|
||||||
|
import { SFComponent, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form';
|
||||||
|
import { ShipperBaseService } from '@shared';
|
||||||
|
import { NzModalService } from 'ng-zorro-antd/modal';
|
||||||
|
import { ContractManagementService } from '../../services/contract-management.service';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-contract-management-template-text-complaint',
|
||||||
|
templateUrl: './contract-template-detail.component.html',
|
||||||
|
styleUrls: ['./contract-template-detail.component.less'],
|
||||||
|
providers: [DatePipe]
|
||||||
|
})
|
||||||
|
export class ContractManagementTemplateTextComponent implements OnInit {
|
||||||
|
constructor(
|
||||||
|
private nzModalService: NzModalService,
|
||||||
|
public service: ContractManagementService,
|
||||||
|
public route: ActivatedRoute,
|
||||||
|
private datePipe: DatePipe,
|
||||||
|
private router: Router,
|
||||||
|
public shipperservice: ShipperBaseService
|
||||||
|
) {}
|
||||||
|
textStatus = '新建模板';
|
||||||
|
@ViewChild('sf', { static: false }) sf!: SFComponent;
|
||||||
|
schema: SFSchema = {};
|
||||||
|
@ViewChild('sf2', { static: false }) sf2!: SFComponent;
|
||||||
|
schema2: SFSchema = {};
|
||||||
|
ui!: SFUISchema;
|
||||||
|
sfdata: any;
|
||||||
|
sfdata2: any;
|
||||||
|
title: any;
|
||||||
|
Types: any;
|
||||||
|
templateHTML: any;
|
||||||
|
detailList: any = {
|
||||||
|
templateName: ''
|
||||||
|
};
|
||||||
|
isUpdate = false;
|
||||||
|
ngOnInit() {
|
||||||
|
this.initSF();
|
||||||
|
this.initSF2();
|
||||||
|
if (this.route.snapshot.queryParams.status == 1) {
|
||||||
|
// 新建
|
||||||
|
this.isUpdate = true;
|
||||||
|
} else if (this.route.snapshot.queryParams.status == 2) {
|
||||||
|
// 编辑
|
||||||
|
this.textStatus = '编辑模板';
|
||||||
|
this.isUpdate = true;
|
||||||
|
this.initData(this.service.$api_get_contractTemplate);
|
||||||
|
} else if (this.route.snapshot.queryParams.status == 3) {
|
||||||
|
// 编辑
|
||||||
|
this.textStatus = '查看模板';
|
||||||
|
this.isUpdate = false;
|
||||||
|
this.initData(this.service.$api_get_contractTemplate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
goBack() {
|
||||||
|
window.history.go(-1);
|
||||||
|
}
|
||||||
|
initSF() {
|
||||||
|
this.schema = {
|
||||||
|
properties: {
|
||||||
|
templateName: {
|
||||||
|
type: 'string',
|
||||||
|
title: '模版名称'
|
||||||
|
},
|
||||||
|
templateType: {
|
||||||
|
title: '模板类型',
|
||||||
|
type: 'string',
|
||||||
|
enum: [
|
||||||
|
{ label: '框架合同', value: 'KJ' },
|
||||||
|
{ label: '明细合同', value: 'MX' },
|
||||||
|
{ label: '合伙人合同', value: 'HHR' }
|
||||||
|
],
|
||||||
|
ui: {
|
||||||
|
widget: 'select',
|
||||||
|
placeholder: '请选择',
|
||||||
|
change: (tag: any, org: any) => {
|
||||||
|
console.log(tag);
|
||||||
|
switch (tag) {
|
||||||
|
case 'MX':
|
||||||
|
this.Types = [
|
||||||
|
{ label: '订单合同', value: '1' },
|
||||||
|
{ label: '订单补充协议', value: '2' },
|
||||||
|
{ label: '运单合同', value: '3' },
|
||||||
|
{ label: '运单补充协议', value: '4' },
|
||||||
|
{ label: '委托代收合同', value: '5' },
|
||||||
|
{ label: '电子提货单', value: '10' },
|
||||||
|
{ label: '电子卸货单', value: '11' },
|
||||||
|
];
|
||||||
|
this.sf.getProperty('/contractType')!.schema.enum = this.Types;
|
||||||
|
this.sf.getProperty('/contractType')!.widget.reset(this.Types);
|
||||||
|
this.sf.setValue('/contractType', this.Types);
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
case 'KJ':
|
||||||
|
this.Types = [
|
||||||
|
{ label: '网络货物运输服务合同', value: '6' },
|
||||||
|
{ label: '运输服务承揽合同', value: '7' }
|
||||||
|
];
|
||||||
|
this.sf.getProperty('/contractType')!.schema.enum = this.Types;
|
||||||
|
this.sf.getProperty('/contractType')!.widget.reset(this.Types);
|
||||||
|
this.sf.setValue('/contractType', this.Types);
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
case 'HHR':
|
||||||
|
this.Types = [
|
||||||
|
{ label: '企业合伙人入驻合同', value: '8' },
|
||||||
|
{ label: '个人合伙人入驻合同', value: '9' }
|
||||||
|
];
|
||||||
|
this.sf.getProperty('/contractType')!.schema.enum = this.Types;
|
||||||
|
this.sf.getProperty('/contractType')!.widget.reset(this.Types);
|
||||||
|
this.sf.setValue('/contractType', this.Types);
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
signingObject: {
|
||||||
|
type: 'string',
|
||||||
|
title: '承包商对象',
|
||||||
|
enum: [
|
||||||
|
{ label: '货主', value: '1' },
|
||||||
|
{ label: '司机', value: '2' }
|
||||||
|
],
|
||||||
|
ui: {
|
||||||
|
widget: 'select',
|
||||||
|
placeholder: '请选择'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
contractType: {
|
||||||
|
title: '合同类型',
|
||||||
|
type: 'string',
|
||||||
|
enum: this.Types,
|
||||||
|
ui: {
|
||||||
|
widget: 'select',
|
||||||
|
placeholder: '请选择'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resourceType: {
|
||||||
|
title: '货源类型',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
ui: {
|
||||||
|
widget: 'dict-select',
|
||||||
|
params: { dictKey: 'goodresource:type' },
|
||||||
|
containsAllLable: true,
|
||||||
|
visibleIf: {
|
||||||
|
templateType: value => value === 'MX'
|
||||||
|
}
|
||||||
|
} as SFSelectWidgetSchema
|
||||||
|
},
|
||||||
|
enterpriseInfoId: {
|
||||||
|
type: 'string',
|
||||||
|
title: '网络货运人',
|
||||||
|
ui: {
|
||||||
|
widget: 'select',
|
||||||
|
placeholder: '请选择',
|
||||||
|
allowClear: true,
|
||||||
|
visibleIf: {
|
||||||
|
templateType: value => value === 'KJ' || value === 'HHR'
|
||||||
|
},
|
||||||
|
asyncData: () => this.shipperservice.getNetworkFreightForwarder()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
required: ['templateName', 'templateType']
|
||||||
|
};
|
||||||
|
this.ui = {
|
||||||
|
'*': {
|
||||||
|
spanLabelFixed: 120,
|
||||||
|
grid: { span: 8 }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
initSF2(data?: any) {
|
||||||
|
this.schema2 = {
|
||||||
|
properties: {
|
||||||
|
templateContent: {
|
||||||
|
type: 'string',
|
||||||
|
title: '',
|
||||||
|
ui: {
|
||||||
|
widget: 'tinymce',
|
||||||
|
loadingTip: 'loading...',
|
||||||
|
config: {
|
||||||
|
height: 650
|
||||||
|
}
|
||||||
|
},
|
||||||
|
default: data?.agreementContent || ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
initData(url: string) {
|
||||||
|
console.log('编辑');
|
||||||
|
|
||||||
|
this.service.request(url, { id: this.route.snapshot.params.id }).subscribe(res => {
|
||||||
|
if (res) {
|
||||||
|
this.detailList = res;
|
||||||
|
this.title = this.detailList?.templateName;
|
||||||
|
this.sfdata = res;
|
||||||
|
this.sfdata2 = res;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
cancel() {
|
||||||
|
window.history.go(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
save() {
|
||||||
|
// if (!this.sf.value.templateName || !this.sf.value.templateType || !this.sf2.value.templateContent || !this.title) {
|
||||||
|
// this.service.msgSrv.error('必填参数为空,请检查再重新保存!');
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// if (this.sf.value.templateType == 'MX') {
|
||||||
|
// if (this.sf.value.contractType == '') {
|
||||||
|
// this.service.msgSrv.error('必填参数为空,请检查再重新保存!');
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
const params = {
|
||||||
|
...this.sf.value,
|
||||||
|
...this.sf2.value,
|
||||||
|
templateTitle: this.title || this.detailList.templateName
|
||||||
|
};
|
||||||
|
console.log(params);
|
||||||
|
this.service.request(this.service.$api_save_contractTemplate, params).subscribe((res: any) => {
|
||||||
|
if (res) {
|
||||||
|
this.service.msgSrv.success('保存成功!');
|
||||||
|
this.router.navigate(['/contract-management/template']);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,87 @@
|
|||||||
|
<!--
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-12 10:52:50
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-02-24 20:01:42
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-template-frame\\contract-template-frame.component.html
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- 搜索表单 -->
|
||||||
|
<nz-card>
|
||||||
|
<div nz-row nzGutter="8">
|
||||||
|
<!-- 查询字段小于或等于3个时,不显示伸缩按钮 -->
|
||||||
|
<div nz-col nzSpan="24" *ngIf="queryFieldCount <= 4">
|
||||||
|
<sf
|
||||||
|
#sf
|
||||||
|
[schema]="schema"
|
||||||
|
[ui]="ui"
|
||||||
|
[mode]="'search'"
|
||||||
|
[disabled]="!sf?.valid"
|
||||||
|
[loading]="false"
|
||||||
|
(formSubmit)="st?.load(1)"
|
||||||
|
(formReset)="resetSF()"
|
||||||
|
></sf>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 查询字段大于3个时,根据展开状态调整布局 -->
|
||||||
|
<ng-container>
|
||||||
|
<div nz-col [nzSpan]="_$expand ? 24 : 18">
|
||||||
|
<sf #sf [schema]="schema" [ui]="ui" [compact]="true" [button]="'none'">
|
||||||
|
<ng-template sf-template="signTime" let-me let-ui="ui" let-schema="schema">
|
||||||
|
<nz-range-picker [nzShowTime]="true" [(ngModel)]="sf.value.signTime"></nz-range-picker>
|
||||||
|
</ng-template>
|
||||||
|
<ng-template sf-template="effectiveEndTime" let-me let-ui="ui" let-schema="schema">
|
||||||
|
<nz-range-picker [nzShowTime]="true" [(ngModel)]="sf.value.effectiveEndTime"></nz-range-picker>
|
||||||
|
</ng-template>
|
||||||
|
</sf>
|
||||||
|
</div>
|
||||||
|
<div nz-col [nzSpan]="_$expand ? 24 : 6" [class.text-right]="_$expand">
|
||||||
|
<button
|
||||||
|
nz-button
|
||||||
|
nzType="primary"
|
||||||
|
[disabled]="!sf.valid"
|
||||||
|
[nzLoading]="service.http.loading"
|
||||||
|
(click)="st?.load(1)"
|
||||||
|
acl
|
||||||
|
[acl-ability]="['CONTRACT-INDEX-listFrame']"
|
||||||
|
>查询</button
|
||||||
|
>
|
||||||
|
<button nz-button (click)="resetSF()">重置</button>
|
||||||
|
<button nz-button nzType="link" (click)="expandToggle()">
|
||||||
|
{{ !_$expand ? '展开' : '收起' }}
|
||||||
|
<i nz-icon [nzType]="!_$expand ? 'down' : 'up'"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</ng-container>
|
||||||
|
</div>
|
||||||
|
</nz-card>
|
||||||
|
|
||||||
|
<nz-card>
|
||||||
|
<div class="NewBtn">
|
||||||
|
<button nz-button nzType="primary" (click)="creatTemplate()" acl [acl-ability]="['CONTRACT-TEMPLATE-new']"> 新建 </button>
|
||||||
|
</div>
|
||||||
|
<div style="margin-top: 15px">
|
||||||
|
<st
|
||||||
|
#st
|
||||||
|
[bordered]="true"
|
||||||
|
[data]="service.$api_get_contractTemplate_page"
|
||||||
|
[columns]="columns"
|
||||||
|
[req]="{ method: 'POST', allInBody: true, reName: { pi: 'pageIndex', ps: 'pageSize' }, params: reqParams }"
|
||||||
|
[res]="{ reName: { list: 'data.records', total: 'data.total' } }"
|
||||||
|
[page]="{ show: true, showSize: true, pageSizes: [10, 20, 30, 50, 100, 200, 300, 500, 1000] }"
|
||||||
|
[loading]="false"
|
||||||
|
>
|
||||||
|
<ng-template st-row="templateName" let-item let-index="index">
|
||||||
|
<a (click)="service.openURL(item?.contractFilePath)">{{ item.templateName }}</a>
|
||||||
|
<!-- <a (click)="view(item)">{{ item.templateName }}</a> -->
|
||||||
|
</ng-template>
|
||||||
|
<ng-template st-row="signingObject" let-item let-index="index">
|
||||||
|
<span *ngIf="item?.signingObject == 1">货主</span>
|
||||||
|
<span *ngIf="item?.signingObject == 2">司机</span>
|
||||||
|
</ng-template>
|
||||||
|
</st>
|
||||||
|
</div>
|
||||||
|
</nz-card>
|
||||||
@ -0,0 +1,4 @@
|
|||||||
|
.NewBtn{
|
||||||
|
float: right;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-05 09:45:47
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-02-24 10:25:58
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-template\\contract-template.component.spec.ts
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
import { ContractManagementTemplateFrameComponent } from './contract-template-frame.component';
|
||||||
|
|
||||||
|
describe('ContractManagementTemplateFrameComponent', () => {
|
||||||
|
let component: ContractManagementTemplateFrameComponent;
|
||||||
|
let fixture: ComponentFixture<ContractManagementTemplateFrameComponent>;
|
||||||
|
|
||||||
|
beforeEach(waitForAsync(() => {
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
declarations: [ ContractManagementTemplateFrameComponent ]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
}));
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(ContractManagementTemplateFrameComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -0,0 +1,252 @@
|
|||||||
|
import { Router } from '@angular/router';
|
||||||
|
import { Component, OnInit, ViewChild } from '@angular/core';
|
||||||
|
import { STColumn, STComponent } from '@delon/abc/st';
|
||||||
|
import { SFComponent, SFDateWidgetSchema, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form';
|
||||||
|
import { ModalHelper, _HttpClient } from '@delon/theme';
|
||||||
|
import { NzModalService } from 'ng-zorro-antd/modal';
|
||||||
|
import { map } from 'rxjs/operators';
|
||||||
|
import { ContractManagementService } from '../../services/contract-management.service';
|
||||||
|
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-contract-management-template-frame-complaint',
|
||||||
|
templateUrl: './contract-template-frame.component.html',
|
||||||
|
styleUrls: ['./contract-template-frame.component.less']
|
||||||
|
})
|
||||||
|
export class ContractManagementTemplateFrameComponent implements OnInit {
|
||||||
|
ui: SFUISchema = {};
|
||||||
|
uiView: SFUISchema = {};
|
||||||
|
schema: SFSchema = {};
|
||||||
|
schemaView: SFSchema = {};
|
||||||
|
auditMany = false;
|
||||||
|
_$expand = false;
|
||||||
|
channelId: any;
|
||||||
|
@ViewChild('st') private readonly st!: STComponent;
|
||||||
|
@ViewChild('sf', { static: false }) sf!: SFComponent;
|
||||||
|
columns: STColumn[] = [];
|
||||||
|
datass: any = [
|
||||||
|
{
|
||||||
|
one: '1',
|
||||||
|
two: '1',
|
||||||
|
three: '1',
|
||||||
|
id: 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
one: '2',
|
||||||
|
two: '2',
|
||||||
|
three: '2',
|
||||||
|
id: 2
|
||||||
|
},
|
||||||
|
];
|
||||||
|
constructor(
|
||||||
|
public service: ContractManagementService,
|
||||||
|
private modal: NzModalService,
|
||||||
|
private router: Router
|
||||||
|
) { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询参数
|
||||||
|
*/
|
||||||
|
get reqParams() {
|
||||||
|
return {
|
||||||
|
templateType: 'kj',
|
||||||
|
...this.sf?.value,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
get selectedRows() {
|
||||||
|
return this.st?.list.filter((item) => item.checked) || [];
|
||||||
|
}
|
||||||
|
ngOnInit(): void {
|
||||||
|
this.initSF();
|
||||||
|
this.initST();
|
||||||
|
this.initSTAudit();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化查询表单
|
||||||
|
*/
|
||||||
|
initSF() {
|
||||||
|
this.schema = {
|
||||||
|
properties: {
|
||||||
|
_$expand: { type: 'boolean', ui: { hidden: true } },
|
||||||
|
templateName: {
|
||||||
|
type: 'string',
|
||||||
|
title: '模板名称',
|
||||||
|
},
|
||||||
|
signingObject: {
|
||||||
|
type: 'string',
|
||||||
|
title: '签约对象',
|
||||||
|
enum: [
|
||||||
|
{ label: '全部', value: '' },
|
||||||
|
{ label: '货主', value: 1 },
|
||||||
|
{ label: '司机', value: 2 }
|
||||||
|
],
|
||||||
|
ui: {
|
||||||
|
widget: 'select',
|
||||||
|
placeholder: '请选择'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
contractType: {
|
||||||
|
title: '合同类型',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
ui: {
|
||||||
|
widget: 'dict-select',
|
||||||
|
containsAllLable: true,
|
||||||
|
params: { dictKey: 'contract:type' },
|
||||||
|
containAllLable: true,
|
||||||
|
} as SFSelectWidgetSchema
|
||||||
|
},
|
||||||
|
resourceType: {
|
||||||
|
title: '货源类型',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
ui: {
|
||||||
|
widget: 'dict-select',
|
||||||
|
params: { dictKey: 'goodresource:type' },
|
||||||
|
containsAllLable: true,
|
||||||
|
visibleIf: {
|
||||||
|
_$expand: (value: boolean) => value
|
||||||
|
},
|
||||||
|
} as SFSelectWidgetSchema,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } };
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化数据列表
|
||||||
|
*/
|
||||||
|
initST() {
|
||||||
|
this.columns = [
|
||||||
|
{
|
||||||
|
title: '合同模板名称',
|
||||||
|
className: 'text-center',
|
||||||
|
render: 'templateName'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '签约对象',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'signingObjectLabel'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '合同类型',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'contractTypeLabel'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '货源类型',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'resourceTypeLabel'
|
||||||
|
},
|
||||||
|
{ title: '创建人', index: 'createUserIdLabel', width: '120px', className: 'text-center' },
|
||||||
|
{
|
||||||
|
title: '创建时间',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'createTime',
|
||||||
|
width: '200px'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '操作',
|
||||||
|
fixed: 'right',
|
||||||
|
width: '110px',
|
||||||
|
className: 'text-center',
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
text: '编辑',
|
||||||
|
click: (_record) => this.edit(_record),
|
||||||
|
acl: { ability: ['CONTRACT-TEMPLATE-edit'] },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: '删除',
|
||||||
|
click: (_record) => this.delete(_record),
|
||||||
|
acl: { ability: ['CONTRACT-TEMPLATE-delete'] },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
initSTAudit() {
|
||||||
|
this.schemaView = {
|
||||||
|
properties: {
|
||||||
|
handleResult: {
|
||||||
|
title: '处理结果',
|
||||||
|
type: 'string',
|
||||||
|
maxLength: 50,
|
||||||
|
ui: {
|
||||||
|
placeholder: '最多不超过50字',
|
||||||
|
widget: 'textarea',
|
||||||
|
autosize: { minRows: 3, maxRows: 6 }
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
required: ['handleResult']
|
||||||
|
};
|
||||||
|
this.uiView = { '*': { spanLabelFixed: 110, grid: { span: 24 } } };
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 查询字段个数
|
||||||
|
*/
|
||||||
|
get queryFieldCount(): number {
|
||||||
|
return Object.keys(this.schema?.properties || {}).length;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 伸缩查询条件
|
||||||
|
*/
|
||||||
|
expandToggle(): void {
|
||||||
|
this._$expand = !this._$expand;
|
||||||
|
this.sf?.setValue('/_$expand', this._$expand);
|
||||||
|
}
|
||||||
|
tabChange(item: any) {
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 重置表单
|
||||||
|
*/
|
||||||
|
resetSF(): void {
|
||||||
|
this.sf.reset();
|
||||||
|
this._$expand = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
edit(value: any) {
|
||||||
|
this.router.navigate(['/contract-management/template/text/' + value.id],{
|
||||||
|
queryParams: {
|
||||||
|
status: 2
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
creatTemplate() {
|
||||||
|
this.router.navigate(['/contract-management/template/text/' + 0], {
|
||||||
|
queryParams: {
|
||||||
|
status: 1
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
goBack() {
|
||||||
|
window.history.go(-1)
|
||||||
|
}
|
||||||
|
view(value: any) {
|
||||||
|
this.router.navigate(['/contract-management/template/text/' + value.id],{
|
||||||
|
queryParams: {
|
||||||
|
status: 3
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
delete(value: any) {
|
||||||
|
this.modal.confirm({
|
||||||
|
nzTitle: '<i>删除确认</i>',
|
||||||
|
nzOnOk: () =>
|
||||||
|
this.service.request(this.service.$api_deletebatch_contractTemplate, [value.id]).subscribe(res => {
|
||||||
|
if (res) {
|
||||||
|
this.service.msgSrv.success('删除成功!');
|
||||||
|
this.st.reload()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,83 @@
|
|||||||
|
<!--
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-12 10:52:50
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-02-24 10:31:05
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-template\\contract-template.component.html
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- 搜索表单 -->
|
||||||
|
<nz-card>
|
||||||
|
<div nz-row nzGutter="8">
|
||||||
|
<!-- 查询字段小于或等于3个时,不显示伸缩按钮 -->
|
||||||
|
<div nz-col nzSpan="24" *ngIf="queryFieldCount <= 4">
|
||||||
|
<sf
|
||||||
|
#sf
|
||||||
|
[schema]="schema"
|
||||||
|
[ui]="ui"
|
||||||
|
[mode]="'search'"
|
||||||
|
[disabled]="!sf?.valid"
|
||||||
|
[loading]="false"
|
||||||
|
(formSubmit)="st?.load(1)"
|
||||||
|
(formReset)="resetSF()"
|
||||||
|
></sf>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 查询字段大于3个时,根据展开状态调整布局 -->
|
||||||
|
<ng-container>
|
||||||
|
<div nz-col [nzSpan]="_$expand ? 24 : 18">
|
||||||
|
<sf #sf [schema]="schema" [ui]="ui" [compact]="true" [button]="'none'">
|
||||||
|
<ng-template sf-template="signTime" let-me let-ui="ui" let-schema="schema">
|
||||||
|
<nz-range-picker [nzShowTime]="true" [(ngModel)]="sf.value.signTime"></nz-range-picker>
|
||||||
|
</ng-template>
|
||||||
|
<ng-template sf-template="effectiveEndTime" let-me let-ui="ui" let-schema="schema">
|
||||||
|
<nz-range-picker [nzShowTime]="true" [(ngModel)]="sf.value.effectiveEndTime"></nz-range-picker>
|
||||||
|
</ng-template>
|
||||||
|
</sf>
|
||||||
|
</div>
|
||||||
|
<div nz-col [nzSpan]="_$expand ? 24 : 6" [class.text-right]="_$expand">
|
||||||
|
<button
|
||||||
|
nz-button
|
||||||
|
nzType="primary"
|
||||||
|
[disabled]="!sf.valid"
|
||||||
|
[nzLoading]="service.http.loading"
|
||||||
|
(click)="st?.load(1)"
|
||||||
|
acl
|
||||||
|
[acl-ability]="['CONTRACT-INDEX-listFrame']"
|
||||||
|
>查询</button
|
||||||
|
>
|
||||||
|
<button nz-button (click)="resetSF()">重置</button>
|
||||||
|
<button nz-button nzType="link" (click)="expandToggle()">
|
||||||
|
{{ !_$expand ? '展开' : '收起' }}
|
||||||
|
<i nz-icon [nzType]="!_$expand ? 'down' : 'up'"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</ng-container>
|
||||||
|
</div>
|
||||||
|
</nz-card>
|
||||||
|
|
||||||
|
<nz-card>
|
||||||
|
<div class="NewBtn">
|
||||||
|
<button nz-button nzType="primary" (click)="creatTemplate()" acl [acl-ability]="['CONTRACT-TEMPLATE-new']"> 新建 </button>
|
||||||
|
</div>
|
||||||
|
<div style="margin-top: 15px">
|
||||||
|
<st
|
||||||
|
#st
|
||||||
|
[bordered]="true"
|
||||||
|
[data]="service.$api_get_contractTemplate_page"
|
||||||
|
[columns]="columns"
|
||||||
|
[req]="{ method: 'POST', allInBody: true, reName: { pi: 'pageIndex', ps: 'pageSize' }, params: reqParams }"
|
||||||
|
[res]="{ reName: { list: 'data.records', total: 'data.total' } }"
|
||||||
|
[page]="{ show: true, showSize: true, pageSizes: [10, 20, 30, 50, 100, 200, 300, 500, 1000] }"
|
||||||
|
[loading]="false"
|
||||||
|
>
|
||||||
|
<ng-template st-row="templateName" let-item let-index="index">
|
||||||
|
<a (click)="service.openURL(item?.contractFilePath)">{{ item.templateName }}</a>
|
||||||
|
<!-- <a (click)="view(item)">{{ item.templateName }}</a> -->
|
||||||
|
</ng-template>
|
||||||
|
</st>
|
||||||
|
</div>
|
||||||
|
</nz-card>
|
||||||
@ -0,0 +1,4 @@
|
|||||||
|
.NewBtn{
|
||||||
|
float: right;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-05 09:45:47
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-02-24 14:09:28
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-template-partner\\contract-template-partner.component.spec.ts
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
import { ContractManagementTemplatePartnerComponent } from './contract-template-partner.component';
|
||||||
|
|
||||||
|
describe('ContractManagementTemplatePartnerComponent', () => {
|
||||||
|
let component: ContractManagementTemplatePartnerComponent;
|
||||||
|
let fixture: ComponentFixture<ContractManagementTemplatePartnerComponent>;
|
||||||
|
|
||||||
|
beforeEach(waitForAsync(() => {
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
declarations: [ ContractManagementTemplatePartnerComponent ]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
}));
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(ContractManagementTemplatePartnerComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -0,0 +1,252 @@
|
|||||||
|
import { Router } from '@angular/router';
|
||||||
|
import { Component, OnInit, ViewChild } from '@angular/core';
|
||||||
|
import { STColumn, STComponent } from '@delon/abc/st';
|
||||||
|
import { SFComponent, SFDateWidgetSchema, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form';
|
||||||
|
import { ModalHelper, _HttpClient } from '@delon/theme';
|
||||||
|
import { NzModalService } from 'ng-zorro-antd/modal';
|
||||||
|
import { map } from 'rxjs/operators';
|
||||||
|
import { ContractManagementService } from '../../services/contract-management.service';
|
||||||
|
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-contract-management-template-partner-complaint',
|
||||||
|
templateUrl: './contract-template-partner.component.html',
|
||||||
|
styleUrls: ['./contract-template-partner.component.less']
|
||||||
|
})
|
||||||
|
export class ContractManagementTemplatePartnerComponent implements OnInit {
|
||||||
|
ui: SFUISchema = {};
|
||||||
|
uiView: SFUISchema = {};
|
||||||
|
schema: SFSchema = {};
|
||||||
|
schemaView: SFSchema = {};
|
||||||
|
auditMany = false;
|
||||||
|
_$expand = false;
|
||||||
|
channelId: any;
|
||||||
|
@ViewChild('st') private readonly st!: STComponent;
|
||||||
|
@ViewChild('sf', { static: false }) sf!: SFComponent;
|
||||||
|
columns: STColumn[] = [];
|
||||||
|
datass: any = [
|
||||||
|
{
|
||||||
|
one: '1',
|
||||||
|
two: '1',
|
||||||
|
three: '1',
|
||||||
|
id: 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
one: '2',
|
||||||
|
two: '2',
|
||||||
|
three: '2',
|
||||||
|
id: 2
|
||||||
|
},
|
||||||
|
];
|
||||||
|
constructor(
|
||||||
|
public service: ContractManagementService,
|
||||||
|
private modal: NzModalService,
|
||||||
|
private router: Router
|
||||||
|
) { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询参数
|
||||||
|
*/
|
||||||
|
get reqParams() {
|
||||||
|
return {
|
||||||
|
templateType: 'HHR',
|
||||||
|
...this.sf?.value,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
get selectedRows() {
|
||||||
|
return this.st?.list.filter((item) => item.checked) || [];
|
||||||
|
}
|
||||||
|
ngOnInit(): void {
|
||||||
|
this.initSF();
|
||||||
|
this.initST();
|
||||||
|
this.initSTAudit();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化查询表单
|
||||||
|
*/
|
||||||
|
initSF() {
|
||||||
|
this.schema = {
|
||||||
|
properties: {
|
||||||
|
_$expand: { type: 'boolean', ui: { hidden: true } },
|
||||||
|
templateName: {
|
||||||
|
type: 'string',
|
||||||
|
title: '模板名称',
|
||||||
|
},
|
||||||
|
signingObject: {
|
||||||
|
type: 'string',
|
||||||
|
title: '签约对象',
|
||||||
|
enum: [
|
||||||
|
{ label: '全部', value: '' },
|
||||||
|
{ label: '货主', value: 1 },
|
||||||
|
{ label: '司机', value: 2 }
|
||||||
|
],
|
||||||
|
ui: {
|
||||||
|
widget: 'select',
|
||||||
|
placeholder: '请选择'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
contractType: {
|
||||||
|
title: '合同类型',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
ui: {
|
||||||
|
widget: 'dict-select',
|
||||||
|
containsAllLable: true,
|
||||||
|
params: { dictKey: 'contract:type' },
|
||||||
|
containAllLable: true,
|
||||||
|
} as SFSelectWidgetSchema
|
||||||
|
},
|
||||||
|
resourceType: {
|
||||||
|
title: '货源类型',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
ui: {
|
||||||
|
widget: 'dict-select',
|
||||||
|
params: { dictKey: 'goodresource:type' },
|
||||||
|
containsAllLable: true,
|
||||||
|
visibleIf: {
|
||||||
|
_$expand: (value: boolean) => value
|
||||||
|
},
|
||||||
|
} as SFSelectWidgetSchema,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } };
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化数据列表
|
||||||
|
*/
|
||||||
|
initST() {
|
||||||
|
this.columns = [
|
||||||
|
{
|
||||||
|
title: '合同模板名称',
|
||||||
|
className: 'text-center',
|
||||||
|
render: 'templateName'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '签约对象',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'signingObjectLabel'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '合同类型',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'contractTypeLabel'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '货源类型',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'resourceTypeLabel'
|
||||||
|
},
|
||||||
|
{ title: '创建人', index: 'createUserIdLabel', width: '120px', className: 'text-center' },
|
||||||
|
{
|
||||||
|
title: '创建时间',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'createTime',
|
||||||
|
width: '200px'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '操作',
|
||||||
|
fixed: 'right',
|
||||||
|
width: '110px',
|
||||||
|
className: 'text-center',
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
text: '编辑',
|
||||||
|
click: (_record) => this.edit(_record),
|
||||||
|
acl: { ability: ['CONTRACT-TEMPLATE-edit'] },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: '删除',
|
||||||
|
click: (_record) => this.delete(_record),
|
||||||
|
acl: { ability: ['CONTRACT-TEMPLATE-delete'] },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
initSTAudit() {
|
||||||
|
this.schemaView = {
|
||||||
|
properties: {
|
||||||
|
handleResult: {
|
||||||
|
title: '处理结果',
|
||||||
|
type: 'string',
|
||||||
|
maxLength: 50,
|
||||||
|
ui: {
|
||||||
|
placeholder: '最多不超过50字',
|
||||||
|
widget: 'textarea',
|
||||||
|
autosize: { minRows: 3, maxRows: 6 }
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
required: ['handleResult']
|
||||||
|
};
|
||||||
|
this.uiView = { '*': { spanLabelFixed: 110, grid: { span: 24 } } };
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 查询字段个数
|
||||||
|
*/
|
||||||
|
get queryFieldCount(): number {
|
||||||
|
return Object.keys(this.schema?.properties || {}).length;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 伸缩查询条件
|
||||||
|
*/
|
||||||
|
expandToggle(): void {
|
||||||
|
this._$expand = !this._$expand;
|
||||||
|
this.sf?.setValue('/_$expand', this._$expand);
|
||||||
|
}
|
||||||
|
tabChange(item: any) {
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 重置表单
|
||||||
|
*/
|
||||||
|
resetSF(): void {
|
||||||
|
this.sf.reset();
|
||||||
|
this._$expand = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
edit(value: any) {
|
||||||
|
this.router.navigate(['/contract-management/template/text/' + value.id],{
|
||||||
|
queryParams: {
|
||||||
|
status: 2
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
creatTemplate() {
|
||||||
|
this.router.navigate(['/contract-management/template/text/' + 0], {
|
||||||
|
queryParams: {
|
||||||
|
status: 1
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
goBack() {
|
||||||
|
window.history.go(-1)
|
||||||
|
}
|
||||||
|
view(value: any) {
|
||||||
|
this.router.navigate(['/contract-management/template/text/' + value.id],{
|
||||||
|
queryParams: {
|
||||||
|
status: 3
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
delete(value: any) {
|
||||||
|
this.modal.confirm({
|
||||||
|
nzTitle: '<i>删除确认</i>',
|
||||||
|
nzOnOk: () =>
|
||||||
|
this.service.request(this.service.$api_deletebatch_contractTemplate, [value.id]).subscribe(res => {
|
||||||
|
if (res) {
|
||||||
|
this.service.msgSrv.success('删除成功!');
|
||||||
|
this.st.reload()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,82 @@
|
|||||||
|
<!--
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-12 10:52:50
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-02-24 10:31:05
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-template\\contract-template.component.html
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- 搜索表单 -->
|
||||||
|
<nz-card>
|
||||||
|
<div nz-row nzGutter="8">
|
||||||
|
<!-- 查询字段小于或等于3个时,不显示伸缩按钮 -->
|
||||||
|
<div nz-col nzSpan="24" *ngIf="queryFieldCount <= 4">
|
||||||
|
<sf
|
||||||
|
#sf
|
||||||
|
[schema]="schema"
|
||||||
|
[ui]="ui"
|
||||||
|
[mode]="'search'"
|
||||||
|
[disabled]="!sf?.valid"
|
||||||
|
[loading]="false"
|
||||||
|
(formSubmit)="st?.load(1)"
|
||||||
|
(formReset)="resetSF()"
|
||||||
|
></sf>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 查询字段大于3个时,根据展开状态调整布局 -->
|
||||||
|
<ng-container>
|
||||||
|
<div nz-col [nzSpan]="_$expand ? 24 : 18">
|
||||||
|
<sf #sf [schema]="schema" [ui]="ui" [compact]="true" [button]="'none'">
|
||||||
|
<ng-template sf-template="signTime" let-me let-ui="ui" let-schema="schema">
|
||||||
|
<nz-range-picker [nzShowTime]="true" [(ngModel)]="sf.value.signTime"></nz-range-picker>
|
||||||
|
</ng-template>
|
||||||
|
<ng-template sf-template="effectiveEndTime" let-me let-ui="ui" let-schema="schema">
|
||||||
|
<nz-range-picker [nzShowTime]="true" [(ngModel)]="sf.value.effectiveEndTime"></nz-range-picker>
|
||||||
|
</ng-template>
|
||||||
|
</sf>
|
||||||
|
</div>
|
||||||
|
<div nz-col [nzSpan]="_$expand ? 24 : 6" [class.text-right]="_$expand">
|
||||||
|
<button
|
||||||
|
nz-button
|
||||||
|
nzType="primary"
|
||||||
|
[disabled]="!sf.valid"
|
||||||
|
[nzLoading]="service.http.loading"
|
||||||
|
(click)="st?.load(1)"
|
||||||
|
acl
|
||||||
|
[acl-ability]="['CONTRACT-INDEX-listFrame']"
|
||||||
|
>查询</button
|
||||||
|
>
|
||||||
|
<button nz-button (click)="resetSF()">重置</button>
|
||||||
|
<button nz-button nzType="link" (click)="expandToggle()">
|
||||||
|
{{ !_$expand ? '展开' : '收起' }}
|
||||||
|
<i nz-icon [nzType]="!_$expand ? 'down' : 'up'"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</ng-container>
|
||||||
|
</div>
|
||||||
|
</nz-card>
|
||||||
|
|
||||||
|
<nz-card>
|
||||||
|
<div class="NewBtn">
|
||||||
|
<button nz-button nzType="primary" (click)="creatTemplate()" acl [acl-ability]="['CONTRACT-TEMPLATE-new']"> 新建 </button>
|
||||||
|
</div>
|
||||||
|
<div style="margin-top: 15px">
|
||||||
|
<st
|
||||||
|
#st
|
||||||
|
[bordered]="true"
|
||||||
|
[data]="service.$api_get_contractTemplate_page"
|
||||||
|
[columns]="columns"
|
||||||
|
[req]="{ method: 'POST', allInBody: true, reName: { pi: 'pageIndex', ps: 'pageSize' }, params: reqParams }"
|
||||||
|
[res]="{ reName: { list: 'data.records', total: 'data.total' } }"
|
||||||
|
[page]="{ show: true, showSize: true, pageSizes: [10, 20, 30, 50, 100, 200, 300, 500, 1000] }"
|
||||||
|
[loading]="false"
|
||||||
|
>
|
||||||
|
<ng-template st-row="templateName" let-item let-index="index">
|
||||||
|
<a (click)="view(item)">{{ item.templateName }}</a>
|
||||||
|
</ng-template>
|
||||||
|
</st>
|
||||||
|
</div>
|
||||||
|
</nz-card>
|
||||||
@ -0,0 +1,4 @@
|
|||||||
|
.NewBtn{
|
||||||
|
float: right;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-05 09:45:47
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-02-24 10:25:58
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-template\\contract-template.component.spec.ts
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
import { ContractManagementTemplateDetailComponent } from './contract-template.component';
|
||||||
|
|
||||||
|
describe('ContractManagementTemplateDetailComponent', () => {
|
||||||
|
let component: ContractManagementTemplateDetailComponent;
|
||||||
|
let fixture: ComponentFixture<ContractManagementTemplateDetailComponent>;
|
||||||
|
|
||||||
|
beforeEach(waitForAsync(() => {
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
declarations: [ ContractManagementTemplateDetailComponent ]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
}));
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(ContractManagementTemplateDetailComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -0,0 +1,252 @@
|
|||||||
|
import { Router } from '@angular/router';
|
||||||
|
import { Component, OnInit, ViewChild } from '@angular/core';
|
||||||
|
import { STColumn, STComponent } from '@delon/abc/st';
|
||||||
|
import { SFComponent, SFDateWidgetSchema, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form';
|
||||||
|
import { ModalHelper, _HttpClient } from '@delon/theme';
|
||||||
|
import { NzModalService } from 'ng-zorro-antd/modal';
|
||||||
|
import { map } from 'rxjs/operators';
|
||||||
|
import { ContractManagementService } from '../../services/contract-management.service';
|
||||||
|
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-contract-management-template-detail-complaint',
|
||||||
|
templateUrl: './contract-template.component.html',
|
||||||
|
styleUrls: ['./contract-template.component.less']
|
||||||
|
})
|
||||||
|
export class ContractManagementTemplateDetailComponent implements OnInit {
|
||||||
|
ui: SFUISchema = {};
|
||||||
|
uiView: SFUISchema = {};
|
||||||
|
schema: SFSchema = {};
|
||||||
|
schemaView: SFSchema = {};
|
||||||
|
auditMany = false;
|
||||||
|
_$expand = false;
|
||||||
|
channelId: any;
|
||||||
|
@ViewChild('st') private readonly st!: STComponent;
|
||||||
|
@ViewChild('sf', { static: false }) sf!: SFComponent;
|
||||||
|
columns: STColumn[] = [];
|
||||||
|
datass: any = [
|
||||||
|
{
|
||||||
|
one: '1',
|
||||||
|
two: '1',
|
||||||
|
three: '1',
|
||||||
|
id: 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
one: '2',
|
||||||
|
two: '2',
|
||||||
|
three: '2',
|
||||||
|
id: 2
|
||||||
|
},
|
||||||
|
];
|
||||||
|
constructor(
|
||||||
|
public service: ContractManagementService,
|
||||||
|
private modal: NzModalService,
|
||||||
|
private router: Router
|
||||||
|
) { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询参数
|
||||||
|
*/
|
||||||
|
get reqParams() {
|
||||||
|
return {
|
||||||
|
templateType: 'MX',
|
||||||
|
...this.sf?.value,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
get selectedRows() {
|
||||||
|
return this.st?.list.filter((item) => item.checked) || [];
|
||||||
|
}
|
||||||
|
ngOnInit(): void {
|
||||||
|
this.initSF();
|
||||||
|
this.initST();
|
||||||
|
this.initSTAudit();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化查询表单
|
||||||
|
*/
|
||||||
|
initSF() {
|
||||||
|
this.schema = {
|
||||||
|
properties: {
|
||||||
|
_$expand: { type: 'boolean', ui: { hidden: true } },
|
||||||
|
templateName: {
|
||||||
|
type: 'string',
|
||||||
|
title: '模板名称',
|
||||||
|
},
|
||||||
|
signingObject: {
|
||||||
|
type: 'string',
|
||||||
|
title: '签约对象',
|
||||||
|
enum: [
|
||||||
|
{ label: '全部', value: '' },
|
||||||
|
{ label: '货主', value: 1 },
|
||||||
|
{ label: '司机', value: 2 }
|
||||||
|
],
|
||||||
|
ui: {
|
||||||
|
widget: 'select',
|
||||||
|
placeholder: '请选择'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
contractType: {
|
||||||
|
title: '合同类型',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
ui: {
|
||||||
|
widget: 'dict-select',
|
||||||
|
containsAllLable: true,
|
||||||
|
params: { dictKey: 'contract:type' },
|
||||||
|
containAllLable: true,
|
||||||
|
} as SFSelectWidgetSchema
|
||||||
|
},
|
||||||
|
resourceType: {
|
||||||
|
title: '货源类型',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
ui: {
|
||||||
|
widget: 'dict-select',
|
||||||
|
params: { dictKey: 'goodresource:type' },
|
||||||
|
containsAllLable: true,
|
||||||
|
visibleIf: {
|
||||||
|
_$expand: (value: boolean) => value
|
||||||
|
},
|
||||||
|
} as SFSelectWidgetSchema,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } };
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化数据列表
|
||||||
|
*/
|
||||||
|
initST() {
|
||||||
|
this.columns = [
|
||||||
|
{
|
||||||
|
title: '合同模板名称',
|
||||||
|
className: 'text-center',
|
||||||
|
render: 'templateName'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '签约对象',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'signingObjectLabel'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '合同类型',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'contractTypeLabel'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '货源类型',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'resourceTypeLabel'
|
||||||
|
},
|
||||||
|
{ title: '创建人', index: 'createUserIdLabel', width: '120px', className: 'text-center' },
|
||||||
|
{
|
||||||
|
title: '创建时间',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'createTime',
|
||||||
|
width: '200px'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '操作',
|
||||||
|
fixed: 'right',
|
||||||
|
width: '110px',
|
||||||
|
className: 'text-center',
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
text: '编辑',
|
||||||
|
click: (_record) => this.edit(_record),
|
||||||
|
acl: { ability: ['CONTRACT-TEMPLATE-edit'] },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: '删除',
|
||||||
|
click: (_record) => this.delete(_record),
|
||||||
|
acl: { ability: ['CONTRACT-TEMPLATE-delete'] },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
initSTAudit() {
|
||||||
|
this.schemaView = {
|
||||||
|
properties: {
|
||||||
|
handleResult: {
|
||||||
|
title: '处理结果',
|
||||||
|
type: 'string',
|
||||||
|
maxLength: 50,
|
||||||
|
ui: {
|
||||||
|
placeholder: '最多不超过50字',
|
||||||
|
widget: 'textarea',
|
||||||
|
autosize: { minRows: 3, maxRows: 6 }
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
required: ['handleResult']
|
||||||
|
};
|
||||||
|
this.uiView = { '*': { spanLabelFixed: 110, grid: { span: 24 } } };
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 查询字段个数
|
||||||
|
*/
|
||||||
|
get queryFieldCount(): number {
|
||||||
|
return Object.keys(this.schema?.properties || {}).length;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 伸缩查询条件
|
||||||
|
*/
|
||||||
|
expandToggle(): void {
|
||||||
|
this._$expand = !this._$expand;
|
||||||
|
this.sf?.setValue('/_$expand', this._$expand);
|
||||||
|
}
|
||||||
|
tabChange(item: any) {
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 重置表单
|
||||||
|
*/
|
||||||
|
resetSF(): void {
|
||||||
|
this.sf.reset();
|
||||||
|
this._$expand = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
edit(value: any) {
|
||||||
|
this.router.navigate(['/contract-management/template/text/' + value.id],{
|
||||||
|
queryParams: {
|
||||||
|
status: 2
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
creatTemplate() {
|
||||||
|
this.router.navigate(['/contract-management/template/text/' + 0], {
|
||||||
|
queryParams: {
|
||||||
|
status: 1
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
goBack() {
|
||||||
|
window.history.go(-1)
|
||||||
|
}
|
||||||
|
view(value: any) {
|
||||||
|
this.router.navigate(['/contract-management/template/text/' + value.id],{
|
||||||
|
queryParams: {
|
||||||
|
status: 3
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
delete(value: any) {
|
||||||
|
this.modal.confirm({
|
||||||
|
nzTitle: '<i>删除确认</i>',
|
||||||
|
nzOnOk: () =>
|
||||||
|
this.service.request(this.service.$api_deletebatch_contractTemplate, [value.id]).subscribe(res => {
|
||||||
|
if (res) {
|
||||||
|
this.service.msgSrv.success('删除成功!');
|
||||||
|
this.st.reload(1)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
<!--
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-07 13:27:10
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-02-23 19:39:38
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\index\\index.component.html
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<page-header-wrapper title="合同管理" [tab]="tpTab">
|
||||||
|
</page-header-wrapper>
|
||||||
|
<ng-template #tpTab>
|
||||||
|
<nz-tabset [(nzSelectedIndex)]="selectedIndex">
|
||||||
|
<nz-tab nzTitle="明细合同">
|
||||||
|
<app-contract-management-contract-list></app-contract-management-contract-list>
|
||||||
|
</nz-tab>
|
||||||
|
<nz-tab nzTitle="框架合同">
|
||||||
|
<app-contract-management-contract-frame></app-contract-management-contract-frame>
|
||||||
|
</nz-tab>
|
||||||
|
<nz-tab nzTitle="合伙人合同">
|
||||||
|
<app-contract-management-contract-partner></app-contract-management-contract-partner>
|
||||||
|
</nz-tab>
|
||||||
|
</nz-tabset>
|
||||||
|
</ng-template>
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
import { SupplyManagementIndexComponent } from './index.component';
|
||||||
|
|
||||||
|
describe('SupplyManagementIndexComponent', () => {
|
||||||
|
let component: SupplyManagementIndexComponent;
|
||||||
|
let fixture: ComponentFixture<SupplyManagementIndexComponent>;
|
||||||
|
|
||||||
|
beforeEach(waitForAsync(() => {
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
declarations: [ SupplyManagementIndexComponent ]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
}));
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(SupplyManagementIndexComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-07 13:27:10
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-01-18 17:17:01
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\index\\index.component.ts
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
import { ModalHelper, _HttpClient } from '@delon/theme';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-supply-management-index',
|
||||||
|
templateUrl: './index.component.html',
|
||||||
|
})
|
||||||
|
export class ContractManagementIndexComponent implements OnInit {
|
||||||
|
selectedIndex = 0;
|
||||||
|
|
||||||
|
constructor(private http: _HttpClient, private modal: ModalHelper) { }
|
||||||
|
|
||||||
|
ngOnInit(): void { }
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,72 @@
|
|||||||
|
<!--
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-12 10:52:50
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-03-23 13:56:14
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\policy\\policy.component.html
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
-->
|
||||||
|
<page-header-wrapper title="保单管理" >
|
||||||
|
</page-header-wrapper>
|
||||||
|
<nz-card>
|
||||||
|
<div nz-row nzGutter="8">
|
||||||
|
<!-- 查询字段小于或等于3个时,不显示伸缩按钮 -->
|
||||||
|
<div nz-col nzSpan="24" *ngIf="queryFieldCount <= 4">
|
||||||
|
<sf
|
||||||
|
#sf
|
||||||
|
[schema]="schema"
|
||||||
|
[ui]="ui"
|
||||||
|
[mode]="'search'"
|
||||||
|
[disabled]="!sf?.valid"
|
||||||
|
[loading]="false"
|
||||||
|
(formSubmit)="st?.load(1)"
|
||||||
|
(formReset)="resetSF()"
|
||||||
|
></sf>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 查询字段大于3个时,根据展开状态调整布局 -->
|
||||||
|
<ng-container>
|
||||||
|
<div nz-col [nzSpan]="_$expand ? 24 : 18">
|
||||||
|
<sf #sf [schema]="schema" [ui]="ui" [compact]="true" [button]="'none'"></sf>
|
||||||
|
</div>
|
||||||
|
<div nz-col [nzSpan]="_$expand ? 24 : 6" [class.text-right]="_$expand">
|
||||||
|
<button nz-button nzType="primary" [disabled]="!sf.valid" [nzLoading]="isLoading && st.loading" (click)="st?.load(1)" acl [acl-ability]="['CONTRACT-POLICY-search']">查询</button>
|
||||||
|
<button nz-button (click)="resetSF()">重置</button>
|
||||||
|
<button nz-button nzType="link" (click)="expandToggle()">
|
||||||
|
{{ !_$expand ? '展开' : '收起' }}
|
||||||
|
<i nz-icon [nzType]="!_$expand ? 'down' : 'up'"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</ng-container>
|
||||||
|
</div>
|
||||||
|
</nz-card>
|
||||||
|
|
||||||
|
<nz-card>
|
||||||
|
<st
|
||||||
|
#st
|
||||||
|
[data]="service.$api_get_getPremiumInformationPage"
|
||||||
|
[columns]="columns"
|
||||||
|
[req]="{ method: 'POST', allInBody: true, reName: { pi: 'pageIndex', ps: 'pageSize' }, params: reqParams }"
|
||||||
|
[res]="{ reName: { list: 'data.records', total: 'data.total' } }"
|
||||||
|
[page]="{ show: true, showSize: true, pageSizes: [10, 20, 30, 50, 100, 200, 300, 500, 1000] }"
|
||||||
|
[loading]="false"
|
||||||
|
>
|
||||||
|
|
||||||
|
</st>
|
||||||
|
</nz-card>
|
||||||
|
|
||||||
|
|
||||||
|
<ng-template #promoterModal>
|
||||||
|
<div nz-row nzGutter="8">
|
||||||
|
<div nz-col nzSpan="24" se-container [labelWidth]="80">
|
||||||
|
<sv-container col="1">
|
||||||
|
<sv label="传入值" [col]="1">
|
||||||
|
{{paramValue}}
|
||||||
|
</sv>
|
||||||
|
</sv-container>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</ng-template>
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
import { ContractManagementPolicyComponent } from './policy.component';
|
||||||
|
|
||||||
|
describe('ContractManagementPolicyComponent', () => {
|
||||||
|
let component: ContractManagementPolicyComponent;
|
||||||
|
let fixture: ComponentFixture<ContractManagementPolicyComponent>;
|
||||||
|
|
||||||
|
beforeEach(waitForAsync(() => {
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
declarations: [ ContractManagementPolicyComponent ]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
}));
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(ContractManagementPolicyComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -0,0 +1,213 @@
|
|||||||
|
import { Component, OnInit, ViewChild } from '@angular/core';
|
||||||
|
import { STColumn, STComponent, STChange } from '@delon/abc/st';
|
||||||
|
import { SFComponent, SFSchema, SFDateWidgetSchema, SFUISchema } from '@delon/form';
|
||||||
|
import { ModalHelper, _HttpClient } from '@delon/theme';
|
||||||
|
import { NzModalService } from 'ng-zorro-antd/modal';
|
||||||
|
import { ContractManagementService } from '../../services/contract-management.service';
|
||||||
|
import { Router } from '@angular/router';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-contract-management-policy',
|
||||||
|
templateUrl: './policy.component.html'
|
||||||
|
})
|
||||||
|
export class ContractManagementPolicyComponent implements OnInit {
|
||||||
|
@ViewChild('st', { static: true })
|
||||||
|
st!: STComponent;
|
||||||
|
@ViewChild('sf', { static: false })
|
||||||
|
sf!: SFComponent;
|
||||||
|
@ViewChild('auditModal', { static: false })
|
||||||
|
auditModal!: any;
|
||||||
|
schema: SFSchema = {};
|
||||||
|
columns: STColumn[] = [];
|
||||||
|
ui: SFUISchema = {};
|
||||||
|
@ViewChild('promoterModal', { static: false })
|
||||||
|
promoterModal!: any;
|
||||||
|
_$expand = false;
|
||||||
|
|
||||||
|
selectedRows: any[] = [];
|
||||||
|
paramValue = '';
|
||||||
|
isLoading: boolean = false;
|
||||||
|
constructor(public service: ContractManagementService, private modal: NzModalService, private router: Router) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询参数
|
||||||
|
*/
|
||||||
|
get reqParams() {
|
||||||
|
const params: any = {
|
||||||
|
...(this.sf && this.sf.value)
|
||||||
|
};
|
||||||
|
delete params.expand;
|
||||||
|
return params;
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit(): void {
|
||||||
|
this.initST();
|
||||||
|
this.initSF();
|
||||||
|
}
|
||||||
|
|
||||||
|
openDetail(item?: any) {
|
||||||
|
this.paramValue = item?.paramValue
|
||||||
|
const modal = this.modal.create({
|
||||||
|
nzTitle: '传入值',
|
||||||
|
nzContent: this.promoterModal,
|
||||||
|
nzOnOk: () => {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
initST() {
|
||||||
|
this.columns = [
|
||||||
|
{ title: '', type: 'checkbox', width: '50px', className: 'text-center' },
|
||||||
|
{
|
||||||
|
title: '订单ID',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'billId'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '项目ID',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'enterpriseProjectId'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '保险公司',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'insuranceCompany'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '投保金额',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'insureAmount'
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
title: '保单号',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'policyNo'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '保单地址',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'policyUrl'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '保费',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'premium'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '处理消息',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'processMessage'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '处理结果',
|
||||||
|
width: '100px',
|
||||||
|
className: 'text-center',
|
||||||
|
index: 'processResult'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '操作',
|
||||||
|
width: '170px',
|
||||||
|
className: 'text-center',
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
text: '查看传入值',
|
||||||
|
click: item => {
|
||||||
|
this.openDetail(item)
|
||||||
|
},
|
||||||
|
acl: { ability: ['CONTRACT-POLICY-view'] },
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
initSF() {
|
||||||
|
this.schema = {
|
||||||
|
properties: {
|
||||||
|
_$expand: { type: 'boolean', ui: { hidden: true } },
|
||||||
|
billId: {
|
||||||
|
type: 'string',
|
||||||
|
title: '订单id'
|
||||||
|
},
|
||||||
|
enterpriseProjectId: {
|
||||||
|
type: 'string',
|
||||||
|
title: '项目id'
|
||||||
|
},
|
||||||
|
insuranceCompany: {
|
||||||
|
type: 'string',
|
||||||
|
title: '保险公司'
|
||||||
|
},
|
||||||
|
policyNo: {
|
||||||
|
type: 'string',
|
||||||
|
title: '保单号',
|
||||||
|
ui: {
|
||||||
|
visibleIf: {
|
||||||
|
_$expand: (value: boolean) => value
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
processResult: {
|
||||||
|
type: 'string',
|
||||||
|
title: '处理结果',
|
||||||
|
enum: [
|
||||||
|
{ label: '全部', value: '' },
|
||||||
|
{ label: '成功', value: 1 },
|
||||||
|
{ label: '失败', value: 2 }
|
||||||
|
],
|
||||||
|
ui: {
|
||||||
|
widget: 'select',
|
||||||
|
placeholder: '请选择',
|
||||||
|
visibleIf: {
|
||||||
|
_$expand: (value: boolean) => value
|
||||||
|
},
|
||||||
|
allowClear: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
type: 'object'
|
||||||
|
};
|
||||||
|
this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } };
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重置表单
|
||||||
|
*/
|
||||||
|
resetSF() {
|
||||||
|
this.sf.reset();
|
||||||
|
this._$expand = false;
|
||||||
|
this.isLoading = true
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 伸缩查询条件
|
||||||
|
*/
|
||||||
|
expandToggle(): void {
|
||||||
|
this._$expand = !this._$expand;
|
||||||
|
this.sf?.setValue('/_$expand', this._$expand);
|
||||||
|
}
|
||||||
|
|
||||||
|
get queryFieldCount(): number {
|
||||||
|
return Object.keys(this.schema?.properties || {}).length;
|
||||||
|
}
|
||||||
|
stChange(e: STChange): void {
|
||||||
|
switch (e.type) {
|
||||||
|
case 'checkbox':
|
||||||
|
this.selectedRows = e.checkbox!;
|
||||||
|
break;
|
||||||
|
case 'filter':
|
||||||
|
this.st.load();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
<!--
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-07 13:27:10
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-02-24 14:10:45
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\template\\template.component.html
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<page-header-wrapper title="合同模板" [tab]="tpTab">
|
||||||
|
</page-header-wrapper>
|
||||||
|
<ng-template #tpTab>
|
||||||
|
<nz-tabset [(nzSelectedIndex)]="selectedIndex">
|
||||||
|
<nz-tab nzTitle="明细合同">
|
||||||
|
<app-contract-management-template-detail-complaint></app-contract-management-template-detail-complaint>
|
||||||
|
</nz-tab>
|
||||||
|
<nz-tab nzTitle="框架合同">
|
||||||
|
<app-contract-management-template-frame-complaint></app-contract-management-template-frame-complaint>
|
||||||
|
</nz-tab>
|
||||||
|
<nz-tab nzTitle="合伙人合同">
|
||||||
|
<app-contract-management-template-partner-complaint></app-contract-management-template-partner-complaint>
|
||||||
|
</nz-tab>
|
||||||
|
</nz-tabset>
|
||||||
|
</ng-template>
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
import { ContractManagementTemplateComponent } from './template.component';
|
||||||
|
|
||||||
|
describe('ContractManagementTemplateComponent', () => {
|
||||||
|
let component: ContractManagementTemplateComponent;
|
||||||
|
let fixture: ComponentFixture<ContractManagementTemplateComponent>;
|
||||||
|
|
||||||
|
beforeEach(waitForAsync(() => {
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
declarations: [ ContractManagementTemplateComponent ]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
}));
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(ContractManagementTemplateComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-07 13:27:10
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-02-24 10:20:23
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\template\\template.component.ts
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
import { ModalHelper, _HttpClient } from '@delon/theme';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-supply-management-template',
|
||||||
|
templateUrl: './template.component.html',
|
||||||
|
})
|
||||||
|
export class ContractManagementTemplateComponent implements OnInit {
|
||||||
|
selectedIndex = 0;
|
||||||
|
|
||||||
|
constructor(private http: _HttpClient, private modal: ModalHelper) { }
|
||||||
|
|
||||||
|
ngOnInit(): void { }
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-04 21:05:49
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-02-24 10:24:16
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\contract-management-routing.module.ts
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { NgModule } from '@angular/core';
|
||||||
|
import { RouterModule, Routes } from '@angular/router';
|
||||||
|
import { ContractManagementDetailComponent } from './components/contract-detail/contract-detail.component';
|
||||||
|
import { ContractManagementContractListComponent } from './components/contract-list/contract-list.component';
|
||||||
|
import { ContractManagementPartnerComponent } from './components/contract-partner/contract-partner.component';
|
||||||
|
import { ContractManagementTemplateTextComponent } from './components/contract-template-detail/contract-template-detail.component';
|
||||||
|
import { ContractManagementIndexComponent } from './components/index/index.component';
|
||||||
|
import { ContractManagementPolicyComponent } from './components/policy/policy.component';
|
||||||
|
import { ContractManagementTemplateComponent } from './components/template/template.component';
|
||||||
|
const routes: Routes = [
|
||||||
|
{ path: 'index', component: ContractManagementIndexComponent },
|
||||||
|
{ path: 'index/detail/:id', component: ContractManagementDetailComponent },
|
||||||
|
{ path: 'template', component: ContractManagementTemplateComponent },
|
||||||
|
{ path: 'template/text/:id', component: ContractManagementTemplateTextComponent },
|
||||||
|
{ path: 'policy', component: ContractManagementPolicyComponent },
|
||||||
|
{ path: 'partner', component: ContractManagementPartnerComponent },
|
||||||
|
];
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
imports: [RouterModule.forChild(routes)],
|
||||||
|
exports: [RouterModule]
|
||||||
|
})
|
||||||
|
export class ContractManagementManagementRoutingModule {}
|
||||||
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-04 21:05:49
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-02-24 14:09:24
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\contract-management.module.ts
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { NgModule } from '@angular/core';
|
||||||
|
import { CommonModule } from '@angular/common';
|
||||||
|
import { SharedModule } from '@shared';
|
||||||
|
import { ContractManagementManagementRoutingModule } from './contract-management-routing.module';
|
||||||
|
import { ContractManagementContractListComponent } from './components/contract-list/contract-list.component';
|
||||||
|
import { ContractManagementPolicyComponent } from './components/policy/policy.component';
|
||||||
|
import { ContractManagementTemplateDetailComponent } from './components/contract-template/contract-template.component';
|
||||||
|
import { ContractManagementIndexComponent } from './components/index/index.component';
|
||||||
|
import { ContractManagementFrameComponent } from './components/contract-frame/contract-frame.component';
|
||||||
|
import { ContractManagementDetailComponent } from './components/contract-detail/contract-detail.component';
|
||||||
|
import { ContractManagementPartnerComponent } from './components/contract-partner/contract-partner.component';
|
||||||
|
import { ContractManagementTemplateComponent } from './components/template/template.component';
|
||||||
|
import { ContractManagementTemplateTextComponent } from './components/contract-template-detail/contract-template-detail.component';
|
||||||
|
import { ContractManagementTemplateFrameComponent } from './components/contract-template-frame/contract-template-frame.component';
|
||||||
|
import { ContractManagementTemplatePartnerComponent } from './components/contract-template-partner/contract-template-partner.component';
|
||||||
|
|
||||||
|
const COMPONENTS: any = [
|
||||||
|
ContractManagementContractListComponent,
|
||||||
|
ContractManagementPolicyComponent,
|
||||||
|
ContractManagementTemplateDetailComponent,
|
||||||
|
ContractManagementTemplateDetailComponent,
|
||||||
|
ContractManagementIndexComponent,
|
||||||
|
ContractManagementFrameComponent,
|
||||||
|
ContractManagementDetailComponent,
|
||||||
|
ContractManagementPartnerComponent,
|
||||||
|
ContractManagementTemplateComponent,
|
||||||
|
ContractManagementTemplateTextComponent,
|
||||||
|
ContractManagementTemplateFrameComponent,
|
||||||
|
ContractManagementTemplatePartnerComponent
|
||||||
|
];
|
||||||
|
const NOTROUTECOMPONENTS: any = [];
|
||||||
|
@NgModule({
|
||||||
|
declarations: [...COMPONENTS, ...NOTROUTECOMPONENTS],
|
||||||
|
imports: [CommonModule, ContractManagementManagementRoutingModule, SharedModule]
|
||||||
|
})
|
||||||
|
export class ContractManagementManagementModule {}
|
||||||
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* @Description :
|
||||||
|
* @Version : 1.0
|
||||||
|
* @Author : Shiming
|
||||||
|
* @Date : 2022-01-04 21:05:49
|
||||||
|
* @LastEditors : Shiming
|
||||||
|
* @LastEditTime : 2022-02-24 10:00:59
|
||||||
|
* @FilePath : \\tms-obc-web\\src\\app\\routes\\contract-management\\services\\contract-management.service.ts
|
||||||
|
* Copyright (C) 2022 huzhenhong. All rights reserved.
|
||||||
|
*/
|
||||||
|
import { Injectable, Injector } from '@angular/core';
|
||||||
|
import { BaseService } from 'src/app/shared/services';
|
||||||
|
|
||||||
|
@Injectable({
|
||||||
|
providedIn: 'root'
|
||||||
|
})
|
||||||
|
export class ContractManagementService extends BaseService {
|
||||||
|
$api_get_getPremiumInformationPage = `/api/sdc/billOperate/listPremiumInformationPage`;
|
||||||
|
// 查询投诉列表
|
||||||
|
$api_get_operate_listPage = `/api/sdc/complaint/operate/listPage`;
|
||||||
|
// 新增/更新信息
|
||||||
|
$api_save_contractTemplate = `/api/sdc/contractTemplate/save`;
|
||||||
|
// 查询合同模板表
|
||||||
|
$api_get_contractTemplate_page = `/api/sdc/contractTemplate/list/page`;
|
||||||
|
// 查询合同模板表详情
|
||||||
|
$api_get_contractTemplate = `/api/sdc/contractTemplate/get`;
|
||||||
|
// 删除合同模板
|
||||||
|
$api_deletebatch_contractTemplate = `/api/sdc/contractTemplate/deletebatch`;
|
||||||
|
|
||||||
|
// 查询明细合同
|
||||||
|
$api_listDetailed_page = `/api/sdc/contract/listDetailed/page`;
|
||||||
|
// 查询框架合同
|
||||||
|
$api_listFrame_page = `/api/sdc/contract/listFrame/page`;
|
||||||
|
// 查询合伙人合同
|
||||||
|
$api_listPartner_page = `/api/sdc/contract/listPartner/page`;
|
||||||
|
// 获取订单合同表
|
||||||
|
$api_contract_get = `/api/sdc/contract/get`;
|
||||||
|
|
||||||
|
// 发起E签宝跟据合同ID
|
||||||
|
$api_startTheProcessToESignById = `/api/sdc/contract/startTheProcessToESignById`;
|
||||||
|
constructor(public injector: Injector) {
|
||||||
|
super(injector);
|
||||||
|
}
|
||||||
|
|
||||||
|
StartTheProcessToESignById(id: string, callback: () => void) {
|
||||||
|
this.request(this.$api_startTheProcessToESignById, { id }).subscribe(res => {
|
||||||
|
if (res) {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,109 +0,0 @@
|
|||||||
<page-header [title]="'查询表格'"></page-header>
|
|
||||||
<nz-card [nzBordered]="false">
|
|
||||||
<form nz-form [nzLayout]="'inline'" (ngSubmit)="getData()" class="search__form">
|
|
||||||
<div nz-row [nzGutter]="{ xs: 8, sm: 8, md: 8, lg: 24, xl: 48, xxl: 48 }">
|
|
||||||
<div nz-col nzMd="8" nzSm="24">
|
|
||||||
<nz-form-item>
|
|
||||||
<nz-form-label nzFor="no">规则编号</nz-form-label>
|
|
||||||
<nz-form-control>
|
|
||||||
<input nz-input [(ngModel)]="q.no" name="no" placeholder="请输入" id="no" />
|
|
||||||
</nz-form-control>
|
|
||||||
</nz-form-item>
|
|
||||||
</div>
|
|
||||||
<div nz-col nzMd="8" nzSm="24">
|
|
||||||
<nz-form-item>
|
|
||||||
<nz-form-label nzFor="status">使用状态</nz-form-label>
|
|
||||||
<nz-form-control>
|
|
||||||
<nz-select [(ngModel)]="q.status" name="status" id="status" [nzPlaceHolder]="'请选择'" [nzShowSearch]="true">
|
|
||||||
<nz-option *ngFor="let i of status; let idx = index" [nzLabel]="i.text" [nzValue]="idx"></nz-option>
|
|
||||||
</nz-select>
|
|
||||||
</nz-form-control>
|
|
||||||
</nz-form-item>
|
|
||||||
</div>
|
|
||||||
<div nz-col nzMd="8" nzSm="24" *ngIf="expandForm">
|
|
||||||
<nz-form-item>
|
|
||||||
<nz-form-label nzFor="callNo">调用次数</nz-form-label>
|
|
||||||
<nz-form-control>
|
|
||||||
<input nz-input id="callNo" />
|
|
||||||
</nz-form-control>
|
|
||||||
</nz-form-item>
|
|
||||||
</div>
|
|
||||||
<div nz-col nzMd="8" nzSm="24" *ngIf="expandForm">
|
|
||||||
<nz-form-item>
|
|
||||||
<nz-form-label nzFor="updatedAt">更新日期</nz-form-label>
|
|
||||||
<nz-form-control>
|
|
||||||
<nz-date-picker id="updatedAt"></nz-date-picker>
|
|
||||||
</nz-form-control>
|
|
||||||
</nz-form-item>
|
|
||||||
</div>
|
|
||||||
<div nz-col nzMd="8" nzSm="24" *ngIf="expandForm">
|
|
||||||
<nz-form-item>
|
|
||||||
<nz-form-label nzFor="status2">使用状态</nz-form-label>
|
|
||||||
<nz-form-control>
|
|
||||||
<nz-select [nzPlaceHolder]="'请选择'" nzId="status2" [nzShowSearch]="true">
|
|
||||||
<nz-option *ngFor="let i of status; let idx = index" [nzLabel]="i.text" [nzValue]="idx"></nz-option>
|
|
||||||
</nz-select>
|
|
||||||
</nz-form-control>
|
|
||||||
</nz-form-item>
|
|
||||||
</div>
|
|
||||||
<div nz-col nzMd="8" nzSm="24" *ngIf="expandForm">
|
|
||||||
<nz-form-item>
|
|
||||||
<nz-form-label nzFor="status3">使用状态</nz-form-label>
|
|
||||||
<nz-form-control>
|
|
||||||
<nz-select [nzPlaceHolder]="'请选择'" nzId="status3" [nzShowSearch]="true">
|
|
||||||
<nz-option *ngFor="let i of status; let idx = index" [nzLabel]="i.text" [nzValue]="idx"></nz-option>
|
|
||||||
</nz-select>
|
|
||||||
</nz-form-control>
|
|
||||||
</nz-form-item>
|
|
||||||
</div>
|
|
||||||
<div nz-col [nzSpan]="expandForm ? 24 : 8" [class.text-right]="expandForm">
|
|
||||||
<button nz-button type="submit" [nzType]="'primary'" [nzLoading]="loading">查询</button>
|
|
||||||
<button nz-button type="reset" (click)="reset()" class="mx-sm">重置</button>
|
|
||||||
<a (click)="expandForm = !expandForm">
|
|
||||||
{{ expandForm ? '收起' : '展开' }}
|
|
||||||
<i nz-icon [nzType]="expandForm ? 'up' : 'down'"></i>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
<button nz-button (click)="add(modalContent)" [nzType]="'primary'">
|
|
||||||
<i nz-icon nzType="plus"></i>
|
|
||||||
<span>新建</span>
|
|
||||||
</button>
|
|
||||||
<ng-container *ngIf="selectedRows.length > 0">
|
|
||||||
<button nz-button>批量操作</button>
|
|
||||||
<button nz-button nz-dropdown [nzDropdownMenu]="batchMenu" nzPlacement="bottomLeft">
|
|
||||||
更多操作
|
|
||||||
<i nz-icon nzType="down"></i>
|
|
||||||
</button>
|
|
||||||
<nz-dropdown-menu #batchMenu="nzDropdownMenu">
|
|
||||||
<ul nz-menu>
|
|
||||||
<li nz-menu-item (click)="remove()">删除</li>
|
|
||||||
<li nz-menu-item (click)="approval()">批量审批</li>
|
|
||||||
</ul>
|
|
||||||
</nz-dropdown-menu>
|
|
||||||
</ng-container>
|
|
||||||
<div class="my-md">
|
|
||||||
<nz-alert [nzType]="'info'" [nzShowIcon]="true" [nzMessage]="message">
|
|
||||||
<ng-template #message>
|
|
||||||
已选择
|
|
||||||
<strong class="text-primary">{{ selectedRows.length }}</strong> 项 服务调用总计 <strong>{{ totalCallNo
|
|
||||||
}}</strong> 万
|
|
||||||
<a *ngIf="totalCallNo > 0" (click)="st.clearCheck()" class="ml-lg">清空</a>
|
|
||||||
</ng-template>
|
|
||||||
</nz-alert>
|
|
||||||
</div>
|
|
||||||
<st #st [columns]="columns" [data]="data" [loading]="loading" (change)="stChange($event)">
|
|
||||||
<ng-template st-row="status" let-i>
|
|
||||||
<nz-badge [nzStatus]="i.statusType" [nzText]="i.statusText"></nz-badge>
|
|
||||||
</ng-template>
|
|
||||||
</st>
|
|
||||||
</nz-card>
|
|
||||||
<ng-template #modalContent>
|
|
||||||
<nz-form-item>
|
|
||||||
<nz-form-label nzFor="no">描述</nz-form-label>
|
|
||||||
<nz-form-control>
|
|
||||||
<input nz-input [(ngModel)]="description" name="description" placeholder="请输入" id="no" />
|
|
||||||
</nz-form-control>
|
|
||||||
</nz-form-item>
|
|
||||||
</ng-template>
|
|
||||||
@ -1,6 +0,0 @@
|
|||||||
@import '~@delon/theme/index';
|
|
||||||
|
|
||||||
:host {
|
|
||||||
::ng-deep {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@ -1,166 +1,8 @@
|
|||||||
import { Component, ChangeDetectionStrategy, ChangeDetectorRef, TemplateRef, ViewChild } from '@angular/core';
|
import { Component } from '@angular/core';
|
||||||
import { STComponent, STColumn, STData, STChange } from '@delon/abc/st';
|
|
||||||
import { _HttpClient } from '@delon/theme';
|
|
||||||
import { NzSafeAny } from 'ng-zorro-antd/core/types';
|
|
||||||
import { NzMessageService } from 'ng-zorro-antd/message';
|
|
||||||
import { NzModalService } from 'ng-zorro-antd/modal';
|
|
||||||
import { map, tap } from 'rxjs/operators';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-dashboard',
|
selector: 'app-dashboard',
|
||||||
templateUrl: './dashboard.component.html',
|
templateUrl: './dashboard.component.html',
|
||||||
styleUrls: ['./dashboard.component.less'],
|
styleUrls: ['./dashboard.component.less']
|
||||||
changeDetection: ChangeDetectionStrategy.OnPush
|
|
||||||
})
|
})
|
||||||
export class DashboardComponent {
|
export class DashboardComponent {}
|
||||||
q: {
|
|
||||||
pi: number;
|
|
||||||
ps: number;
|
|
||||||
no: string;
|
|
||||||
sorter: string;
|
|
||||||
status: number | null;
|
|
||||||
statusList: NzSafeAny[];
|
|
||||||
} = {
|
|
||||||
pi: 1,
|
|
||||||
ps: 10,
|
|
||||||
no: '',
|
|
||||||
sorter: '',
|
|
||||||
status: null,
|
|
||||||
statusList: []
|
|
||||||
};
|
|
||||||
data: any[] = [];
|
|
||||||
loading = false;
|
|
||||||
status = [
|
|
||||||
{ index: 0, text: '关闭', value: false, type: 'default', checked: false },
|
|
||||||
{
|
|
||||||
index: 1,
|
|
||||||
text: '运行中',
|
|
||||||
value: false,
|
|
||||||
type: 'processing',
|
|
||||||
checked: false
|
|
||||||
},
|
|
||||||
{ index: 2, text: '已上线', value: false, type: 'success', checked: false },
|
|
||||||
{ index: 3, text: '异常', value: false, type: 'error', checked: false }
|
|
||||||
];
|
|
||||||
@ViewChild('st', { static: true })
|
|
||||||
st!: STComponent;
|
|
||||||
columns: STColumn[] = [
|
|
||||||
{ title: '', index: 'key', type: 'checkbox' },
|
|
||||||
{ title: '规则编号', index: 'no' },
|
|
||||||
{ title: '描述', index: 'description' },
|
|
||||||
{
|
|
||||||
title: '服务调用次数',
|
|
||||||
index: 'callNo',
|
|
||||||
type: 'number',
|
|
||||||
format: item => `${item.callNo} 万`,
|
|
||||||
sort: {
|
|
||||||
compare: (a, b) => a.callNo - b.callNo
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '状态',
|
|
||||||
index: 'status',
|
|
||||||
render: 'status',
|
|
||||||
filter: {
|
|
||||||
menus: this.status,
|
|
||||||
fn: (filter, record) => record.status === filter.index
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '更新时间',
|
|
||||||
index: 'updatedAt',
|
|
||||||
type: 'date',
|
|
||||||
sort: {
|
|
||||||
compare: (a, b) => a.updatedAt - b.updatedAt
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '操作',
|
|
||||||
buttons: [
|
|
||||||
{
|
|
||||||
text: '配置',
|
|
||||||
click: item => this.msg.success(`配置${item.no}`)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: '订阅警报',
|
|
||||||
click: item => this.msg.success(`订阅警报${item.no}`)
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
];
|
|
||||||
selectedRows: STData[] = [];
|
|
||||||
description = '';
|
|
||||||
totalCallNo = 0;
|
|
||||||
expandForm = false;
|
|
||||||
|
|
||||||
constructor(private http: _HttpClient, public msg: NzMessageService, private modalSrv: NzModalService, private cdr: ChangeDetectorRef) {}
|
|
||||||
|
|
||||||
ngOnInit(): void {
|
|
||||||
this.getData();
|
|
||||||
}
|
|
||||||
|
|
||||||
getData(): void {
|
|
||||||
this.loading = true;
|
|
||||||
this.q.statusList = this.status.filter(w => w.checked).map(item => item.index);
|
|
||||||
if (this.q.status !== null && this.q.status > -1) {
|
|
||||||
this.q.statusList.push(this.q.status);
|
|
||||||
}
|
|
||||||
this.http
|
|
||||||
.get('/rule?_allow_anonymous=true', this.q)
|
|
||||||
.pipe(
|
|
||||||
map((list: Array<{ status: number; statusText: string; statusType: string }>) =>
|
|
||||||
list.map(i => {
|
|
||||||
const statusItem = this.status[i.status];
|
|
||||||
i.statusText = statusItem.text;
|
|
||||||
i.statusType = statusItem.type;
|
|
||||||
return i;
|
|
||||||
})
|
|
||||||
),
|
|
||||||
tap(() => (this.loading = false))
|
|
||||||
)
|
|
||||||
.subscribe(res => {
|
|
||||||
this.data = res;
|
|
||||||
this.cdr.detectChanges();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
stChange(e: STChange): void {
|
|
||||||
switch (e.type) {
|
|
||||||
case 'checkbox':
|
|
||||||
this.selectedRows = e.checkbox!;
|
|
||||||
this.totalCallNo = this.selectedRows.reduce((total, cv) => total + cv.callNo, 0);
|
|
||||||
this.cdr.detectChanges();
|
|
||||||
break;
|
|
||||||
case 'filter':
|
|
||||||
this.getData();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
remove(): void {
|
|
||||||
this.http.delete('/rule', { nos: this.selectedRows.map(i => i.no).join(',') }).subscribe(() => {
|
|
||||||
this.getData();
|
|
||||||
this.st.clearCheck();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
approval(): void {
|
|
||||||
this.msg.success(`审批了 ${this.selectedRows.length} 笔`);
|
|
||||||
}
|
|
||||||
|
|
||||||
add(tpl: TemplateRef<{}>): void {
|
|
||||||
this.modalSrv.create({
|
|
||||||
nzTitle: '新建规则',
|
|
||||||
nzContent: tpl,
|
|
||||||
nzOnOk: () => {
|
|
||||||
this.loading = true;
|
|
||||||
this.http.post('/rule', { description: this.description }).subscribe(() => this.getData());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
reset(): void {
|
|
||||||
// wait form reset updated finished
|
|
||||||
setTimeout(() => this.getData());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@ -0,0 +1,58 @@
|
|||||||
|
<!-- 页头 -->
|
||||||
|
<page-header-wrapper [title]="'业务报表'"></page-header-wrapper>
|
||||||
|
<nz-card nzTitle="运多星平台业务情况" [nzExtra]="extraTemplate">
|
||||||
|
<ng-template #extraTemplate>
|
||||||
|
<div class="chooseBox">
|
||||||
|
<button nz-button nzType="primary" (click)="exportFun()">导出</button>
|
||||||
|
<div class="timeBox">
|
||||||
|
<nz-radio-group [(ngModel)]="mode" nzButtonStyle="solid" (ngModelChange)="changeData()" acl [acl-ability]="['busiindex-tabel']">
|
||||||
|
<label nz-radio-button nzValue="year">年</label>
|
||||||
|
<label nz-radio-button nzValue="month">月</label>
|
||||||
|
<label nz-radio-button nzValue="date">日</label>
|
||||||
|
<label nz-radio-button nzValue="define">自定义</label>
|
||||||
|
</nz-radio-group>
|
||||||
|
<div class="dateBox">
|
||||||
|
<nz-date-picker [(ngModel)]="date" [nzMode]="mode" [nzFormat]="dateFormat" *ngIf="mode !== 'define'" [nzDisabledDate]="disabledDate" (ngModelChange)="onChange($event)"></nz-date-picker>
|
||||||
|
<nz-range-picker [(ngModel)]="defineDate" [nzFormat]="dateFormat" *ngIf="mode === 'define'" [nzDisabledDate]="disabledDate" (ngModelChange)="onChange($event)"></nz-range-picker>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</ng-template>
|
||||||
|
<st #st multiSort [columns]="columns" [ps]="20" [data]="service.$api_listPerformanceReportPage"
|
||||||
|
[req]="{ method: 'POST', allInBody: true, reName: { pi: 'pageIndex', ps: 'pageSize' }, params: reqParams }"
|
||||||
|
[scroll]="{ x: '1200px' }" [res]="{ reName: { list: 'data.records', total: 'data.total' } }"
|
||||||
|
[page]="{ show: true, showSize: true, pageSizes: [20, 50, 100] }"></st>
|
||||||
|
</nz-card>
|
||||||
|
<nz-card nzTitle="业绩报表" [nzExtra]="extraTemplate01">
|
||||||
|
<ng-template #extraTemplate01>
|
||||||
|
<div class="chooseBox">
|
||||||
|
<div class="timeBox">
|
||||||
|
<nz-radio-group [(ngModel)]="modeNext" nzButtonStyle="solid" (ngModelChange)="changeDataNext()" acl [acl-ability]="['busiindex-report']">
|
||||||
|
<label nz-radio-button nzValue="year">年</label>
|
||||||
|
<label nz-radio-button nzValue="month">月</label>
|
||||||
|
</nz-radio-group>
|
||||||
|
<div class="dateBox">
|
||||||
|
<nz-date-picker [(ngModel)]="dateNext" [nzDisabledDate]="disabledDate" [nzMode]="modeNext" (ngModelChange)="onChangeNext($event)"></nz-date-picker>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</ng-template>
|
||||||
|
|
||||||
|
<div nz-row [nzGutter]="64">
|
||||||
|
<div nz-col class="gutter-row" [nzSpan]="12">
|
||||||
|
<div class="title">
|
||||||
|
<div class="box" style="background-color: #3ba1ff;"></div> 环比(%)
|
||||||
|
</div>
|
||||||
|
<!-- <g2-custom delay="100" (render)="render($event)"></g2-custom> -->
|
||||||
|
<!-- <app-busitable-curve></app-busitable-curve> -->
|
||||||
|
<app-busitable-curve #curve [chartData]="chartData.chainRatio"></app-busitable-curve>
|
||||||
|
</div>
|
||||||
|
<div nz-col class="gutter-row" [nzSpan]="12">
|
||||||
|
<div class="title">
|
||||||
|
<div class="box" style="background-color: #f59a23;"></div> 业绩量(元)
|
||||||
|
</div>
|
||||||
|
<app-busitable-pillar #pillar [chartData]="chartData.performance"></app-busitable-pillar>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</nz-card>
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
.chooseBox{
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
.timeBox{
|
||||||
|
display: flex;
|
||||||
|
margin: 0 0 0 10px;
|
||||||
|
}
|
||||||
|
.dateBox{
|
||||||
|
display: inline-block;
|
||||||
|
margin: 0 0 0 10px;
|
||||||
|
}
|
||||||
|
.title{
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
.box{
|
||||||
|
width: 8px;
|
||||||
|
height: 8px;
|
||||||
|
margin-right: 10px;
|
||||||
|
border-radius: 100px;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
import { DatatableBusiindexComponent } from './busiindex.component';
|
||||||
|
|
||||||
|
describe('DatatableBusiindexComponent', () => {
|
||||||
|
let component: DatatableBusiindexComponent;
|
||||||
|
let fixture: ComponentFixture<DatatableBusiindexComponent>;
|
||||||
|
|
||||||
|
beforeEach(waitForAsync(() => {
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
declarations: [ DatatableBusiindexComponent ]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
}));
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(DatatableBusiindexComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -0,0 +1,148 @@
|
|||||||
|
import { Component, OnInit, ViewChild, NgZone } from '@angular/core';
|
||||||
|
import { STColumn, STComponent } from '@delon/abc/st';
|
||||||
|
import { DatePipe, _HttpClient } from '@delon/theme';
|
||||||
|
import { differenceInCalendarDays } from 'date-fns';
|
||||||
|
import { DataService } from '../../../services/data.service';
|
||||||
|
import { BusitablePillarComponent } from '../pillar/pillar.component';
|
||||||
|
import { BusitableCurveComponent } from './curve/curve.component';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-datatable-busiindex',
|
||||||
|
templateUrl: './busiindex.component.html',
|
||||||
|
styleUrls: ['./busiindex.component.less'],
|
||||||
|
providers: [DatePipe]
|
||||||
|
|
||||||
|
})
|
||||||
|
export class DatatableBusiindexComponent implements OnInit {
|
||||||
|
@ViewChild('st') private readonly st!: STComponent;
|
||||||
|
@ViewChild('curve') private readonly curve!: BusitableCurveComponent;
|
||||||
|
@ViewChild('pillar') private readonly pillar!: BusitablePillarComponent;
|
||||||
|
type = 1;
|
||||||
|
mode = 'year';
|
||||||
|
date: any = null;
|
||||||
|
time: any = ['2022-01-01 00:00:00']
|
||||||
|
defineDate = [];
|
||||||
|
dateNext: any = null;
|
||||||
|
modeNext = 'year';
|
||||||
|
timeNext: any = ['2022-01-01 00:00:00']
|
||||||
|
dateFormat = 'yyyy';
|
||||||
|
today = new Date();
|
||||||
|
chartData: any = {}
|
||||||
|
|
||||||
|
columns: STColumn[] = [
|
||||||
|
{ title: '运营主体', index: 'networkTransporterName', className: 'text-center' },
|
||||||
|
{ title: '合伙人数', index: 'partnerNumber', className: 'text-center' },
|
||||||
|
{ title: '客户数', index: 'enterpriseNumbe', className: 'text-center' },
|
||||||
|
{ title: '订单数', index: 'zsl', className: 'text-center' },
|
||||||
|
{ title: '客户预存款', index: 'czcgje', className: 'text-right', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.czcgje }) } },
|
||||||
|
{ title: '业绩量', index: 'yisje', className: 'text-center' },
|
||||||
|
{ title: '已收附加费', index: 'yisfjf', className: 'text-right', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yisfjf }) } },
|
||||||
|
{ title: '平均附加费率', index: 'fjfl', className: 'text-center',format: (item)=> {
|
||||||
|
return item.fjfl + '%'
|
||||||
|
} },
|
||||||
|
{ title: '已开票金额', index: 'ykpje', className: 'text-right', type: 'widget', widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.ykpje }) } },
|
||||||
|
];
|
||||||
|
/**
|
||||||
|
* 查询参数
|
||||||
|
*/
|
||||||
|
get reqParams() {
|
||||||
|
if(this.mode === 'year') {
|
||||||
|
this.type = 1
|
||||||
|
} else if(this.mode === 'month') {
|
||||||
|
this.type = 2
|
||||||
|
} else if(this.mode === 'date') {
|
||||||
|
this.type = 3
|
||||||
|
} else {
|
||||||
|
this.type = 4
|
||||||
|
}
|
||||||
|
let params: any = {
|
||||||
|
time: this.time,
|
||||||
|
type: this.type
|
||||||
|
};
|
||||||
|
|
||||||
|
delete params._$expand;
|
||||||
|
return { ...params };
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(public service: DataService, private datePipe: DatePipe, private ngZone: NgZone) { }
|
||||||
|
ngOnInit(): void {
|
||||||
|
this.initData()
|
||||||
|
}
|
||||||
|
initData(flag?: boolean){
|
||||||
|
let type = 1
|
||||||
|
if(this.mode === 'year') {
|
||||||
|
type = 1
|
||||||
|
} else if(this.mode === 'month') {
|
||||||
|
type = 2
|
||||||
|
}
|
||||||
|
if(this.modeNext === 'year') {
|
||||||
|
type = 1
|
||||||
|
} else if(this.modeNext === 'month') {
|
||||||
|
type = 2
|
||||||
|
}
|
||||||
|
const params: any = {
|
||||||
|
time: this.timeNext,
|
||||||
|
type
|
||||||
|
};
|
||||||
|
this.service.request(this.service.$api_performanceReportHistogram, params).subscribe(res => {
|
||||||
|
if (res) {
|
||||||
|
this.chartData = res
|
||||||
|
if(flag) {
|
||||||
|
this.pillar.reRender()
|
||||||
|
this.curve.reRender()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
changeData(){
|
||||||
|
if(this.mode === 'year') {
|
||||||
|
this.dateFormat = 'yyyy'
|
||||||
|
} else if(this.mode === 'month') {
|
||||||
|
this.dateFormat = 'yyyy-MM'
|
||||||
|
} else {
|
||||||
|
this.dateFormat = 'yyyy-MM-dd'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onChange(result: any) {
|
||||||
|
if(this.mode === 'year') {
|
||||||
|
this.time = [this.datePipe.transform(this.date, 'yyyy') + '-01-01 00:00:00']
|
||||||
|
} else if(this.mode === 'month') {
|
||||||
|
this.time = [this.datePipe.transform(this.date, 'yyyy-MM') + '-01 00:00:00']
|
||||||
|
} else if(this.mode === 'date') {
|
||||||
|
this.time = [this.datePipe.transform(this.date, 'yyyy-MM-dd') + ' 00:00:00']
|
||||||
|
} else{
|
||||||
|
this.time = [this.datePipe.transform(this.defineDate[0], 'yyyy-MM-dd') + ' 00:00:00', this.datePipe.transform(this.defineDate[1], 'yyyy-MM-dd') + ' 00:00:00']
|
||||||
|
}
|
||||||
|
this.st.reload({ ...this.reqParams });
|
||||||
|
}
|
||||||
|
|
||||||
|
changeDataNext() {
|
||||||
|
if(this.modeNext === 'year') {
|
||||||
|
this.dateFormat = 'yyyy'
|
||||||
|
} else if(this.modeNext === 'month') {
|
||||||
|
this.dateFormat = 'yyyy-MM'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onChangeNext(result: any) {
|
||||||
|
if(result === null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
console.log(this.mode);
|
||||||
|
if(this.modeNext === 'year') {
|
||||||
|
this.timeNext = [this.datePipe.transform(this.dateNext, 'yyyy') + '-01-01 00:00:00']
|
||||||
|
} else if(this.modeNext === 'month') {
|
||||||
|
this.timeNext = [this.datePipe.transform(this.dateNext, 'yyyy-MM') + '-01 00:00:00']
|
||||||
|
|
||||||
|
console.log(this.dateNext);
|
||||||
|
console.log(this.timeNext);
|
||||||
|
|
||||||
|
}
|
||||||
|
this.initData(true)
|
||||||
|
}
|
||||||
|
disabledDate = (current: Date): boolean =>
|
||||||
|
// Can not select days before today and today
|
||||||
|
differenceInCalendarDays(current, this.today) > 0;
|
||||||
|
exportFun(){
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user