Commit 80135afd6cbd5c0eff7e6738d8b902bf1d7a9cfe

Authored by 曾国涛
2 parents 1db34f99 037eb91b

Merge branch 'warning'

Showing 52 changed files with 11606 additions and 2271 deletions
.umirc.ts
... ... @@ -15,8 +15,8 @@ export default defineConfig({
15 15 proxy: {
16 16 '/api/': {
17 17 target: 'http://localhost:8085/',
18   - // target: 'http://192.168.1.6:8085/',
19   - // target: 'http://39.108.227.113:8085/',
  18 + //target: 'http://192.168.1.6:8085/',
  19 + //target: 'http://39.108.227.113:8085/',
20 20 changeOrigin: true,
21 21 pathRewrite: { '^/api': '' },
22 22 },
... ... @@ -141,10 +141,21 @@ export default defineConfig({
141 141 },
142 142 {
143 143 name: '客户管理',
144   - path: '/client',
145   - component: './Client',
  144 + path: '/Client',
146 145 icon: 'BookOutlined',
147 146 access: 'canReadAdminAndSales',
  147 + routes: [
  148 + {
  149 + name: '客户列表',
  150 + path: 'clint',
  151 + component: './Client/Client',
  152 + },
  153 + {
  154 + name: '跟进记录',
  155 + path: 'FollowRecord',
  156 + component: './Client/FollowRecord',
  157 + },
  158 + ],
148 159 },
149 160 {
150 161 name: '打印',
... ...
order-erp.service-1.0-SNAPSHOT.jar 0 → 100644
No preview for this file type
package-lock.json
... ... @@ -4498,6 +4498,12 @@
4498 4498 "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-2.0.3.tgz",
4499 4499 "integrity": "sha512-jhAJzaanK5LqyLQ50jJNIrB8fjL9gwWZTgYjevPvkDLMU+kTAZkYsobI59nYoeSrH1PucuyJEi247Pb90t6XUg=="
4500 4500 },
  4501 + "node_modules/@types/estree": {
  4502 + "version": "1.0.6",
  4503 + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
  4504 + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
  4505 + "peer": true
  4506 + },
4501 4507 "node_modules/@types/geojson": {
4502 4508 "version": "7946.0.14",
4503 4509 "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz",
... ... @@ -4516,6 +4522,16 @@
4516 4522 "resolved": "https://registry.npmjs.org/@types/hapi__joi/-/hapi__joi-17.1.9.tgz",
4517 4523 "integrity": "sha512-oOMFT8vmCTFncsF1engrs04jatz8/Anwx3De9uxnOK4chgSEgWBvFtpSoJo8u3784JNO+ql5tzRR6phHoRnscQ=="
4518 4524 },
  4525 + "node_modules/@types/history": {
  4526 + "version": "5.0.0",
  4527 + "resolved": "https://registry.npmjs.org/@types/history/-/history-5.0.0.tgz",
  4528 + "integrity": "sha512-hy8b7Y1J8OGe6LbAjj3xniQrj3v6lsivCcrmf4TzSgPzLkhIeKgc5IZnT7ReIqmEuodjfO8EYAuoFvIrHi/+jQ==",
  4529 + "deprecated": "This is a stub types definition. history provides its own type definitions, so you do not need this installed.",
  4530 + "peer": true,
  4531 + "dependencies": {
  4532 + "history": "*"
  4533 + }
  4534 + },
4519 4535 "node_modules/@types/hoist-non-react-statics": {
4520 4536 "version": "3.3.5",
4521 4537 "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz",
... ... @@ -4535,6 +4551,12 @@
4535 4551 "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.37.tgz",
4536 4552 "integrity": "sha512-IwpIMieE55oGWiXkQPSBY1nw1nFs6bsKXTFskNY8sdS17K24vyEBRQZEwlRS7ZmXCWnJcQtbxWzly+cODWGs2A=="
4537 4553 },
  4554 + "node_modules/@types/isomorphic-fetch": {
  4555 + "version": "0.0.34",
  4556 + "resolved": "https://registry.npmjs.org/@types/isomorphic-fetch/-/isomorphic-fetch-0.0.34.tgz",
  4557 + "integrity": "sha512-BmJKuPCZCR6pbYYgi5nKFJrPC4pLoBgsi/B1nFN64Ba+hLLGUcKPIh7eVlR2xG763Ap08hgQafq/Wx4RFb0omQ==",
  4558 + "peer": true
  4559 + },
4538 4560 "node_modules/@types/istanbul-lib-coverage": {
4539 4561 "version": "2.0.6",
4540 4562 "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
... ... @@ -4645,6 +4667,51 @@
4645 4667 "@types/react": "*"
4646 4668 }
4647 4669 },
  4670 + "node_modules/@types/react-router": {
  4671 + "version": "5.1.20",
  4672 + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz",
  4673 + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==",
  4674 + "peer": true,
  4675 + "dependencies": {
  4676 + "@types/history": "^4.7.11",
  4677 + "@types/react": "*"
  4678 + }
  4679 + },
  4680 + "node_modules/@types/react-router-dom": {
  4681 + "version": "4.3.5",
  4682 + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-4.3.5.tgz",
  4683 + "integrity": "sha512-eFajSUASYbPHg2BDM1G8Btx+YqGgvROPIg6sBhl3O4kbDdYXdFdfrgQFf/pcBuQVObjfT9AL/dd15jilR5DIEA==",
  4684 + "peer": true,
  4685 + "dependencies": {
  4686 + "@types/history": "*",
  4687 + "@types/react": "*",
  4688 + "@types/react-router": "*"
  4689 + }
  4690 + },
  4691 + "node_modules/@types/react-router-redux": {
  4692 + "version": "5.0.27",
  4693 + "resolved": "https://registry.npmjs.org/@types/react-router-redux/-/react-router-redux-5.0.27.tgz",
  4694 + "integrity": "sha512-qC5lbuP2K/kMR/HE3e5ltCJptyiQhmfV0wbklqcqWDbNdpJBDwUsBGP4f/0RDYJf09+OTbz43u6iG+8E0Zcwqw==",
  4695 + "peer": true,
  4696 + "dependencies": {
  4697 + "@types/history": "^4.7.11",
  4698 + "@types/react": "*",
  4699 + "@types/react-router": "^5.1.0",
  4700 + "redux": ">= 3.7.2"
  4701 + }
  4702 + },
  4703 + "node_modules/@types/react-router-redux/node_modules/@types/history": {
  4704 + "version": "4.7.11",
  4705 + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz",
  4706 + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==",
  4707 + "peer": true
  4708 + },
  4709 + "node_modules/@types/react-router/node_modules/@types/history": {
  4710 + "version": "4.7.11",
  4711 + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz",
  4712 + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==",
  4713 + "peer": true
  4714 + },
4648 4715 "node_modules/@types/scheduler": {
4649 4716 "version": "0.16.6",
4650 4717 "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.6.tgz",
... ... @@ -6725,6 +6792,152 @@
6725 6792 "vite": "^4.2.0"
6726 6793 }
6727 6794 },
  6795 + "node_modules/@webassemblyjs/ast": {
  6796 + "version": "1.12.1",
  6797 + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz",
  6798 + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==",
  6799 + "peer": true,
  6800 + "dependencies": {
  6801 + "@webassemblyjs/helper-numbers": "1.11.6",
  6802 + "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
  6803 + }
  6804 + },
  6805 + "node_modules/@webassemblyjs/floating-point-hex-parser": {
  6806 + "version": "1.11.6",
  6807 + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
  6808 + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==",
  6809 + "peer": true
  6810 + },
  6811 + "node_modules/@webassemblyjs/helper-api-error": {
  6812 + "version": "1.11.6",
  6813 + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
  6814 + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==",
  6815 + "peer": true
  6816 + },
  6817 + "node_modules/@webassemblyjs/helper-buffer": {
  6818 + "version": "1.12.1",
  6819 + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz",
  6820 + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==",
  6821 + "peer": true
  6822 + },
  6823 + "node_modules/@webassemblyjs/helper-numbers": {
  6824 + "version": "1.11.6",
  6825 + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
  6826 + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
  6827 + "peer": true,
  6828 + "dependencies": {
  6829 + "@webassemblyjs/floating-point-hex-parser": "1.11.6",
  6830 + "@webassemblyjs/helper-api-error": "1.11.6",
  6831 + "@xtuc/long": "4.2.2"
  6832 + }
  6833 + },
  6834 + "node_modules/@webassemblyjs/helper-wasm-bytecode": {
  6835 + "version": "1.11.6",
  6836 + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
  6837 + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==",
  6838 + "peer": true
  6839 + },
  6840 + "node_modules/@webassemblyjs/helper-wasm-section": {
  6841 + "version": "1.12.1",
  6842 + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz",
  6843 + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==",
  6844 + "peer": true,
  6845 + "dependencies": {
  6846 + "@webassemblyjs/ast": "1.12.1",
  6847 + "@webassemblyjs/helper-buffer": "1.12.1",
  6848 + "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
  6849 + "@webassemblyjs/wasm-gen": "1.12.1"
  6850 + }
  6851 + },
  6852 + "node_modules/@webassemblyjs/ieee754": {
  6853 + "version": "1.11.6",
  6854 + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
  6855 + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
  6856 + "peer": true,
  6857 + "dependencies": {
  6858 + "@xtuc/ieee754": "^1.2.0"
  6859 + }
  6860 + },
  6861 + "node_modules/@webassemblyjs/leb128": {
  6862 + "version": "1.11.6",
  6863 + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
  6864 + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
  6865 + "peer": true,
  6866 + "dependencies": {
  6867 + "@xtuc/long": "4.2.2"
  6868 + }
  6869 + },
  6870 + "node_modules/@webassemblyjs/utf8": {
  6871 + "version": "1.11.6",
  6872 + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
  6873 + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==",
  6874 + "peer": true
  6875 + },
  6876 + "node_modules/@webassemblyjs/wasm-edit": {
  6877 + "version": "1.12.1",
  6878 + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz",
  6879 + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==",
  6880 + "peer": true,
  6881 + "dependencies": {
  6882 + "@webassemblyjs/ast": "1.12.1",
  6883 + "@webassemblyjs/helper-buffer": "1.12.1",
  6884 + "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
  6885 + "@webassemblyjs/helper-wasm-section": "1.12.1",
  6886 + "@webassemblyjs/wasm-gen": "1.12.1",
  6887 + "@webassemblyjs/wasm-opt": "1.12.1",
  6888 + "@webassemblyjs/wasm-parser": "1.12.1",
  6889 + "@webassemblyjs/wast-printer": "1.12.1"
  6890 + }
  6891 + },
  6892 + "node_modules/@webassemblyjs/wasm-gen": {
  6893 + "version": "1.12.1",
  6894 + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz",
  6895 + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==",
  6896 + "peer": true,
  6897 + "dependencies": {
  6898 + "@webassemblyjs/ast": "1.12.1",
  6899 + "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
  6900 + "@webassemblyjs/ieee754": "1.11.6",
  6901 + "@webassemblyjs/leb128": "1.11.6",
  6902 + "@webassemblyjs/utf8": "1.11.6"
  6903 + }
  6904 + },
  6905 + "node_modules/@webassemblyjs/wasm-opt": {
  6906 + "version": "1.12.1",
  6907 + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz",
  6908 + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==",
  6909 + "peer": true,
  6910 + "dependencies": {
  6911 + "@webassemblyjs/ast": "1.12.1",
  6912 + "@webassemblyjs/helper-buffer": "1.12.1",
  6913 + "@webassemblyjs/wasm-gen": "1.12.1",
  6914 + "@webassemblyjs/wasm-parser": "1.12.1"
  6915 + }
  6916 + },
  6917 + "node_modules/@webassemblyjs/wasm-parser": {
  6918 + "version": "1.12.1",
  6919 + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz",
  6920 + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==",
  6921 + "peer": true,
  6922 + "dependencies": {
  6923 + "@webassemblyjs/ast": "1.12.1",
  6924 + "@webassemblyjs/helper-api-error": "1.11.6",
  6925 + "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
  6926 + "@webassemblyjs/ieee754": "1.11.6",
  6927 + "@webassemblyjs/leb128": "1.11.6",
  6928 + "@webassemblyjs/utf8": "1.11.6"
  6929 + }
  6930 + },
  6931 + "node_modules/@webassemblyjs/wast-printer": {
  6932 + "version": "1.12.1",
  6933 + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz",
  6934 + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==",
  6935 + "peer": true,
  6936 + "dependencies": {
  6937 + "@webassemblyjs/ast": "1.12.1",
  6938 + "@xtuc/long": "4.2.2"
  6939 + }
  6940 + },
6728 6941 "node_modules/@webgpu/glslang": {
6729 6942 "version": "0.0.15",
6730 6943 "resolved": "https://registry.npmjs.org/@webgpu/glslang/-/glslang-0.0.15.tgz",
... ... @@ -6740,6 +6953,18 @@
6740 6953 "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz",
6741 6954 "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ=="
6742 6955 },
  6956 + "node_modules/@xtuc/ieee754": {
  6957 + "version": "1.2.0",
  6958 + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
  6959 + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
  6960 + "peer": true
  6961 + },
  6962 + "node_modules/@xtuc/long": {
  6963 + "version": "4.2.2",
  6964 + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
  6965 + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
  6966 + "peer": true
  6967 + },
6743 6968 "node_modules/acorn": {
6744 6969 "version": "8.11.2",
6745 6970 "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz",
... ... @@ -6751,6 +6976,39 @@
6751 6976 "node": ">=0.4.0"
6752 6977 }
6753 6978 },
  6979 + "node_modules/acorn-dynamic-import": {
  6980 + "version": "2.0.2",
  6981 + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz",
  6982 + "integrity": "sha512-GKp5tQ8h0KMPWIYGRHHXI1s5tUpZixZ3IHF2jAu42wSCf6In/G873s6/y4DdKdhWvzhu1T6mE1JgvnhAKqyYYQ==",
  6983 + "deprecated": "This is probably built in to whatever tool you're using. If you still need it... idk",
  6984 + "dev": true,
  6985 + "peer": true,
  6986 + "dependencies": {
  6987 + "acorn": "^4.0.3"
  6988 + }
  6989 + },
  6990 + "node_modules/acorn-dynamic-import/node_modules/acorn": {
  6991 + "version": "4.0.13",
  6992 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
  6993 + "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==",
  6994 + "dev": true,
  6995 + "peer": true,
  6996 + "bin": {
  6997 + "acorn": "bin/acorn"
  6998 + },
  6999 + "engines": {
  7000 + "node": ">=0.4.0"
  7001 + }
  7002 + },
  7003 + "node_modules/acorn-import-attributes": {
  7004 + "version": "1.9.5",
  7005 + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz",
  7006 + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==",
  7007 + "peer": true,
  7008 + "peerDependencies": {
  7009 + "acorn": "^8"
  7010 + }
  7011 + },
6754 7012 "node_modules/acorn-jsx": {
6755 7013 "version": "5.3.2",
6756 7014 "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
... ... @@ -7033,6 +7291,28 @@
7033 7291 "node": ">=10"
7034 7292 }
7035 7293 },
  7294 + "node_modules/arr-diff": {
  7295 + "version": "4.0.0",
  7296 + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
  7297 + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==",
  7298 + "dev": true,
  7299 + "optional": true,
  7300 + "peer": true,
  7301 + "engines": {
  7302 + "node": ">=0.10.0"
  7303 + }
  7304 + },
  7305 + "node_modules/arr-flatten": {
  7306 + "version": "1.1.0",
  7307 + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
  7308 + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
  7309 + "dev": true,
  7310 + "optional": true,
  7311 + "peer": true,
  7312 + "engines": {
  7313 + "node": ">=0.10.0"
  7314 + }
  7315 + },
7036 7316 "node_modules/arr-union": {
7037 7317 "version": "3.1.0",
7038 7318 "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
... ... @@ -7087,6 +7367,17 @@
7087 7367 "node": ">=8"
7088 7368 }
7089 7369 },
  7370 + "node_modules/array-unique": {
  7371 + "version": "0.3.2",
  7372 + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
  7373 + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==",
  7374 + "dev": true,
  7375 + "optional": true,
  7376 + "peer": true,
  7377 + "engines": {
  7378 + "node": ">=0.10.0"
  7379 + }
  7380 + },
7090 7381 "node_modules/array.prototype.flat": {
7091 7382 "version": "1.3.2",
7092 7383 "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
... ... @@ -7226,6 +7517,20 @@
7226 7517 "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
7227 7518 "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg=="
7228 7519 },
  7520 + "node_modules/async-each": {
  7521 + "version": "1.0.6",
  7522 + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz",
  7523 + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==",
  7524 + "dev": true,
  7525 + "funding": [
  7526 + {
  7527 + "type": "individual",
  7528 + "url": "https://paulmillr.com/funding/"
  7529 + }
  7530 + ],
  7531 + "optional": true,
  7532 + "peer": true
  7533 + },
7229 7534 "node_modules/async-validator": {
7230 7535 "version": "4.2.5",
7231 7536 "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz",
... ... @@ -7244,6 +7549,20 @@
7244 7549 "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
7245 7550 "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
7246 7551 },
  7552 + "node_modules/atob": {
  7553 + "version": "2.1.2",
  7554 + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
  7555 + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
  7556 + "dev": true,
  7557 + "optional": true,
  7558 + "peer": true,
  7559 + "bin": {
  7560 + "atob": "bin/atob.js"
  7561 + },
  7562 + "engines": {
  7563 + "node": ">= 4.5.0"
  7564 + }
  7565 + },
7247 7566 "node_modules/atomic-sleep": {
7248 7567 "version": "1.0.0",
7249 7568 "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz",
... ... @@ -7479,11 +7798,60 @@
7479 7798 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
7480 7799 "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
7481 7800 },
  7801 + "node_modules/base": {
  7802 + "version": "0.11.2",
  7803 + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
  7804 + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
  7805 + "dev": true,
  7806 + "optional": true,
  7807 + "peer": true,
  7808 + "dependencies": {
  7809 + "cache-base": "^1.0.1",
  7810 + "class-utils": "^0.3.5",
  7811 + "component-emitter": "^1.2.1",
  7812 + "define-property": "^1.0.0",
  7813 + "isobject": "^3.0.1",
  7814 + "mixin-deep": "^1.2.0",
  7815 + "pascalcase": "^0.1.1"
  7816 + },
  7817 + "engines": {
  7818 + "node": ">=0.10.0"
  7819 + }
  7820 + },
7482 7821 "node_modules/base-64": {
7483 7822 "version": "1.0.0",
7484 7823 "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz",
7485 7824 "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg=="
7486 7825 },
  7826 + "node_modules/base/node_modules/define-property": {
  7827 + "version": "1.0.0",
  7828 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
  7829 + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
  7830 + "dev": true,
  7831 + "optional": true,
  7832 + "peer": true,
  7833 + "dependencies": {
  7834 + "is-descriptor": "^1.0.0"
  7835 + },
  7836 + "engines": {
  7837 + "node": ">=0.10.0"
  7838 + }
  7839 + },
  7840 + "node_modules/base/node_modules/is-descriptor": {
  7841 + "version": "1.0.3",
  7842 + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz",
  7843 + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==",
  7844 + "dev": true,
  7845 + "optional": true,
  7846 + "peer": true,
  7847 + "dependencies": {
  7848 + "is-accessor-descriptor": "^1.0.1",
  7849 + "is-data-descriptor": "^1.0.1"
  7850 + },
  7851 + "engines": {
  7852 + "node": ">= 0.4"
  7853 + }
  7854 + },
7487 7855 "node_modules/base64-js": {
7488 7856 "version": "1.5.1",
7489 7857 "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
... ... @@ -7532,6 +7900,17 @@
7532 7900 "node": ">=8"
7533 7901 }
7534 7902 },
  7903 + "node_modules/bindings": {
  7904 + "version": "1.5.0",
  7905 + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
  7906 + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
  7907 + "dev": true,
  7908 + "optional": true,
  7909 + "peer": true,
  7910 + "dependencies": {
  7911 + "file-uri-to-path": "1.0.0"
  7912 + }
  7913 + },
7535 7914 "node_modules/bl": {
7536 7915 "version": "5.1.0",
7537 7916 "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz",
... ... @@ -7832,6 +8211,28 @@
7832 8211 "typewise-core": "^1.2"
7833 8212 }
7834 8213 },
  8214 + "node_modules/cache-base": {
  8215 + "version": "1.0.1",
  8216 + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
  8217 + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
  8218 + "dev": true,
  8219 + "optional": true,
  8220 + "peer": true,
  8221 + "dependencies": {
  8222 + "collection-visit": "^1.0.0",
  8223 + "component-emitter": "^1.2.1",
  8224 + "get-value": "^2.0.6",
  8225 + "has-value": "^1.0.0",
  8226 + "isobject": "^3.0.1",
  8227 + "set-value": "^2.0.0",
  8228 + "to-object-path": "^0.3.0",
  8229 + "union-value": "^1.0.0",
  8230 + "unset-value": "^1.0.0"
  8231 + },
  8232 + "engines": {
  8233 + "node": ">=0.10.0"
  8234 + }
  8235 + },
7835 8236 "node_modules/cacheable-request": {
7836 8237 "version": "2.1.4",
7837 8238 "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz",
... ... @@ -8101,6 +8502,15 @@
8101 8502 "fsevents": "~2.3.2"
8102 8503 }
8103 8504 },
  8505 + "node_modules/chrome-trace-event": {
  8506 + "version": "1.0.4",
  8507 + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
  8508 + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
  8509 + "peer": true,
  8510 + "engines": {
  8511 + "node": ">=6.0"
  8512 + }
  8513 + },
8104 8514 "node_modules/ci-info": {
8105 8515 "version": "3.9.0",
8106 8516 "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
... ... @@ -8129,6 +8539,23 @@
8129 8539 "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz",
8130 8540 "integrity": "sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA=="
8131 8541 },
  8542 + "node_modules/class-utils": {
  8543 + "version": "0.3.6",
  8544 + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
  8545 + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
  8546 + "dev": true,
  8547 + "optional": true,
  8548 + "peer": true,
  8549 + "dependencies": {
  8550 + "arr-union": "^3.1.0",
  8551 + "define-property": "^0.2.5",
  8552 + "isobject": "^3.0.0",
  8553 + "static-extend": "^0.1.1"
  8554 + },
  8555 + "engines": {
  8556 + "node": ">=0.10.0"
  8557 + }
  8558 + },
8132 8559 "node_modules/classnames": {
8133 8560 "version": "2.3.2",
8134 8561 "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
... ... @@ -8386,6 +8813,16 @@
8386 8813 "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==",
8387 8814 "dev": true
8388 8815 },
  8816 + "node_modules/code-point-at": {
  8817 + "version": "1.1.0",
  8818 + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
  8819 + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==",
  8820 + "dev": true,
  8821 + "peer": true,
  8822 + "engines": {
  8823 + "node": ">=0.10.0"
  8824 + }
  8825 + },
8389 8826 "node_modules/codepage": {
8390 8827 "version": "1.10.2",
8391 8828 "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.10.2.tgz",
... ... @@ -8409,6 +8846,21 @@
8409 8846 "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
8410 8847 "dev": true
8411 8848 },
  8849 + "node_modules/collection-visit": {
  8850 + "version": "1.0.0",
  8851 + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
  8852 + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==",
  8853 + "dev": true,
  8854 + "optional": true,
  8855 + "peer": true,
  8856 + "dependencies": {
  8857 + "map-visit": "^1.0.0",
  8858 + "object-visit": "^1.0.0"
  8859 + },
  8860 + "engines": {
  8861 + "node": ">=0.10.0"
  8862 + }
  8863 + },
8412 8864 "node_modules/color": {
8413 8865 "version": "3.2.1",
8414 8866 "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
... ... @@ -8482,6 +8934,17 @@
8482 8934 "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz",
8483 8935 "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w=="
8484 8936 },
  8937 + "node_modules/component-emitter": {
  8938 + "version": "1.3.1",
  8939 + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz",
  8940 + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==",
  8941 + "dev": true,
  8942 + "optional": true,
  8943 + "peer": true,
  8944 + "funding": {
  8945 + "url": "https://github.com/sponsors/sindresorhus"
  8946 + }
  8947 + },
8485 8948 "node_modules/compute-scroll-into-view": {
8486 8949 "version": "3.1.0",
8487 8950 "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz",
... ... @@ -8595,6 +9058,17 @@
8595 9058 "url": "https://github.com/sponsors/mesqueeb"
8596 9059 }
8597 9060 },
  9061 + "node_modules/copy-descriptor": {
  9062 + "version": "0.1.1",
  9063 + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
  9064 + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==",
  9065 + "dev": true,
  9066 + "optional": true,
  9067 + "peer": true,
  9068 + "engines": {
  9069 + "node": ">=0.10.0"
  9070 + }
  9071 + },
8598 9072 "node_modules/copy-to-clipboard": {
8599 9073 "version": "3.3.3",
8600 9074 "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz",
... ... @@ -9548,6 +10022,20 @@
9548 10022 "url": "https://github.com/sponsors/ljharb"
9549 10023 }
9550 10024 },
  10025 + "node_modules/define-property": {
  10026 + "version": "0.2.5",
  10027 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
  10028 + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
  10029 + "dev": true,
  10030 + "optional": true,
  10031 + "peer": true,
  10032 + "dependencies": {
  10033 + "is-descriptor": "^0.1.0"
  10034 + },
  10035 + "engines": {
  10036 + "node": ">=0.10.0"
  10037 + }
  10038 + },
9551 10039 "node_modules/defined": {
9552 10040 "version": "1.0.1",
9553 10041 "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz",
... ... @@ -9900,6 +10388,33 @@
9900 10388 "node": ">= 6"
9901 10389 }
9902 10390 },
  10391 + "node_modules/dva-core": {
  10392 + "version": "1.6.0-beta.7",
  10393 + "resolved": "https://registry.npmjs.org/dva-core/-/dva-core-1.6.0-beta.7.tgz",
  10394 + "integrity": "sha512-e+0yOEWUK+XbnqflX+KXoLZDGxn+kLKgcT6XYT8GyRe0xcbmLEbwDZO0DXUkdsbxfqSOlLkIprMUoYJ3D5B4Gg==",
  10395 + "peer": true,
  10396 + "dependencies": {
  10397 + "@babel/runtime": "^7.0.0",
  10398 + "flatten": "^1.0.2",
  10399 + "global": "^4.3.2",
  10400 + "invariant": "^2.2.1",
  10401 + "is-plain-object": "^2.0.3",
  10402 + "redux-saga": "^0.16.0",
  10403 + "warning": "^3.0.0"
  10404 + },
  10405 + "peerDependencies": {
  10406 + "redux": "4.x"
  10407 + }
  10408 + },
  10409 + "node_modules/dva-core/node_modules/warning": {
  10410 + "version": "3.0.0",
  10411 + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
  10412 + "integrity": "sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==",
  10413 + "peer": true,
  10414 + "dependencies": {
  10415 + "loose-envify": "^1.0.0"
  10416 + }
  10417 + },
9903 10418 "node_modules/dva-loading": {
9904 10419 "version": "3.0.24",
9905 10420 "resolved": "https://registry.npmjs.org/dva-loading/-/dva-loading-3.0.24.tgz",
... ... @@ -9967,6 +10482,27 @@
9967 10482 "node": ">= 4"
9968 10483 }
9969 10484 },
  10485 + "node_modules/encoding": {
  10486 + "version": "0.1.13",
  10487 + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
  10488 + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
  10489 + "peer": true,
  10490 + "dependencies": {
  10491 + "iconv-lite": "^0.6.2"
  10492 + }
  10493 + },
  10494 + "node_modules/encoding/node_modules/iconv-lite": {
  10495 + "version": "0.6.3",
  10496 + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
  10497 + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
  10498 + "peer": true,
  10499 + "dependencies": {
  10500 + "safer-buffer": ">= 2.1.2 < 3.0.0"
  10501 + },
  10502 + "engines": {
  10503 + "node": ">=0.10.0"
  10504 + }
  10505 + },
9970 10506 "node_modules/end-of-stream": {
9971 10507 "version": "1.4.4",
9972 10508 "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
... ... @@ -10002,7 +10538,7 @@
10002 10538 "version": "0.1.8",
10003 10539 "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
10004 10540 "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
10005   - "optional": true,
  10541 + "devOptional": true,
10006 10542 "dependencies": {
10007 10543 "prr": "~1.0.1"
10008 10544 },
... ... @@ -10148,6 +10684,12 @@
10148 10684 "node": ">= 0.4"
10149 10685 }
10150 10686 },
  10687 + "node_modules/es-module-lexer": {
  10688 + "version": "1.5.4",
  10689 + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz",
  10690 + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
  10691 + "peer": true
  10692 + },
10151 10693 "node_modules/es-set-tostringtag": {
10152 10694 "version": "2.0.2",
10153 10695 "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz",
... ... @@ -10736,6 +11278,45 @@
10736 11278 "node": ">=0.8"
10737 11279 }
10738 11280 },
  11281 + "node_modules/expand-brackets": {
  11282 + "version": "2.1.4",
  11283 + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
  11284 + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==",
  11285 + "dev": true,
  11286 + "optional": true,
  11287 + "peer": true,
  11288 + "dependencies": {
  11289 + "debug": "^2.3.3",
  11290 + "define-property": "^0.2.5",
  11291 + "extend-shallow": "^2.0.1",
  11292 + "posix-character-classes": "^0.1.0",
  11293 + "regex-not": "^1.0.0",
  11294 + "snapdragon": "^0.8.1",
  11295 + "to-regex": "^3.0.1"
  11296 + },
  11297 + "engines": {
  11298 + "node": ">=0.10.0"
  11299 + }
  11300 + },
  11301 + "node_modules/expand-brackets/node_modules/debug": {
  11302 + "version": "2.6.9",
  11303 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
  11304 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
  11305 + "dev": true,
  11306 + "optional": true,
  11307 + "peer": true,
  11308 + "dependencies": {
  11309 + "ms": "2.0.0"
  11310 + }
  11311 + },
  11312 + "node_modules/expand-brackets/node_modules/ms": {
  11313 + "version": "2.0.0",
  11314 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
  11315 + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
  11316 + "dev": true,
  11317 + "optional": true,
  11318 + "peer": true
  11319 + },
10739 11320 "node_modules/ext": {
10740 11321 "version": "1.7.0",
10741 11322 "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
... ... @@ -10799,6 +11380,56 @@
10799 11380 "node": ">=4"
10800 11381 }
10801 11382 },
  11383 + "node_modules/extglob": {
  11384 + "version": "2.0.4",
  11385 + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
  11386 + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
  11387 + "dev": true,
  11388 + "optional": true,
  11389 + "peer": true,
  11390 + "dependencies": {
  11391 + "array-unique": "^0.3.2",
  11392 + "define-property": "^1.0.0",
  11393 + "expand-brackets": "^2.1.4",
  11394 + "extend-shallow": "^2.0.1",
  11395 + "fragment-cache": "^0.2.1",
  11396 + "regex-not": "^1.0.0",
  11397 + "snapdragon": "^0.8.1",
  11398 + "to-regex": "^3.0.1"
  11399 + },
  11400 + "engines": {
  11401 + "node": ">=0.10.0"
  11402 + }
  11403 + },
  11404 + "node_modules/extglob/node_modules/define-property": {
  11405 + "version": "1.0.0",
  11406 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
  11407 + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
  11408 + "dev": true,
  11409 + "optional": true,
  11410 + "peer": true,
  11411 + "dependencies": {
  11412 + "is-descriptor": "^1.0.0"
  11413 + },
  11414 + "engines": {
  11415 + "node": ">=0.10.0"
  11416 + }
  11417 + },
  11418 + "node_modules/extglob/node_modules/is-descriptor": {
  11419 + "version": "1.0.3",
  11420 + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz",
  11421 + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==",
  11422 + "dev": true,
  11423 + "optional": true,
  11424 + "peer": true,
  11425 + "dependencies": {
  11426 + "is-accessor-descriptor": "^1.0.1",
  11427 + "is-data-descriptor": "^1.0.1"
  11428 + },
  11429 + "engines": {
  11430 + "node": ">= 0.4"
  11431 + }
  11432 + },
10802 11433 "node_modules/extrude-polyline": {
10803 11434 "version": "1.0.6",
10804 11435 "resolved": "https://registry.npmjs.org/extrude-polyline/-/extrude-polyline-1.0.6.tgz",
... ... @@ -10970,6 +11601,14 @@
10970 11601 "node": ">=4"
10971 11602 }
10972 11603 },
  11604 + "node_modules/file-uri-to-path": {
  11605 + "version": "1.0.0",
  11606 + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
  11607 + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
  11608 + "dev": true,
  11609 + "optional": true,
  11610 + "peer": true
  11611 + },
10973 11612 "node_modules/filename-reserved-regex": {
10974 11613 "version": "2.0.0",
10975 11614 "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
... ... @@ -11180,6 +11819,17 @@
11180 11819 "is-callable": "^1.1.3"
11181 11820 }
11182 11821 },
  11822 + "node_modules/for-in": {
  11823 + "version": "1.0.2",
  11824 + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
  11825 + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==",
  11826 + "dev": true,
  11827 + "optional": true,
  11828 + "peer": true,
  11829 + "engines": {
  11830 + "node": ">=0.10.0"
  11831 + }
  11832 + },
11183 11833 "node_modules/fork-ts-checker-webpack-plugin": {
11184 11834 "version": "8.0.0",
11185 11835 "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz",
... ... @@ -11359,6 +12009,20 @@
11359 12009 "url": "https://github.com/sponsors/rawify"
11360 12010 }
11361 12011 },
  12012 + "node_modules/fragment-cache": {
  12013 + "version": "0.2.1",
  12014 + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
  12015 + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==",
  12016 + "dev": true,
  12017 + "optional": true,
  12018 + "peer": true,
  12019 + "dependencies": {
  12020 + "map-cache": "^0.2.2"
  12021 + },
  12022 + "engines": {
  12023 + "node": ">=0.10.0"
  12024 + }
  12025 + },
11362 12026 "node_modules/from2": {
11363 12027 "version": "2.3.0",
11364 12028 "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
... ... @@ -11619,6 +12283,12 @@
11619 12283 "node": ">= 6"
11620 12284 }
11621 12285 },
  12286 + "node_modules/glob-to-regexp": {
  12287 + "version": "0.4.1",
  12288 + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
  12289 + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
  12290 + "peer": true
  12291 + },
11622 12292 "node_modules/global": {
11623 12293 "version": "4.4.0",
11624 12294 "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
... ... @@ -11945,6 +12615,79 @@
11945 12615 "url": "https://github.com/sponsors/ljharb"
11946 12616 }
11947 12617 },
  12618 + "node_modules/has-value": {
  12619 + "version": "1.0.0",
  12620 + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
  12621 + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==",
  12622 + "dev": true,
  12623 + "optional": true,
  12624 + "peer": true,
  12625 + "dependencies": {
  12626 + "get-value": "^2.0.6",
  12627 + "has-values": "^1.0.0",
  12628 + "isobject": "^3.0.0"
  12629 + },
  12630 + "engines": {
  12631 + "node": ">=0.10.0"
  12632 + }
  12633 + },
  12634 + "node_modules/has-values": {
  12635 + "version": "1.0.0",
  12636 + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
  12637 + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==",
  12638 + "dev": true,
  12639 + "optional": true,
  12640 + "peer": true,
  12641 + "dependencies": {
  12642 + "is-number": "^3.0.0",
  12643 + "kind-of": "^4.0.0"
  12644 + },
  12645 + "engines": {
  12646 + "node": ">=0.10.0"
  12647 + }
  12648 + },
  12649 + "node_modules/has-values/node_modules/is-number": {
  12650 + "version": "3.0.0",
  12651 + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
  12652 + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
  12653 + "dev": true,
  12654 + "optional": true,
  12655 + "peer": true,
  12656 + "dependencies": {
  12657 + "kind-of": "^3.0.2"
  12658 + },
  12659 + "engines": {
  12660 + "node": ">=0.10.0"
  12661 + }
  12662 + },
  12663 + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": {
  12664 + "version": "3.2.2",
  12665 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
  12666 + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
  12667 + "dev": true,
  12668 + "optional": true,
  12669 + "peer": true,
  12670 + "dependencies": {
  12671 + "is-buffer": "^1.1.5"
  12672 + },
  12673 + "engines": {
  12674 + "node": ">=0.10.0"
  12675 + }
  12676 + },
  12677 + "node_modules/has-values/node_modules/kind-of": {
  12678 + "version": "4.0.0",
  12679 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
  12680 + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==",
  12681 + "dev": true,
  12682 + "optional": true,
  12683 + "peer": true,
  12684 + "dependencies": {
  12685 + "is-buffer": "^1.1.5"
  12686 + },
  12687 + "engines": {
  12688 + "node": ">=0.10.0"
  12689 + }
  12690 + },
11948 12691 "node_modules/hash-base": {
11949 12692 "version": "3.1.0",
11950 12693 "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
... ... @@ -12595,6 +13338,16 @@
12595 13338 "node": ">= 0.4"
12596 13339 }
12597 13340 },
  13341 + "node_modules/interpret": {
  13342 + "version": "1.4.0",
  13343 + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
  13344 + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
  13345 + "dev": true,
  13346 + "peer": true,
  13347 + "engines": {
  13348 + "node": ">= 0.10"
  13349 + }
  13350 + },
12598 13351 "node_modules/intl": {
12599 13352 "version": "1.2.5",
12600 13353 "resolved": "https://registry.npmjs.org/intl/-/intl-1.2.5.tgz",
... ... @@ -12654,6 +13407,30 @@
12654 13407 "resolved": "https://registry.npmjs.org/inversify-inject-decorators/-/inversify-inject-decorators-3.1.0.tgz",
12655 13408 "integrity": "sha512-/seBlVp5bXrLQS3DpKEmlgeZL6C7Tf/QITd+IMQrbBBGuCbxb7k3hRAWu9XSreNpFzLgSboz3sClLSEmGwHphw=="
12656 13409 },
  13410 + "node_modules/invert-kv": {
  13411 + "version": "1.0.0",
  13412 + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
  13413 + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==",
  13414 + "dev": true,
  13415 + "peer": true,
  13416 + "engines": {
  13417 + "node": ">=0.10.0"
  13418 + }
  13419 + },
  13420 + "node_modules/is-accessor-descriptor": {
  13421 + "version": "1.0.1",
  13422 + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz",
  13423 + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==",
  13424 + "dev": true,
  13425 + "optional": true,
  13426 + "peer": true,
  13427 + "dependencies": {
  13428 + "hasown": "^2.0.0"
  13429 + },
  13430 + "engines": {
  13431 + "node": ">= 0.10"
  13432 + }
  13433 + },
12657 13434 "node_modules/is-any-array": {
12658 13435 "version": "2.0.1",
12659 13436 "resolved": "https://registry.npmjs.org/is-any-array/-/is-any-array-2.0.1.tgz",
... ... @@ -12783,6 +13560,20 @@
12783 13560 "url": "https://github.com/sponsors/ljharb"
12784 13561 }
12785 13562 },
  13563 + "node_modules/is-data-descriptor": {
  13564 + "version": "1.0.1",
  13565 + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz",
  13566 + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==",
  13567 + "dev": true,
  13568 + "optional": true,
  13569 + "peer": true,
  13570 + "dependencies": {
  13571 + "hasown": "^2.0.0"
  13572 + },
  13573 + "engines": {
  13574 + "node": ">= 0.4"
  13575 + }
  13576 + },
12786 13577 "node_modules/is-date-object": {
12787 13578 "version": "1.0.5",
12788 13579 "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
... ... @@ -12797,6 +13588,21 @@
12797 13588 "url": "https://github.com/sponsors/ljharb"
12798 13589 }
12799 13590 },
  13591 + "node_modules/is-descriptor": {
  13592 + "version": "0.1.7",
  13593 + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
  13594 + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
  13595 + "dev": true,
  13596 + "optional": true,
  13597 + "peer": true,
  13598 + "dependencies": {
  13599 + "is-accessor-descriptor": "^1.0.1",
  13600 + "is-data-descriptor": "^1.0.1"
  13601 + },
  13602 + "engines": {
  13603 + "node": ">= 0.4"
  13604 + }
  13605 + },
12800 13606 "node_modules/is-directory": {
12801 13607 "version": "0.3.1",
12802 13608 "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
... ... @@ -13103,7 +13909,6 @@
13103 13909 "version": "1.1.0",
13104 13910 "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
13105 13911 "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
13106   - "dev": true,
13107 13912 "engines": {
13108 13913 "node": ">=0.10.0"
13109 13914 }
... ... @@ -13168,6 +13973,13 @@
13168 13973 "url": "https://github.com/sponsors/sindresorhus"
13169 13974 }
13170 13975 },
  13976 + "node_modules/is-utf8": {
  13977 + "version": "0.2.1",
  13978 + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
  13979 + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==",
  13980 + "dev": true,
  13981 + "peer": true
  13982 + },
13171 13983 "node_modules/is-weakmap": {
13172 13984 "version": "2.0.1",
13173 13985 "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
... ... @@ -13204,6 +14016,17 @@
13204 14016 "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
13205 14017 "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA=="
13206 14018 },
  14019 + "node_modules/is-windows": {
  14020 + "version": "1.0.2",
  14021 + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
  14022 + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
  14023 + "dev": true,
  14024 + "optional": true,
  14025 + "peer": true,
  14026 + "engines": {
  14027 + "node": ">=0.10.0"
  14028 + }
  14029 + },
13207 14030 "node_modules/is-wsl": {
13208 14031 "version": "2.2.0",
13209 14032 "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
... ... @@ -13247,6 +14070,26 @@
13247 14070 "node": ">=0.10.0"
13248 14071 }
13249 14072 },
  14073 + "node_modules/isomorphic-fetch": {
  14074 + "version": "2.2.1",
  14075 + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
  14076 + "integrity": "sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==",
  14077 + "peer": true,
  14078 + "dependencies": {
  14079 + "node-fetch": "^1.0.1",
  14080 + "whatwg-fetch": ">=0.10.0"
  14081 + }
  14082 + },
  14083 + "node_modules/isomorphic-fetch/node_modules/node-fetch": {
  14084 + "version": "1.7.3",
  14085 + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
  14086 + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
  14087 + "peer": true,
  14088 + "dependencies": {
  14089 + "encoding": "^0.1.11",
  14090 + "is-stream": "^1.0.1"
  14091 + }
  14092 + },
13250 14093 "node_modules/isomorphic-unfetch": {
13251 14094 "version": "4.0.2",
13252 14095 "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-4.0.2.tgz",
... ... @@ -13628,6 +14471,13 @@
13628 14471 "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
13629 14472 "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
13630 14473 },
  14474 + "node_modules/json-loader": {
  14475 + "version": "0.5.7",
  14476 + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz",
  14477 + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==",
  14478 + "dev": true,
  14479 + "peer": true
  14480 + },
13631 14481 "node_modules/json-parse-better-errors": {
13632 14482 "version": "1.0.2",
13633 14483 "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
... ... @@ -13644,14 +14494,40 @@
13644 14494 "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
13645 14495 "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
13646 14496 },
13647   - "node_modules/json-stable-stringify-without-jsonify": {
13648   - "version": "1.0.1",
13649   - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
13650   - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="
13651   - },
13652   - "node_modules/json-stringify-pretty-compact": {
13653   - "version": "3.0.0",
13654   - "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-3.0.0.tgz",
  14497 + "node_modules/json-stable-stringify": {
  14498 + "version": "1.1.1",
  14499 + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz",
  14500 + "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==",
  14501 + "dev": true,
  14502 + "peer": true,
  14503 + "dependencies": {
  14504 + "call-bind": "^1.0.5",
  14505 + "isarray": "^2.0.5",
  14506 + "jsonify": "^0.0.1",
  14507 + "object-keys": "^1.1.1"
  14508 + },
  14509 + "engines": {
  14510 + "node": ">= 0.4"
  14511 + },
  14512 + "funding": {
  14513 + "url": "https://github.com/sponsors/ljharb"
  14514 + }
  14515 + },
  14516 + "node_modules/json-stable-stringify-without-jsonify": {
  14517 + "version": "1.0.1",
  14518 + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
  14519 + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="
  14520 + },
  14521 + "node_modules/json-stable-stringify/node_modules/isarray": {
  14522 + "version": "2.0.5",
  14523 + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
  14524 + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
  14525 + "dev": true,
  14526 + "peer": true
  14527 + },
  14528 + "node_modules/json-stringify-pretty-compact": {
  14529 + "version": "3.0.0",
  14530 + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-3.0.0.tgz",
13655 14531 "integrity": "sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA=="
13656 14532 },
13657 14533 "node_modules/json2module": {
... ... @@ -13693,6 +14569,16 @@
13693 14569 "graceful-fs": "^4.1.6"
13694 14570 }
13695 14571 },
  14572 + "node_modules/jsonify": {
  14573 + "version": "0.0.1",
  14574 + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz",
  14575 + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==",
  14576 + "dev": true,
  14577 + "peer": true,
  14578 + "funding": {
  14579 + "url": "https://github.com/sponsors/ljharb"
  14580 + }
  14581 + },
13696 14582 "node_modules/jsx-ast-utils": {
13697 14583 "version": "3.3.5",
13698 14584 "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
... ... @@ -13770,6 +14656,19 @@
13770 14656 "node": ">=0.10.0"
13771 14657 }
13772 14658 },
  14659 + "node_modules/lcid": {
  14660 + "version": "1.0.0",
  14661 + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
  14662 + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==",
  14663 + "dev": true,
  14664 + "peer": true,
  14665 + "dependencies": {
  14666 + "invert-kv": "^1.0.0"
  14667 + },
  14668 + "engines": {
  14669 + "node": ">=0.10.0"
  14670 + }
  14671 + },
13773 14672 "node_modules/less": {
13774 14673 "version": "4.1.3",
13775 14674 "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz",
... ... @@ -14189,6 +15088,58 @@
14189 15088 "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
14190 15089 }
14191 15090 },
  15091 + "node_modules/load-json-file": {
  15092 + "version": "1.1.0",
  15093 + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
  15094 + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==",
  15095 + "dev": true,
  15096 + "peer": true,
  15097 + "dependencies": {
  15098 + "graceful-fs": "^4.1.2",
  15099 + "parse-json": "^2.2.0",
  15100 + "pify": "^2.0.0",
  15101 + "pinkie-promise": "^2.0.0",
  15102 + "strip-bom": "^2.0.0"
  15103 + },
  15104 + "engines": {
  15105 + "node": ">=0.10.0"
  15106 + }
  15107 + },
  15108 + "node_modules/load-json-file/node_modules/parse-json": {
  15109 + "version": "2.2.0",
  15110 + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
  15111 + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==",
  15112 + "dev": true,
  15113 + "peer": true,
  15114 + "dependencies": {
  15115 + "error-ex": "^1.2.0"
  15116 + },
  15117 + "engines": {
  15118 + "node": ">=0.10.0"
  15119 + }
  15120 + },
  15121 + "node_modules/load-json-file/node_modules/strip-bom": {
  15122 + "version": "2.0.0",
  15123 + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
  15124 + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==",
  15125 + "dev": true,
  15126 + "peer": true,
  15127 + "dependencies": {
  15128 + "is-utf8": "^0.2.0"
  15129 + },
  15130 + "engines": {
  15131 + "node": ">=0.10.0"
  15132 + }
  15133 + },
  15134 + "node_modules/loader-runner": {
  15135 + "version": "4.3.0",
  15136 + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
  15137 + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
  15138 + "peer": true,
  15139 + "engines": {
  15140 + "node": ">=6.11.5"
  15141 + }
  15142 + },
14192 15143 "node_modules/loader-utils": {
14193 15144 "version": "2.0.4",
14194 15145 "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
... ... @@ -14595,6 +15546,17 @@
14595 15546 "inversify": "^5.0.1"
14596 15547 }
14597 15548 },
  15549 + "node_modules/map-cache": {
  15550 + "version": "0.2.2",
  15551 + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
  15552 + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==",
  15553 + "dev": true,
  15554 + "optional": true,
  15555 + "peer": true,
  15556 + "engines": {
  15557 + "node": ">=0.10.0"
  15558 + }
  15559 + },
14598 15560 "node_modules/map-obj": {
14599 15561 "version": "4.3.0",
14600 15562 "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
... ... @@ -14606,6 +15568,20 @@
14606 15568 "url": "https://github.com/sponsors/sindresorhus"
14607 15569 }
14608 15570 },
  15571 + "node_modules/map-visit": {
  15572 + "version": "1.0.0",
  15573 + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
  15574 + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==",
  15575 + "dev": true,
  15576 + "optional": true,
  15577 + "peer": true,
  15578 + "dependencies": {
  15579 + "object-visit": "^1.0.0"
  15580 + },
  15581 + "engines": {
  15582 + "node": ">=0.10.0"
  15583 + }
  15584 + },
14609 15585 "node_modules/mapbox-gl": {
14610 15586 "version": "1.13.3",
14611 15587 "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.13.3.tgz",
... ... @@ -14740,6 +15716,17 @@
14740 15716 "node": ">= 4.0.0"
14741 15717 }
14742 15718 },
  15719 + "node_modules/memory-fs": {
  15720 + "version": "0.4.1",
  15721 + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
  15722 + "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==",
  15723 + "dev": true,
  15724 + "peer": true,
  15725 + "dependencies": {
  15726 + "errno": "^0.1.3",
  15727 + "readable-stream": "^2.0.1"
  15728 + }
  15729 + },
14743 15730 "node_modules/meow": {
14744 15731 "version": "9.0.0",
14745 15732 "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
... ... @@ -14927,6 +15914,35 @@
14927 15914 "node": ">= 6"
14928 15915 }
14929 15916 },
  15917 + "node_modules/mixin-deep": {
  15918 + "version": "1.3.2",
  15919 + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
  15920 + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
  15921 + "dev": true,
  15922 + "optional": true,
  15923 + "peer": true,
  15924 + "dependencies": {
  15925 + "for-in": "^1.0.2",
  15926 + "is-extendable": "^1.0.1"
  15927 + },
  15928 + "engines": {
  15929 + "node": ">=0.10.0"
  15930 + }
  15931 + },
  15932 + "node_modules/mixin-deep/node_modules/is-extendable": {
  15933 + "version": "1.0.1",
  15934 + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
  15935 + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
  15936 + "dev": true,
  15937 + "optional": true,
  15938 + "peer": true,
  15939 + "dependencies": {
  15940 + "is-plain-object": "^2.0.4"
  15941 + },
  15942 + "engines": {
  15943 + "node": ">=0.10.0"
  15944 + }
  15945 + },
14930 15946 "node_modules/mkdirp": {
14931 15947 "version": "1.0.4",
14932 15948 "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
... ... @@ -15049,6 +16065,14 @@
15049 16065 "thenify-all": "^1.0.0"
15050 16066 }
15051 16067 },
  16068 + "node_modules/nan": {
  16069 + "version": "2.22.0",
  16070 + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz",
  16071 + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==",
  16072 + "dev": true,
  16073 + "optional": true,
  16074 + "peer": true
  16075 + },
15052 16076 "node_modules/nano-css": {
15053 16077 "version": "5.6.1",
15054 16078 "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.6.1.tgz",
... ... @@ -15085,6 +16109,89 @@
15085 16109 "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
15086 16110 }
15087 16111 },
  16112 + "node_modules/nanomatch": {
  16113 + "version": "1.2.13",
  16114 + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
  16115 + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
  16116 + "dev": true,
  16117 + "optional": true,
  16118 + "peer": true,
  16119 + "dependencies": {
  16120 + "arr-diff": "^4.0.0",
  16121 + "array-unique": "^0.3.2",
  16122 + "define-property": "^2.0.2",
  16123 + "extend-shallow": "^3.0.2",
  16124 + "fragment-cache": "^0.2.1",
  16125 + "is-windows": "^1.0.2",
  16126 + "kind-of": "^6.0.2",
  16127 + "object.pick": "^1.3.0",
  16128 + "regex-not": "^1.0.0",
  16129 + "snapdragon": "^0.8.1",
  16130 + "to-regex": "^3.0.1"
  16131 + },
  16132 + "engines": {
  16133 + "node": ">=0.10.0"
  16134 + }
  16135 + },
  16136 + "node_modules/nanomatch/node_modules/define-property": {
  16137 + "version": "2.0.2",
  16138 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
  16139 + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
  16140 + "dev": true,
  16141 + "optional": true,
  16142 + "peer": true,
  16143 + "dependencies": {
  16144 + "is-descriptor": "^1.0.2",
  16145 + "isobject": "^3.0.1"
  16146 + },
  16147 + "engines": {
  16148 + "node": ">=0.10.0"
  16149 + }
  16150 + },
  16151 + "node_modules/nanomatch/node_modules/extend-shallow": {
  16152 + "version": "3.0.2",
  16153 + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
  16154 + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
  16155 + "dev": true,
  16156 + "optional": true,
  16157 + "peer": true,
  16158 + "dependencies": {
  16159 + "assign-symbols": "^1.0.0",
  16160 + "is-extendable": "^1.0.1"
  16161 + },
  16162 + "engines": {
  16163 + "node": ">=0.10.0"
  16164 + }
  16165 + },
  16166 + "node_modules/nanomatch/node_modules/is-descriptor": {
  16167 + "version": "1.0.3",
  16168 + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz",
  16169 + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==",
  16170 + "dev": true,
  16171 + "optional": true,
  16172 + "peer": true,
  16173 + "dependencies": {
  16174 + "is-accessor-descriptor": "^1.0.1",
  16175 + "is-data-descriptor": "^1.0.1"
  16176 + },
  16177 + "engines": {
  16178 + "node": ">= 0.4"
  16179 + }
  16180 + },
  16181 + "node_modules/nanomatch/node_modules/is-extendable": {
  16182 + "version": "1.0.1",
  16183 + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
  16184 + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
  16185 + "dev": true,
  16186 + "optional": true,
  16187 + "peer": true,
  16188 + "dependencies": {
  16189 + "is-plain-object": "^2.0.4"
  16190 + },
  16191 + "engines": {
  16192 + "node": ">=0.10.0"
  16193 + }
  16194 + },
15088 16195 "node_modules/natural-compare": {
15089 16196 "version": "1.4.0",
15090 16197 "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
... ... @@ -15123,6 +16230,12 @@
15123 16230 "node": ">=0.10.0"
15124 16231 }
15125 16232 },
  16233 + "node_modules/neo-async": {
  16234 + "version": "2.6.2",
  16235 + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
  16236 + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
  16237 + "peer": true
  16238 + },
15126 16239 "node_modules/next-tick": {
15127 16240 "version": "1.1.0",
15128 16241 "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
... ... @@ -15378,6 +16491,16 @@
15378 16491 "url": "https://github.com/fb55/nth-check?sponsor=1"
15379 16492 }
15380 16493 },
  16494 + "node_modules/number-is-nan": {
  16495 + "version": "1.0.1",
  16496 + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
  16497 + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==",
  16498 + "dev": true,
  16499 + "peer": true,
  16500 + "engines": {
  16501 + "node": ">=0.10.0"
  16502 + }
  16503 + },
15381 16504 "node_modules/object-assign": {
15382 16505 "version": "4.1.1",
15383 16506 "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
... ... @@ -15386,6 +16509,36 @@
15386 16509 "node": ">=0.10.0"
15387 16510 }
15388 16511 },
  16512 + "node_modules/object-copy": {
  16513 + "version": "0.1.0",
  16514 + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
  16515 + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==",
  16516 + "dev": true,
  16517 + "optional": true,
  16518 + "peer": true,
  16519 + "dependencies": {
  16520 + "copy-descriptor": "^0.1.0",
  16521 + "define-property": "^0.2.5",
  16522 + "kind-of": "^3.0.3"
  16523 + },
  16524 + "engines": {
  16525 + "node": ">=0.10.0"
  16526 + }
  16527 + },
  16528 + "node_modules/object-copy/node_modules/kind-of": {
  16529 + "version": "3.2.2",
  16530 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
  16531 + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
  16532 + "dev": true,
  16533 + "optional": true,
  16534 + "peer": true,
  16535 + "dependencies": {
  16536 + "is-buffer": "^1.1.5"
  16537 + },
  16538 + "engines": {
  16539 + "node": ">=0.10.0"
  16540 + }
  16541 + },
15389 16542 "node_modules/object-hash": {
15390 16543 "version": "3.0.0",
15391 16544 "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
... ... @@ -15426,6 +16579,20 @@
15426 16579 "node": ">= 0.4"
15427 16580 }
15428 16581 },
  16582 + "node_modules/object-visit": {
  16583 + "version": "1.0.1",
  16584 + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
  16585 + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==",
  16586 + "dev": true,
  16587 + "optional": true,
  16588 + "peer": true,
  16589 + "dependencies": {
  16590 + "isobject": "^3.0.0"
  16591 + },
  16592 + "engines": {
  16593 + "node": ">=0.10.0"
  16594 + }
  16595 + },
15429 16596 "node_modules/object.assign": {
15430 16597 "version": "4.1.5",
15431 16598 "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
... ... @@ -15501,6 +16668,20 @@
15501 16668 "url": "https://github.com/sponsors/ljharb"
15502 16669 }
15503 16670 },
  16671 + "node_modules/object.pick": {
  16672 + "version": "1.3.0",
  16673 + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
  16674 + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==",
  16675 + "dev": true,
  16676 + "optional": true,
  16677 + "peer": true,
  16678 + "dependencies": {
  16679 + "isobject": "^3.0.1"
  16680 + },
  16681 + "engines": {
  16682 + "node": ">=0.10.0"
  16683 + }
  16684 + },
15504 16685 "node_modules/object.values": {
15505 16686 "version": "1.1.7",
15506 16687 "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz",
... ... @@ -15746,6 +16927,19 @@
15746 16927 "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
15747 16928 "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A=="
15748 16929 },
  16930 + "node_modules/os-locale": {
  16931 + "version": "1.4.0",
  16932 + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
  16933 + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==",
  16934 + "dev": true,
  16935 + "peer": true,
  16936 + "dependencies": {
  16937 + "lcid": "^1.0.0"
  16938 + },
  16939 + "engines": {
  16940 + "node": ">=0.10.0"
  16941 + }
  16942 + },
15749 16943 "node_modules/os-tmpdir": {
15750 16944 "version": "1.0.2",
15751 16945 "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
... ... @@ -15913,11 +17107,30 @@
15913 17107 "tslib": "^2.0.3"
15914 17108 }
15915 17109 },
15916   - "node_modules/path-browserify": {
15917   - "version": "1.0.1",
15918   - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
15919   - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
15920   - "dev": true
  17110 + "node_modules/pascalcase": {
  17111 + "version": "0.1.1",
  17112 + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
  17113 + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==",
  17114 + "dev": true,
  17115 + "optional": true,
  17116 + "peer": true,
  17117 + "engines": {
  17118 + "node": ">=0.10.0"
  17119 + }
  17120 + },
  17121 + "node_modules/path-browserify": {
  17122 + "version": "1.0.1",
  17123 + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
  17124 + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
  17125 + "dev": true
  17126 + },
  17127 + "node_modules/path-dirname": {
  17128 + "version": "1.0.2",
  17129 + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
  17130 + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==",
  17131 + "dev": true,
  17132 + "optional": true,
  17133 + "peer": true
15921 17134 },
15922 17135 "node_modules/path-exists": {
15923 17136 "version": "4.0.0",
... ... @@ -16130,6 +17343,17 @@
16130 17343 "polyline-miter-util": "^1.0.1"
16131 17344 }
16132 17345 },
  17346 + "node_modules/posix-character-classes": {
  17347 + "version": "0.1.1",
  17348 + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
  17349 + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==",
  17350 + "dev": true,
  17351 + "optional": true,
  17352 + "peer": true,
  17353 + "engines": {
  17354 + "node": ">=0.10.0"
  17355 + }
  17356 + },
16133 17357 "node_modules/possible-typed-array-names": {
16134 17358 "version": "1.0.0",
16135 17359 "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
... ... @@ -17065,7 +18289,7 @@
17065 18289 "version": "1.0.1",
17066 18290 "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
17067 18291 "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
17068   - "optional": true
  18292 + "devOptional": true
17069 18293 },
17070 18294 "node_modules/public-encrypt": {
17071 18295 "version": "4.0.3",
... ... @@ -17819,6 +19043,19 @@
17819 19043 "react-dom": ">=16.9.0"
17820 19044 }
17821 19045 },
  19046 + "node_modules/react": {
  19047 + "version": "17.0.2",
  19048 + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
  19049 + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
  19050 + "peer": true,
  19051 + "dependencies": {
  19052 + "loose-envify": "^1.1.0",
  19053 + "object-assign": "^4.1.1"
  19054 + },
  19055 + "engines": {
  19056 + "node": ">=0.10.0"
  19057 + }
  19058 + },
17822 19059 "node_modules/react-color": {
17823 19060 "version": "2.17.3",
17824 19061 "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.17.3.tgz",
... ... @@ -17843,6 +19080,20 @@
17843 19080 "react": ">=16.0.0"
17844 19081 }
17845 19082 },
  19083 + "node_modules/react-dom": {
  19084 + "version": "17.0.2",
  19085 + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
  19086 + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
  19087 + "peer": true,
  19088 + "dependencies": {
  19089 + "loose-envify": "^1.1.0",
  19090 + "object-assign": "^4.1.1",
  19091 + "scheduler": "^0.20.2"
  19092 + },
  19093 + "peerDependencies": {
  19094 + "react": "17.0.2"
  19095 + }
  19096 + },
17846 19097 "node_modules/react-error-overlay": {
17847 19098 "version": "6.0.9",
17848 19099 "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz",
... ... @@ -18558,6 +19809,74 @@
18558 19809 "react-dom": ">=16.8"
18559 19810 }
18560 19811 },
  19812 + "node_modules/react-router-redux": {
  19813 + "version": "5.0.0-alpha.9",
  19814 + "resolved": "https://registry.npmjs.org/react-router-redux/-/react-router-redux-5.0.0-alpha.9.tgz",
  19815 + "integrity": "sha512-euSgNIANnRXr4GydIuwA7RZCefrLQzIw5WdXspS8NPYbV+FxrKSS9MKG7U9vb6vsKHONnA4VxrVNWfnMUnUQAw==",
  19816 + "deprecated": "This project is no longer maintained.",
  19817 + "peer": true,
  19818 + "dependencies": {
  19819 + "history": "^4.7.2",
  19820 + "prop-types": "^15.6.0",
  19821 + "react-router": "^4.2.0"
  19822 + },
  19823 + "peerDependencies": {
  19824 + "react": ">=15"
  19825 + }
  19826 + },
  19827 + "node_modules/react-router-redux/node_modules/history": {
  19828 + "version": "4.10.1",
  19829 + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz",
  19830 + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==",
  19831 + "peer": true,
  19832 + "dependencies": {
  19833 + "@babel/runtime": "^7.1.2",
  19834 + "loose-envify": "^1.2.0",
  19835 + "resolve-pathname": "^3.0.0",
  19836 + "tiny-invariant": "^1.0.2",
  19837 + "tiny-warning": "^1.0.0",
  19838 + "value-equal": "^1.0.1"
  19839 + }
  19840 + },
  19841 + "node_modules/react-router-redux/node_modules/hoist-non-react-statics": {
  19842 + "version": "2.5.5",
  19843 + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz",
  19844 + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==",
  19845 + "peer": true
  19846 + },
  19847 + "node_modules/react-router-redux/node_modules/isarray": {
  19848 + "version": "0.0.1",
  19849 + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
  19850 + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
  19851 + "peer": true
  19852 + },
  19853 + "node_modules/react-router-redux/node_modules/path-to-regexp": {
  19854 + "version": "1.9.0",
  19855 + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz",
  19856 + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==",
  19857 + "peer": true,
  19858 + "dependencies": {
  19859 + "isarray": "0.0.1"
  19860 + }
  19861 + },
  19862 + "node_modules/react-router-redux/node_modules/react-router": {
  19863 + "version": "4.3.1",
  19864 + "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz",
  19865 + "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==",
  19866 + "peer": true,
  19867 + "dependencies": {
  19868 + "history": "^4.7.2",
  19869 + "hoist-non-react-statics": "^2.5.0",
  19870 + "invariant": "^2.2.4",
  19871 + "loose-envify": "^1.3.1",
  19872 + "path-to-regexp": "^1.7.0",
  19873 + "prop-types": "^15.6.1",
  19874 + "warning": "^4.0.1"
  19875 + },
  19876 + "peerDependencies": {
  19877 + "react": ">=15"
  19878 + }
  19879 + },
18561 19880 "node_modules/react-universal-interface": {
18562 19881 "version": "0.6.2",
18563 19882 "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz",
... ... @@ -18874,6 +20193,50 @@
18874 20193 "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
18875 20194 "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA=="
18876 20195 },
  20196 + "node_modules/regex-not": {
  20197 + "version": "1.0.2",
  20198 + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
  20199 + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
  20200 + "dev": true,
  20201 + "optional": true,
  20202 + "peer": true,
  20203 + "dependencies": {
  20204 + "extend-shallow": "^3.0.2",
  20205 + "safe-regex": "^1.1.0"
  20206 + },
  20207 + "engines": {
  20208 + "node": ">=0.10.0"
  20209 + }
  20210 + },
  20211 + "node_modules/regex-not/node_modules/extend-shallow": {
  20212 + "version": "3.0.2",
  20213 + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
  20214 + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
  20215 + "dev": true,
  20216 + "optional": true,
  20217 + "peer": true,
  20218 + "dependencies": {
  20219 + "assign-symbols": "^1.0.0",
  20220 + "is-extendable": "^1.0.1"
  20221 + },
  20222 + "engines": {
  20223 + "node": ">=0.10.0"
  20224 + }
  20225 + },
  20226 + "node_modules/regex-not/node_modules/is-extendable": {
  20227 + "version": "1.0.1",
  20228 + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
  20229 + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
  20230 + "dev": true,
  20231 + "optional": true,
  20232 + "peer": true,
  20233 + "dependencies": {
  20234 + "is-plain-object": "^2.0.4"
  20235 + },
  20236 + "engines": {
  20237 + "node": ">=0.10.0"
  20238 + }
  20239 + },
18877 20240 "node_modules/regexp.prototype.flags": {
18878 20241 "version": "1.5.2",
18879 20242 "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
... ... @@ -18920,6 +20283,14 @@
18920 20283 "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz",
18921 20284 "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA=="
18922 20285 },
  20286 + "node_modules/remove-trailing-separator": {
  20287 + "version": "1.1.0",
  20288 + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
  20289 + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==",
  20290 + "dev": true,
  20291 + "optional": true,
  20292 + "peer": true
  20293 + },
18923 20294 "node_modules/renderkid": {
18924 20295 "version": "3.0.0",
18925 20296 "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz",
... ... @@ -18932,6 +20303,17 @@
18932 20303 "strip-ansi": "^6.0.1"
18933 20304 }
18934 20305 },
  20306 + "node_modules/repeat-element": {
  20307 + "version": "1.1.4",
  20308 + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz",
  20309 + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==",
  20310 + "dev": true,
  20311 + "optional": true,
  20312 + "peer": true,
  20313 + "engines": {
  20314 + "node": ">=0.10.0"
  20315 + }
  20316 + },
18935 20317 "node_modules/repeat-string": {
18936 20318 "version": "1.6.1",
18937 20319 "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
... ... @@ -18956,6 +20338,13 @@
18956 20338 "node": ">=0.10.0"
18957 20339 }
18958 20340 },
  20341 + "node_modules/require-main-filename": {
  20342 + "version": "1.0.1",
  20343 + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
  20344 + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==",
  20345 + "dev": true,
  20346 + "peer": true
  20347 + },
18959 20348 "node_modules/resize-observer-polyfill": {
18960 20349 "version": "1.5.1",
18961 20350 "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
... ... @@ -18985,6 +20374,12 @@
18985 20374 "node": ">=4"
18986 20375 }
18987 20376 },
  20377 + "node_modules/resolve-pathname": {
  20378 + "version": "3.0.0",
  20379 + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz",
  20380 + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==",
  20381 + "peer": true
  20382 + },
18988 20383 "node_modules/resolve-pkg-maps": {
18989 20384 "version": "1.0.0",
18990 20385 "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
... ... @@ -19001,6 +20396,15 @@
19001 20396 "protocol-buffers-schema": "^3.3.1"
19002 20397 }
19003 20398 },
  20399 + "node_modules/resolve-url": {
  20400 + "version": "0.2.1",
  20401 + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
  20402 + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==",
  20403 + "deprecated": "https://github.com/lydell/resolve-url#deprecated",
  20404 + "dev": true,
  20405 + "optional": true,
  20406 + "peer": true
  20407 + },
19004 20408 "node_modules/responselike": {
19005 20409 "version": "1.0.2",
19006 20410 "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
... ... @@ -19053,6 +20457,17 @@
19053 20457 "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
19054 20458 "dev": true
19055 20459 },
  20460 + "node_modules/ret": {
  20461 + "version": "0.1.15",
  20462 + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
  20463 + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
  20464 + "dev": true,
  20465 + "optional": true,
  20466 + "peer": true,
  20467 + "engines": {
  20468 + "node": ">=0.12"
  20469 + }
  20470 + },
19056 20471 "node_modules/reusify": {
19057 20472 "version": "1.0.4",
19058 20473 "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
... ... @@ -19392,6 +20807,17 @@
19392 20807 }
19393 20808 ]
19394 20809 },
  20810 + "node_modules/safe-regex": {
  20811 + "version": "1.1.0",
  20812 + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
  20813 + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==",
  20814 + "dev": true,
  20815 + "optional": true,
  20816 + "peer": true,
  20817 + "dependencies": {
  20818 + "ret": "~0.1.10"
  20819 + }
  20820 + },
19395 20821 "node_modules/safe-regex-test": {
19396 20822 "version": "1.0.3",
19397 20823 "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
... ... @@ -19427,6 +20853,16 @@
19427 20853 "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==",
19428 20854 "optional": true
19429 20855 },
  20856 + "node_modules/scheduler": {
  20857 + "version": "0.20.2",
  20858 + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
  20859 + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
  20860 + "peer": true,
  20861 + "dependencies": {
  20862 + "loose-envify": "^1.1.0",
  20863 + "object-assign": "^4.1.1"
  20864 + }
  20865 + },
19430 20866 "node_modules/schema-utils": {
19431 20867 "version": "3.3.0",
19432 20868 "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
... ... @@ -19495,6 +20931,22 @@
19495 20931 "semver": "bin/semver.js"
19496 20932 }
19497 20933 },
  20934 + "node_modules/serialize-javascript": {
  20935 + "version": "6.0.2",
  20936 + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
  20937 + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
  20938 + "peer": true,
  20939 + "dependencies": {
  20940 + "randombytes": "^2.1.0"
  20941 + }
  20942 + },
  20943 + "node_modules/set-blocking": {
  20944 + "version": "2.0.0",
  20945 + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
  20946 + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
  20947 + "dev": true,
  20948 + "peer": true
  20949 + },
19498 20950 "node_modules/set-function-length": {
19499 20951 "version": "1.2.1",
19500 20952 "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz",
... ... @@ -19683,72 +21135,196 @@
19683 21135 "url": "https://github.com/chalk/slice-ansi?sponsor=1"
19684 21136 }
19685 21137 },
19686   - "node_modules/sonic-boom": {
19687   - "version": "2.8.0",
19688   - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz",
19689   - "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==",
  21138 + "node_modules/snapdragon": {
  21139 + "version": "0.8.2",
  21140 + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
  21141 + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
  21142 + "dev": true,
  21143 + "optional": true,
  21144 + "peer": true,
19690 21145 "dependencies": {
19691   - "atomic-sleep": "^1.0.0"
  21146 + "base": "^0.11.1",
  21147 + "debug": "^2.2.0",
  21148 + "define-property": "^0.2.5",
  21149 + "extend-shallow": "^2.0.1",
  21150 + "map-cache": "^0.2.2",
  21151 + "source-map": "^0.5.6",
  21152 + "source-map-resolve": "^0.5.0",
  21153 + "use": "^3.1.0"
  21154 + },
  21155 + "engines": {
  21156 + "node": ">=0.10.0"
19692 21157 }
19693 21158 },
19694   - "node_modules/sort-asc": {
19695   - "version": "0.2.0",
19696   - "resolved": "https://registry.npmjs.org/sort-asc/-/sort-asc-0.2.0.tgz",
19697   - "integrity": "sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA==",
  21159 + "node_modules/snapdragon-node": {
  21160 + "version": "2.1.1",
  21161 + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
  21162 + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
  21163 + "dev": true,
  21164 + "optional": true,
  21165 + "peer": true,
  21166 + "dependencies": {
  21167 + "define-property": "^1.0.0",
  21168 + "isobject": "^3.0.0",
  21169 + "snapdragon-util": "^3.0.1"
  21170 + },
19698 21171 "engines": {
19699 21172 "node": ">=0.10.0"
19700 21173 }
19701 21174 },
19702   - "node_modules/sort-desc": {
19703   - "version": "0.2.0",
19704   - "resolved": "https://registry.npmjs.org/sort-desc/-/sort-desc-0.2.0.tgz",
19705   - "integrity": "sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w==",
  21175 + "node_modules/snapdragon-node/node_modules/define-property": {
  21176 + "version": "1.0.0",
  21177 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
  21178 + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
  21179 + "dev": true,
  21180 + "optional": true,
  21181 + "peer": true,
  21182 + "dependencies": {
  21183 + "is-descriptor": "^1.0.0"
  21184 + },
19706 21185 "engines": {
19707 21186 "node": ">=0.10.0"
19708 21187 }
19709 21188 },
19710   - "node_modules/sort-keys": {
19711   - "version": "2.0.0",
19712   - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz",
19713   - "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==",
  21189 + "node_modules/snapdragon-node/node_modules/is-descriptor": {
  21190 + "version": "1.0.3",
  21191 + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz",
  21192 + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==",
19714 21193 "dev": true,
  21194 + "optional": true,
  21195 + "peer": true,
19715 21196 "dependencies": {
19716   - "is-plain-obj": "^1.0.0"
  21197 + "is-accessor-descriptor": "^1.0.1",
  21198 + "is-data-descriptor": "^1.0.1"
19717 21199 },
19718 21200 "engines": {
19719   - "node": ">=4"
  21201 + "node": ">= 0.4"
19720 21202 }
19721 21203 },
19722   - "node_modules/sort-keys-length": {
19723   - "version": "1.0.1",
19724   - "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz",
19725   - "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==",
  21204 + "node_modules/snapdragon-util": {
  21205 + "version": "3.0.1",
  21206 + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
  21207 + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
19726 21208 "dev": true,
  21209 + "optional": true,
  21210 + "peer": true,
19727 21211 "dependencies": {
19728   - "sort-keys": "^1.0.0"
  21212 + "kind-of": "^3.2.0"
19729 21213 },
19730 21214 "engines": {
19731 21215 "node": ">=0.10.0"
19732 21216 }
19733 21217 },
19734   - "node_modules/sort-keys-length/node_modules/sort-keys": {
19735   - "version": "1.1.2",
19736   - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
19737   - "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==",
  21218 + "node_modules/snapdragon-util/node_modules/kind-of": {
  21219 + "version": "3.2.2",
  21220 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
  21221 + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
19738 21222 "dev": true,
  21223 + "optional": true,
  21224 + "peer": true,
19739 21225 "dependencies": {
19740   - "is-plain-obj": "^1.0.0"
  21226 + "is-buffer": "^1.1.5"
19741 21227 },
19742 21228 "engines": {
19743 21229 "node": ">=0.10.0"
19744 21230 }
19745 21231 },
19746   - "node_modules/sort-object": {
19747   - "version": "3.0.3",
19748   - "resolved": "https://registry.npmjs.org/sort-object/-/sort-object-3.0.3.tgz",
19749   - "integrity": "sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ==",
19750   - "dependencies": {
19751   - "bytewise": "^1.1.0",
  21232 + "node_modules/snapdragon/node_modules/debug": {
  21233 + "version": "2.6.9",
  21234 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
  21235 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
  21236 + "dev": true,
  21237 + "optional": true,
  21238 + "peer": true,
  21239 + "dependencies": {
  21240 + "ms": "2.0.0"
  21241 + }
  21242 + },
  21243 + "node_modules/snapdragon/node_modules/ms": {
  21244 + "version": "2.0.0",
  21245 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
  21246 + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
  21247 + "dev": true,
  21248 + "optional": true,
  21249 + "peer": true
  21250 + },
  21251 + "node_modules/snapdragon/node_modules/source-map": {
  21252 + "version": "0.5.7",
  21253 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
  21254 + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
  21255 + "dev": true,
  21256 + "optional": true,
  21257 + "peer": true,
  21258 + "engines": {
  21259 + "node": ">=0.10.0"
  21260 + }
  21261 + },
  21262 + "node_modules/sonic-boom": {
  21263 + "version": "2.8.0",
  21264 + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz",
  21265 + "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==",
  21266 + "dependencies": {
  21267 + "atomic-sleep": "^1.0.0"
  21268 + }
  21269 + },
  21270 + "node_modules/sort-asc": {
  21271 + "version": "0.2.0",
  21272 + "resolved": "https://registry.npmjs.org/sort-asc/-/sort-asc-0.2.0.tgz",
  21273 + "integrity": "sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA==",
  21274 + "engines": {
  21275 + "node": ">=0.10.0"
  21276 + }
  21277 + },
  21278 + "node_modules/sort-desc": {
  21279 + "version": "0.2.0",
  21280 + "resolved": "https://registry.npmjs.org/sort-desc/-/sort-desc-0.2.0.tgz",
  21281 + "integrity": "sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w==",
  21282 + "engines": {
  21283 + "node": ">=0.10.0"
  21284 + }
  21285 + },
  21286 + "node_modules/sort-keys": {
  21287 + "version": "2.0.0",
  21288 + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz",
  21289 + "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==",
  21290 + "dev": true,
  21291 + "dependencies": {
  21292 + "is-plain-obj": "^1.0.0"
  21293 + },
  21294 + "engines": {
  21295 + "node": ">=4"
  21296 + }
  21297 + },
  21298 + "node_modules/sort-keys-length": {
  21299 + "version": "1.0.1",
  21300 + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz",
  21301 + "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==",
  21302 + "dev": true,
  21303 + "dependencies": {
  21304 + "sort-keys": "^1.0.0"
  21305 + },
  21306 + "engines": {
  21307 + "node": ">=0.10.0"
  21308 + }
  21309 + },
  21310 + "node_modules/sort-keys-length/node_modules/sort-keys": {
  21311 + "version": "1.1.2",
  21312 + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
  21313 + "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==",
  21314 + "dev": true,
  21315 + "dependencies": {
  21316 + "is-plain-obj": "^1.0.0"
  21317 + },
  21318 + "engines": {
  21319 + "node": ">=0.10.0"
  21320 + }
  21321 + },
  21322 + "node_modules/sort-object": {
  21323 + "version": "3.0.3",
  21324 + "resolved": "https://registry.npmjs.org/sort-object/-/sort-object-3.0.3.tgz",
  21325 + "integrity": "sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ==",
  21326 + "dependencies": {
  21327 + "bytewise": "^1.1.0",
19752 21328 "get-value": "^2.0.2",
19753 21329 "is-extendable": "^0.1.1",
19754 21330 "sort-asc": "^0.2.0",
... ... @@ -19825,6 +21401,13 @@
19825 21401 "url": "https://github.com/sponsors/sindresorhus"
19826 21402 }
19827 21403 },
  21404 + "node_modules/source-list-map": {
  21405 + "version": "2.0.1",
  21406 + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
  21407 + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
  21408 + "dev": true,
  21409 + "peer": true
  21410 + },
19828 21411 "node_modules/source-map": {
19829 21412 "version": "0.7.4",
19830 21413 "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
... ... @@ -19841,6 +21424,22 @@
19841 21424 "node": ">=0.10.0"
19842 21425 }
19843 21426 },
  21427 + "node_modules/source-map-resolve": {
  21428 + "version": "0.5.3",
  21429 + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
  21430 + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
  21431 + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated",
  21432 + "dev": true,
  21433 + "optional": true,
  21434 + "peer": true,
  21435 + "dependencies": {
  21436 + "atob": "^2.1.2",
  21437 + "decode-uri-component": "^0.2.0",
  21438 + "resolve-url": "^0.2.1",
  21439 + "source-map-url": "^0.4.0",
  21440 + "urix": "^0.1.0"
  21441 + }
  21442 + },
19844 21443 "node_modules/source-map-support": {
19845 21444 "version": "0.5.21",
19846 21445 "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
... ... @@ -19858,6 +21457,15 @@
19858 21457 "node": ">=0.10.0"
19859 21458 }
19860 21459 },
  21460 + "node_modules/source-map-url": {
  21461 + "version": "0.4.1",
  21462 + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
  21463 + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
  21464 + "deprecated": "See https://github.com/lydell/source-map-url#deprecated",
  21465 + "dev": true,
  21466 + "optional": true,
  21467 + "peer": true
  21468 + },
19861 21469 "node_modules/spdx-correct": {
19862 21470 "version": "3.2.0",
19863 21471 "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
... ... @@ -20062,6 +21670,21 @@
20062 21670 "stacktrace-gps": "^3.0.4"
20063 21671 }
20064 21672 },
  21673 + "node_modules/static-extend": {
  21674 + "version": "0.1.2",
  21675 + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
  21676 + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==",
  21677 + "dev": true,
  21678 + "optional": true,
  21679 + "peer": true,
  21680 + "dependencies": {
  21681 + "define-property": "^0.2.5",
  21682 + "object-copy": "^0.1.0"
  21683 + },
  21684 + "engines": {
  21685 + "node": ">=0.10.0"
  21686 + }
  21687 + },
20065 21688 "node_modules/stdin-discarder": {
20066 21689 "version": "0.1.0",
20067 21690 "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz",
... ... @@ -20657,6 +22280,15 @@
20657 22280 "react": "^16.11.0 || ^17.0.0 || ^18.0.0"
20658 22281 }
20659 22282 },
  22283 + "node_modules/symbol-observable": {
  22284 + "version": "1.2.0",
  22285 + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
  22286 + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==",
  22287 + "peer": true,
  22288 + "engines": {
  22289 + "node": ">=0.10.0"
  22290 + }
  22291 + },
20660 22292 "node_modules/synckit": {
20661 22293 "version": "0.8.5",
20662 22294 "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz",
... ... @@ -20938,6 +22570,69 @@
20938 22570 "node": ">=10"
20939 22571 }
20940 22572 },
  22573 + "node_modules/terser-webpack-plugin": {
  22574 + "version": "5.3.10",
  22575 + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
  22576 + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
  22577 + "peer": true,
  22578 + "dependencies": {
  22579 + "@jridgewell/trace-mapping": "^0.3.20",
  22580 + "jest-worker": "^27.4.5",
  22581 + "schema-utils": "^3.1.1",
  22582 + "serialize-javascript": "^6.0.1",
  22583 + "terser": "^5.26.0"
  22584 + },
  22585 + "engines": {
  22586 + "node": ">= 10.13.0"
  22587 + },
  22588 + "funding": {
  22589 + "type": "opencollective",
  22590 + "url": "https://opencollective.com/webpack"
  22591 + },
  22592 + "peerDependencies": {
  22593 + "webpack": "^5.1.0"
  22594 + },
  22595 + "peerDependenciesMeta": {
  22596 + "@swc/core": {
  22597 + "optional": true
  22598 + },
  22599 + "esbuild": {
  22600 + "optional": true
  22601 + },
  22602 + "uglify-js": {
  22603 + "optional": true
  22604 + }
  22605 + }
  22606 + },
  22607 + "node_modules/terser-webpack-plugin/node_modules/jest-worker": {
  22608 + "version": "27.5.1",
  22609 + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
  22610 + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
  22611 + "peer": true,
  22612 + "dependencies": {
  22613 + "@types/node": "*",
  22614 + "merge-stream": "^2.0.0",
  22615 + "supports-color": "^8.0.0"
  22616 + },
  22617 + "engines": {
  22618 + "node": ">= 10.13.0"
  22619 + }
  22620 + },
  22621 + "node_modules/terser-webpack-plugin/node_modules/supports-color": {
  22622 + "version": "8.1.1",
  22623 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
  22624 + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
  22625 + "peer": true,
  22626 + "dependencies": {
  22627 + "has-flag": "^4.0.0"
  22628 + },
  22629 + "engines": {
  22630 + "node": ">=10"
  22631 + },
  22632 + "funding": {
  22633 + "url": "https://github.com/chalk/supports-color?sponsor=1"
  22634 + }
  22635 + },
20941 22636 "node_modules/terser/node_modules/commander": {
20942 22637 "version": "2.20.3",
20943 22638 "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
... ... @@ -21040,6 +22735,18 @@
21040 22735 "node": ">=0.6.0"
21041 22736 }
21042 22737 },
  22738 + "node_modules/tiny-invariant": {
  22739 + "version": "1.3.3",
  22740 + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
  22741 + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
  22742 + "peer": true
  22743 + },
  22744 + "node_modules/tiny-warning": {
  22745 + "version": "1.0.3",
  22746 + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
  22747 + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==",
  22748 + "peer": true
  22749 + },
21043 22750 "node_modules/tinycolor2": {
21044 22751 "version": "1.6.0",
21045 22752 "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
... ... @@ -21097,6 +22804,34 @@
21097 22804 "node": ">=4"
21098 22805 }
21099 22806 },
  22807 + "node_modules/to-object-path": {
  22808 + "version": "0.3.0",
  22809 + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
  22810 + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==",
  22811 + "dev": true,
  22812 + "optional": true,
  22813 + "peer": true,
  22814 + "dependencies": {
  22815 + "kind-of": "^3.0.2"
  22816 + },
  22817 + "engines": {
  22818 + "node": ">=0.10.0"
  22819 + }
  22820 + },
  22821 + "node_modules/to-object-path/node_modules/kind-of": {
  22822 + "version": "3.2.2",
  22823 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
  22824 + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
  22825 + "dev": true,
  22826 + "optional": true,
  22827 + "peer": true,
  22828 + "dependencies": {
  22829 + "is-buffer": "^1.1.5"
  22830 + },
  22831 + "engines": {
  22832 + "node": ">=0.10.0"
  22833 + }
  22834 + },
21100 22835 "node_modules/to-readable-stream": {
21101 22836 "version": "1.0.0",
21102 22837 "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
... ... @@ -21106,6 +22841,23 @@
21106 22841 "node": ">=6"
21107 22842 }
21108 22843 },
  22844 + "node_modules/to-regex": {
  22845 + "version": "3.0.2",
  22846 + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
  22847 + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
  22848 + "dev": true,
  22849 + "optional": true,
  22850 + "peer": true,
  22851 + "dependencies": {
  22852 + "define-property": "^2.0.2",
  22853 + "extend-shallow": "^3.0.2",
  22854 + "regex-not": "^1.0.2",
  22855 + "safe-regex": "^1.1.0"
  22856 + },
  22857 + "engines": {
  22858 + "node": ">=0.10.0"
  22859 + }
  22860 + },
21109 22861 "node_modules/to-regex-range": {
21110 22862 "version": "5.0.1",
21111 22863 "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
... ... @@ -21117,6 +22869,65 @@
21117 22869 "node": ">=8.0"
21118 22870 }
21119 22871 },
  22872 + "node_modules/to-regex/node_modules/define-property": {
  22873 + "version": "2.0.2",
  22874 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
  22875 + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
  22876 + "dev": true,
  22877 + "optional": true,
  22878 + "peer": true,
  22879 + "dependencies": {
  22880 + "is-descriptor": "^1.0.2",
  22881 + "isobject": "^3.0.1"
  22882 + },
  22883 + "engines": {
  22884 + "node": ">=0.10.0"
  22885 + }
  22886 + },
  22887 + "node_modules/to-regex/node_modules/extend-shallow": {
  22888 + "version": "3.0.2",
  22889 + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
  22890 + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
  22891 + "dev": true,
  22892 + "optional": true,
  22893 + "peer": true,
  22894 + "dependencies": {
  22895 + "assign-symbols": "^1.0.0",
  22896 + "is-extendable": "^1.0.1"
  22897 + },
  22898 + "engines": {
  22899 + "node": ">=0.10.0"
  22900 + }
  22901 + },
  22902 + "node_modules/to-regex/node_modules/is-descriptor": {
  22903 + "version": "1.0.3",
  22904 + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz",
  22905 + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==",
  22906 + "dev": true,
  22907 + "optional": true,
  22908 + "peer": true,
  22909 + "dependencies": {
  22910 + "is-accessor-descriptor": "^1.0.1",
  22911 + "is-data-descriptor": "^1.0.1"
  22912 + },
  22913 + "engines": {
  22914 + "node": ">= 0.4"
  22915 + }
  22916 + },
  22917 + "node_modules/to-regex/node_modules/is-extendable": {
  22918 + "version": "1.0.1",
  22919 + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
  22920 + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
  22921 + "dev": true,
  22922 + "optional": true,
  22923 + "peer": true,
  22924 + "dependencies": {
  22925 + "is-plain-object": "^2.0.4"
  22926 + },
  22927 + "engines": {
  22928 + "node": ">=0.10.0"
  22929 + }
  22930 + },
21120 22931 "node_modules/toggle-selection": {
21121 22932 "version": "1.0.6",
21122 22933 "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
... ... @@ -22320,14 +24131,82 @@
22320 24131 "node": ">= 4.0.0"
22321 24132 }
22322 24133 },
22323   - "node_modules/untildify": {
22324   - "version": "4.0.0",
  24134 + "node_modules/unset-value": {
  24135 + "version": "1.0.0",
  24136 + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
  24137 + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==",
  24138 + "dev": true,
  24139 + "optional": true,
  24140 + "peer": true,
  24141 + "dependencies": {
  24142 + "has-value": "^0.3.1",
  24143 + "isobject": "^3.0.0"
  24144 + },
  24145 + "engines": {
  24146 + "node": ">=0.10.0"
  24147 + }
  24148 + },
  24149 + "node_modules/unset-value/node_modules/has-value": {
  24150 + "version": "0.3.1",
  24151 + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
  24152 + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==",
  24153 + "dev": true,
  24154 + "optional": true,
  24155 + "peer": true,
  24156 + "dependencies": {
  24157 + "get-value": "^2.0.3",
  24158 + "has-values": "^0.1.4",
  24159 + "isobject": "^2.0.0"
  24160 + },
  24161 + "engines": {
  24162 + "node": ">=0.10.0"
  24163 + }
  24164 + },
  24165 + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
  24166 + "version": "2.1.0",
  24167 + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
  24168 + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==",
  24169 + "dev": true,
  24170 + "optional": true,
  24171 + "peer": true,
  24172 + "dependencies": {
  24173 + "isarray": "1.0.0"
  24174 + },
  24175 + "engines": {
  24176 + "node": ">=0.10.0"
  24177 + }
  24178 + },
  24179 + "node_modules/unset-value/node_modules/has-values": {
  24180 + "version": "0.1.4",
  24181 + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
  24182 + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==",
  24183 + "dev": true,
  24184 + "optional": true,
  24185 + "peer": true,
  24186 + "engines": {
  24187 + "node": ">=0.10.0"
  24188 + }
  24189 + },
  24190 + "node_modules/untildify": {
  24191 + "version": "4.0.0",
22325 24192 "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
22326 24193 "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
22327 24194 "engines": {
22328 24195 "node": ">=8"
22329 24196 }
22330 24197 },
  24198 + "node_modules/upath": {
  24199 + "version": "1.2.0",
  24200 + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
  24201 + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
  24202 + "dev": true,
  24203 + "optional": true,
  24204 + "peer": true,
  24205 + "engines": {
  24206 + "node": ">=4",
  24207 + "yarn": "*"
  24208 + }
  24209 + },
22331 24210 "node_modules/update-browserslist-db": {
22332 24211 "version": "1.0.13",
22333 24212 "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
... ... @@ -22373,6 +24252,15 @@
22373 24252 "node": ">=6"
22374 24253 }
22375 24254 },
  24255 + "node_modules/urix": {
  24256 + "version": "0.1.0",
  24257 + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
  24258 + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==",
  24259 + "deprecated": "Please see https://github.com/lydell/urix#deprecated",
  24260 + "dev": true,
  24261 + "optional": true,
  24262 + "peer": true
  24263 + },
22376 24264 "node_modules/url": {
22377 24265 "version": "0.11.3",
22378 24266 "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz",
... ... @@ -22409,6 +24297,17 @@
22409 24297 "node": ">= 4"
22410 24298 }
22411 24299 },
  24300 + "node_modules/use": {
  24301 + "version": "3.1.1",
  24302 + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
  24303 + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
  24304 + "dev": true,
  24305 + "optional": true,
  24306 + "peer": true,
  24307 + "engines": {
  24308 + "node": ">=0.10.0"
  24309 + }
  24310 + },
22412 24311 "node_modules/use-isomorphic-layout-effect": {
22413 24312 "version": "1.1.2",
22414 24313 "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz",
... ... @@ -22505,6 +24404,12 @@
22505 24404 }
22506 24405 }
22507 24406 },
  24407 + "node_modules/value-equal": {
  24408 + "version": "1.0.1",
  24409 + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz",
  24410 + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==",
  24411 + "peer": true
  24412 + },
22508 24413 "node_modules/vary": {
22509 24414 "version": "1.1.2",
22510 24415 "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
... ... @@ -22613,6 +24518,335 @@
22613 24518 "loose-envify": "^1.0.0"
22614 24519 }
22615 24520 },
  24521 + "node_modules/watchpack": {
  24522 + "version": "2.4.2",
  24523 + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
  24524 + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
  24525 + "peer": true,
  24526 + "dependencies": {
  24527 + "glob-to-regexp": "^0.4.1",
  24528 + "graceful-fs": "^4.1.2"
  24529 + },
  24530 + "engines": {
  24531 + "node": ">=10.13.0"
  24532 + }
  24533 + },
  24534 + "node_modules/watchpack-chokidar2": {
  24535 + "version": "2.0.1",
  24536 + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz",
  24537 + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==",
  24538 + "dev": true,
  24539 + "optional": true,
  24540 + "peer": true,
  24541 + "dependencies": {
  24542 + "chokidar": "^2.1.8"
  24543 + }
  24544 + },
  24545 + "node_modules/watchpack-chokidar2/node_modules/anymatch": {
  24546 + "version": "2.0.0",
  24547 + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
  24548 + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
  24549 + "dev": true,
  24550 + "optional": true,
  24551 + "peer": true,
  24552 + "dependencies": {
  24553 + "micromatch": "^3.1.4",
  24554 + "normalize-path": "^2.1.1"
  24555 + }
  24556 + },
  24557 + "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": {
  24558 + "version": "2.1.1",
  24559 + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
  24560 + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==",
  24561 + "dev": true,
  24562 + "optional": true,
  24563 + "peer": true,
  24564 + "dependencies": {
  24565 + "remove-trailing-separator": "^1.0.1"
  24566 + },
  24567 + "engines": {
  24568 + "node": ">=0.10.0"
  24569 + }
  24570 + },
  24571 + "node_modules/watchpack-chokidar2/node_modules/binary-extensions": {
  24572 + "version": "1.13.1",
  24573 + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
  24574 + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
  24575 + "dev": true,
  24576 + "optional": true,
  24577 + "peer": true,
  24578 + "engines": {
  24579 + "node": ">=0.10.0"
  24580 + }
  24581 + },
  24582 + "node_modules/watchpack-chokidar2/node_modules/braces": {
  24583 + "version": "2.3.2",
  24584 + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
  24585 + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
  24586 + "dev": true,
  24587 + "optional": true,
  24588 + "peer": true,
  24589 + "dependencies": {
  24590 + "arr-flatten": "^1.1.0",
  24591 + "array-unique": "^0.3.2",
  24592 + "extend-shallow": "^2.0.1",
  24593 + "fill-range": "^4.0.0",
  24594 + "isobject": "^3.0.1",
  24595 + "repeat-element": "^1.1.2",
  24596 + "snapdragon": "^0.8.1",
  24597 + "snapdragon-node": "^2.0.1",
  24598 + "split-string": "^3.0.2",
  24599 + "to-regex": "^3.0.1"
  24600 + },
  24601 + "engines": {
  24602 + "node": ">=0.10.0"
  24603 + }
  24604 + },
  24605 + "node_modules/watchpack-chokidar2/node_modules/chokidar": {
  24606 + "version": "2.1.8",
  24607 + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
  24608 + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
  24609 + "dev": true,
  24610 + "optional": true,
  24611 + "peer": true,
  24612 + "dependencies": {
  24613 + "anymatch": "^2.0.0",
  24614 + "async-each": "^1.0.1",
  24615 + "braces": "^2.3.2",
  24616 + "glob-parent": "^3.1.0",
  24617 + "inherits": "^2.0.3",
  24618 + "is-binary-path": "^1.0.0",
  24619 + "is-glob": "^4.0.0",
  24620 + "normalize-path": "^3.0.0",
  24621 + "path-is-absolute": "^1.0.0",
  24622 + "readdirp": "^2.2.1",
  24623 + "upath": "^1.1.1"
  24624 + },
  24625 + "optionalDependencies": {
  24626 + "fsevents": "^1.2.7"
  24627 + }
  24628 + },
  24629 + "node_modules/watchpack-chokidar2/node_modules/define-property": {
  24630 + "version": "2.0.2",
  24631 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
  24632 + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
  24633 + "dev": true,
  24634 + "optional": true,
  24635 + "peer": true,
  24636 + "dependencies": {
  24637 + "is-descriptor": "^1.0.2",
  24638 + "isobject": "^3.0.1"
  24639 + },
  24640 + "engines": {
  24641 + "node": ">=0.10.0"
  24642 + }
  24643 + },
  24644 + "node_modules/watchpack-chokidar2/node_modules/fill-range": {
  24645 + "version": "4.0.0",
  24646 + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
  24647 + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==",
  24648 + "dev": true,
  24649 + "optional": true,
  24650 + "peer": true,
  24651 + "dependencies": {
  24652 + "extend-shallow": "^2.0.1",
  24653 + "is-number": "^3.0.0",
  24654 + "repeat-string": "^1.6.1",
  24655 + "to-regex-range": "^2.1.0"
  24656 + },
  24657 + "engines": {
  24658 + "node": ">=0.10.0"
  24659 + }
  24660 + },
  24661 + "node_modules/watchpack-chokidar2/node_modules/fsevents": {
  24662 + "version": "1.2.13",
  24663 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
  24664 + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
  24665 + "deprecated": "Upgrade to fsevents v2 to mitigate potential security issues",
  24666 + "dev": true,
  24667 + "hasInstallScript": true,
  24668 + "optional": true,
  24669 + "os": [
  24670 + "darwin"
  24671 + ],
  24672 + "peer": true,
  24673 + "dependencies": {
  24674 + "bindings": "^1.5.0",
  24675 + "nan": "^2.12.1"
  24676 + },
  24677 + "engines": {
  24678 + "node": ">= 4.0"
  24679 + }
  24680 + },
  24681 + "node_modules/watchpack-chokidar2/node_modules/glob-parent": {
  24682 + "version": "3.1.0",
  24683 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
  24684 + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==",
  24685 + "dev": true,
  24686 + "optional": true,
  24687 + "peer": true,
  24688 + "dependencies": {
  24689 + "is-glob": "^3.1.0",
  24690 + "path-dirname": "^1.0.0"
  24691 + }
  24692 + },
  24693 + "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": {
  24694 + "version": "3.1.0",
  24695 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
  24696 + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==",
  24697 + "dev": true,
  24698 + "optional": true,
  24699 + "peer": true,
  24700 + "dependencies": {
  24701 + "is-extglob": "^2.1.0"
  24702 + },
  24703 + "engines": {
  24704 + "node": ">=0.10.0"
  24705 + }
  24706 + },
  24707 + "node_modules/watchpack-chokidar2/node_modules/is-binary-path": {
  24708 + "version": "1.0.1",
  24709 + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
  24710 + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==",
  24711 + "dev": true,
  24712 + "optional": true,
  24713 + "peer": true,
  24714 + "dependencies": {
  24715 + "binary-extensions": "^1.0.0"
  24716 + },
  24717 + "engines": {
  24718 + "node": ">=0.10.0"
  24719 + }
  24720 + },
  24721 + "node_modules/watchpack-chokidar2/node_modules/is-descriptor": {
  24722 + "version": "1.0.3",
  24723 + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz",
  24724 + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==",
  24725 + "dev": true,
  24726 + "optional": true,
  24727 + "peer": true,
  24728 + "dependencies": {
  24729 + "is-accessor-descriptor": "^1.0.1",
  24730 + "is-data-descriptor": "^1.0.1"
  24731 + },
  24732 + "engines": {
  24733 + "node": ">= 0.4"
  24734 + }
  24735 + },
  24736 + "node_modules/watchpack-chokidar2/node_modules/is-extendable": {
  24737 + "version": "1.0.1",
  24738 + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
  24739 + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
  24740 + "dev": true,
  24741 + "optional": true,
  24742 + "peer": true,
  24743 + "dependencies": {
  24744 + "is-plain-object": "^2.0.4"
  24745 + },
  24746 + "engines": {
  24747 + "node": ">=0.10.0"
  24748 + }
  24749 + },
  24750 + "node_modules/watchpack-chokidar2/node_modules/is-number": {
  24751 + "version": "3.0.0",
  24752 + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
  24753 + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
  24754 + "dev": true,
  24755 + "optional": true,
  24756 + "peer": true,
  24757 + "dependencies": {
  24758 + "kind-of": "^3.0.2"
  24759 + },
  24760 + "engines": {
  24761 + "node": ">=0.10.0"
  24762 + }
  24763 + },
  24764 + "node_modules/watchpack-chokidar2/node_modules/is-number/node_modules/kind-of": {
  24765 + "version": "3.2.2",
  24766 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
  24767 + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
  24768 + "dev": true,
  24769 + "optional": true,
  24770 + "peer": true,
  24771 + "dependencies": {
  24772 + "is-buffer": "^1.1.5"
  24773 + },
  24774 + "engines": {
  24775 + "node": ">=0.10.0"
  24776 + }
  24777 + },
  24778 + "node_modules/watchpack-chokidar2/node_modules/micromatch": {
  24779 + "version": "3.1.10",
  24780 + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
  24781 + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
  24782 + "dev": true,
  24783 + "optional": true,
  24784 + "peer": true,
  24785 + "dependencies": {
  24786 + "arr-diff": "^4.0.0",
  24787 + "array-unique": "^0.3.2",
  24788 + "braces": "^2.3.1",
  24789 + "define-property": "^2.0.2",
  24790 + "extend-shallow": "^3.0.2",
  24791 + "extglob": "^2.0.4",
  24792 + "fragment-cache": "^0.2.1",
  24793 + "kind-of": "^6.0.2",
  24794 + "nanomatch": "^1.2.9",
  24795 + "object.pick": "^1.3.0",
  24796 + "regex-not": "^1.0.0",
  24797 + "snapdragon": "^0.8.1",
  24798 + "to-regex": "^3.0.2"
  24799 + },
  24800 + "engines": {
  24801 + "node": ">=0.10.0"
  24802 + }
  24803 + },
  24804 + "node_modules/watchpack-chokidar2/node_modules/micromatch/node_modules/extend-shallow": {
  24805 + "version": "3.0.2",
  24806 + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
  24807 + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
  24808 + "dev": true,
  24809 + "optional": true,
  24810 + "peer": true,
  24811 + "dependencies": {
  24812 + "assign-symbols": "^1.0.0",
  24813 + "is-extendable": "^1.0.1"
  24814 + },
  24815 + "engines": {
  24816 + "node": ">=0.10.0"
  24817 + }
  24818 + },
  24819 + "node_modules/watchpack-chokidar2/node_modules/readdirp": {
  24820 + "version": "2.2.1",
  24821 + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
  24822 + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
  24823 + "dev": true,
  24824 + "optional": true,
  24825 + "peer": true,
  24826 + "dependencies": {
  24827 + "graceful-fs": "^4.1.11",
  24828 + "micromatch": "^3.1.10",
  24829 + "readable-stream": "^2.0.2"
  24830 + },
  24831 + "engines": {
  24832 + "node": ">=0.10"
  24833 + }
  24834 + },
  24835 + "node_modules/watchpack-chokidar2/node_modules/to-regex-range": {
  24836 + "version": "2.1.1",
  24837 + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
  24838 + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==",
  24839 + "dev": true,
  24840 + "optional": true,
  24841 + "peer": true,
  24842 + "dependencies": {
  24843 + "is-number": "^3.0.0",
  24844 + "repeat-string": "^1.6.1"
  24845 + },
  24846 + "engines": {
  24847 + "node": ">=0.10.0"
  24848 + }
  24849 + },
22616 24850 "node_modules/wbuf": {
22617 24851 "version": "1.7.3",
22618 24852 "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
... ... @@ -22649,6 +24883,52 @@
22649 24883 "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
22650 24884 "dev": true
22651 24885 },
  24886 + "node_modules/webpack": {
  24887 + "version": "5.95.0",
  24888 + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz",
  24889 + "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==",
  24890 + "peer": true,
  24891 + "dependencies": {
  24892 + "@types/estree": "^1.0.5",
  24893 + "@webassemblyjs/ast": "^1.12.1",
  24894 + "@webassemblyjs/wasm-edit": "^1.12.1",
  24895 + "@webassemblyjs/wasm-parser": "^1.12.1",
  24896 + "acorn": "^8.7.1",
  24897 + "acorn-import-attributes": "^1.9.5",
  24898 + "browserslist": "^4.21.10",
  24899 + "chrome-trace-event": "^1.0.2",
  24900 + "enhanced-resolve": "^5.17.1",
  24901 + "es-module-lexer": "^1.2.1",
  24902 + "eslint-scope": "5.1.1",
  24903 + "events": "^3.2.0",
  24904 + "glob-to-regexp": "^0.4.1",
  24905 + "graceful-fs": "^4.2.11",
  24906 + "json-parse-even-better-errors": "^2.3.1",
  24907 + "loader-runner": "^4.2.0",
  24908 + "mime-types": "^2.1.27",
  24909 + "neo-async": "^2.6.2",
  24910 + "schema-utils": "^3.2.0",
  24911 + "tapable": "^2.1.1",
  24912 + "terser-webpack-plugin": "^5.3.10",
  24913 + "watchpack": "^2.4.1",
  24914 + "webpack-sources": "^3.2.3"
  24915 + },
  24916 + "bin": {
  24917 + "webpack": "bin/webpack.js"
  24918 + },
  24919 + "engines": {
  24920 + "node": ">=10.13.0"
  24921 + },
  24922 + "funding": {
  24923 + "type": "opencollective",
  24924 + "url": "https://opencollective.com/webpack"
  24925 + },
  24926 + "peerDependenciesMeta": {
  24927 + "webpack-cli": {
  24928 + "optional": true
  24929 + }
  24930 + }
  24931 + },
22652 24932 "node_modules/webpack-bundle-analyzer": {
22653 24933 "version": "4.10.1",
22654 24934 "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz",
... ... @@ -22691,6 +24971,34 @@
22691 24971 "node": ">=0.10.0"
22692 24972 }
22693 24973 },
  24974 + "node_modules/webpack-sources": {
  24975 + "version": "3.2.3",
  24976 + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
  24977 + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
  24978 + "peer": true,
  24979 + "engines": {
  24980 + "node": ">=10.13.0"
  24981 + }
  24982 + },
  24983 + "node_modules/webpack/node_modules/enhanced-resolve": {
  24984 + "version": "5.17.1",
  24985 + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
  24986 + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
  24987 + "peer": true,
  24988 + "dependencies": {
  24989 + "graceful-fs": "^4.2.4",
  24990 + "tapable": "^2.2.0"
  24991 + },
  24992 + "engines": {
  24993 + "node": ">=10.13.0"
  24994 + }
  24995 + },
  24996 + "node_modules/whatwg-fetch": {
  24997 + "version": "3.6.20",
  24998 + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz",
  24999 + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==",
  25000 + "peer": true
  25001 + },
22694 25002 "node_modules/whatwg-url": {
22695 25003 "version": "5.0.0",
22696 25004 "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
... ... @@ -22774,6 +25082,13 @@
22774 25082 "url": "https://github.com/sponsors/ljharb"
22775 25083 }
22776 25084 },
  25085 + "node_modules/which-module": {
  25086 + "version": "1.0.0",
  25087 + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
  25088 + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==",
  25089 + "dev": true,
  25090 + "peer": true
  25091 + },
22777 25092 "node_modules/which-typed-array": {
22778 25093 "version": "1.1.14",
22779 25094 "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz",
... ...
src/pages/Client/Components/ClientDrawer.tsx renamed to src/pages/Client/Client/Components/ClientDrawer.tsx
... ... @@ -6,23 +6,34 @@ import {
6 6 postDistrictSelectByNameAndLevel,
7 7 postDistrictSelOrderProvince,
8 8 postServiceConstClientLevels,
  9 + postServiceConstClientSource,
9 10 postServiceConstTradeStatus,
10 11 } from '@/services';
  12 +
11 13 import { enumToSelect } from '@/utils';
12 14 import {
13 15 DrawerForm,
14   - ProFormDateTimePicker,
  16 + ProFormDatePicker,
15 17 ProFormSelect,
16 18 ProFormText,
17 19 } from '@ant-design/pro-components';
18 20 import { Button, Form, message } from 'antd';
  21 +// import { options } from 'node_modules/axios/index.cjs';
19 22 import { useState } from 'react';
20 23  
21 24 export default ({ optType, record, onFinish }) => {
22 25 const [form] = Form.useForm();
  26 + const requirementsEnum = {
  27 + EXPERIMENTAL_EQUIPMENT: '实验设备',
  28 + EXPERIMENTAL_MATERIALS: '实验材料',
  29 + OTHER: '其他',
  30 + PILOT_TEST_VALIDATION_SERVICES: '中式验证服务',
  31 + };
23 32 //省市区
24 33 const [province, setProvince] = useState('');
25 34 const [city, setCity] = useState('');
  35 + const [showReferrers, setShowReferrers] = useState(false); // 控制显示的状态,初始为false
  36 + const [showQuoteDatetime, setShowQuoteDatetime] = useState(false); // 控制显示的状态,初始为false
26 37 const optTypeEnum = {
27 38 add: {
28 39 text: '新增',
... ... @@ -42,7 +53,7 @@ export default ({ optType, record, onFinish }) =&gt; {
42 53 },
43 54 edit: {
44 55 text: '编辑',
45   - button: <a type="primary">编辑</a>,
  56 + button: <a type="link">编辑</a>,
46 57 readonly: false,
47 58 onFinish: async (values) => {
48 59 const res = await postAdminClientModifyClientInfo({
... ... @@ -58,11 +69,43 @@ export default ({ optType, record, onFinish }) =&gt; {
58 69 },
59 70 detail: {
60 71 text: '详情',
61   - button: <a type="primary">详情</a>,
  72 + // button: <a type="primary">详情</a>,
62 73 readonly: true,
63 74 },
64 75 };
65 76  
  77 + const handleSourceChange = (value) => {
  78 + if (value === 'REFERRAL_BY_ACQUAINTANCE') {
  79 + setShowReferrers(true);
  80 + } else {
  81 + setShowReferrers(false);
  82 + }
  83 + // 在这里可以添加其他逻辑,比如根据选择更新其他表单项的值
  84 + };
  85 + const handleSchemeChange = (value) => {
  86 + console.log(value);
  87 + if (value === true) {
  88 + setShowQuoteDatetime(true);
  89 + } else {
  90 + setShowQuoteDatetime(false);
  91 + }
  92 + // 在这里可以添加其他逻辑,比如根据选择更新其他表单项的值
  93 + };
  94 +
  95 + // MODIFIED: 增加处理非 JSON 格式字符串的逻辑
  96 + const parsedRecord = record
  97 + ? {
  98 + ...record,
  99 + requirements: (() => {
  100 + try {
  101 + return JSON.parse(record.requirements); // 尝试解析 JSON
  102 + } catch (error) {
  103 + return record.requirements ? record.requirements.split(',') : []; // 如果不是 JSON,则按逗号分隔字符串
  104 + }
  105 + })(),
  106 + }
  107 + : {}; // 如果 record 为空,返回一个空对象
  108 +
66 109 return (
67 110 <DrawerForm
68 111 title={optTypeEnum[optType].text}
... ... @@ -73,7 +116,7 @@ export default ({ optType, record, onFinish }) =&gt; {
73 116 maxWidth: window.innerWidth * 0.8,
74 117 minWidth: 300,
75 118 }}
76   - initialValues={record}
  119 + initialValues={parsedRecord}
77 120 form={form}
78 121 trigger={optTypeEnum[optType].button}
79 122 autoFocusFirstInput
... ... @@ -98,7 +141,7 @@ export default ({ optType, record, onFinish }) =&gt; {
98 141 },
99 142 ]}
100 143 />
101   - <ProFormText
  144 + {/* <ProFormText
102 145 name="companyName"
103 146 label="单位名称"
104 147 placeholder="请输入单位名称"
... ... @@ -108,7 +151,7 @@ export default ({ optType, record, onFinish }) =&gt; {
108 151 message: '请输入单位名称',
109 152 },
110 153 ]}
111   - />
  154 + /> */}
112 155 <div
113 156 style={{
114 157 display: 'flex',
... ... @@ -260,7 +303,7 @@ export default ({ optType, record, onFinish }) =&gt; {
260 303 />
261 304 </div>
262 305 <ProFormText
263   - name="companyAddress"
  306 + name="detailAddress"
264 307 label="详细地址"
265 308 placeholder="请输入单位地址"
266 309 rules={[
... ... @@ -271,6 +314,17 @@ export default ({ optType, record, onFinish }) =&gt; {
271 314 ]}
272 315 />
273 316 <ProFormText
  317 + name="contacts"
  318 + label="联系人"
  319 + placeholder="请输入联系人"
  320 + rules={[
  321 + {
  322 + required: true,
  323 + message: '请输入联系人',
  324 + },
  325 + ]}
  326 + />
  327 + <ProFormText
274 328 name="phoneNumber"
275 329 label="联系电话"
276 330 placeholder="请输入联系电话"
... ... @@ -281,23 +335,52 @@ export default ({ optType, record, onFinish }) =&gt; {
281 335 },
282 336 ]}
283 337 />
284   - <ProFormText
  338 + <ProFormSelect
285 339 name="source"
286 340 label="客户来源"
287   - placeholder="请输入客户来源"
  341 + placeholder="请选择客户来源"
  342 + request={async () => {
  343 + const res = await postServiceConstClientSource();
  344 + return enumToSelect(res.data);
  345 + }}
  346 + rules={[
  347 + {
  348 + required: true,
  349 + message: '请选择客户来源',
  350 + },
  351 + ]}
  352 + fieldProps={{
  353 + onChange: handleSourceChange, // 添加onChange事件处理函数
  354 + }}
288 355 />
289   - <ProFormText
  356 + {showReferrers && (
  357 + <ProFormText
  358 + name="referrers"
  359 + label="推荐人"
  360 + placeholder="请输入推荐人"
  361 + />
  362 + )}
  363 + <ProFormSelect
290 364 name="requirements"
291 365 label="客户需求"
292 366 placeholder="请输入客户需求"
  367 + valueEnum={requirementsEnum}
  368 + fieldProps={{
  369 + mode: 'multiple',
  370 + }}
293 371 rules={[
294 372 {
295 373 required: true,
296 374 message: '请输入客户需求',
  375 + type: 'array',
297 376 },
298 377 ]}
  378 + // request={async () => {
  379 + // const res = await postServiceConstClientRequirements();
  380 + // console.log(res.data, '5656require');
  381 + // return enumToSelect(res.data);
  382 + // }}
299 383 />
300   - <ProFormText name="referrers" label="推荐人" placeholder="请输入推荐人" />
301 384 <ProFormSelect
302 385 name="hasScheme"
303 386 label="是否已报方案"
... ... @@ -318,12 +401,17 @@ export default ({ optType, record, onFinish }) =&gt; {
318 401 message: '请选择是否已报方案',
319 402 },
320 403 ]}
  404 + fieldProps={{
  405 + onChange: handleSchemeChange, // 添加onChange事件处理函数
  406 + }}
321 407 />
322   - <ProFormDateTimePicker
323   - name="quoteDatetime"
324   - label="报价时间"
325   - placeholder="请输入报价时间"
326   - />
  408 + {showQuoteDatetime && (
  409 + <ProFormDatePicker
  410 + name="quoteDatetime"
  411 + label="报价时间"
  412 + placeholder="请输入报价时间"
  413 + />
  414 + )}
327 415 <ProFormSelect
328 416 name="level"
329 417 label="客户等级"
... ... @@ -336,7 +424,17 @@ export default ({ optType, record, onFinish }) =&gt; {
336 424 ]}
337 425 request={async () => {
338 426 const res = await postServiceConstClientLevels();
339   - return enumToSelect(res.data);
  427 + function enumToSelectLevel(data: any) {
  428 + const order = [
  429 + 'PRIMARY_CLIENT',
  430 + 'SECONDARY_CLIENT',
  431 + 'TERTIARY_CLIENT',
  432 + ];
  433 + return order.map((key) => {
  434 + return { label: data[key], value: key };
  435 + });
  436 + }
  437 + return enumToSelectLevel(res.data);
340 438 }}
341 439 />
342 440 <ProFormSelect
... ...
src/pages/Client/Client/Components/ClientImportModal.tsx 0 → 100644
  1 +import { RESPONSE_CODE } from '@/constants/enum';
  2 +import { downloadFile } from '@/services/order';
  3 +import { blobToJson } from '@/utils';
  4 +import { ModalForm, ProFormUploadDragger } from '@ant-design/pro-components';
  5 +import { Button, Form, message } from 'antd';
  6 +import { RcFile } from 'antd/es/upload';
  7 +import axios from 'axios';
  8 +
  9 +export default ({ reloadTable }) => {
  10 + const [form] = Form.useForm();
  11 + const [messageApi, contextHolder] = message.useMessage();
  12 + const downloadImportTemplate = () => {
  13 + messageApi.open({
  14 + type: 'loading',
  15 + content: '正在导入...',
  16 + duration: 0,
  17 + });
  18 + downloadFile(
  19 + '/api/admin/client/downloadImportTemplate',
  20 + '客户导入模板.xlsx',
  21 + 'post',
  22 + {},
  23 + () => {
  24 + messageApi.destroy();
  25 + },
  26 + );
  27 + };
  28 +
  29 + return (
  30 + <ModalForm
  31 + title="导入客户信息"
  32 + trigger={<Button type="primary">导入客户信息</Button>}
  33 + form={form}
  34 + autoFocusFirstInput
  35 + modalProps={{
  36 + destroyOnClose: true,
  37 + onCancel: () => console.log('run'),
  38 + }}
  39 + submitTimeout={2000}
  40 + onFinish={async (values) => {
  41 + const formData = new FormData();
  42 + values.file.forEach((file) => {
  43 + formData.append('file', file.originFileObj as RcFile);
  44 + });
  45 + axios({
  46 + url: '/api/admin/client/importClient',
  47 + method: 'post',
  48 + responseType: 'blob',
  49 + headers: {
  50 + Authorization: localStorage.getItem('token'),
  51 + 'Content-Type':
  52 + 'multipart/form-data; boundary=----WebKitFormBoundarynl6gT1BKdPWIejNq',
  53 + },
  54 + data: formData,
  55 + })
  56 + .then((response) => {
  57 + let data = response.data;
  58 + if (data.type === 'application/json') {
  59 + blobToJson(data).then((dataJson) => {
  60 + if (dataJson?.result === RESPONSE_CODE.SUCCESS) {
  61 + message.success(dataJson?.message);
  62 + reloadTable();
  63 + } else {
  64 + message.error(dataJson?.message);
  65 + }
  66 + });
  67 + } else {
  68 + message.error('上传失败,已下载错误信息表格');
  69 + // 创建一个新的 Blob 对象,它包含了服务器响应的数据(即你的 Excel 文件)
  70 + const blob = new Blob([response.data]); // Excel 的 MIME 类型
  71 + const downloadUrl = window.URL.createObjectURL(blob);
  72 + const a = document.createElement('a');
  73 + a.href = downloadUrl;
  74 + a.download = '银行流水导入模板.xlsx'; // 你可以为文件命名
  75 + document.body.appendChild(a);
  76 + a.click(); // 模拟点击操作来下载文件
  77 + URL.revokeObjectURL(downloadUrl); // 释放掉 blob 对象所占用的内存
  78 + document.body.removeChild(a);
  79 + }
  80 + })
  81 + .catch((error) => {
  82 + // 处理错误
  83 + message.error('系统出现异常了,请联系管理员', error);
  84 + })
  85 + .finally(() => {});
  86 + return true;
  87 + }}
  88 + >
  89 + <ProFormUploadDragger max={1} label="上传" name="file" />
  90 + <Button type="link" onClick={downloadImportTemplate}>
  91 + 下载导入模板
  92 + </Button>
  93 + {contextHolder}
  94 + </ModalForm>
  95 + );
  96 +};
... ...
src/pages/Client/Client/Components/ClientInformationModal.tsx 0 → 100644
  1 +import { RESPONSE_CODE } from '@/constants/enum';
  2 +import {
  3 + postAdminClientAddOrModifyClientComunicationInfo,
  4 + postAdminClientQueryClientPage,
  5 + postOrderErpOrderStagesUpload,
  6 + postServiceConstClientWay,
  7 +} from '@/services';
  8 +import { enumToSelect } from '@/utils';
  9 +import {
  10 + ModalForm,
  11 + ProFormDateTimePicker,
  12 + ProFormSelect,
  13 + ProFormText,
  14 + ProFormTextArea,
  15 + ProFormUploadDragger,
  16 +} from '@ant-design/pro-components';
  17 +import { Button, Form, message } from 'antd';
  18 +import { RcFile } from 'antd/es/upload';
  19 +export default ({ data, type, reloadTable }) => {
  20 + const [form] = Form.useForm();
  21 + const onfinish = async (values) => {
  22 + const resSearchId = await postAdminClientQueryClientPage({
  23 + data: {
  24 + groupFilter: 'all',
  25 + },
  26 + });
  27 + const matchingItem = resSearchId.data.data.find(
  28 + (item) => item.id === values.name,
  29 + );
  30 + let matchedId;
  31 + if (matchingItem) {
  32 + matchedId = matchingItem.id; // 匹配成功,取出 id
  33 + values.name = matchingItem.name;
  34 + } else {
  35 + matchedId = null; // 如果没有匹配项,可以设置为 null 或其他值
  36 + }
  37 + const res = await postAdminClientAddOrModifyClientComunicationInfo({
  38 + data: {
  39 + ...values,
  40 + clientId: matchedId,
  41 + },
  42 + });
  43 + if (res.result === RESPONSE_CODE.SUCCESS) {
  44 + message.success('新增成功');
  45 + reloadTable();
  46 + return true;
  47 + }
  48 + // 不返回不会关闭弹框
  49 + };
  50 + const editOnfinish = async (values) => {
  51 + // setEditClientId(data.clientId);
  52 + values.clientId = data.clientId;
  53 + console.log(values, '5656editClientId');
  54 +
  55 + // const resSearchId = await postAdminClientQueryClientPage({
  56 + // data: {
  57 + // groupFilter: 'all',
  58 + // },
  59 + // });
  60 + // const matchingItem = resSearchId.data.data.find(
  61 + // (item) => item.id === values.name,
  62 + // );
  63 +
  64 + const res = await postAdminClientAddOrModifyClientComunicationInfo({
  65 + data: {
  66 + ...values,
  67 + },
  68 + });
  69 + if (res.result === RESPONSE_CODE.SUCCESS) {
  70 + message.success('新增成功');
  71 + reloadTable();
  72 + return true;
  73 + }
  74 + // 不返回不会关闭弹框
  75 + };
  76 + const optType = {
  77 + add: {
  78 + readOnly: false,
  79 + title: '新增跟进记录',
  80 + button: (
  81 + <Button size={'middle'} type="primary">
  82 + 新增
  83 + </Button>
  84 + ),
  85 + onFinish: onfinish,
  86 + },
  87 + modify: {
  88 + readOnly: false,
  89 + title: '修改跟进记录',
  90 + button: (
  91 + <Button size={'middle'} type="primary">
  92 + 编辑
  93 + </Button>
  94 + ),
  95 + onFinish: editOnfinish,
  96 + },
  97 + detail: {
  98 + readOnly: true,
  99 + title: '查看跟进记录',
  100 + button: (
  101 + <Button size={'middle'} type="primary" color="red">
  102 + 查看
  103 + </Button>
  104 + ),
  105 + onFinish: () => {},
  106 + },
  107 + };
  108 + return (
  109 + <ModalForm
  110 + title={optType[type].title}
  111 + resize={{
  112 + onResize() {
  113 + console.log('resize!');
  114 + },
  115 + maxWidth: window.innerWidth * 0.8,
  116 + minWidth: 400,
  117 + }}
  118 + form={form}
  119 + trigger={optType[type].button}
  120 + autoFocusFirstInput
  121 + drawerProps={{
  122 + destroyOnClose: true,
  123 + }}
  124 + submitTimeout={2000}
  125 + onFinish={optType[type].onFinish}
  126 + >
  127 + <ProFormSelect
  128 + name="name"
  129 + readonly={optType[type].readOnly}
  130 + fieldProps={{
  131 + labelInValue: false,
  132 + disabled: type === 'modify',
  133 + }}
  134 + initialValue={data ? data?.clientName + '' : null}
  135 + label="客户"
  136 + width="sm"
  137 + request={async () => {
  138 + const res = await postAdminClientQueryClientPage({
  139 + data: {
  140 + groupFilter: 'all',
  141 + },
  142 + });
  143 + console.log(data, '5656data?.nameedit');
  144 + // const namesArray = res.data.data.map((item) => item.name);
  145 + // const formattedObject = res.data.data.reduce((acc, name) => {
  146 + // acc[name] = name; // 将名称作为键和值
  147 + // return acc;
  148 + // }, {});
  149 + // console.log(namesArray, '5656namesArray');
  150 + // const formattedObject = res.data.data.reduce((acc, item) => {
  151 + // acc[item.name] = item.name; // 使用 name 作为键,id 作为值
  152 + // return acc;
  153 + // }, {});
  154 + // return enumToSelect(formattedObject);
  155 + const options = res.data.data.reduce((acc, item) => {
  156 + acc.push({ label: item.name, value: item.id }); // 使用 name 作为 label,id 作为 value
  157 + return acc;
  158 + }, []);
  159 + return options;
  160 + }}
  161 + rules={[
  162 + {
  163 + required: true,
  164 + message: '请选择客户',
  165 + },
  166 + ]}
  167 + ></ProFormSelect>
  168 + <ProFormDateTimePicker
  169 + name="datetime"
  170 + label="日期"
  171 + initialValue={data ? data?.datetime + '' : null}
  172 + placeholder="请选择跟进时间"
  173 + width="sm"
  174 + rules={[
  175 + {
  176 + required: true,
  177 + message: '请选择日期',
  178 + },
  179 + ]}
  180 + />
  181 + <ProFormSelect
  182 + name="way"
  183 + width="sm"
  184 + readonly={optType[type].readOnly}
  185 + fieldProps={{
  186 + labelInValue: false,
  187 + }}
  188 + initialValue={data?.way ? data?.way + '' : null}
  189 + label="类型"
  190 + request={async () => {
  191 + const res = await postServiceConstClientWay();
  192 + return enumToSelect(res.data);
  193 + }}
  194 + rules={[
  195 + {
  196 + required: true,
  197 + message: '请选择跟进类型',
  198 + },
  199 + ]}
  200 + ></ProFormSelect>
  201 + <ProFormTextArea
  202 + name="content"
  203 + label="详情"
  204 + placeholder="请输入详情"
  205 + initialValue={data?.content}
  206 + readonly={optType[type].readOnly}
  207 + rules={[
  208 + {
  209 + required: true,
  210 + message: '请输入详情',
  211 + },
  212 + ]}
  213 + ></ProFormTextArea>
  214 + <ProFormUploadDragger
  215 + label="附件"
  216 + name="attachment"
  217 + action="upload.do"
  218 + hidden={optType[type].readOnly}
  219 + onChange={(info) => {
  220 + const uploadFile = async ({ fileList: newFileList }) => {
  221 + if (newFileList.length > 0) {
  222 + const formData = new FormData();
  223 + formData.append('file', newFileList[0].originFileObj as RcFile);
  224 + const res = await postOrderErpOrderStagesUpload({
  225 + data: formData,
  226 + headers: {
  227 + 'Content-Type':
  228 + 'multipart/form-data; boundary=----WebKitFormBoundarynl6gT1BKdPWIejNq',
  229 + },
  230 + });
  231 + const url = res.data;
  232 + console.log('attachments' + JSON.stringify(url));
  233 + form.setFieldValue('attachments', url);
  234 + } else {
  235 + form.setFieldValue('attachments', null);
  236 + }
  237 + };
  238 + uploadFile(info);
  239 + }}
  240 + max={1}
  241 + />
  242 + <a hidden={!optType[type].readOnly} href={data?.attachments} download>
  243 + 下载附件
  244 + </a>
  245 + <ProFormText
  246 + initialValue={data?.attachments}
  247 + name="attachments"
  248 + hidden
  249 + ></ProFormText>
  250 + <ProFormText initialValue={data?.id} name="id" hidden></ProFormText>
  251 + </ModalForm>
  252 + );
  253 +};
... ...
src/pages/Client/Client/Components/ClientModal.tsx 0 → 100644
  1 +import { RESPONSE_CODE } from '@/constants/enum';
  2 +import {
  3 + postAdminClientAddOrModifyClientComunicationInfo,
  4 + postAdminClientQueryClientPage,
  5 + postOrderErpOrderStagesUpload,
  6 + postServiceConstClientWay,
  7 +} from '@/services';
  8 +import { enumToSelect } from '@/utils';
  9 +import {
  10 + ModalForm,
  11 + ProFormDateTimePicker,
  12 + ProFormSelect,
  13 + ProFormText,
  14 + ProFormTextArea,
  15 + ProFormUploadDragger,
  16 +} from '@ant-design/pro-components';
  17 +import { Button, Form, message } from 'antd';
  18 +import { RcFile } from 'antd/es/upload';
  19 +export default ({ data, type, reloadTable }) => {
  20 + const [form] = Form.useForm();
  21 + const onfinish = async (values) => {
  22 + console.log(data, '5656datatest');
  23 + console.log(values, '5656...values');
  24 + const res = await postAdminClientAddOrModifyClientComunicationInfo({
  25 + data: {
  26 + ...values,
  27 + id: '',
  28 + clientId: data.id,
  29 + },
  30 + });
  31 + if (res.result === RESPONSE_CODE.SUCCESS) {
  32 + message.success('新增成功');
  33 + reloadTable();
  34 + return true;
  35 + }
  36 + // 不返回不会关闭弹框
  37 + };
  38 + const optType = {
  39 + add: {
  40 + readOnly: false,
  41 + title: '新增跟进记录',
  42 + button: (
  43 + <Button size={'small'} type="link">
  44 + 新增跟进
  45 + </Button>
  46 + ),
  47 + onFinish: onfinish,
  48 + },
  49 + add2: {
  50 + readOnly: false,
  51 + title: '新增跟进记录',
  52 + button: (
  53 + <Button size={'middle'} type="primary">
  54 + 新增跟进
  55 + </Button>
  56 + ),
  57 + onFinish: onfinish,
  58 + },
  59 + modify: {
  60 + readOnly: false,
  61 + title: '修改跟进记录',
  62 + button: (
  63 + <Button size={'small'} type="link">
  64 + 编辑
  65 + </Button>
  66 + ),
  67 + onFinish: onfinish,
  68 + },
  69 + detail: {
  70 + readOnly: true,
  71 + title: '查看跟进记录',
  72 + button: (
  73 + <Button size={'small'} type="link">
  74 + 查看
  75 + </Button>
  76 + ),
  77 + onFinish: () => {},
  78 + },
  79 + };
  80 + return (
  81 + <ModalForm
  82 + title={optType[type].title}
  83 + resize={{
  84 + onResize() {
  85 + console.log('resize!');
  86 + },
  87 + maxWidth: window.innerWidth * 0.8,
  88 + minWidth: 400,
  89 + }}
  90 + form={form}
  91 + trigger={optType[type].button}
  92 + autoFocusFirstInput
  93 + drawerProps={{
  94 + destroyOnClose: true,
  95 + }}
  96 + submitTimeout={2000}
  97 + onFinish={optType[type].onFinish}
  98 + >
  99 + <ProFormSelect
  100 + name="sendStoreCode"
  101 + readonly={optType[type].readOnly}
  102 + fieldProps={{
  103 + labelInValue: false,
  104 + }}
  105 + initialValue={data ? data?.name + '' : null}
  106 + label="客户"
  107 + width="sm"
  108 + request={async () => {
  109 + const res = await postAdminClientQueryClientPage({
  110 + data: {
  111 + groupFilter: 'all',
  112 + },
  113 + });
  114 + console.log(data?.datetime, '5656data?.datetime');
  115 + const namesArray = res.data.data.map((item) => item.name);
  116 + return enumToSelect(namesArray);
  117 + }}
  118 + rules={[
  119 + {
  120 + required: true,
  121 + message: '请选择客户',
  122 + },
  123 + ]}
  124 + disabled
  125 + ></ProFormSelect>
  126 + <ProFormDateTimePicker
  127 + name="datetime"
  128 + label="日期"
  129 + initialValue={data.datetime ? data?.datetime + '' : null}
  130 + placeholder="请选择跟进时间"
  131 + width="sm"
  132 + rules={[
  133 + {
  134 + required: true,
  135 + message: '请选择日期',
  136 + },
  137 + ]}
  138 + />
  139 + <ProFormSelect
  140 + name="way"
  141 + width="sm"
  142 + readonly={optType[type].readOnly}
  143 + fieldProps={{
  144 + labelInValue: false,
  145 + }}
  146 + initialValue={data?.way ? data?.way + '' : null}
  147 + label="类型"
  148 + request={async () => {
  149 + const res = await postServiceConstClientWay();
  150 + return enumToSelect(res.data);
  151 + }}
  152 + rules={[
  153 + {
  154 + required: true,
  155 + message: '请选择跟进类型',
  156 + },
  157 + ]}
  158 + ></ProFormSelect>
  159 + <ProFormTextArea
  160 + name="content"
  161 + label="详情"
  162 + placeholder="请输入详情"
  163 + initialValue={data?.content}
  164 + readonly={optType[type].readOnly}
  165 + rules={[
  166 + {
  167 + required: true,
  168 + message: '请输入详情',
  169 + },
  170 + ]}
  171 + ></ProFormTextArea>
  172 + <ProFormUploadDragger
  173 + label="附件"
  174 + name="attachment"
  175 + action="upload.do"
  176 + hidden={optType[type].readOnly}
  177 + onChange={(info) => {
  178 + const uploadFile = async ({ fileList: newFileList }) => {
  179 + if (newFileList.length > 0) {
  180 + const formData = new FormData();
  181 + formData.append('file', newFileList[0].originFileObj as RcFile);
  182 + const res = await postOrderErpOrderStagesUpload({
  183 + data: formData,
  184 + headers: {
  185 + 'Content-Type':
  186 + 'multipart/form-data; boundary=----WebKitFormBoundarynl6gT1BKdPWIejNq',
  187 + },
  188 + });
  189 + const url = res.data;
  190 + console.log('attachments' + JSON.stringify(url));
  191 + form.setFieldValue('attachments', url);
  192 + } else {
  193 + form.setFieldValue('attachments', null);
  194 + }
  195 + };
  196 + uploadFile(info);
  197 + }}
  198 + max={1}
  199 + />
  200 + <a hidden={!optType[type].readOnly} href={data?.attachments} download>
  201 + 下载附件
  202 + </a>
  203 + <ProFormText
  204 + initialValue={data?.attachments}
  205 + name="attachments"
  206 + hidden
  207 + ></ProFormText>
  208 + <ProFormText initialValue={data?.id} name="id" hidden></ProFormText>
  209 + </ModalForm>
  210 + );
  211 +};
... ...
src/pages/Client/Client/Components/CommunicationHistoryModal.tsx 0 → 100644
  1 +import { RESPONSE_CODE } from '@/constants/enum';
  2 +import {
  3 + postAdminClientAddOrModifyClientComunicationInfo,
  4 + postAdminClientQueryClientComunicationInfo,
  5 + postAdminClientRemoveClientComunicationInfo,
  6 + postServiceConstClientWay,
  7 +} from '@/services';
  8 +import { enumToSelect } from '@/utils';
  9 +import {
  10 + ActionType,
  11 + EditableProTable,
  12 + ModalForm,
  13 + ProFormInstance,
  14 +} from '@ant-design/pro-components';
  15 +import { Descriptions, Popconfirm, message } from 'antd';
  16 +import { useEffect, useRef, useState } from 'react';
  17 +import ClientModal from './ClientModal';
  18 +import InformationHistoryModal from './InformationHistoryModal';
  19 +export default ({ record }) => {
  20 + const [editableKeys, setEditableRowKeys] = useState<React.Key[]>([]);
  21 + const [dataSource, setDataSource] = useState();
  22 + const ref = useRef<ProFormInstance>();
  23 + const actionRef = useRef<ActionType>();
  24 + const [refreshKey, setRefreshKey] = useState(0); // 用于强制刷新的键
  25 +
  26 + const reloadInformationHistoryModal = () => {
  27 + actionRef.current.reload(); // 重新加载数据
  28 + console.log('5656flush');
  29 +
  30 + // 更新 refreshKey,强制刷新 CommunicationHistoryModal
  31 + setRefreshKey((prevKey) => prevKey + 1);
  32 + };
  33 + const columns = [
  34 + {
  35 + title: '跟进时间',
  36 + dataIndex: 'datetime',
  37 + width: 50,
  38 + valueType: 'dateTime',
  39 + rules: [{ required: true, message: '请选择时间' }],
  40 + },
  41 + {
  42 + title: '跟进人',
  43 + width: 50,
  44 + rules: [{ required: true, message: '请输入跟进人' }],
  45 + dataIndex: 'updateByName',
  46 + },
  47 + {
  48 + title: '跟进方式',
  49 + width: 50,
  50 + dataIndex: 'way',
  51 + rules: [{ required: true, message: '请选择方式' }],
  52 + render: (text, record) => record.wayText, // 显示 wayText
  53 + request: async () => {
  54 + const res = await postServiceConstClientWay();
  55 + return enumToSelect(res.data);
  56 + },
  57 + },
  58 + {
  59 + title: '内容',
  60 + width: 100,
  61 + valueType: 'textarea',
  62 + rules: [{ required: true, message: '请输入内容' }],
  63 + dataIndex: 'content',
  64 + },
  65 + {
  66 + title: '操作',
  67 + valueType: 'option',
  68 + width: 50,
  69 + render: (text, record, _, action) => [
  70 + // <a
  71 + // key="editable"
  72 + // onClick={() => {
  73 + // action?.startEditable?.(record.tid);
  74 + // }}
  75 + // >
  76 + // 编辑
  77 + // </a>,
  78 + <InformationHistoryModal
  79 + // key={'communicationHistory'}
  80 + key={`communicationHistory-${refreshKey}`} // 使用 refreshKey 来强制更新组件
  81 + data={record}
  82 + // reloadTable={() => {
  83 + // actionRef.current.reload();
  84 + // console.log('5656flush');
  85 + // }}
  86 + reloadTable={reloadInformationHistoryModal}
  87 + />,
  88 + <Popconfirm
  89 + key={'delete'}
  90 + title="删除记录"
  91 + description="确认删除记录?"
  92 + onConfirm={async () => {
  93 + setDataSource(dataSource.filter((item) => item.tid !== record.tid));
  94 + const res = await postAdminClientRemoveClientComunicationInfo({
  95 + query: {
  96 + id: record.id,
  97 + },
  98 + });
  99 + if (res.result === RESPONSE_CODE.SUCCESS) {
  100 + message.success(res.message);
  101 + action?.reload();
  102 + } else {
  103 + message.error('删除失败');
  104 + }
  105 + }}
  106 + okText="是"
  107 + cancelText="否"
  108 + >
  109 + <a type={'danger'}>删除</a>
  110 + </Popconfirm>,
  111 + ],
  112 + },
  113 + ];
  114 + const [name, setName] = useState(''); // 客户名称
  115 + const [contacts, setContacts] = useState(''); // 联系人
  116 + const [sourceText, setSourceText] = useState(''); // 来源文本
  117 + const [phoneNumber, setPhoneNumber] = useState(''); // 联系电话
  118 + const [hasSchemeText, setHasSchemeText] = useState(''); // 报方案状态文本
  119 + const [quoteDatetime, setQuoteDatetime] = useState(null); // 报价时间
  120 + const [referrers, setReferrers] = useState(''); // 推荐人
  121 + const [requirementsText, setRequirementsText] = useState(''); // 需求文本
  122 + const [tradeStatusText, setTradeStatusText] = useState(''); // 跟进状态文本
  123 + const [levelText, setLevelText] = useState(''); // 客户等级文本
  124 + const [createTime, setCreateTime] = useState(null); // 最新沟通时间
  125 + const [address, setAddress] = useState(''); // 客户地址
  126 + const [notes, setNotes] = useState(''); // 备注信息
  127 + const [createByName, setCreateByName] = useState(''); // 创建人
  128 + const [latestObject, setLatestObject] = useState(); // 最新跟进时间
  129 + const [recordSave, setRecordSave] = useState(); //新增跟进
  130 + useEffect(() => {
  131 + const request = async () => {
  132 + const resShow = await postAdminClientQueryClientComunicationInfo({
  133 + data: {
  134 + clientId: record.id,
  135 + },
  136 + });
  137 + if (resShow?.data?.data !== null) {
  138 + const data = resShow?.data?.data;
  139 + // const latest = data.reduce((latest: any, current: any) => {
  140 + // return new Date(current.updateTime) > new Date(latest.updateTime) ? current : latest;
  141 + // });
  142 + // const data = [];
  143 + const latestObject2 =
  144 + data?.length > 0
  145 + ? data.reduce((latest, current) =>
  146 + new Date(current.datetime) > new Date(latest.datetime)
  147 + ? current
  148 + : latest,
  149 + )
  150 + : null; // 或返回其他默认值
  151 + setLatestObject(latestObject2?.datetime);
  152 + }
  153 + setRecordSave(record);
  154 + setName(record.name);
  155 + setContacts(record.contacts);
  156 + setSourceText(record.sourceText);
  157 + setPhoneNumber(record.phoneNumber);
  158 + setHasSchemeText(record.hasSchemeText);
  159 + setQuoteDatetime(record.quoteDatetime);
  160 + setReferrers(record.referrers);
  161 + setRequirementsText(record.requirementsText);
  162 + setTradeStatusText(record.tradeStatusText);
  163 + setLevelText(record.levelText);
  164 + setCreateTime(record.createTime);
  165 + setAddress(record.address);
  166 + setNotes(record.notes);
  167 + setCreateByName(record.createByName);
  168 + };
  169 + request();
  170 + }, []);
  171 + const items = [
  172 + {
  173 + key: '1',
  174 + label: '客户名称',
  175 + children: name, // 客户名称
  176 + },
  177 + {
  178 + key: '2',
  179 + label: '联系人',
  180 + children: contacts, // 联系人
  181 + },
  182 + {
  183 + key: '3',
  184 + label: '来源',
  185 + children: sourceText, // 来源文本
  186 + },
  187 + {
  188 + key: '4',
  189 + label: '联系电话',
  190 + children: phoneNumber, // 联系电话
  191 + },
  192 + {
  193 + key: '5',
  194 + label: '是否已报方案',
  195 + children: hasSchemeText, // 报方案状态文本
  196 + },
  197 + {
  198 + key: '6',
  199 + label: '报价时间',
  200 + children: quoteDatetime, // 报价时间
  201 + },
  202 + {
  203 + key: '7',
  204 + label: '推荐人',
  205 + children: referrers, // 推荐人
  206 + },
  207 + {
  208 + key: '8',
  209 + label: '需求',
  210 + children: requirementsText, // 需求文本
  211 + },
  212 + {
  213 + key: '9',
  214 + label: '跟进状态',
  215 + children: tradeStatusText, // 跟进状态文本
  216 + },
  217 + {
  218 + key: '10',
  219 + label: '客户等级',
  220 + children: levelText, // 客户等级文本
  221 + },
  222 + {
  223 + key: '11',
  224 + label: '创建时间',
  225 + children: createTime, // 最新沟通时间
  226 + },
  227 + {
  228 + key: '12',
  229 + label: '客户地址',
  230 + children: address, // 客户地址
  231 + },
  232 + {
  233 + key: '13',
  234 + label: '备注',
  235 + children: notes, // 备注信息
  236 + },
  237 + {
  238 + key: '14',
  239 + label: '创建人',
  240 + children: createByName, // 创建人
  241 + },
  242 + {
  243 + key: '15',
  244 + label: '最新跟进时间',
  245 + children: latestObject, // 最新跟进时间
  246 + },
  247 + ];
  248 + return (
  249 + <ModalForm
  250 + title="客户详情"
  251 + trigger={<a type="primary">查看</a>}
  252 + modalProps={{
  253 + destroyOnClose: true,
  254 + }}
  255 + onFinish={async () => {
  256 + return true;
  257 + }}
  258 + >
  259 + <Descriptions items={items} column={2} />
  260 + <ClientModal
  261 + key={'add'}
  262 + data={recordSave}
  263 + reloadTable={() => {
  264 + actionRef.current?.reload();
  265 + }}
  266 + type={'add2'}
  267 + />
  268 + ,
  269 + <EditableProTable
  270 + rowKey="tid"
  271 + formRef={ref}
  272 + actionRef={actionRef}
  273 + recordCreatorProps={false}
  274 + // recordCreatorProps={{
  275 + // record: () => ({ tid: (Math.random() * 1000000).toFixed(0) }),
  276 + // }}
  277 + loading={false}
  278 + columns={columns}
  279 + request={async () => {
  280 + const res = await postAdminClientQueryClientComunicationInfo({
  281 + data: {
  282 + clientId: record.id,
  283 + },
  284 + });
  285 + if (res.result === RESPONSE_CODE.SUCCESS) {
  286 + console.log(JSON.stringify(res.data));
  287 + return {
  288 + ...res.data,
  289 + data: res.data.data.map((item) => {
  290 + return {
  291 + ...item,
  292 + tid: (Math.random() * 1000000).toFixed(0),
  293 + };
  294 + }),
  295 + };
  296 + } else {
  297 + message.error('获取失败');
  298 + }
  299 + }}
  300 + value={dataSource}
  301 + onChange={setDataSource}
  302 + editable={{
  303 + type: 'multiple',
  304 + editableKeys,
  305 + onSave: async (rowKey, data, row) => {
  306 + console.log(rowKey, data, row);
  307 + if (data?.way === '拜访') {
  308 + data.way = 'VISIT';
  309 + } else if (data?.way === '电话') {
  310 + data.way = 'PHONE';
  311 + } else if (data?.way === '微信') {
  312 + data.way = 'WECHAT';
  313 + } else if (data?.way === '邮件') {
  314 + data.way = 'EMAIL';
  315 + } else if (data?.way === '其他') {
  316 + data.way = 'OTHER';
  317 + }
  318 + const res = await postAdminClientAddOrModifyClientComunicationInfo({
  319 + data: {
  320 + ...data,
  321 + clientId: record.id,
  322 + },
  323 + });
  324 + if (res.result === RESPONSE_CODE.SUCCESS) {
  325 + message.success(res.message);
  326 + } else {
  327 + message.error('修改失败');
  328 + }
  329 + actionRef.current?.reload();
  330 + },
  331 + onChange: setEditableRowKeys,
  332 + }}
  333 + />
  334 + {/* <Descriptions title="User Info" items={items} column={2} /> */}
  335 + {/*<ProCard title="表格数据" headerBordered collapsible defaultCollapsed>
  336 + <ProFormField
  337 + ignoreFormItem
  338 + fieldProps={{
  339 + style: {
  340 + width: '100%',
  341 + },
  342 + }}
  343 + mode="read"
  344 + valueType="jsonCode"
  345 + text={JSON.stringify(dataSource)}
  346 + />
  347 + </ProCard>*/}
  348 + </ModalForm>
  349 + );
  350 +};
... ...
src/pages/Client/Client/Components/InformationHistoryModal.tsx 0 → 100644
  1 +// import ClientModal from '@/pages/Client/FollowRecord/Components/ClientModal';
  2 +import ClientInformationModal from '@/pages/Client/Client/Components/ClientInformationModal';
  3 +
  4 +import {
  5 + postAdminClientQueryClientComunicationInfo,
  6 + postAdminClientRemoveClientComunicationInfo,
  7 +} from '@/services/request';
  8 +import { ModalForm } from '@ant-design/pro-components';
  9 +import { Button, Descriptions, Space } from 'antd';
  10 +import { useEffect, useRef, useState } from 'react';
  11 +
  12 +export default ({ data, reloadTable }) => {
  13 + console.log(data, '5656datafirstshowclient');
  14 +
  15 + // const [isModalVisible, setIsModalVisible] = useState(false); // 控制 ClientModal 的显示
  16 + const actionRef = useRef(); // 引用 actionRef,方便调用 reload 方法
  17 +
  18 + const [datetime, setDatetime] = useState(); // 跟进日期
  19 + const [createByName, setCreateByName] = useState(''); // 跟进人员
  20 + const [clientName, setClientName] = useState(''); // 客户名称
  21 + // const [clientAddress, setClientAddress] = useState(''); // 客户地址
  22 + const [way, setWay] = useState(); // 类型
  23 + // const [clientNameLike, setClientNameLike] = useState(''); // 客户名称模糊查询
  24 + // const [clientAddressLike, setClientAddressLike] = useState(''); // 客户地址模糊查询
  25 + // const [tradeStatus, setTradeStatus] = useState(''); // 客户状态
  26 + // const [tradeStatusLike, setTradeStatusLike] = useState(''); // 客户状态模糊查询
  27 + const [content, setContent] = useState(''); // 跟进详情
  28 + const [createTime, setCreateTime] = useState(null); // 创建时间
  29 + const [attachments, setAttachments] = useState(); //附件
  30 + const [attachmentsName, setAttachmentsName] = useState(''); // 附件名称
  31 +
  32 + useEffect(() => {
  33 + const request = async () => {
  34 + console.log(data, '5656datasearch');
  35 + const res = await postAdminClientQueryClientComunicationInfo({
  36 + data: {
  37 + id: data.id,
  38 + },
  39 + });
  40 + console.log(res, '5656res');
  41 + const dataSearch = res.data.data[0];
  42 + if (dataSearch) {
  43 + if (dataSearch.attachments) {
  44 + const url = dataSearch.attachments;
  45 + const match = url.match(/aliyuncs\.com\/(.*?)\?/);
  46 + let decodedStr = '';
  47 +
  48 + if (match) {
  49 + // 获取匹配的字符串并进行解码
  50 + const encodedStr = match[1];
  51 + decodedStr = decodeURIComponent(encodedStr);
  52 + setAttachmentsName(decodedStr); // 设置跟进日期
  53 + }
  54 + }
  55 + setDatetime(dataSearch.datetime); // 设置跟进日期
  56 + // setDateRange(data.dateRange || []); // 设置跟进时间范围
  57 + setCreateByName(dataSearch.createByName); // 设置跟进人员
  58 + setClientName(dataSearch.clientName); // 设置客户名称
  59 + // setClientAddress(data.clientAddress || ''); // 设置客户地址
  60 + // setClientNameLike(data.clientNameLike || ''); // 设置客户名称模糊查询
  61 + // setClientAddressLike(data.clientAddressLike || ''); // 设置客户地址模糊查询
  62 + // setTradeStatus(data.tradeStatus || ''); // 设置客户状态
  63 + // setTradeStatusLike(data.tradeStatusLike || ''); // 设置客户状态模糊查询
  64 + setContent(dataSearch.content); // 设置跟进详情
  65 + setCreateTime(dataSearch.createTime); // 设置创建时间
  66 + setWay(dataSearch.wayText);
  67 + setAttachments(dataSearch.attachments);
  68 + }
  69 + console.log(attachments, '5656attachments');
  70 + };
  71 + request();
  72 + }, []);
  73 + const items = [
  74 + {
  75 + key: '1',
  76 + label: '跟进日期',
  77 + children: datetime, // 跟进日期
  78 + },
  79 + {
  80 + key: '2',
  81 + label: '跟进人员',
  82 + children: createByName, // 跟进人员
  83 + },
  84 + {
  85 + key: '3',
  86 + label: '客户名称',
  87 + children: clientName, // 客户名称
  88 + },
  89 + {
  90 + key: '4',
  91 + label: '跟进详情',
  92 + children: content, // 跟进详情
  93 + },
  94 + {
  95 + key: '5',
  96 + label: '创建时间',
  97 + children: createTime, // 创建时间
  98 + },
  99 + {
  100 + key: '6',
  101 + label: '跟进类型',
  102 + children: way, // 跟进类型
  103 + },
  104 + ];
  105 + const handleDelete = async () => {
  106 + console.log(JSON.stringify(data), '5656record');
  107 + // 调用删除接口
  108 + const success = await postAdminClientRemoveClientComunicationInfo({
  109 + query: {
  110 + id: data.id,
  111 + },
  112 + });
  113 + // setIsModalVisible(false);
  114 + if (success) {
  115 + actionRef?.current?.reload(); // 重新加载表格数据
  116 + }
  117 + };
  118 + return (
  119 + <Space>
  120 + <ModalForm
  121 + title="跟进记录"
  122 + trigger={<Button type="link">查看</Button>}
  123 + submitter={{
  124 + resetButtonProps: {
  125 + style: {
  126 + display: 'none',
  127 + },
  128 + },
  129 + submitButtonProps: {
  130 + style: {
  131 + display: 'none',
  132 + },
  133 + },
  134 + render: (props, defaultDoms) => {
  135 + return [
  136 + ...defaultDoms,
  137 + <>
  138 + <ClientInformationModal
  139 + key={'modify'}
  140 + data={data} // 将表单数据传递给 ClientModal
  141 + reloadTable={() => {
  142 + actionRef?.current?.reload(); // 重新加载表格数据
  143 + props.submit();
  144 + reloadTable();
  145 + console.log('5656close');
  146 + }}
  147 + type={'modify'}
  148 + onFinish={() => {
  149 + // setIsModalVisible(false);
  150 + }} // 关闭 Modal
  151 + style={{ marginRight: '10px' }}
  152 + />
  153 + <Button
  154 + key={'delete'}
  155 + onClick={() => {
  156 + handleDelete();
  157 + props.submit();
  158 + reloadTable();
  159 + }}
  160 + type="primary"
  161 + size="middle"
  162 + danger // 使用 danger 属性来将按钮颜色设置为红色
  163 + style={{ marginLeft: '10px' }}
  164 + onFinish={() => {
  165 + actionRef.current.reload();
  166 + }}
  167 + >
  168 + 删除
  169 + </Button>
  170 + </>,
  171 + ];
  172 + },
  173 + }}
  174 + onFinish={async () => {
  175 + // 提交成功后,显示 ClientDrawer
  176 + // setIsModalVisible(true);
  177 + return true;
  178 + }}
  179 + >
  180 + <Descriptions items={items} column={1} />
  181 + {attachmentsName && (
  182 + <a href={attachments} download>
  183 + 附件:{attachmentsName}
  184 + </a>
  185 + )}
  186 + </ModalForm>
  187 + </Space>
  188 + );
  189 +};
... ...
src/pages/Client/index.tsx renamed to src/pages/Client/Client/index.tsx
1   -import ClientDrawer from '@/pages/Client/Components/ClientDrawer';
2   -import ClientImportModal from '@/pages/Client/Components/ClientImportModal';
3   -import ClientStatistic from '@/pages/Client/Components/ClientStatistic';
4   -import CommunicationHistoryModal from '@/pages/Client/Components/CommunicationHistoryModal';
  1 +import ButtonConfirm from '@/components/ButtomConfirm';
  2 +import ClientDrawer from '@/pages/Client/Client/Components/ClientDrawer';
  3 +import ClientImportModal from '@/pages/Client/Client/Components/ClientImportModal';
  4 +import ClientModal from '@/pages/Client/Client/Components/ClientModal';
  5 +import CommunicationHistoryModal from '@/pages/Client/Client/Components/CommunicationHistoryModal';
5 6 import {
  7 + postAdminClientDeleteAdminClient,
  8 + postAdminClientGetStatisticalData,
6 9 postAdminClientQueryClientPage,
7   - postServiceConstClientGroupFilters,
8 10 postServiceConstClientLevels,
  11 + postServiceConstClientRequirements,
  12 + postServiceConstClientSource,
9 13 postServiceConstTradeStatus,
10 14 } from '@/services';
11 15 import { downloadFile } from '@/services/order';
12 16 import { enumToSelect } from '@/utils';
13 17 import type { ActionType } from '@ant-design/pro-components';
14 18 import { ProTable } from '@ant-design/pro-components';
15   -import { Button, Radio, Space, message } from 'antd';
  19 +import { Badge, Button, Radio, Space, message } from 'antd';
16 20 import { useEffect, useRef, useState } from 'react';
17 21  
18 22 const columns = [
... ... @@ -25,23 +29,30 @@ const columns = [
25 29 {
26 30 title: '客户名称',
27 31 dataIndex: 'name',
28   - width: 100,
  32 + width: 150,
29 33 ellipsis: true,
30 34 hideInSearch: true,
31 35 },
  36 + // {
  37 + // title: '单位名称',
  38 + // width: 150,
  39 + // ellipsis: true,
  40 + // dataIndex: 'companyName',
  41 + // hideInSearch: true,
  42 + // },
32 43 {
33   - title: '单位名称',
34   - width: 150,
  44 + title: '客户地址',
  45 + width: 250,
35 46 ellipsis: true,
36   - dataIndex: 'companyName',
37   - hideInSearch: true,
  47 + dataIndex: 'address',
  48 + hideInSearch: false,
38 49 },
39 50 {
40   - title: '单位地址',
41   - width: 250,
  51 + title: '联系人',
  52 + width: 150,
42 53 ellipsis: true,
43   - dataIndex: 'companyAddressText',
44   - hideInSearch: true,
  54 + dataIndex: 'contacts',
  55 + hideInSearch: false,
45 56 },
46 57 {
47 58 title: '联系电话',
... ... @@ -54,10 +65,20 @@ const columns = [
54 65 title: '客户来源',
55 66 width: 150,
56 67 ellipsis: true,
57   - dataIndex: 'source',
  68 + dataIndex: 'sourceText',
58 69 hideInSearch: true,
59 70 },
60 71 {
  72 + title: '客户来源',
  73 + valueType: 'select',
  74 + hideInTable: true,
  75 + dataIndex: 'source',
  76 + request: async () => {
  77 + const res = await postServiceConstClientSource();
  78 + return enumToSelect(res.data);
  79 + },
  80 + },
  81 + {
61 82 title: '推荐人',
62 83 dataIndex: 'referrers',
63 84 width: 150,
... ... @@ -66,12 +87,28 @@ const columns = [
66 87 },
67 88 {
68 89 title: '客户需求',
69   - dataIndex: 'requirements',
70   - width: 150,
  90 + width: 240,
71 91 ellipsis: true,
  92 + dataIndex: 'requirementsText',
72 93 hideInSearch: true,
73 94 },
74 95 {
  96 + title: '客户需求',
  97 + dataIndex: 'requirements',
  98 + valueType: 'select',
  99 + hideInTable: true,
  100 + request: async () => {
  101 + const res = await postServiceConstClientRequirements();
  102 + // function enumToSelect(data: any) {
  103 + // const keys = Object.keys(data);
  104 + // return keys.map((value) => {
  105 + // return { label: data[value], value: value };
  106 + // });
  107 + // }
  108 + return enumToSelect(res.data);
  109 + },
  110 + },
  111 + {
75 112 title: '是否已报方案',
76 113 width: 150,
77 114 ellipsis: true,
... ... @@ -84,7 +121,7 @@ const columns = [
84 121 width: 150,
85 122 ellipsis: true,
86 123 dataIndex: 'quoteDatetime',
87   - valueType: 'dateTime',
  124 + valueType: 'date',
88 125 hideInSearch: true,
89 126 },
90 127 {
... ... @@ -111,26 +148,35 @@ const columns = [
111 148 hideInSearch: true,
112 149 },
113 150 {
114   - title: '最新进时间',
  151 + title: '最新进时间',
115 152 key: 'since',
116 153 width: 150,
117 154 ellipsis: true,
118   - dataIndex: 'latestCommunicationTime',
  155 + dataIndex: 'updateTime',
119 156 valueType: 'dateTime',
120 157 hideInSearch: true,
121 158 },
  159 + // {
  160 + // title: '最新跟进时间',
  161 + // key: 'since',
  162 + // width: 150,
  163 + // ellipsis: true,
  164 + // dataIndex: 'latestCommunicationTime',
  165 + // valueType: 'dateTime',
  166 + // hideInSearch: true,
  167 + // },
122 168 {
123 169 title: '客户名称',
124 170 dataIndex: 'nameLike',
125 171 valueType: 'Text',
126 172 hideInTable: true,
127 173 },
128   - {
129   - title: '单位名称',
130   - dataIndex: 'companyNameLike',
131   - valueType: 'Text',
132   - hideInTable: true,
133   - },
  174 + // {
  175 + // title: '单位名称',
  176 + // dataIndex: 'companyNameLike',
  177 + // valueType: 'Text',
  178 + // hideInTable: true,
  179 + // },
134 180 {
135 181 title: '联系电话',
136 182 dataIndex: 'phoneNumberLike',
... ... @@ -141,6 +187,7 @@ const columns = [
141 187 title: '是否已报方案',
142 188 dataIndex: 'hasScheme',
143 189 valueType: 'select',
  190 + width: 1550,
144 191 valueEnum: {
145 192 true: {
146 193 text: '是',
... ... @@ -160,7 +207,14 @@ const columns = [
160 207 hideInTable: true,
161 208 request: async () => {
162 209 const res = await postServiceConstClientLevels();
163   - return enumToSelect(res.data);
  210 + // 明确指定所需的顺序(后端返回顺序正确,直接修改enumToSelect没作用)
  211 + function enumToSelectLevel(data: any) {
  212 + const order = ['PRIMARY_CLIENT', 'SECONDARY_CLIENT', 'TERTIARY_CLIENT'];
  213 + return order.map((key) => {
  214 + return { label: data[key], value: key };
  215 + });
  216 + }
  217 + return enumToSelectLevel(res.data);
164 218 },
165 219 },
166 220 {
... ... @@ -192,13 +246,25 @@ const columns = [
192 246 title: '操作',
193 247 valueType: 'option',
194 248 key: 'option',
195   - width: 150,
  249 + width: 200,
196 250 render: (text, record, index, action) => {
197   - console.log(JSON.stringify(record));
  251 + const handleDelete = async () => {
  252 + console.log(JSON.stringify(record), '5656record1');
  253 + // 调用删除接口
  254 + const success = await postAdminClientDeleteAdminClient({
  255 + query: {
  256 + id: record.id,
  257 + },
  258 + });
  259 + if (success) {
  260 + action.reload(); // 刷新表格
  261 + }
  262 + };
  263 + console.log(JSON.stringify(record), '5656record2');
198 264 return [
199 265 <CommunicationHistoryModal
200 266 key={'communicationHistory'}
201   - clientId={record.id}
  267 + record={record}
202 268 />,
203 269 <ClientDrawer
204 270 key={'detail'}
... ... @@ -208,6 +274,14 @@ const columns = [
208 274 action.reload();
209 275 }}
210 276 ></ClientDrawer>,
  277 + <ClientModal
  278 + key={'add'}
  279 + data={record}
  280 + reloadTable={() => {
  281 + action?.reload();
  282 + }}
  283 + type={'add'}
  284 + />,
211 285 <ClientDrawer
212 286 key={'edit'}
213 287 record={record}
... ... @@ -216,6 +290,18 @@ const columns = [
216 290 action.reload();
217 291 }}
218 292 ></ClientDrawer>,
  293 + // <a key={'delete'} onClick={handleDelete}>
  294 + // 删除
  295 + // </a>,
  296 + <ButtonConfirm
  297 + key="delete"
  298 + className="p-0"
  299 + title={'删除该客户,客户下的跟进记录会一并删除'}
  300 + text="删除"
  301 + onConfirm={async () => {
  302 + handleDelete();
  303 + }}
  304 + />,
219 305 ];
220 306 },
221 307 },
... ... @@ -224,23 +310,74 @@ const columns = [
224 310 export default () => {
225 311 const [messageApi, contextHolder] = message.useMessage();
226 312 const [groupFilter, setGroupFilter] = useState('All');
227   - const [groupFilterOptions, setGroupFilterDataOptions] = useState([]);
  313 + // const [groupFilterOptions, setGroupFilterDataOptions] = useState([]);
228 314 const actionRef = useRef<ActionType>();
  315 + //获得预警/全部数量
  316 + const [clientStatistic, setClientStatistic] = useState([]);
  317 + // const [allClientStatistic, setAllClientStatistic] = useState([]);
  318 + const [warningClientStatistic, setWarningClientStatistic] = useState([]);
  319 + // const reloadTable = () => {
  320 + // actionRef.current?.reload();
  321 + // };
229 322 useEffect(() => {
230   - const pullGroupFilterDataOptions = async () => {
231   - const res = await postServiceConstClientGroupFilters();
232   - console.log('setGroupFilterDataOptions' + JSON.stringify(res.data));
233   - setGroupFilterDataOptions(enumToSelect(res.data));
  323 + const pullStatistic = async () => {
  324 + let statisticalData = await postAdminClientGetStatisticalData();
  325 + console.log('stati' + JSON.stringify(statisticalData.data));
  326 + setClientStatistic(statisticalData.data);
  327 + setWarningClientStatistic(statisticalData.data[1].value);
  328 + // setAllClientStatistic(statisticalData.data[0].value);
  329 + setTimeout(() => {
  330 + console.log(clientStatistic, '5656groupFilterOptions1');
  331 + // groupFilterOptions[0].label = groupFilterOptions[0].label + '(' + clientStatistic + ')';
  332 + }, 100);
  333 + actionRef.current?.reload(); // 可能需要在这里刷新
234 334 };
235   - pullGroupFilterDataOptions();
  335 + pullStatistic();
236 336 }, []);
  337 + const groupFilterOptions = [
  338 + {
  339 + value: 'All',
  340 + label: <span>全部</span>,
  341 + },
  342 + {
  343 + value: 'WARNING_CLIENT',
  344 + label: (
  345 + <span>
  346 + 预警客户
  347 + <Badge count={warningClientStatistic} style={{ marginLeft: 8 }} />
  348 + </span>
  349 + ),
  350 + },
  351 + ];
  352 + // useEffect(() => {
  353 + // const pullGroupFilterDataOptions = async () => {
  354 + // const res = await postServiceConstClientGroupFilters();
  355 + // // console.log('setGroupFilterDataOptions' + JSON.stringify(res.data));
  356 + // const select = enumToSelect(res.data);
  357 + // console.log(select, '5656selet');
  358 + // setGroupFilterDataOptions(select);
  359 + // };
  360 + // pullGroupFilterDataOptions();
  361 + // }, []);
237 362 useEffect(() => {
  363 + // console.log(groupFilterOptions, '5656groupFilterOptions2');
  364 + console.log(clientStatistic, '5656clientStatistic');
  365 + console.log(warningClientStatistic, '5656warningClientStatistic');
238 366 actionRef.current?.reload();
239 367 }, [groupFilter]);
240 368 return (
241 369 <>
242 370 <Space direction="vertical" size="middle" style={{ display: 'flex' }}>
243   - <ClientStatistic></ClientStatistic>
  371 + <div key={'groupFilter'}>
  372 + <Radio.Group
  373 + options={groupFilterOptions}
  374 + onChange={(e) => {
  375 + setGroupFilter(e.target.value);
  376 + }}
  377 + value={groupFilter}
  378 + optionType="button"
  379 + />
  380 + </div>
244 381 <ProTable
245 382 columns={columns}
246 383 actionRef={actionRef}
... ... @@ -256,6 +393,7 @@ export default () =&gt; {
256 393 return data;
257 394 }}
258 395 search={{
  396 + labelWidth: 'auto',
259 397 optionRender: (searchConfig, formProps, dom) => [
260 398 ...dom.reverse(),
261 399 <Button
... ... @@ -273,6 +411,7 @@ export default () =&gt; {
273 411 'POST',
274 412 values,
275 413 () => {
  414 + console.log(searchConfig, '5656searchConfig');
276 415 messageApi.destroy();
277 416 },
278 417 );
... ... @@ -323,16 +462,6 @@ export default () =&gt; {
323 462 dateFormatter="string"
324 463 headerTitle="高级表格"
325 464 toolBarRender={() => [
326   - <div key={'groupFilter'}>
327   - <Radio.Group
328   - options={groupFilterOptions}
329   - onChange={(e) => {
330   - setGroupFilter(e.target.value);
331   - }}
332   - value={groupFilter}
333   - optionType="button"
334   - />
335   - </div>,
336 465 <ClientDrawer
337 466 optType={'add'}
338 467 key="button"
... ... @@ -340,7 +469,12 @@ export default () =&gt; {
340 469 actionRef.current.reload();
341 470 }}
342 471 ></ClientDrawer>,
343   - <ClientImportModal key="import" />,
  472 + <ClientImportModal
  473 + key="import"
  474 + reloadTable={() => {
  475 + actionRef.current.reload();
  476 + }}
  477 + />,
344 478 ]}
345 479 />
346 480 </Space>
... ...
src/pages/Client/Components/ClientStatistic.tsx deleted 100644 → 0
1   -import { postAdminClientGetStatisticalData } from '@/services';
2   -import { StatisticCard } from '@ant-design/pro-components';
3   -import { useEffect, useState } from 'react';
4   -
5   -export default () => {
6   - const [clientStatistic, setClientStatistic] = useState([]);
7   - useEffect(() => {
8   - const pullStatistic = async () => {
9   - let statisticalData = await postAdminClientGetStatisticalData();
10   - console.log('stati' + JSON.stringify(statisticalData.data));
11   - setClientStatistic(statisticalData.data);
12   - };
13   - pullStatistic();
14   - }, []);
15   - return (
16   - <StatisticCard.Group>
17   - {clientStatistic.map((stat, index) => (
18   - <StatisticCard
19   - key={index}
20   - statistic={{
21   - title: stat.title,
22   - tip: stat.tip || '', // 如果tip不存在,则使用空字符串
23   - value: stat.value,
24   - status: stat.status || 'default', // 如果status不存在,则使用'default'
25   - }}
26   - />
27   - ))}
28   - </StatisticCard.Group>
29   - );
30   -};
src/pages/Client/Components/CommunicationHistoryModal.tsx deleted 100644 → 0
1   -import { RESPONSE_CODE } from '@/constants/enum';
2   -import {
3   - postAdminClientAddOrModifyClientComunicationInfo,
4   - postAdminClientQueryClientComunicationInfo,
5   - postAdminClientRemoveClientComunicationInfo,
6   -} from '@/services';
7   -import {
8   - ActionType,
9   - EditableProTable,
10   - ModalForm,
11   - ProFormInstance,
12   -} from '@ant-design/pro-components';
13   -import { Popconfirm, message } from 'antd';
14   -import { useEffect, useRef, useState } from 'react';
15   -export default ({ clientId }) => {
16   - const [editableKeys, setEditableRowKeys] = useState<React.Key[]>([]);
17   - const [dataSource, setDataSource] = useState();
18   - const ref = useRef<ProFormInstance>();
19   - const actionRef = useRef<ActionType>();
20   - const columns = [
21   - {
22   - title: '跟进时间',
23   - dataIndex: 'datetime',
24   - width: 50,
25   - valueType: 'dateTime',
26   - rules: [{ required: true, message: '请选择时间' }],
27   - },
28   - {
29   - title: '方式',
30   - width: 50,
31   - dataIndex: 'way',
32   - rules: [{ required: true, message: '请选择方式' }],
33   - },
34   - {
35   - title: '内容',
36   - width: 100,
37   - valueType: 'textarea',
38   - rules: [{ required: true, message: '请输入内容' }],
39   - dataIndex: 'content',
40   - },
41   - {
42   - title: '操作',
43   - valueType: 'option',
44   - width: 50,
45   - render: (text, record, _, action) => [
46   - <a
47   - key="editable"
48   - onClick={() => {
49   - action?.startEditable?.(record.tid);
50   - }}
51   - >
52   - 编辑
53   - </a>,
54   - <Popconfirm
55   - key={'delete'}
56   - title="删除记录"
57   - description="确认删除记录?"
58   - onConfirm={async () => {
59   - setDataSource(dataSource.filter((item) => item.tid !== record.tid));
60   - const res = await postAdminClientRemoveClientComunicationInfo({
61   - query: {
62   - id: record.id,
63   - },
64   - });
65   - if (res.result === RESPONSE_CODE.SUCCESS) {
66   - message.success(res.message);
67   - action?.reload();
68   - } else {
69   - message.error('删除失败');
70   - }
71   - }}
72   - okText="是"
73   - cancelText="否"
74   - >
75   - <a type={'danger'}>删除</a>
76   - </Popconfirm>,
77   - ],
78   - },
79   - ];
80   -
81   - useEffect(() => {
82   - console.log('clientId', clientId);
83   - }, []);
84   - return (
85   - <ModalForm
86   - title="跟进记录"
87   - trigger={<a type="primary">跟进记录</a>}
88   - modalProps={{
89   - destroyOnClose: true,
90   - }}
91   - >
92   - <EditableProTable
93   - rowKey="tid"
94   - formRef={ref}
95   - actionRef={actionRef}
96   - recordCreatorProps={{
97   - record: () => ({ tid: (Math.random() * 1000000).toFixed(0) }),
98   - }}
99   - loading={false}
100   - columns={columns}
101   - request={async () => {
102   - const res = await postAdminClientQueryClientComunicationInfo({
103   - data: {
104   - clientId: clientId,
105   - },
106   - });
107   - if (res.result === RESPONSE_CODE.SUCCESS) {
108   - console.log(JSON.stringify(res.data));
109   - return {
110   - ...res.data,
111   - data: res.data.data.map((item) => {
112   - return {
113   - ...item,
114   - tid: (Math.random() * 1000000).toFixed(0),
115   - };
116   - }),
117   - };
118   - } else {
119   - message.error('获取失败');
120   - }
121   - }}
122   - value={dataSource}
123   - onChange={setDataSource}
124   - editable={{
125   - type: 'multiple',
126   - editableKeys,
127   - onSave: async (rowKey, data, row) => {
128   - console.log(rowKey, data, row);
129   - const res = await postAdminClientAddOrModifyClientComunicationInfo({
130   - data: {
131   - ...data,
132   - clientId: clientId,
133   - },
134   - });
135   - if (res.result === RESPONSE_CODE.SUCCESS) {
136   - message.success(res.message);
137   - } else {
138   - message.error('修改失败');
139   - }
140   - actionRef.current?.reload();
141   - },
142   - onChange: setEditableRowKeys,
143   - }}
144   - />
145   - {/*<ProCard title="表格数据" headerBordered collapsible defaultCollapsed>
146   - <ProFormField
147   - ignoreFormItem
148   - fieldProps={{
149   - style: {
150   - width: '100%',
151   - },
152   - }}
153   - mode="read"
154   - valueType="jsonCode"
155   - text={JSON.stringify(dataSource)}
156   - />
157   - </ProCard>*/}
158   - </ModalForm>
159   - );
160   -};
src/pages/Client/Components/ClientImportModal.tsx renamed to src/pages/Client/FollowRecord/Components/ClientImportModal.tsx
src/pages/Client/FollowRecord/Components/ClientModal.tsx 0 → 100644
  1 +import { RESPONSE_CODE } from '@/constants/enum';
  2 +import {
  3 + postAdminClientAddOrModifyClientComunicationInfo,
  4 + postAdminClientQueryClientPage,
  5 + postOrderErpOrderStagesUpload,
  6 + postServiceConstClientWay,
  7 +} from '@/services';
  8 +import { enumToSelect } from '@/utils';
  9 +import {
  10 + ModalForm,
  11 + ProFormDateTimePicker,
  12 + ProFormSelect,
  13 + ProFormText,
  14 + ProFormTextArea,
  15 + ProFormUploadDragger,
  16 +} from '@ant-design/pro-components';
  17 +import { Button, Form, message } from 'antd';
  18 +import { RcFile } from 'antd/es/upload';
  19 +export default ({ data, type, reloadTable }) => {
  20 + const [form] = Form.useForm();
  21 + const onfinish = async (values) => {
  22 + const resSearchId = await postAdminClientQueryClientPage({
  23 + data: {
  24 + groupFilter: 'all',
  25 + },
  26 + });
  27 + const matchingItem = resSearchId.data.data.find(
  28 + (item) => item.id === values.name,
  29 + );
  30 + let matchedId;
  31 + if (matchingItem) {
  32 + matchedId = matchingItem.id; // 匹配成功,取出 id
  33 + values.name = matchingItem.name;
  34 + } else {
  35 + matchedId = null; // 如果没有匹配项,可以设置为 null 或其他值
  36 + }
  37 + const res = await postAdminClientAddOrModifyClientComunicationInfo({
  38 + data: {
  39 + ...values,
  40 + clientId: matchedId,
  41 + },
  42 + });
  43 + if (res.result === RESPONSE_CODE.SUCCESS) {
  44 + message.success('新增成功');
  45 + reloadTable();
  46 + return true;
  47 + }
  48 + // 不返回不会关闭弹框
  49 + };
  50 + const editOnfinish = async (values) => {
  51 + // setEditClientId(data.clientId);
  52 + values.clientId = data.clientId;
  53 + console.log(values, '5656editClientId');
  54 +
  55 + // const resSearchId = await postAdminClientQueryClientPage({
  56 + // data: {
  57 + // groupFilter: 'all',
  58 + // },
  59 + // });
  60 + // const matchingItem = resSearchId.data.data.find(
  61 + // (item) => item.id === values.name,
  62 + // );
  63 +
  64 + const res = await postAdminClientAddOrModifyClientComunicationInfo({
  65 + data: {
  66 + ...values,
  67 + },
  68 + });
  69 + if (res.result === RESPONSE_CODE.SUCCESS) {
  70 + message.success('新增成功');
  71 + reloadTable();
  72 + return true;
  73 + }
  74 + // 不返回不会关闭弹框
  75 + };
  76 + const optType = {
  77 + add: {
  78 + readOnly: false,
  79 + title: '新增跟进记录',
  80 + button: (
  81 + <Button size={'middle'} type="primary">
  82 + 新增
  83 + </Button>
  84 + ),
  85 + onFinish: onfinish,
  86 + },
  87 + modify: {
  88 + readOnly: false,
  89 + title: '修改跟进记录',
  90 + button: (
  91 + <Button size={'middle'} type="primary">
  92 + 编辑
  93 + </Button>
  94 + ),
  95 + onFinish: editOnfinish,
  96 + },
  97 + detail: {
  98 + readOnly: true,
  99 + title: '查看跟进记录',
  100 + button: (
  101 + <Button size={'middle'} type="primary" color="red">
  102 + 查看
  103 + </Button>
  104 + ),
  105 + onFinish: () => {},
  106 + },
  107 + };
  108 + return (
  109 + <ModalForm
  110 + title={optType[type].title}
  111 + resize={{
  112 + onResize() {
  113 + console.log('resize!');
  114 + },
  115 + maxWidth: window.innerWidth * 0.8,
  116 + minWidth: 400,
  117 + }}
  118 + form={form}
  119 + trigger={optType[type].button}
  120 + autoFocusFirstInput
  121 + drawerProps={{
  122 + destroyOnClose: true,
  123 + }}
  124 + submitTimeout={2000}
  125 + onFinish={optType[type].onFinish}
  126 + >
  127 + <ProFormSelect
  128 + name="name"
  129 + readonly={optType[type].readOnly}
  130 + fieldProps={{
  131 + labelInValue: false,
  132 + disabled: type === 'modify',
  133 + }}
  134 + initialValue={data ? data?.clientName + '' : null}
  135 + label="客户"
  136 + width="sm"
  137 + request={async () => {
  138 + const res = await postAdminClientQueryClientPage({
  139 + data: {
  140 + groupFilter: 'all',
  141 + },
  142 + });
  143 + console.log(data, '5656data?.nameedit');
  144 + // const namesArray = res.data.data.map((item) => item.name);
  145 + // const formattedObject = res.data.data.reduce((acc, name) => {
  146 + // acc[name] = name; // 将名称作为键和值
  147 + // return acc;
  148 + // }, {});
  149 + // console.log(namesArray, '5656namesArray');
  150 + // const formattedObject = res.data.data.reduce((acc, item) => {
  151 + // acc[item.name] = item.name; // 使用 name 作为键,id 作为值
  152 + // return acc;
  153 + // }, {});
  154 + // return enumToSelect(formattedObject);
  155 + const options = res.data.data.reduce((acc, item) => {
  156 + acc.push({ label: item.name, value: item.id }); // 使用 name 作为 label,id 作为 value
  157 + return acc;
  158 + }, []);
  159 + return options;
  160 + }}
  161 + rules={[
  162 + {
  163 + required: true,
  164 + message: '请选择客户',
  165 + },
  166 + ]}
  167 + ></ProFormSelect>
  168 + <ProFormDateTimePicker
  169 + name="datetime"
  170 + label="日期"
  171 + initialValue={data ? data?.datetime + '' : null}
  172 + placeholder="请选择跟进时间"
  173 + width="sm"
  174 + rules={[
  175 + {
  176 + required: true,
  177 + message: '请选择日期',
  178 + },
  179 + ]}
  180 + />
  181 + <ProFormSelect
  182 + name="way"
  183 + width="sm"
  184 + readonly={optType[type].readOnly}
  185 + fieldProps={{
  186 + labelInValue: false,
  187 + }}
  188 + initialValue={data?.way ? data?.way + '' : null}
  189 + label="类型"
  190 + request={async () => {
  191 + const res = await postServiceConstClientWay();
  192 + return enumToSelect(res.data);
  193 + }}
  194 + rules={[
  195 + {
  196 + required: true,
  197 + message: '请选择跟进类型',
  198 + },
  199 + ]}
  200 + ></ProFormSelect>
  201 + <ProFormTextArea
  202 + name="content"
  203 + label="详情"
  204 + placeholder="请输入详情"
  205 + initialValue={data?.content}
  206 + readonly={optType[type].readOnly}
  207 + rules={[
  208 + {
  209 + required: true,
  210 + message: '请输入详情',
  211 + },
  212 + ]}
  213 + ></ProFormTextArea>
  214 + <ProFormUploadDragger
  215 + label="附件"
  216 + name="attachment"
  217 + action="upload.do"
  218 + hidden={optType[type].readOnly}
  219 + onChange={(info) => {
  220 + const uploadFile = async ({ fileList: newFileList }) => {
  221 + if (newFileList.length > 0) {
  222 + const formData = new FormData();
  223 + formData.append('file', newFileList[0].originFileObj as RcFile);
  224 + const res = await postOrderErpOrderStagesUpload({
  225 + data: formData,
  226 + headers: {
  227 + 'Content-Type':
  228 + 'multipart/form-data; boundary=----WebKitFormBoundarynl6gT1BKdPWIejNq',
  229 + },
  230 + });
  231 + const url = res.data;
  232 + console.log('attachments' + JSON.stringify(url));
  233 + form.setFieldValue('attachments', url);
  234 + } else {
  235 + form.setFieldValue('attachments', null);
  236 + }
  237 + };
  238 + uploadFile(info);
  239 + }}
  240 + max={1}
  241 + />
  242 + <a hidden={!optType[type].readOnly} href={data?.attachments} download>
  243 + 下载附件
  244 + </a>
  245 + <ProFormText
  246 + initialValue={data?.attachments}
  247 + name="attachments"
  248 + hidden
  249 + ></ProFormText>
  250 + <ProFormText initialValue={data?.id} name="id" hidden></ProFormText>
  251 + </ModalForm>
  252 + );
  253 +};
... ...
src/pages/Client/FollowRecord/Components/CommunicationHistoryModal.tsx 0 → 100644
  1 +import ClientModal from '@/pages/Client/FollowRecord/Components/ClientModal';
  2 +import {
  3 + postAdminClientQueryClientComunicationInfo,
  4 + postAdminClientRemoveClientComunicationInfo,
  5 +} from '@/services/request';
  6 +import { ModalForm } from '@ant-design/pro-components';
  7 +import { Button, Descriptions, Space } from 'antd';
  8 +import { useEffect, useRef, useState } from 'react';
  9 +
  10 +export default ({ data, reloadTable }) => {
  11 + console.log(data, '5656datafirstshowgenjin');
  12 +
  13 + // const [isModalVisible, setIsModalVisible] = useState(false); // 控制 ClientModal 的显示
  14 + const actionRef = useRef(); // 引用 actionRef,方便调用 reload 方法
  15 +
  16 + const [datetime, setDatetime] = useState(); // 跟进日期
  17 + const [createByName, setCreateByName] = useState(''); // 跟进人员
  18 + const [clientName, setClientName] = useState(''); // 客户名称
  19 + // const [clientAddress, setClientAddress] = useState(''); // 客户地址
  20 + const [way, setWay] = useState(); // 类型
  21 + // const [clientNameLike, setClientNameLike] = useState(''); // 客户名称模糊查询
  22 + // const [clientAddressLike, setClientAddressLike] = useState(''); // 客户地址模糊查询
  23 + // const [tradeStatus, setTradeStatus] = useState(''); // 客户状态
  24 + // const [tradeStatusLike, setTradeStatusLike] = useState(''); // 客户状态模糊查询
  25 + const [content, setContent] = useState(''); // 跟进详情
  26 + const [createTime, setCreateTime] = useState(null); // 创建时间
  27 + const [attachments, setAttachments] = useState(); //附件
  28 + const [attachmentsName, setAttachmentsName] = useState(''); // 附件名称
  29 +
  30 + useEffect(() => {
  31 + const request = async () => {
  32 + console.log(data, '5656datasearch');
  33 + const res = await postAdminClientQueryClientComunicationInfo({
  34 + data: {
  35 + id: data.id,
  36 + },
  37 + });
  38 + console.log(res, '5656res');
  39 + const dataSearch = res.data.data[0];
  40 + if (dataSearch) {
  41 + if (dataSearch.attachments) {
  42 + const url = dataSearch.attachments;
  43 + const match = url.match(/aliyuncs\.com\/(.*?)\?/);
  44 + let decodedStr = '';
  45 +
  46 + if (match) {
  47 + // 获取匹配的字符串并进行解码
  48 + const encodedStr = match[1];
  49 + decodedStr = decodeURIComponent(encodedStr);
  50 + setAttachmentsName(decodedStr); // 设置跟进日期
  51 + }
  52 + }
  53 + setDatetime(dataSearch.datetime); // 设置跟进日期
  54 + // setDateRange(data.dateRange || []); // 设置跟进时间范围
  55 + setCreateByName(dataSearch.createByName); // 设置跟进人员
  56 + setClientName(dataSearch.clientName); // 设置客户名称
  57 + // setClientAddress(data.clientAddress || ''); // 设置客户地址
  58 + // setClientNameLike(data.clientNameLike || ''); // 设置客户名称模糊查询
  59 + // setClientAddressLike(data.clientAddressLike || ''); // 设置客户地址模糊查询
  60 + // setTradeStatus(data.tradeStatus || ''); // 设置客户状态
  61 + // setTradeStatusLike(data.tradeStatusLike || ''); // 设置客户状态模糊查询
  62 + setContent(dataSearch.content); // 设置跟进详情
  63 + setCreateTime(dataSearch.createTime); // 设置创建时间
  64 + setWay(dataSearch.wayText);
  65 + setAttachments(dataSearch.attachments);
  66 + }
  67 + console.log(attachments, '5656attachments');
  68 + };
  69 + request();
  70 + }, []);
  71 + const items = [
  72 + {
  73 + key: '1',
  74 + label: '跟进日期',
  75 + children: datetime, // 跟进日期
  76 + },
  77 + {
  78 + key: '2',
  79 + label: '跟进人员',
  80 + children: createByName, // 跟进人员
  81 + },
  82 + {
  83 + key: '3',
  84 + label: '客户名称',
  85 + children: clientName, // 客户名称
  86 + },
  87 + {
  88 + key: '4',
  89 + label: '跟进详情',
  90 + children: content, // 跟进详情
  91 + },
  92 + {
  93 + key: '5',
  94 + label: '创建时间',
  95 + children: createTime, // 创建时间
  96 + },
  97 + {
  98 + key: '6',
  99 + label: '跟进类型',
  100 + children: way, // 跟进类型
  101 + },
  102 + ];
  103 + const handleDelete = async () => {
  104 + console.log(JSON.stringify(data), '5656record');
  105 + // 调用删除接口
  106 + const success = await postAdminClientRemoveClientComunicationInfo({
  107 + query: {
  108 + id: data.id,
  109 + },
  110 + });
  111 + // setIsModalVisible(false);
  112 + if (success) {
  113 + actionRef?.current?.reload(); // 重新加载表格数据
  114 + }
  115 + };
  116 + return (
  117 + <Space>
  118 + <ModalForm
  119 + title="跟进记录"
  120 + trigger={<Button type="link">查看</Button>}
  121 + submitter={{
  122 + resetButtonProps: {
  123 + style: {
  124 + display: 'none',
  125 + },
  126 + },
  127 + submitButtonProps: {
  128 + style: {
  129 + display: 'none',
  130 + },
  131 + },
  132 + render: (props, defaultDoms) => {
  133 + return [
  134 + ...defaultDoms,
  135 + <>
  136 + <ClientModal
  137 + key={'modify'}
  138 + data={data} // 将表单数据传递给 ClientModal
  139 + reloadTable={() => {
  140 + actionRef?.current?.reload(); // 重新加载表格数据
  141 + props.submit();
  142 + reloadTable();
  143 + console.log('5656close');
  144 + }}
  145 + type={'modify'}
  146 + onFinish={() => {
  147 + // setIsModalVisible(false);
  148 + }} // 关闭 Modal
  149 + style={{ marginRight: '10px' }}
  150 + />
  151 + <Button
  152 + key={'delete'}
  153 + onClick={() => {
  154 + handleDelete();
  155 + props.submit();
  156 + reloadTable();
  157 + }}
  158 + type="primary"
  159 + size="middle"
  160 + danger // 使用 danger 属性来将按钮颜色设置为红色
  161 + style={{ marginLeft: '10px' }}
  162 + onFinish={() => {
  163 + actionRef.current.reload();
  164 + }}
  165 + >
  166 + 删除
  167 + </Button>
  168 + </>,
  169 + ];
  170 + },
  171 + }}
  172 + onFinish={async () => {
  173 + // 提交成功后,显示 ClientDrawer
  174 + // setIsModalVisible(true);
  175 + return true;
  176 + }}
  177 + >
  178 + <Descriptions items={items} column={1} />
  179 + {attachmentsName && (
  180 + <a href={attachments} download>
  181 + 附件:{attachmentsName}
  182 + </a>
  183 + )}
  184 + </ModalForm>
  185 + </Space>
  186 + );
  187 +};
... ...
src/pages/Client/FollowRecord/index.tsx 0 → 100644
  1 +import { RESPONSE_CODE } from '@/constants/enum';
  2 +import ClientModal from '@/pages/Client/FollowRecord/Components/ClientModal';
  3 +import CommunicationHistoryModal from '@/pages/Client/FollowRecord/Components/CommunicationHistoryModal';
  4 +import {
  5 + postAdminClientQueryClientComunicationInfo,
  6 + postAdminClientRemoveClientComunicationInfo,
  7 + postServiceConstClientWay,
  8 + postServiceConstTradeStatus,
  9 +} from '@/services';
  10 +import { enumToSelect } from '@/utils';
  11 +import type { ActionType } from '@ant-design/pro-components';
  12 +import { ProTable } from '@ant-design/pro-components';
  13 +import { Button, Space, message } from 'antd';
  14 +import { useRef, useState } from 'react';
  15 +
  16 +export default () => {
  17 + const actionRef = useRef<ActionType>();
  18 + const [refreshKey, setRefreshKey] = useState(0); // 用于强制刷新的键
  19 +
  20 + const reload = () => {
  21 + actionRef.current.reload(); // 重新加载数据
  22 + console.log('5656flush');
  23 +
  24 + // 更新 refreshKey,强制刷新 CommunicationHistoryModal
  25 + setRefreshKey((prevKey) => prevKey + 1);
  26 + };
  27 + //biaoji
  28 + const columns = [
  29 + {
  30 + title: '跟进日期',
  31 + key: 'datetime',
  32 + width: 150,
  33 + ellipsis: true,
  34 + dataIndex: 'datetime',
  35 + valueType: 'dateTime',
  36 + hideInSearch: true,
  37 + // search: {
  38 + // transform: (value) => {
  39 + // if (value) {
  40 + // return {
  41 + // createTimeGe: value[0],
  42 + // createTimeLe: value[1],
  43 + // };
  44 + // }
  45 + // },
  46 + // },
  47 + },
  48 + {
  49 + title: '跟进时间',
  50 + dataIndex: 'dateRange',
  51 + valueType: 'dateRange',
  52 + hideInTable: true,
  53 + search: {
  54 + transform: (value) => {
  55 + if (value) {
  56 + return {
  57 + dateTimeGe: value[0],
  58 + dateTimeLe: value[1],
  59 + };
  60 + }
  61 + },
  62 + },
  63 + },
  64 + {
  65 + title: '跟进人员',
  66 + dataIndex: 'updateByName',
  67 + width: 100,
  68 + ellipsis: true,
  69 + hideInSearch: false,
  70 + },
  71 + {
  72 + title: '客户名称',
  73 + dataIndex: 'clientName',
  74 + width: 150,
  75 + ellipsis: true,
  76 + hideInSearch: true,
  77 + },
  78 + {
  79 + title: '客户地址',
  80 + dataIndex: 'clientAddress',
  81 + width: 250,
  82 + ellipsis: true,
  83 + hideInSearch: true,
  84 + },
  85 + {
  86 + title: '跟进类型',
  87 + dataIndex: 'wayText',
  88 + width: 100,
  89 + ellipsis: true,
  90 + hideInSearch: true,
  91 + },
  92 + {
  93 + title: '跟进类型',
  94 + dataIndex: 'way',
  95 + width: 100,
  96 + ellipsis: true,
  97 + hideInSearch: false,
  98 + hideInTable: true,
  99 + request: async () => {
  100 + const res = await postServiceConstClientWay();
  101 + return enumToSelect(res.data);
  102 + },
  103 + },
  104 + {
  105 + title: '客户名称',
  106 + dataIndex: 'clientNameLike',
  107 + width: 150,
  108 + ellipsis: true,
  109 + hideInSearch: false,
  110 + hideInTable: true,
  111 + },
  112 + {
  113 + title: '客户地址',
  114 + dataIndex: 'clientAddressLike',
  115 + width: 250,
  116 + ellipsis: true,
  117 + hideInSearch: false,
  118 + hideInTable: true,
  119 + },
  120 + {
  121 + title: '客户状态',
  122 + dataIndex: 'tradeStatus',
  123 + width: 100,
  124 + ellipsis: true,
  125 + hideInSearch: true,
  126 + },
  127 + {
  128 + title: '客户状态',
  129 + dataIndex: 'tradeStatusLike',
  130 + width: 100,
  131 + ellipsis: true,
  132 + hideInSearch: false,
  133 + hideInTable: true,
  134 + request: async () => {
  135 + const res = await postServiceConstTradeStatus();
  136 + return enumToSelect(res.data);
  137 + },
  138 + },
  139 + {
  140 + title: '跟进详情',
  141 + dataIndex: 'content',
  142 + width: 250,
  143 + ellipsis: true,
  144 + hideInSearch: false,
  145 + },
  146 + {
  147 + title: '创建时间',
  148 + dataIndex: 'createTime',
  149 + width: 150,
  150 + ellipsis: true,
  151 + hideInSearch: true,
  152 + },
  153 + {
  154 + title: '附件',
  155 + dataIndex: 'attachments',
  156 + width: 150,
  157 + ellipsis: true,
  158 + hideInSearch: true,
  159 + hideInTable: true,
  160 + },
  161 + {
  162 + title: '操作',
  163 + valueType: 'option',
  164 + key: 'option',
  165 + width: 150,
  166 + render: (text, record, index, action) => {
  167 + const handleDelete = async () => {
  168 + // console.log(JSON.stringify(record), '5656record');
  169 + // 调用删除接口
  170 + const success = await postAdminClientRemoveClientComunicationInfo({
  171 + query: {
  172 + id: record.id,
  173 + },
  174 + });
  175 + if (success) {
  176 + action.reload(); // 刷新表格
  177 + }
  178 + };
  179 + return [
  180 + <CommunicationHistoryModal
  181 + // key={'communicationHistory'}
  182 + key={`communicationHistory-${refreshKey}`} // 使用 refreshKey 来强制更新组件
  183 + data={record}
  184 + // reloadTable={() => {
  185 + // actionRef.current.reload();
  186 + // console.log('5656flush');
  187 + // }}
  188 + reloadTable={reload}
  189 + />,
  190 + <>
  191 + <Button
  192 + key={'delete'}
  193 + onClick={() => {
  194 + handleDelete();
  195 + actionRef.current.reload();
  196 + }}
  197 + // reloadTable={() => {
  198 + // actionRef.current.reload();
  199 + // }}
  200 + type="link"
  201 + size="middle"
  202 + // 使用 danger 属性来将按钮颜色设置为红色
  203 + // onFinish={() => {
  204 + // actionRef.current.reload();
  205 + // }}
  206 + >
  207 + 删除
  208 + </Button>
  209 + </>,
  210 + ];
  211 + },
  212 + },
  213 + ];
  214 +
  215 + // useEffect(() => {
  216 + // const pullGroupFilterDataOptions = async () => {
  217 + // const res = await postServiceConstClientGroupFilters();
  218 + // console.log('setGroupFilterDataOptions' + JSON.stringify(res.data));
  219 + // setGroupFilterDataOptions(enumToSelect(res.data));
  220 + // };
  221 + // pullGroupFilterDataOptions();
  222 + // }, []);
  223 + // useEffect(() => {
  224 + // actionRef.current?.reload();
  225 + // }, [groupFilter]);
  226 + return (
  227 + <>
  228 + <Space direction="vertical" size="middle" style={{ display: 'flex' }}>
  229 + <ProTable
  230 + columns={columns}
  231 + actionRef={actionRef}
  232 + cardBordered
  233 + request={async (params) => {
  234 + const res = await postAdminClientQueryClientComunicationInfo({
  235 + data: {
  236 + ...params,
  237 + },
  238 + });
  239 + console.log(params, '5656566params');
  240 + if (res.result === RESPONSE_CODE.SUCCESS) {
  241 + console.log(JSON.stringify(res.data));
  242 + return {
  243 + ...res.data,
  244 + data: res.data.data.map((item) => {
  245 + return {
  246 + ...item,
  247 + tid: (Math.random() * 1000000).toFixed(0),
  248 + };
  249 + }),
  250 + };
  251 + } else {
  252 + message.error('获取失败');
  253 + }
  254 + }}
  255 + search={{
  256 + optionRender: (searchConfig, formProps, dom) => [...dom.reverse()],
  257 + }}
  258 + scroll={{
  259 + x: 1400,
  260 + }}
  261 + editable={{
  262 + type: 'multiple',
  263 + }}
  264 + columnsState={{
  265 + persistenceKey: 'pro-table-singe-demos',
  266 + persistenceType: 'localStorage',
  267 + defaultValue: {
  268 + option: { fixed: 'right', disable: true },
  269 + },
  270 + onChange(value) {
  271 + console.log('value: ', value);
  272 + },
  273 + }}
  274 + rowKey="id"
  275 + options={{
  276 + setting: {
  277 + listsHeight: 400,
  278 + },
  279 + }}
  280 + form={{
  281 + // 由于配置了 transform,提交的参与与定义的不同这里需要转化一下
  282 + syncToUrl: (values, type) => {
  283 + if (type === 'get') {
  284 + return {
  285 + ...values,
  286 + created_at: [values.startTime, values.endTime],
  287 + };
  288 + }
  289 + return values;
  290 + },
  291 + }}
  292 + pagination={{
  293 + pageSize: 5,
  294 + onChange: (page) => console.log(page),
  295 + }}
  296 + dateFormatter="string"
  297 + headerTitle="高级表格"
  298 + toolBarRender={() => [
  299 + <ClientModal
  300 + key={'add'}
  301 + reloadTable={() => {
  302 + actionRef.current.reload();
  303 + }}
  304 + type={'add'}
  305 + />,
  306 + ]}
  307 + />
  308 + </Space>
  309 + {/* {contextHolder} */}
  310 + </>
  311 + );
  312 +};
... ...
src/pages/Invoice/InvoiceRecord/index.tsx
  1 +import ButtonConfirm from '@/components/ButtomConfirm';
  2 +import { RESPONSE_CODE } from '@/constants/enum';
1 3 import InvoiceRecordDetailModal from '@/pages/Invoice/InvoiceRecord/components/InvoiceRecordDetailModal';
2 4 import ManualInvoicingModal from '@/pages/Invoice/InvoiceRecord/components/ManualInvoicingModal';
3 5 import { PAYEE_OPTIONS } from '@/pages/Order/constant';
... ... @@ -5,6 +7,7 @@ import {
5 7 postServiceBankStatementEditBankStatement,
6 8 postServiceConstAfterInvoicingInvoiceRecordStatus,
7 9 postServiceConstInvoiceType,
  10 + postServiceInvoiceConfirmInvoice,
8 11 postServiceInvoiceDownloadInvoice,
9 12 postServiceInvoiceInvoicing,
10 13 postServiceInvoiceQueryInvoiceRecordList,
... ... @@ -371,6 +374,27 @@ const InvoiceRecord = () =&gt; {
371 374 ></ManualInvoicingModal>
372 375 )}
373 376 </>,
  377 + <>
  378 + {record.paths?.includes('INVOICE_CONFIRM') && (
  379 + <ButtonConfirm
  380 + key="delete"
  381 + className="p-0"
  382 + title={'确认发票?'}
  383 + text="确认发票"
  384 + onConfirm={async () => {
  385 + let res = await postServiceInvoiceConfirmInvoice({
  386 + data: { invoiceIds: [record.invoice?.id] },
  387 + });
  388 + if (res.result === RESPONSE_CODE.SUCCESS) {
  389 + message.success(res.message);
  390 + processedRecordRef?.current?.reload();
  391 + } else {
  392 + message.error(res.message);
  393 + }
  394 + }}
  395 + />
  396 + )}
  397 + </>,
374 398 ],
375 399 },
376 400 ];
... ...
src/pages/Invoice/constant.tsx
... ... @@ -181,8 +181,7 @@ export const INVOICE_COLUMNS = [
181 181 },
182 182 {
183 183 title: '开票日期',
184   - dataIndex: 'invoicingTime',
185   - valueType: 'date',
  184 + valueType: 'dateRange',
186 185 width: 150,
187 186 hideInTable: true,
188 187 search: {
... ... @@ -200,6 +199,13 @@ export const INVOICE_COLUMNS = [
200 199 title: '收款时间',
201 200 dataIndex: 'collectionTime',
202 201 valueType: 'date',
  202 + hideInSearch: true,
  203 + width: 200,
  204 + },
  205 + {
  206 + title: '收款时间',
  207 + valueType: 'dateRange',
  208 + hideInTable: true,
203 209 width: 200,
204 210 search: {
205 211 transform: (value) => {
... ...
src/pages/Invoice/waitProcessRecord/components/ManualInvoicingModal.tsx
... ... @@ -49,12 +49,6 @@ export default ({ record }) =&gt; {
49 49 }
50 50 }}
51 51 >
52   - {/*<ProFormText
53   - rules={[{ required: true, message: '此项为必填项' }]}
54   - width={'md'}
55   - name="invoicingPerson"
56   - label="开票人"
57   - />*/}
58 52 <ProFormText
59 53 rules={[{ required: true, message: '此项为必填项' }]}
60 54 width={'md'}
... ... @@ -99,33 +93,6 @@ export default ({ record }) =&gt; {
99 93 ></UploadC>
100 94 </Col>
101 95 </Row>
102   - {/*<ProFormList
103   - name="invoiceDetailDtoList"
104   - label="明细"
105   - creatorButtonProps={false}
106   - copyIconProps={false}
107   - itemRender={({ listDom }, { index }) => (
108   - <ProCard
109   - bordered
110   - style={{ marginBlockEnd: 8 }}
111   - title={`明细${index + 1}`}
112   - bodyStyle={{ paddingBlockEnd: 0 }}
113   - >
114   - {listDom}
115   - </ProCard>
116   - )}
117   - creatorRecord={{ name: '', items: [{ name: '' }] }}
118   - initialValue={record.invoiceDetails}
119   - >
120   - <ProFormText
121   - name="projectName"
122   - label="名称"
123   - placeholder="请输入名称"
124   - readonly
125   - />
126   - <ProFormDigit label="税率" name="taxRate" min={0} max={100} />
127   - <ProFormMoney label="税额" name="taxPrice" locale="zh-CN" min={0} />
128   - </ProFormList>*/}
129 96 </ModalForm>
130 97 );
131 98 };
... ...
src/pages/Invoice/waitProcessRecord/components/UploadSingleImg.tsx
1 1 import { PlusOutlined } from '@ant-design/icons';
2 2 import type { GetProp, UploadFile, UploadProps } from 'antd';
3 3 import { Image, Upload } from 'antd';
4   -import { useState } from 'react';
  4 +import { useEffect, useState } from 'react';
5 5  
6 6 type FileType = Parameters<GetProp<UploadProps, 'beforeUpload'>>[0];
7 7  
... ... @@ -27,12 +27,48 @@ export default ({ onFilesChange }) =&gt; {
27 27 setPreviewOpen(true);
28 28 };
29 29  
  30 + const onPaste = async (e: ClipboardEvent) => {
  31 + const items = e.clipboardData.items;
  32 +
  33 + for (let i = 0; i < items.length; i++) {
  34 + const item = items[i];
  35 +
  36 + // 检查是否为文件类型,并且类型是图片
  37 + if (item.kind === 'file' && item.type.startsWith('image/')) {
  38 + const file = item.getAsFile();
  39 + if (file) {
  40 + const newFile = {
  41 + uid: Date.now(), // 生成唯一的 uid
  42 + name: file.name,
  43 + status: 'done',
  44 + url: URL.createObjectURL(file), // 生成临时 URL
  45 + originFileObj: file,
  46 + };
  47 +
  48 + // 更新 fileList
  49 + const newFileList = [...fileList, newFile];
  50 + setFileList(newFileList);
  51 + onFilesChange(newFileList);
  52 + break; // 只处理第一个图片
  53 + }
  54 + }
  55 + }
  56 + };
  57 +
  58 + useEffect(() => {
  59 + document.addEventListener('paste', onPaste);
  60 + return () => {
  61 + document.removeEventListener('paste', onPaste);
  62 + };
  63 + }, [fileList]); // 添加 fileList 依赖
  64 +
30 65 const uploadButton = (
31 66 <button style={{ border: 0, background: 'none' }} type="button">
32 67 <PlusOutlined />
33 68 <div style={{ marginTop: 8 }}>Upload</div>
34 69 </button>
35 70 );
  71 +
36 72 return (
37 73 <>
38 74 <Upload
... ... @@ -41,7 +77,6 @@ export default ({ onFilesChange }) =&gt; {
41 77 onPreview={handlePreview}
42 78 onChange={({ fileList: newFileList }) => {
43 79 setFileList(newFileList);
44   - console.log('file' + JSON.stringify(newFileList));
45 80 onFilesChange(newFileList);
46 81 }}
47 82 >
... ...
src/pages/Order/Order/components/ConfirmReceiptModal.tsx
... ... @@ -107,8 +107,8 @@ export default ({ data, onClose }) =&gt; {
107 107 setPreviewOpen(true);
108 108 setPreviewTitle(
109 109 file.name ||
110   - file.originFileObj?.name ||
111   - file.url!.substring(file.url!.lastIndexOf('/') + 1),
  110 + file.originFileObj?.name ||
  111 + file.url!.substring(file.url!.lastIndexOf('/') + 1),
112 112 );
113 113 };
114 114  
... ...
src/pages/Order/Order/components/DeliverModal.tsx
... ... @@ -260,7 +260,7 @@ const DeliverModal = ({
260 260 serialNumber: item.serialNumber,
261 261 packageNumber:
262 262 item.packageNumber === null ||
263   - item.packageNumber === undefined
  263 + item.packageNumber === undefined
264 264 ? 1
265 265 : item.packageNumber,
266 266 logisticsNotes: item.logisticsNotes,
... ...
src/pages/Order/Order/components/FeedbackRegistrationModal.tsx 0 → 100644
  1 +import { postServiceOrderFeedbackRegistration } from '@/services/request';
  2 +import { Input, Modal } from 'antd';
  3 +import { useState } from 'react';
  4 +
  5 +// import { cloneDeep } from 'lodash';
  6 +export default ({ setVisible, subOrders, mainOrder, onClose }) => {
  7 + const [isModalOpen] = useState(true);
  8 + const { TextArea } = Input;
  9 + const [textValue, setTextValue] = useState('');
  10 +
  11 + const handleOk = async () => {
  12 + console.log(subOrders, '5656subOrders', mainOrder);
  13 + await postServiceOrderFeedbackRegistration({
  14 + data: {
  15 + id: subOrders[0].id,
  16 + feedbackRegistrationContent: textValue,
  17 + },
  18 + });
  19 + onClose();
  20 + // setIsModalOpen(false);
  21 + // onClose();
  22 + };
  23 + const handleCancel = () => {
  24 + setVisible(false);
  25 + onClose();
  26 + // setIsModalOpen(false);
  27 + // onClose();
  28 + };
  29 + const handleChange = (e) => {
  30 + setTextValue(e.target.value);
  31 + };
  32 + return (
  33 + <>
  34 + {/* <ModalForm<{
  35 + filePaths: any;
  36 + }>
  37 + width={500}
  38 + open
  39 + title="回访登记"
  40 + form={form}
  41 + autoFocusFirstInput
  42 + modalProps={{
  43 + okText: '提交',
  44 + cancelText: '取消',
  45 + destroyOnClose: true,
  46 + onCancel: () => {
  47 + setVisible(false);
  48 + },
  49 + }}
  50 + onFinish={async () => {
  51 + onClose();
  52 + }}
  53 + onOpenChange={setVisible}
  54 + >
  55 + <TextArea rows={6} placeholder="请输入" />
  56 + </ModalForm> */}
  57 + <Modal
  58 + title="回访登记"
  59 + open={isModalOpen}
  60 + onOk={handleOk}
  61 + onCancel={handleCancel}
  62 + >
  63 + <TextArea
  64 + rows={6}
  65 + placeholder="请输入"
  66 + onChange={handleChange}
  67 + value={textValue}
  68 + />
  69 + </Modal>
  70 + </>
  71 + );
  72 +};
... ...
src/pages/Order/Order/components/FinancialDrawer.tsx
... ... @@ -144,107 +144,107 @@ export default ({
144 144  
145 145 {invoicingStatus !== 'UN_INVOICE'
146 146 ? [
147   - <ProFormDatePicker
148   - key="invoicingTime"
149   - width="lg"
150   - name="invoicingTime"
151   - label="开票时间"
152   - disabled={isEdit}
153   - rules={[
154   - { required: !isEdit ? true : false, message: '这是必填项' },
155   - ]}
156   - initialValue={subOrders[0]?.invoicingTime}
157   - />,
158   - <ProFormText
159   - key="purchaser"
160   - width="lg"
161   - name="purchaser"
162   - label="抬头名称"
163   - disabled={isEdit}
164   - rules={[
165   - { required: !isEdit ? true : false, message: '这是必填项' },
166   - ]}
167   - initialValue={subOrders[0]?.purchaser}
168   - />,
169   - <ProFormDatePicker
170   - key="financialReceiptIssuanceTime"
171   - width="lg"
172   - name="financialReceiptIssuanceTime"
173   - label="开收据时间"
174   - initialValue={subOrders[0]?.financialReceiptIssuanceTime}
175   - />,
176   - <ProFormDatePicker
177   - key="collectMoneyTime"
178   - width="lg"
179   - name="collectMoneyTime"
180   - label="收款时间"
181   - initialValue={subOrders[0]?.collectMoneyTime}
182   - />,
183   - <ProFormText
184   - width="lg"
185   - key="invoiceNumber"
186   - name="invoiceNumber"
187   - label="发票号码"
188   - initialValue={subOrders[0]?.invoiceNumber}
189   - rules={[{ required: true, message: '发票号码必填' }]}
190   - />,
191   - <div
192   - key="salesChooseReceivingCompany"
193   - hidden={subOrders[0].receivingCompany === null}
194   - >
195   - <span className={'pl-2 text-xs text-gray-400'}>
196   - 销售申请开票时选择了:
197   - {enumValueToLabel(
198   - subOrders[0].receivingCompany,
199   - getReceivingCompanyOptions(PAYEE_OPTIONS),
200   - )}
201   - </span>
202   - <span
203   - hidden={subOrders[0].receivingCompany === 'ANY'}
204   - className={
205   - 'pl-2 text-xs text-[#1677ff] cursor-pointer hover:text-[#64abf7]'
206   - }
207   - onClick={() => {
208   - chooseReceivingCompany(subOrders[0].receivingCompany);
209   - }}
  147 + <ProFormDatePicker
  148 + key="invoicingTime"
  149 + width="lg"
  150 + name="invoicingTime"
  151 + label="开票时间"
  152 + disabled={isEdit}
  153 + rules={[
  154 + { required: !isEdit ? true : false, message: '这是必填项' },
  155 + ]}
  156 + initialValue={subOrders[0]?.invoicingTime}
  157 + />,
  158 + <ProFormText
  159 + key="purchaser"
  160 + width="lg"
  161 + name="purchaser"
  162 + label="抬头名称"
  163 + disabled={isEdit}
  164 + rules={[
  165 + { required: !isEdit ? true : false, message: '这是必填项' },
  166 + ]}
  167 + initialValue={subOrders[0]?.purchaser}
  168 + />,
  169 + <ProFormDatePicker
  170 + key="financialReceiptIssuanceTime"
  171 + width="lg"
  172 + name="financialReceiptIssuanceTime"
  173 + label="开收据时间"
  174 + initialValue={subOrders[0]?.financialReceiptIssuanceTime}
  175 + />,
  176 + <ProFormDatePicker
  177 + key="collectMoneyTime"
  178 + width="lg"
  179 + name="collectMoneyTime"
  180 + label="收款时间"
  181 + initialValue={subOrders[0]?.collectMoneyTime}
  182 + />,
  183 + <ProFormText
  184 + width="lg"
  185 + key="invoiceNumber"
  186 + name="invoiceNumber"
  187 + label="发票号码"
  188 + initialValue={subOrders[0]?.invoiceNumber}
  189 + rules={[{ required: true, message: '发票号码必填' }]}
  190 + />,
  191 + <div
  192 + key="salesChooseReceivingCompany"
  193 + hidden={subOrders[0].receivingCompany === null}
210 194 >
211   - 选择
212   - </span>
213   - </div>,
214   - <ProFormSelect
215   - key="payee"
216   - placeholder="选择收款单位"
217   - name="payee"
218   - width="lg"
219   - showSearch
220   - label="收款单位"
221   - options={enumToSelect(PAYEE_OPTIONS)}
222   - initialValue={subOrders[0]?.payee}
223   - rules={[{ required: true, message: '收款单位必填' }]}
224   - />,
225   -
226   - <div id="total-payment" key="money">
227   - <ProFormDigit
228   - key="money"
229   - name="money"
  195 + <span className={'pl-2 text-xs text-gray-400'}>
  196 + 销售申请开票时选择了:
  197 + {enumValueToLabel(
  198 + subOrders[0].receivingCompany,
  199 + getReceivingCompanyOptions(PAYEE_OPTIONS),
  200 + )}
  201 + </span>
  202 + <span
  203 + hidden={subOrders[0].receivingCompany === 'ANY'}
  204 + className={
  205 + 'pl-2 text-xs text-[#1677ff] cursor-pointer hover:text-[#64abf7]'
  206 + }
  207 + onClick={() => {
  208 + chooseReceivingCompany(subOrders[0].receivingCompany);
  209 + }}
  210 + >
  211 + 选择
  212 + </span>
  213 + </div>,
  214 + <ProFormSelect
  215 + key="payee"
  216 + placeholder="选择收款单位"
  217 + name="payee"
230 218 width="lg"
231   - label="金额"
232   - rules={[{ required: true, message: '金额必填' }]}
233   - tooltip="点击计算,合计所有子订单对应主订单总额"
234   - fieldProps={{
235   - addonAfter: (
236   - <Button
237   - className="rounded-l-none"
238   - type="primary"
239   - onClick={computeTotalPayment}
240   - >
241   - 计算
242   - </Button>
243   - ),
244   - }}
245   - />
246   - </div>,
247   - ]
  219 + showSearch
  220 + label="收款单位"
  221 + options={enumToSelect(PAYEE_OPTIONS)}
  222 + initialValue={subOrders[0]?.payee}
  223 + rules={[{ required: true, message: '收款单位必填' }]}
  224 + />,
  225 +
  226 + <div id="total-payment" key="money">
  227 + <ProFormDigit
  228 + key="money"
  229 + name="money"
  230 + width="lg"
  231 + label="金额"
  232 + rules={[{ required: true, message: '金额必填' }]}
  233 + tooltip="点击计算,合计所有子订单对应主订单总额"
  234 + fieldProps={{
  235 + addonAfter: (
  236 + <Button
  237 + className="rounded-l-none"
  238 + type="primary"
  239 + onClick={computeTotalPayment}
  240 + >
  241 + 计算
  242 + </Button>
  243 + ),
  244 + }}
  245 + />
  246 + </div>,
  247 + ]
248 248 : ''}
249 249  
250 250 <ProFormSelect
... ...
src/pages/Order/Order/components/FinancialEditDrawer.tsx
... ... @@ -130,24 +130,24 @@ export default ({ mainOrder, subOrders, setVisible, isMainOrder, onClose }) =&gt; {
130 130 width="lg"
131 131 name="financialReceiptIssuanceTime"
132 132 label="开收据时间"
133   - // rules={[
134   - // {
135   - // required: !isMainOrder && invoicingStatus === 'UN_INVOICE',
136   - // message: '开收据时间必填',
137   - // },
138   - // ]}
  133 + // rules={[
  134 + // {
  135 + // required: !isMainOrder && invoicingStatus === 'UN_INVOICE',
  136 + // message: '开收据时间必填',
  137 + // },
  138 + // ]}
139 139 />
140 140 <ProFormDatePicker
141 141 key="collectMoneyTime"
142 142 width="lg"
143 143 name="collectMoneyTime"
144 144 label="收款时间"
145   - // rules={[
146   - // {
147   - // required: !isMainOrder && invoicingStatus === 'UN_INVOICE',
148   - // message: '收款时间必填',
149   - // },
150   - // ]}
  145 + // rules={[
  146 + // {
  147 + // required: !isMainOrder && invoicingStatus === 'UN_INVOICE',
  148 + // message: '收款时间必填',
  149 + // },
  150 + // ]}
151 151 />
152 152 </DrawerForm>
153 153 );
... ...
src/pages/Order/Order/components/ImagesViewerModal.tsx
... ... @@ -3,7 +3,7 @@ import { Button, Divider, Image, Modal } from &#39;antd&#39;;
3 3 import { useEffect, useState } from 'react';
4 4 export default ({ setVisible, optType, onClose, orderRow }) => {
5 5 const [images, setImages] = useState<any[]>([]);
6   - const [title, setTitle] = useState("收货凭证");
  6 + const [title, setTitle] = useState('收货凭证');
7 7 const handleOk = () => {
8 8 onClose();
9 9 setVisible(false);
... ... @@ -23,7 +23,7 @@ export default ({ setVisible, optType, onClose, orderRow }) =&gt; {
23 23 }
24 24 useEffect(() => {
25 25 if (optType === 'shippingReceipt') {
26   - setTitle("收货凭证");
  26 + setTitle('收货凭证');
27 27 getImages();
28 28 } else if (optType === 'paymentReceipt') {
29 29 let paymentReceiptsImagesList: any[] = [];
... ... @@ -34,7 +34,6 @@ export default ({ setVisible, optType, onClose, orderRow }) =&gt; {
34 34 paymentReceiptsImagesList = [...new Set(paymentReceiptsImagesList)];
35 35 setImages(paymentReceiptsImagesList);
36 36 }
37   -
38 37 }, []);
39 38  
40 39 return (
... ...
src/pages/Order/Order/components/InvoicingDrawerForm.tsx
... ... @@ -93,7 +93,22 @@ export default ({ dataList, setVisible, mainOrder, onClose }) =&gt; {
93 93 document.body.removeChild(textarea);
94 94 }
95 95 }
96   -
  96 + // 定义一个计算总金额的函数
  97 + const calculateTotalPrice = (index: number) => {
  98 + const invoiceDetails = form.getFieldValue('invoiceDetails');
  99 + if (invoiceDetails && invoiceDetails[index]) {
  100 + const quantity = invoiceDetails[index].quantity || 0;
  101 + const price = invoiceDetails[index].price || 0;
  102 + const totalPrice = quantity * price;
  103 + const newInvoiceDetails = [...invoiceDetails];
  104 + newInvoiceDetails[index] = { ...newInvoiceDetails[index], totalPrice };
  105 + form.setFieldsValue({ invoiceDetails: newInvoiceDetails });
  106 + }
  107 + const totalPrice = invoiceDetails.reduce((accumulator, currentValue) => {
  108 + return FloatAdd(accumulator, currentValue.quantity * currentValue.price);
  109 + }, 0);
  110 + form.setFieldValue('price', totalPrice);
  111 + };
97 112 useEffect(() => {}, []);
98 113 return (
99 114 <DrawerForm
... ... @@ -519,12 +534,6 @@ export default ({ dataList, setVisible, mainOrder, onClose }) =&gt; {
519 534 ]}
520 535 placeholder="请输入名称"
521 536 />
522   - <ProFormText
523   - key={'unit' + listMeta.index}
524   - name="unit"
525   - label="单位"
526   - placeholder="请输入名称"
527   - />
528 537 <ProFormDigit
529 538 key={'quantity' + listMeta.index}
530 539 label="数量"
... ... @@ -539,7 +548,9 @@ export default ({ dataList, setVisible, mainOrder, onClose }) =&gt; {
539 548 },
540 549 },
541 550 ]}
  551 + onChange={() => calculateTotalPrice(listMeta.index)}
542 552 />
  553 +
543 554 <ProFormDigit
544 555 key={'price' + listMeta.index}
545 556 label="单价"
... ... @@ -554,23 +565,13 @@ export default ({ dataList, setVisible, mainOrder, onClose }) =&gt; {
554 565 },
555 566 },
556 567 ]}
  568 + onChange={() => calculateTotalPrice(listMeta.index)}
557 569 />
  570 +
558 571 <ProFormMoney
559 572 key={'totalPrice' + listMeta.index}
560 573 label="金额"
561 574 name="totalPrice"
562   - onChange={() => {
563   - const invoiceDetails = form.getFieldValue('invoiceDetails');
564   - console.log('invoiceDetails', invoiceDetails);
565   - const totalPrice = invoiceDetails.reduce(
566   - (accumulator, currentValue) => {
567   - return FloatAdd(accumulator, currentValue.totalPrice);
568   - },
569   - 0,
570   - );
571   - console.log('totalPrice', totalPrice);
572   - form.setFieldValue('price', totalPrice);
573   - }}
574 575 rules={[
575 576 {
576 577 validator: (_, value) => {
... ... @@ -581,6 +582,7 @@ export default ({ dataList, setVisible, mainOrder, onClose }) =&gt; {
581 582 },
582 583 },
583 584 ]}
  585 + readonly={true}
584 586 locale="zh-CN"
585 587 />
586 588 </ProCard>
... ...
src/pages/Order/Order/components/ModifiedDiffModal.tsx
... ... @@ -106,7 +106,7 @@ export default ({ setVisible, subOrders, mainOrder, onClose }) =&gt; {
106 106 onClick={() => {
107 107 window.open(
108 108 '/previewApi/onlinePreview?url=' +
109   - encodeURIComponent(Base64.encode(item)),
  109 + encodeURIComponent(Base64.encode(item)),
110 110 );
111 111 }}
112 112 >
... ...
src/pages/Order/Order/components/OrderDrawer copy.tsx
... ... @@ -554,7 +554,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
554 554 onChange={(_, option) => {
555 555 autoFillSalesInfo(option);
556 556 }}
557   - // disabled={mainInfoDisbled}
  557 + // disabled={mainInfoDisbled}
558 558 />
559 559  
560 560 <ProFormText
... ... @@ -642,7 +642,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
642 642 },
643 643 }}
644 644 debounceTime={1000}
645   - request={async (value, { }) => {
  645 + request={async (value, {}) => {
646 646 const keywords = value.keyWords;
647 647 const res = await postKingdeeRepCustomer({
648 648 data: { search: keywords },
... ... @@ -740,7 +740,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
740 740 </Button>
741 741 ),
742 742 }}
743   - // disabled={mainInfoDisbled}
  743 + // disabled={mainInfoDisbled}
744 744 />
745 745 </div>
746 746  
... ... @@ -752,7 +752,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
752 752 label="支付渠道"
753 753 options={enumToSelect(PAYMENT_CHANNEL_OPTIONS)}
754 754 rules={[{ required: true, message: '支付渠道必填' }]}
755   - // disabled={mainInfoDisbled}
  755 + // disabled={mainInfoDisbled}
756 756 />
757 757 <ProFormSelect
758 758 placeholder="请输入支付方式"
... ... @@ -762,7 +762,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
762 762 label="支付方式"
763 763 options={enumToSelect(PAYMENT_METHOD_OPTIONS)}
764 764 rules={[{ required: true, message: '支付方式必填' }]}
765   - // disabled={mainInfoDisbled}
  765 + // disabled={mainInfoDisbled}
766 766 />
767 767 <ProFormSelect
768 768 placeholder="选择是否需要开票"
... ... @@ -1094,7 +1094,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
1094 1094 options={enumToSelect(PRODUCT_BELONG_DEPARTMENT_OPTIONS)}
1095 1095 initialValue={'EXPERIMENTAL_CONSUMABLES'}
1096 1096 rules={[{ required: true, message: '所属事业部必填' }]}
1097   - // disabled={mainInfoDisbled}
  1097 + // disabled={mainInfoDisbled}
1098 1098 />,
1099 1099 <ProFormTextArea
1100 1100 key={'notes' + listMeta.index}
... ...
src/pages/Order/Order/components/OrderDrawer.tsx
... ... @@ -557,9 +557,9 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
557 557 form.setFieldValue(
558 558 'customerShippingAddress',
559 559 getDefaultString(option.province) +
560   - getDefaultString(option.city) +
561   - getDefaultString(option.district) +
562   - getDefaultString(option.detail),
  560 + getDefaultString(option.city) +
  561 + getDefaultString(option.district) +
  562 + getDefaultString(option.detail),
563 563 );
564 564 form.setFieldValue('customerNameString', option.realName);
565 565  
... ... @@ -642,11 +642,11 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
642 642  
643 643 message.error(
644 644 '用户余额不足,当前预减的金额为:' +
645   - data.subPrice +
646   - ',当前账号余额为:' +
647   - data.nowMoney +
648   - ',当前账号可赊账额度为:' +
649   - data.creditLimit,
  645 + data.subPrice +
  646 + ',当前账号余额为:' +
  647 + data.nowMoney +
  648 + ',当前账号可赊账额度为:' +
  649 + data.creditLimit,
650 650 );
651 651 return false;
652 652 }
... ... @@ -1111,7 +1111,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
1111 1111 },
1112 1112 }}
1113 1113 debounceTime={1000}
1114   - request={async (value, { }) => {
  1114 + request={async (value, {}) => {
1115 1115 const keywords = value.keyWords;
1116 1116 if (keywords === '') {
1117 1117 return [];
... ... @@ -1867,7 +1867,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
1867 1867 placeholder="请输入商品参数"
1868 1868 disabled={
1869 1869 productParametersDisabledFlagList[listMeta.index] !==
1870   - false || optType('after-sales-check')
  1870 + false || optType('after-sales-check')
1871 1871 }
1872 1872 />,
1873 1873 <ProFormDigit
... ... @@ -1920,7 +1920,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
1920 1920 placeholder="请输入商品单位"
1921 1921 disabled={
1922 1922 productParametersDisabledFlagList[listMeta.index] !==
1923   - false || optType('after-sales-check')
  1923 + false || optType('after-sales-check')
1924 1924 }
1925 1925 rules={[{ required: true, message: '商品单位必填' }]}
1926 1926 />,
... ...
src/pages/Order/Order/components/UploadPayBillModal.tsx
  1 +import { RESPONSE_CODE } from '@/constants/enum';
  2 +import {
  3 + postServiceOrderFileProcess,
  4 + postServiceOrderUploadPaymentReceipt,
  5 +} from '@/services';
  6 +import { transImageFile } from '@/utils';
  7 +import { PlusOutlined } from '@ant-design/icons';
1 8 import { ModalForm } from '@ant-design/pro-components';
2 9 import { Form, Modal, Upload, UploadFile, UploadProps, message } from 'antd';
3 10 import { RcFile } from 'antd/lib/upload';
4 11 import { cloneDeep } from 'lodash';
5 12 import { useEffect, useRef, useState } from 'react';
6 13 import { COMFIR_RECEIPT_IMAGES_NUMBER } from '../../constant';
7   -import { PlusOutlined } from '@ant-design/icons';
8   -import { transImageFile } from '@/utils';
9   -import { postServiceOrderFileProcess, postServiceOrderUploadPaymentReceipt } from '@/services';
10   -import { RESPONSE_CODE } from '@/constants/enum';
11 14  
12 15 // import { cloneDeep } from 'lodash';
13 16 export default ({ setVisible, subOrders, mainOrder, onClose }) => {
... ... @@ -25,7 +28,9 @@ export default ({ setVisible, subOrders, mainOrder, onClose }) =&gt; {
25 28 reader.onerror = (error) => reject(error);
26 29 });
27 30  
28   - const subOrderIds = subOrders?.map((item: any) => { return item.id });
  31 + const subOrderIds = subOrders?.map((item: any) => {
  32 + return item.id;
  33 + });
29 34 const fileListObj = useRef<UploadFile[]>([]); //使用引用类型,使得在useEffect里面设置监听事件后,不用更新监听事件也能保持obj与外界一致
30 35 const handleBeforeUpload = (file: any) => {
31 36 setFileList([...fileList, file]);
... ... @@ -80,6 +85,7 @@ export default ({ setVisible, subOrders, mainOrder, onClose }) =&gt; {
80 85  
81 86 if (filteredArray.length >= COMFIR_RECEIPT_IMAGES_NUMBER) {
82 87 message.info('发货照片数量不能超过3');
  88 + console.log(mainOrder);
83 89 return;
84 90 }
85 91 fileListObj.current = filteredArray;
... ... @@ -105,8 +111,8 @@ export default ({ setVisible, subOrders, mainOrder, onClose }) =&gt; {
105 111 setPreviewOpen(true);
106 112 setPreviewTitle(
107 113 file.name ||
108   - file.originFileObj?.name ||
109   - file.url!.substring(file.url!.lastIndexOf('/') + 1),
  114 + file.originFileObj?.name ||
  115 + file.url!.substring(file.url!.lastIndexOf('/') + 1),
110 116 );
111 117 };
112 118 const props: UploadProps = {
... ... @@ -128,7 +134,6 @@ export default ({ setVisible, subOrders, mainOrder, onClose }) =&gt; {
128 134 };
129 135  
130 136 useEffect(() => {
131   -
132 137 document.addEventListener('paste', onPaste);
133 138 return () => {
134 139 document.removeEventListener('paste', onPaste);
... ... @@ -211,14 +216,9 @@ export default ({ setVisible, subOrders, mainOrder, onClose }) =&gt; {
211 216 }}
212 217 onOpenChange={setVisible}
213 218 >
214   -
215   - <div className="pb-4 text-xs decoration-gray-50">
216   - 可复制照片粘贴
217   - </div>
  219 + <div className="pb-4 text-xs decoration-gray-50">可复制照片粘贴</div>
218 220 <Upload {...props}>
219   - {fileList.length < COMFIR_RECEIPT_IMAGES_NUMBER
220   - ? uploadButton
221   - : ''}
  221 + {fileList.length < COMFIR_RECEIPT_IMAGES_NUMBER ? uploadButton : ''}
222 222 </Upload>
223 223 </ModalForm>
224 224  
... ...
src/pages/Order/Order/index.css
1 1 .order-page-container .ant-table .ant-table-middle {
2 2 margin-inline: 0 !important;
3 3 }
  4 +
4 5 .order-page-container td {
5   - font-family: 'San Francisco', 'Helvetica Neue', Helvetica, Arial, 'Microsoft YaHei', 'PingFang SC', 'Hiragino Sans GB', 'Heiti SC', 'WenQuanYi Micro Hei', sans-serif;
  6 + font-family: 'San Francisco', 'Helvetica Neue', Helvetica, Arial,
  7 + 'Microsoft YaHei', 'PingFang SC', 'Hiragino Sans GB', 'Heiti SC',
  8 + 'WenQuanYi Micro Hei', sans-serif;
6 9 font-size: 13px;
7 10 }
  11 +
8 12 #total-payment .ant-input-number-group-addon {
9 13 padding: 0 !important;
10 14 }
  15 +
11 16 .order-page-container table:hover,
12 17 .order-page-container tr:hover,
13 18 .order-page-container thead:hover {
14 19 background: none !important;
15 20 }
  21 +
16 22 #main-table .ant-table-tbody > tr.ant-table-row:hover > td {
17 23 background: none !important;
18 24 }
  25 +
19 26 .order-page-container .ant-pro-card {
20 27 background-color: transparent;
21 28 }
  29 +
22 30 #main-table .ant-table-tbody .ant-table-cell {
23 31 padding: 10px 0 0;
24 32 }
  33 +
25 34 .order-page-container .ant-pagination {
26 35 background-color: #fff !important;
27 36 padding: 10px;
28 37 border-radius: 8px;
29 38 }
  39 +
30 40 .order-page-container .ant-pro-table .ant-form {
31 41 background-color: #fff;
32 42 border-radius: 8px;
33 43 }
  44 +
34 45 #main-table .ant-table-tbody {
35 46 background-color: #f5f5f5;
36 47 }
  48 +
37 49 .order-page-container .ant-pro-card-body {
38 50 padding: 0 !important;
39 51 }
  52 +
40 53 .order-page-container .ant-table-thead .ant-table-cell {
41 54 background-color: #fff !important;
42 55 border-radius: 8px !important;
43 56 }
  57 +
44 58 #sub-table tbody td {
45 59 padding: 10px 0 !important;
46 60 }
  61 +
47 62 #sub-table tbody tr:first-child td:first-child {
48 63 border-top-left-radius: 8px;
49 64 }
  65 +
50 66 #sub-table tbody tr:first-child td:nth-child(2) {
51 67 border-top-right-radius: 8px;
52 68 }
  69 +
53 70 #sub-table tbody tr:last-child td:first-child {
54 71 border-bottom-left-radius: 8px;
55 72 }
  73 +
56 74 #sub-table tbody tr:last-child td:nth-child(2) {
57 75 border-bottom-right-radius: 8px;
58 76 }
  77 +
59 78 #sub-table tbody tr td:first-child {
60 79 border-top: 1px solid #d7d6d6;
  80 +
61 81 /* 设置行与行之间分割线的颜色 */
62 82 border-bottom: 1px solid #d7d6d6;
  83 +
63 84 /* 设置行与行之间分割线的颜色 */
64 85 border-left: 1px solid #d7d6d6;
  86 +
65 87 /* 设置行与行之间分割线的颜色 */
66 88 }
  89 +
67 90 #sub-table tbody tr td:nth-child(2) {
68 91 border-top: 1px solid #d7d6d6;
  92 +
69 93 /* 设置行与行之间分割线的颜色 */
70 94 border-bottom: 1px solid #d7d6d6;
  95 +
71 96 /* 设置行与行之间分割线的颜色 */
72 97 border-right: 1px solid #d7d6d6;
  98 +
73 99 /* 设置行与行之间分割线的颜色 */
74 100 }
... ...
src/pages/Order/Order/index.tsx
... ... @@ -111,6 +111,7 @@ import CheckModal from &#39;./components/CheckModal&#39;;
111 111 import ConfirmReceiptModal from './components/ConfirmReceiptModal';
112 112 import DeliverInfoDrawer from './components/DeliverInfoDrawer';
113 113 import DeliverModal from './components/DeliverModal';
  114 +import FeedbackRegistrationModal from './components/FeedbackRegistrationModal';
114 115 import FinancialDrawer from './components/FinancialDrawer';
115 116 import FinancialEditDrawer from './components/FinancialEditDrawer';
116 117 import FinancialMergeDrawer from './components/FinancialMergeDrawer';
... ... @@ -146,6 +147,10 @@ const OrderPage = () =&gt; {
146 147 useState<boolean>(false);
147 148 const [uploadPayBillModalVisible, setUploadPayBillModalVisible] =
148 149 useState<boolean>(false);
  150 + const [
  151 + feedbackRegistrationModalVisible,
  152 + setFeedbackRegistrationModalVisible,
  153 + ] = useState<boolean>(false);
149 154 const [modifiedDiffModalVisible, setModifiedDiffModalVisible] =
150 155 useState<boolean>(false);
151 156 const [financialReceiptsModalVisible, setFinancialReceiptsModalVisible] =
... ... @@ -690,8 +695,6 @@ const OrderPage = () =&gt; {
690 695 * @param optRecord
691 696 */
692 697 function getOrderStatusTag(optRecord: any): import('react').ReactNode {
693   - console.log(optRecord);
694   -
695 698 const orderStatus = optRecord.orderStatus;
696 699 const paymentMethod = optRecord.paymentMethod;
697 700 let orderStatusTagText = enumValueToLabel(
... ... @@ -2095,6 +2098,20 @@ const OrderPage = () =&gt; {
2095 2098 ) : (
2096 2099 ''
2097 2100 )}
  2101 + {optRecord.paths?.includes('feedbackRegistration') ? (
  2102 + <Button
  2103 + className="p-0"
  2104 + type="link"
  2105 + onClick={() => {
  2106 + createOptObject(optRecord.id, record.id);
  2107 + setFeedbackRegistrationModalVisible(true);
  2108 + }}
  2109 + >
  2110 + 回访登记
  2111 + </Button>
  2112 + ) : (
  2113 + ''
  2114 + )}
2098 2115  
2099 2116 {optRecord.paths?.includes('confirmInvoice') ? (
2100 2117 <ButtonConfirm
... ... @@ -2316,6 +2333,31 @@ const OrderPage = () =&gt; {
2316 2333 ) : (
2317 2334 ''
2318 2335 )}
  2336 +
  2337 + {isAdmin() || isSales() ? (
  2338 + <Flex title={optRecord.notes} className="pt-2">
  2339 + <div className="flex items-center">
  2340 + <div className="flex items-center max-w-[500px]">
  2341 + <div className="max-w-md overflow-hidden whitespace-no-wrap overflow-ellipsis">
  2342 + <Tooltip
  2343 + title={optRecord.feedbackRegistrationContent}
  2344 + placement="topLeft"
  2345 + >
  2346 + <span className="text-[#8C8C8C] mr-3">
  2347 + 产品回访登记:
  2348 + {optRecord.feedbackRegistrationContent === undefined ||
  2349 + optRecord.feedbackRegistrationContent === null
  2350 + ? '暂无'
  2351 + : optRecord.feedbackRegistrationContent}
  2352 + </span>
  2353 + </Tooltip>
  2354 + </div>
  2355 + </div>
  2356 + </div>
  2357 + </Flex>
  2358 + ) : (
  2359 + ''
  2360 + )}
2319 2361 </>
2320 2362 );
2321 2363 };
... ... @@ -4548,11 +4590,15 @@ const OrderPage = () =&gt; {
4548 4590  
4549 4591 const [invoiceWarningNum, setInvoiceWarningNum] = useState(0);
4550 4592 const [invoiceRefundWarningNum, setInvoiceRefundWarningNum] = useState(0);
  4593 + const [waitConfirmPayment, setWaitConfirmPayment] = useState(0);
  4594 + const [waitFeedback, setWaitFeedback] = useState(0);
4551 4595 const [open, setOpen] = useState(false);
4552 4596 const { openCount, setOpenCount } = useModel('count');
4553 4597  
4554 4598 async function getInvoiceWarningNum() {
4555   - const res = await postServiceOrderWarningOrderStatistics();
  4599 + const res = await postServiceOrderWarningOrderStatistics({
  4600 + data: {},
  4601 + });
4556 4602 if (
4557 4603 (res.data.waitConfirmInvoice !== 0 ||
4558 4604 res.data.waitConfirmReceipt !== 0) &&
... ... @@ -4560,10 +4606,11 @@ const OrderPage = () =&gt; {
4560 4606 ) {
4561 4607 setOpenCount(true);
4562 4608 setOpen(true);
4563   - console.log(openCount, '5656openindex');
4564 4609 }
4565 4610 setInvoiceWarningNum(res.data.waitConfirmInvoice);
4566 4611 setInvoiceRefundWarningNum(res.data.waitConfirmReceipt);
  4612 + setWaitConfirmPayment(res.data.waitConfirmPayment);
  4613 + setWaitFeedback(res.data.waitFeedback);
4567 4614 }
4568 4615  
4569 4616 useEffect(() => {
... ... @@ -4600,7 +4647,7 @@ const OrderPage = () =&gt; {
4600 4647 </Button>,
4601 4648 ]}
4602 4649 >
4603   - <Row
  4650 + {/* <Row
4604 4651 gutter={16}
4605 4652 justify="space-between" // Aligns Cols to the start and end
4606 4653 align="middle" // Vertically center contents
... ... @@ -4693,15 +4740,264 @@ const OrderPage = () =&gt; {
4693 4740 </Card>
4694 4741 </div>
4695 4742 </Col>
  4743 + </Row> */}
  4744 + <Row
  4745 + gutter={16}
  4746 + justify="space-between" // Aligns Cols to the start and end
  4747 + align="middle" // Vertically center contents
  4748 + >
  4749 + {/* 新增卡片1: 待确认收货订单 */}
  4750 + <Col span={6}>
  4751 + {' '}
  4752 + {/* 修改位置:将 span 改为 6,以保证一行四个卡片 */}
  4753 + <div
  4754 + style={{
  4755 + display: 'flex',
  4756 + justifyContent: 'center',
  4757 + marginTop: '20px',
  4758 + }}
  4759 + >
  4760 + <Card
  4761 + bordered={true}
  4762 + style={{
  4763 + backgroundColor: '#f0f0f0', // 背景颜色
  4764 + width: '200px', // 卡片宽度
  4765 + height: '200px', // 卡片高度
  4766 + display: 'flex',
  4767 + alignItems: 'center',
  4768 + justifyContent: 'center',
  4769 + }}
  4770 + >
  4771 + <div
  4772 + style={{
  4773 + fontWeight: 'bold', // 字体加粗
  4774 + color: 'black', // 字体颜色
  4775 + fontSize: '18px', // 字体大小
  4776 + }}
  4777 + >
  4778 + <div
  4779 + style={{
  4780 + fontWeight: 'bold', // 字体加粗
  4781 + color: 'black', // 字体颜色
  4782 + fontSize: '40px', // 字体大小
  4783 + justifyContent: 'center',
  4784 + display: 'flex',
  4785 + alignItems: 'center',
  4786 + marginBottom: '20px',
  4787 + }}
  4788 + >
  4789 + {invoiceRefundWarningNum}
  4790 + </div>
  4791 + 待确认收货订单
  4792 + </div>
  4793 + </Card>
  4794 + </div>
  4795 + </Col>
  4796 +
  4797 + {/* 新增卡片2: 待回访登记订单 */}
  4798 + <Col span={6}>
  4799 + {' '}
  4800 + {/* 修改位置:将 span 改为 6,以保证一行四个卡片 */}
  4801 + <div
  4802 + style={{
  4803 + display: 'flex',
  4804 + justifyContent: 'center',
  4805 + marginTop: '20px',
  4806 + }}
  4807 + >
  4808 + <Card
  4809 + bordered={true}
  4810 + style={{
  4811 + backgroundColor: '#f0f0f0', // 背景颜色
  4812 + width: '200px', // 卡片宽度
  4813 + height: '200px', // 卡片高度
  4814 + display: 'flex',
  4815 + alignItems: 'center',
  4816 + justifyContent: 'center',
  4817 + }}
  4818 + >
  4819 + <div
  4820 + style={{
  4821 + fontWeight: 'bold', // 字体加粗
  4822 + color: 'black', // 字体颜色
  4823 + fontSize: '18px', // 字体大小
  4824 + }}
  4825 + >
  4826 + <div
  4827 + style={{
  4828 + fontWeight: 'bold', // 字体加粗
  4829 + color: 'black', // 字体颜色
  4830 + fontSize: '40px', // 字体大小
  4831 + justifyContent: 'center',
  4832 + display: 'flex',
  4833 + alignItems: 'center',
  4834 + marginBottom: '20px',
  4835 + }}
  4836 + >
  4837 + {waitFeedback}
  4838 + </div>
  4839 + 待回访登记订单
  4840 + </div>
  4841 + </Card>
  4842 + </div>
  4843 + </Col>
  4844 +
  4845 + {/* 现有卡片: 发票待确认订单 */}
  4846 + <Col span={6}>
  4847 + {' '}
  4848 + {/* 修改位置:将 span 改为 6,以保证一行四个卡片 */}
  4849 + <div
  4850 + style={{
  4851 + display: 'flex',
  4852 + justifyContent: 'center',
  4853 + marginTop: '20px',
  4854 + }}
  4855 + >
  4856 + <Card
  4857 + bordered={true}
  4858 + style={{
  4859 + backgroundColor: '#f0f0f0', // 背景颜色
  4860 + width: '200px', // 卡片宽度
  4861 + height: '200px', // 卡片高度
  4862 + display: 'flex',
  4863 + alignItems: 'center',
  4864 + justifyContent: 'center',
  4865 + }}
  4866 + >
  4867 + <div
  4868 + style={{
  4869 + fontWeight: 'bold', // 字体加粗
  4870 + color: 'black', // 字体颜色
  4871 + fontSize: '18px', // 字体大小
  4872 + }}
  4873 + >
  4874 + <div
  4875 + style={{
  4876 + fontWeight: 'bold', // 字体加粗
  4877 + color: 'black', // 字体颜色
  4878 + fontSize: '40px', // 字体大小
  4879 + justifyContent: 'center',
  4880 + display: 'flex',
  4881 + alignItems: 'center',
  4882 + marginBottom: '20px',
  4883 + }}
  4884 + >
  4885 + {invoiceWarningNum}
  4886 + </div>
  4887 + 待确认发票订单
  4888 + </div>
  4889 + </Card>
  4890 + </div>
  4891 + </Col>
  4892 +
  4893 + {/* 现有卡片: 回款待确认订单 */}
  4894 + <Col span={6}>
  4895 + {' '}
  4896 + {/* 修改位置:将 span 改为 6,以保证一行四个卡片 */}
  4897 + <div
  4898 + style={{
  4899 + display: 'flex',
  4900 + justifyContent: 'center',
  4901 + marginTop: '20px',
  4902 + }}
  4903 + >
  4904 + <Card
  4905 + bordered={true}
  4906 + style={{
  4907 + backgroundColor: '#f0f0f0', // 背景颜色
  4908 + width: '200px', // 卡片宽度
  4909 + height: '200px', // 卡片高度
  4910 + display: 'flex',
  4911 + alignItems: 'center',
  4912 + justifyContent: 'center',
  4913 + }}
  4914 + >
  4915 + <div
  4916 + style={{
  4917 + fontWeight: 'bold', // 字体加粗
  4918 + color: 'black', // 字体颜色
  4919 + fontSize: '18px', // 字体大小
  4920 + }}
  4921 + >
  4922 + <div
  4923 + style={{
  4924 + fontWeight: 'bold', // 字体加粗
  4925 + color: 'black', // 字体颜色
  4926 + fontSize: '40px', // 字体大小
  4927 + justifyContent: 'center',
  4928 + display: 'flex',
  4929 + alignItems: 'center',
  4930 + marginBottom: '20px',
  4931 + }}
  4932 + >
  4933 + {waitConfirmPayment}
  4934 + </div>
  4935 + 待回款订单
  4936 + </div>
  4937 + </Card>
  4938 + </div>
  4939 + </Col>
4696 4940 </Row>
4697   - <div style={{ color: 'red', padding: '40px' }}>
4698   - <p>预警说明:</p>
4699   - <p>
4700   - 1、从申请开票之日起,超过5天未【确认发票】的订单在登录时进行第一次提醒,超过15天未【确认发票】将进行每日提醒并锁单。
4701   - </p>
4702   - <p>
4703   - 2、从【确认发票】之日起,超过15天未【回款】的订单在账号登录时会进行第一次提醒,超过25天未【回款】将进行每日提醒并锁单。
  4941 +
  4942 + <div>
  4943 + <p
  4944 + style={{
  4945 + color: 'red',
  4946 + paddingLeft: '20px',
  4947 + paddingRight: '20px',
  4948 + marginTop: '10px',
  4949 + }}
  4950 + >
  4951 + 预警说明:
4704 4952 </p>
  4953 + <div
  4954 + style={{
  4955 + marginLeft: '20px',
  4956 + marginRight: '20px',
  4957 + marginBottom: '20px',
  4958 + }}
  4959 + >
  4960 + <span style={{ color: 'red' }}>确认收货预警:</span>
  4961 + <span>
  4962 + 从发货之日起计算,国内超过7天(海外30天)未【确认收货】,将进行确认收货预警提醒,超过10天(海外60天)未确认收货将锁单,并且每次登录都会提醒
  4963 + </span>
  4964 + </div>
  4965 + <div
  4966 + style={{
  4967 + marginLeft: '20px',
  4968 + marginRight: '20px',
  4969 + marginBottom: '20px',
  4970 + }}
  4971 + >
  4972 + <span style={{ color: 'red' }}>回访登记预警:</span>
  4973 + <span>
  4974 + 从【确认收货】之日起计算,国内超过20天(海外30天)未【回访登记】,将进行回访登记预警提醒,超过45天(海外60天)未回访登记将锁单,并且每次登录都会提醒
  4975 + </span>
  4976 + </div>
  4977 + <div
  4978 + style={{
  4979 + marginLeft: '20px',
  4980 + marginRight: '20px',
  4981 + marginBottom: '20px',
  4982 + }}
  4983 + >
  4984 + <span style={{ color: 'red' }}>确认发票预警:</span>
  4985 + <span>
  4986 + 从发票开出之日起,超过5天未和客户确认发票(不开票的订单除外)的订单将会进行第一次提醒;超过15天未和客户确认发票(不开票的订单除外)的订单将会每天进行一次提醒,并限制下单功能
  4987 + </span>
  4988 + </div>
  4989 + <div
  4990 + style={{
  4991 + marginLeft: '20px',
  4992 + marginRight: '20px',
  4993 + marginBottom: '20px',
  4994 + }}
  4995 + >
  4996 + <span style={{ color: 'red' }}>回款预警:</span>
  4997 + <span>
  4998 + 从【发票确认】之日起,超过30天未确认回款的订单将会每周提醒,超过90天未确认回款的订单将会每天进行一次提醒,并限制下单功能
  4999 + </span>
  5000 + </div>
4705 5001 </div>
4706 5002 </Modal>
4707 5003 <ProTable
... ... @@ -5285,6 +5581,24 @@ const OrderPage = () =&gt; {
5285 5581 }}
5286 5582 />
5287 5583 )}
  5584 + {feedbackRegistrationModalVisible && (
  5585 + <FeedbackRegistrationModal
  5586 + setVisible={(val: boolean) => {
  5587 + setFeedbackRegistrationModalVisible(val);
  5588 + if (!val) {
  5589 + clearOptObject();
  5590 + }
  5591 + }}
  5592 + subOrders={buildSubOrders()}
  5593 + mainOrder={buildMainOrder()}
  5594 + onClose={() => {
  5595 + setFeedbackRegistrationModalVisible(false);
  5596 + clearOptObject();
  5597 + refreshTable();
  5598 + }}
  5599 + />
  5600 + )}
  5601 +
5288 5602 {invoicingDrawerFormVisible && (
5289 5603 <InvoicingDrawerForm
5290 5604 dataList={
... ...
src/pages/Order/OrderWarning/components/CheckModal.tsx
... ... @@ -235,8 +235,8 @@ export default ({
235 235 setPreviewOpen(true);
236 236 setPreviewTitle(
237 237 file.name ||
238   - file.originFileObj?.name ||
239   - file.url!.substring(file.url!.lastIndexOf('/') + 1),
  238 + file.originFileObj?.name ||
  239 + file.url!.substring(file.url!.lastIndexOf('/') + 1),
240 240 );
241 241 };
242 242  
... ...
src/pages/Order/OrderWarning/components/ConfirmReceiptModal.tsx
... ... @@ -107,8 +107,8 @@ export default ({ data, onClose }) =&gt; {
107 107 setPreviewOpen(true);
108 108 setPreviewTitle(
109 109 file.name ||
110   - file.originFileObj?.name ||
111   - file.url!.substring(file.url!.lastIndexOf('/') + 1),
  110 + file.originFileObj?.name ||
  111 + file.url!.substring(file.url!.lastIndexOf('/') + 1),
112 112 );
113 113 };
114 114  
... ...
src/pages/Order/OrderWarning/components/DeliverModal.tsx
... ... @@ -260,7 +260,7 @@ const DeliverModal = ({
260 260 serialNumber: item.serialNumber,
261 261 packageNumber:
262 262 item.packageNumber === null ||
263   - item.packageNumber === undefined
  263 + item.packageNumber === undefined
264 264 ? 1
265 265 : item.packageNumber,
266 266 logisticsNotes: item.logisticsNotes,
... ...
src/pages/Order/OrderWarning/components/FeedbackRegistrationModal.tsx 0 → 100644
  1 +import { postServiceOrderFeedbackRegistration } from '@/services/request';
  2 +import { Input, Modal } from 'antd';
  3 +import { useState } from 'react';
  4 +
  5 +// import { cloneDeep } from 'lodash';
  6 +export default ({ setVisible, subOrders, mainOrder, onClose }) => {
  7 + const [isModalOpen] = useState(true);
  8 + const { TextArea } = Input;
  9 + const [textValue, setTextValue] = useState('');
  10 +
  11 + const handleOk = async () => {
  12 + console.log(subOrders, '5656subOrders', mainOrder);
  13 + await postServiceOrderFeedbackRegistration({
  14 + data: {
  15 + id: subOrders[0].id,
  16 + feedbackRegistrationContent: textValue,
  17 + },
  18 + });
  19 + onClose();
  20 + // setIsModalOpen(false);
  21 + // onClose();
  22 + };
  23 + const handleCancel = () => {
  24 + setVisible(false);
  25 + onClose();
  26 + // setIsModalOpen(false);
  27 + // onClose();
  28 + };
  29 + const handleChange = (e) => {
  30 + setTextValue(e.target.value);
  31 + };
  32 + return (
  33 + <>
  34 + {/* <ModalForm<{
  35 + filePaths: any;
  36 + }>
  37 + width={500}
  38 + open
  39 + title="回访登记"
  40 + form={form}
  41 + autoFocusFirstInput
  42 + modalProps={{
  43 + okText: '提交',
  44 + cancelText: '取消',
  45 + destroyOnClose: true,
  46 + onCancel: () => {
  47 + setVisible(false);
  48 + },
  49 + }}
  50 + onFinish={async () => {
  51 + onClose();
  52 + }}
  53 + onOpenChange={setVisible}
  54 + >
  55 + <TextArea rows={6} placeholder="请输入" />
  56 + </ModalForm> */}
  57 + <Modal
  58 + title="回访登记"
  59 + open={isModalOpen}
  60 + onOk={handleOk}
  61 + onCancel={handleCancel}
  62 + >
  63 + <TextArea
  64 + rows={6}
  65 + placeholder="请输入"
  66 + onChange={handleChange}
  67 + value={textValue}
  68 + />
  69 + </Modal>
  70 + </>
  71 + );
  72 +};
... ...
src/pages/Order/OrderWarning/components/FinancialDrawer.tsx
... ... @@ -144,107 +144,107 @@ export default ({
144 144  
145 145 {invoicingStatus !== 'UN_INVOICE'
146 146 ? [
147   - <ProFormDatePicker
148   - key="invoicingTime"
149   - width="lg"
150   - name="invoicingTime"
151   - label="开票时间"
152   - disabled={isEdit}
153   - rules={[
154   - { required: !isEdit ? true : false, message: '这是必填项' },
155   - ]}
156   - initialValue={subOrders[0]?.invoicingTime}
157   - />,
158   - <ProFormText
159   - key="purchaser"
160   - width="lg"
161   - name="purchaser"
162   - label="抬头名称"
163   - disabled={isEdit}
164   - rules={[
165   - { required: !isEdit ? true : false, message: '这是必填项' },
166   - ]}
167   - initialValue={subOrders[0]?.purchaser}
168   - />,
169   - <ProFormDatePicker
170   - key="financialReceiptIssuanceTime"
171   - width="lg"
172   - name="financialReceiptIssuanceTime"
173   - label="开收据时间"
174   - initialValue={subOrders[0]?.financialReceiptIssuanceTime}
175   - />,
176   - <ProFormDatePicker
177   - key="collectMoneyTime"
178   - width="lg"
179   - name="collectMoneyTime"
180   - label="收款时间"
181   - initialValue={subOrders[0]?.collectMoneyTime}
182   - />,
183   - <ProFormText
184   - width="lg"
185   - key="invoiceNumber"
186   - name="invoiceNumber"
187   - label="发票号码"
188   - initialValue={subOrders[0]?.invoiceNumber}
189   - rules={[{ required: true, message: '发票号码必填' }]}
190   - />,
191   - <div
192   - key="salesChooseReceivingCompany"
193   - hidden={subOrders[0].receivingCompany === null}
194   - >
195   - <span className={'pl-2 text-xs text-gray-400'}>
196   - 销售申请开票时选择了:
197   - {enumValueToLabel(
198   - subOrders[0].receivingCompany,
199   - getReceivingCompanyOptions(PAYEE_OPTIONS),
200   - )}
201   - </span>
202   - <span
203   - hidden={subOrders[0].receivingCompany === 'ANY'}
204   - className={
205   - 'pl-2 text-xs text-[#1677ff] cursor-pointer hover:text-[#64abf7]'
206   - }
207   - onClick={() => {
208   - chooseReceivingCompany(subOrders[0].receivingCompany);
209   - }}
  147 + <ProFormDatePicker
  148 + key="invoicingTime"
  149 + width="lg"
  150 + name="invoicingTime"
  151 + label="开票时间"
  152 + disabled={isEdit}
  153 + rules={[
  154 + { required: !isEdit ? true : false, message: '这是必填项' },
  155 + ]}
  156 + initialValue={subOrders[0]?.invoicingTime}
  157 + />,
  158 + <ProFormText
  159 + key="purchaser"
  160 + width="lg"
  161 + name="purchaser"
  162 + label="抬头名称"
  163 + disabled={isEdit}
  164 + rules={[
  165 + { required: !isEdit ? true : false, message: '这是必填项' },
  166 + ]}
  167 + initialValue={subOrders[0]?.purchaser}
  168 + />,
  169 + <ProFormDatePicker
  170 + key="financialReceiptIssuanceTime"
  171 + width="lg"
  172 + name="financialReceiptIssuanceTime"
  173 + label="开收据时间"
  174 + initialValue={subOrders[0]?.financialReceiptIssuanceTime}
  175 + />,
  176 + <ProFormDatePicker
  177 + key="collectMoneyTime"
  178 + width="lg"
  179 + name="collectMoneyTime"
  180 + label="收款时间"
  181 + initialValue={subOrders[0]?.collectMoneyTime}
  182 + />,
  183 + <ProFormText
  184 + width="lg"
  185 + key="invoiceNumber"
  186 + name="invoiceNumber"
  187 + label="发票号码"
  188 + initialValue={subOrders[0]?.invoiceNumber}
  189 + rules={[{ required: true, message: '发票号码必填' }]}
  190 + />,
  191 + <div
  192 + key="salesChooseReceivingCompany"
  193 + hidden={subOrders[0].receivingCompany === null}
210 194 >
211   - 选择
212   - </span>
213   - </div>,
214   - <ProFormSelect
215   - key="payee"
216   - placeholder="选择收款单位"
217   - name="payee"
218   - width="lg"
219   - showSearch
220   - label="收款单位"
221   - options={enumToSelect(PAYEE_OPTIONS)}
222   - initialValue={subOrders[0]?.payee}
223   - rules={[{ required: true, message: '收款单位必填' }]}
224   - />,
225   -
226   - <div id="total-payment" key="money">
227   - <ProFormDigit
228   - key="money"
229   - name="money"
  195 + <span className={'pl-2 text-xs text-gray-400'}>
  196 + 销售申请开票时选择了:
  197 + {enumValueToLabel(
  198 + subOrders[0].receivingCompany,
  199 + getReceivingCompanyOptions(PAYEE_OPTIONS),
  200 + )}
  201 + </span>
  202 + <span
  203 + hidden={subOrders[0].receivingCompany === 'ANY'}
  204 + className={
  205 + 'pl-2 text-xs text-[#1677ff] cursor-pointer hover:text-[#64abf7]'
  206 + }
  207 + onClick={() => {
  208 + chooseReceivingCompany(subOrders[0].receivingCompany);
  209 + }}
  210 + >
  211 + 选择
  212 + </span>
  213 + </div>,
  214 + <ProFormSelect
  215 + key="payee"
  216 + placeholder="选择收款单位"
  217 + name="payee"
230 218 width="lg"
231   - label="金额"
232   - rules={[{ required: true, message: '金额必填' }]}
233   - tooltip="点击计算,合计所有子订单对应主订单总额"
234   - fieldProps={{
235   - addonAfter: (
236   - <Button
237   - className="rounded-l-none"
238   - type="primary"
239   - onClick={computeTotalPayment}
240   - >
241   - 计算
242   - </Button>
243   - ),
244   - }}
245   - />
246   - </div>,
247   - ]
  219 + showSearch
  220 + label="收款单位"
  221 + options={enumToSelect(PAYEE_OPTIONS)}
  222 + initialValue={subOrders[0]?.payee}
  223 + rules={[{ required: true, message: '收款单位必填' }]}
  224 + />,
  225 +
  226 + <div id="total-payment" key="money">
  227 + <ProFormDigit
  228 + key="money"
  229 + name="money"
  230 + width="lg"
  231 + label="金额"
  232 + rules={[{ required: true, message: '金额必填' }]}
  233 + tooltip="点击计算,合计所有子订单对应主订单总额"
  234 + fieldProps={{
  235 + addonAfter: (
  236 + <Button
  237 + className="rounded-l-none"
  238 + type="primary"
  239 + onClick={computeTotalPayment}
  240 + >
  241 + 计算
  242 + </Button>
  243 + ),
  244 + }}
  245 + />
  246 + </div>,
  247 + ]
248 248 : ''}
249 249  
250 250 <ProFormSelect
... ...
src/pages/Order/OrderWarning/components/FinancialEditDrawer.tsx
... ... @@ -130,24 +130,24 @@ export default ({ mainOrder, subOrders, setVisible, isMainOrder, onClose }) =&gt; {
130 130 width="lg"
131 131 name="financialReceiptIssuanceTime"
132 132 label="开收据时间"
133   - // rules={[
134   - // {
135   - // required: !isMainOrder && invoicingStatus === 'UN_INVOICE',
136   - // message: '开收据时间必填',
137   - // },
138   - // ]}
  133 + // rules={[
  134 + // {
  135 + // required: !isMainOrder && invoicingStatus === 'UN_INVOICE',
  136 + // message: '开收据时间必填',
  137 + // },
  138 + // ]}
139 139 />
140 140 <ProFormDatePicker
141 141 key="collectMoneyTime"
142 142 width="lg"
143 143 name="collectMoneyTime"
144 144 label="收款时间"
145   - // rules={[
146   - // {
147   - // required: !isMainOrder && invoicingStatus === 'UN_INVOICE',
148   - // message: '收款时间必填',
149   - // },
150   - // ]}
  145 + // rules={[
  146 + // {
  147 + // required: !isMainOrder && invoicingStatus === 'UN_INVOICE',
  148 + // message: '收款时间必填',
  149 + // },
  150 + // ]}
151 151 />
152 152 </DrawerForm>
153 153 );
... ...
src/pages/Order/OrderWarning/components/ImagesViewerModal.tsx
... ... @@ -3,7 +3,7 @@ import { Button, Divider, Image, Modal } from &#39;antd&#39;;
3 3 import { useEffect, useState } from 'react';
4 4 export default ({ setVisible, optType, onClose, orderRow }) => {
5 5 const [images, setImages] = useState<any[]>([]);
6   - const [title, setTitle] = useState("收货凭证");
  6 + const [title, setTitle] = useState('收货凭证');
7 7 const handleOk = () => {
8 8 onClose();
9 9 setVisible(false);
... ... @@ -23,7 +23,7 @@ export default ({ setVisible, optType, onClose, orderRow }) =&gt; {
23 23 }
24 24 useEffect(() => {
25 25 if (optType === 'shippingReceipt') {
26   - setTitle("收货凭证");
  26 + setTitle('收货凭证');
27 27 getImages();
28 28 } else if (optType === 'paymentReceipt') {
29 29 let paymentReceiptsImagesList: any[] = [];
... ... @@ -34,7 +34,6 @@ export default ({ setVisible, optType, onClose, orderRow }) =&gt; {
34 34 paymentReceiptsImagesList = [...new Set(paymentReceiptsImagesList)];
35 35 setImages(paymentReceiptsImagesList);
36 36 }
37   -
38 37 }, []);
39 38  
40 39 return (
... ...
src/pages/Order/OrderWarning/components/ModifiedDiffModal.tsx
... ... @@ -106,7 +106,7 @@ export default ({ setVisible, subOrders, mainOrder, onClose }) =&gt; {
106 106 onClick={() => {
107 107 window.open(
108 108 '/previewApi/onlinePreview?url=' +
109   - encodeURIComponent(Base64.encode(item)),
  109 + encodeURIComponent(Base64.encode(item)),
110 110 );
111 111 }}
112 112 >
... ...
src/pages/Order/OrderWarning/components/OrderDrawer.tsx
... ... @@ -556,9 +556,9 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
556 556 form.setFieldValue(
557 557 'customerShippingAddress',
558 558 getDefaultString(option.province) +
559   - getDefaultString(option.city) +
560   - getDefaultString(option.district) +
561   - getDefaultString(option.detail),
  559 + getDefaultString(option.city) +
  560 + getDefaultString(option.district) +
  561 + getDefaultString(option.detail),
562 562 );
563 563 form.setFieldValue('customerNameString', option.realName);
564 564  
... ... @@ -641,11 +641,11 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
641 641  
642 642 message.error(
643 643 '用户余额不足,当前预减的金额为:' +
644   - data.subPrice +
645   - ',当前账号余额为:' +
646   - data.nowMoney +
647   - ',当前账号可赊账额度为:' +
648   - data.creditLimit,
  644 + data.subPrice +
  645 + ',当前账号余额为:' +
  646 + data.nowMoney +
  647 + ',当前账号可赊账额度为:' +
  648 + data.creditLimit,
649 649 );
650 650 return false;
651 651 }
... ... @@ -1110,7 +1110,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
1110 1110 },
1111 1111 }}
1112 1112 debounceTime={1000}
1113   - request={async (value, { }) => {
  1113 + request={async (value, {}) => {
1114 1114 const keywords = value.keyWords;
1115 1115 if (keywords === '') {
1116 1116 return [];
... ... @@ -1865,7 +1865,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
1865 1865 placeholder="请输入商品参数"
1866 1866 disabled={
1867 1867 productParametersDisabledFlagList[listMeta.index] !==
1868   - false || optType('after-sales-check')
  1868 + false || optType('after-sales-check')
1869 1869 }
1870 1870 />,
1871 1871 <ProFormDigit
... ... @@ -1918,7 +1918,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
1918 1918 placeholder="请输入商品单位"
1919 1919 disabled={
1920 1920 productParametersDisabledFlagList[listMeta.index] !==
1921   - false || optType('after-sales-check')
  1921 + false || optType('after-sales-check')
1922 1922 }
1923 1923 rules={[{ required: true, message: '商品单位必填' }]}
1924 1924 />,
... ...
src/pages/Order/OrderWarning/components/UploadPayBillModal.tsx
  1 +import { RESPONSE_CODE } from '@/constants/enum';
  2 +import {
  3 + postServiceOrderFileProcess,
  4 + postServiceOrderUploadPaymentReceipt,
  5 +} from '@/services';
  6 +import { transImageFile } from '@/utils';
  7 +import { PlusOutlined } from '@ant-design/icons';
1 8 import { ModalForm } from '@ant-design/pro-components';
2 9 import { Form, Modal, Upload, UploadFile, UploadProps, message } from 'antd';
3 10 import { RcFile } from 'antd/lib/upload';
4 11 import { cloneDeep } from 'lodash';
5 12 import { useEffect, useRef, useState } from 'react';
6 13 import { COMFIR_RECEIPT_IMAGES_NUMBER } from '../../constant';
7   -import { PlusOutlined } from '@ant-design/icons';
8   -import { transImageFile } from '@/utils';
9   -import { postServiceOrderFileProcess, postServiceOrderUploadPaymentReceipt } from '@/services';
10   -import { RESPONSE_CODE } from '@/constants/enum';
11 14  
12 15 // import { cloneDeep } from 'lodash';
13 16 export default ({ setVisible, subOrders, mainOrder, onClose }) => {
... ... @@ -25,7 +28,9 @@ export default ({ setVisible, subOrders, mainOrder, onClose }) =&gt; {
25 28 reader.onerror = (error) => reject(error);
26 29 });
27 30  
28   - const subOrderIds = subOrders?.map((item: any) => { return item.id });
  31 + const subOrderIds = subOrders?.map((item: any) => {
  32 + return item.id;
  33 + });
29 34 const fileListObj = useRef<UploadFile[]>([]); //使用引用类型,使得在useEffect里面设置监听事件后,不用更新监听事件也能保持obj与外界一致
30 35 const handleBeforeUpload = (file: any) => {
31 36 setFileList([...fileList, file]);
... ... @@ -105,8 +110,8 @@ export default ({ setVisible, subOrders, mainOrder, onClose }) =&gt; {
105 110 setPreviewOpen(true);
106 111 setPreviewTitle(
107 112 file.name ||
108   - file.originFileObj?.name ||
109   - file.url!.substring(file.url!.lastIndexOf('/') + 1),
  113 + file.originFileObj?.name ||
  114 + file.url!.substring(file.url!.lastIndexOf('/') + 1),
110 115 );
111 116 };
112 117 const props: UploadProps = {
... ... @@ -128,7 +133,6 @@ export default ({ setVisible, subOrders, mainOrder, onClose }) =&gt; {
128 133 };
129 134  
130 135 useEffect(() => {
131   -
132 136 document.addEventListener('paste', onPaste);
133 137 return () => {
134 138 document.removeEventListener('paste', onPaste);
... ... @@ -206,19 +210,15 @@ export default ({ setVisible, subOrders, mainOrder, onClose }) =&gt; {
206 210 }
207 211 } else {
208 212 message.success('上传失败');
  213 + console.log(mainOrder);
209 214 }
210 215 onClose();
211 216 }}
212 217 onOpenChange={setVisible}
213 218 >
214   -
215   - <div className="pb-4 text-xs decoration-gray-50">
216   - 可复制照片粘贴
217   - </div>
  219 + <div className="pb-4 text-xs decoration-gray-50">可复制照片粘贴</div>
218 220 <Upload {...props}>
219   - {fileList.length < COMFIR_RECEIPT_IMAGES_NUMBER
220   - ? uploadButton
221   - : ''}
  221 + {fileList.length < COMFIR_RECEIPT_IMAGES_NUMBER ? uploadButton : ''}
222 222 </Upload>
223 223 </ModalForm>
224 224  
... ...
src/pages/Order/OrderWarning/index.tsx
... ... @@ -32,6 +32,7 @@ import {
32 32 } from '@/utils';
33 33 import {
34 34 getReceivingCompanyOptions,
  35 + getSalesCodeOptions,
35 36 isAdmin,
36 37 isExaminer,
37 38 isFinance,
... ... @@ -53,6 +54,7 @@ import {
53 54 ActionType,
54 55 ProColumns,
55 56 ProFormInstance,
  57 + ProFormSelect,
56 58 ProTable,
57 59 } from '@ant-design/pro-components';
58 60 import {
... ... @@ -67,7 +69,6 @@ import {
67 69 Radio,
68 70 Space,
69 71 Spin,
70   - Tabs,
71 72 Tag,
72 73 Tooltip,
73 74 message,
... ... @@ -103,6 +104,7 @@ import CheckModal from &#39;./components/CheckModal&#39;;
103 104 import ConfirmReceiptModal from './components/ConfirmReceiptModal';
104 105 import DeliverInfoDrawer from './components/DeliverInfoDrawer';
105 106 import DeliverModal from './components/DeliverModal';
  107 +import FeedbackRegistrationModal from './components/FeedbackRegistrationModal';
106 108 import FinancialDrawer from './components/FinancialDrawer';
107 109 import FinancialEditDrawer from './components/FinancialEditDrawer';
108 110 import FinancialMergeDrawer from './components/FinancialMergeDrawer';
... ... @@ -120,12 +122,15 @@ import ShippingWarehouseChangeModal from &#39;./components/ShippingWarehouseChangeMo
120 122 import UploadPayBillModal from './components/UploadPayBillModal';
121 123 import './index.less';
122 124 import { OrderListItemType, OrderType } from './type.d';
  125 +// import { useParams } from '@umijs/max';
123 126  
124 127 const OrderPage = () => {
125 128 const [orderDrawerVisible, setOrderDrawerVisible] = useState<boolean>(false);
126 129 const [checkVisible, setCheckVisible] = useState<boolean>(false);
127 130 const [orderPrintVisible, setOrderPrintVisible] = useState<boolean>(false);
  131 + const [salesCodeOptions, setSalesCodeOptions] = useState([]);
128 132 const [allMainChecked, setAllMainChecked] = useState(false);
  133 + const [salesCodeSelect, setSalesCodeSelect] = useState();
129 134 const [imagesViewerModalVisible, setImagesViewerModalVisible] =
130 135 useState<boolean>(false);
131 136 const [data, setData] = useState([]); //列表数据
... ... @@ -136,6 +141,10 @@ const OrderPage = () =&gt; {
136 141 useState<boolean>(false);
137 142 const [uploadPayBillModalVisible, setUploadPayBillModalVisible] =
138 143 useState<boolean>(false);
  144 + const [
  145 + feedbackRegistrationModalVisible,
  146 + setFeedbackRegistrationModalVisible,
  147 + ] = useState<boolean>(false);
139 148 const [modifiedDiffModalVisible, setModifiedDiffModalVisible] =
140 149 useState<boolean>(false);
141 150 const [financialReceiptsModalVisible, setFinancialReceiptsModalVisible] =
... ... @@ -194,9 +203,7 @@ const OrderPage = () =&gt; {
194 203 const [subOrderCount, setSubOrderCount] = useState(0);
195 204 const [sorted] = useState(false);
196 205 const mainTableRef = useRef<ActionType>();
197   - const mainTableSecondRef = useRef<ActionType>();
198 206 const mainTableFormRef = useRef<ProFormInstance>();
199   - const mainTableSecondFormRef = useRef<ProFormInstance>();
200 207 let [searchParams, setSearchParam] = useState(Object); //表格的查询条件存储
201 208 console.log(searchParams);
202 209 const [messageApi, contextHolder] = message.useMessage();
... ... @@ -208,7 +215,7 @@ const OrderPage = () =&gt; {
208 215 const [ids, setIds] = useState([]);
209 216 const [recordOptNode, setRecordOptNode] = useState(null);
210 217 const roleCode = userInfo?.roleSmallVO?.code;
211   - const [activeTabKey, setActiveTabKey] = useState('1'); // **新增状态**
  218 + const [activeTabKey, setActiveTabKey] = useState(1); // **新增状态**
212 219  
213 220 const triggerRecordOptNode = async (id) => {
214 221 const res = await postServiceOrderGetCurrentOptNode({
... ... @@ -225,12 +232,6 @@ const OrderPage = () =&gt; {
225 232 setSelectedRows([]);
226 233 setSelectedSubOrderKeys([]);
227 234 };
228   - const refreshTable2 = () => {
229   - mainTableSecondRef.current?.reload();
230   - //刷新表格数据的时候,取消选中行
231   - setSelectedRows([]);
232   - setSelectedSubOrderKeys([]);
233   - };
234 235  
235 236 /*useEffect(() => {
236 237 let initAfterInvoicingStatus = async () => {
... ... @@ -2034,6 +2035,20 @@ const OrderPage = () =&gt; {
2034 2035 ) : (
2035 2036 ''
2036 2037 )}
  2038 + {optRecord.paths?.includes('feedbackRegistration') ? (
  2039 + <Button
  2040 + className="p-0"
  2041 + type="link"
  2042 + onClick={() => {
  2043 + createOptObject(optRecord.id, record.id);
  2044 + setFeedbackRegistrationModalVisible(true);
  2045 + }}
  2046 + >
  2047 + 回访登记
  2048 + </Button>
  2049 + ) : (
  2050 + ''
  2051 + )}
2037 2052  
2038 2053 {optRecord.paths?.includes('confirmInvoice') ? (
2039 2054 <ButtonConfirm
... ... @@ -2255,6 +2270,30 @@ const OrderPage = () =&gt; {
2255 2270 ) : (
2256 2271 ''
2257 2272 )}
  2273 + {isAdmin() || isSales() ? (
  2274 + <Flex title={optRecord.notes} className="pt-2">
  2275 + <div className="flex items-center">
  2276 + <div className="flex items-center max-w-[500px]">
  2277 + <div className="max-w-md overflow-hidden whitespace-no-wrap overflow-ellipsis">
  2278 + <Tooltip
  2279 + title={optRecord.feedbackRegistrationContent}
  2280 + placement="topLeft"
  2281 + >
  2282 + <span className="text-[#8C8C8C] mr-3">
  2283 + 产品回访登记:
  2284 + {optRecord.feedbackRegistrationContent === undefined ||
  2285 + optRecord.feedbackRegistrationContent === null
  2286 + ? '暂无'
  2287 + : optRecord.feedbackRegistrationContent}
  2288 + </span>
  2289 + </Tooltip>
  2290 + </div>
  2291 + </div>
  2292 + </div>
  2293 + </Flex>
  2294 + ) : (
  2295 + ''
  2296 + )}
2258 2297 </>
2259 2298 );
2260 2299 };
... ... @@ -3996,58 +4035,6 @@ const OrderPage = () =&gt; {
3996 4035 },
3997 4036 );
3998 4037  
3999   - // 主订单列表
4000   - const mainOrdersColumns2: ProColumns<OrderType>[] = MAIN_ORDER_COLUMNS.map(
4001   - (item) => {
4002   - //首能账号只能搜索订单编号
4003   - let canSearchIndex = [
4004   - 'id',
4005   - 'salesCode',
4006   - 'subNotes',
4007   - 'orderStatus',
4008   - 'createTime',
4009   - 'modifiedAuditStatus',
4010   - ];
4011   - if (isSupplier() && !canSearchIndex.includes(item.dataIndex)) {
4012   - item.search = false;
4013   - }
4014   -
4015   - canSearchIndex = [
4016   - 'id',
4017   - 'salesCode',
4018   - 'customerName',
4019   - 'institution',
4020   - 'productName',
4021   - 'orderStatus',
4022   - 'createTime',
4023   - ];
4024   -
4025   - if (isExaminer() && !canSearchIndex.includes(item.dataIndex)) {
4026   - item.search = false;
4027   - }
4028   -
4029   - if (item.dataIndex === 'name') {
4030   - return {
4031   - ...item,
4032   - title: <OrderTableHeader />,
4033   - render: (text, record) => {
4034   - return <MainOrderColumnRender record={record} />;
4035   - },
4036   - };
4037   - }
4038   -
4039   - /**
4040   - * 采购的订单状态筛选内容
4041   - */
4042   - if (roleCode === 'procure' && item.dataIndex === 'orderStatus') {
4043   - item.valueEnum = enumToProTableEnumValue(
4044   - PROCURE_PRIMARY_ORDER_STATUS_OPTIONS,
4045   - );
4046   - }
4047   - return item;
4048   - },
4049   - );
4050   -
4051 4038 /**
4052 4039 * 采购可以筛选供应商备注
4053 4040 */
... ... @@ -4059,13 +4046,6 @@ const OrderPage = () =&gt; {
4059 4046 valueType: 'text',
4060 4047 hideInTable: true,
4061 4048 });
4062   - mainOrdersColumns2.push({
4063   - title: '供应商备注',
4064   - width: 120,
4065   - dataIndex: 'supplierNotes',
4066   - valueType: 'text',
4067   - hideInTable: true,
4068   - });
4069 4049 }
4070 4050  
4071 4051 /**
... ... @@ -4086,20 +4066,6 @@ const OrderPage = () =&gt; {
4086 4066 },
4087 4067 hideInTable: true,
4088 4068 });
4089   - mainOrdersColumns2.push({
4090   - title: '采购名称',
4091   - width: 120,
4092   - dataIndex: 'supplierName',
4093   - valueType: 'select',
4094   - request: async () => {
4095   - const res = await postServiceOrderProvideProcurementRoles();
4096   - let options = res.data?.map((item) => {
4097   - return { label: item, value: item };
4098   - });
4099   - return options;
4100   - },
4101   - hideInTable: true,
4102   - });
4103 4069 }
4104 4070  
4105 4071 /**
... ... @@ -4123,23 +4089,6 @@ const OrderPage = () =&gt; {
4123 4089 },
4124 4090 hideInTable: true,
4125 4091 });
4126   - mainOrdersColumns2.push({
4127   - title: '采购排除',
4128   - width: 120,
4129   - dataIndex: 'excludeProcureNames',
4130   - fieldProps: {
4131   - mode: 'multiple',
4132   - },
4133   - valueType: 'select',
4134   - request: async () => {
4135   - const res = await postServiceOrderProvideProcurementRoles();
4136   - let options = res.data?.map((item) => {
4137   - return { label: item, value: item };
4138   - });
4139   - return options;
4140   - },
4141   - hideInTable: true,
4142   - });
4143 4092 }
4144 4093  
4145 4094 /**
... ... @@ -4154,14 +4103,6 @@ const OrderPage = () =&gt; {
4154 4103 valueEnum: enumToProTableEnumValue(SHIPPING_WAREHOUSE_OPTIONS),
4155 4104 hideInTable: true,
4156 4105 });
4157   - mainOrdersColumns2.push({
4158   - title: '发货仓库',
4159   - width: 120,
4160   - dataIndex: 'shippingWarehouse',
4161   - valueType: 'select',
4162   - valueEnum: enumToProTableEnumValue(SHIPPING_WAREHOUSE_OPTIONS),
4163   - hideInTable: true,
4164   - });
4165 4106 }
4166 4107  
4167 4108 //判断是否是采购,是的话新增一个筛选条件
... ... @@ -4173,1432 +4114,974 @@ const OrderPage = () =&gt; {
4173 4114 hideInTable: true,
4174 4115 valueEnum: enumToProTableEnumValue(PROCURE_ORDER_STATUS),
4175 4116 });
4176   - mainOrdersColumns2.push({
4177   - title: isSupplier() ? '下单状态' : '采购下单状态',
4178   - dataIndex: 'procureOrderStatus',
4179   - valueType: 'select',
4180   - hideInTable: true,
4181   - valueEnum: enumToProTableEnumValue(PROCURE_ORDER_STATUS),
4182   - });
4183 4117 }
4184 4118  
4185 4119 //选择天数1
4186 4120 const options1 = [
4187 4121 {
4188   - label: '超过5天',
4189   - value: 5,
4190   - },
4191   - {
4192 4122 label: '超过15天',
4193 4123 value: 15,
4194 4124 },
  4125 + {
  4126 + label: '超过30天',
  4127 + value: 30,
  4128 + },
4195 4129 ];
4196   - //选择天数
4197   - const [calDate, setCalDate] = useState<string | null>(null);
4198   - const [calDate2, setCalDate2] = useState<string | null>(null);
4199   - const [value1, setValue1] = useState();
4200   - const radioOnChange1 = ({ target: { value } }) => {
4201   - const currentDate = new Date();
4202   - // 创建一个新的日期对象,并在当前日期的基础上加上 daysToAdd 天
4203   - const newDate = new Date(currentDate);
4204   - newDate.setDate(currentDate.getDate() - value);
4205   - const formattedDate = format(newDate, 'yyyy-MM-dd HH:mm:ss');
4206   - setCalDate(formattedDate);
4207   - setValue1(value);
4208   - };
4209   - //选择天数2
4210 4130 const options2 = [
4211 4131 {
4212 4132 label: '超过15天',
4213 4133 value: 15,
4214 4134 },
4215 4135 {
4216   - label: '超过25天',
4217   - value: 25,
  4136 + label: '超过30天',
  4137 + value: 30,
  4138 + },
  4139 + ];
  4140 + const options3 = [
  4141 + {
  4142 + label: '超过5天',
  4143 + value: 5,
  4144 + },
  4145 + {
  4146 + label: '超过10天',
  4147 + value: 10,
  4148 + },
  4149 + ];
  4150 + const options4 = [
  4151 + {
  4152 + label: '超过30天',
  4153 + value: 30,
  4154 + },
  4155 + {
  4156 + label: '超过75天',
  4157 + value: 75,
  4158 + },
  4159 + {
  4160 + label: '超过90天',
  4161 + value: 90,
  4162 + },
  4163 + {
  4164 + label: '超过120天',
  4165 + value: 120,
4218 4166 },
4219 4167 ];
4220   - const [value2, setValue2] = useState();
4221   - const radioOnChange2 = ({ target: { value } }) => {
  4168 + //选择天数
  4169 + const [calDate, setCalDate] = useState<string | null>(null);
  4170 + const [value1, setValue1] = useState(0);
  4171 + const radioOnChange1 = ({ target: { value } }) => {
4222 4172 const currentDate = new Date();
4223   -
4224 4173 // 创建一个新的日期对象,并在当前日期的基础上加上 daysToAdd 天
4225 4174 const newDate = new Date(currentDate);
4226 4175 newDate.setDate(currentDate.getDate() - value);
4227 4176 const formattedDate = format(newDate, 'yyyy-MM-dd HH:mm:ss');
4228   - setCalDate2(formattedDate);
4229   - setValue2(value);
4230   - };
4231   - const confirmInvoice = async () => {
4232   - let flat = [...subOrderSelectedMap.values()].flat().map((item) => item.id);
4233   - const data = await postServiceOrderConfirmInvoice({
4234   - data: flat,
4235   - });
4236   - if (data.result === RESPONSE_CODE.SUCCESS) {
4237   - message.success(data.message);
4238   - refreshTable();
4239   - }
  4177 + setCalDate(formattedDate);
  4178 + setValue1(value);
4240 4179 };
4241 4180 const [invoiceWarningNum, setInvoiceWarningNum] = useState(0);
4242 4181 const [invoiceRefundWarningNum, setInvoiceRefundWarningNum] = useState(0);
  4182 + const [waitConfirmPayment, setWaitConfirmPayment] = useState(0);
  4183 + const [waitFeedback, setWaitFeedback] = useState(0);
  4184 + const [staticSalesCode, setStaticSalesCode] = useState(userInfo.username);
  4185 + const [salesCodePermission, setSalesCodePermission] = useState(false);
  4186 + //修改预警数请求salesCode
  4187 + const changeSalesCode = () => {
  4188 + if (salesCodeSelect === undefined) {
  4189 + setStaticSalesCode(userInfo.username);
  4190 + } else {
  4191 + setStaticSalesCode(salesCodeSelect);
  4192 + }
  4193 + };
  4194 + //选择栏权限
  4195 + const permission = () => {
  4196 + const { roles } = userInfo;
  4197 + const boolean =
  4198 + roles?.includes('SALES_MANAGER') || roles?.includes('ADMIN');
  4199 + if (boolean) {
  4200 + setSalesCodePermission(true);
  4201 + }
  4202 + };
4243 4203 async function getInvoiceWarningNum() {
4244   - const res = await postServiceOrderWarningOrderStatistics();
  4204 + changeSalesCode();
  4205 + const res = await postServiceOrderWarningOrderStatistics({
  4206 + data: {
  4207 + salesCode: staticSalesCode,
  4208 + },
  4209 + });
4245 4210 setInvoiceWarningNum(res.data.waitConfirmInvoice);
4246 4211 setInvoiceRefundWarningNum(res.data.waitConfirmReceipt);
  4212 + setWaitConfirmPayment(res.data.waitConfirmPayment);
  4213 + setWaitFeedback(res.data.waitFeedback);
4247 4214 }
4248 4215 useEffect(() => {
4249 4216 //预警订单数
4250 4217 getInvoiceWarningNum();
4251   - }, []);
  4218 + permission();
  4219 + }, [salesCodeSelect]);
4252 4220 //biaojiup
4253 4221 // 监听 calDate 变化,触发请求
4254 4222 useEffect(() => {
4255   - if (calDate) {
4256   - mainTableRef.current?.reload();
4257   - }
  4223 + mainTableRef.current?.reload();
4258 4224 }, [calDate]);
4259   -
4260   - const request = async (params: any, sorter: any, filter: any) => {
4261   - let orderIds = mainTableFormRef.current?.getFieldValue('id');
4262   - let subOrderId = mainTableFormRef.current?.getFieldValue('subOrderId');
4263   - params.id = params.id || orderIds;
4264   - params.subOrderId = params.subOrderId || subOrderId;
4265   - if (params.id !== '') {
4266   - params.id = params.id?.replace(/ /g, '');
4267   - if (params.id?.indexOf(',')) {
4268   - params.id = params.id.split(',');
4269   - params.id = params.id.filter((id) => id !== '');
4270   - }
4271   - }
4272   - params.salesCode = userInfo.username;
4273   - params.condition = filterCondifion;
4274   - params.paymentMethod = 'UNPAID';
4275   - params.sorted = sorted;
4276   - // params.isDeleteQueryOrder = filterCondifion === 70;
4277   - params.isDeleteQueryOrder = false;
4278   - params.invoiceConfirmStatusNe = 'CONFIRMED';
4279   - params.invoicingStatusNe = 'UN_INVOICE';
4280   - if (calDate === 'null') {
4281   - params.applyTimeLe = null;
4282   - } else {
4283   - params.applyTimeLe = calDate;
4284   - }
4285   - params.applyTimeIsNotNull = true;
4286   - setSearchParam(params);
4287   -
4288   - const res = await postServiceOrderQueryServiceOrder({
4289   - sorter,
4290   - filter,
4291   - data: { ...params, statusDatetimeGe: calDate },
4292   - });
4293   - console.log(res.data, '5656request');
4294   -
4295   - const data = res.data;
4296   - setRolePath(data.specialPath);
4297   - setSubOrderCount(data.count);
4298   - setAllMainChecked(false);
4299   - setSelectedMainOrderKeys([]);
4300   - subOrderSelectedMap.clear();
4301   - mainOrderSelectedMap.clear();
4302   - setData(data?.data);
4303   -
4304   - mainOrderIdSubOrderIdRelationsMap.clear();
4305   - for (let row of data?.data) {
4306   - let mianOrderId = row.id;
4307   - let subOrderIds = row.subOrderInformationLists?.map((item) => {
4308   - item.totalPayment = row.totalPayment;
4309   - return item.id;
4310   - });
4311   - mainOrderIdSubOrderIdRelationsMap.set(mianOrderId, subOrderIds);
4312   - }
4313   -
4314   - return {
4315   - data: data?.data || [],
4316   - total: data?.total || 0,
4317   - };
4318   - };
4319   - //biaojidown
4320   -
4321   - //biaojiup2
4322   - // 监听 calDate 变化,触发请求
4323   - useEffect(() => {
4324   - if (calDate2) {
4325   - // mainTableRef.current?.reload();
4326   - mainTableSecondRef.current?.reload();
4327   - }
4328   - }, [calDate2]);
4329 4225 useEffect(() => {
4330   - if (activeTabKey === '1') {
4331   - mainTableRef.current?.reload(); // **修改位置:在选择第二个标签时请求request2**
4332   - }
4333   - if (activeTabKey === '2') {
4334   - mainTableSecondRef.current?.reload(); // **修改位置:在选择第二个标签时请求request2**
  4226 + if (
  4227 + activeTabKey === 1 ||
  4228 + activeTabKey === 2 ||
  4229 + activeTabKey === 3 ||
  4230 + activeTabKey === 4
  4231 + ) {
  4232 + setValue1(0); // 清空 value1
4335 4233 }
  4234 + mainTableRef.current?.reload(); // **修改位置:在选择第二个标签时请求request2**
4336 4235 }, [activeTabKey]);
4337   -
4338   - const request2 = async (
4339   - // 第一个参数 params 查询表单和 params 参数的结合
4340   - // 第一个参数中一定会有 pageSize 和 current ,这两个参数是 antd 的规范
4341   - params,
4342   - sorter,
4343   - filter,
4344   - ) => {
4345   - params.invoiceConfirmStatus = 'CONFIRMED';
4346   - params.paymentMethod = 'UNPAID';
4347   - params.salesCode = userInfo.username;
4348   - if (calDate2 === 'null') {
4349   - params.invoiceConfirmStatusDatetimeLe = null;
4350   - } else {
4351   - params.invoiceConfirmStatusDatetimeLe = calDate2;
4352   - }
4353   - //订单id处理
4354   - /**
4355   - * 以params中的id为主,如果params没id,则取url中的id
4356   - * 第一次进来这个页面,url带有id的话,会自动填充到查询表单中,但是第一次查询params不会带这个id进来
4357   - */
4358   - let orderIds = mainTableSecondFormRef.current?.getFieldValue('id');
4359   - let subOrderId =
4360   - mainTableSecondFormRef.current?.getFieldValue('subOrderId');
4361   - params.id = params.id || orderIds;
4362   - params.subOrderId = params.subOrderId || subOrderId;
4363   - if (params.id !== '') {
4364   - params.id = params.id?.replace(/ /g, '');
4365   - if (params.id?.indexOf(',')) {
4366   - params.id = params.id.split(',');
4367   - params.id = params.id.filter((id) => {
4368   - return id !== '';
4369   - });
4370   - }
4371   - }
4372   -
4373   - params.condition = filterCondifion;
4374   -
4375   - //排序
4376   - params.sorted = sorted;
4377   - //是否只查看已作废
4378   - params.isDeleteQueryOrder = filterCondifion === 70;
4379   - params.paymentNotReceipt = true;
4380   - //保存这个搜索条件
4381   - setSearchParam(params);
4382   -
4383   - //订单标记2
4384   - const { data } = await postServiceOrderQueryServiceOrder({
4385   - // ...params,
4386   - // FIXME: remove @ts-ignore
4387   - // @ts-ignore
4388   - sorter,
4389   - filter,
4390   - data: { ...params },
4391   - });
4392   - console.log(data, '5656request2');
4393   -
4394   - setRolePath(data.specialPath);
4395   - setSubOrderCount(data.count);
4396   - setAllMainChecked(false);
4397   - setSelectedMainOrderKeys([]);
4398   - subOrderSelectedMap.clear();
4399   - mainOrderSelectedMap.clear();
4400   - setData(data?.data);
4401   -
4402   - //主订单id与子订单id的对照关系保存
4403   - mainOrderIdSubOrderIdRelationsMap.clear();
4404   - for (let row of data?.data) {
4405   - let mianOrderId = row.id;
4406   - let subOrderIds = row.subOrderInformationLists?.map((item) => {
4407   - //目前子订单存储的totalPayment不准确,这里重新处理取主订单的totalPayment
4408   - //totalPayment在财务开票计算金额时使用到
4409   - item.totalPayment = row.totalPayment;
4410   - return item.id;
4411   - });
4412   - mainOrderIdSubOrderIdRelationsMap.set(mianOrderId, subOrderIds);
  4236 + // 修改位置:监听 value1 的变化
  4237 + useEffect(() => {
  4238 + if (value1 === 0) {
  4239 + // 这里执行你希望在 value1 为 0 时的逻辑
  4240 + mainTableRef.current?.reload(); // 重新请求数据
4413 4241 }
4414   -
4415   - return {
4416   - data: data?.data || [],
4417   - total: data?.total || 0,
4418   - };
4419   - };
  4242 + }, [value1]); // 添加了 value1 作为依赖
4420 4243 //biaojidown2
4421 4244 //取消单选,将时间设为null
4422 4245 const handleSetNull = () => {
4423   - setCalDate('null'); // 这应该会触发 useEffect
  4246 + setCalDate(null); // 这应该会触发 useEffect
4424 4247 };
4425   - const handleSetNull2 = () => {
4426   - setCalDate2('null'); // 这应该会触发 useEffect
  4248 + const selectSalesCode = (value) => {
  4249 + setSalesCodeSelect(value); // 这应该会触发 useEffect
4427 4250 };
4428   - const tabsItems = [
  4251 + const warningOptions = [
  4252 + {
  4253 + value: 1,
  4254 + label: (
  4255 + <span>
  4256 + 确认收货预警
  4257 + <Badge count={invoiceRefundWarningNum} style={{ marginLeft: 8 }} />
  4258 + </span>
  4259 + ),
  4260 + },
  4261 + {
  4262 + value: 2,
  4263 + label: (
  4264 + <span>
  4265 + 回访登记预警
  4266 + <Badge count={waitFeedback} style={{ marginLeft: 8 }} />
  4267 + </span>
  4268 + ),
  4269 + },
4429 4270 {
4430   - key: '1',
  4271 + value: 3,
4431 4272 label: (
4432 4273 <span>
4433   - 发票确认预警
  4274 + 确认发票预警
4434 4275 <Badge count={invoiceWarningNum} style={{ marginLeft: 8 }} />
4435 4276 </span>
4436 4277 ),
4437   - children: (
4438   - <div>
4439   - <div style={{ position: 'relative' }}>
4440   - {/* <Radio.Group options={options1} onChange={radioOnChange1} value={value1} /> */}
4441   - <Radio.Group
4442   - value={value1}
4443   - onChange={radioOnChange1}
4444   - // 通过 onClick 处理单独 Radio 的点击事件
4445   - >
4446   - {options1.map((option) => (
4447   - <Radio
4448   - key={option.value}
4449   - value={option.value}
4450   - onClick={(e) => {
4451   - radioOnChange1(
4452   - e as unknown as React.ChangeEvent<HTMLInputElement>,
4453   - );
4454   - handleSetNull();
4455   - }}
4456   - >
4457   - {option.label}
4458   - </Radio>
4459   - ))}
4460   - </Radio.Group>
4461   - <Button
4462   - size="large"
4463   - type="primary"
4464   - onClick={confirmInvoice}
4465   - style={{ position: 'absolute', right: '20px' }}
4466   - >
4467   - 确认发票
4468   - </Button>
4469   - </div>
4470   - <div style={{ height: '25px' }}></div>
4471   - <ProTable
4472   - id="main-table"
4473   - // tableStyle={{backgroundColor:'red'}}
4474   -
4475   - actionRef={mainTableRef}
4476   - formRef={mainTableFormRef}
4477   - expandIconColumnIndex={-1}
4478   - columns={mainOrdersColumns}
4479   - rowKey="id"
4480   - pagination={{
4481   - showQuickJumper: true,
4482   - pageSize: pageSize,
4483   - current: currentPage,
4484   - showSizeChanger: true,
4485   - onChange: (page, size) => {
4486   - setPageSize(size);
4487   - setCurrentPage(page);
4488   - },
4489   - showTotal: (total, range) => {
4490   - return (
4491   - <>
4492   - <span>
4493   - {'第 ' +
4494   - range[0] +
4495   - '-' +
4496   - range[1] +
4497   - ' 条/总共 ' +
4498   - total +
4499   - ' 条主订单 '}
4500   - </span>
4501   - <span className="text-[#8C8C8C]">
4502   - {' (' + subOrderCount + ' 条子订单)'}
4503   - </span>
4504   - </>
4505   - );
4506   - },
4507   - }}
4508   - // showHeader={false}
4509   - expandedRowKeys={expandedRowKeys}
4510   - // expandable={{ expandedRowRender }}
4511   - dateFormatter="string"
4512   - options={false}
4513   - headerTitle=""
4514   - search={false}
4515   - // labelWidth: 'auto',
4516   - // onCollapse: resize,
4517   - // request={request}
4518   - request={activeTabKey === '1' ? request : null} // **条件请求**
4519   - toolbar={{
4520   - multipleLine: true,
4521   - }}
4522   - // toolBarRender={() => {
4523   - // return toolBarRender();
4524   - // }}
4525   - />
  4278 + },
  4279 + {
  4280 + value: 4,
  4281 + label: (
  4282 + <span>
  4283 + 订单回款预警
  4284 + <Badge count={waitConfirmPayment} style={{ marginLeft: 8 }} />
  4285 + </span>
  4286 + ),
  4287 + },
  4288 + ];
4526 4289  
4527   - {orderDrawerVisible && (
4528   - <OrderDrawer
4529   - data={orderOptType === 'add' ? {} : buildMainOrder()}
4530   - subOrders={orderOptType === 'add' ? [] : buildSubOrders()}
4531   - onClose={(isSuccess: boolean) => {
4532   - setOrderDrawerVisible(false);
4533   - clearOptObject();
4534   - if (isSuccess) {
4535   - refreshTable();
4536   - }
4537   - }}
4538   - orderOptType={orderOptType}
4539   - />
4540   - )}
4541   -
4542   - {checkVisible && (
4543   - <CheckModal
4544   - setCheckVisible={(val: boolean) => {
4545   - setCheckVisible(val);
4546   - if (!val) {
4547   - clearOptObject();
4548   - }
4549   - }}
4550   - data={isMainOrder ? getFirstMainOrder() : buildMainOrder()}
4551   - subOrders={
4552   - isMainOrder
4553   - ? [...subOrderSelectedMap.values()].flat()
4554   - : buildSubOrders()
4555   - }
4556   - orderCheckType={orderCheckType}
4557   - openOrderDrawer={(type: any, id: any) => {
4558   - setCurrentMainId(id);
4559   - setOrderOptType(type);
4560   - setOrderDrawerVisible(true);
4561   - }}
4562   - onClose={() => {
4563   - clearOptObject();
4564   - setCheckVisible(false);
4565   - refreshTable();
4566   - }}
4567   - />
4568   - )}
4569   -
4570   - {applyForInvoicingVisible && (
4571   - <ApplyForInvoicingModal
4572   - setCheckVisible={(val: boolean) => {
4573   - setApplyForInvoicingVisible(val);
4574   - if (!val) {
4575   - clearOptObject();
4576   - }
4577   - }}
4578   - subOrders={
4579   - isMainOrder
4580   - ? [...subOrderSelectedMap.values()].flat()
4581   - : buildSubOrders()
4582   - }
4583   - totalPayment={getApplyInvoicingTotalPayment()}
4584   - isMainOrder={isMainOrder}
4585   - isEdit={isEdit}
4586   - onClose={() => {
4587   - setApplyForInvoicingVisible(false);
4588   - setIsMainOrder(false);
4589   - clearOptObject();
4590   - refreshTable();
4591   - }}
4592   - />
4593   - )}
4594   -
4595   - {notesEditVisible && (
4596   - <OrderNotesEditModal
4597   - setNotesEditVisible={(val: boolean) => {
4598   - setNotesEditVisible(val);
4599   - if (!val) {
4600   - clearOptObject();
4601   - }
4602   - }}
4603   - ids={selectedRows}
4604   - notesType={notesType}
4605   - notes={notes}
4606   - onClose={() => {
4607   - setNotesEditVisible(false);
4608   - setSelectedRows([]);
4609   - setNotes(notes);
4610   - setNotesType(1);
4611   - refreshTable();
4612   - }}
4613   - />
4614   - )}
4615   -
4616   - {deliverVisible && (
4617   - <DeliverModal
4618   - data={buildSubOrders()}
4619   - isSendProduct={isSendProduct}
4620   - setVisible={(val: boolean) => {
4621   - setDeliverVisible(val);
4622   - if (!val) {
4623   - clearOptObject();
4624   - }
4625   - }}
4626   - sendType={orderCheckType}
4627   - onClose={() => {
4628   - clearOptObject();
4629   - setDeliverVisible(false);
4630   - setIsSendProduct(false);
4631   - refreshTable();
4632   - }}
4633   - />
4634   - )}
4635   -
4636   - {financialVisible && (
4637   - <FinancialDrawer
4638   - isEdit={isEdit}
4639   - mainOrder={isMainOrder ? getFirstMainOrder() : buildMainOrder()}
4640   - subOrders={
4641   - isMainOrder
4642   - ? [...subOrderSelectedMap.values()].flat()
4643   - : buildSubOrders()
4644   - }
4645   - isMainOrder={isMainOrder}
4646   - cancel={() => {
4647   - setFinancialVisible(false);
4648   - clearOptObject();
4649   - setIsMainOrder(false);
4650   - setIsEdit(false);
4651   - }}
4652   - onClose={() => {
4653   - setFinancialVisible(false);
4654   - clearOptObject();
4655   - refreshTable();
4656   - setIsMainOrder(false);
4657   - setIsEdit(false);
4658   - }}
4659   - />
4660   - )}
4661   -
4662   - {financialEditVisible && (
4663   - <FinancialEditDrawer
4664   - mainOrder={buildMainOrder()}
4665   - subOrders={buildSubOrders()}
4666   - isMainOrder={isMainOrder}
4667   - setVisible={() => {
4668   - setFinancialEditVisible(false);
4669   - clearOptObject();
4670   - }}
4671   - onClose={() => {
4672   - setFinancialEditVisible(false);
4673   - refreshTable();
4674   - setIsMainOrder(false);
4675   - clearOptObject();
4676   - }}
4677   - />
4678   - )}
4679   -
4680   - {orderPrintVisible && (
4681   - <OrderPrintModal
4682   - mainOrder={buildMainOrder()}
4683   - subOrders={buildSubOrders()}
4684   - isRePrint={isRePrintOrder}
4685   - setVisible={(val: boolean) => {
4686   - setOrderPrintVisible(val);
4687   - if (!val) {
4688   - clearOptObject();
4689   - }
4690   - }}
4691   - printOptType={orderCheckType}
4692   - onClose={() => {
4693   - setOrderPrintVisible(false);
4694   - clearOptObject();
4695   - setIsRePrintOrder(false);
4696   - refreshTable();
4697   - }}
4698   - />
4699   - )}
4700   -
4701   - {confirmReceiptVisible && (
4702   - <ConfirmReceiptModal
4703   - data={buildSubOrders()}
4704   - onClose={() => {
4705   - setConfirmReceiptVisible(false);
4706   - clearOptObject();
4707   - refreshTable();
4708   - }}
4709   - />
4710   - )}
4711   -
4712   - {imagesViewerModalVisible && (
4713   - <ImagesViewerModal
4714   - optType={imagesViewerOptType}
4715   - setVisible={(val: boolean) => {
4716   - setImagesViewerModalVisible(val);
4717   - if (!val) {
4718   - clearOptObject();
4719   - }
4720   - }}
4721   - onClose={() => {
4722   - setImagesViewerModalVisible(false);
4723   - }}
4724   - orderRow={buildSubOrders()[0]}
4725   - />
4726   - )}
4727   -
4728   - {importModalVisible && (
4729   - <ImportModal
4730   - onClose={() => {
4731   - setImportModalVisible(false);
4732   - refreshTable();
4733   - }}
4734   - />
4735   - )}
4736   -
4737   - {attachmentModalVisible && (
4738   - <AttachmentModal
4739   - data={buildSubOrders()[0]}
4740   - onClose={() => {
4741   - setAttachmentModalVisible(false);
4742   - clearOptObject();
4743   - }}
4744   - />
4745   - )}
4746   -
4747   - {historyModalVisible && (
4748   - <HistoryModal
4749   - subOrders={selectedRows}
4750   - isCancelledOrder={filterCondifion === 70}
4751   - onClose={() => {
4752   - setHistoryModalVisible(false);
4753   - setSelectedRows({});
4754   - clearOptObject();
4755   - }}
4756   - />
4757   - )}
4758   -
4759   - {deliverInfoDrawerVisible && (
4760   - <DeliverInfoDrawer
4761   - data={buildMainOrder()}
4762   - onClose={() => {
4763   - setDeliverInfoDrawerVisible(false);
4764   - clearOptObject();
4765   - }}
4766   - />
4767   - )}
4768   -
4769   - {deliverInfoDrawerVisible && (
4770   - <DeliverInfoDrawer
4771   - data={buildMainOrder()}
4772   - onClose={() => {
4773   - setDeliverInfoDrawerVisible(false);
4774   - clearOptObject();
4775   - }}
4776   - />
4777   - )}
4778   -
4779   - {procureCheckModalVisible && (
4780   - <ProcureCheckModal
4781   - setCheckVisible={(val: boolean) => {
4782   - setProcureCheckModalVisible(val);
4783   - if (!val) {
4784   - clearOptObject();
4785   - }
4786   - }}
4787   - isMainOrder={isMainOrder}
4788   - orders={
4789   - isMainOrder
4790   - ? [...subOrderSelectedMap.values()].flat()
4791   - : buildSubOrders()
4792   - }
4793   - onClose={() => {
4794   - setProcureCheckModalVisible(false);
4795   - clearOptObject();
4796   - setIsMainOrder(false);
4797   - refreshTable();
4798   - }}
4799   - />
4800   - )}
4801   -
4802   - {afterSalesDrawerVisible && (
4803   - <AfterSalesDrawer
4804   - setVisible={(val: boolean) => {
4805   - setAfterSalesDrawerVisible(val);
4806   - if (!val) {
4807   - clearOptObject();
4808   - }
4809   - }}
4810   - mainOrder={buildMainOrder()}
4811   - subOrders={buildSubOrders()}
4812   - onClose={() => {
4813   - setAfterSalesDrawerVisible(false);
4814   - clearOptObject();
4815   - refreshTable();
4816   - }}
4817   - />
4818   - )}
4819   -
4820   - {procureConvertModalVisible && (
4821   - <ProcureConvertModal
4822   - setVisible={(val: boolean) => {
4823   - setProcureConvertModalVisible(val);
4824   - if (!val) {
4825   - clearOptObject();
4826   - }
4827   - }}
4828   - subOrders={buildSubOrders()}
4829   - onClose={() => {
4830   - setProcureConvertModalVisible(false);
4831   - clearOptObject();
4832   - refreshTable();
4833   - }}
4834   - />
4835   - )}
4836   -
4837   - {financialMergeDrawerVisible && (
4838   - <FinancialMergeDrawer
4839   - setVisible={(val: boolean) => {
4840   - setFinancialMergeDrawerVisible(val);
4841   - if (!val) {
4842   - clearOptObject();
4843   - }
4844   - }}
4845   - dataList={
4846   - isMainOrder
4847   - ? [...subOrderSelectedMap.values()].flat()
4848   - : buildSubOrders()
4849   - }
4850   - onClose={() => {
4851   - setFinancialMergeDrawerVisible(false);
4852   - setIsMainOrder(false);
4853   - clearOptObject();
4854   - refreshTable();
4855   - }}
4856   - />
4857   - )}
4858   -
4859   - {financialReceiptsModalVisible && (
4860   - <FinancialReceiptsModal
4861   - setVisible={(val: boolean) => {
4862   - setFinancialReceiptsModalVisible(val);
4863   - if (!val) {
4864   - clearOptObject();
4865   - }
4866   - }}
4867   - datas={selectedRows}
4868   - onClose={() => {
4869   - setFinancialReceiptsModalVisible(false);
4870   - setSelectedRows({});
4871   - refreshTable();
4872   - }}
4873   - />
4874   - )}
4875   -
4876   - {shippingWarehouseChangeModalVisible && (
4877   - <ShippingWarehouseChangeModal
4878   - setVisible={(val: boolean) => {
4879   - setShippingWarehouseChangeModalVisible(val);
4880   - if (!val) {
4881   - clearOptObject();
4882   - }
4883   - }}
4884   - subOrderIds={ids}
4885   - originShippingWarehouse={buildSubOrders()[0].shippingWarehouse}
4886   - onClose={() => {
4887   - setShippingWarehouseChangeModalVisible(false);
4888   - clearOptObject();
4889   - setIds([]);
4890   - refreshTable();
4891   - }}
4892   - />
4893   - )}
4894   - {reissueVisible && (
4895   - <ReissueModal
4896   - setVisible={(val: boolean) => {
4897   - setReissueVisible(val);
4898   - if (!val) {
4899   - clearOptObject();
4900   - }
4901   - }}
4902   - subOrders={
4903   - isMainOrder
4904   - ? [...subOrderSelectedMap.values()].flat()
4905   - : buildSubOrders()
4906   - }
4907   - onClose={() => {
4908   - setReissueVisible(false);
4909   - clearOptObject();
4910   - refreshTable();
4911   - }}
4912   - />
4913   - )}
4914   - {reissueVisibleOld && (
4915   - <ReissueModal_old
4916   - setVisible={(val: boolean) => {
4917   - setReissueVisibleOld(val);
4918   - console.log(reissueVisible);
4919   - if (!val) {
4920   - clearOptObject();
4921   - }
4922   - }}
4923   - mainOrder={buildMainOrder()}
4924   - subOrders={buildSubOrders()}
4925   - onClose={() => {
4926   - setReissueVisibleOld(false);
4927   - clearOptObject();
4928   - refreshTable();
4929   - }}
4930   - />
4931   - )}
4932   - {productionTimeModalVisible && (
4933   - <ProductionTimeModal
4934   - setVisible={(val: boolean) => {
4935   - setProductionTimeModalVisible(val);
4936   - if (!val) {
4937   - clearOptObject();
4938   - }
4939   - }}
4940   - subOrders={buildSubOrders()}
4941   - onClose={() => {
4942   - setProductionTimeModalVisible(false);
4943   - clearOptObject();
4944   - refreshTable();
4945   - }}
4946   - />
4947   - )}
4948   -
4949   - {modifiedDiffModalVisible && (
4950   - <ModifiedDiffModal
4951   - setVisible={(val: boolean) => {
4952   - setModifiedDiffModalVisible(val);
4953   - if (!val) {
4954   - clearOptObject();
4955   - }
4956   - }}
4957   - subOrders={buildSubOrders()}
4958   - mainOrder={buildMainOrder()}
4959   - onClose={() => {
4960   - setModifiedDiffModalVisible(false);
4961   - clearOptObject();
4962   - }}
4963   - />
4964   - )}
4965   -
4966   - {uploadPayBillModalVisible && (
4967   - <UploadPayBillModal
4968   - setVisible={(val: boolean) => {
4969   - setUploadPayBillModalVisible(val);
4970   - if (!val) {
4971   - clearOptObject();
4972   - }
4973   - }}
4974   - subOrders={buildSubOrders()}
4975   - mainOrder={buildMainOrder()}
4976   - onClose={() => {
4977   - setUploadPayBillModalVisible(false);
4978   - clearOptObject();
4979   - refreshTable();
4980   - }}
4981   - />
4982   - )}
4983   - {invoicingDrawerFormVisible && (
4984   - <InvoicingDrawerForm
4985   - dataList={
4986   - isMainOrder
4987   - ? [...subOrderSelectedMap.values()].flat()
4988   - : buildSubOrders()
4989   - }
4990   - setVisible={(val: boolean) => {
4991   - setInvoicingDrawerFormVisible(val);
4992   - if (!val) {
4993   - clearOptObject();
4994   - }
4995   - }}
4996   - mainOrder={isMainOrder ? getFirstMainOrder() : buildMainOrder()}
4997   - onClose={() => {
4998   - setInvoicingDrawerFormVisible(false);
4999   - setIsMainOrder(true);
5000   - clearOptObject();
5001   - refreshTable();
5002   - }}
5003   - />
5004   - )}
5005   - {contextHolder}
5006   - <FloatButton.BackTop visibilityHeight={0} />
5007   - </div>
5008   - ),
5009   - },
5010   - {
5011   - key: '2',
5012   - label: (
5013   - <span>
5014   - 订单回款预警
5015   - <Badge count={invoiceRefundWarningNum} style={{ marginLeft: 8 }} />
5016   - </span>
5017   - ),
5018   - children: (
5019   - <div>
5020   - {/* <Radio.Group options={options2} onChange={radioOnChange2} value={value2} /> */}
5021   - <Radio.Group
5022   - value={value2}
5023   - onChange={radioOnChange2}
5024   - // 通过 onClick 处理单独 Radio 的点击事件
5025   - >
5026   - {options2.map((option) => (
  4290 + return (
  4291 + <div className="order-page-container">
  4292 + <div id="resizeDiv"></div>
  4293 + <div key={'activeTabKey'}>
  4294 + <Radio.Group
  4295 + options={warningOptions}
  4296 + onChange={(e) => {
  4297 + setActiveTabKey(e.target.value);
  4298 + mainTableRef.current?.reload(); // 重新请求数据
  4299 + }}
  4300 + value={activeTabKey}
  4301 + optionType="button"
  4302 + />
  4303 + </div>
  4304 + <div style={{ height: '25px' }}></div>
  4305 + <div
  4306 + style={{
  4307 + display: 'flex',
  4308 + justifyContent: 'space-between',
  4309 + alignItems: 'center',
  4310 + width: '100%',
  4311 + }}
  4312 + >
  4313 + {/* 左边的 Radio.Group */}
  4314 + <span style={{ flex: '1' }}>
  4315 + {' '}
  4316 + {/* 修改:设置 flex 属性 */}
  4317 + <Radio.Group value={value1} onChange={radioOnChange1}>
  4318 + {(activeTabKey === 1
  4319 + ? options1
  4320 + : activeTabKey === 2
  4321 + ? options2
  4322 + : activeTabKey === 3
  4323 + ? options3
  4324 + : options4
  4325 + ).map((option) => (
5027 4326 <Radio
5028 4327 key={option.value}
5029 4328 value={option.value}
5030 4329 onClick={(e) => {
5031   - radioOnChange2(
  4330 + radioOnChange1(
5032 4331 e as unknown as React.ChangeEvent<HTMLInputElement>,
5033 4332 );
5034   - handleSetNull2();
  4333 + handleSetNull();
5035 4334 }}
5036 4335 >
5037 4336 {option.label}
5038 4337 </Radio>
5039 4338 ))}
5040 4339 </Radio.Group>
5041   - <div style={{ height: '25px' }}></div>
5042   - <ProTable
5043   - id="main-table"
5044   - // tableStyle={{backgroundColor:'red'}}
5045   -
5046   - actionRef={mainTableSecondRef}
5047   - formRef={mainTableSecondFormRef}
5048   - expandIconColumnIndex={-1}
5049   - columns={mainOrdersColumns2}
5050   - rowKey="id"
5051   - pagination={{
5052   - showQuickJumper: true,
5053   - pageSize: pageSize,
5054   - current: currentPage,
5055   - showSizeChanger: true,
5056   - onChange: (page, size) => {
5057   - setPageSize(size);
5058   - setCurrentPage(page);
5059   - mainTableSecondRef.current?.reload();
5060   - },
5061   - showTotal: (total, range) => {
5062   - return (
5063   - <>
5064   - <span>
5065   - {'第 ' +
5066   - range[0] +
5067   - '-' +
5068   - range[1] +
5069   - ' 条/总共 ' +
5070   - total +
5071   - ' 条主订单 '}
5072   - </span>
5073   - <span className="text-[#8C8C8C]">
5074   - {' (' + subOrderCount + ' 条子订单)'}
5075   - </span>
5076   - </>
5077   - );
5078   - },
5079   - }}
5080   - // showHeader={false}
5081   - expandedRowKeys={expandedRowKeys}
5082   - // expandable={{ expandedRowRender }}
5083   - dateFormatter="string"
5084   - options={false}
5085   - headerTitle=""
5086   - search={false}
5087   - // labelWidth: 'auto',
5088   - // onCollapse: resize,
5089   - // request={request2}
5090   - request={activeTabKey === '2' ? request2 : null} // **条件请求**
5091   - toolbar={{
5092   - multipleLine: true,
5093   - }}
5094   - // toolBarRender={() => {
5095   - // return toolBarRender();
5096   - // }}
5097   - />
5098   -
5099   - {orderDrawerVisible && (
5100   - <OrderDrawer
5101   - data={orderOptType === 'add' ? {} : buildMainOrder()}
5102   - subOrders={orderOptType === 'add' ? [] : buildSubOrders()}
5103   - onClose={(isSuccess: boolean) => {
5104   - setOrderDrawerVisible(false);
5105   - clearOptObject();
5106   - if (isSuccess) {
5107   - refreshTable2();
5108   - }
5109   - }}
5110   - orderOptType={orderOptType}
5111   - />
5112   - )}
5113   -
5114   - {checkVisible && (
5115   - <CheckModal
5116   - setCheckVisible={(val: boolean) => {
5117   - setCheckVisible(val);
5118   - if (!val) {
5119   - clearOptObject();
5120   - }
5121   - }}
5122   - data={isMainOrder ? getFirstMainOrder() : buildMainOrder()}
5123   - subOrders={
5124   - isMainOrder
5125   - ? [...subOrderSelectedMap.values()].flat()
5126   - : buildSubOrders()
5127   - }
5128   - orderCheckType={orderCheckType}
5129   - openOrderDrawer={(type: any, id: any) => {
5130   - setCurrentMainId(id);
5131   - setOrderOptType(type);
5132   - setOrderDrawerVisible(true);
5133   - }}
5134   - onClose={() => {
5135   - clearOptObject();
5136   - setCheckVisible(false);
5137   - refreshTable2();
5138   - }}
5139   - />
5140   - )}
5141   -
5142   - {applyForInvoicingVisible && (
5143   - <ApplyForInvoicingModal
5144   - setCheckVisible={(val: boolean) => {
5145   - setApplyForInvoicingVisible(val);
5146   - if (!val) {
5147   - clearOptObject();
5148   - }
5149   - }}
5150   - subOrders={
5151   - isMainOrder
5152   - ? [...subOrderSelectedMap.values()].flat()
5153   - : buildSubOrders()
5154   - }
5155   - totalPayment={getApplyInvoicingTotalPayment()}
5156   - isMainOrder={isMainOrder}
5157   - isEdit={isEdit}
5158   - onClose={() => {
5159   - setApplyForInvoicingVisible(false);
5160   - setIsMainOrder(false);
5161   - clearOptObject();
5162   - refreshTable2();
5163   - }}
5164   - />
5165   - )}
5166   -
5167   - {notesEditVisible && (
5168   - <OrderNotesEditModal
5169   - setNotesEditVisible={(val: boolean) => {
5170   - setNotesEditVisible(val);
5171   - if (!val) {
5172   - clearOptObject();
5173   - }
5174   - }}
5175   - ids={selectedRows}
5176   - notesType={notesType}
5177   - notes={notes}
5178   - onClose={() => {
5179   - setNotesEditVisible(false);
5180   - setSelectedRows([]);
5181   - setNotes(notes);
5182   - setNotesType(1);
5183   - refreshTable2();
5184   - }}
5185   - />
5186   - )}
5187   -
5188   - {deliverVisible && (
5189   - <DeliverModal
5190   - data={buildSubOrders()}
5191   - isSendProduct={isSendProduct}
5192   - setVisible={(val: boolean) => {
5193   - setDeliverVisible(val);
5194   - if (!val) {
5195   - clearOptObject();
5196   - }
5197   - }}
5198   - sendType={orderCheckType}
5199   - onClose={() => {
5200   - clearOptObject();
5201   - setDeliverVisible(false);
5202   - setIsSendProduct(false);
5203   - refreshTable2();
5204   - }}
5205   - />
5206   - )}
5207   -
5208   - {financialVisible && (
5209   - <FinancialDrawer
5210   - isEdit={isEdit}
5211   - mainOrder={isMainOrder ? getFirstMainOrder() : buildMainOrder()}
5212   - subOrders={
5213   - isMainOrder
5214   - ? [...subOrderSelectedMap.values()].flat()
5215   - : buildSubOrders()
5216   - }
5217   - isMainOrder={isMainOrder}
5218   - cancel={() => {
5219   - setFinancialVisible(false);
5220   - clearOptObject();
5221   - setIsMainOrder(false);
5222   - setIsEdit(false);
5223   - }}
5224   - onClose={() => {
5225   - setFinancialVisible(false);
5226   - clearOptObject();
5227   - refreshTable2();
5228   - setIsMainOrder(false);
5229   - setIsEdit(false);
5230   - }}
5231   - />
5232   - )}
5233   -
5234   - {financialEditVisible && (
5235   - <FinancialEditDrawer
5236   - mainOrder={buildMainOrder()}
5237   - subOrders={buildSubOrders()}
5238   - isMainOrder={isMainOrder}
5239   - setVisible={() => {
5240   - setFinancialEditVisible(false);
5241   - clearOptObject();
5242   - }}
5243   - onClose={() => {
5244   - setFinancialEditVisible(false);
5245   - refreshTable2();
5246   - setIsMainOrder(false);
5247   - clearOptObject();
5248   - }}
5249   - />
5250   - )}
5251   -
5252   - {orderPrintVisible && (
5253   - <OrderPrintModal
5254   - mainOrder={buildMainOrder()}
5255   - subOrders={buildSubOrders()}
5256   - isRePrint={isRePrintOrder}
5257   - setVisible={(val: boolean) => {
5258   - setOrderPrintVisible(val);
5259   - if (!val) {
5260   - clearOptObject();
5261   - }
5262   - }}
5263   - printOptType={orderCheckType}
5264   - onClose={() => {
5265   - setOrderPrintVisible(false);
5266   - clearOptObject();
5267   - setIsRePrintOrder(false);
5268   - refreshTable2();
5269   - }}
5270   - />
5271   - )}
5272   -
5273   - {confirmReceiptVisible && (
5274   - <ConfirmReceiptModal
5275   - data={buildSubOrders()}
5276   - onClose={() => {
5277   - setConfirmReceiptVisible(false);
5278   - clearOptObject();
5279   - refreshTable2();
5280   - }}
5281   - />
5282   - )}
5283   -
5284   - {imagesViewerModalVisible && (
5285   - <ImagesViewerModal
5286   - optType={imagesViewerOptType}
5287   - setVisible={(val: boolean) => {
5288   - setImagesViewerModalVisible(val);
5289   - if (!val) {
5290   - clearOptObject();
5291   - }
5292   - }}
5293   - onClose={() => {
5294   - setImagesViewerModalVisible(false);
5295   - }}
5296   - orderRow={buildSubOrders()[0]}
5297   - />
5298   - )}
5299   -
5300   - {importModalVisible && (
5301   - <ImportModal
5302   - onClose={() => {
5303   - setImportModalVisible(false);
5304   - refreshTable2();
5305   - }}
5306   - />
5307   - )}
5308   -
5309   - {attachmentModalVisible && (
5310   - <AttachmentModal
5311   - data={buildSubOrders()[0]}
5312   - onClose={() => {
5313   - setAttachmentModalVisible(false);
5314   - clearOptObject();
5315   - }}
5316   - />
5317   - )}
5318   -
5319   - {historyModalVisible && (
5320   - <HistoryModal
5321   - subOrders={selectedRows}
5322   - isCancelledOrder={filterCondifion === 70}
5323   - onClose={() => {
5324   - setHistoryModalVisible(false);
5325   - setSelectedRows({});
5326   - clearOptObject();
5327   - }}
5328   - />
5329   - )}
5330   -
5331   - {deliverInfoDrawerVisible && (
5332   - <DeliverInfoDrawer
5333   - data={buildMainOrder()}
5334   - onClose={() => {
5335   - setDeliverInfoDrawerVisible(false);
5336   - clearOptObject();
5337   - }}
5338   - />
5339   - )}
5340   -
5341   - {deliverInfoDrawerVisible && (
5342   - <DeliverInfoDrawer
5343   - data={buildMainOrder()}
5344   - onClose={() => {
5345   - setDeliverInfoDrawerVisible(false);
5346   - clearOptObject();
5347   - }}
5348   - />
5349   - )}
5350   -
5351   - {procureCheckModalVisible && (
5352   - <ProcureCheckModal
5353   - setCheckVisible={(val: boolean) => {
5354   - setProcureCheckModalVisible(val);
5355   - if (!val) {
5356   - clearOptObject();
5357   - }
5358   - }}
5359   - isMainOrder={isMainOrder}
5360   - orders={
5361   - isMainOrder
5362   - ? [...subOrderSelectedMap.values()].flat()
5363   - : buildSubOrders()
5364   - }
5365   - onClose={() => {
5366   - setProcureCheckModalVisible(false);
5367   - clearOptObject();
5368   - setIsMainOrder(false);
5369   - refreshTable2();
5370   - }}
5371   - />
5372   - )}
5373   -
5374   - {afterSalesDrawerVisible && (
5375   - <AfterSalesDrawer
5376   - setVisible={(val: boolean) => {
5377   - setAfterSalesDrawerVisible(val);
5378   - if (!val) {
5379   - clearOptObject();
5380   - }
5381   - }}
5382   - mainOrder={buildMainOrder()}
5383   - subOrders={buildSubOrders()}
5384   - onClose={() => {
5385   - setAfterSalesDrawerVisible(false);
5386   - clearOptObject();
5387   - refreshTable2();
5388   - }}
5389   - />
5390   - )}
5391   -
5392   - {procureConvertModalVisible && (
5393   - <ProcureConvertModal
5394   - setVisible={(val: boolean) => {
5395   - setProcureConvertModalVisible(val);
5396   - if (!val) {
5397   - clearOptObject();
5398   - }
5399   - }}
5400   - subOrders={buildSubOrders()}
5401   - onClose={() => {
5402   - setProcureConvertModalVisible(false);
5403   - clearOptObject();
5404   - refreshTable2();
5405   - }}
5406   - />
5407   - )}
5408   -
5409   - {financialMergeDrawerVisible && (
5410   - <FinancialMergeDrawer
5411   - setVisible={(val: boolean) => {
5412   - setFinancialMergeDrawerVisible(val);
5413   - if (!val) {
5414   - clearOptObject();
5415   - }
5416   - }}
5417   - dataList={
5418   - isMainOrder
5419   - ? [...subOrderSelectedMap.values()].flat()
5420   - : buildSubOrders()
5421   - }
5422   - onClose={() => {
5423   - setFinancialMergeDrawerVisible(false);
5424   - setIsMainOrder(false);
5425   - clearOptObject();
5426   - refreshTable2();
5427   - }}
5428   - />
5429   - )}
5430   -
5431   - {financialReceiptsModalVisible && (
5432   - <FinancialReceiptsModal
5433   - setVisible={(val: boolean) => {
5434   - setFinancialReceiptsModalVisible(val);
5435   - if (!val) {
5436   - clearOptObject();
5437   - }
5438   - }}
5439   - datas={selectedRows}
5440   - onClose={() => {
5441   - setFinancialReceiptsModalVisible(false);
5442   - setSelectedRows({});
5443   - refreshTable2();
5444   - }}
5445   - />
5446   - )}
  4340 + </span>
5447 4341  
5448   - {shippingWarehouseChangeModalVisible && (
5449   - <ShippingWarehouseChangeModal
5450   - setVisible={(val: boolean) => {
5451   - setShippingWarehouseChangeModalVisible(val);
5452   - if (!val) {
5453   - clearOptObject();
5454   - }
5455   - }}
5456   - subOrderIds={ids}
5457   - originShippingWarehouse={buildSubOrders()[0].shippingWarehouse}
5458   - onClose={() => {
5459   - setShippingWarehouseChangeModalVisible(false);
5460   - clearOptObject();
5461   - setIds([]);
5462   - refreshTable2();
5463   - }}
5464   - />
5465   - )}
5466   - {reissueVisible && (
5467   - <ReissueModal
5468   - setVisible={(val: boolean) => {
5469   - setReissueVisible(val);
5470   - if (!val) {
5471   - clearOptObject();
5472   - }
5473   - }}
5474   - subOrders={
5475   - isMainOrder
5476   - ? [...subOrderSelectedMap.values()].flat()
5477   - : buildSubOrders()
5478   - }
5479   - onClose={() => {
5480   - setReissueVisible(false);
5481   - clearOptObject();
5482   - refreshTable2();
5483   - }}
5484   - />
5485   - )}
5486   - {reissueVisibleOld && (
5487   - <ReissueModal_old
5488   - setVisible={(val: boolean) => {
5489   - setReissueVisibleOld(val);
5490   - console.log(reissueVisible);
5491   - if (!val) {
5492   - clearOptObject();
  4342 + {/* 右边的 ProFormSelect */}
  4343 + <span style={{ width: '300px', marginLeft: 'auto', marginTop: '30px' }}>
  4344 + {' '}
  4345 + {/* 修改:设置 width 和 marginLeft */}
  4346 + {salesCodePermission && (
  4347 + <ProFormSelect
  4348 + name="salesCode"
  4349 + key="salesCode"
  4350 + width="200px"
  4351 + actionRef={mainTableRef}
  4352 + formRef={mainTableFormRef}
  4353 + initialValue={userInfo.username}
  4354 + showSearch
  4355 + label="销售代表"
  4356 + placeholder="请输入销售代表"
  4357 + options={salesCodeOptions}
  4358 + onChange={(_, option) => {
  4359 + if (option === undefined) {
  4360 + selectSalesCode(userInfo.username);
5493 4361 }
5494   - }}
5495   - mainOrder={buildMainOrder()}
5496   - subOrders={buildSubOrders()}
5497   - onClose={() => {
5498   - setReissueVisibleOld(false);
5499   - clearOptObject();
5500   - refreshTable2();
5501   - }}
5502   - />
5503   - )}
5504   - {productionTimeModalVisible && (
5505   - <ProductionTimeModal
5506   - setVisible={(val: boolean) => {
5507   - setProductionTimeModalVisible(val);
5508   - if (!val) {
5509   - clearOptObject();
5510   - }
5511   - }}
5512   - subOrders={buildSubOrders()}
5513   - onClose={() => {
5514   - setProductionTimeModalVisible(false);
5515   - clearOptObject();
5516   - refreshTable2();
5517   - }}
5518   - />
5519   - )}
5520   -
5521   - {modifiedDiffModalVisible && (
5522   - <ModifiedDiffModal
5523   - setVisible={(val: boolean) => {
5524   - setModifiedDiffModalVisible(val);
5525   - if (!val) {
5526   - clearOptObject();
  4362 + // if (option.value !== undefined) {
  4363 + // selectSalesCode(option.value);
  4364 + // }
  4365 + if (option && option.value !== undefined) {
  4366 + selectSalesCode(option.value);
5527 4367 }
  4368 + mainTableRef.current?.reload();
5528 4369 }}
5529   - subOrders={buildSubOrders()}
5530   - mainOrder={buildMainOrder()}
5531   - onClose={() => {
5532   - setModifiedDiffModalVisible(false);
5533   - clearOptObject();
  4370 + request={async () => {
  4371 + let options = await getSalesCodeOptions();
  4372 + setSalesCodeOptions(options);
  4373 + return options;
5534 4374 }}
5535 4375 />
5536 4376 )}
  4377 + </span>
  4378 + </div>
5537 4379  
5538   - {uploadPayBillModalVisible && (
5539   - <UploadPayBillModal
5540   - setVisible={(val: boolean) => {
5541   - setUploadPayBillModalVisible(val);
5542   - if (!val) {
5543   - clearOptObject();
5544   - }
5545   - }}
5546   - subOrders={buildSubOrders()}
5547   - mainOrder={buildMainOrder()}
5548   - onClose={() => {
5549   - setUploadPayBillModalVisible(false);
5550   - clearOptObject();
5551   - refreshTable2();
5552   - }}
5553   - />
5554   - )}
5555   - {invoicingDrawerFormVisible && (
5556   - <InvoicingDrawerForm
5557   - dataList={
5558   - isMainOrder
5559   - ? [...subOrderSelectedMap.values()].flat()
5560   - : buildSubOrders()
5561   - }
5562   - setVisible={(val: boolean) => {
5563   - setInvoicingDrawerFormVisible(val);
5564   - if (!val) {
5565   - clearOptObject();
5566   - }
5567   - }}
5568   - mainOrder={isMainOrder ? getFirstMainOrder() : buildMainOrder()}
5569   - onClose={() => {
5570   - setInvoicingDrawerFormVisible(false);
5571   - setIsMainOrder(true);
5572   - clearOptObject();
5573   - refreshTable2();
5574   - }}
5575   - />
5576   - )}
5577   - {contextHolder}
5578   - <FloatButton.BackTop visibilityHeight={0} />
5579   - </div>
5580   - ),
5581   - },
5582   - ];
  4380 + <div style={{ height: '15px' }}></div>
  4381 + <ProTable
  4382 + id="main-table"
  4383 + // tableStyle={{backgroundColor:'red'}}
5583 4384  
5584   - return (
5585   - <div className="order-page-container">
5586   - <div id="resizeDiv"></div>
5587   - {/* <Tabs defaultActiveKey="1" items={tabsItems} onChange={() => { }} /> */}
5588   - <Tabs
5589   - defaultActiveKey="1"
5590   - items={tabsItems}
5591   - onChange={(key) => {
5592   - setActiveTabKey(key); // **修改位置:更新 activeTabKey**
5593   - if (key === '1') {
5594   - setActiveTabKey(key); // **修改位置:更新 activeTabKey**
5595   - mainTableRef.current?.reload(); // **请求主订单的 request**
5596   - } else if (key === '2') {
5597   - setActiveTabKey(key); // **修改位置:更新 activeTabKey**
5598   - mainTableSecondRef.current?.reload(); // **请求订单回款的 request2**
  4385 + actionRef={mainTableRef}
  4386 + formRef={mainTableFormRef}
  4387 + expandIconColumnIndex={-1}
  4388 + columns={mainOrdersColumns}
  4389 + rowKey="id"
  4390 + pagination={{
  4391 + showQuickJumper: true,
  4392 + pageSize: pageSize,
  4393 + current: currentPage,
  4394 + showSizeChanger: true,
  4395 + onChange: (page, size) => {
  4396 + setPageSize(size);
  4397 + setCurrentPage(page);
  4398 + },
  4399 + showTotal: (total, range) => {
  4400 + return (
  4401 + <>
  4402 + <span>
  4403 + {'第 ' +
  4404 + range[0] +
  4405 + '-' +
  4406 + range[1] +
  4407 + ' 条/总共 ' +
  4408 + total +
  4409 + ' 条主订单 '}
  4410 + </span>
  4411 + <span className="text-[#8C8C8C]">
  4412 + {' (' + subOrderCount + ' 条子订单)'}
  4413 + </span>
  4414 + </>
  4415 + );
  4416 + },
  4417 + }}
  4418 + // showHeader={false}
  4419 + expandedRowKeys={expandedRowKeys}
  4420 + // expandable={{ expandedRowRender }}
  4421 + dateFormatter="string"
  4422 + options={false}
  4423 + headerTitle=""
  4424 + search={false}
  4425 + request={async (
  4426 + // 第一个参数 params 查询表单和 params 参数的结合
  4427 + // 第一个参数中一定会有 pageSize 和 current ,这两个参数是 antd 的规范
  4428 + params,
  4429 + sorter,
  4430 + filter,
  4431 + ) => {
  4432 + //订单id处理
  4433 + /**
  4434 + * 以params中的id为主,如果params没id,则取url中的id
  4435 + * 第一次进来这个页面,url带有id的话,会自动填充到查询表单中,但是第一次查询params不会带这个id进来
  4436 + */
  4437 + let orderIds = mainTableFormRef.current?.getFieldValue('id');
  4438 + let subOrderId =
  4439 + mainTableFormRef.current?.getFieldValue('subOrderId');
  4440 + params.id = params.id || orderIds;
  4441 + params.subOrderId = params.subOrderId || subOrderId;
  4442 + if (params.id !== '') {
  4443 + params.id = params.id?.replace(/ /g, '');
  4444 + if (params.id?.indexOf(',')) {
  4445 + params.id = params.id.split(',');
  4446 + params.id = params.id.filter((id) => {
  4447 + return id !== '';
  4448 + });
  4449 + }
  4450 + }
  4451 + params.salesCode = userInfo.username;
  4452 + params.condition = filterCondifion;
  4453 + //排序
  4454 + params.sorted = sorted;
  4455 + //是否只查看已作废
  4456 + params.isDeleteQueryOrder = filterCondifion === 70;
  4457 + let finalParams = {
  4458 + ...params,
  4459 + };
  4460 + if (value1 === 0) {
  4461 + // const currentDate = new Date();
  4462 + // const newDate = new Date(currentDate);
  4463 + // newDate.setDate(currentDate.getDate() - 0);
  4464 + handleSetNull();
  4465 + }
  4466 + if (activeTabKey === 1) {
  4467 + // // 第一段代码
  4468 + // if (calDate === 'null') {
  4469 + // params.applyTimeLe = null;
  4470 + // } else {
  4471 + // params.applyTimeLe = calDate;
  4472 + // }
  4473 + // params.applyTimeIsNotNull = true; // 要求申请时间非空
  4474 + params.orderStatus = 'SHIPPED'; // 发票确认预警
  4475 + params.isDeleteQueryOrder = false; // 强制查询非作废订单
  4476 + console.log(userInfo, '5656userInfo');
  4477 + params.salesCode = userInfo.username;
  4478 + if (salesCodeSelect !== undefined && salesCodeSelect !== null) {
  4479 + params.salesCode = salesCodeSelect;
  4480 + }
  4481 + // params.paymentMethod = 'UNPAID';
  4482 + finalParams = {
  4483 + ...params,
  4484 + statusDatetimeLe: calDate,
  4485 + };
  4486 + } else if (activeTabKey === 2) {
  4487 + // // 第一段代码
  4488 + // if (calDate === 'null') {
  4489 + // params.applyTimeLe = null;
  4490 + // } else {
  4491 + // params.applyTimeLe = calDate;
  4492 + // }
  4493 + // params.applyTimeIsNotNull = true; // 要求申请时间非空
  4494 + params.salesCode = userInfo.username;
  4495 + if (salesCodeSelect !== undefined && salesCodeSelect !== null) {
  4496 + params.salesCode = salesCodeSelect;
  4497 + }
  4498 + params.warningStatus = 'waitFeedbackWarning'; // 发票确认预警
  4499 + params.isDeleteQueryOrder = false; // 强制查询非作废订单
  4500 + // params.paymentMethod = 'UNPAID';
  4501 + finalParams = {
  4502 + ...params,
  4503 + confirmReceiptDatetimeLe: calDate,
  4504 + };
  4505 + } else if (activeTabKey === 3) {
  4506 + // 第一段代码
  4507 + // if (calDate === 'null') {
  4508 + // params.applyTimeLe = null;
  4509 + // } else {
  4510 + // params.applyTimeLe = calDate;
  4511 + // }
  4512 + // params.applyTimeIsNotNull = true; // 要求申请时间非空
  4513 + params.salesCode = userInfo.username;
  4514 + if (salesCodeSelect !== undefined && salesCodeSelect !== null) {
  4515 + params.salesCode = salesCodeSelect;
  4516 + }
  4517 + params.warningStatus = 'invoiceConfirmWarning'; // 发票确认预警
  4518 + params.isDeleteQueryOrder = false; // 强制查询非作废订单
  4519 + // params.paymentMethod = 'UNPAID';
  4520 + finalParams = {
  4521 + ...params,
  4522 + invoicingEndTime: calDate,
  4523 + };
  4524 + } else if (activeTabKey === 4) {
  4525 + params.warningStatus = 'paymentReceiptStatusWarning'; // 用于回款预警
  4526 + if (calDate === 'null') {
  4527 + params.applyTimeLe = null;
  4528 + } else {
  4529 + params.applyTimeLe = calDate;
  4530 + }
  4531 + params.salesCode = userInfo.username;
  4532 + if (salesCodeSelect !== undefined && salesCodeSelect !== null) {
  4533 + params.salesCode = salesCodeSelect;
  4534 + }
  4535 + params.isDeleteQueryOrder = false; // 强制查询非作废订单
  4536 + params.paymentNotReceipt = true; // 在回款预警中标记未支付订单
  4537 + finalParams = {
  4538 + ...params,
  4539 + };
  4540 + }
  4541 + //保存这个搜索条件
  4542 + setSearchParam(params);
  4543 + const { data } = await postServiceOrderQueryServiceOrder({
  4544 + // ...params,
  4545 + // FIXME: remove @ts-ignore
  4546 + // @ts-ignore
  4547 + sorter,
  4548 + filter,
  4549 + data: finalParams,
  4550 + });
  4551 +
  4552 + setRolePath(data.specialPath);
  4553 + setSubOrderCount(data.count);
  4554 + setAllMainChecked(false);
  4555 + setSelectedMainOrderKeys([]);
  4556 + subOrderSelectedMap.clear();
  4557 + mainOrderSelectedMap.clear();
  4558 + setData(data?.data);
  4559 +
  4560 + //主订单id与子订单id的对照关系保存
  4561 + mainOrderIdSubOrderIdRelationsMap.clear();
  4562 + for (let row of data?.data) {
  4563 + let mianOrderId = row.id;
  4564 + let subOrderIds = row.subOrderInformationLists?.map((item) => {
  4565 + //目前子订单存储的totalPayment不准确,这里重新处理取主订单的totalPayment
  4566 + //totalPayment在财务开票计算金额时使用到
  4567 + item.totalPayment = row.totalPayment;
  4568 + return item.id;
  4569 + });
  4570 + mainOrderIdSubOrderIdRelationsMap.set(mianOrderId, subOrderIds);
5599 4571 }
  4572 + // 请求完成后触发 getInvoiceWarningNum
  4573 + getInvoiceWarningNum();
  4574 + return {
  4575 + data: data?.data || [],
  4576 + total: data?.total || 0,
  4577 + };
5600 4578 }}
  4579 + toolbar={{
  4580 + multipleLine: true,
  4581 + }}
  4582 + // toolBarRender={() => {
  4583 + // return toolBarRender();
  4584 + // }}
5601 4585 />
  4586 +
  4587 + {orderDrawerVisible && (
  4588 + <OrderDrawer
  4589 + data={orderOptType === 'add' ? {} : buildMainOrder()}
  4590 + subOrders={orderOptType === 'add' ? [] : buildSubOrders()}
  4591 + onClose={(isSuccess: boolean) => {
  4592 + setOrderDrawerVisible(false);
  4593 + clearOptObject();
  4594 + if (isSuccess) {
  4595 + refreshTable();
  4596 + }
  4597 + }}
  4598 + orderOptType={orderOptType}
  4599 + />
  4600 + )}
  4601 +
  4602 + {checkVisible && (
  4603 + <CheckModal
  4604 + setCheckVisible={(val: boolean) => {
  4605 + setCheckVisible(val);
  4606 + if (!val) {
  4607 + clearOptObject();
  4608 + }
  4609 + }}
  4610 + data={isMainOrder ? getFirstMainOrder() : buildMainOrder()}
  4611 + subOrders={
  4612 + isMainOrder
  4613 + ? [...subOrderSelectedMap.values()].flat()
  4614 + : buildSubOrders()
  4615 + }
  4616 + orderCheckType={orderCheckType}
  4617 + openOrderDrawer={(type: any, id: any) => {
  4618 + setCurrentMainId(id);
  4619 + setOrderOptType(type);
  4620 + setOrderDrawerVisible(true);
  4621 + }}
  4622 + onClose={() => {
  4623 + clearOptObject();
  4624 + setCheckVisible(false);
  4625 + refreshTable();
  4626 + }}
  4627 + />
  4628 + )}
  4629 +
  4630 + {applyForInvoicingVisible && (
  4631 + <ApplyForInvoicingModal
  4632 + setCheckVisible={(val: boolean) => {
  4633 + setApplyForInvoicingVisible(val);
  4634 + if (!val) {
  4635 + clearOptObject();
  4636 + }
  4637 + }}
  4638 + subOrders={
  4639 + isMainOrder
  4640 + ? [...subOrderSelectedMap.values()].flat()
  4641 + : buildSubOrders()
  4642 + }
  4643 + totalPayment={getApplyInvoicingTotalPayment()}
  4644 + isMainOrder={isMainOrder}
  4645 + isEdit={isEdit}
  4646 + onClose={() => {
  4647 + setApplyForInvoicingVisible(false);
  4648 + setIsMainOrder(false);
  4649 + clearOptObject();
  4650 + refreshTable();
  4651 + }}
  4652 + />
  4653 + )}
  4654 +
  4655 + {notesEditVisible && (
  4656 + <OrderNotesEditModal
  4657 + setNotesEditVisible={(val: boolean) => {
  4658 + setNotesEditVisible(val);
  4659 + if (!val) {
  4660 + clearOptObject();
  4661 + }
  4662 + }}
  4663 + ids={selectedRows}
  4664 + notesType={notesType}
  4665 + notes={notes}
  4666 + onClose={() => {
  4667 + setNotesEditVisible(false);
  4668 + setSelectedRows([]);
  4669 + setNotes(notes);
  4670 + setNotesType(1);
  4671 + refreshTable();
  4672 + }}
  4673 + />
  4674 + )}
  4675 +
  4676 + {deliverVisible && (
  4677 + <DeliverModal
  4678 + data={buildSubOrders()}
  4679 + isSendProduct={isSendProduct}
  4680 + setVisible={(val: boolean) => {
  4681 + setDeliverVisible(val);
  4682 + if (!val) {
  4683 + clearOptObject();
  4684 + }
  4685 + }}
  4686 + sendType={orderCheckType}
  4687 + onClose={() => {
  4688 + clearOptObject();
  4689 + setDeliverVisible(false);
  4690 + setIsSendProduct(false);
  4691 + refreshTable();
  4692 + }}
  4693 + />
  4694 + )}
  4695 +
  4696 + {financialVisible && (
  4697 + <FinancialDrawer
  4698 + isEdit={isEdit}
  4699 + mainOrder={isMainOrder ? getFirstMainOrder() : buildMainOrder()}
  4700 + subOrders={
  4701 + isMainOrder
  4702 + ? [...subOrderSelectedMap.values()].flat()
  4703 + : buildSubOrders()
  4704 + }
  4705 + isMainOrder={isMainOrder}
  4706 + cancel={() => {
  4707 + setFinancialVisible(false);
  4708 + clearOptObject();
  4709 + setIsMainOrder(false);
  4710 + setIsEdit(false);
  4711 + }}
  4712 + onClose={() => {
  4713 + setFinancialVisible(false);
  4714 + clearOptObject();
  4715 + refreshTable();
  4716 + setIsMainOrder(false);
  4717 + setIsEdit(false);
  4718 + }}
  4719 + />
  4720 + )}
  4721 +
  4722 + {financialEditVisible && (
  4723 + <FinancialEditDrawer
  4724 + mainOrder={buildMainOrder()}
  4725 + subOrders={buildSubOrders()}
  4726 + isMainOrder={isMainOrder}
  4727 + setVisible={() => {
  4728 + setFinancialEditVisible(false);
  4729 + clearOptObject();
  4730 + }}
  4731 + onClose={() => {
  4732 + setFinancialEditVisible(false);
  4733 + refreshTable();
  4734 + setIsMainOrder(false);
  4735 + clearOptObject();
  4736 + }}
  4737 + />
  4738 + )}
  4739 +
  4740 + {orderPrintVisible && (
  4741 + <OrderPrintModal
  4742 + mainOrder={buildMainOrder()}
  4743 + subOrders={buildSubOrders()}
  4744 + isRePrint={isRePrintOrder}
  4745 + setVisible={(val: boolean) => {
  4746 + setOrderPrintVisible(val);
  4747 + if (!val) {
  4748 + clearOptObject();
  4749 + }
  4750 + }}
  4751 + printOptType={orderCheckType}
  4752 + onClose={() => {
  4753 + setOrderPrintVisible(false);
  4754 + clearOptObject();
  4755 + setIsRePrintOrder(false);
  4756 + refreshTable();
  4757 + }}
  4758 + />
  4759 + )}
  4760 +
  4761 + {confirmReceiptVisible && (
  4762 + <ConfirmReceiptModal
  4763 + data={buildSubOrders()}
  4764 + onClose={() => {
  4765 + setConfirmReceiptVisible(false);
  4766 + clearOptObject();
  4767 + refreshTable();
  4768 + }}
  4769 + />
  4770 + )}
  4771 +
  4772 + {imagesViewerModalVisible && (
  4773 + <ImagesViewerModal
  4774 + optType={imagesViewerOptType}
  4775 + setVisible={(val: boolean) => {
  4776 + setImagesViewerModalVisible(val);
  4777 + if (!val) {
  4778 + clearOptObject();
  4779 + }
  4780 + }}
  4781 + onClose={() => {
  4782 + setImagesViewerModalVisible(false);
  4783 + }}
  4784 + orderRow={buildSubOrders()[0]}
  4785 + />
  4786 + )}
  4787 +
  4788 + {importModalVisible && (
  4789 + <ImportModal
  4790 + onClose={() => {
  4791 + setImportModalVisible(false);
  4792 + refreshTable();
  4793 + }}
  4794 + />
  4795 + )}
  4796 +
  4797 + {attachmentModalVisible && (
  4798 + <AttachmentModal
  4799 + data={buildSubOrders()[0]}
  4800 + onClose={() => {
  4801 + setAttachmentModalVisible(false);
  4802 + clearOptObject();
  4803 + }}
  4804 + />
  4805 + )}
  4806 +
  4807 + {historyModalVisible && (
  4808 + <HistoryModal
  4809 + subOrders={selectedRows}
  4810 + isCancelledOrder={filterCondifion === 70}
  4811 + onClose={() => {
  4812 + setHistoryModalVisible(false);
  4813 + setSelectedRows({});
  4814 + clearOptObject();
  4815 + }}
  4816 + />
  4817 + )}
  4818 +
  4819 + {deliverInfoDrawerVisible && (
  4820 + <DeliverInfoDrawer
  4821 + data={buildMainOrder()}
  4822 + onClose={() => {
  4823 + setDeliverInfoDrawerVisible(false);
  4824 + clearOptObject();
  4825 + }}
  4826 + />
  4827 + )}
  4828 +
  4829 + {deliverInfoDrawerVisible && (
  4830 + <DeliverInfoDrawer
  4831 + data={buildMainOrder()}
  4832 + onClose={() => {
  4833 + setDeliverInfoDrawerVisible(false);
  4834 + clearOptObject();
  4835 + }}
  4836 + />
  4837 + )}
  4838 +
  4839 + {procureCheckModalVisible && (
  4840 + <ProcureCheckModal
  4841 + setCheckVisible={(val: boolean) => {
  4842 + setProcureCheckModalVisible(val);
  4843 + if (!val) {
  4844 + clearOptObject();
  4845 + }
  4846 + }}
  4847 + isMainOrder={isMainOrder}
  4848 + orders={
  4849 + isMainOrder
  4850 + ? [...subOrderSelectedMap.values()].flat()
  4851 + : buildSubOrders()
  4852 + }
  4853 + onClose={() => {
  4854 + setProcureCheckModalVisible(false);
  4855 + clearOptObject();
  4856 + setIsMainOrder(false);
  4857 + refreshTable();
  4858 + }}
  4859 + />
  4860 + )}
  4861 +
  4862 + {afterSalesDrawerVisible && (
  4863 + <AfterSalesDrawer
  4864 + setVisible={(val: boolean) => {
  4865 + setAfterSalesDrawerVisible(val);
  4866 + if (!val) {
  4867 + clearOptObject();
  4868 + }
  4869 + }}
  4870 + mainOrder={buildMainOrder()}
  4871 + subOrders={buildSubOrders()}
  4872 + onClose={() => {
  4873 + setAfterSalesDrawerVisible(false);
  4874 + clearOptObject();
  4875 + refreshTable();
  4876 + }}
  4877 + />
  4878 + )}
  4879 +
  4880 + {procureConvertModalVisible && (
  4881 + <ProcureConvertModal
  4882 + setVisible={(val: boolean) => {
  4883 + setProcureConvertModalVisible(val);
  4884 + if (!val) {
  4885 + clearOptObject();
  4886 + }
  4887 + }}
  4888 + subOrders={buildSubOrders()}
  4889 + onClose={() => {
  4890 + setProcureConvertModalVisible(false);
  4891 + clearOptObject();
  4892 + refreshTable();
  4893 + }}
  4894 + />
  4895 + )}
  4896 +
  4897 + {financialMergeDrawerVisible && (
  4898 + <FinancialMergeDrawer
  4899 + setVisible={(val: boolean) => {
  4900 + setFinancialMergeDrawerVisible(val);
  4901 + if (!val) {
  4902 + clearOptObject();
  4903 + }
  4904 + }}
  4905 + dataList={
  4906 + isMainOrder
  4907 + ? [...subOrderSelectedMap.values()].flat()
  4908 + : buildSubOrders()
  4909 + }
  4910 + onClose={() => {
  4911 + setFinancialMergeDrawerVisible(false);
  4912 + setIsMainOrder(false);
  4913 + clearOptObject();
  4914 + refreshTable();
  4915 + }}
  4916 + />
  4917 + )}
  4918 +
  4919 + {financialReceiptsModalVisible && (
  4920 + <FinancialReceiptsModal
  4921 + setVisible={(val: boolean) => {
  4922 + setFinancialReceiptsModalVisible(val);
  4923 + if (!val) {
  4924 + clearOptObject();
  4925 + }
  4926 + }}
  4927 + datas={selectedRows}
  4928 + onClose={() => {
  4929 + setFinancialReceiptsModalVisible(false);
  4930 + setSelectedRows({});
  4931 + refreshTable();
  4932 + }}
  4933 + />
  4934 + )}
  4935 +
  4936 + {shippingWarehouseChangeModalVisible && (
  4937 + <ShippingWarehouseChangeModal
  4938 + setVisible={(val: boolean) => {
  4939 + setShippingWarehouseChangeModalVisible(val);
  4940 + if (!val) {
  4941 + clearOptObject();
  4942 + }
  4943 + }}
  4944 + subOrderIds={ids}
  4945 + originShippingWarehouse={buildSubOrders()[0].shippingWarehouse}
  4946 + onClose={() => {
  4947 + setShippingWarehouseChangeModalVisible(false);
  4948 + clearOptObject();
  4949 + setIds([]);
  4950 + refreshTable();
  4951 + }}
  4952 + />
  4953 + )}
  4954 + {reissueVisible && (
  4955 + <ReissueModal
  4956 + setVisible={(val: boolean) => {
  4957 + setReissueVisible(val);
  4958 + if (!val) {
  4959 + clearOptObject();
  4960 + }
  4961 + }}
  4962 + subOrders={
  4963 + isMainOrder
  4964 + ? [...subOrderSelectedMap.values()].flat()
  4965 + : buildSubOrders()
  4966 + }
  4967 + onClose={() => {
  4968 + setReissueVisible(false);
  4969 + clearOptObject();
  4970 + refreshTable();
  4971 + }}
  4972 + />
  4973 + )}
  4974 + {reissueVisibleOld && (
  4975 + <ReissueModal_old
  4976 + setVisible={(val: boolean) => {
  4977 + setReissueVisibleOld(val);
  4978 + console.log(reissueVisible);
  4979 + if (!val) {
  4980 + clearOptObject();
  4981 + }
  4982 + }}
  4983 + mainOrder={buildMainOrder()}
  4984 + subOrders={buildSubOrders()}
  4985 + onClose={() => {
  4986 + setReissueVisibleOld(false);
  4987 + clearOptObject();
  4988 + refreshTable();
  4989 + }}
  4990 + />
  4991 + )}
  4992 + {productionTimeModalVisible && (
  4993 + <ProductionTimeModal
  4994 + setVisible={(val: boolean) => {
  4995 + setProductionTimeModalVisible(val);
  4996 + if (!val) {
  4997 + clearOptObject();
  4998 + }
  4999 + }}
  5000 + subOrders={buildSubOrders()}
  5001 + onClose={() => {
  5002 + setProductionTimeModalVisible(false);
  5003 + clearOptObject();
  5004 + refreshTable();
  5005 + }}
  5006 + />
  5007 + )}
  5008 +
  5009 + {modifiedDiffModalVisible && (
  5010 + <ModifiedDiffModal
  5011 + setVisible={(val: boolean) => {
  5012 + setModifiedDiffModalVisible(val);
  5013 + if (!val) {
  5014 + clearOptObject();
  5015 + }
  5016 + }}
  5017 + subOrders={buildSubOrders()}
  5018 + mainOrder={buildMainOrder()}
  5019 + onClose={() => {
  5020 + setModifiedDiffModalVisible(false);
  5021 + clearOptObject();
  5022 + }}
  5023 + />
  5024 + )}
  5025 +
  5026 + {uploadPayBillModalVisible && (
  5027 + <UploadPayBillModal
  5028 + setVisible={(val: boolean) => {
  5029 + setUploadPayBillModalVisible(val);
  5030 + if (!val) {
  5031 + clearOptObject();
  5032 + }
  5033 + }}
  5034 + subOrders={buildSubOrders()}
  5035 + mainOrder={buildMainOrder()}
  5036 + onClose={() => {
  5037 + setUploadPayBillModalVisible(false);
  5038 + clearOptObject();
  5039 + refreshTable();
  5040 + }}
  5041 + />
  5042 + )}
  5043 + {feedbackRegistrationModalVisible && (
  5044 + <FeedbackRegistrationModal
  5045 + setVisible={(val: boolean) => {
  5046 + setFeedbackRegistrationModalVisible(val);
  5047 + if (!val) {
  5048 + clearOptObject();
  5049 + }
  5050 + }}
  5051 + subOrders={buildSubOrders()}
  5052 + mainOrder={buildMainOrder()}
  5053 + onClose={() => {
  5054 + setFeedbackRegistrationModalVisible(false);
  5055 + clearOptObject();
  5056 + refreshTable();
  5057 + }}
  5058 + />
  5059 + )}
  5060 +
  5061 + {invoicingDrawerFormVisible && (
  5062 + <InvoicingDrawerForm
  5063 + dataList={
  5064 + isMainOrder
  5065 + ? [...subOrderSelectedMap.values()].flat()
  5066 + : buildSubOrders()
  5067 + }
  5068 + setVisible={(val: boolean) => {
  5069 + setInvoicingDrawerFormVisible(val);
  5070 + if (!val) {
  5071 + clearOptObject();
  5072 + }
  5073 + }}
  5074 + mainOrder={isMainOrder ? getFirstMainOrder() : buildMainOrder()}
  5075 + onClose={() => {
  5076 + setInvoicingDrawerFormVisible(false);
  5077 + setIsMainOrder(true);
  5078 + clearOptObject();
  5079 + refreshTable();
  5080 + }}
  5081 + />
  5082 + )}
  5083 + {contextHolder}
  5084 + <FloatButton.BackTop visibilityHeight={0} />
5602 5085 </div>
5603 5086 );
5604 5087 };
... ...
src/pages/Order/WarningWhitelist/index.css deleted 100644 → 0
src/pages/Order/WarningWhitelist/index.less deleted 100644 → 0
src/pages/Order/WarningWhitelist/index.tsx
1   -import {
2   - ActionType,
3   - ModalForm,
4   - ProColumns,
5   - ProFormText,
6   - ProTable,
7   -} from '@ant-design/pro-components';
8   -import {
9   - Button,
10   - Checkbox,
11   - Divider,
12   - Dropdown,
13   - Flex,
14   - FloatButton,
15   - Image,
16   - MenuProps,
17   - Modal,
18   - Popconfirm,
19   - Radio,
20   - Space,
21   - Spin,
22   - Tag,
23   - Tooltip,
24   - message,
25   - Tabs,
26   -} from 'antd';
27 1 import ButtonConfirm from '@/components/ButtomConfirm';
28 2 import { RESPONSE_CODE } from '@/constants/enum';
29 3 import {
30   - postOldInvoicingWhiteListBatchAdd,
31   - postOldInvoicingWhiteListPage,
32   - postOldInvoicingWhiteListRemove,
33   - postServiceOrderWarningUserWhiteLists,
  4 + postServiceOrderAddWarningOrderWhiteList,
34 5 postServiceOrderAddWarningUserWhiteList,
  6 + postServiceOrderDeleteWarningOrderWhiteList,
35 7 postServiceOrderDeleteWarningUserWhiteList,
36 8 postServiceOrderWarningOrderWhiteLists,
37   - postServiceOrderAddWarningOrderWhiteList,
38   - postServiceOrderDeleteWarningOrderWhiteList,
  9 + postServiceOrderWarningUserWhiteLists,
39 10 } from '@/services';
40 11 import { PlusOutlined } from '@ant-design/icons';
  12 +import {
  13 + ActionType,
  14 + ModalForm,
  15 + ProColumns,
  16 + ProFormText,
  17 + ProTable,
  18 +} from '@ant-design/pro-components';
  19 +import { Button, Tabs, message } from 'antd';
41 20 import { useRef } from 'react';
42 21 export const waitTimePromise = async (time: number = 100) => {
43 22 return new Promise((resolve) => {
... ... @@ -134,9 +113,9 @@ const WarningWhitelist = () =&gt; {
134 113 search: {
135 114 transform: (value) => {
136 115 if (value) {
137   - console.log(value, '5656valueid')
  116 + console.log(value, '5656valueid');
138 117 return {
139   - orderId: Number(value)
  118 + orderId: Number(value),
140 119 };
141 120 }
142 121 },
... ... @@ -186,7 +165,7 @@ const WarningWhitelist = () =&gt; {
186 165 title={'确认删除此项吗?'}
187 166 text="删除"
188 167 onConfirm={async () => {
189   - console.log(record.orderId, '5656idoreder')
  168 + console.log(record.orderId, '5656idoreder');
190 169 await postServiceOrderDeleteWarningOrderWhiteList({
191 170 query: {
192 171 orderId: record.orderId,
... ... @@ -213,7 +192,7 @@ const WarningWhitelist = () =&gt; {
213 192 const res = await postServiceOrderWarningUserWhiteLists({
214 193 data: { ...params },
215 194 });
216   - console.log(res.data, '5656res.data')
  195 + console.log(res.data, '5656res.data');
217 196 return res.data;
218 197 }}
219 198 rowKey="id"
... ... @@ -281,7 +260,7 @@ const WarningWhitelist = () =&gt; {
281 260 ]}
282 261 />
283 262 </div>
284   - )
  263 + ),
285 264 },
286 265 {
287 266 key: 2,
... ... @@ -334,7 +313,7 @@ const WarningWhitelist = () =&gt; {
334 313 console.log(values, '5656values');
335 314 const res = await postServiceOrderAddWarningOrderWhiteList({
336 315 data: {
337   - orderId: values.orderIdsText
  316 + orderId: values.orderIdsText,
338 317 },
339 318 });
340 319 if (res.result === RESPONSE_CODE.SUCCESS) {
... ... @@ -361,9 +340,9 @@ const WarningWhitelist = () =&gt; {
361 340 ]}
362 341 />
363 342 </div>
364   - )
365   - }
366   - ]
  343 + ),
  344 + },
  345 + ];
367 346 return (
368 347 <div>
369 348 <Tabs
... ... @@ -374,6 +353,6 @@ const WarningWhitelist = () =&gt; {
374 353 }}
375 354 />
376 355 </div>
377   - )
378   -}
379   -export default WarningWhitelist
  356 + );
  357 +};
  358 +export default WarningWhitelist;
... ...
src/pages/OrderReport/components/OrderStatisticCard.tsx
... ... @@ -310,59 +310,44 @@ export default ({ data, statisticsMethod, reFreshData }) =&gt; {
310 310 <ProCard
311 311 className="order-statictis-card"
312 312 bordered
313   - title={<CardTitle title='待开票订单' />}
  313 + title={<CardTitle title="待开票订单" />}
314 314 >
315   - <CardContent
316   - content={data?.waitInvoicingCount}
317   - />
  315 + <CardContent content={data?.waitInvoicingCount} />
318 316 </ProCard>
319 317 <ProCard
320 318 className="order-statictis-card"
321 319 bordered
322   - title={<CardTitle title='待开票订单总金额' />}
  320 + title={<CardTitle title="待开票订单总金额" />}
323 321 >
324   - <CardContent
325   - unit="¥"
326   - content={data?.waitInvoicingPriceSum}
327   - />
  322 + <CardContent unit="¥" content={data?.waitInvoicingPriceSum} />
328 323 </ProCard>
329 324 <ProCard
330 325 className="order-statictis-card"
331 326 bordered
332   - title={<CardTitle title='已开票未回款订单' />}
  327 + title={<CardTitle title="已开票未回款订单" />}
333 328 >
334   - <CardContent
335   - content={data?.invoicedNotReiceptCount}
336   - />
  329 + <CardContent content={data?.invoicedNotReiceptCount} />
337 330 </ProCard>
338 331 <ProCard
339 332 className="order-statictis-card"
340 333 bordered
341   - title={<CardTitle title='已开票未回款订单总金额' />}
  334 + title={<CardTitle title="已开票未回款订单总金额" />}
342 335 >
343   - <CardContent
344   - unit="¥"
345   - content={data?.invoicedNotReiceptPriceSum}
346   - />
  336 + <CardContent unit="¥" content={data?.invoicedNotReiceptPriceSum} />
347 337 </ProCard>
348 338 <ProCard
349 339 className="order-statictis-card"
350 340 bordered
351   - title={<CardTitle title='已开票已回款订单' />}
  341 + title={<CardTitle title="已开票已回款订单" />}
352 342 >
353   - <CardContent
354   - content={data?.invoicedAndReiceptedCount}
355   - />
  343 + <CardContent content={data?.invoicedAndReiceptedCount} />
356 344 </ProCard>
357 345 <ProCard
358 346 className="order-statictis-card"
359 347 bordered
360   - title={<CardTitle title='已开票已回款订单总金额' />}
  348 + title={<CardTitle title="已开票已回款订单总金额" />}
361 349 >
362   - <CardContent
363   - unit="¥"
364   - content={data?.invoicedAndReiceptedPriceSum}
365   - />
  350 + <CardContent unit="¥" content={data?.invoicedAndReiceptedPriceSum} />
366 351 </ProCard>
367 352 </ProCard>
368 353  
... ...
src/pages/Prepaid/index.tsx
1 1 import ButtonConfirm from '@/components/ButtomConfirm';
2 2 import EllipsisDiv from '@/components/Div/EllipsisDiv';
3 3 import { RESPONSE_CODE } from '@/constants/enum';
4   -import { } from '@/pages/Invoice/constant';
  4 +import {} from '@/pages/Invoice/constant';
5 5 import {
6 6 postCanrdApiUserList,
7 7 postPrepaidDelete,
... ...
src/services/definition.ts
... ... @@ -94,36 +94,33 @@ export interface AdminAuthUserVO {
94 94 export interface AdminClientDto {
95 95 /**
96 96 * @description
97   - * 市
98   - */
99   - city?: string;
100   - /**
101   - * @description
102   - * 单位地址
  97 + * 客户地址
103 98 */
104   - companyAddress?: string;
  99 + address?: string;
105 100 /**
106 101 * @description
107   - * 单位地址
  102 + *
108 103 */
109   - companyAddressText?: string;
  104 + city?: string;
110 105 companyId?: string;
111 106 /**
112 107 * @description
113   - * 单位名称
  108 + * 联系人
114 109 */
115   - companyName?: string;
116 110 contacts?: string;
117   - createBy?: string;
  111 + createByName?: string;
118 112 /** @format date-time */
119 113 createTime?: string;
120 114 /**
121 115 * @description
  116 + * 详细地址
  117 + */
  118 + detailAddress?: string;
  119 + /**
  120 + * @description
122 121 * 区
123 122 */
124 123 district?: string;
125   - /** @format int32 */
126   - enableFlag?: number;
127 124 /**
128 125 * @description
129 126 * 是否已报方案
... ... @@ -144,9 +141,7 @@ export interface AdminClientDto {
144 141 * 客户等级
145 142 */
146 143 levelText?: string;
147   - modifyBy?: string;
148   - /** @format date-time */
149   - modifyTime?: string;
  144 + logicDelete?: boolean;
150 145 /**
151 146 * @description
152 147 * 名称
... ... @@ -157,6 +152,7 @@ export interface AdminClientDto {
157 152 * 备注
158 153 */
159 154 notes?: string;
  155 + paths?: Array<string>;
160 156 /**
161 157 * @description
162 158 * 电话号码
... ... @@ -180,16 +176,26 @@ export interface AdminClientDto {
180 176 referrers?: string;
181 177 /**
182 178 * @description
183   - * 需求
  179 + * 客户需求
184 180 */
185 181 requirements?: string;
186 182 /**
187 183 * @description
  184 + * 客户需求
  185 + */
  186 + requirementsText?: string;
  187 + /**
  188 + * @description
188 189 * 来源
189 190 */
190 191 source?: string;
191 192 /**
192 193 * @description
  194 + * 来源
  195 + */
  196 + sourceText?: string;
  197 + /**
  198 + * @description
193 199 * 跟进状态
194 200 */
195 201 tradeStatus?: string;
... ... @@ -198,8 +204,9 @@ export interface AdminClientDto {
198 204 * 跟进状态
199 205 */
200 206 tradeStatusText?: string;
201   - /** @format int32 */
202   - version?: number;
  207 + updateByName?: string;
  208 + /** @format date-time */
  209 + updateTime?: string;
203 210 }
204 211  
205 212 export interface AdminDeptQueryVO {
... ... @@ -758,6 +765,7 @@ export interface ApplyInvoiceDTO {
758 765 * @format int64
759 766 */
760 767 id?: number;
  768 + invoice?: Invoice;
761 769 /**
762 770 * @description
763 771 * 发票地址
... ... @@ -771,8 +779,9 @@ export interface ApplyInvoiceDTO {
771 779 /**
772 780 * @description
773 781 * 关联发票id
  782 + * @format int64
774 783 */
775   - invoiceId?: string;
  784 + invoiceId?: number;
776 785 /**
777 786 * @description
778 787 * 发票号码
... ... @@ -1413,6 +1422,42 @@ export interface InventoryMaterialStockReq {
1413 1422 materialId?: string;
1414 1423 }
1415 1424  
  1425 +export interface Invoice {
  1426 + /** @format date-time */
  1427 + collectionTime?: string;
  1428 + contacts?: string;
  1429 + createByName?: string;
  1430 + /** @format date-time */
  1431 + createTime?: string;
  1432 + ext?: string;
  1433 + /** @format int64 */
  1434 + id?: number;
  1435 + invoiceConfirmStatus?: string;
  1436 + /** @format date-time */
  1437 + invoiceConfirmStatusDatetime?: string;
  1438 + invoiceNumber?: string;
  1439 + /** @format int64 */
  1440 + invoiceRecordId?: number;
  1441 + invoiceStatus?: string;
  1442 + /** @format date-time */
  1443 + invoicingTime?: string;
  1444 + invoicingType?: string;
  1445 + logicDelete?: boolean;
  1446 + /** @format int64 */
  1447 + money?: number;
  1448 + moneyAsBigDecimal?: number;
  1449 + notes?: string;
  1450 + payee?: string;
  1451 + purchaser?: string;
  1452 + sale?: string;
  1453 + status?: string;
  1454 + updateByName?: string;
  1455 + /** @format date-time */
  1456 + updateTime?: string;
  1457 + /** @format int64 */
  1458 + writeOffId?: number;
  1459 +}
  1460 +
1416 1461 export interface InvoiceBatchDownloadDto {
1417 1462 invoiceRecordIds?: Array<number>;
1418 1463 }
... ... @@ -1450,6 +1495,9 @@ export interface InvoiceDto {
1450 1495 * @format int64
1451 1496 */
1452 1497 id?: number;
  1498 + invoiceConfirmStatus?: string;
  1499 + /** @format date-time */
  1500 + invoiceConfirmStatusDatetime?: string;
1453 1501 /**
1454 1502 * @description
1455 1503 * 发票号码
... ... @@ -1580,6 +1628,7 @@ export interface InvoiceRecordDTO {
1580 1628 * @format int64
1581 1629 */
1582 1630 id?: number;
  1631 + invoice?: Invoice;
1583 1632 /**
1584 1633 * @description
1585 1634 * 发票地址
... ... @@ -1593,8 +1642,9 @@ export interface InvoiceRecordDTO {
1593 1642 /**
1594 1643 * @description
1595 1644 * 关联发票id
  1645 + * @format int64
1596 1646 */
1597   - invoiceId?: string;
  1647 + invoiceId?: number;
1598 1648 /**
1599 1649 * @description
1600 1650 * 发票号码
... ... @@ -2839,9 +2889,11 @@ export interface QueryBankStatementDto {
2839 2889 }
2840 2890  
2841 2891 export interface QueryClientDto {
  2892 + address?: string;
2842 2893 companyAddressLike?: string;
2843 2894 companyIds?: Array<number>;
2844 2895 companyNameLike?: string;
  2896 + contacts?: string;
2845 2897 createByName?: string;
2846 2898 createByUserIdIn?: Array<number>;
2847 2899 /** @format date-time */
... ... @@ -2850,6 +2902,7 @@ export interface QueryClientDto {
2850 2902 createTimeLe?: string;
2851 2903 /** @format int32 */
2852 2904 current?: number;
  2905 + detailAddress?: string;
2853 2906 /** @format int32 */
2854 2907 end?: number;
2855 2908 groupFilter?: string;
... ... @@ -2859,6 +2912,8 @@ export interface QueryClientDto {
2859 2912 /** @format int32 */
2860 2913 pageSize?: number;
2861 2914 phoneNumber?: string;
  2915 + requirements?: string;
  2916 + source?: string;
2862 2917 /** @format int32 */
2863 2918 start?: number;
2864 2919 /** @format int32 */
... ... @@ -2867,13 +2922,21 @@ export interface QueryClientDto {
2867 2922 }
2868 2923  
2869 2924 export interface QueryCommunicationInfoDto {
  2925 + clientAddressLike?: string;
2870 2926 /** @format int64 */
2871 2927 clientId?: number;
  2928 + clientIdIn?: Array<number>;
  2929 + clientNameLike?: string;
2872 2930 content?: string;
2873 2931 createByName?: string;
  2932 + createByNameIn?: Array<string>;
2874 2933 /** @format int32 */
2875 2934 current?: number;
2876 2935 /** @format date-time */
  2936 + dateTimeGe?: string;
  2937 + /** @format date-time */
  2938 + dateTimeLe?: string;
  2939 + /** @format date-time */
2877 2940 datetime?: string;
2878 2941 /** @format int32 */
2879 2942 end?: number;
... ... @@ -2885,6 +2948,8 @@ export interface QueryCommunicationInfoDto {
2885 2948 start?: number;
2886 2949 /** @format int32 */
2887 2950 total?: number;
  2951 + tradeStatusLike?: string;
  2952 + updateByName?: string;
2888 2953 way?: string;
2889 2954 }
2890 2955  
... ... @@ -3220,12 +3285,33 @@ export interface QueryUseOldInvoicingDto {
3220 3285 total?: number;
3221 3286 }
3222 3287  
  3288 +export interface QueryWarningOrderStatistics {
  3289 + excludeWhiteList?: boolean;
  3290 + salesCode?: string;
  3291 + /** @format date-time */
  3292 + waitConfirmInvoiceStatusDateTimeLe?: string;
  3293 + /** @format date-time */
  3294 + waitConfirmPaymentOrderCreatedDateTimeGe?: string;
  3295 + /** @format date-time */
  3296 + waitConfirmPaymentStatusDateTimeLe?: string;
  3297 + /** @format date-time */
  3298 + waitConfirmReiceptStatusDateTimeLe?: string;
  3299 + /** @format date-time */
  3300 + waitFeedbackStatusDateTimeLe?: string;
  3301 +}
  3302 +
3223 3303 export interface QueryWarningOrderWhiteListDto {
3224 3304 createByName?: string;
  3305 + /** @format date-time */
  3306 + createTimeGe?: string;
  3307 + /** @format date-time */
  3308 + createTimeLe?: string;
3225 3309 /** @format int32 */
3226 3310 current?: number;
3227 3311 /** @format int32 */
3228 3312 end?: number;
  3313 + /** @format int64 */
  3314 + orderId?: number;
3229 3315 /** @format int32 */
3230 3316 pageSize?: number;
3231 3317 /** @format int32 */
... ... @@ -3696,6 +3782,8 @@ export interface SubOrder {
3696 3782 /** @format date-time */
3697 3783 collectMoneyTime?: string;
3698 3784 confirmDeliverNotes?: string;
  3785 + /** @format date-time */
  3786 + confirmReceiptDatetime?: string;
3699 3787 confirmReissueNotes?: string;
3700 3788 createByName?: string;
3701 3789 /** @format date-time */
... ... @@ -3704,6 +3792,7 @@ export interface SubOrder {
3704 3792 deadline?: string;
3705 3793 ext?: string;
3706 3794 extendField?: string;
  3795 + feedbackRegistrationContent?: string;
3707 3796 /** @format date-time */
3708 3797 financialReceiptIssuanceTime?: string;
3709 3798 fullPaymentStatus?: string;
... ... @@ -4124,14 +4213,30 @@ export interface View {
4124 4213 }
4125 4214  
4126 4215 export interface WarningOrderWhiteListDto {
  4216 + createByName?: string;
  4217 + /** @format date-time */
  4218 + createTime?: string;
  4219 + logicDelete?: boolean;
4127 4220 /** @format int64 */
4128 4221 orderId?: number;
  4222 + paths?: Array<string>;
4129 4223 salesCode?: string;
  4224 + updateByName?: string;
  4225 + /** @format date-time */
  4226 + updateTime?: string;
4130 4227 }
4131 4228  
4132 4229 export interface WarningUserWhiteListDto {
  4230 + createByName?: string;
  4231 + /** @format date-time */
  4232 + createTime?: string;
4133 4233 /** @format int64 */
4134 4234 id?: number;
  4235 + logicDelete?: boolean;
  4236 + paths?: Array<string>;
  4237 + updateByName?: string;
  4238 + /** @format date-time */
  4239 + updateTime?: string;
4135 4240 userName?: string;
4136 4241 }
4137 4242  
... ... @@ -4154,16 +4259,29 @@ export interface ApiOrderConfirmReceiveRequest {
4154 4259 }
4155 4260  
4156 4261 export interface ClientCommunicationInfo {
  4262 + attachments?: string;
  4263 + /**
  4264 + * @description
  4265 + * 客户地址
  4266 + */
  4267 + clientAddress?: string;
4157 4268 /** @format int64 */
4158 4269 clientId?: number;
4159 4270 /**
4160 4271 * @description
  4272 + * 客户名称
  4273 + */
  4274 + clientName?: string;
  4275 + /**
  4276 + * @description
4161 4277 * 内容
4162 4278 */
4163 4279 content?: string;
4164 4280 createByName?: string;
4165 4281 /** @format date-time */
4166 4282 createTime?: string;
  4283 + /** @format int64 */
  4284 + dateRange?: number;
4167 4285 /**
4168 4286 * @description
4169 4287 * 跟进时间
... ... @@ -4173,6 +4291,11 @@ export interface ClientCommunicationInfo {
4173 4291 /** @format int64 */
4174 4292 id?: number;
4175 4293 logicDelete?: boolean;
  4294 + /**
  4295 + * @description
  4296 + * 客户状态
  4297 + */
  4298 + tradeStatus?: string;
4176 4299 updateByName?: string;
4177 4300 /** @format date-time */
4178 4301 updateTime?: string;
... ... @@ -4181,6 +4304,11 @@ export interface ClientCommunicationInfo {
4181 4304 * 方式
4182 4305 */
4183 4306 way?: string;
  4307 + /**
  4308 + * @description
  4309 + * 方式
  4310 + */
  4311 + wayText?: string;
4184 4312 }
4185 4313  
4186 4314 export interface CompanyInfo {
... ... @@ -4739,6 +4867,20 @@ export interface UserAddressSaveRequest {
4739 4867 institutionContactName?: string;
4740 4868 }
4741 4869  
  4870 +export interface FeedbackRegistrationDTO {
  4871 + /**
  4872 + * @description
  4873 + * 回访登记内容
  4874 + */
  4875 + feedbackRegistrationContent?: string;
  4876 + /**
  4877 + * @description
  4878 + * 子订单id
  4879 + * @format int64
  4880 + */
  4881 + id?: number;
  4882 +}
  4883 +
4742 4884 export interface UploadPaymentReceiptDTO {
4743 4885 /**
4744 4886 * @description
... ...
src/services/request.ts
... ... @@ -54,6 +54,7 @@ import type {
54 54 DistrictDo,
55 55 DistrictSearchDo,
56 56 Dto,
  57 + FeedbackRegistrationDTO,
57 58 InventoryMaterialStockReq,
58 59 InvoiceBatchDownloadDto,
59 60 InvoiceDto,
... ... @@ -66,6 +67,7 @@ import type {
66 67 MaterialUnitListRes,
67 68 MeasureUnitListRes,
68 69 MessageQueryDTO,
  70 + ModelAndView,
69 71 OrderAddVO,
70 72 OrderAuditLogQueryVO,
71 73 OrderBaseInfoQueryVO,
... ... @@ -103,6 +105,7 @@ import type {
103 105 QueryProcureReturnBillDto,
104 106 QueryReportFormsDto,
105 107 QueryUseOldInvoicingDto,
  108 + QueryWarningOrderStatistics,
106 109 QueryWarningOrderWhiteListDto,
107 110 QueryWarningUserWhiteListDto,
108 111 QueryWriteOffRecordDto,
... ... @@ -362,6 +365,79 @@ export const postAdminClientAddOrModifyClientComunicationInfo =
362 365 return request;
363 366 })();
364 367  
  368 +/** @description request parameter type for postAdminClientDeleteAdminClient */
  369 +export interface PostAdminClientDeleteAdminClientOption {
  370 + /**
  371 + * @description
  372 + * id
  373 + * @format int64
  374 + */
  375 + query?: {
  376 + /**
  377 + @description
  378 + id
  379 + @format int64 */
  380 + id?: number;
  381 + };
  382 +}
  383 +
  384 +/** @description response type for postAdminClientDeleteAdminClient */
  385 +export interface PostAdminClientDeleteAdminClientResponse {
  386 + /**
  387 + * @description
  388 + * OK
  389 + */
  390 + 200: ServerResult;
  391 + /**
  392 + * @description
  393 + * Created
  394 + */
  395 + 201: any;
  396 + /**
  397 + * @description
  398 + * Unauthorized
  399 + */
  400 + 401: any;
  401 + /**
  402 + * @description
  403 + * Forbidden
  404 + */
  405 + 403: any;
  406 + /**
  407 + * @description
  408 + * Not Found
  409 + */
  410 + 404: any;
  411 +}
  412 +
  413 +export type PostAdminClientDeleteAdminClientResponseSuccess =
  414 + PostAdminClientDeleteAdminClientResponse[200];
  415 +/**
  416 + * @description
  417 + * 删除客户
  418 + * @tags 客户管理
  419 + * @produces *
  420 + * @consumes application/json
  421 + */
  422 +export const postAdminClientDeleteAdminClient = /* #__PURE__ */ (() => {
  423 + const method = 'post';
  424 + const url = '/admin/client/deleteAdminClient';
  425 + function request(
  426 + option?: PostAdminClientDeleteAdminClientOption,
  427 + ): Promise<PostAdminClientDeleteAdminClientResponseSuccess> {
  428 + return requester(request.url, {
  429 + method: request.method,
  430 + ...option,
  431 + }) as unknown as Promise<PostAdminClientDeleteAdminClientResponseSuccess>;
  432 + }
  433 +
  434 + /** http method */
  435 + request.method = method;
  436 + /** request url */
  437 + request.url = url;
  438 + return request;
  439 +})();
  440 +
365 441 /** @description response type for postAdminClientDownloadImportTemplate */
366 442 export interface PostAdminClientDownloadImportTemplateResponse {
367 443 /**
... ... @@ -520,7 +596,7 @@ export type PostAdminClientGetStatisticalDataResponseSuccess =
520 596 PostAdminClientGetStatisticalDataResponse[200];
521 597 /**
522 598 * @description
523   - * 修改跟进信息
  599 + * 全部与预警客户个数
524 600 * @tags 客户管理
525 601 * @produces *
526 602 * @consumes application/json
... ... @@ -3239,9 +3315,7 @@ export interface GetErrorResponse {
3239 3315 * @description
3240 3316 * OK
3241 3317 */
3242   - 200: {
3243   - [propertyName: string]: any;
3244   - };
  3318 + 200: ModelAndView;
3245 3319 /**
3246 3320 * @description
3247 3321 * Unauthorized
... ... @@ -3262,9 +3336,9 @@ export interface GetErrorResponse {
3262 3336 export type GetErrorResponseSuccess = GetErrorResponse[200];
3263 3337 /**
3264 3338 * @description
3265   - * error
  3339 + * errorHtml
3266 3340 * @tags basic-error-controller
3267   - * @produces *
  3341 + * @produces text/html
3268 3342 */
3269 3343 export const getError = /* #__PURE__ */ (() => {
3270 3344 const method = 'get';
... ... @@ -3288,9 +3362,7 @@ export interface PutErrorResponse {
3288 3362 * @description
3289 3363 * OK
3290 3364 */
3291   - 200: {
3292   - [propertyName: string]: any;
3293   - };
  3365 + 200: ModelAndView;
3294 3366 /**
3295 3367 * @description
3296 3368 * Created
... ... @@ -3316,9 +3388,9 @@ export interface PutErrorResponse {
3316 3388 export type PutErrorResponseSuccess = PutErrorResponse[200];
3317 3389 /**
3318 3390 * @description
3319   - * error
  3391 + * errorHtml
3320 3392 * @tags basic-error-controller
3321   - * @produces *
  3393 + * @produces text/html
3322 3394 * @consumes application/json
3323 3395 */
3324 3396 export const putError = /* #__PURE__ */ (() => {
... ... @@ -3343,9 +3415,7 @@ export interface PostErrorResponse {
3343 3415 * @description
3344 3416 * OK
3345 3417 */
3346   - 200: {
3347   - [propertyName: string]: any;
3348   - };
  3418 + 200: ModelAndView;
3349 3419 /**
3350 3420 * @description
3351 3421 * Created
... ... @@ -3371,9 +3441,9 @@ export interface PostErrorResponse {
3371 3441 export type PostErrorResponseSuccess = PostErrorResponse[200];
3372 3442 /**
3373 3443 * @description
3374   - * error
  3444 + * errorHtml
3375 3445 * @tags basic-error-controller
3376   - * @produces *
  3446 + * @produces text/html
3377 3447 * @consumes application/json
3378 3448 */
3379 3449 export const postError = /* #__PURE__ */ (() => {
... ... @@ -3398,9 +3468,7 @@ export interface DeleteErrorResponse {
3398 3468 * @description
3399 3469 * OK
3400 3470 */
3401   - 200: {
3402   - [propertyName: string]: any;
3403   - };
  3471 + 200: ModelAndView;
3404 3472 /**
3405 3473 * @description
3406 3474 * No Content
... ... @@ -3421,9 +3489,9 @@ export interface DeleteErrorResponse {
3421 3489 export type DeleteErrorResponseSuccess = DeleteErrorResponse[200];
3422 3490 /**
3423 3491 * @description
3424   - * error
  3492 + * errorHtml
3425 3493 * @tags basic-error-controller
3426   - * @produces *
  3494 + * @produces text/html
3427 3495 */
3428 3496 export const deleteError = /* #__PURE__ */ (() => {
3429 3497 const method = 'delete';
... ... @@ -3447,9 +3515,7 @@ export interface OptionsErrorResponse {
3447 3515 * @description
3448 3516 * OK
3449 3517 */
3450   - 200: {
3451   - [propertyName: string]: any;
3452   - };
  3518 + 200: ModelAndView;
3453 3519 /**
3454 3520 * @description
3455 3521 * No Content
... ... @@ -3470,9 +3536,9 @@ export interface OptionsErrorResponse {
3470 3536 export type OptionsErrorResponseSuccess = OptionsErrorResponse[200];
3471 3537 /**
3472 3538 * @description
3473   - * error
  3539 + * errorHtml
3474 3540 * @tags basic-error-controller
3475   - * @produces *
  3541 + * @produces text/html
3476 3542 * @consumes application/json
3477 3543 */
3478 3544 export const optionsError = /* #__PURE__ */ (() => {
... ... @@ -3497,9 +3563,7 @@ export interface HeadErrorResponse {
3497 3563 * @description
3498 3564 * OK
3499 3565 */
3500   - 200: {
3501   - [propertyName: string]: any;
3502   - };
  3566 + 200: ModelAndView;
3503 3567 /**
3504 3568 * @description
3505 3569 * No Content
... ... @@ -3520,9 +3584,9 @@ export interface HeadErrorResponse {
3520 3584 export type HeadErrorResponseSuccess = HeadErrorResponse[200];
3521 3585 /**
3522 3586 * @description
3523   - * error
  3587 + * errorHtml
3524 3588 * @tags basic-error-controller
3525   - * @produces *
  3589 + * @produces text/html
3526 3590 * @consumes application/json
3527 3591 */
3528 3592 export const headError = /* #__PURE__ */ (() => {
... ... @@ -3547,9 +3611,7 @@ export interface PatchErrorResponse {
3547 3611 * @description
3548 3612 * OK
3549 3613 */
3550   - 200: {
3551   - [propertyName: string]: any;
3552   - };
  3614 + 200: ModelAndView;
3553 3615 /**
3554 3616 * @description
3555 3617 * No Content
... ... @@ -3570,9 +3632,9 @@ export interface PatchErrorResponse {
3570 3632 export type PatchErrorResponseSuccess = PatchErrorResponse[200];
3571 3633 /**
3572 3634 * @description
3573   - * error
  3635 + * errorHtml
3574 3636 * @tags basic-error-controller
3575   - * @produces *
  3637 + * @produces text/html
3576 3638 * @consumes application/json
3577 3639 */
3578 3640 export const patchError = /* #__PURE__ */ (() => {
... ... @@ -13051,6 +13113,168 @@ export const postServiceConstClientLevels = /* #__PURE__ */ (() =&gt; {
13051 13113 return request;
13052 13114 })();
13053 13115  
  13116 +/** @description response type for postServiceConstClientRequirements */
  13117 +export interface PostServiceConstClientRequirementsResponse {
  13118 + /**
  13119 + * @description
  13120 + * OK
  13121 + */
  13122 + 200: ServerResult;
  13123 + /**
  13124 + * @description
  13125 + * Created
  13126 + */
  13127 + 201: any;
  13128 + /**
  13129 + * @description
  13130 + * Unauthorized
  13131 + */
  13132 + 401: any;
  13133 + /**
  13134 + * @description
  13135 + * Forbidden
  13136 + */
  13137 + 403: any;
  13138 + /**
  13139 + * @description
  13140 + * Not Found
  13141 + */
  13142 + 404: any;
  13143 +}
  13144 +
  13145 +export type PostServiceConstClientRequirementsResponseSuccess =
  13146 + PostServiceConstClientRequirementsResponse[200];
  13147 +/**
  13148 + * @description
  13149 + * 客户需求
  13150 + * @tags front-const-controller
  13151 + * @produces *
  13152 + * @consumes application/json
  13153 + */
  13154 +export const postServiceConstClientRequirements = /* #__PURE__ */ (() => {
  13155 + const method = 'post';
  13156 + const url = '/service/const/clientRequirements';
  13157 + function request(): Promise<PostServiceConstClientRequirementsResponseSuccess> {
  13158 + return requester(request.url, {
  13159 + method: request.method,
  13160 + }) as unknown as Promise<PostServiceConstClientRequirementsResponseSuccess>;
  13161 + }
  13162 +
  13163 + /** http method */
  13164 + request.method = method;
  13165 + /** request url */
  13166 + request.url = url;
  13167 + return request;
  13168 +})();
  13169 +
  13170 +/** @description response type for postServiceConstClientSource */
  13171 +export interface PostServiceConstClientSourceResponse {
  13172 + /**
  13173 + * @description
  13174 + * OK
  13175 + */
  13176 + 200: ServerResult;
  13177 + /**
  13178 + * @description
  13179 + * Created
  13180 + */
  13181 + 201: any;
  13182 + /**
  13183 + * @description
  13184 + * Unauthorized
  13185 + */
  13186 + 401: any;
  13187 + /**
  13188 + * @description
  13189 + * Forbidden
  13190 + */
  13191 + 403: any;
  13192 + /**
  13193 + * @description
  13194 + * Not Found
  13195 + */
  13196 + 404: any;
  13197 +}
  13198 +
  13199 +export type PostServiceConstClientSourceResponseSuccess =
  13200 + PostServiceConstClientSourceResponse[200];
  13201 +/**
  13202 + * @description
  13203 + * 客户来源
  13204 + * @tags front-const-controller
  13205 + * @produces *
  13206 + * @consumes application/json
  13207 + */
  13208 +export const postServiceConstClientSource = /* #__PURE__ */ (() => {
  13209 + const method = 'post';
  13210 + const url = '/service/const/clientSource';
  13211 + function request(): Promise<PostServiceConstClientSourceResponseSuccess> {
  13212 + return requester(request.url, {
  13213 + method: request.method,
  13214 + }) as unknown as Promise<PostServiceConstClientSourceResponseSuccess>;
  13215 + }
  13216 +
  13217 + /** http method */
  13218 + request.method = method;
  13219 + /** request url */
  13220 + request.url = url;
  13221 + return request;
  13222 +})();
  13223 +
  13224 +/** @description response type for postServiceConstClientWay */
  13225 +export interface PostServiceConstClientWayResponse {
  13226 + /**
  13227 + * @description
  13228 + * OK
  13229 + */
  13230 + 200: ServerResult;
  13231 + /**
  13232 + * @description
  13233 + * Created
  13234 + */
  13235 + 201: any;
  13236 + /**
  13237 + * @description
  13238 + * Unauthorized
  13239 + */
  13240 + 401: any;
  13241 + /**
  13242 + * @description
  13243 + * Forbidden
  13244 + */
  13245 + 403: any;
  13246 + /**
  13247 + * @description
  13248 + * Not Found
  13249 + */
  13250 + 404: any;
  13251 +}
  13252 +
  13253 +export type PostServiceConstClientWayResponseSuccess =
  13254 + PostServiceConstClientWayResponse[200];
  13255 +/**
  13256 + * @description
  13257 + * 类型
  13258 + * @tags front-const-controller
  13259 + * @produces *
  13260 + * @consumes application/json
  13261 + */
  13262 +export const postServiceConstClientWay = /* #__PURE__ */ (() => {
  13263 + const method = 'post';
  13264 + const url = '/service/const/clientWay';
  13265 + function request(): Promise<PostServiceConstClientWayResponseSuccess> {
  13266 + return requester(request.url, {
  13267 + method: request.method,
  13268 + }) as unknown as Promise<PostServiceConstClientWayResponseSuccess>;
  13269 + }
  13270 +
  13271 + /** http method */
  13272 + request.method = method;
  13273 + /** request url */
  13274 + request.url = url;
  13275 + return request;
  13276 +})();
  13277 +
13054 13278 /** @description response type for postServiceConstGetPayeeEnum */
13055 13279 export interface PostServiceConstGetPayeeEnumResponse {
13056 13280 /**
... ... @@ -17204,13 +17428,13 @@ export const postServiceOrderConfirmReceipt = /* #__PURE__ */ (() =&gt; {
17204 17428 export interface PostServiceOrderDeleteWarningOrderWhiteListOption {
17205 17429 /**
17206 17430 * @description
17207   - * id
  17431 + * orderId
17208 17432 */
17209 17433 body?: {
17210 17434 /**
17211 17435 @description
17212   - id */
17213   - id?: number;
  17436 + orderId */
  17437 + orderId?: number;
17214 17438 };
17215 17439 }
17216 17440  
... ... @@ -17682,6 +17906,77 @@ export const postServiceOrderExportTemplate = /* #__PURE__ */ (() =&gt; {
17682 17906 return request;
17683 17907 })();
17684 17908  
  17909 +/** @description request parameter type for postServiceOrderFeedbackRegistration */
  17910 +export interface PostServiceOrderFeedbackRegistrationOption {
  17911 + /**
  17912 + * @description
  17913 + * dto
  17914 + */
  17915 + body: {
  17916 + /**
  17917 + @description
  17918 + dto */
  17919 + dto: FeedbackRegistrationDTO;
  17920 + };
  17921 +}
  17922 +
  17923 +/** @description response type for postServiceOrderFeedbackRegistration */
  17924 +export interface PostServiceOrderFeedbackRegistrationResponse {
  17925 + /**
  17926 + * @description
  17927 + * OK
  17928 + */
  17929 + 200: ServerResult;
  17930 + /**
  17931 + * @description
  17932 + * Created
  17933 + */
  17934 + 201: any;
  17935 + /**
  17936 + * @description
  17937 + * Unauthorized
  17938 + */
  17939 + 401: any;
  17940 + /**
  17941 + * @description
  17942 + * Forbidden
  17943 + */
  17944 + 403: any;
  17945 + /**
  17946 + * @description
  17947 + * Not Found
  17948 + */
  17949 + 404: any;
  17950 +}
  17951 +
  17952 +export type PostServiceOrderFeedbackRegistrationResponseSuccess =
  17953 + PostServiceOrderFeedbackRegistrationResponse[200];
  17954 +/**
  17955 + * @description
  17956 + * 回访登记
  17957 + * @tags 内部订单
  17958 + * @produces *
  17959 + * @consumes application/json
  17960 + */
  17961 +export const postServiceOrderFeedbackRegistration = /* #__PURE__ */ (() => {
  17962 + const method = 'post';
  17963 + const url = '/service/order/feedbackRegistration';
  17964 + function request(
  17965 + option: PostServiceOrderFeedbackRegistrationOption,
  17966 + ): Promise<PostServiceOrderFeedbackRegistrationResponseSuccess> {
  17967 + return requester(request.url, {
  17968 + method: request.method,
  17969 + ...option,
  17970 + }) as unknown as Promise<PostServiceOrderFeedbackRegistrationResponseSuccess>;
  17971 + }
  17972 +
  17973 + /** http method */
  17974 + request.method = method;
  17975 + /** request url */
  17976 + request.url = url;
  17977 + return request;
  17978 +})();
  17979 +
17685 17980 /** @description request parameter type for postServiceOrderFileProcess */
17686 17981 export interface PostServiceOrderFileProcessOption {
17687 17982 /**
... ... @@ -21413,6 +21708,20 @@ export const postServiceOrderViewImages = /* #__PURE__ */ (() =&gt; {
21413 21708 return request;
21414 21709 })();
21415 21710  
  21711 +/** @description request parameter type for postServiceOrderWarningOrderStatistics */
  21712 +export interface PostServiceOrderWarningOrderStatisticsOption {
  21713 + /**
  21714 + * @description
  21715 + * query
  21716 + */
  21717 + body: {
  21718 + /**
  21719 + @description
  21720 + query */
  21721 + query: QueryWarningOrderStatistics;
  21722 + };
  21723 +}
  21724 +
21416 21725 /** @description response type for postServiceOrderWarningOrderStatistics */
21417 21726 export interface PostServiceOrderWarningOrderStatisticsResponse {
21418 21727 /**
... ... @@ -21454,9 +21763,12 @@ export type PostServiceOrderWarningOrderStatisticsResponseSuccess =
21454 21763 export const postServiceOrderWarningOrderStatistics = /* #__PURE__ */ (() => {
21455 21764 const method = 'post';
21456 21765 const url = '/service/order/warningOrderStatistics';
21457   - function request(): Promise<PostServiceOrderWarningOrderStatisticsResponseSuccess> {
  21766 + function request(
  21767 + option: PostServiceOrderWarningOrderStatisticsOption,
  21768 + ): Promise<PostServiceOrderWarningOrderStatisticsResponseSuccess> {
21458 21769 return requester(request.url, {
21459 21770 method: request.method,
  21771 + ...option,
21460 21772 }) as unknown as Promise<PostServiceOrderWarningOrderStatisticsResponseSuccess>;
21461 21773 }
21462 21774  
... ...
src/tsg.config.ts
... ... @@ -33,7 +33,8 @@ const projects: Project[] = [
33 33 * openapi 文档地址,可以是远程的json文件,也可以是本地的json文件
34 34 * 如果使用本地文件,相对路径以当前'tsg.config.ts'为基准
35 35 * */
36   - source: 'http://localhost:8085/v2/api-docs',
  36 + // source: 'http://localhost:8085/v2/api-docs',
  37 + source: 'http://39.108.227.113:8085/v2/api-docs',
37 38  
38 39 // source: 'https://petstore3.swagger.io/api/v3/openapi.json',
39 40 // source: './fixture/pet.json',
... ...