Compare commits
	
		
			1191 Commits
		
	
	
		
			revert-4cd
			...
			feature/pa
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 5dfe804a17 | |||
| e01abcd905 | |||
| ecbaeed77e | |||
| ecd56bc160 | |||
| 8e32119abb | |||
| 697a1dd432 | |||
| 6fb554bd5f | |||
| 3d8c027de9 | |||
| 95dc8075eb | |||
| e3a14bb57f | |||
| 054f630f2e | |||
| 9c3a9ec3a3 | |||
| 873ff7f61b | |||
| 1589bb4c82 | |||
| 957a3b1adb | |||
| ab5258501a | |||
| f14441f420 | |||
| a4e4aeb26e | |||
| c6e3be24f1 | |||
| 150489598e | |||
| b3831e88d8 | |||
| 5fa519fdbd | |||
| 74968d658c | |||
| 6ac6f01fce | |||
| ba4310e079 | |||
| 3284eeea24 | |||
| 504078a7ec | |||
| 54e8ff1660 | |||
| 3590e8c7d1 | |||
| 57e18b18b1 | |||
| 634c4bc6cc | |||
| a6193fbddc | |||
| 9c5fdabab9 | |||
| f18d53130a | |||
| 259effd5b5 | |||
| 3539bd2a07 | |||
| 6ccb5ced18 | |||
| 87d1523c31 | |||
| 97a3aca60c | |||
| 47522368ed | |||
| 6e2b7d0b03 | |||
| 851da10cfb | |||
| b605210b11 | |||
| ec9bf57d12 | |||
| 22ca0b0fb1 | |||
| 5fdcfaa1ee | |||
| e03ae573da | |||
| f9b176c3c4 | |||
| 95ed59c7d2 | |||
| 98a709c3f1 | |||
| 63ab601233 | |||
| d5f9c14c3a | |||
| 867a975a92 | |||
| e1732480cd | |||
| 25b346a81d | |||
| 2d4eb18350 | |||
| 79a1e172dd | |||
| 172a0a0f24 | |||
| 0adf32a01a | |||
| a8d25c4302 | |||
| 05dfb81a20 | |||
| 3b976844f0 | |||
| 5e26d4a24b | |||
| 06cbff566a | |||
| a31290acf8 | |||
| 403c45c388 | |||
| eaaa3c9858 | |||
| efa9a6bbad | |||
| 3d762c82b7 | |||
| 1db85b00b9 | |||
| 28a20973d3 | |||
| ab385dea60 | |||
| 09462cc750 | |||
| 8c06e1f9de | |||
| 15937316dd | |||
| 7406f1234a | |||
| 1a353f4c93 | |||
| 8f3e54a812 | |||
| 5e93d5de64 | |||
| 1dc6d31ba8 | |||
| 9095126af4 | |||
| 09a22bab29 | |||
| 451d142d0f | |||
| 31cb7bd194 | |||
| 152c139041 | |||
| 7ce80e8036 | |||
| da3b427a77 | |||
| 0230886f3a | |||
| 7550e9ceae | |||
| b0a7611ae4 | |||
| 737cfd55bb | |||
| b848978d70 | |||
| 957a66254f | |||
| 647d42690c | |||
| caa7dac493 | |||
| 42dd2e6e05 | |||
| 3a90d710eb | |||
| d370708e98 | |||
| 607ee45d88 | |||
| 984a9a85f0 | |||
| 2870adbe6e | |||
| d6a5eab320 | |||
| 1c7944a48c | |||
| d198a69eef | |||
| 522043df21 | |||
| 0eb12cdf75 | |||
| 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 | |||
| 2450c20151 | |||
| 8530a23707 | |||
| d4bd35b9df | 
							
								
								
									
										1
									
								
								.husky/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.husky/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | _ | ||||||
| @ -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) | ||||||
| }; | }; | ||||||
|  | |||||||
							
								
								
									
										37
									
								
								angular.json
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								angular.json
									
									
									
									
									
								
							| @ -39,7 +39,8 @@ | |||||||
