商采黑名单等

V0.1
yujialong 1 year ago
parent 45826f2574
commit 07a30dec64
  1. 4
      .env
  2. 231
      package-lock.json
  3. 1
      package.json
  4. 5
      src/components/Panel/index.vue
  5. 33
      src/utils/common.ts
  6. 6
      src/views/Home.vue
  7. 5
      src/views/product/List.vue
  8. 24
      src/views/product/bank/Add.vue
  9. 10
      src/views/product/bank/Approve.vue
  10. 8
      src/views/product/bank/CardList.vue
  11. 24
      src/views/product/bank/Config.vue
  12. 2
      src/views/product/strategy/150.vue
  13. 2
      src/views/product/strategy/151.vue
  14. 452
      src/views/product/strategy/152.vue
  15. 5
      src/views/product/strategy/CardList.vue

@ -2,7 +2,7 @@ VITE_APP_TITLE=金融产品设计及数字化营销沙盘
VITE_PORT=9520 VITE_PORT=9520
VITE_PROXY=http://192.168.31.125:8080 VITE_PROXY=http://192.168.31.125:8080
VITE_PUBLIC_PATH=./ VITE_PUBLIC_PATH=./
# VITE_BASE_API=http://192.168.31.217:9000 VITE_BASE_API=http://192.168.31.217:9000
VITE_BASE_API=http://121.37.12.51 # VITE_BASE_API=http://121.37.12.51
VITE_I18N_LOCALE=zh-cn VITE_I18N_LOCALE=zh-cn
VITE_I18N_FALLBACK_LOCALE=zh-cn VITE_I18N_FALLBACK_LOCALE=zh-cn

231
package-lock.json generated

@ -681,6 +681,15 @@
"resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.31.tgz", "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.31.tgz",
"integrity": "sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ==" "integrity": "sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ=="
}, },
"@vueup/vue-quill": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@vueup/vue-quill/-/vue-quill-1.2.0.tgz",
"integrity": "sha512-kd5QPSHMDpycklojPXno2Kw2JSiKMYduKYQckTm1RJoVDA557MnyUXgcuuDpry4HY/Rny9nGNcK+m3AHk94wag==",
"requires": {
"quill": "^1.3.7",
"quill-delta": "^4.2.2"
}
},
"@vueuse/core": { "@vueuse/core": {
"version": "7.6.1", "version": "7.6.1",
"resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-7.6.1.tgz", "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-7.6.1.tgz",
@ -977,7 +986,6 @@
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz", "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"dev": true,
"requires": { "requires": {
"function-bind": "^1.1.1", "function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2" "get-intrinsic": "^1.0.2"
@ -1276,6 +1284,19 @@
"ms": "2.1.2" "ms": "2.1.2"
} }
}, },
"deep-equal": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
"integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
"requires": {
"is-arguments": "^1.0.4",
"is-date-object": "^1.0.1",
"is-regex": "^1.0.4",
"object-is": "^1.0.1",
"object-keys": "^1.1.1",
"regexp.prototype.flags": "^1.2.0"
}
},
"deep-is": { "deep-is": {
"version": "0.1.4", "version": "0.1.4",
"resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz",
@ -1291,11 +1312,38 @@
"clone": "^1.0.2" "clone": "^1.0.2"
} }
}, },
"define-data-property": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
"integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
"requires": {
"get-intrinsic": "^1.2.1",
"gopd": "^1.0.1",
"has-property-descriptors": "^1.0.0"
},
"dependencies": {
"get-intrinsic": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
"integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
"requires": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3"
}
},
"has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
}
}
},
"define-properties": { "define-properties": {
"version": "1.1.3", "version": "1.1.3",
"resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.1.3.tgz", "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.1.3.tgz",
"integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
"dev": true,
"requires": { "requires": {
"object-keys": "^1.0.12" "object-keys": "^1.0.12"
} }
@ -2012,6 +2060,11 @@
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true "dev": true
}, },
"eventemitter3": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz",
"integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg=="
},
"expand-tilde": { "expand-tilde": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmmirror.com/expand-tilde/-/expand-tilde-2.0.2.tgz", "resolved": "https://registry.npmmirror.com/expand-tilde/-/expand-tilde-2.0.2.tgz",
@ -2024,8 +2077,7 @@
"extend": { "extend": {
"version": "3.0.2", "version": "3.0.2",
"resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
"dev": true
}, },
"external-editor": { "external-editor": {
"version": "3.1.0", "version": "3.1.0",
@ -2047,8 +2099,7 @@
"fast-diff": { "fast-diff": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.2.0.tgz", "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.2.0.tgz",
"integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w=="
"dev": true
}, },
"fast-glob": { "fast-glob": {
"version": "3.2.11", "version": "3.2.11",
@ -2210,8 +2261,7 @@
"function-bind": { "function-bind": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz", "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
"dev": true
}, },
"functional-red-black-tree": { "functional-red-black-tree": {
"version": "1.0.1", "version": "1.0.1",
@ -2219,11 +2269,15 @@
"integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
"dev": true "dev": true
}, },
"functions-have-names": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
"integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
},
"get-intrinsic": { "get-intrinsic": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
"dev": true,
"requires": { "requires": {
"function-bind": "^1.1.1", "function-bind": "^1.1.1",
"has": "^1.0.3", "has": "^1.0.3",
@ -2316,6 +2370,32 @@
"slash": "^3.0.0" "slash": "^3.0.0"
} }
}, },
"gopd": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"requires": {
"get-intrinsic": "^1.1.3"
},
"dependencies": {
"get-intrinsic": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
"integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
"requires": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3"
}
},
"has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
}
}
},
"graceful-fs": { "graceful-fs": {
"version": "4.2.9", "version": "4.2.9",
"resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.9.tgz", "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.9.tgz",
@ -2339,7 +2419,6 @@
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"requires": { "requires": {
"function-bind": "^1.1.1" "function-bind": "^1.1.1"
} }
@ -2356,17 +2435,28 @@
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"dev": true "dev": true
}, },
"has-property-descriptors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
"integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
"requires": {
"get-intrinsic": "^1.1.1"
}
},
"has-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
"integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="
},
"has-symbols": { "has-symbols": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.2.tgz", "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.2.tgz",
"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
"dev": true
}, },
"has-tostringtag": { "has-tostringtag": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
"integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
"dev": true,
"requires": { "requires": {
"has-symbols": "^1.0.2" "has-symbols": "^1.0.2"
} }
@ -2589,6 +2679,15 @@
"is-windows": "^1.0.1" "is-windows": "^1.0.1"
} }
}, },
"is-arguments": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
"integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
"requires": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
}
},
"is-arrayish": { "is-arrayish": {
"version": "0.2.1", "version": "0.2.1",
"resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz",
@ -2642,7 +2741,6 @@
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz", "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz",
"integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
"dev": true,
"requires": { "requires": {
"has-tostringtag": "^1.0.0" "has-tostringtag": "^1.0.0"
} }
@ -2733,7 +2831,6 @@
"version": "1.1.4", "version": "1.1.4",
"resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz", "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz",
"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
"dev": true,
"requires": { "requires": {
"call-bind": "^1.0.2", "call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0" "has-tostringtag": "^1.0.0"
@ -2972,12 +3069,22 @@
"resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.1.tgz", "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.1.tgz",
"integrity": "sha512-Py+twfpWn+2dFQWCuGcp21WiQRwZwnm1cyE3piSt/VtBVKVyxlR58WgOVRzXtmdmDRGJKH8F8GPaA29WK/yK8g==" "integrity": "sha512-Py+twfpWn+2dFQWCuGcp21WiQRwZwnm1cyE3piSt/VtBVKVyxlR58WgOVRzXtmdmDRGJKH8F8GPaA29WK/yK8g=="
}, },
"lodash.clonedeep": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
"integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
},
"lodash.get": { "lodash.get": {
"version": "4.4.2", "version": "4.4.2",
"resolved": "https://registry.npmmirror.com/lodash.get/-/lodash.get-4.4.2.tgz", "resolved": "https://registry.npmmirror.com/lodash.get/-/lodash.get-4.4.2.tgz",
"integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
"dev": true "dev": true
}, },
"lodash.isequal": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
"integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
},
"log-symbols": { "log-symbols": {
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz", "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz",
@ -3413,11 +3520,19 @@
"integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
"dev": true "dev": true
}, },
"object-is": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
"integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3"
}
},
"object-keys": { "object-keys": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz",
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
"dev": true
}, },
"object.assign": { "object.assign": {
"version": "4.1.2", "version": "4.1.2",
@ -3726,6 +3841,11 @@
} }
} }
}, },
"parchment": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz",
"integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg=="
},
"parent-module": { "parent-module": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz",
@ -4117,6 +4237,51 @@
"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
"dev": true "dev": true
}, },
"quill": {
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz",
"integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==",
"requires": {
"clone": "^2.1.1",
"deep-equal": "^1.0.1",
"eventemitter3": "^2.0.3",
"extend": "^3.0.2",
"parchment": "^1.1.4",
"quill-delta": "^3.6.2"
},
"dependencies": {
"clone": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
"integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="
},
"fast-diff": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz",
"integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig=="
},
"quill-delta": {
"version": "3.6.3",
"resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz",
"integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==",
"requires": {
"deep-equal": "^1.0.1",
"extend": "^3.0.2",
"fast-diff": "1.1.2"
}
}
}
},
"quill-delta": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-4.2.2.tgz",
"integrity": "sha512-qjbn82b/yJzOjstBgkhtBjN2TNK+ZHP/BgUQO+j6bRhWQQdmj2lH6hXG7+nwwLF41Xgn//7/83lxs9n2BkTtTg==",
"requires": {
"fast-diff": "1.2.0",
"lodash.clonedeep": "^4.5.0",
"lodash.isequal": "^4.5.0"
}
},
"readable-stream": { "readable-stream": {
"version": "3.6.0", "version": "3.6.0",
"resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz", "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz",
@ -4152,6 +4317,28 @@
"integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
"dev": true "dev": true
}, },
"regexp.prototype.flags": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz",
"integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==",
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.2.0",
"set-function-name": "^2.0.0"
},
"dependencies": {
"define-properties": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
"integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
"requires": {
"define-data-property": "^1.0.1",
"has-property-descriptors": "^1.0.0",
"object-keys": "^1.1.1"
}
}
}
},
"regexpp": { "regexpp": {
"version": "3.2.0", "version": "3.2.0",
"resolved": "https://registry.npmmirror.com/regexpp/-/regexpp-3.2.0.tgz", "resolved": "https://registry.npmmirror.com/regexpp/-/regexpp-3.2.0.tgz",
@ -4297,6 +4484,16 @@
} }
} }
}, },
"set-function-name": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
"integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
"requires": {
"define-data-property": "^1.0.1",
"functions-have-names": "^1.2.3",
"has-property-descriptors": "^1.0.0"
}
},
"shebang-command": { "shebang-command": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz", "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz",

@ -11,6 +11,7 @@
}, },
"dependencies": { "dependencies": {
"@element-plus/icons-vue": "^0.2.7", "@element-plus/icons-vue": "^0.2.7",
"@vueup/vue-quill": "^1.2.0",
"axios": "^0.25.0", "axios": "^0.25.0",
"core-js": "^3.21.0", "core-js": "^3.21.0",
"cropperjs": "^1.5.12", "cropperjs": "^1.5.12",

@ -222,6 +222,7 @@ import dayjs from 'dayjs';
import Cookies from 'js-cookie'; import Cookies from 'js-cookie';
import { mavonEditor } from 'mavon-editor'; import { mavonEditor } from 'mavon-editor';
import 'mavon-editor/dist/css/index.css'; import 'mavon-editor/dist/css/index.css';
import '@vueup/vue-quill/dist/vue-quill.snow.css';
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
@ -417,6 +418,7 @@ const reload = async () => {
grade.value = '00'; grade.value = '00';
setSubmit(false); setSubmit(false);
startCount(); startCount();
router.push('/');
}; };
// //
const submit = async () => { const submit = async () => {
@ -773,4 +775,7 @@ onMounted(() => {
opacity: 0.9; opacity: 0.9;
} }
} }
.ql-editor {
@apply text-sm;
}
</style> </style>

@ -179,3 +179,36 @@ export const downloadFileDirect = (fileName: string, data: any) => {
document.body.removeChild(elink); document.body.removeChild(elink);
} }
}; };
/**
*
*/
export const getNum = (str: string): string => {
if (str) {
const result = str.match(/\d+/g);
return result ? result[0] : '';
}
return '';
};
/**
*
*/
export const getSymbol = (str: string): string => {
if (str) {
const result = str.match(/[<>=]+/g);
return result ? result[0] : '';
}
return '';
};
/**
*
*/
export const getChinese = (str: string): string => {
if (str) {
const result = str.match(/[\u4e00-\u9fa5]+/g);
return result ? result[0] : '';
}
return '';
};