|             ], |             ], | ||||||
|             "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 +49,28 @@ | |||||||
|           }, |           }, | ||||||
|           "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": "2mb", |                 "maximumWarning": "4mb", | ||||||
|                   "maximumError": "5mb" |                 "maximumError": "10mb" | ||||||
|                 } |               }] | ||||||
|               ] |             }, | ||||||
|  |             "dev": { | ||||||
|  |               "fileReplacements": [{ | ||||||
|  |                 "replace": "src/environments/environment.ts", | ||||||
|  |                 "with": "src/environments/eascs/environment.dev.ts" | ||||||
|  |               }], | ||||||
|  |               "outputHashing": "all", | ||||||
|  |               "budgets": [{ | ||||||
|  |                 "type": "initial", | ||||||
|  |                 "maximumWarning": "4mb", | ||||||
|  |                 "maximumError": "10mb" | ||||||
|  |               }] | ||||||
|             }, |             }, | ||||||
|             "development": { |             "development": { | ||||||
|               "buildOptimizer": false, |               "buildOptimizer": false, | ||||||
| @ -84,6 +93,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 +143,9 @@ | |||||||
|           "configurations": { |           "configurations": { | ||||||
|             "production": { |             "production": { | ||||||
|               "devServerTarget": "ng-alain:serve:production" |               "devServerTarget": "ng-alain:serve:production" | ||||||
|  |             }, | ||||||
|  |             "dev": { | ||||||
|  |               "devServerTarget": "app:build:dev" | ||||||
|             } |             } | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|  | |||||||
							
								
								
									
										20
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										20
									
								
								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", | ||||||
| @ -3426,14 +3431,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", | ||||||
| @ -14814,6 +14811,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", | ||||||
|  | |||||||
							
								
								
									
										12
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								package.json
									
									
									
									
									
								
							| @ -1,7 +1,7 @@ | |||||||
| { | { | ||||||
|   "name": "ng-alain-pro", |   "name": "tms-obc-web", | ||||||
|   "version": "0.0.0", |   "version": "0.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,10 @@ | |||||||
|   "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", | ||||||
|     "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", | ||||||
|     "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 +30,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,7 +55,6 @@ | |||||||
|     "@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", | ||||||
|     "js-base64": "^3.6.1", |     "js-base64": "^3.6.1", | ||||||
|     "masonry-layout": "^4.2.2", |     "masonry-layout": "^4.2.2", | ||||||
| @ -62,6 +63,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", | ||||||
|  | |||||||
| @ -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-02-17 15:57:11 | ||||||
|  |  * @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,14 @@ module.exports = { | |||||||
|   //   secure: false, // Ignore invalid SSL certificates |   //   secure: false, // Ignore invalid SSL certificates | ||||||
|   //   changeOrigin: true |   //   changeOrigin: true | ||||||
|   // } |   // } | ||||||
|  |   '//api': { | ||||||
|  |     target: { | ||||||
|  |       host: 'tms-api-dev.eascs.com', | ||||||
|  |       protocol: 'https:', | ||||||
|  |       port: 443 | ||||||
|  |     }, | ||||||
|  |     secure: false, | ||||||
|  |     changeOrigin: true, | ||||||
|  |     logLevel: 'debug' | ||||||
|  |   }, | ||||||
| }; | }; | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ 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'; | ||||||
|  |  | ||||||
| @ -15,10 +16,14 @@ 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 | ||||||
|   ) { |   ) { | ||||||
|     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 { | ||||||
|  | |||||||
| @ -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,7 +1,11 @@ | |||||||
| 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 { 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 { Observable, zip } from 'rxjs'; | import { Observable, zip } from 'rxjs'; | ||||||
| @ -24,6 +28,9 @@ export class StartupService { | |||||||
|     private aclService: ACLService, |     private aclService: ACLService, | ||||||
|     private titleService: TitleService, |     private titleService: TitleService, | ||||||
|     private httpClient: _HttpClient, |     private httpClient: _HttpClient, | ||||||
|  |     private userSrv: EAUserService, | ||||||
|  |     private amapService: AmapService, | ||||||
|  |     public cacheSrv: EACacheService, | ||||||
|     private coreSrv: CoreService |     private coreSrv: CoreService | ||||||
|   ) { |   ) { | ||||||
|     iconSrv.addIcon(...ICONS_AUTO, ...ICONS); |     iconSrv.addIcon(...ICONS_AUTO, ...ICONS); | ||||||
| @ -33,6 +40,12 @@ export class StartupService { | |||||||
|  |  | ||||||
|   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,8 +87,13 @@ 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); |     this.menuService.add(menuData); | ||||||
|     // 设置页面标题的后缀 |     // 设置页面标题的后缀 | ||||||
| @ -94,12 +112,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,16 +131,15 @@ 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 | ||||||
|       .post(this.coreSrv.$api_get_current_user_menus, { |     //   .post(this.coreSrv.$api_get_current_user_menus, { | ||||||
|         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] }, | ||||||
|  |     modal: { size: 'lg' } | ||||||
|  |   }, | ||||||
|  |   sf: { button: { search: '查询' }, ui: { placeholder: '请输入' } }, | ||||||
|   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> | ||||||
|  |   </nz-header> | ||||||
|  |   <nz-content class="content"> | ||||||
|  |     <div class="inner-content"> | ||||||
|       <router-outlet></router-outlet> |       <router-outlet></router-outlet> | ||||||
|     </div> |     </div> | ||||||
| </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 { | .title { | ||||||
|       position: relative; |   font-size  : 18px; | ||||||
|       color: @heading-color; |  | ||||||
|   font-weight: 600; |   font-weight: 600; | ||||||
|       font-size: 33px; |   color      : #26282A; | ||||||
|       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; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } | } | ||||||
| @ -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> | ||||||
|  | |||||||
| @ -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> | ||||||
|  | |||||||
| @ -9,6 +9,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); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										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; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										34
									
								
								src/app/routes/commom/less/box.less
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								src/app/routes/commom/less/box.less
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | |||||||
|  | :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; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										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; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -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,100 @@ | |||||||
|  | <!-- | ||||||
|  |  * @Description  :  | ||||||
|  |  * @Version      : 1.0 | ||||||
|  |  * @Author       : Shiming | ||||||
|  |  * @Date         : 2022-01-07 13:29:57 | ||||||
|  |  * @LastEditors  : Shiming | ||||||
|  |  * @LastEditTime : 2022-02-23 16:04:18 | ||||||
|  |  * @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]="service.http.loading" | ||||||
|  |         (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]="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_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,200 @@ | |||||||
|  | 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 } from '@delon/form'; | ||||||
|  | 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'] | ||||||
|  | }) | ||||||
|  | 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; | ||||||
|  |  | ||||||
|  |   reqParams = {}; | ||||||
|  |   selectedRows: any[] = []; | ||||||
|  |   constructor(public service: ContractManagementService, private nzModalService: NzModalService, private router: Router) {} | ||||||
|  |  | ||||||
|  |   ngOnInit(): void { | ||||||
|  |     this.initST() | ||||||
|  |     this.initSF() | ||||||
|  |   } | ||||||
|  |   /** | ||||||
|  |    * 初始化数据列表 | ||||||
|  |    */ | ||||||
|  |    initST() { | ||||||
|  |     this.columns = [ | ||||||
|  |       { | ||||||
|  |         title: '合同编号', | ||||||
|  |         width: '100px', | ||||||
|  |         className: 'text-center', | ||||||
|  |         render: 'contractCode' | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         title: '合同名称', | ||||||
|  |         width: '100px', | ||||||
|  |         className: 'text-center', | ||||||
|  |         index:'contractName' | ||||||
|  |       }, | ||||||
|  |       { title: '托运人', index: 'shipperName', width: '120px', className: 'text-center' }, | ||||||
|  |       { title: '承运人', index: 'carrierName', 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' }, | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     | ||||||
|  |     ]; | ||||||
|  |   } | ||||||
|  |     /** | ||||||
|  |  * 初始化查询表单 | ||||||
|  |  */ | ||||||
|  |      initSF() { | ||||||
|  |       this.schema = { | ||||||
|  |         properties: { | ||||||
|  |           _$expand: { type: 'boolean', ui: { hidden: true } }, | ||||||
|  |           contractCode: { | ||||||
|  |             type: 'string', | ||||||
|  |             title: '合同编号', | ||||||
|  |           }, | ||||||
|  |           shipperName: { | ||||||
|  |             type: 'string', | ||||||
|  |             title: '托运人' | ||||||
|  |           }, | ||||||
|  |           carrierName: { | ||||||
|  |             type: 'string', | ||||||
|  |             title: '承运人', | ||||||
|  |           }, | ||||||
|  |           signTime: { | ||||||
|  |             title: '签署日期', | ||||||
|  |             type: 'string', | ||||||
|  |             ui: { | ||||||
|  |               widget: 'custom', | ||||||
|  |               visibleIf: { | ||||||
|  |                 _$expand: (value: boolean) => value, | ||||||
|  |               }, | ||||||
|  |             } | ||||||
|  |           }, | ||||||
|  |         }, | ||||||
|  |         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,68 @@ | |||||||
|  | <!-- | ||||||
|  |  * @Description  :  | ||||||
|  |  * @Version      : 1.0 | ||||||
|  |  * @Author       : Shiming | ||||||
|  |  * @Date         : 2021-12-07 15:57:49 | ||||||
|  |  * @LastEditors  : Shiming | ||||||
|  |  * @LastEditTime : 2022-01-18 17:16:12 | ||||||
|  |  * @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]="service.http.loading" | ||||||
|  |         (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]="service.http.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]="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-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,246 @@ | |||||||
|  | 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'; | ||||||
|  |  | ||||||
|  | @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; | ||||||
|  |   /** | ||||||
|  |  * 查询参数 | ||||||
|  |  */ | ||||||
|  |   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, | ||||||
|  |     private router: Router, | ||||||
|  |     private datePipe: DatePipe, | ||||||
|  |   ) { } | ||||||
|  |  | ||||||
|  |   ngOnInit(): void { | ||||||
|  |     this.initST() | ||||||
|  |     this.initSF() | ||||||
|  |   } | ||||||
|  |   /** | ||||||
|  |    * 初始化数据列表 | ||||||
|  |    */ | ||||||
|  |   initST() { | ||||||
|  |     this.columns = [ | ||||||
|  |       { | ||||||
|  |         title: '合同编号', | ||||||
|  |         width: '100px', | ||||||
|  |         className: 'text-center', | ||||||
|  |         render: 'contractCode' | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         title: '单据类型', | ||||||
|  |         width: '100px', | ||||||
|  |         className: 'text-center', | ||||||
|  |         index: 'documentType' | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         title: '合同名称', | ||||||
|  |         width: '100px', | ||||||
|  |         className: 'text-center', | ||||||
|  |         index: 'contractName' | ||||||
|  |       }, | ||||||
|  |       { title: '托运人', index: 'shipperName', width: '120px', className: 'text-center' }, | ||||||
|  |       { title: '承运人', index: 'carrierName', width: '120px', className: 'text-center' }, | ||||||
|  |       { | ||||||
|  |         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' }, | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |  | ||||||
|  |     ]; | ||||||
|  |   } | ||||||
|  |   /** | ||||||
|  | * 初始化查询表单 | ||||||
|  | */ | ||||||
|  |   initSF() { | ||||||
|  |     this.schema = { | ||||||
|  |       properties: { | ||||||
|  |         _$expand: { type: 'boolean', ui: { hidden: true } }, | ||||||
|  |         contractCode: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '合同编号', | ||||||
|  |         }, | ||||||
|  |         businessCode: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '业务单号' | ||||||
|  |         }, | ||||||
|  |         shipperName: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '托运人' | ||||||
|  |         }, | ||||||
|  |         carrierName: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '承运人', | ||||||
|  |           ui: { | ||||||
|  |             visibleIf: { | ||||||
|  |               _$expand: (value: boolean) => value, | ||||||
|  |             }, | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         documentType: { | ||||||
|  |           title: '单据类型', | ||||||
|  |           type: 'string', | ||||||
|  |           default: '', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'dict-select', | ||||||
|  |             containsAllLabel: true, | ||||||
|  |             params: { dictKey: 'contract:document:type' }, | ||||||
|  |             containAllLable: true, | ||||||
|  |             visibleIf: { | ||||||
|  |               _$expand: (value: boolean) => value, | ||||||
|  |             }, | ||||||
|  |           } as SFSelectWidgetSchema, | ||||||
|  |         }, | ||||||
|  |         signTime: { | ||||||
|  |           title: '签署日期', | ||||||
|  |           type: 'string', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'custom', | ||||||
|  |             visibleIf: { | ||||||
|  |               _$expand: (value: boolean) => value, | ||||||
|  |             }, | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |       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; | ||||||
|  |   } | ||||||
|  |   /** | ||||||
|  |    * 伸缩查询条件 | ||||||
|  |    */ | ||||||
|  |   expandToggle(): void { | ||||||
|  |     this._$expand = !this._$expand; | ||||||
|  |     this.sf?.setValue('/_$expand', this._$expand); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -0,0 +1,60 @@ | |||||||
|  | <!-- | ||||||
|  |  * @Description  :  | ||||||
|  |  * @Version      : 1.0 | ||||||
|  |  * @Author       : Shiming | ||||||
|  |  * @Date         : 2022-01-05 11:01:55 | ||||||
|  |  * @LastEditors  : Shiming | ||||||
|  |  * @LastEditTime : 2022-01-18 17:16:27 | ||||||
|  |  * @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 class="mb-md"> | ||||||
|  |         <div>{{detailList?.templateName}}</div> | ||||||
|  |       </div> | ||||||
|  |       <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,165 @@ | |||||||
|  | /* | ||||||
|  |  * @Description  :  | ||||||
|  |  * @Version      : 1.0 | ||||||
|  |  * @Author       : Shiming | ||||||
|  |  * @Date         : 2022-01-05 11:01:55 | ||||||
|  |  * @LastEditors  : Shiming | ||||||
|  |  * @LastEditTime : 2022-01-25 14:25:49 | ||||||
|  |  * @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 { NzModalService } from 'ng-zorro-antd/modal'; | ||||||
|  | import { ContractManagementService } from '../../services/contract-management.service'; | ||||||
|  |  | ||||||
|  | @Component({ | ||||||
|  |   selector: 'app-contract-management-template-detail-complaint', | ||||||
|  |   templateUrl: './contract-template-detail.component.html', | ||||||
|  |   styleUrls: ['./contract-template-detail.component.less'], | ||||||
|  |   providers: [DatePipe] | ||||||
|  | }) | ||||||
|  | export class ContractManagementTemplateDetailComponent implements OnInit { | ||||||
|  |   constructor( | ||||||
|  |     private nzModalService: NzModalService, | ||||||
|  |     public service: ContractManagementService, | ||||||
|  |     public route: ActivatedRoute, | ||||||
|  |     private datePipe: DatePipe, | ||||||
|  |     private router: Router | ||||||
|  |   ) {} | ||||||
|  |   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; | ||||||
|  |   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', | ||||||
|  |           default: '', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'dict-select', | ||||||
|  |             params: { dictKey: 'contract:template:type' }, | ||||||
|  |             containAllLable: true, | ||||||
|  |             visibleIf: { | ||||||
|  |               _$expand: (value: boolean) => value | ||||||
|  |             } | ||||||
|  |           } as SFSelectWidgetSchema | ||||||
|  |         }, | ||||||
|  |         contractType: { | ||||||
|  |           title: '单据类型', | ||||||
|  |           type: 'string', | ||||||
|  |           default: '', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'dict-select', | ||||||
|  |             params: { dictKey: 'contract:document:type' }, | ||||||
|  |             containAllLable: true, | ||||||
|  |             visibleIf: { | ||||||
|  |               templateType: value => value === 'MX' | ||||||
|  |             } | ||||||
|  |           } as SFSelectWidgetSchema | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       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) { | ||||||
|  |     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.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,77 @@ | |||||||
|  | <!-- | ||||||
|  |  * @Description  :  | ||||||
|  |  * @Version      : 1.0 | ||||||
|  |  * @Author       : Shiming | ||||||
|  |  * @Date         : 2022-01-12 10:52:50 | ||||||
|  |  * @LastEditors  : Shiming | ||||||
|  |  * @LastEditTime : 2022-01-18 17:16:18 | ||||||
|  |  * @FilePath     : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\contract-template\\contract-template.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]="service.http.loading" | ||||||
|  |         (formSubmit)="st?.load(1)" | ||||||
|  |         (formReset)="resetSF()" | ||||||
|  |       ></sf> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  |     <!-- 查询字段大于3个时,根据展开状态调整布局 --> | ||||||
|  |     <ng-container *ngIf="queryFieldCount > 4"> | ||||||
|  |       <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]="service.http.loading" | ||||||
|  |           (click)="st?.load(1)" | ||||||
|  |           acl | ||||||
|  |           [acl-ability]="['CONTRACT-TEMPLATE-search']" | ||||||
|  |           >查询</button | ||||||
|  |         > | ||||||
|  |         <button nz-button nzType="primary" acl [acl-ability]="['CONTRACT-TEMPLATE-export']">导出</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]="service.http.loading" | ||||||
|  |     > | ||||||
|  |       <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-01-18 17:16:22 | ||||||
|  |  * @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 { ContractManagementTemplateComponent } from './contract-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,216 @@ | |||||||
|  | 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-complaint', | ||||||
|  |   templateUrl: './contract-template.component.html', | ||||||
|  |   styleUrls: ['./contract-template.component.less'] | ||||||
|  | }) | ||||||
|  | export class ContractManagementTemplateComponent 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 { | ||||||
|  |       ...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: { | ||||||
|  |         templateName: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '模板名称', | ||||||
|  |         }, | ||||||
|  |         templateType: { | ||||||
|  |           title: '模板类型', | ||||||
|  |           type: 'string', | ||||||
|  |           default: '', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'dict-select', | ||||||
|  |             params: { dictKey: 'contract:template:type' }, | ||||||
|  |             containsAllLabel: 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: '模板类型', | ||||||
|  |         className: 'text-center', | ||||||
|  |         index: 'templateType' | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         title: '单据类型', | ||||||
|  |         index: 'contractType', | ||||||
|  |         className: 'text-center', | ||||||
|  |       }, | ||||||
|  |       { title: '创建人', index: 'createUserId', width: '120px', className: 'text-center' }, | ||||||
|  |       { | ||||||
|  |         title: '创建时间', | ||||||
|  |         className: 'text-center', | ||||||
|  |         index: 'createTime' | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         title: '操作', | ||||||
|  |         fixed: 'right', | ||||||
|  |         className: 'text-left', | ||||||
|  |         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/detail/' + value.id], { | ||||||
|  |       queryParams: { | ||||||
|  |         status: 2 | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  |   creatTemplate() { | ||||||
|  |     this.router.navigate(['/contract-management/template/detail/' + 0], { | ||||||
|  |       queryParams: { | ||||||
|  |         status: 1 | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  |   goBack() { | ||||||
|  |     window.history.go(-1) | ||||||
|  |   } | ||||||
|  |   view(value: any) { | ||||||
|  |     this.router.navigate(['/contract-management/template/detail/' + 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,23 @@ | |||||||
|  | <!-- | ||||||
|  |  * @Description  :  | ||||||
|  |  * @Version      : 1.0 | ||||||
|  |  * @Author       : Shiming | ||||||
|  |  * @Date         : 2022-01-07 13:27:10 | ||||||
|  |  * @LastEditors  : Shiming | ||||||
|  |  * @LastEditTime : 2022-01-18 17:16:56 | ||||||
|  |  * @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-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,74 @@ | |||||||
|  | <!-- | ||||||
|  |  * @Description  :  | ||||||
|  |  * @Version      : 1.0 | ||||||
|  |  * @Author       : Shiming | ||||||
|  |  * @Date         : 2022-01-12 10:52:50 | ||||||
|  |  * @LastEditors  : Shiming | ||||||
|  |  * @LastEditTime : 2022-02-23 15:57:26 | ||||||
|  |  * @FilePath     : \\tms-obc-web\\src\\app\\routes\\contract-management\\components\\policy\\policy.component.html | ||||||
|  |  * Copyright (C) 2022 huzhenhong. All rights reserved. | ||||||
|  | --> | ||||||
|  | <page-header [action]="phActionTpl"> | ||||||
|  |   <ng-template #phActionTpl> </ng-template> | ||||||
|  | </page-header> | ||||||
|  |  | ||||||
|  | <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]="service.http.loading" | ||||||
|  |         (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]="service.http.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]="service.http.loading" | ||||||
|  |   > | ||||||
|  |  | ||||||
|  |   </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,211 @@ | |||||||
|  | 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 = ''; | ||||||
|  |   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; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * 伸缩查询条件 | ||||||
|  |    */ | ||||||
|  |   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,32 @@ | |||||||
|  | /* | ||||||
|  |  * @Description  :  | ||||||
|  |  * @Version      : 1.0 | ||||||
|  |  * @Author       : Shiming | ||||||
|  |  * @Date         : 2022-01-04 21:05:49 | ||||||
|  |  * @LastEditors  : Shiming | ||||||
|  |  * @LastEditTime : 2022-01-18 17:15:03 | ||||||
|  |  * @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 { ContractManagementTemplateDetailComponent } from './components/contract-template-detail/contract-template-detail.component'; | ||||||
|  | import { ContractManagementTemplateComponent } from './components/contract-template/contract-template.component'; | ||||||
|  | import { ContractManagementIndexComponent } from './components/index/index.component'; | ||||||
|  | import { ContractManagementPolicyComponent } from './components/policy/policy.component'; | ||||||
|  | const routes: Routes = [ | ||||||
|  |   { path: 'index', component: ContractManagementIndexComponent }, | ||||||
|  |   { path: 'index/detail/:id', component: ContractManagementDetailComponent }, | ||||||
|  |   { path: 'template', component: ContractManagementTemplateComponent }, | ||||||
|  |   { path: 'template/detail/:id', component: ContractManagementTemplateDetailComponent }, | ||||||
|  |   { path: 'policy', component: ContractManagementPolicyComponent } | ||||||
|  | ]; | ||||||
|  |  | ||||||
|  | @NgModule({ | ||||||
|  |   imports: [RouterModule.forChild(routes)], | ||||||
|  |   exports: [RouterModule] | ||||||
|  | }) | ||||||
|  | export class ContractManagementManagementRoutingModule {} | ||||||
| @ -0,0 +1,38 @@ | |||||||
|  | /* | ||||||
|  |  * @Description  :  | ||||||
|  |  * @Version      : 1.0 | ||||||
|  |  * @Author       : Shiming | ||||||
|  |  * @Date         : 2022-01-04 21:05:49 | ||||||
|  |  * @LastEditors  : Shiming | ||||||
|  |  * @LastEditTime : 2022-01-18 17:15:08 | ||||||
|  |  * @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 { ContractManagementTemplateComponent } from './components/contract-template/contract-template.component'; | ||||||
|  | import { ContractManagementIndexComponent } from './components/index/index.component'; | ||||||
|  | import { ContractManagementFrameComponent } from './components/contract-frame/contract-frame.component'; | ||||||
|  | import { ContractManagementTemplateDetailComponent } from './components/contract-template-detail/contract-template-detail.component'; | ||||||
|  | import { ContractManagementDetailComponent } from './components/contract-detail/contract-detail.component'; | ||||||
|  |  | ||||||
|  | const COMPONENTS: any = [ | ||||||
|  |   ContractManagementContractListComponent, | ||||||
|  |   ContractManagementPolicyComponent, | ||||||
|  |   ContractManagementTemplateComponent, | ||||||
|  |   ContractManagementTemplateDetailComponent, | ||||||
|  |   ContractManagementIndexComponent, | ||||||
|  |   ContractManagementFrameComponent, | ||||||
|  |   ContractManagementDetailComponent | ||||||
|  | ]; | ||||||
|  | const NOTROUTECOMPONENTS: any = []; | ||||||
|  | @NgModule({ | ||||||
|  |   declarations: [...COMPONENTS, ...NOTROUTECOMPONENTS], | ||||||
|  |   imports: [CommonModule, ContractManagementManagementRoutingModule, SharedModule] | ||||||
|  | }) | ||||||
|  | export class ContractManagementManagementModule {} | ||||||
| @ -0,0 +1,39 @@ | |||||||
|  | /* | ||||||
|  |  * @Description  : | ||||||
|  |  * @Version      : 1.0 | ||||||
|  |  * @Author       : Shiming | ||||||
|  |  * @Date         : 2022-01-04 21:05:49 | ||||||
|  |  * @LastEditors  : Shiming | ||||||
|  |  * @LastEditTime : 2022-01-18 17:17:10 | ||||||
|  |  * @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_contract_get = `/api/sdc/contract/get`; | ||||||
|  |   constructor(public injector: Injector) { | ||||||
|  |     super(injector); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -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()); |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  | |||||||
							
								
								
									
										13
									
								
								src/app/routes/download/components/list/list.component.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/app/routes/download/components/list/list.component.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | <page-header-wrapper [title]="'下载中心'"></page-header-wrapper> | ||||||
|  |  | ||||||
|  | <nz-card nzSize="small"> | ||||||
|  |   <!-- 搜索区 --> | ||||||
|  |   <sf #sf mode="search" [schema]="schema" (formSubmit)="st.load(1)" (formReset)="resetSF()"></sf> | ||||||
|  |   <!-- 数据列表 --> | ||||||
|  |   <st #st multiSort [scroll]="{ x: '1200px' }" [size]="'small'" [data]="service.$api_get_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"> | ||||||
|  |   </st> | ||||||
|  | </nz-card> | ||||||
							
								
								
									
										135
									
								
								src/app/routes/download/components/list/list.component.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								src/app/routes/download/components/list/list.component.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,135 @@ | |||||||
|  | import { Component, OnInit, ViewChild } from '@angular/core'; | ||||||
|  | import { ActivatedRoute, Router } from '@angular/router'; | ||||||
|  | import { STChange, STColumn, STComponent, STData } from '@delon/abc/st'; | ||||||
|  | import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; | ||||||
|  | import { _HttpClient } from '@delon/theme'; | ||||||
|  | import { NzModalService } from 'ng-zorro-antd/modal'; | ||||||
|  | import { DownloadService } from '../../services/download.service'; | ||||||
|  |  | ||||||
|  | @Component({ | ||||||
|  |   selector: 'app-download-center-components-list', | ||||||
|  |   templateUrl: './list.component.html', | ||||||
|  | }) | ||||||
|  | export class DownloadComponentsListComponent implements OnInit { | ||||||
|  |   ui: SFUISchema = {}; | ||||||
|  |   schema: SFSchema = {}; | ||||||
|  |   columns: STColumn[] = []; | ||||||
|  |   @ViewChild('st', { static: false }) st!: STComponent; | ||||||
|  |   @ViewChild('sf', { static: false }) sf!: SFComponent; | ||||||
|  |   constructor(public service: DownloadService, private modal: NzModalService, private router: Router, private ar: ActivatedRoute) {} | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * 查询参数 | ||||||
|  |    */ | ||||||
|  |   get reqParams() { | ||||||
|  |     const params = Object.assign({}, this.sf?.value || {}); | ||||||
|  |     delete params._$expand; | ||||||
|  |     return { ...params }; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * 重置表单 | ||||||
|  |    */ | ||||||
|  |   resetSF() { | ||||||
|  |     this.sf.reset(); | ||||||
|  |   } | ||||||
|  |   /** | ||||||
|  |    * 程序初始化入口 | ||||||
|  |    */ | ||||||
|  |   ngOnInit() { | ||||||
|  |     this.initSF(); | ||||||
|  |     this.initST(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * 初始化查询表单 | ||||||
|  |    */ | ||||||
|  |   initSF() { | ||||||
|  |     this.schema = { | ||||||
|  |       properties: { | ||||||
|  |         _$expand: { | ||||||
|  |           type: 'boolean', | ||||||
|  |           ui: { hidden: true }, | ||||||
|  |         }, | ||||||
|  |         applyStartTime: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '创建时间', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'date', | ||||||
|  |             format: 'yyyy-MM-dd', | ||||||
|  |             end: 'applyEndTime', | ||||||
|  |           } as SFDateWidgetSchema, | ||||||
|  |         }, | ||||||
|  |         applyEndTime: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '', | ||||||
|  |           ui: { widget: 'date', end: 'end' } as SFDateWidgetSchema, | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }; | ||||||
|  |     this.ui = { '*': { spanLabelFixed: 80, grid: { span: 8, gutter: 4 } } }; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * 初始化数据列表 | ||||||
|  |    */ | ||||||
|  |   initST() { | ||||||
|  |     this.columns = [ | ||||||
|  |       { title: '文件名称', index: 'dataSourcesDetail', className: 'text-center' }, | ||||||
|  |       { title: '文件来源', index: 'dataSources', className: 'text-center' }, | ||||||
|  |       { title: '文件大小', index: 'dataSize', width: '120px', className: 'text-center' }, | ||||||
|  |       { | ||||||
|  |         title: '生成状态', | ||||||
|  |         index: 'status', | ||||||
|  |         width: '120px', | ||||||
|  |         className: 'text-center', | ||||||
|  |         type: 'enum', | ||||||
|  |         enum: { | ||||||
|  |           0: '生成中', | ||||||
|  |           1: '已完成', | ||||||
|  |           2: '失败', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |       { title: '下载次数', index: 'downloadCount', width: '120px', className: 'text-center' }, | ||||||
|  |       { title: '创建时间', index: 'createTime', width: '120px', className: 'text-center' }, | ||||||
|  |       { title: '生成时间', index: 'completeTime', width: '180px', className: 'text-center' }, | ||||||
|  |       { | ||||||
|  |         title: '操作', | ||||||
|  |         fixed: 'right', | ||||||
|  |         width: '170px', | ||||||
|  |         className: 'text-center', | ||||||
|  |         buttons: [ | ||||||
|  |           { text: '下载', click: (_record) => this.download(_record)}, | ||||||
|  |         ], | ||||||
|  |       }, | ||||||
|  |     ]; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * 删除单个实例 | ||||||
|  |    * @param record 记录实例 | ||||||
|  |    */ | ||||||
|  |   delOne(record: STData) { | ||||||
|  |     const headers = [{ key: 'Content-Type', value: 'application/json' }]; | ||||||
|  |     this.modal.confirm({ | ||||||
|  |       nzTitle: '<i>删除确认</i>', | ||||||
|  |       nzContent: `<b>即将删除 当前行数据,请仔细核对,避免误操作!<br>是否删除?</br>`, | ||||||
|  |       nzOnOk: () => | ||||||
|  |         this.service.request(this.service.encodeUrlHeader(this.service.$api_del_many, headers), { fileKey: record.id }).subscribe((res) => { | ||||||
|  |           if (res) { | ||||||
|  |             this.service.msgSrv.success('数据删除成功!'); | ||||||
|  |             this.st?.reload(); | ||||||
|  |           } | ||||||
|  |         }), | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  |   download(record: STData) { | ||||||
|  |     const headers = [{ key: 'Content-Type', value: 'application/json' }]; | ||||||
|  |     this.service.downloadFile( | ||||||
|  |       this.service.encodeUrlHeader(this.service.$api_download_file, headers), | ||||||
|  |       {}, | ||||||
|  |       { fileKey: record.fileUniqueKey }, | ||||||
|  |       'POST', | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										14
									
								
								src/app/routes/download/download-routing.module.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/app/routes/download/download-routing.module.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | |||||||
|  | import { NgModule } from '@angular/core'; | ||||||
|  | import { RouterModule, Routes } from '@angular/router'; | ||||||
|  | import { DownloadComponentsListComponent } from './components/list/list.component'; | ||||||
|  |  | ||||||
|  | const routes: Routes = [ | ||||||
|  |   { path: '', redirectTo: 'list', pathMatch: 'full' }, | ||||||
|  |   { path: 'list', component: DownloadComponentsListComponent, data: { reuse: true } }, | ||||||
|  | ]; | ||||||
|  |  | ||||||
|  | @NgModule({ | ||||||
|  |   imports: [RouterModule.forChild(routes)], | ||||||
|  |   exports: [RouterModule], | ||||||
|  | }) | ||||||
|  | export class DownloadRoutingModule {} | ||||||
							
								
								
									
										12
									
								
								src/app/routes/download/download.module.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/app/routes/download/download.module.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | |||||||
|  | import { NgModule, Type } from '@angular/core'; | ||||||
|  | import { SharedModule } from '@shared'; | ||||||
|  | import { DownloadComponentsListComponent } from './components/list/list.component'; | ||||||
|  | import { DownloadRoutingModule } from './download-routing.module'; | ||||||
|  |  | ||||||
|  | const COMPONENTS: Type<void>[] = [DownloadComponentsListComponent]; | ||||||
|  |  | ||||||
|  | @NgModule({ | ||||||
|  |   imports: [SharedModule, DownloadRoutingModule], | ||||||
|  |   declarations: COMPONENTS, | ||||||
|  | }) | ||||||
|  | export class DownloadModule {} | ||||||
							
								
								
									
										18
									
								
								src/app/routes/download/services/download.service.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/app/routes/download/services/download.service.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | |||||||
|  | import { Injectable, Injector } from '@angular/core'; | ||||||
|  | import { BaseService } from '@shared'; | ||||||
|  |  | ||||||
|  | @Injectable({ | ||||||
|  |   providedIn: 'root', | ||||||
|  | }) | ||||||
|  | export class DownloadService extends BaseService { | ||||||
|  |   // 删除多个实例接口地址 | ||||||
|  |   $api_del_many = '/scm/cms/cms/deleteRecordInfo/file'; | ||||||
|  |   // 获取实例分页数据接口地址 | ||||||
|  |   $api_get_page = '/api/mdc/pbc/asynExportInfo/getAsynExportInfoListPage'; | ||||||
|  |   // 下载文件 | ||||||
|  |   $api_download_file = '/api/mdc/pbc/download/file'; | ||||||
|  |  | ||||||
|  |   constructor(public injector: Injector) { | ||||||
|  |     super(injector); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -0,0 +1,35 @@ | |||||||
|  | <page-header-wrapper [title]="'异常入金'"> | ||||||
|  | </page-header-wrapper> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | <nz-card class="search-box" nzBordered> | ||||||
|  |     <div nz-row nzGutter="8"> | ||||||
|  |         <div nz-col [nzXl]="_$expand ? 24 : 18" [nzLg]="24" [nzSm]="24" [nzXs]="24"> | ||||||
|  |             <sf #sf [schema]="searchSchema" | ||||||
|  |                 [ui]="{ '*': { spanLabelFixed: 90,grid: { lg: 8, md: 12, sm: 12, xs: 24 } }}" [compact]="true" | ||||||
|  |                 [button]="'none'"></sf> | ||||||
|  |         </div> | ||||||
|  |         <div nz-col [nzXl]="_$expand ? 24 : 6" [nzLg]="24" [nzSm]="24" [nzXs]="24" [class.expend-options]="_$expand" | ||||||
|  |             class="text-right"> | ||||||
|  |             <button nz-button nzType="primary" [nzLoading]="service.http.loading" (click)="st?.load(1)">查询</button> | ||||||
|  |             <button nz-button (click)="resetSF()">重置</button> | ||||||
|  |             <button nz-button> 导出</button> | ||||||
|  |             <button nz-button nzType="link" (click)="expandToggle()"> | ||||||
|  |                 {{ !_$expand ? '展开' : '收起' }} | ||||||
|  |                 <i nz-icon [nzType]="!_$expand ? 'down' : 'up'"></i> | ||||||
|  |             </button> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  | </nz-card> | ||||||
|  |  | ||||||
|  | <nz-card class="content-box" nzBordered> | ||||||
|  |     <nz-tabset> | ||||||
|  |         <nz-tab nzTitle="待处理"></nz-tab> | ||||||
|  |         <nz-tab nzTitle="已清分"></nz-tab> | ||||||
|  |         <nz-tab nzTitle="已退款"></nz-tab> | ||||||
|  |         <nz-tab nzTitle="全部"></nz-tab> | ||||||
|  |     </nz-tabset> | ||||||
|  |  | ||||||
|  |     <st #st [data]="service.$api_get_abnormal_gold_page" [columns]="columns" [req]="{   process: beforeReq }" | ||||||
|  |         [loading]="service.http.loading" [scroll]="{ x:'1200px' }"></st> | ||||||
|  | </nz-card> | ||||||
| @ -0,0 +1,37 @@ | |||||||
|  | :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 { | ||||||
|  |         max-width: 400px; | ||||||
|  |         position : absolute; | ||||||
|  |         right    : 0; | ||||||
|  |         bottom   : 25px; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,192 @@ | |||||||
|  | import { Component, OnInit, ViewChild } from '@angular/core'; | ||||||
|  | import { Router } from '@angular/router'; | ||||||
|  | import { STComponent, STColumn, STRequestOptions, STChange } from '@delon/abc/st'; | ||||||
|  | import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; | ||||||
|  | import { NzModalService } from 'ng-zorro-antd/modal'; | ||||||
|  | import { FreightAccountService } from '../../services/freight-account.service'; | ||||||
|  | import { ClearingModalComponent } from './clearing-modal/clearing-modal.component'; | ||||||
|  |  | ||||||
|  | @Component({ | ||||||
|  |   selector: 'app-abnormal-gold', | ||||||
|  |   templateUrl: './abnormal-gold.component.html', | ||||||
|  |   styleUrls: ['./abnormal-gold.component.less'] | ||||||
|  | }) | ||||||
|  | export class AbnormalGoldComponent implements OnInit { | ||||||
|  |   @ViewChild('st', { static: true }) | ||||||
|  |   st!: STComponent; | ||||||
|  |   @ViewChild('sf', { static: false }) | ||||||
|  |   sf!: SFComponent; | ||||||
|  |   columns: STColumn[] = this.initST(); | ||||||
|  |   searchSchema: SFSchema = this.initSF(); | ||||||
|  |  | ||||||
|  |   _$expand = false; | ||||||
|  |  | ||||||
|  |   constructor(public service: FreightAccountService, private nzModalService: NzModalService, private router: Router) {} | ||||||
|  |  | ||||||
|  |   ngOnInit(): void {} | ||||||
|  |  | ||||||
|  |   beforeReq = (requestOptions: STRequestOptions) => { | ||||||
|  |     if (this.sf) { | ||||||
|  |       Object.assign(requestOptions.body, { ...this.sf.value }); | ||||||
|  |     } | ||||||
|  |     return requestOptions; | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   refund(item: any) { | ||||||
|  |     this.nzModalService.warning({ | ||||||
|  |       nzTitle: '确定要将该笔款项原路退回?', | ||||||
|  |       nzOnOk: () => {} | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   clearingAction(item: any) { | ||||||
|  |     const modal = this.nzModalService.create({ | ||||||
|  |       nzTitle: '清分', | ||||||
|  |       nzContent: ClearingModalComponent, | ||||||
|  |       nzOnOk: com => { | ||||||
|  |         return false; | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * 重置表单 | ||||||
|  |    */ | ||||||
|  |   resetSF() { | ||||||
|  |     this.sf.reset(); | ||||||
|  |     this._$expand = false; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * 伸缩查询条件 | ||||||
|  |    */ | ||||||
|  |   expandToggle() { | ||||||
|  |     this._$expand = !this._$expand; | ||||||
|  |     this.sf?.setValue('/expand', this._$expand); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   private initSF(): SFSchema { | ||||||
|  |     return { | ||||||
|  |       properties: { | ||||||
|  |         expand: { | ||||||
|  |           type: 'boolean', | ||||||
|  |           ui: { | ||||||
|  |             hidden: true | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         paySerialNumber: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '银行流水号', | ||||||
|  |           ui: { | ||||||
|  |             placeholder: '请输入' | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         ltdId: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '网络货运人', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'select', | ||||||
|  |             placeholder: '请选择', | ||||||
|  |             allowClear: true, | ||||||
|  |             asyncData: () => this.service.getNetworkFreightForwarder() | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         bankType: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '银行类型', | ||||||
|  |           enum: [ | ||||||
|  |             { label: '全部', value: '' }, | ||||||
|  |             { label: '平安银行', value: '1' }, | ||||||
|  |             { label: '浦发银行', value: '2' } | ||||||
|  |           ], | ||||||
|  |           ui: { | ||||||
|  |             widget: 'select', | ||||||
|  |             placeholder: '请选择', | ||||||
|  |           }, | ||||||
|  |           default: '' | ||||||
|  |         }, | ||||||
|  |         transferBankAccount: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '付款账户', | ||||||
|  |           ui: { | ||||||
|  |             placeholder: '请输入', | ||||||
|  |             visibleIf: { | ||||||
|  |               expand: (value: boolean) => value | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         transferBankCardNumber: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '付款账号', | ||||||
|  |           ui: { | ||||||
|  |             placeholder: '请输入', | ||||||
|  |             visibleIf: { | ||||||
|  |               expand: (value: boolean) => value | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         transferBankOpenName: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '付款银行', | ||||||
|  |           ui: { | ||||||
|  |             placeholder: '请输入', | ||||||
|  |             visibleIf: { | ||||||
|  |               expand: (value: boolean) => value | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         transferDate: { | ||||||
|  |           title: '转账时间', | ||||||
|  |           type: 'string', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'sl-from-to-search', | ||||||
|  |             format: 'yyyy-MM-dd', | ||||||
|  |             placeholder: '请选择', | ||||||
|  |             nzShowTime: true, | ||||||
|  |             visibleIf: { | ||||||
|  |               expand: (value: boolean) => value | ||||||
|  |             } | ||||||
|  |           } as SFDateWidgetSchema | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   private initST(): STColumn[] { | ||||||
|  |     return [ | ||||||
|  |       { title: '银行流水号', index: 'paySerialNumber', width: 150 }, | ||||||
|  |       { title: '网络货运人', index: 'ltdId', width: 120 }, | ||||||
|  |       { title: '银行类型', index: 'callNo', width: 100, type: 'enum', enum: { 1: '平安银行', 2: '浦发银行' } }, | ||||||
|  |       { title: '资金总账号', index: 'callNo', width: 120 }, | ||||||
|  |       { title: '充值金额', index: 'rechargeAmount', width: 100 }, | ||||||
|  |       { title: '付款账户', index: 'transferBankAccount', width: 100 }, | ||||||
|  |       { title: '付款账号', index: 'transferBankCardNumber', width: 100 }, | ||||||
|  |       { title: '付款银行', index: 'transferBankOpenName', width: 100 }, | ||||||
|  |       { title: '转账时间', index: 'transferDate', type: 'date', width: 150 }, | ||||||
|  |       { title: '转账备注', index: 'rechargeRemark', width: 100 }, | ||||||
|  |       { title: '操作人', index: 'rechargeName', width: 90 }, | ||||||
|  |       { title: '操作时间', index: 'callNo', type: 'date', width: 150 }, | ||||||
|  |       { title: '状态', index: 'callNo', width: 90 }, | ||||||
|  |       { | ||||||
|  |         title: '操作', | ||||||
|  |         fixed: 'right', | ||||||
|  |         className: 'text-center', | ||||||
|  |         width: 120, | ||||||
|  |         buttons: [ | ||||||
|  |           { | ||||||
|  |             text: '清分', | ||||||
|  |             click: item => this.clearingAction(item) | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             text: '退款', | ||||||
|  |             click: item => this.refund(item) | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             text: '查看', | ||||||
|  |             click: item => this.router.navigate(['/financial-management/withdrawals-record/detail/1']) | ||||||
|  |           } | ||||||
|  |         ] | ||||||
|  |       } | ||||||
|  |     ]; | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -0,0 +1,2 @@ | |||||||
|  | <sf #sf [compact]="true" [ui]="ui" [schema]="schema" [button]="'none'"> | ||||||
|  | </sf> | ||||||
| @ -0,0 +1,106 @@ | |||||||
|  | import { Component, OnInit, ViewChild } from '@angular/core'; | ||||||
|  | import { apiConf } from '@conf/api.conf'; | ||||||
|  | import { SFComponent, SFSchema, SFTextWidgetSchema, SFUISchema, SFUploadWidgetSchema } from '@delon/form'; | ||||||
|  | import { ShipperBaseService } from '@shared'; | ||||||
|  | import { NzModalRef } from 'ng-zorro-antd/modal'; | ||||||
|  | import { FreightAccountService } from '../../../services/freight-account.service'; | ||||||
|  |  | ||||||
|  | const IMAGECONFIG = { | ||||||
|  |   action: apiConf.waterFileUpload, | ||||||
|  |   fileType: 'image/png,image/jpeg,image/jpg,image/gif', | ||||||
|  |   fileSize: 5120, | ||||||
|  |   limit: 1, | ||||||
|  |   limitFileCount: 1, | ||||||
|  |   resReName: 'data.fullFileWatermarkPath', | ||||||
|  |   urlReName: 'data.fullFileWatermarkPath', | ||||||
|  |   widget: 'upload', | ||||||
|  |   name: 'multipartFile', | ||||||
|  |   multiple: false, | ||||||
|  |   listType: 'picture-card' | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | @Component({ | ||||||
|  |   selector: 'app-clearing-modal', | ||||||
|  |   templateUrl: './clearing-modal.component.html', | ||||||
|  |   styleUrls: ['./clearing-modal.component.less'] | ||||||
|  | }) | ||||||
|  | export class ClearingModalComponent implements OnInit { | ||||||
|  |   @ViewChild('sf', { static: false }) | ||||||
|  |   sf!: SFComponent; | ||||||
|  |   i: any; | ||||||
|  |   schema!: SFSchema; | ||||||
|  |   ui: SFUISchema = { | ||||||
|  |     '*': { | ||||||
|  |       spanLabelFixed: 120, | ||||||
|  |       grid: { span: 18 } | ||||||
|  |     } | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   constructor( | ||||||
|  |     private modal: NzModalRef, | ||||||
|  |     public service: FreightAccountService, | ||||||
|  |     public shipperservice: ShipperBaseService, | ||||||
|  |     ) {} | ||||||
|  |  | ||||||
|  |   ngOnInit(): void { | ||||||
|  |     this.initSF(this.i); | ||||||
|  |   } | ||||||
|  |   initSF(staff: any) { | ||||||
|  |     this.schema = { | ||||||
|  |       properties: { | ||||||
|  |         name: { | ||||||
|  |           title: '入账金额', | ||||||
|  |           type: 'string', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'text' | ||||||
|  |           } as SFTextWidgetSchema, | ||||||
|  |           default: '10000.00' | ||||||
|  |         }, | ||||||
|  |         enterpriseInfoId: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '网络货运人', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'select', | ||||||
|  |             placeholder: '请选择', | ||||||
|  |             visibleIf: { | ||||||
|  |               _$expand: (value: boolean) => value, | ||||||
|  |             }, | ||||||
|  |             allowClear: true, | ||||||
|  |             asyncData: () => this.shipperservice.getNetworkFreightForwarder(), | ||||||
|  |           }, | ||||||
|  |         }, | ||||||
|  |         name3: { | ||||||
|  |           title: '银行类型', | ||||||
|  |           type: 'string', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'text' | ||||||
|  |           } as SFTextWidgetSchema, | ||||||
|  |           default: '平安银行' | ||||||
|  |         }, | ||||||
|  |         receiveName: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '分配对象', | ||||||
|  |           enum: [{ label: '全部', value: '全部' }], | ||||||
|  |           ui: { | ||||||
|  |             widget: 'select', | ||||||
|  |             placeholder: '请选择' | ||||||
|  |           }, | ||||||
|  |           default: '' | ||||||
|  |         }, | ||||||
|  |         licensePhotoWatermark: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '上传凭证', | ||||||
|  |           ui: { | ||||||
|  |             ...IMAGECONFIG, | ||||||
|  |             change: args => { | ||||||
|  |               if (args.type === 'success') { | ||||||
|  |                 this.sf.setValue('/licensePhoto', args.fileList[0].response.data.fullFilePath); | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } as SFUploadWidgetSchema | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       required: ['name', 'name2', 'name3', 'receiveName'] | ||||||
|  |     }; | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -0,0 +1,84 @@ | |||||||
|  | <page-header-wrapper title="收款单" [logo]="logo"> | ||||||
|  |     <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 class="search-box"> | ||||||
|  |     <div nz-row> | ||||||
|  |         <div nz-col nzSpan="24"> | ||||||
|  |             <se-container col="3" labelWidth="100"> | ||||||
|  |                 <se-title class="mb-md" style="font-size: 18px">基本信息</se-title> | ||||||
|  |                 <se label="网络货运人" required> | ||||||
|  |                     {{ costInfo?.ltdName }} | ||||||
|  |                 </se> | ||||||
|  |                 <se label="银行类型"> | ||||||
|  |                     {{ costInfo?.banktypeLabel }} | ||||||
|  |                 </se> | ||||||
|  |                 <se label="付款人" required> | ||||||
|  |                     {{ costInfo?.artoname }} | ||||||
|  |                 </se> | ||||||
|  |                 <se label="结算客户" required> | ||||||
|  |                     {{ costInfo?.shipperId }} | ||||||
|  |                 </se> | ||||||
|  |                 <se label="收款账户"> | ||||||
|  |                     {{ costInfo?.ltdaccountId }} | ||||||
|  |                 </se> | ||||||
|  |                 <se label="预收金额"> | ||||||
|  |                     {{ costInfo?.premoney |currency }} | ||||||
|  |                 </se> | ||||||
|  |                 <se label="收款类型" required> | ||||||
|  |                     {{ costInfo?.brmtypeLabel }} | ||||||
|  |                 </se> | ||||||
|  |             </se-container> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  | </nz-card> | ||||||
|  |  | ||||||
|  | <nz-card class="content-box" nzBordered> | ||||||
|  |     <nz-tabset> | ||||||
|  |         <nz-tab nzTitle="转入信息"> | ||||||
|  |             <!-- <div nz-row nzGutter="8"> | ||||||
|  |                 <div nz-col [nzXl]="16" [nzLg]="18" [nzSm]="24" [nzXs]="24"> | ||||||
|  |                     <sf #sf [schema]="inputSearchSchema" | ||||||
|  |                         [ui]="{ '*': { spanLabelFixed: 90,grid: { lg: 12, md: 12, sm: 12, xs: 24 } }}" [compact]="true" | ||||||
|  |                         [button]="'none'"></sf> | ||||||
|  |                 </div> | ||||||
|  |                 <div nz-col [nzXl]="8" [nzLg]="6" [nzSm]="24" [nzXs]="24"> | ||||||
|  |                     <button nz-button nzType="primary" [nzLoading]="service.http.loading" | ||||||
|  |                         (click)="inputST?.load(1)">查询</button> | ||||||
|  |                     <button nz-button (click)="resetInputSF()">重置</button> | ||||||
|  |                 </div> | ||||||
|  |             </div> --> | ||||||
|  |             <st #inputST [data]="service.$api_get_advance_collection_detail" [columns]="columns.input" | ||||||
|  |                 [page]="{ show: false }" [req]="{  process: beforeReq }" [res]="{ reName: { list: 'data' } }" | ||||||
|  |                 [loading]="service.http.loading" [scroll]="{ x: '1200px', y: '370px' }" class="mt-md"> | ||||||
|  |                 <ng-template st-row="no" let-item let-index="index" let-column="column"> | ||||||
|  |                     {{index+1}} | ||||||
|  |                 </ng-template> | ||||||
|  |             </st> | ||||||
|  |         </nz-tab> | ||||||
|  |         <!-- <nz-tab nzTitle="核销信息"> | ||||||
|  |             <div nz-row nzGutter="8"> | ||||||
|  |                 <div nz-col [nzXl]="16" [nzLg]="18" [nzSm]="24" [nzXs]="24"> | ||||||
|  |                     <sf #sf [schema]="infoSearchSchema" | ||||||
|  |                         [ui]="{ '*': { spanLabelFixed: 90,grid: { lg: 12, md: 12, sm: 12, xs: 24 } }}" [compact]="true" | ||||||
|  |                         [button]="'none'"></sf> | ||||||
|  |                 </div> | ||||||
|  |                 <div nz-col [nzXl]="8" [nzLg]="6" [nzSm]="24" [nzXs]="24"> | ||||||
|  |                     <button nz-button nzType="primary" [nzLoading]="service.http.loading" | ||||||
|  |                         (click)="infoST?.load(1)">查询</button> | ||||||
|  |                     <button nz-button (click)="resetInfoSF()">重置</button> | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  |             <st #infoST [scroll]="{ x: '2000px' }" [data]="[]" [columns]="columns.info" [req]="{ process: beforeReq }" | ||||||
|  |                 [loading]="service.http.loading" [scroll]="{ x: '1200px', y: '370px' }" class="mt-md"> | ||||||
|  |                 <ng-template st-row="no" let-item let-index="index" let-column="column"> | ||||||
|  |                     {{index+1}} | ||||||
|  |                 </ng-template> | ||||||
|  |             </st> | ||||||
|  |         </nz-tab> --> | ||||||
|  |     </nz-tabset> | ||||||
|  | </nz-card> | ||||||
| @ -0,0 +1,150 @@ | |||||||
|  | import { Component, OnInit, ViewChild } from '@angular/core'; | ||||||
|  | import { ActivatedRoute } from '@angular/router'; | ||||||
|  | import { STComponent, STColumn, STRequestOptions } from '@delon/abc/st'; | ||||||
|  | import { SFComponent, SFDateWidgetSchema, SFSchema } from '@delon/form'; | ||||||
|  | import { FreightAccountService } from '../../../services/freight-account.service'; | ||||||
|  |  | ||||||
|  | @Component({ | ||||||
|  |   selector: 'app-advance-collection-detail', | ||||||
|  |   templateUrl: './advance-collection-detail.component.html', | ||||||
|  |   styleUrls: ['../../../../commom/less/box.less', '../../../../commom/less/basic-board.less'] | ||||||
|  | }) | ||||||
|  | export class AdvanceCollectionDetailComponent implements OnInit { | ||||||
|  |   @ViewChild('inputST', { static: true }) | ||||||
|  |   inputST!: STComponent; | ||||||
|  |   columns: { [key: string]: STColumn[] } = this.initST(); | ||||||
|  |   @ViewChild('infoST', { static: true }) | ||||||
|  |   infoST!: STComponent; | ||||||
|  |   costInfo: any = {}; | ||||||
|  |   id: any = null; | ||||||
|  |  | ||||||
|  |   @ViewChild('sf', { static: false }) | ||||||
|  |   inputSF!: SFComponent; | ||||||
|  |   @ViewChild('sf', { static: false }) | ||||||
|  |   infoSF!: SFComponent; | ||||||
|  |   inputSearchSchema: SFSchema = this.initInputSF(); | ||||||
|  |   infoSearchSchema: SFSchema = this.initInfoSF(); | ||||||
|  |   constructor(public service: FreightAccountService, private route: ActivatedRoute) { | ||||||
|  |     this.id = route.snapshot.params.id; | ||||||
|  |     this.loadDetail(this.id); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   ngOnInit(): void {} | ||||||
|  |  | ||||||
|  |   beforeReq = (requestOptions: STRequestOptions) => { | ||||||
|  |     Object.assign(requestOptions.body, { | ||||||
|  |       id: this.id | ||||||
|  |     }); | ||||||
|  |     return requestOptions; | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   loadDetail(id: any) { | ||||||
|  |     this.service.request(this.service.$api_get_advance_collection_header, { id }).subscribe(res => { | ||||||
|  |       if (res) { | ||||||
|  |         this.costInfo = res; | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * 重置表单 | ||||||
|  |    */ | ||||||
|  |   resetInputSF() { | ||||||
|  |     this.inputSF.reset(); | ||||||
|  |   } | ||||||
|  |   /** | ||||||
|  |    * 重置表单 | ||||||
|  |    */ | ||||||
|  |   resetInfoSF() { | ||||||
|  |     this.infoSF.reset(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   goBack() { | ||||||
|  |     history.go(-1); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   private initInputSF(): SFSchema { | ||||||
|  |     return { | ||||||
|  |       properties: { | ||||||
|  |         feedate: { | ||||||
|  |           title: '到账日期', | ||||||
|  |           type: 'string', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'sl-from-to-search', | ||||||
|  |             format: 'yyyy-MM-dd' | ||||||
|  |           } as SFDateWidgetSchema | ||||||
|  |         }, | ||||||
|  |         billHCode: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '收款单号', | ||||||
|  |           ui: { | ||||||
|  |             placeholder: '请输入' | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   private initInfoSF(): SFSchema { | ||||||
|  |     return { | ||||||
|  |       properties: { | ||||||
|  |         feedate: { | ||||||
|  |           title: '核销日期', | ||||||
|  |           type: 'string', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'sl-from-to-search', | ||||||
|  |             format: 'yyyy-MM-dd' | ||||||
|  |           } as SFDateWidgetSchema | ||||||
|  |         }, | ||||||
|  |         billHCode: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '核销单号', | ||||||
|  |           ui: { | ||||||
|  |             placeholder: '请输入' | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   private initST(): { [key: string]: STColumn[] } { | ||||||
|  |     return { | ||||||
|  |       input: [ | ||||||
|  |         { title: '序号', render: 'no', width: 70, className: 'text-left' }, | ||||||
|  |         { title: '收款单号', index: 'brmHCode', className: 'text-left', width: 200 }, | ||||||
|  |         // { title: '到账日期', index: 'billHId', className: 'text-center', width: 150 }, | ||||||
|  |         { | ||||||
|  |           title: '到账金额', | ||||||
|  |           index: 'yskmoney', | ||||||
|  |           type: 'widget', | ||||||
|  |           className: 'text-right', | ||||||
|  |           widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yskmoney }) }, | ||||||
|  |           width: 140 | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |           title: '转预收金额', | ||||||
|  |           index: 'yskmoney', | ||||||
|  |           type: 'widget', | ||||||
|  |           className: 'text-right', | ||||||
|  |           widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yskmoney }) }, | ||||||
|  |           width: 140 | ||||||
|  |         }, | ||||||
|  |         // { title: '预收备注', index: 'callNo', width: 200 } | ||||||
|  |       ], | ||||||
|  |       info: [ | ||||||
|  |         { title: '序号', render: 'no', width: 70, className: 'text-left' }, | ||||||
|  |         { title: '核销单号', index: 'cnoName', className: 'text-left', width: 200 }, | ||||||
|  |         { title: '核销日期', index: 'billHId', className: 'text-center', width: 150 }, | ||||||
|  |         { | ||||||
|  |           title: '核销金额', | ||||||
|  |           index: 'yskmoney', | ||||||
|  |           type: 'widget', | ||||||
|  |           className: 'text-right', | ||||||
|  |           widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yskmoney }) }, | ||||||
|  |           width: 200 | ||||||
|  |         }, | ||||||
|  |         { title: '核销备注', index: 'vatapptype', className: 'text-left', width: 200 } | ||||||
|  |       ] | ||||||
|  |     }; | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -0,0 +1,28 @@ | |||||||
|  | <page-header-wrapper title="预收款余额"> | ||||||
|  | </page-header-wrapper> | ||||||
|  |  | ||||||
|  | <nz-card class="search-box"> | ||||||
|  |     <div nz-row nzGutter="8"> | ||||||
|  |         <div nz-col [nzXl]="_$expand ? 24 : 18" [nzLg]="24" [nzSm]="24" [nzXs]="24"> | ||||||
|  |             <sf #sf [schema]="searchSchema" | ||||||
|  |                 [ui]="{ '*': { spanLabelFixed: 110,grid: { lg: 8, md: 12, sm: 12, xs: 24 } }}" [compact]="true" | ||||||
|  |                 [button]="'none'"></sf> | ||||||
|  |         </div> | ||||||
|  |         <div nz-col [nzXl]="_$expand ? 24 : 6" [nzLg]="24" [nzSm]="24" [nzXs]="24" [class.expend-options]="_$expand" | ||||||
|  |             class="text-right"> | ||||||
|  |             <button nz-button nzType="primary" [nzLoading]="service.http.loading" (click)="st?.load(1)">查询</button> | ||||||
|  |             <button nz-button (click)="resetSF()">重置</button> | ||||||
|  |             <button nz-button (click)="exportList()"> 导出</button> | ||||||
|  |             <button nz-button nzType="link" (click)="expandToggle()"> | ||||||
|  |                 {{ !_$expand ? '展开' : '收起' }} | ||||||
|  |                 <i nz-icon [nzType]="!_$expand ? 'down' : 'up'"></i> | ||||||
|  |             </button> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  | </nz-card> | ||||||
|  |  | ||||||
|  | <nz-card class="content-box"> | ||||||
|  |     <st #st [data]="service.$api_get_advance_collection_page" [columns]="columns" [req]="{  process: beforeReq }" | ||||||
|  |         [loading]="service.http.loading" [scroll]="{ x: '1200px' }"> | ||||||
|  |     </st> | ||||||
|  | </nz-card> | ||||||
| @ -0,0 +1,164 @@ | |||||||
|  | import { Component, OnInit, ViewChild } from '@angular/core'; | ||||||
|  | import { Router } from '@angular/router'; | ||||||
|  | import { STComponent, STColumn, STRequestOptions } from '@delon/abc/st'; | ||||||
|  | import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; | ||||||
|  | import { NzModalService } from 'ng-zorro-antd/modal'; | ||||||
|  | import { AccountDetailComponent } from 'src/app/shared/components/account-detail/account-detail.component'; | ||||||
|  | import { FreightAccountService } from '../../services/freight-account.service'; | ||||||
|  |  | ||||||
|  | @Component({ | ||||||
|  |   selector: 'app-advance-collection', | ||||||
|  |   templateUrl: './advance-collection.component.html', | ||||||
|  |   styleUrls: ['../../../commom/less/box.less', '../../../commom/less/expend-but.less'] | ||||||
|  | }) | ||||||
|  | export class AdvanceCollectionComponent implements OnInit { | ||||||
|  |   @ViewChild('st', { static: true }) | ||||||
|  |   st!: STComponent; | ||||||
|  |   @ViewChild('sf', { static: false }) | ||||||
|  |   sf!: SFComponent; | ||||||
|  |  | ||||||
|  |   searchSchema: SFSchema = this.initSF(); | ||||||
|  |   columns: STColumn[] = this.initST(); | ||||||
|  |   _$expand = false; | ||||||
|  |  | ||||||
|  |   constructor(public service: FreightAccountService, private router: Router, private modal: NzModalService) {} | ||||||
|  |  | ||||||
|  |   ngOnInit(): void {} | ||||||
|  |  | ||||||
|  |   beforeReq = (requestOptions: STRequestOptions) => { | ||||||
|  |     if (this.sf) { | ||||||
|  |       Object.assign(requestOptions.body, { ...this.sf.value }); | ||||||
|  |     } | ||||||
|  |     return requestOptions; | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * 重置表单 | ||||||
|  |    */ | ||||||
|  |   resetSF() { | ||||||
|  |     this.sf.reset(); | ||||||
|  |     this._$expand = false; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * 伸缩查询条件 | ||||||
|  |    */ | ||||||
|  |   expandToggle() { | ||||||
|  |     this._$expand = !this._$expand; | ||||||
|  |     this.sf?.setValue('/expand', this._$expand); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   exportList() { | ||||||
|  |     this.service.downloadFile(this.service.$mock_url, { ...this.sf.value, pageIndex: this.st.pi, pageSize: this.st.ps }); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   private initSF(): SFSchema { | ||||||
|  |     return { | ||||||
|  |       properties: { | ||||||
|  |         expand: { | ||||||
|  |           type: 'boolean', | ||||||
|  |           ui: { | ||||||
|  |             hidden: true | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         ltdId: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '网络货运人', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'select', | ||||||
|  |             placeholder: '请选择', | ||||||
|  |             allowClear: true, | ||||||
|  |             asyncData: () => this.service.getNetworkFreightForwarder() | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         cno: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '结算客户', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'select', | ||||||
|  |             placeholder: '请选择', | ||||||
|  |             allowClear: true, | ||||||
|  |             asyncData: () => this.service.getCloseAccount() | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         arto: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '付款人', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'select', | ||||||
|  |             placeholder: '请选择', | ||||||
|  |             allowClear: true, | ||||||
|  |             asyncData: () => this.service.getCRM() | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         brmtype: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '收款类型', | ||||||
|  |           enum: [{ label: '全部', value: null }], | ||||||
|  |           ui: { | ||||||
|  |             widget: 'select', | ||||||
|  |             placeholder: '请选择', | ||||||
|  |             visibleIf: { | ||||||
|  |               expand: (value: boolean) => value | ||||||
|  |             } | ||||||
|  |           }, | ||||||
|  |           default: null | ||||||
|  |         }, | ||||||
|  |         bankType: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '银行类型', | ||||||
|  |           enum: [ | ||||||
|  |             { label: '全部', value: null }, | ||||||
|  |             { label: '平安银行', value: '1' }, | ||||||
|  |             { label: '浦发银行', value: '2' } | ||||||
|  |           ], | ||||||
|  |           ui: { | ||||||
|  |             widget: 'select', | ||||||
|  |             placeholder: '请选择', | ||||||
|  |             visibleIf: { | ||||||
|  |               expand: (value: boolean) => value | ||||||
|  |             } | ||||||
|  |           }, | ||||||
|  |           default: null | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   private initST(): STColumn[] { | ||||||
|  |     return [ | ||||||
|  |       { title: '网络货运人', width: 160, index: 'ltdName' }, | ||||||
|  |       { title: '银行类型', width: 120, index: 'banktypeLabel' }, | ||||||
|  |       { title: '收款账户', width: 150, index: 'ltdaccountId' }, | ||||||
|  |       { title: '收款类型', width: 120, index: 'brmtypeLabel' }, | ||||||
|  |       { | ||||||
|  |         title: '预收余额', | ||||||
|  |         index: 'yskmoney', | ||||||
|  |         width: 140, | ||||||
|  |         type: 'widget', | ||||||
|  |         className: 'text-right', | ||||||
|  |         widget: { type: 'currency-chy', params: ({ record }) => ({ value: record.yskmoney }) } | ||||||
|  |       }, | ||||||
|  |       { title: '付款人', index: 'artoName', width: 180 }, | ||||||
|  |       { title: '结算客户', index: 'cnoName', width: 150 }, | ||||||
|  |       { | ||||||
|  |         title: '操作', | ||||||
|  |         width: 120, | ||||||
|  |         className: 'text-center', | ||||||
|  |         fixed: 'right', | ||||||
|  |         buttons: [ | ||||||
|  |           { | ||||||
|  |             text: '浏览', | ||||||
|  |             click: item => this.router.navigate(['/financial-management/advance-collection/detail/' + item.id]) | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             text: '核销' | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             text: '退款' | ||||||
|  |           } | ||||||
|  |         ] | ||||||
|  |       } | ||||||
|  |     ]; | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -0,0 +1,177 @@ | |||||||
|  | <page-header-wrapper title="费用单" [logo]="logo"> | ||||||
|  |   <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 class="search-box"> | ||||||
|  |   <div nz-row> | ||||||
|  |     <div nz-col nzSpan="24"> | ||||||
|  |       <se-container col="3" labelWidth="100" *ngIf="!textStatus"> | ||||||
|  |         <se-title class="mb-md" style="font-size: 18px">基本信息(应收费用)</se-title> | ||||||
|  |         <se label="网络货运人" required> | ||||||
|  |           {{ costInfo?.ltdName }} | ||||||
|  |         </se> | ||||||
|  |         <se label="费用类型" required col="2"> | ||||||
|  |           {{ costInfo?.feetypeLabel }} | ||||||
|  |         </se> | ||||||
|  |         <se label="费用备注"> | ||||||
|  |           {{ costInfo?.arremarks }} | ||||||
|  |         </se> | ||||||
|  |         <se label="应收对象" required> | ||||||
|  |           {{ costInfo?.artoname }} | ||||||
|  |         </se> | ||||||
|  |         <se label="开票类型" required> | ||||||
|  |           {{ costInfo?.arvattypeLabel }} | ||||||
|  |         </se> | ||||||
|  |         <se label="应收金额" required> | ||||||
|  |           {{ costInfo?.armoeny }} | ||||||
|  |         </se> | ||||||
|  |         <se label="开票金额" required> | ||||||
|  |           {{ costInfo?.arkpmoney }} | ||||||
|  |         </se> | ||||||
|  |         <se label="收款金额" required> | ||||||
|  |           {{ costInfo?.armoeny }} | ||||||
|  |         </se> | ||||||
|  |       </se-container> | ||||||
|  |       <se-container col="3" labelWidth="100" *ngIf="textStatus" class="mt-md"> | ||||||
|  |         <se-title class="mb-md" style="font-size: 18px">基本信息(应付费用)</se-title> | ||||||
|  |         <se label="网络货运人" required> | ||||||
|  |           {{ costInfo?.ltdName }} | ||||||
|  |         </se> | ||||||
|  |         <se label="费用类型" required> | ||||||
|  |           {{ costInfo?.feetypeLabel }} | ||||||
|  |         </se> | ||||||
|  |         <se label="应付核销" required> </se> | ||||||
|  |         <se label="费用备注"> | ||||||
|  |           {{ costInfo?.hrremarks }} | ||||||
|  |         </se> | ||||||
|  |         <se label="应收对象" required> | ||||||
|  |           {{ costInfo?.hrtoname }} | ||||||
|  |         </se> | ||||||
|  |         <se label="收票类型" required> | ||||||
|  |           {{ costInfo?.hrvattypeLabel }} | ||||||
|  |         </se> | ||||||
|  |         <se label="应付金额" required> | ||||||
|  |           {{ costInfo?.hrmoney }} | ||||||
|  |         </se> | ||||||
|  |         <se label="收票金额" required> | ||||||
|  |           {{ costInfo?.hrvatmoney }} | ||||||
|  |         </se> | ||||||
|  |         <se label="付款金额" required> | ||||||
|  |           {{ costInfo?.hrpaymoney }} | ||||||
|  |         </se> | ||||||
|  |       </se-container> | ||||||
|  |     </div> | ||||||
|  |   </div> | ||||||
|  | </nz-card> | ||||||
|  |  | ||||||
|  | <nz-card class="content-box" nzBordered> | ||||||
|  |   <nz-tabset> | ||||||
|  |     <nz-tab nzTitle="费用明细"> | ||||||
|  |       <st | ||||||
|  |         #st | ||||||
|  |         [scroll]="{ x: '2000px' }" | ||||||
|  |         [data]="costInfo?.ficoFeeLList" | ||||||
|  |         [columns]="columns.cost" | ||||||
|  |         [page]="{ show: false }" | ||||||
|  |         [loading]="service.http.loading" | ||||||
|  |         [scroll]="{ x: '1200px', y: '370px' }" | ||||||
|  |       > | ||||||
|  |       <ng-template st-row="artocode" let-item let-index="index"> | ||||||
|  |         {{ costInfo?.artocode}}/{{ costInfo?.artonames}} | ||||||
|  |       </ng-template> | ||||||
|  |       <ng-template st-row="hrvatmoney" let-item let-index="index"> | ||||||
|  |         <span *ngIf="!textStatus">{{  item.armoney | currency}}</span> | ||||||
|  |         <span *ngIf="textStatus">{{  item.hrmoney | currency}}</span> | ||||||
|  |       </ng-template> | ||||||
|  |       <ng-template st-row="armoney" let-item let-index="index"> | ||||||
|  |         {{ item.armoney | currency}} | ||||||
|  |       </ng-template> | ||||||
|  |       <ng-template st-row="arkpmoney" let-item let-index="index"> | ||||||
|  |         {{ item.arkpmoney | currency}} | ||||||
|  |       </ng-template> | ||||||
|  |         <ng-template st-row="no" let-item let-index="index" let-column="column"> | ||||||
|  |           {{ textStatus ? item.hrmoney : item.hrvatmoney }} | ||||||
|  |         </ng-template> | ||||||
|  |         <ng-template st-row="billTime" let-item let-index="index" let-column="column"> | ||||||
|  |           {{costInfo.billTime}} | ||||||
|  |         </ng-template> | ||||||
|  |         <ng-template st-row="cnoName" let-item let-index="index" let-column="column"> | ||||||
|  |           {{costInfo.cnoName}} | ||||||
|  |         </ng-template> | ||||||
|  |       </st> | ||||||
|  |     </nz-tab> | ||||||
|  |     <nz-tab nzTitle="开票信息"> | ||||||
|  |       <st | ||||||
|  |         #st | ||||||
|  |         [scroll]="{ x: '2000px' }" | ||||||
|  |         [data]="costInfo?.ficoVatappDatailList" | ||||||
|  |         [columns]="columns.requested" | ||||||
|  |         [page]="{ show: false }" | ||||||
|  |         [loading]="service.http.loading" | ||||||
|  |         [scroll]="{ x: '1200px', y: '370px' }" | ||||||
|  |       > | ||||||
|  |       <ng-template st-row="vatnotax" let-item let-index="index"> | ||||||
|  |         {{ item.vatnotax | currency}} | ||||||
|  |       </ng-template> | ||||||
|  |       <ng-template st-row="vatmoney" let-item let-index="index"> | ||||||
|  |         {{ item.vatmoney | currency}} | ||||||
|  |       </ng-template> | ||||||
|  |         <ng-template st-row="no" let-item let-index="index" let-column="column"> | ||||||
|  |           {{ index + 1 }} | ||||||
|  |         </ng-template> | ||||||
|  |       </st> | ||||||
|  |     </nz-tab> | ||||||
|  |     <nz-tab nzTitle="收款信息"> | ||||||
|  |       <st | ||||||
|  |         #st | ||||||
|  |         [scroll]="{ x: '2000px' }" | ||||||
|  |         [data]="costInfo?.ficoAhxLList" | ||||||
|  |         [columns]="columns.collection" | ||||||
|  |         [page]="{ show: false }" | ||||||
|  |         [loading]="service.http.loading" | ||||||
|  |         [scroll]="{ x: '1200px', y: '370px' }" | ||||||
|  |       > | ||||||
|  |       <ng-template st-row="ahxmoney" let-item let-index="index"> | ||||||
|  |         {{ item.ahxmoney | currency}} | ||||||
|  |       </ng-template> | ||||||
|  |       <ng-template st-row="ahxmoney" let-item let-index="index"> | ||||||
|  |         {{ item.ahxmoney | currency}} | ||||||
|  |       </ng-template> | ||||||
|  |         <ng-template st-row="no" let-item let-index="index" let-column="column"> | ||||||
|  |           {{ index + 1 }} | ||||||
|  |         </ng-template> | ||||||
|  |         <ng-template st-row="status" let-item let-index="index" let-column="column"> 已核销 </ng-template> | ||||||
|  |       </st> | ||||||
|  |     </nz-tab> | ||||||
|  |     <nz-tab nzTitle="收票信息"> | ||||||
|  |       <st | ||||||
|  |         #st | ||||||
|  |         [data]="data" | ||||||
|  |         [scroll]="{ x: '2000px' }" | ||||||
|  |         [columns]="columns.ticket" | ||||||
|  |         [page]="{ show: false }" | ||||||
|  |         [loading]="service.http.loading" | ||||||
|  |         [scroll]="{ x: '1200px', y: '370px' }" | ||||||
|  |       ></st> | ||||||
|  |     </nz-tab> | ||||||
|  |     <nz-tab nzTitle="付款信息"> | ||||||
|  |       <st | ||||||
|  |         #st | ||||||
|  |         [scroll]="{ x: '2000px' }" | ||||||
|  |         [data]="costInfo?.ficoPhxLList" | ||||||
|  |         [columns]="columns.payment" | ||||||
|  |         [page]="{ show: false }" | ||||||
|  |         [loading]="service.http.loading" | ||||||
|  |         [scroll]="{ x: '1200px', y: '370px' }" | ||||||
|  |       > | ||||||
|  |         <ng-template st-row="no" let-item let-index="index" let-column="column"> | ||||||
|  |           {{ index + 1 }} | ||||||
|  |         </ng-template> | ||||||
|  |       </st> | ||||||
|  |     </nz-tab> | ||||||
|  |   </nz-tabset> | ||||||
|  | </nz-card> | ||||||
| @ -0,0 +1,24 @@ | |||||||
|  | :host::ng-deep { | ||||||
|  |     .search-box { | ||||||
|  |         .ant-card-body { | ||||||
|  |             padding-bottom: 18px; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     .content-box { | ||||||
|  |         .ant-card-body { | ||||||
|  |             padding-top: 14px; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     .text-truncate { | ||||||
|  |         white-space: normal; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     .ant-form-item { | ||||||
|  |         margin-bottom: 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,103 @@ | |||||||
|  | import { Component, OnInit, ViewChild } from '@angular/core'; | ||||||
|  | import { ActivatedRoute } from '@angular/router'; | ||||||
|  | import { STComponent, STColumn } from '@delon/abc/st'; | ||||||
|  | import { FreightAccountService } from '../../../services/freight-account.service'; | ||||||
|  |  | ||||||
|  | @Component({ | ||||||
|  |   selector: 'app-cost-management-detail', | ||||||
|  |   templateUrl: './cost-management-detail.component.html', | ||||||
|  |   styleUrls: ['./cost-management-detail.component.less'] | ||||||
|  | }) | ||||||
|  | export class CostManagementDetailComponent implements OnInit { | ||||||
|  |   @ViewChild('st', { static: true }) | ||||||
|  |   st!: STComponent; | ||||||
|  |   columns: { [key: string]: STColumn[] } = this.initST(); | ||||||
|  |   data = []; | ||||||
|  |   textStatus: boolean = false; | ||||||
|  |   costInfo: any = {}; | ||||||
|  |   constructor(public service: FreightAccountService, private route: ActivatedRoute) { | ||||||
|  |     const id = route.snapshot.params.id; | ||||||
|  |     this.loadDetail(id); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   ngOnInit(): void { | ||||||
|  |     if (this.route.snapshot?.queryParams?.status === '应收') { | ||||||
|  |       this.textStatus = false; | ||||||
|  |     } else { | ||||||
|  |       this.textStatus = true; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   loadDetail(id: any) { | ||||||
|  |     this.service.request(this.service.$api_get_cost_detail, { id }).subscribe(res => { | ||||||
|  |       if (res) { | ||||||
|  |         this.costInfo = res; | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   goBack() { | ||||||
|  |     history.go(-1); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   private initST(): { [key: string]: STColumn[] } { | ||||||
|  |     return { | ||||||
|  |       cost: [ | ||||||
|  |         { title: '序号', render: 'no', width: 70, className: 'text-left' }, | ||||||
|  |         { title: '费用明细号', index: 'feeHId', className: 'text-left', width: 200 }, | ||||||
|  |         { title: '订单号', index: 'billHCode', className: 'text-left', width: 200 }, | ||||||
|  |         { title: '订单日期', render: 'billTime', className: 'text-left', width: 200 }, | ||||||
|  |         { title: '运单号', index: 'waybillHCode', className: 'text-left', width: 200 }, | ||||||
|  |         { title: '运单日期', index: 'waybillDate', className: 'text-left', width: 200, format: _ => this.costInfo.billTime }, | ||||||
|  |         { title: '结算客户', render: 'cnoName', className: 'text-left', width: 200 }, | ||||||
|  |         { title: '订单费用类型', index: 'billLTypeLabel', className: 'text-left', width: 200 }, | ||||||
|  |         { title: '费用科目', index: 'feeSubName', className: 'text-left', width: 200 }, | ||||||
|  |         { title: '税率', index: 'hrvatrate', className: 'text-right', width: 200 }, | ||||||
|  |         { title: '费用金额', render: 'hrvatmoney', className: 'text-right', width: 200 }, | ||||||
|  |         { title: '收/付款金额', render: 'armoney', className: 'text-right', width: 200 }, | ||||||
|  |         { title: '开/收票金额', render: 'arkpmoney', className: 'text-right', width: 200 } | ||||||
|  |       ], | ||||||
|  |       requested: [ | ||||||
|  |         { title: '序号', render: 'no', width: 70, className: 'text-left' }, | ||||||
|  |         { title: '费用明细号', index: 'feeLId', className: 'text-left', width: 200 }, | ||||||
|  |         { title: '发票申请', index: 'vatinvcode', className: 'text-left', width: 200 }, | ||||||
|  |         { title: '发票类型', index: 'vatapptype', className: 'text-left', width: 200 }, | ||||||
|  |         { title: '发票号', index: 'vatappcode', className: 'text-left', width: 200 }, | ||||||
|  |         { title: '发票日期', index: 'vatappdate', className: 'text-left', width: 200 }, | ||||||
|  |         { title: '发票状态', index: 'stsLabel', className: 'text-left', width: 200 }, | ||||||
|  |         { title: '应收金额', render: 'armoney', className: 'text-left', width: 200 }, | ||||||
|  |         { title: '开票金额', render: 'vatmoney', className: 'text-left', width: 200 } | ||||||
|  |       ], | ||||||
|  |       collection: [ | ||||||
|  |         { title: '序号', render: 'no', width: 70 }, | ||||||
|  |         { title: '费用明细号', index: 'feeLId', className: 'text-left', width: 200 }, | ||||||
|  |         { title: '收款单号', index: 'ahxHId', className: 'text-left', width: 200 }, | ||||||
|  |         { title: '收款日期', index: 'feedate', className: 'text-left', width: 200 }, | ||||||
|  |         { title: '收款状态', render: 'status', className: 'text-left', width: 150 }, | ||||||
|  |         { title: '应收金额', render: 'ahxmoney', className: 'text-left', width: 120 }, | ||||||
|  |         { title: '收款金额', render: 'ahxmoney', className: 'text-left', width: 120 } | ||||||
|  |       ], | ||||||
|  |       ticket: [ | ||||||
|  |         { title: '序号', render: 'no', width: 70 }, | ||||||
|  |         { title: '费用明细号', index: 'callNo' }, | ||||||
|  |         { title: '进项发票号', index: 'callNo' }, | ||||||
|  |         { title: '发票类型', index: 'callNo' }, | ||||||
|  |         { title: '发票日期', index: 'callNo' }, | ||||||
|  |         { title: '认证日期', index: 'callNo' }, | ||||||
|  |         { title: '发票状态', index: 'callNo' }, | ||||||
|  |         { title: '应付金额', index: 'callNo' }, | ||||||
|  |         { title: '收票金额', index: 'callNo' } | ||||||
|  |       ], | ||||||
|  |       payment: [ | ||||||
|  |         { title: '序号', render: 'no', width: 70 }, | ||||||
|  |         { title: '费用明细号', index: 'feeHCode' }, | ||||||
|  |         { title: '付款单号', index: 'phxHId' }, | ||||||
|  |         { title: '要求日期', index: 'billTime' }, | ||||||
|  |         { title: '确认日期', index: 'feedate' }, | ||||||
|  |         { title: '付款状态', index: 'callNo' }, | ||||||
|  |         { title: '应付金额', index: 'callNo' }, | ||||||
|  |         { title: '付款金额', index: 'phxmoney' } | ||||||
|  |       ] | ||||||
|  |     }; | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -0,0 +1,71 @@ | |||||||
|  | <!-- | ||||||
|  |  * @Description  :  | ||||||
|  |  * @Version      : 1.0 | ||||||
|  |  * @Author       : Shiming | ||||||
|  |  * @Date         : 2021-12-30 19:36:30 | ||||||
|  |  * @LastEditors  : Shiming | ||||||
|  |  * @LastEditTime : 2022-01-20 17:14:57 | ||||||
|  |  * @FilePath     : \\tms-obc-web\\src\\app\\routes\\financial-management\\components\\cost-management\\cost-management.component.html | ||||||
|  |  * Copyright (C) 2022 huzhenhong. All rights reserved. | ||||||
|  | --> | ||||||
|  | <page-header-wrapper title="费用管理"> </page-header-wrapper> | ||||||
|  |  | ||||||
|  | <nz-card class="search-box"> | ||||||
|  |   <div nz-row nzGutter="8"> | ||||||
|  |     <div nz-col [nzXl]="_$expand ? 24 : 18" [nzLg]="24" [nzSm]="24" [nzXs]="24"> | ||||||
|  |       <sf #sf [schema]="searchSchema" [ui]="{ '*': { spanLabelFixed: 110, grid: { lg: 8, md: 12, sm: 12, xs: 24 } } }" | ||||||
|  |         [compact]="true" [button]="'none'"></sf> | ||||||
|  |     </div> | ||||||
|  |     <div nz-col [nzXl]="_$expand ? 24 : 6" [nzLg]="24" [nzSm]="24" [nzXs]="24" class="text-right"> | ||||||
|  |       <button nz-button nzType="primary" [nzLoading]="service.http.loading" (click)="st?.load(1)">查询</button> | ||||||
|  |       <button nz-button (click)="resetSF()">重置</button> | ||||||
|  |       <!-- <button nz-button (click)="exportList()"> 导出</button> | ||||||
|  |       <button nz-button (click)="exportList()"> 导出明细</button> --> | ||||||
|  |       <button nz-button nzType="link" (click)="expandToggle()"> | ||||||
|  |         {{ !_$expand ? '展开' : '收起' }} | ||||||
|  |         <i nz-icon [nzType]="!_$expand ? 'down' : 'up'"></i> | ||||||
|  |       </button> | ||||||
|  |     </div> | ||||||
|  |   </div> | ||||||
|  | </nz-card> | ||||||
|  |  | ||||||
|  | <nz-card class="content-box"> | ||||||
|  |   <div nz-row class="mb-sm"> | ||||||
|  |     <div nz-col nzSpan="24"> | ||||||
|  |       <!-- <button nz-button nzType="primary" [nzLoading]="service.http.loading" | ||||||
|  |         (click)="routeTo('/financial-management/cost-management/expenses-receivable/1')">添加应收费用</button> | ||||||
|  |       <button nz-button nzType="primary" [nzLoading]="service.http.loading" | ||||||
|  |         (click)="routeTo('/financial-management/cost-management/expenses-payable/1')">添加应付费用</button> | ||||||
|  |       <button nz-button nzType="primary" [nzLoading]="service.http.loading">导入费用</button> --> | ||||||
|  |     </div> | ||||||
|  |   </div> | ||||||
|  |   <st #st [data]="service.$api_get_cost_page" [columns]="columns" [req]="{ process: beforeReq }" | ||||||
|  |     [loading]="service.http.loading" [scroll]="{ x: '2000px' }"> | ||||||
|  |     <ng-template st-row="armoeny" let-item let-index="index"> | ||||||
|  |       {{ item.armoeny | currency}} | ||||||
|  |     </ng-template> | ||||||
|  |     <ng-template st-row="hrmoney" let-item let-index="index"> | ||||||
|  |       {{ item.hrmoney | currency}} | ||||||
|  |     </ng-template> | ||||||
|  |     <ng-template st-row="artocode" let-item let-index="index"> | ||||||
|  |       {{ item.cnoCode}}/{{ item.cnoName}} | ||||||
|  |     </ng-template> | ||||||
|  |     <ng-template st-row="hrpaymoney" let-item let-index="index"> | ||||||
|  |       {{ item.hrpaymoney | currency}} | ||||||
|  |     </ng-template> | ||||||
|  |     <ng-template st-row="hrvatmoney" let-item let-index="index"> | ||||||
|  |       {{ item.hrvatmoney | currency}} | ||||||
|  |     </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,317 @@ | |||||||
|  | import { Component, OnInit, ViewChild } from '@angular/core'; | ||||||
|  | import { Router } from '@angular/router'; | ||||||
|  | import { STComponent, STColumn, STRequestOptions } from '@delon/abc/st'; | ||||||
|  | import { SFComponent, SFSchema, SFDateWidgetSchema, SFSelectWidgetSchema, SFSchemaEnum } from '@delon/form'; | ||||||
|  | import { NzModalService } from 'ng-zorro-antd/modal'; | ||||||
|  | import { of } from 'rxjs'; | ||||||
|  | import { map } from 'rxjs/operators'; | ||||||
|  | import { FreightAccountService } from '../../services/freight-account.service'; | ||||||
|  |  | ||||||
|  | @Component({ | ||||||
|  |   selector: 'app-cost-management', | ||||||
|  |   templateUrl: './cost-management.component.html', | ||||||
|  |   styleUrls: ['../../../commom/less/box.less'] | ||||||
|  | }) | ||||||
|  | export class CostManagementComponent implements OnInit { | ||||||
|  |   @ViewChild('st', { static: true }) | ||||||
|  |   st!: STComponent; | ||||||
|  |   @ViewChild('sf', { static: false }) | ||||||
|  |   sf!: SFComponent; | ||||||
|  |   @ViewChild('auditModal', { static: false }) | ||||||
|  |   auditModal!: any; | ||||||
|  |   searchSchema: SFSchema = this.initSF(); | ||||||
|  |   columns: STColumn[] = this.initST(); | ||||||
|  |  | ||||||
|  |   selectedRows: any[] = []; | ||||||
|  |  | ||||||
|  |   _$expand = false; | ||||||
|  |  | ||||||
|  |   constructor(public service: FreightAccountService, private nzModalService: NzModalService, private router: Router) {} | ||||||
|  |  | ||||||
|  |   ngOnInit(): void {} | ||||||
|  |  | ||||||
|  |   beforeReq = (requestOptions: STRequestOptions) => { | ||||||
|  |     if (this.sf) { | ||||||
|  |       Object.assign(requestOptions.body, { | ||||||
|  |         ...this.sf.value, | ||||||
|  |         feedate: { | ||||||
|  |           start: this.sf.value.feedate?.[0] || '', | ||||||
|  |           end: this.sf.value.feedate?.[1] || '' | ||||||
|  |         }, | ||||||
|  |         createTime: { | ||||||
|  |           start: this.sf.value.createTime?.[0] || '', | ||||||
|  |           end: this.sf.value.createTime?.[1] || '' | ||||||
|  |         } | ||||||
|  |       }); | ||||||
|  |     } | ||||||
|  |     return requestOptions; | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   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(); | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * 重置表单 | ||||||
|  |    */ | ||||||
|  |   resetSF() { | ||||||
|  |     this.sf.reset(); | ||||||
|  |     this._$expand = false; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * 伸缩查询条件 | ||||||
|  |    */ | ||||||
|  |   expandToggle() { | ||||||
|  |     this._$expand = !this._$expand; | ||||||
|  |     this.sf?.setValue('/expand', this._$expand); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   exportList() { | ||||||
|  |     this.service.downloadFile(this.service.$mock_url, { ...this.sf.value, pageIndex: this.st.pi, pageSize: this.st.ps }); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   routeTo(url: string, params?: any, status?: any) { | ||||||
|  |     this.router.navigate([url], { queryParams: params }); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   private initSF(): SFSchema { | ||||||
|  |     return { | ||||||
|  |       properties: { | ||||||
|  |         expand: { | ||||||
|  |           type: 'boolean', | ||||||
|  |           ui: { | ||||||
|  |             hidden: true | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         feecode: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '费用单号', | ||||||
|  |           ui: { placeholder: '请输入' } | ||||||
|  |         }, | ||||||
|  |         billHCode: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '订单号', | ||||||
|  |           ui: { placeholder: '请输入' } | ||||||
|  |         }, | ||||||
|  |         waybillHCode: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '运单号', | ||||||
|  |           ui: { | ||||||
|  |             placeholder: '请输入' | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         feedate: { | ||||||
|  |           title: '费用日期', | ||||||
|  |           type: 'string', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'sl-from-to-search', | ||||||
|  |             format: 'yyyy-MM-dd', | ||||||
|  |             placeholder: '请选择', | ||||||
|  |             nzShowTime: true, | ||||||
|  |             visibleIf: { | ||||||
|  |               expand: (value: boolean) => value | ||||||
|  |             } | ||||||
|  |           } as SFDateWidgetSchema | ||||||
|  |         }, | ||||||
|  |         feetype: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '费用类型', | ||||||
|  |           enum: [ | ||||||
|  |             { label: '全部', value: '' }, | ||||||
|  |             { label: '应收', value: 1 }, | ||||||
|  |             { label: '应付', value: 2 } | ||||||
|  |           ], | ||||||
|  |           ui: { | ||||||
|  |             widget: 'select', | ||||||
|  |             placeholder: '请选择', | ||||||
|  |             visibleIf: { | ||||||
|  |               expand: (value: boolean) => value | ||||||
|  |             } | ||||||
|  |           }, | ||||||
|  |           default: '' | ||||||
|  |         }, | ||||||
|  |         feeSubId: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '费用科目', | ||||||
|  |           enum: [{ label: '全部', value: '全部' }], | ||||||
|  |           ui: { | ||||||
|  |             widget: 'select', | ||||||
|  |             placeholder: '请选择', | ||||||
|  |             visibleIf: { | ||||||
|  |               expand: (value: boolean) => value | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         ltdId: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '网络货运人', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'select', | ||||||
|  |             placeholder: '请选择', | ||||||
|  |             allowClear: true, | ||||||
|  |             asyncData: () => this.service.getNetworkFreightForwarder(), | ||||||
|  |             visibleIf: { | ||||||
|  |               expand: (value: boolean) => value | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         hrto: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '应付对象', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'select', | ||||||
|  |             serverSearch: true, | ||||||
|  |             searchDebounceTime: 300, | ||||||
|  |             searchLoadingText: '搜索中...', | ||||||
|  |             allowClear: true, | ||||||
|  |             onSearch: (q: any) => { | ||||||
|  |               if (!!q) { | ||||||
|  |                 return this.service | ||||||
|  |                   .request(this.service.$api_enterpriceList, { enterpriseName: q }) | ||||||
|  |                   .pipe(map((res: any) => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) | ||||||
|  |                   .toPromise(); | ||||||
|  |               } else { | ||||||
|  |                 return of([]); | ||||||
|  |               } | ||||||
|  |             }, | ||||||
|  |             visibleIf: { | ||||||
|  |               expand: (value: boolean) => value | ||||||
|  |             } | ||||||
|  |           } as SFSelectWidgetSchema | ||||||
|  |         }, | ||||||
|  |         arto: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '应收对象', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'select', | ||||||
|  |             serverSearch: true, | ||||||
|  |             searchDebounceTime: 300, | ||||||
|  |             searchLoadingText: '搜索中...', | ||||||
|  |             allowClear: true, | ||||||
|  |             onSearch: (q: any) => { | ||||||
|  |               if (!!q) { | ||||||
|  |                 return this.service | ||||||
|  |                   .request(this.service.$api_enterpriceList, { enterpriseName: q }) | ||||||
|  |                   .pipe(map((res: any) => (res as any[]).map(i => ({ label: i.enterpriseName, value: i.id } as SFSchemaEnum)))) | ||||||
|  |                   .toPromise(); | ||||||
|  |               } else { | ||||||
|  |                 return of([]); | ||||||
|  |               } | ||||||
|  |             }, | ||||||
|  |             visibleIf: { | ||||||
|  |               expand: (value: boolean) => value | ||||||
|  |             } | ||||||
|  |           } as SFSelectWidgetSchema | ||||||
|  |         }, | ||||||
|  |         createTime: { | ||||||
|  |           title: '创建时间', | ||||||
|  |           type: 'string', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'sl-from-to-search', | ||||||
|  |             format: 'yyyy-MM-dd', | ||||||
|  |             placeholder: '请选择', | ||||||
|  |             nzShowTime: true, | ||||||
|  |             visibleIf: { | ||||||
|  |               expand: (value: boolean) => value | ||||||
|  |             } | ||||||
|  |           } as SFDateWidgetSchema | ||||||
|  |         }, | ||||||
|  |         ishrhx: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '应付核销', | ||||||
|  |           enum: [ | ||||||
|  |             { label: '全部', value: '' }, | ||||||
|  |             { label: '否', value: 0 }, | ||||||
|  |             { label: '是', value: 1 } | ||||||
|  |           ], | ||||||
|  |           ui: { | ||||||
|  |             widget: 'select', | ||||||
|  |             placeholder: '请选择', | ||||||
|  |             visibleIf: { | ||||||
|  |               expand: (value: boolean) => value | ||||||
|  |             } | ||||||
|  |           }, | ||||||
|  |           default: '' | ||||||
|  |         }, | ||||||
|  |         cno: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '结算客户', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'select', | ||||||
|  |             placeholder: '请选择', | ||||||
|  |             allowClear: true, | ||||||
|  |             asyncData: () => this.service.getCloseAccount(), | ||||||
|  |             visibleIf: { | ||||||
|  |               expand: (value: boolean) => value | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   private initST(): STColumn[] { | ||||||
|  |     return [ | ||||||
|  |       { title: '费用单号', fixed: 'left', index: 'feecode', width: 200, className: 'text-left' }, | ||||||
|  |       { title: '网络货运人', index: 'ltdName', width: 220, className: 'text-left' }, | ||||||
|  |       { title: '订单号', index: 'billHCode', width: 200, className: 'text-left' }, | ||||||
|  |       { title: '运单号', index: 'waybillHCode', width: 200, className: 'text-left' }, | ||||||
|  |       { title: '费用日期', index: 'feedate', width: 200, className: 'text-left' }, | ||||||
|  |       { title: '费用类型', index: 'feetypeLabel', width: 150, className: 'text-center' }, | ||||||
|  |       { title: '应付核销', index: 'ishrhx', width: 200, type: 'enum', enum: { 0: '否', 1: '是' }, className: 'text-left' }, | ||||||
|  |       { title: '结算客户', render: 'artocode', width: 200, className: 'text-left' }, | ||||||
|  |       { title: '应收对象', index: 'artoname', width: 200, className: 'text-left' }, | ||||||
|  |       { title: '应付对象', index: 'hrtoname', width: 200, className: 'text-left' }, | ||||||
|  |       { title: '应收金额', render: 'armoeny', width: 100, className: 'text-right' }, | ||||||
|  |       { title: '应付金额', render: 'hrmoney', width: 100, className: 'text-right' }, | ||||||
|  |       { title: '收/付款金额', render: 'hrpaymoney', width: 120, className: 'text-right' }, | ||||||
|  |       { title: '开/收票金额', render: 'hrvatmoney', width: 120, className: 'text-right' }, | ||||||
|  |       { title: '创建时间', index: 'createTime', type: 'date', width: 200, className: 'text-center' }, | ||||||
|  |       { title: '状态', index: 'stsLabel', width: 90, className: 'text-center' }, | ||||||
|  |       { | ||||||
|  |         title: '操作', | ||||||
|  |         fixed: 'right', | ||||||
|  |         className: 'text-center', | ||||||
|  |         width: '110px', | ||||||
|  |         buttons: [ | ||||||
|  |           { | ||||||
|  |             text: '浏览', | ||||||
|  |             click: item => this.routeTo('/financial-management/cost-management/detail/' + item.id, { status: item?.feetypeLabel }) | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             text: '审核', | ||||||
|  |             click: item => this.auditAction(item), | ||||||
|  |             iif: item => item.sts === 2 | ||||||
|  |           } | ||||||
|  |           // { | ||||||
|  |           //   text: '修改', | ||||||
|  |           //   click: item => this.router.navigate(['/financial-management/cost-management/expenses-receivable/1'], { queryParams: { id: 1 } }) | ||||||
|  |           // } | ||||||
|  |         ] | ||||||
|  |       } | ||||||
|  |     ]; | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -0,0 +1,56 @@ | |||||||
|  | <page-header-wrapper title="应付费用单" [logo]="logo"> | ||||||
|  |     <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 [nzExtra]="cardTemplate" nzTitle="基本信息"> | ||||||
|  |     <ng-template #cardTemplate> | ||||||
|  |         <button nz-button nzType="primary" [nzLoading]="service.http.loading">保存</button> | ||||||
|  |     </ng-template> | ||||||
|  |  | ||||||
|  |     <div nz-row nzGutter="8"> | ||||||
|  |         <div nz-col nzSpan="24"> | ||||||
|  |             <sf #sf [schema]="schema" [ui]="{ '*': { spanLabelFixed: 110,grid: { lg: 8, md: 12, sm: 12, xs: 24 } }}" | ||||||
|  |                 [button]="'none'"></sf> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  |     <st #st [data]="data" [columns]="columns" [page]="{ show: false}" [loading]="service.http.loading" size="small" | ||||||
|  |         [scroll]="{ y: '370px' }" class="mt-sm"> | ||||||
|  |         <ng-template st-row="description1" let-item let-index="index"> | ||||||
|  |             <nz-select [ngModel]="item.description" (ngModelChange)="st.setRow(index, { description: $event })" | ||||||
|  |                 style="width: 100%;"> | ||||||
|  |                 <nz-option nzValue="曲丽丽" nzLabel="曲丽丽"></nz-option> | ||||||
|  |                 <nz-option nzValue="lucy" nzLabel="Lucy"></nz-option> | ||||||
|  |             </nz-select> | ||||||
|  |         </ng-template> | ||||||
|  |         <ng-template st-row="description2" let-item let-index="index"> | ||||||
|  |             <nz-select [ngModel]="item.description" (ngModelChange)="st.setRow(index, { description: $event })" | ||||||
|  |                 style="width: 100%;"> | ||||||
|  |                 <nz-option nzValue="曲丽丽" nzLabel="曲丽丽"></nz-option> | ||||||
|  |                 <nz-option nzValue="lucy" nzLabel="Lucy"></nz-option> | ||||||
|  |             </nz-select> | ||||||
|  |         </ng-template> | ||||||
|  |         <ng-template st-row="description3" let-item let-index="index"> | ||||||
|  |             <nz-select [ngModel]="item.description" (ngModelChange)="st.setRow(index, { description: $event })" | ||||||
|  |                 style="width: 100%;"> | ||||||
|  |                 <nz-option nzValue="曲丽丽" nzLabel="曲丽丽"></nz-option> | ||||||
|  |                 <nz-option nzValue="lucy" nzLabel="Lucy"></nz-option> | ||||||
|  |             </nz-select> | ||||||
|  |         </ng-template> | ||||||
|  |         <ng-template st-row="num" let-item let-index="index"> | ||||||
|  |             <nz-input-number [ngModel]="item.num" (ngModelChange)="st.setRow(index, { num: $event })" [nzMin]="0" | ||||||
|  |                 style="width: 100%;"></nz-input-number> | ||||||
|  |         </ng-template> | ||||||
|  |         <ng-template st-row="description5" let-item let-index="index"> | ||||||
|  |             <input nz-input [ngModel]="item.description5" | ||||||
|  |                 (ngModelChange)="st.setRow(index, { description5: $event })" /> | ||||||
|  |         </ng-template> | ||||||
|  |     </st> | ||||||
|  |  | ||||||
|  |     <button nz-button nzType="dashed" nzBlock class="mt-md" (click)="addRow()"><i nz-icon nzType="plus" | ||||||
|  |             nzTheme="outline"></i>添加</button> | ||||||
|  | </nz-card> | ||||||
| @ -0,0 +1,13 @@ | |||||||
|  | :host::ng-deep { | ||||||
|  |  | ||||||
|  |     .content-box { | ||||||
|  |         .ant-card-body { | ||||||
|  |             padding-top: 14px; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     nz-range-picker { | ||||||
|  |         width: 100%; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,148 @@ | |||||||
|  | import { Component, OnInit, ViewChild } from '@angular/core'; | ||||||
|  | import { ActivatedRoute } from '@angular/router'; | ||||||
|  | import { STComponent, STColumn } from '@delon/abc/st'; | ||||||
|  | import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; | ||||||
|  | import { FreightAccountService } from '../../../services/freight-account.service'; | ||||||
|  |  | ||||||
|  | @Component({ | ||||||
|  |   selector: 'app-expenses-payable', | ||||||
|  |   templateUrl: './expenses-payable.component.html', | ||||||
|  |   styleUrls: ['./expenses-payable.component.less'] | ||||||
|  | }) | ||||||
|  | export class ExpensesPayableComponent implements OnInit { | ||||||
|  |  | ||||||
|  |   @ViewChild('st', { static: true }) | ||||||
|  |   st!: STComponent; | ||||||
|  |   @ViewChild('sf', { static: false }) | ||||||
|  |   sf!: SFComponent; | ||||||
|  |   schema!: SFSchema; | ||||||
|  |   columns: STColumn[] = this.initST(); | ||||||
|  |  | ||||||
|  |   id = null; | ||||||
|  |   data: any[] = [ | ||||||
|  |     { | ||||||
|  |       id: 1, | ||||||
|  |       description1: '', | ||||||
|  |       description2: '', | ||||||
|  |       description3: '', | ||||||
|  |       num: null, | ||||||
|  |       description5: '' | ||||||
|  |     } | ||||||
|  |   ]; | ||||||
|  |  | ||||||
|  |   constructor(public service: FreightAccountService, private route: ActivatedRoute) { | ||||||
|  |     this.id = route.snapshot.queryParams.id; | ||||||
|  |     if (this.id) { | ||||||
|  |       this.schema = this.initSF({ page2: '天津怡亚通物流科技有限公司', pag2e21: '茅台集团' }); | ||||||
|  |     } else { | ||||||
|  |       this.schema = this.initSF(); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   ngOnInit(): void {} | ||||||
|  |  | ||||||
|  |   addRow() { | ||||||
|  |     this.data.push({ | ||||||
|  |       id: this.data.length + 1, | ||||||
|  |       description1: '', | ||||||
|  |       description2: '', | ||||||
|  |       description3: '', | ||||||
|  |       num: null, | ||||||
|  |       description5: '' | ||||||
|  |     }); | ||||||
|  |     this.st.reload(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   goBack() { | ||||||
|  |     history.go(-1); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   private initSF(data?: any): SFSchema { | ||||||
|  |     return { | ||||||
|  |       properties: { | ||||||
|  |         page2: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '网络货运人', | ||||||
|  |           enum: [], | ||||||
|  |           ui: { | ||||||
|  |             widget: data ? 'text' : 'select', | ||||||
|  |             placeholder: '请选择' | ||||||
|  |           }, | ||||||
|  |           default: data?.page2 || '' | ||||||
|  |         }, | ||||||
|  |         pag2e21: { | ||||||
|  |           title: '应付对象', | ||||||
|  |           type: 'string', | ||||||
|  |           enum: [], | ||||||
|  |           ui: { | ||||||
|  |             widget: data ? 'text' : 'select', | ||||||
|  |             placeholder: '请选择' | ||||||
|  |           }, | ||||||
|  |           default: data?.pag2e21 || '' | ||||||
|  |         }, | ||||||
|  |         dee: { | ||||||
|  |           title: '', | ||||||
|  |           type: 'string', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'text' | ||||||
|  |           }, | ||||||
|  |           default: ' ' | ||||||
|  |         }, | ||||||
|  |         createTi2me: { | ||||||
|  |           title: '费用日期', | ||||||
|  |           type: 'string', | ||||||
|  |           ui: { | ||||||
|  |             widget: 'date', | ||||||
|  |             mode: 'range', | ||||||
|  |             format: 'yyyy-MM-dd' | ||||||
|  |           } as SFDateWidgetSchema, | ||||||
|  |           default: data?.createTi2me || '' | ||||||
|  |         }, | ||||||
|  |         pa2ge2: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '收票方式', | ||||||
|  |           enum: [], | ||||||
|  |           ui: { | ||||||
|  |             widget: 'select', | ||||||
|  |             placeholder: '请选择' | ||||||
|  |           }, | ||||||
|  |           default: data?.pa2ge2 || '' | ||||||
|  |         }, | ||||||
|  |         page: { | ||||||
|  |           type: 'string', | ||||||
|  |           title: '应付备注', | ||||||
|  |           ui: { | ||||||
|  |             placeholder: '请输入' | ||||||
|  |           }, | ||||||
|  |           default: data?.page || '' | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       required: ['page2', 'pag2e21', 'createTi2me', 'pa2ge2'] | ||||||
|  |     }; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   private initST(): STColumn[] { | ||||||
|  |     return [ | ||||||
|  |       { title: '结算客户', render: 'description1', width: 150 }, | ||||||
|  |       { title: '费用科目', render: 'description2', width: 120 }, | ||||||
|  |       { title: '税率', render: 'description3', width: 120 }, | ||||||
|  |       { title: '应付金额', render: 'num', width: 120 }, | ||||||
|  |       { title: '备注', render: 'description5', width: 150 }, | ||||||
|  |       { | ||||||
|  |         title: '操作', | ||||||
|  |         fixed: 'right', | ||||||
|  |         className: 'text-center', | ||||||
|  |         width: 90, | ||||||
|  |         buttons: [ | ||||||
|  |           { | ||||||
|  |             text: '删除', | ||||||
|  |             click: item => { | ||||||
|  |               this.st.removeRow(item); | ||||||
|  |               this.data = this.data.filter(i => i.id !== item.id); | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         ] | ||||||
|  |       } | ||||||
|  |     ]; | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -0,0 +1,66 @@ | |||||||
|  | <!-- | ||||||
|  |  * @Description  :  | ||||||
|  |  * @Version      : 1.0 | ||||||
|  |  * @Author       : Shiming | ||||||
|  |  * @Date         : 2021-12-27 14:08:49 | ||||||
|  |  * @LastEditors  : Shiming | ||||||
|  |  * @LastEditTime : 2022-02-11 13:46:53 | ||||||
|  |  * @FilePath     : \\tms-obc-web\\src\\app\\routes\\financial-management\\components\\cost-management\\expenses-receivable\\expenses-receivable.component.html | ||||||
|  |  * Copyright (C) 2022 huzhenhong. All rights reserved. | ||||||
|  | --> | ||||||
|  | <page-header-wrapper title="应收费用单" [logo]="logo"> | ||||||
|  |     <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 [nzExtra]="cardTemplate" nzTitle="基本信息"> | ||||||
|  |     <ng-template #cardTemplate> | ||||||
|  |         <button nz-button nzType="primary" [nzLoading]="service.http.loading">保存</button> | ||||||
|  |     </ng-template> | ||||||
|  |  | ||||||
|  |     <div nz-row nzGutter="8"> | ||||||
|  |         <div nz-col nzSpan="24"> | ||||||
|  |             <sf #sf [schema]="schema" [ui]="{ '*': { spanLabelFixed: 110,grid: { lg: 8, md: 12, sm: 12, xs: 24 } }}" | ||||||
|  |                 [button]="'none'"></sf> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  |     <st #st [data]="data" [columns]="columns" [page]="{ show: false}" [loading]="service.http.loading" size="small" | ||||||
|  |         [scroll]="{ y: '370px' }" class="mt-sm"> | ||||||
|  |         <ng-template st-row="description1" let-item let-index="index"> | ||||||
|  |             <nz-select [ngModel]="item.description" (ngModelChange)="st.setRow(index, { description: $event })" | ||||||
|  |                 style="width: 100%;"> | ||||||
|  |                 <nz-option nzValue="曲丽丽" nzLabel="曲丽丽"></nz-option> | ||||||
|  |                 <nz-option nzValue="lucy" nzLabel="Lucy"></nz-option> | ||||||
|  |             </nz-select> | ||||||
|  |         </ng-template> | ||||||
|  |         <ng-template st-row="description2" let-item let-index="index"> | ||||||
|  |             <nz-select [ngModel]="item.description" (ngModelChange)="st.setRow(index, { description: $event })" | ||||||
|  |                 style="width: 100%;"> | ||||||
|  |                 <nz-option nzValue="曲丽丽" nzLabel="曲丽丽"></nz-option> | ||||||
|  |                 <nz-option nzValue="lucy" nzLabel="Lucy"></nz-option> | ||||||
|  |             </nz-select> | ||||||
|  |         </ng-template> | ||||||
|  |         <ng-template st-row="description3" let-item let-index="index"> | ||||||
|  |             <nz-select [ngModel]="item.description" (ngModelChange)="st.setRow(index, { description: $event })" | ||||||
|  |                 style="width: 100%;"> | ||||||
|  |                 <nz-option nzValue="曲丽丽" nzLabel="曲丽丽"></nz-option> | ||||||
|  |                 <nz-option nzValue="lucy" nzLabel="Lucy"></nz-option> | ||||||
|  |             </nz-select> | ||||||
|  |         </ng-template> | ||||||
|  |         <ng-template st-row="num" let-item let-index="index"> | ||||||
|  |             <nz-input-number [ngModel]="item.num" (ngModelChange)="st.setRow(index, { num: $event })" | ||||||
|  |                 [nzMin]="0" style="width: 100%;"></nz-input-number> | ||||||
|  |         </ng-template> | ||||||
|  |         <ng-template st-row="description5" let-item let-index="index"> | ||||||
|  |             <input nz-input [ngModel]="item.description5" | ||||||
|  |                 (ngModelChange)="st.setRow(index, { description5: $event })" /> | ||||||
|  |         </ng-template> | ||||||
|  |     </st> | ||||||
|  |  | ||||||
|  |     <button nz-button nzType="dashed" nzBlock class="mt-md" (click)="addRow()"><i nz-icon nzType="plus" | ||||||
|  |             nzTheme="outline"></i>添加</button> | ||||||
|  | </nz-card> | ||||||
| @ -0,0 +1,13 @@ | |||||||
|  | :host::ng-deep { | ||||||
|  |  | ||||||
|  |     .content-box { | ||||||
|  |         .ant-card-body { | ||||||
|  |             padding-top: 14px; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     nz-range-picker { | ||||||
|  |         width: 100%; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user
	