@ -51,7 +51,8 @@
<div class="arrow top-0 left-[50%] translate-x-[-50%] w-[64px] h-[64px] bg-[url('@/assets/images/level/arrow-up.png')]"></div> <div class="arrow top-0 left-[50%] translate-x-[-50%] w-[64px] h-[64px] bg-[url('@/assets/images/level/arrow-up.png')]"></div>
<div class="arrow right-0 top-[50%] translate-y-[-50%] w-[64px] h-[64px] bg-[url('@/assets/images/level/arrow-right.png')]"></div> <div class="arrow right-0 top-[50%] translate-y-[-50%] w-[64px] h-[64px] bg-[url('@/assets/images/level/arrow-right.png')]"></div>
<div class="arrow bottom-0 left-[50%] translate-x-[-50%] w-[64px] h-[64px] bg-[url('@/assets/images/level/arrow-down.png')]"></div> <div class="arrow bottom-0 left-[50%] translate-x-[-50%] w-[64px] h-[64px] bg-[url('@/assets/images/level/arrow-down.png')]"
@click="move"></div>
<div class="arrow left-0 top-[50%] translate-y-[-50%] w-[64px] h-[64px] bg-[url('@/assets/images/level/arrow-left.png')]"></div> <div class="arrow left-0 top-[50%] translate-y-[-50%] w-[64px] h-[64px] bg-[url('@/assets/images/level/arrow-left.png')]"></div>
<div class="absolute bottom-2 right-1 w-[262px] h-[74px] bg-[url('@/assets/images/level/submit.png')] bg-[length:100%_100%] bg-no-repeat cursor-pointer hover:bg-[url('@/assets/images/level/submit-hover.png')]" <div class="absolute bottom-2 right-1 w-[262px] h-[74px] bg-[url('@/assets/images/level/submit.png')] bg-[length:100%_100%] bg-no-repeat cursor-pointer hover:bg-[url('@/assets/images/level/submit-hover.png')]"
@click="toRole"></div> @click="toRole"></div>
@ -112,6 +113,9 @@ const toRole = () => {
ElMessage.error('请选择关卡!'); ElMessage.error('请选择关卡!');
} }
}; };
const move = () => {
window.scrollTo(0, 100);
};
onMounted(() => { onMounted(() => {
getLevel(); getLevel();
}); });

@ -137,12 +137,15 @@ import { getProcessInformationBasedOnRoles } from '@/api/judgment';
import { bankingProductsList, batchDeletion } from '@/api/bank'; import { bankingProductsList, batchDeletion } from '@/api/bank';
import Search from '@/components/Search.vue'; import Search from '@/components/Search.vue';
import { useRouter, useRoute } from 'vue-router'; import { useRouter, useRoute } from 'vue-router';
import Cookies from 'js-cookie';
import { productState, getExpertStatus, getStatus } from '@/store/useProduct'; import { productState, getExpertStatus, getStatus } from '@/store/useProduct';
const { t } = useI18n(); const { t } = useI18n();
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
const productTypes = ref<number[]>([0, 1]); const productTypes = ref<number[]>([0, 1]);
const projectId = +Cookies.get('sand-projectId');
const levelId = +Cookies.get('sand-level');
const params = reactive({ const params = reactive({
createDateSort: '', createDateSort: '',
guarantyStyleId: '', guarantyStyleId: '',
@ -158,6 +161,8 @@ const params = reactive({
}), }),
status: '', status: '',
roleId: computed(() => +route.query.role || 41), roleId: computed(() => +route.query.role || 41),
checkPointId: levelId,
projectId,
}); });
const currentPage = ref<number>(1); const currentPage = ref<number>(1);
const pageSize = ref<number>(10); const pageSize = ref<number>(10);

@ -201,10 +201,10 @@
<div class="flex-1"> <div class="flex-1">
<div class="num-inputs"> <div class="num-inputs">
<el-input placeholder="最小额度" <el-input placeholder="最小额度"
v-model.number="form.minimumLoan"></el-input> v-model="form.minimumLoan"></el-input>
<span class="split">-</span> <span class="split">-</span>
<el-input placeholder="最高额度" <el-input placeholder="最高额度"
v-model.number="form.loanCeiling"></el-input> v-model="form.loanCeiling"></el-input>
<span class="unit">万元</span> <span class="unit">万元</span>
</div> </div>
</div> </div>
@ -228,11 +228,11 @@
<div class="num-inputs"> <div class="num-inputs">
<el-input placeholder="最小年利率" <el-input placeholder="最小年利率"
min="0" min="0"
v-model.number="form.minimumAprOnLoan"></el-input> v-model="form.minimumAprOnLoan"></el-input>
<span class="split">-</span> <span class="split">-</span>
<el-input placeholder="最高年利率" <el-input placeholder="最高年利率"
min="0" min="0"
v-model.number="form.maximumAnnualInterestRate"></el-input> v-model="form.maximumAnnualInterestRate"></el-input>
<span class="unit">%</span> <span class="unit">%</span>
</div> </div>
</div> </div>
@ -255,12 +255,10 @@
<div class="flex-1"> <div class="flex-1">
<div class="num-inputs"> <div class="num-inputs">
<el-input placeholder="最小期限" <el-input placeholder="最小期限"
min="0" v-model="form.minimumTermOfLoan"></el-input>
v-model.number="form.minimumTermOfLoan"></el-input>
<span class="split">-</span> <span class="split">-</span>
<el-input placeholder="最大期限" <el-input placeholder="最大期限"
min="0" v-model="form.maximumTermOfLoan"></el-input>
v-model.number="form.maximumTermOfLoan"></el-input>
<span class="unit"></span> <span class="unit"></span>
</div> </div>
</div> </div>
@ -340,11 +338,15 @@ interface RuleForm {
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
const id = computed(() => route.query.id); const id = computed(() => route.query.id);
const projectId = +Cookies.get('sand-projectId');
const levelId = +Cookies.get('sand-level');
const curTab = ref<string>('tab1'); const curTab = ref<string>('tab1');
const config = ref<any[]>([]); const config = ref<any[]>([]);
const info = ref<Record<string, any>>(null); const info = ref<Record<string, any>>(null);
const formRef = ref<FormInstance>(); const formRef = ref<FormInstance>();
const form = reactive<RuleForm>({ const form = reactive<RuleForm>({
checkPointId: levelId,
projectId,
productDefinition: '', productDefinition: '',
productName: '', productName: '',
productCurrency: 1, productCurrency: 1,
@ -504,13 +506,13 @@ const addRecord = async (data: Record<string, any>) => {
handleId(57, 18, data.modeRepayment, preIds + ',57', 1), handleId(57, 18, data.modeRepayment, preIds + ',57', 1),
); );
data.whetherToSupportEarlyRepayment && lcRule.push(handleId(58, '', '', preIds + ',58', '')); lcRule.push(handleId(58, 140, data.whetherToSupportEarlyRepayment ? 345 : 346, preIds + ',58', 1));
await addOperation({ await addOperation({
checkpointId: +Cookies.get('sand-level'), checkpointId: levelId,
parentId: preIds, parentId: preIds,
lcJudgmentRuleReq: lcRule, lcJudgmentRuleReq: lcRule,
projectId: +Cookies.get('sand-projectId'), projectId,
}); });
}; };
onMounted(() => { onMounted(() => {

@ -29,6 +29,16 @@
maxlength="500" maxlength="500"
v-model="form.opinionDescription"></el-input> v-model="form.opinionDescription"></el-input>
</el-form-item> </el-form-item>
<div class="flex flex-col items-end">
<div class="mb-[18px] text-sm leading-[1.6]">
<span class="text-sm font-semibold">审批日期</span>
<span>2022年10月18日</span>
</div>
<div class="inline-flex items-center mb-[18px] text-sm leading-[1.6]">
<span class="text-sm font-semibold">审批员</span>
<span class="py-2 px-5 ml-1 text-sm text-white bg-[#006BFF] cursor-pointer">签章</span>
</div>
</div>
<div class="flex justify-end"> <div class="flex justify-end">
<div class="submit" <div class="submit"
@click="submit(formRef)">审批</div> @click="submit(formRef)">审批</div>

@ -1,7 +1,7 @@
<template> <template>
<div class="block flex" <div class="block flex"
style="padding-top: 0"> style="padding-top: 0">
<div class="left w-[241px] pr-5 py-4"> <div class="left w-[241px] min-w-[241px] pr-5 py-4">
<div v-if="role == 41" <div v-if="role == 41"
class="flex justify-center items-center py-2 mb-3 text-sm text-[#006BFF] bg-[rgba(0,107,255,0.1)] border border-solid border-[#006BFF] rounded-[10px] cursor-pointer" class="flex justify-center items-center py-2 mb-3 text-sm text-[#006BFF] bg-[rgba(0,107,255,0.1)] border border-solid border-[#006BFF] rounded-[10px] cursor-pointer"
@click="toAdd"> @click="toAdd">
@ -63,10 +63,13 @@ import Config from './Config.vue';
import Detail from './Detail.vue'; import Detail from './Detail.vue';
import Add from './Add.vue'; import Add from './Add.vue';
import Approve from './Approve.vue'; import Approve from './Approve.vue';
import Cookies from 'js-cookie';
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
const action = ref<any>(''); const action = ref<any>('');
const projectId = +Cookies.get('sand-projectId');
const levelId = +Cookies.get('sand-level');
// const modules: any = import.meta.glob('./*.vue'); // const modules: any = import.meta.glob('./*.vue');
// let currentSubApp = defineAsyncComponent(modules[`./${route.params.action}.vue`]); // let currentSubApp = defineAsyncComponent(modules[`./${route.params.action}.vue`]);
@ -79,7 +82,7 @@ const id = computed(() => +route.query.id);
const getList = async (first: any) => { const getList = async (first: any) => {
loading.value = true; loading.value = true;
try { try {
const { data } = await bankingProductsList({ pageNum: 1, pageSize: 1000, productType: productType.value }); const { data } = await bankingProductsList({ pageNum: 1, pageSize: 1000, productType: productType.value, checkPointId: levelId, projectId });
list.value = data.message.records; list.value = data.message.records;
first && list.value.length && switchProduct(list.value[0].id); first && list.value.length && switchProduct(list.value[0].id);
} finally { } finally {
@ -128,6 +131,7 @@ const handleDelete = async (id: number) => {
border-right: 1px solid #e9eff2; border-right: 1px solid #e9eff2;
} }
.products { .products {
@apply max-h-[calc(100vh-205px)] pr-1 overflow-auto;
li { li {
@apply relative p-5 pt-7 mb-5 rounded-[10px] cursor-pointer border border-solid border-[transparent] bg-[url('@/assets/images/10.png')] bg-[length:100%_100%] bg-no-repeat; @apply relative p-5 pt-7 mb-5 rounded-[10px] cursor-pointer border border-solid border-[transparent] bg-[url('@/assets/images/10.png')] bg-[length:100%_100%] bg-no-repeat;
&.active { &.active {

@ -43,20 +43,20 @@
<p class="field-name">借款人材料</p> <p class="field-name">借款人材料</p>
<div class="flex items-center mb-3"> <div class="flex items-center mb-3">
<el-checkbox-group v-model="form.borrowerMaterial"> <el-checkbox-group v-model="form.borrowerMaterial">
<el-checkbox :label="config[1]?.recordChildren[1]?.subject?.itemList[0].itemId">{{ config[1]?.recordChildren[1]?.subject?.itemList[0].options }}</el-checkbox> <el-checkbox :label="config[1]?.recordChildren[1]?.recordChildren[0].id">{{ config[1]?.recordChildren[1]?.recordChildren[0].name }}</el-checkbox>
</el-checkbox-group> </el-checkbox-group>
<el-select v-show="(info.productType && form.borrowerMaterial?.includes(165)) || (!info.productType && form.borrowerMaterial?.includes(49))" <el-select v-show="(info.productType && form.borrowerMaterial?.includes(316)) || (!info.productType && form.borrowerMaterial?.includes(314))"
class="ml-5" class="ml-5"
v-model="form.borrowerMaterialSelect" v-model="form.borrowerMaterialSelect"
placeholder="请选择"> placeholder="请选择">
<el-option v-for="item in config[1]?.recordChildren[1]?.subject?.itemList[0]?.children" <el-option v-for="item in config[1]?.recordChildren[1]?.recordChildren[1]?.subject?.itemList"
:key="item.itemId" :key="item.itemId"
:label="item.options" :label="item.options"
:value="item.itemId" /> :value="item.itemId" />
</el-select> </el-select>
</div> </div>
<el-checkbox-group v-model="form.borrowerMaterial"> <el-checkbox-group v-model="form.borrowerMaterial">
<el-checkbox v-for="(item, i) in config[1]?.recordChildren[1]?.subject?.itemList.slice(1)" <el-checkbox v-for="(item, i) in config[1]?.recordChildren[1]?.recordChildren[0]?.subject?.itemList"
:key="i" :key="i"
:label="item.itemId">{{ item.options }}</el-checkbox> :label="item.itemId">{{ item.options }}</el-checkbox>
</el-checkbox-group> </el-checkbox-group>
@ -192,7 +192,7 @@
class="ml-5" class="ml-5"
v-model="form.interestRatePricingModel" v-model="form.interestRatePricingModel"
placeholder="请选择"> placeholder="请选择">
<el-option v-for="item in config[2]?.recordChildren[4]?.subject?.itemList[0]?.children" <el-option v-for="item in config[2]?.recordChildren[4]?.recordChildren[1]?.subject?.itemList"
:key="item.itemId" :key="item.itemId"
:label="item.options" :label="item.options"
:value="item.itemId" /> :value="item.itemId" />
@ -216,7 +216,7 @@
<el-form-item label="尽调内容" <el-form-item label="尽调内容"
prop="dueDiligenceContent"> prop="dueDiligenceContent">
<el-checkbox-group v-model="form.dueDiligenceContent"> <el-checkbox-group v-model="form.dueDiligenceContent">
<el-checkbox v-for="(item, i) in config[1]?.recordChildren[0]?.subject?.itemList" <el-checkbox v-for="(item, i) in config[3]?.recordChildren[1]?.subject?.itemList"
:key="i" :key="i"
:label="item.itemId">{{ item.options }}</el-checkbox> :label="item.itemId">{{ item.options }}</el-checkbox>
</el-checkbox-group> </el-checkbox-group>
@ -394,11 +394,15 @@ interface RuleForm {
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
const id = computed(() => +route.query.id); const id = computed(() => +route.query.id);
const projectId = +Cookies.get('sand-projectId');
const levelId = +Cookies.get('sand-level');
const curTab = ref<string>('tab1'); const curTab = ref<string>('tab1');
const config = ref<any[]>([]); const config = ref<any[]>([]);
const info = ref<Record<string, any>>({}); const info = ref<Record<string, any>>({});
const formRef = ref<FormInstance>(); const formRef = ref<FormInstance>();
const form = reactive<RuleForm>({ const form = reactive<RuleForm>({
checkPointId: levelId,
projectId,
accessStrategy: [], accessStrategy: [],
accountMaterials: [], accountMaterials: [],
approvalSignature: [], approvalSignature: [],
@ -477,7 +481,7 @@ const submit = async (formEl: FormInstance | undefined) => {
const isEnterprise = info.value.productType === 1; const isEnterprise = info.value.productType === 1;
const param = JSON.parse(JSON.stringify(form)); const param = JSON.parse(JSON.stringify(form));
if (((isEnterprise && param.borrowerMaterial?.includes(165)) || (!isEnterprise && param.borrowerMaterial?.includes(49))) && !param.borrowerMaterialSelect) if (((isEnterprise && param.borrowerMaterial?.includes(316)) || (!isEnterprise && param.borrowerMaterial?.includes(314))) && !param.borrowerMaterialSelect)
return ElMessage.error('请选择借款申请表'); return ElMessage.error('请选择借款申请表');
if ( if (
(param.personalCreditScoringStrategiesCheck && !param.personalCreditScoringStrategies) || (param.personalCreditScoringStrategiesCheck && !param.personalCreditScoringStrategies) ||
@ -490,7 +494,7 @@ const submit = async (formEl: FormInstance | undefined) => {
if (param.guaranteeContractCheck && !param.guaranteeContract) return ElMessage.error('请选择担保合同'); if (param.guaranteeContractCheck && !param.guaranteeContract) return ElMessage.error('请选择担保合同');
param.accessStrategy = param.accessStrategy.join(); param.accessStrategy = param.accessStrategy.join();
if ((isEnterprise && param.borrowerMaterial?.includes(165)) || (!isEnterprise && param.borrowerMaterial?.includes(49))) if ((isEnterprise && param.borrowerMaterial?.includes(316)) || (!isEnterprise && param.borrowerMaterial?.includes(314)))
param.borrowerMaterial.splice(1, 0, param.borrowerMaterialSelect); param.borrowerMaterial.splice(1, 0, param.borrowerMaterialSelect);
param.borrowerMaterial = param.borrowerMaterial.join(); param.borrowerMaterial = param.borrowerMaterial.join();
param.accountMaterials = param.accountMaterials.join(); param.accountMaterials = param.accountMaterials.join();
@ -622,10 +626,10 @@ const addRecord = async (data: Record<string, any>) => {
} }
await addOperation({ await addOperation({
checkpointId: +Cookies.get('sand-level'), checkpointId: levelId,
parentId: preIds, parentId: preIds,
lcJudgmentRuleReq: lcRule, lcJudgmentRuleReq: lcRule,
projectId: +Cookies.get('sand-projectId'), projectId,
}); });
}; };
</script> </script>

@ -302,7 +302,7 @@ const addRecord = async (data: Record<string, any>) => {
}); });
await addOperation({ await addOperation({
checkpointId: +Cookies.get('sand-level'), checkpointId: levelId,
parentId: preIds, parentId: preIds,
lcJudgmentRuleReq: rule, lcJudgmentRuleReq: rule,
projectId, projectId,

@ -218,7 +218,7 @@ const addRecord = async (data: Record<string, any>) => {
}); });
await addOperation({ await addOperation({
checkpointId: +Cookies.get('sand-level'), checkpointId: levelId,
parentId: preIds, parentId: preIds,
lcJudgmentRuleReq: rule, lcJudgmentRuleReq: rule,
projectId, projectId,

@ -0,0 +1,452 @@
<template>
<el-table class="c-table"
:data="form"
:max-height="height"
:span-method="span"
border>
<el-table-column prop="name"
label="数据源"
min-width="100"
align="center">
</el-table-column>
<el-table-column prop="rule"
label="规则"
min-width="150">
</el-table-column>
<el-table-column label="进黑名单条件"
min-width="250">
<template #default="{ row,$index }">
<div v-if="$index < 4"
class="flex items-center">
<span class="whitespace-nowrap">{{ row.rule }}</span>
<div class="w-[90px] ">
<el-select class="mx-2"
v-model="row.symbol">
<el-option v-for="item in symbols"
:key="item"
:label="item.name"
:value="item.name" />
</el-select>
</div>
<el-input class="w-[80px]"
v-model="row.num"></el-input>
<span class="ml-2 whitespace-nowrap"></span>
</div>
<template v-else-if="$index > 3 && $index < 14 || $index === 16 || $index === 17 || $index === 19 || $index === 28">命中{{ row.rule }}</template>
<!-- 腾讯 -->
<div v-else-if="$index === 14"
class="flex items-center">
<span class="whitespace-nowrap">{{ row?.recordChildren[0]?.recordChildren[0]?.name }}</span>
<div class="w-[90px] ">
<el-select class="mx-2"
v-model="row.symbol">
<el-option v-for="item in symbols"
:key="item"
:label="item.name"
:value="item.name" />
</el-select>
</div>
<el-input class="w-[80px]"
v-model="row.num"></el-input>
<span class="ml-2 whitespace-nowrap"></span>
<div class="w-[120px] ">
<el-select class="mx-2"
v-model="row.had">
<el-option v-for="item in house"
:key="item"
:label="item.name"
:value="item.name" />
</el-select>
</div>
<span class="ml-2 whitespace-nowrap"></span>
</div>
<div v-else-if="$index === 15"
class="flex items-center">
<el-input class="w-[80px]"
v-model="row.num"></el-input>
<div class="w-[90px] ">
<el-select class="mx-2"
v-model="row.symbol">
<el-option v-for="item in units"
:key="item"
:label="item.name"
:value="item.name" />
</el-select>
</div>
<span class="ml-2 whitespace-nowrap">内申请次数</span>
<div class="w-[90px] ">
<el-select class="mx-2"
v-model="row.symbol1">
<el-option v-for="item in symbols"
:key="item"
:label="item.name"
:value="item.name" />
</el-select>
</div>
<el-input class="w-[80px]"
v-model="row.num1"></el-input>
<span class="ml-2 whitespace-nowrap"></span>
<div class="w-[120px] ">
<el-select class="mx-2"
v-model="row.had">
<el-option v-for="item in house"
:key="item"
:label="item.name"
:value="item.name" />
</el-select>
</div>
<span class="ml-2 whitespace-nowrap"></span>
</div>
<div v-else-if="$index === 18"
class="w-[90px] ">
<el-select v-model="row.symbol">
<el-option v-for="item in row?.recordChildren[0]?.subject?.itemList"
:key="item"
:label="item.options"
:value="item.options" />
</el-select>
</div>
<div v-else-if="$index > 19 && $index < 28"
class="flex items-center">
<el-input class="w-[80px]"
v-model="row.num"></el-input>
<div class="w-[90px] ">
<el-select class="mx-2"
v-model="row.symbol">
<el-option v-for="item in units"
:key="item"
:label="item.name"
:value="item.name" />
</el-select>
</div>
<span class="ml-2 whitespace-nowrap">{{tdNames[row.ruleId]}}</span>
<template v-if="row.ruleId === 350">
<div class="w-[90px] ">
<el-select class="mx-2"
v-model="row.symbol1">
<el-option v-for="item in symbols"
:key="item"
:label="item.name"
:value="item.name" />
</el-select>
</div>
<el-input class="w-[80px]"
v-model="row.num1"></el-input>
<span class="ml-2 whitespace-nowrap"></span>
</template>
</div>
</template>
</el-table-column>
</el-table>
<div class="flex justify-end">
<div class="submit"
@click="submit">确认完成配置</div>
</div>
</template>
<script setup lang="ts">
import { ref, watch } from 'vue';
import { ElMessage } from 'element-plus';
import { accessStrategyBusinessBlacklistFind, accessStrategyBusinessBlacklistSave } from '@/api/model';
import { getProcessInformationBasedOnRoles, addOperation } from '@/api/judgment';
import type { TableColumnCtx } from 'element-plus';
import { useRouter, useRoute } from 'vue-router';
import { handleId, getNum, getSymbol, getChinese } from '@/utils/common';
import Cookies from 'js-cookie';
const router = useRouter();
const route = useRoute();
const projectId = +Cookies.get('sand-projectId');
const levelId = +Cookies.get('sand-level');
const form = ref<Record<string, any>[]>([]);
const info = ref<Record<string, any>[]>([]);
const height = window.innerHeight - 270;
const spanRows = [1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27];
const symbols = <Record<string, any>[]>[
{
name: '>=',
},
{
name: '<',
},
{
name: '>',
},
{
name: '==',
},
{
name: '<=',
},
];
const house = <Record<string, any>[]>[
{
// id: 353,
name: '有商品房',
},
{
// id: 354,
name: '无商品房',
},
];
const units = <Record<string, any>[]>[
{
name: '年',
},
{
name: '月',
},
{
name: '天',
},
];
const tdNames = <Record<string, any>>{
344: '内身份证关联多个申请信息。',
345: '内申请信息关联多个身份证。',
346: '内申请人身份证作为联系人身份证出现的次数过多。',
347: '内设备或身份证或手机号申请次数过多。',
348: '内申请人在多个平台申请借款。',
349: '内申请人在多个平台申请借款。',
350: '内身份证或手机号申请次数',
351: '内同一个设备或手机号申请被拒次数过多。',
};
//
const getConfig = async () => {
const { process } = await getProcessInformationBasedOnRoles(152);
const result = [];
process.map((e, i) => {
const cur = info.value.find((n) => n.stRecordId === e.id);
let num = getNum(cur?.ruleOne);
let symbol = getSymbol(cur?.ruleOne);
let had = getChinese(cur?.ruleOne);
let temp = {
checkpointId: levelId,
projectId,
name: e.name,
recordChildren: e.recordChildren,
isRule: 0,
subjectId: e.subjectId,
stRecordId: e.id,
ruleId: e?.recordChildren[0].id,
rule: e?.recordChildren[0].name,
symbol: (e.id === 318 || e.id === 320) && cur ? symbol : !i || i === 2 ? '>=' : e.id === 322 ? '' : '年',
symbol1: '>=',
num,
num1: '',
had,
};
result.push(temp);
e?.recordChildren.map((n, i) => {
if (i) {
temp = JSON.parse(JSON.stringify(temp));
temp.ruleId = n.id;
temp.rule = n.name;
temp.isRule = 1;
//
if (e.id === 318) {
if (n.id === 325) {
temp.symbol = getSymbol(cur?.ruleTwo) ?? '>=';
temp.num = getNum(cur?.ruleTwo);
} else if (n.id === 326) {
temp.symbol = getSymbol(cur?.ruleThree) ?? '>=';
temp.num = getNum(cur?.ruleThree);
} else if (n.id === 327) {
temp.symbol = getSymbol(cur?.ruleFour) ?? '>=';
temp.num = getNum(cur?.ruleFour);
}
}
//
if (n.id === 339) {
temp.num = getNum(cur?.ruleTwo);
const unit = cur?.ruleTwo.match(/[年月日]+/g);
temp.symbol = unit ? unit[0] : '年';
temp.symbol1 = getSymbol(cur?.ruleTwo) ?? '>=';
const arr = cur?.ruleTwo?.split(',') ?? [];
temp.num1 = getNum(arr[1]);
temp.had = getChinese(arr[2]);
}
if (e.id === 322) temp.symbol = '年';
//
if (n.id === 344) {
temp.num = getNum(cur?.ruleTwo);
temp.symbol = getChinese(cur?.ruleTwo);
} else if (n.id === 345) {
temp.num = getNum(cur?.ruleThree);
temp.symbol = getChinese(cur?.ruleThree);
} else if (n.id === 346) {
temp.num = getNum(cur?.ruleFour);
temp.symbol = getChinese(cur?.ruleFour);
} else if (n.id === 347) {
temp.num = getNum(cur?.ruleFive);
temp.symbol = getChinese(cur?.ruleFive);
} else if (n.id === 348) {
temp.num = getNum(cur?.ruleSix);
temp.symbol = getChinese(cur?.ruleSix);
} else if (n.id === 349) {
temp.num = getNum(cur?.ruleSeven);
temp.symbol = getChinese(cur?.ruleSeven);
} else if (n.id === 350) {
const arr = cur?.ruleEight?.split(',') ?? [];
temp.num = getNum(arr[0]);
temp.symbol = getChinese(cur?.ruleEight);
temp.symbol1 = getSymbol(cur?.ruleEight);
temp.num1 = getNum(arr[1]);
} else if (n.id === 351) {
temp.num = getNum(cur?.ruleNine);
temp.symbol = getChinese(cur?.ruleNine);
}
result.push(temp);
}
});
});
form.value = result;
};
//
const getDetail = async () => {
try {
const { data } = await accessStrategyBusinessBlacklistFind(levelId, projectId);
info.value = data;
getConfig();
} finally {
}
};
watch(
() => route.query,
() => {
getDetail();
},
{
immediate: true,
},
);
interface SpanMethodProps {
row: Record<string, any>;
column: TableColumnCtx<Record<string, any>>;
rowIndex: number;
columnIndex: number;
}
//
const span = ({ row, column, rowIndex, columnIndex }: SpanMethodProps) => {
if (columnIndex === 0) {
if (rowIndex === 0) {
return {
rowspan: 4,
colspan: 1,
};
} else if (rowIndex === 4) {
return {
rowspan: 10,
colspan: 1,
};
} else if (rowIndex === 14 || rowIndex === 16) {
return {
rowspan: 2,
colspan: 1,
};
} else if (rowIndex === 18) {
return {
rowspan: 10,
colspan: 1,
};
} else if (spanRows.includes(rowIndex)) {
return {
rowspan: 0,
colspan: 0,
};
}
}
};
//
const submit = async () => {
let param = [
{
id: info.value.find((n) => n.stRecordId === 318)?.id,
stRecordId: 318,
checkpointId: levelId,
projectId,
ruleOne: form.value[0].symbol + form.value[0].num,
ruleTwo: form.value[1].symbol + form.value[1].num,
ruleThree: form.value[2].symbol + form.value[2].num,
ruleFour: form.value[3].symbol + form.value[3].num,
},
{
id: info.value.find((n) => n.stRecordId === 320)?.id,
stRecordId: 320,
checkpointId: levelId,
projectId,
ruleOne: form.value[14].symbol + form.value[14].num + ',' + form.value[14].had,
ruleTwo: form.value[15].num + form.value[15].symbol + ',' + form.value[15].symbol1 + form.value[15].num1 + ',' + form.value[15].had,
},
{
id: info.value.find((n) => n.stRecordId === 322)?.id,
stRecordId: 322,
checkpointId: levelId,
projectId,
ruleOne: form.value[18].symbol,
ruleTwo: form.value[20].num + form.value[20].symbol,
ruleThree: form.value[21].num + form.value[21].symbol,
ruleFour: form.value[22].num + form.value[22].symbol,
ruleFive: form.value[23].num + form.value[23].symbol,
ruleSix: form.value[24].num + form.value[24].symbol,
ruleSeven: form.value[25].num + form.value[25].symbol,
ruleEight: form.value[26].num + form.value[26].symbol + ',' + form.value[26].symbol1 + form.value[26].num1,
ruleNine: form.value[27].num + form.value[27].symbol,
},
];
await accessStrategyBusinessBlacklistSave({ businessBlacklistList: param });
addRecord(param);
getDetail();
ElMessage.success('提交成功!');
};
//
const addRecord = async (data: Record<string, any>) => {
const preIds = `1,${Cookies.get('sand-level')},42,67,147,152`; // 1id
const rule = <Record<string, any>[]>[
handleId(324, 150, data[0].ruleOne, preIds + ',318,324', 5),
handleId(325, 151, data[0].ruleTwo, preIds + ',318,325', 5),
handleId(326, 152, data[0].ruleThree, preIds + ',318,326', 5),
handleId(327, 153, data[0].ruleFour, preIds + ',318,327', 5),
handleId(353, 154, data[1].ruleOne, preIds + ',320,353', 5),
];
form.value[14].had && rule.push(handleId(354, 155, form.value[14].had === '有商品房' ? 353 : 354, preIds + ',320,354', 1));
rule.push(
handleId(355, 156, form.value[15].num + form.value[15].symbol, preIds + ',320,355', 5),
handleId(356, 157, form.value[15].symbol1 + form.value[15].num1, preIds + ',320,356', 5),
);
form.value[15].had && rule.push(handleId(357, 155, form.value[15].had === '有商品房' ? 353 : 354, preIds + ',320,357', 1));
data[2].ruleOne && rule.push(handleId(342, 158, data[2].ruleOne === '拒绝' ? 355 : 356, preIds + ',322,342', 1));
rule.push(
handleId(344, 159, data[2].ruleTwo, preIds + ',322,344', 5),
handleId(345, 160, data[2].ruleThree, preIds + ',322,345', 5),
handleId(346, 161, data[2].ruleFour, preIds + ',322,346', 5),
handleId(347, 162, data[2].ruleFive, preIds + ',322,347', 5),
handleId(348, 163, data[2].ruleSix, preIds + ',322,348', 5),
handleId(349, 164, data[2].ruleSeven, preIds + ',322,349', 5),
handleId(350, 165, data[2].ruleEight, preIds + ',322,350', 5),
handleId(351, 166, data[2].ruleNine, preIds + ',322,351', 5),
);
await addOperation({
checkpointId: levelId,
parentId: preIds,
lcJudgmentRuleReq: rule,
projectId,
});
};
</script>
<style lang="scss" scoped>
@import url(../../../styles/form.scss);
.c-table {
:deep(.el-input__inner) {
@apply px-2;
}
}
</style>

@ -6,7 +6,7 @@
<el-tab-pane label="准入策略" <el-tab-pane label="准入策略"
name="tab1"> name="tab1">
<div class="flex"> <div class="flex">
<div class="left w-[241px] pr-5 py-4"> <div class="left w-[241px] min-w-[241px] pr-5 py-4">
<ul class="products"> <ul class="products">
<li v-for="(item, i) in list[0]?.recordChildren" <li v-for="(item, i) in list[0]?.recordChildren"
:key="i" :key="i"
@ -20,6 +20,7 @@
<div class="right flex-1 px-5 pt-2"> <div class="right flex-1 px-5 pt-2">
<Com1 v-if="id == 150" /> <Com1 v-if="id == 150" />
<Com2 v-else-if="id == 151" /> <Com2 v-else-if="id == 151" />
<Com3 v-else-if="id == 152" />
</div> </div>
</div> </div>
</el-tab-pane> </el-tab-pane>
@ -38,6 +39,7 @@ import { getProcessInformationBasedOnRoles } from '@/api/judgment';
import { useRouter, useRoute } from 'vue-router'; import { useRouter, useRoute } from 'vue-router';
import Com1 from './150.vue'; import Com1 from './150.vue';
import Com2 from './151.vue'; import Com2 from './151.vue';
import Com3 from './152.vue';
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
@ -84,6 +86,7 @@ const tabChange = (tab: TabsPaneContext, event: Event) => {
border-right: 1px solid #e9eff2; border-right: 1px solid #e9eff2;
} }
.products { .products {
@apply max-h-[calc(100vh-205px)] pr-1 overflow-auto;
li { li {
@apply relative p-5 pt-7 mb-5 rounded-[10px] cursor-pointer border border-solid border-[transparent] bg-[url('@/assets/images/10.png')] bg-[length:100%_100%] bg-no-repeat; @apply relative p-5 pt-7 mb-5 rounded-[10px] cursor-pointer border border-solid border-[transparent] bg-[url('@/assets/images/10.png')] bg-[length:100%_100%] bg-no-repeat;
&.active { &.active {

Loading…
Cancel
Save