Compare commits
38 Commits
139 changed files with 10861 additions and 9591 deletions
@ -1 +1 @@ |
|||||||
VITE_BASE_API=https://www.occupationlab.com |
VITE_BASE_API=https://izhixinyun.com |
@ -1,462 +0,0 @@ |
|||||||
tinymce.addI18n('zh_CN',{ |
|
||||||
"Redo": "\u91cd\u505a", |
|
||||||
"Undo": "\u64a4\u9500", |
|
||||||
"Cut": "\u526a\u5207", |
|
||||||
"Copy": "\u590d\u5236", |
|
||||||
"Paste": "\u7c98\u8d34", |
|
||||||
"Select all": "\u5168\u9009", |
|
||||||
"New document": "\u65b0\u6587\u4ef6", |
|
||||||
"Ok": "\u786e\u5b9a", |
|
||||||
"Cancel": "\u53d6\u6d88", |
|
||||||
"Visual aids": "\u7f51\u683c\u7ebf", |
|
||||||
"Bold": "\u7c97\u4f53", |
|
||||||
"Italic": "\u659c\u4f53", |
|
||||||
"Underline": "\u4e0b\u5212\u7ebf", |
|
||||||
"Strikethrough": "\u5220\u9664\u7ebf", |
|
||||||
"Superscript": "\u4e0a\u6807", |
|
||||||
"Subscript": "\u4e0b\u6807", |
|
||||||
"Clear formatting": "\u6e05\u9664\u683c\u5f0f", |
|
||||||
"Align left": "\u5de6\u8fb9\u5bf9\u9f50", |
|
||||||
"Align center": "\u4e2d\u95f4\u5bf9\u9f50", |
|
||||||
"Align right": "\u53f3\u8fb9\u5bf9\u9f50", |
|
||||||
"Justify": "\u4e24\u7aef\u5bf9\u9f50", |
|
||||||
"Bullet list": "\u9879\u76ee\u7b26\u53f7", |
|
||||||
"Numbered list": "\u7f16\u53f7\u5217\u8868", |
|
||||||
"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb", |
|
||||||
"Increase indent": "\u589e\u52a0\u7f29\u8fdb", |
|
||||||
"Close": "\u5173\u95ed", |
|
||||||
"Formats": "\u683c\u5f0f", |
|
||||||
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u6253\u5f00\u526a\u8d34\u677f\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u7b49\u5feb\u6377\u952e\u3002", |
|
||||||
"Headers": "\u6807\u9898", |
|
||||||
"Header 1": "\u6807\u98981", |
|
||||||
"Header 2": "\u6807\u98982", |
|
||||||
"Header 3": "\u6807\u98983", |
|
||||||
"Header 4": "\u6807\u98984", |
|
||||||
"Header 5": "\u6807\u98985", |
|
||||||
"Header 6": "\u6807\u98986", |
|
||||||
"Headings": "\u6807\u9898", |
|
||||||
"Heading 1": "\u6807\u98981", |
|
||||||
"Heading 2": "\u6807\u98982", |
|
||||||
"Heading 3": "\u6807\u98983", |
|
||||||
"Heading 4": "\u6807\u98984", |
|
||||||
"Heading 5": "\u6807\u98985", |
|
||||||
"Heading 6": "\u6807\u98986", |
|
||||||
"Preformatted": "\u9884\u5148\u683c\u5f0f\u5316\u7684", |
|
||||||
"Div": "Div", |
|
||||||
"Pre": "Pre", |
|
||||||
"Code": "\u4ee3\u7801", |
|
||||||
"Paragraph": "\u6bb5\u843d", |
|
||||||
"Blockquote": "\u5f15\u6587\u533a\u5757", |
|
||||||
"Inline": "\u6587\u672c", |
|
||||||
"Blocks": "\u57fa\u5757", |
|
||||||
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002", |
|
||||||
"Fonts": "\u5b57\u4f53", |
|
||||||
"Font Sizes": "\u5b57\u53f7", |
|
||||||
"Class": "\u7c7b\u578b", |
|
||||||
"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf", |
|
||||||
"OR": "\u6216", |
|
||||||
"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64", |
|
||||||
"Upload": "\u4e0a\u4f20", |
|
||||||
"Block": "\u5757", |
|
||||||
"Align": "\u5bf9\u9f50", |
|
||||||
"Default": "\u9ed8\u8ba4", |
|
||||||
"Circle": "\u7a7a\u5fc3\u5706", |
|
||||||
"Disc": "\u5b9e\u5fc3\u5706", |
|
||||||
"Square": "\u65b9\u5757", |
|
||||||
"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd", |
|
||||||
"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd", |
|
||||||
"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd", |
|
||||||
"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd", |
|
||||||
"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd", |
|
||||||
"Anchor...": "\u951a\u70b9...", |
|
||||||
"Name": "\u540d\u79f0", |
|
||||||
"Id": "\u6807\u8bc6\u7b26", |
|
||||||
"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002", |
|
||||||
"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f", |
|
||||||
"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f", |
|
||||||
"Special character...": "\u7279\u6b8a\u5b57\u7b26...", |
|
||||||
"Source code": "\u6e90\u4ee3\u7801", |
|
||||||
"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b", |
|
||||||
"Language": "\u8bed\u8a00", |
|
||||||
"Code sample...": "\u793a\u4f8b\u4ee3\u7801...", |
|
||||||
"Color Picker": "\u9009\u8272\u5668", |
|
||||||
"R": "R", |
|
||||||
"G": "G", |
|
||||||
"B": "B", |
|
||||||
"Left to right": "\u4ece\u5de6\u5230\u53f3", |
|
||||||
"Right to left": "\u4ece\u53f3\u5230\u5de6", |
|
||||||
"Emoticons": "\u8868\u60c5", |
|
||||||
"Emoticons...": "\u8868\u60c5\u7b26\u53f7...", |
|
||||||
"Metadata and Document Properties": "\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027", |
|
||||||
"Title": "\u6807\u9898", |
|
||||||
"Keywords": "\u5173\u952e\u8bcd", |
|
||||||
"Description": "\u63cf\u8ff0", |
|
||||||
"Robots": "\u673a\u5668\u4eba", |
|
||||||
"Author": "\u4f5c\u8005", |
|
||||||
"Encoding": "\u7f16\u7801", |
|
||||||
"Fullscreen": "\u5168\u5c4f", |
|
||||||
"Action": "\u64cd\u4f5c", |
|
||||||
"Shortcut": "\u5feb\u6377\u952e", |
|
||||||
"Help": "\u5e2e\u52a9", |
|
||||||
"Address": "\u5730\u5740", |
|
||||||
"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f", |
|
||||||
"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f", |
|
||||||
"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84", |
|
||||||
"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355", |
|
||||||
"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", |
|
||||||
"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", |
|
||||||
"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", |
|
||||||
"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):", |
|
||||||
"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a", |
|
||||||
"Learn more...": "\u4e86\u89e3\u66f4\u591a...", |
|
||||||
"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}", |
|
||||||
"Plugins": "\u63d2\u4ef6", |
|
||||||
"Handy Shortcuts": "\u5feb\u6377\u952e", |
|
||||||
"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf", |
|
||||||
"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247", |
|
||||||
"Alternative description": "\u66ff\u4ee3\u63cf\u8ff0", |
|
||||||
"Accessibility": "\u8f85\u52a9\u529f\u80fd", |
|
||||||
"Image is decorative": "\u56fe\u50cf\u662f\u88c5\u9970\u6027\u7684", |
|
||||||
"Source": "\u5730\u5740", |
|
||||||
"Dimensions": "\u5927\u5c0f", |
|
||||||
"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4", |
|
||||||
"General": "\u666e\u901a", |
|
||||||
"Advanced": "\u9ad8\u7ea7", |
|
||||||
"Style": "\u6837\u5f0f", |
|
||||||
"Vertical space": "\u5782\u76f4\u8fb9\u8ddd", |
|
||||||
"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd", |
|
||||||
"Border": "\u8fb9\u6846", |
|
||||||
"Insert image": "\u63d2\u5165\u56fe\u7247", |
|
||||||
"Image...": "\u56fe\u7247...", |
|
||||||
"Image list": "\u56fe\u7247\u5217\u8868", |
|
||||||
"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c", |
|
||||||
"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c", |
|
||||||
"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c", |
|
||||||
"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c", |
|
||||||
"Edit image": "\u7f16\u8f91\u56fe\u7247", |
|
||||||
"Image options": "\u56fe\u7247\u9009\u9879", |
|
||||||
"Zoom in": "\u653e\u5927", |
|
||||||
"Zoom out": "\u7f29\u5c0f", |
|
||||||
"Crop": "\u88c1\u526a", |
|
||||||
"Resize": "\u8c03\u6574\u5927\u5c0f", |
|
||||||
"Orientation": "\u65b9\u5411", |
|
||||||
"Brightness": "\u4eae\u5ea6", |
|
||||||
"Sharpen": "\u9510\u5316", |
|
||||||
"Contrast": "\u5bf9\u6bd4\u5ea6", |
|
||||||
"Color levels": "\u989c\u8272\u5c42\u6b21", |
|
||||||
"Gamma": "\u4f3d\u9a6c\u503c", |
|
||||||
"Invert": "\u53cd\u8f6c", |
|
||||||
"Apply": "\u5e94\u7528", |
|
||||||
"Back": "\u540e\u9000", |
|
||||||
"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4", |
|
||||||
"Date\/time": "\u65e5\u671f\/\u65f6\u95f4", |
|
||||||
"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", |
|
||||||
"Text to display": "\u663e\u793a\u6587\u5b57", |
|
||||||
"Url": "\u5730\u5740", |
|
||||||
"Open link in...": "\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...", |
|
||||||
"Current window": "\u5f53\u524d\u7a97\u53e3", |
|
||||||
"None": "\u65e0", |
|
||||||
"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00", |
|
||||||
"Open link": "\u6253\u5f00\u94fe\u63a5", |
|
||||||
"Remove link": "\u5220\u9664\u94fe\u63a5", |
|
||||||
"Anchors": "\u951a\u70b9", |
|
||||||
"Link...": "\u94fe\u63a5...", |
|
||||||
"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5", |
|
||||||
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f", |
|
||||||
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f", |
|
||||||
"The URL you entered seems to be an external link. Do you want to add the required https:\/\/ prefix?": "\u60a8\u8f93\u5165\u7684 URL \u4f3c\u4e4e\u662f\u4e00\u4e2a\u5916\u90e8\u94fe\u63a5\u3002\u60a8\u60f3\u6dfb\u52a0\u6240\u9700\u7684 https:\/\/ \u524d\u7f00\u5417\uff1f", |
|
||||||
"Link list": "\u94fe\u63a5\u5217\u8868", |
|
||||||
"Insert video": "\u63d2\u5165\u89c6\u9891", |
|
||||||
"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891", |
|
||||||
"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53", |
|
||||||
"Alternative source": "\u955c\u50cf", |
|
||||||
"Alternative source URL": "\u66ff\u4ee3\u6765\u6e90\u7f51\u5740", |
|
||||||
"Media poster (Image URL)": "\u5c01\u9762(\u56fe\u7247\u5730\u5740)", |
|
||||||
"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:", |
|
||||||
"Embed": "\u5185\u5d4c", |
|
||||||
"Media...": "\u591a\u5a92\u4f53...", |
|
||||||
"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c", |
|
||||||
"Page break": "\u5206\u9875\u7b26", |
|
||||||
"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c", |
|
||||||
"Preview": "\u9884\u89c8", |
|
||||||
"Print...": "\u6253\u5370...", |
|
||||||
"Save": "\u4fdd\u5b58", |
|
||||||
"Find": "\u67e5\u627e", |
|
||||||
"Replace with": "\u66ff\u6362\u4e3a", |
|
||||||
"Replace": "\u66ff\u6362", |
|
||||||
"Replace all": "\u5168\u90e8\u66ff\u6362", |
|
||||||
"Previous": "\u4e0a\u4e00\u4e2a", |
|
||||||
"Next": "\u4e0b\u4e00\u4e2a", |
|
||||||
"Find and Replace": "\u67e5\u627e\u548c\u66ff\u6362", |
|
||||||
"Find and replace...": "\u67e5\u627e\u5e76\u66ff\u6362...", |
|
||||||
"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.", |
|
||||||
"Match case": "\u533a\u5206\u5927\u5c0f\u5199", |
|
||||||
"Find whole words only": "\u5168\u5b57\u5339\u914d", |
|
||||||
"Find in selection": "\u5728\u9009\u533a\u4e2d\u67e5\u627e", |
|
||||||
"Spellcheck": "\u62fc\u5199\u68c0\u67e5", |
|
||||||
"Spellcheck Language": "\u62fc\u5199\u68c0\u67e5\u8bed\u8a00", |
|
||||||
"No misspellings found.": "\u6ca1\u6709\u53d1\u73b0\u62fc\u5199\u9519\u8bef", |
|
||||||
"Ignore": "\u5ffd\u7565", |
|
||||||
"Ignore all": "\u5168\u90e8\u5ffd\u7565", |
|
||||||
"Finish": "\u5b8c\u6210", |
|
||||||
"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178", |
|
||||||
"Insert table": "\u63d2\u5165\u8868\u683c", |
|
||||||
"Table properties": "\u8868\u683c\u5c5e\u6027", |
|
||||||
"Delete table": "\u5220\u9664\u8868\u683c", |
|
||||||
"Cell": "\u5355\u5143\u683c", |
|
||||||
"Row": "\u884c", |
|
||||||
"Column": "\u5217", |
|
||||||
"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027", |
|
||||||
"Merge cells": "\u5408\u5e76\u5355\u5143\u683c", |
|
||||||
"Split cell": "\u62c6\u5206\u5355\u5143\u683c", |
|
||||||
"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165", |
|
||||||
"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165", |
|
||||||
"Delete row": "\u5220\u9664\u884c", |
|
||||||
"Row properties": "\u884c\u5c5e\u6027", |
|
||||||
"Cut row": "\u526a\u5207\u884c", |
|
||||||
"Copy row": "\u590d\u5236\u884c", |
|
||||||
"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9", |
|
||||||
"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9", |
|
||||||
"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165", |
|
||||||
"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165", |
|
||||||
"Delete column": "\u5220\u9664\u5217", |
|
||||||
"Cols": "\u5217", |
|
||||||
"Rows": "\u884c", |
|
||||||
"Width": "\u5bbd", |
|
||||||
"Height": "\u9ad8", |
|
||||||
"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd", |
|
||||||
"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd", |
|
||||||
"Caption": "\u6807\u9898", |
|
||||||
"Show caption": "\u663e\u793a\u6807\u9898", |
|
||||||
"Left": "\u5de6\u5bf9\u9f50", |
|
||||||
"Center": "\u5c45\u4e2d", |
|
||||||
"Right": "\u53f3\u5bf9\u9f50", |
|
||||||
"Cell type": "\u5355\u5143\u683c\u7c7b\u578b", |
|
||||||
"Scope": "\u8303\u56f4", |
|
||||||
"Alignment": "\u5bf9\u9f50\u65b9\u5f0f", |
|
||||||
"H Align": "\u6c34\u5e73\u5bf9\u9f50", |
|
||||||
"V Align": "\u5782\u76f4\u5bf9\u9f50", |
|
||||||
"Top": "\u9876\u90e8\u5bf9\u9f50", |
|
||||||
"Middle": "\u5782\u76f4\u5c45\u4e2d", |
|
||||||
"Bottom": "\u5e95\u90e8\u5bf9\u9f50", |
|
||||||
"Header cell": "\u8868\u5934\u5355\u5143\u683c", |
|
||||||
"Row group": "\u884c\u7ec4", |
|
||||||
"Column group": "\u5217\u7ec4", |
|
||||||
"Row type": "\u884c\u7c7b\u578b", |
|
||||||
"Header": "\u8868\u5934", |
|
||||||
"Body": "\u8868\u4f53", |
|
||||||
"Footer": "\u8868\u5c3e", |
|
||||||
"Border color": "\u8fb9\u6846\u989c\u8272", |
|
||||||
"Insert template...": "\u63d2\u5165\u6a21\u677f...", |
|
||||||
"Templates": "\u6a21\u677f", |
|
||||||
"Template": "\u6a21\u677f", |
|
||||||
"Text color": "\u6587\u5b57\u989c\u8272", |
|
||||||
"Background color": "\u80cc\u666f\u8272", |
|
||||||
"Custom...": "\u81ea\u5b9a\u4e49...", |
|
||||||
"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272", |
|
||||||
"No color": "\u65e0", |
|
||||||
"Remove color": "\u79fb\u9664\u989c\u8272", |
|
||||||
"Table of Contents": "\u5185\u5bb9\u5217\u8868", |
|
||||||
"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846", |
|
||||||
"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26", |
|
||||||
"Word count": "\u5b57\u6570", |
|
||||||
"Count": "\u8ba1\u6570", |
|
||||||
"Document": "\u6587\u6863", |
|
||||||
"Selection": "\u9009\u62e9", |
|
||||||
"Words": "\u5355\u8bcd", |
|
||||||
"Words: {0}": "\u5b57\u6570\uff1a{0}", |
|
||||||
"{0} words": "{0} \u5b57", |
|
||||||
"File": "\u6587\u4ef6", |
|
||||||
"Edit": "\u7f16\u8f91", |
|
||||||
"Insert": "\u63d2\u5165", |
|
||||||
"View": "\u89c6\u56fe", |
|
||||||
"Format": "\u683c\u5f0f", |
|
||||||
"Table": "\u8868\u683c", |
|
||||||
"Tools": "\u5de5\u5177", |
|
||||||
"Powered by {0}": "\u7531{0}\u9a71\u52a8", |
|
||||||
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9", |
|
||||||
"Image title": "\u56fe\u7247\u6807\u9898", |
|
||||||
"Border width": "\u8fb9\u6846\u5bbd\u5ea6", |
|
||||||
"Border style": "\u8fb9\u6846\u6837\u5f0f", |
|
||||||
"Error": "\u9519\u8bef", |
|
||||||
"Warn": "\u8b66\u544a", |
|
||||||
"Valid": "\u6709\u6548", |
|
||||||
"To open the popup, press Shift+Enter": "\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846", |
|
||||||
"Rich Text Area. Press ALT-0 for help.": "\u7f16\u8f91\u533a\u3002\u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9\u3002", |
|
||||||
"System Font": "\u7cfb\u7edf\u5b57\u4f53", |
|
||||||
"Failed to upload image: {0}": "\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}", |
|
||||||
"Failed to load plugin: {0} from url {1}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} \u6765\u81ea\u94fe\u63a5 {1}", |
|
||||||
"Failed to load plugin url: {0}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25 \u94fe\u63a5: {0}", |
|
||||||
"Failed to initialize plugin: {0}": "\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}", |
|
||||||
"example": "\u793a\u4f8b", |
|
||||||
"Search": "\u641c\u7d22", |
|
||||||
"All": "\u5168\u90e8", |
|
||||||
"Currency": "\u8d27\u5e01", |
|
||||||
"Text": "\u6587\u5b57", |
|
||||||
"Quotations": "\u5f15\u7528", |
|
||||||
"Mathematical": "\u6570\u5b66", |
|
||||||
"Extended Latin": "\u62c9\u4e01\u8bed\u6269\u5145", |
|
||||||
"Symbols": "\u7b26\u53f7", |
|
||||||
"Arrows": "\u7bad\u5934", |
|
||||||
"User Defined": "\u81ea\u5b9a\u4e49", |
|
||||||
"dollar sign": "\u7f8e\u5143\u7b26\u53f7", |
|
||||||
"currency sign": "\u8d27\u5e01\u7b26\u53f7", |
|
||||||
"euro-currency sign": "\u6b27\u5143\u7b26\u53f7", |
|
||||||
"colon sign": "\u5192\u53f7", |
|
||||||
"cruzeiro sign": "\u514b\u9c81\u8d5b\u7f57\u5e01\u7b26\u53f7", |
|
||||||
"french franc sign": "\u6cd5\u90ce\u7b26\u53f7", |
|
||||||
"lira sign": "\u91cc\u62c9\u7b26\u53f7", |
|
||||||
"mill sign": "\u5bc6\u5c14\u7b26\u53f7", |
|
||||||
"naira sign": "\u5948\u62c9\u7b26\u53f7", |
|
||||||
"peseta sign": "\u6bd4\u585e\u5854\u7b26\u53f7", |
|
||||||
"rupee sign": "\u5362\u6bd4\u7b26\u53f7", |
|
||||||
"won sign": "\u97e9\u5143\u7b26\u53f7", |
|
||||||
"new sheqel sign": "\u65b0\u8c22\u514b\u5c14\u7b26\u53f7", |
|
||||||
"dong sign": "\u8d8a\u5357\u76fe\u7b26\u53f7", |
|
||||||
"kip sign": "\u8001\u631d\u57fa\u666e\u7b26\u53f7", |
|
||||||
"tugrik sign": "\u56fe\u683c\u91cc\u514b\u7b26\u53f7", |
|
||||||
"drachma sign": "\u5fb7\u62c9\u514b\u9a6c\u7b26\u53f7", |
|
||||||
"german penny symbol": "\u5fb7\u56fd\u4fbf\u58eb\u7b26\u53f7", |
|
||||||
"peso sign": "\u6bd4\u7d22\u7b26\u53f7", |
|
||||||
"guarani sign": "\u74dc\u62c9\u5c3c\u7b26\u53f7", |
|
||||||
"austral sign": "\u6fb3\u5143\u7b26\u53f7", |
|
||||||
"hryvnia sign": "\u683c\u91cc\u592b\u5c3c\u4e9a\u7b26\u53f7", |
|
||||||
"cedi sign": "\u585e\u5730\u7b26\u53f7", |
|
||||||
"livre tournois sign": "\u91cc\u5f17\u5f17\u5c14\u7b26\u53f7", |
|
||||||
"spesmilo sign": "spesmilo\u7b26\u53f7", |
|
||||||
"tenge sign": "\u575a\u6208\u7b26\u53f7", |
|
||||||
"indian rupee sign": "\u5370\u5ea6\u5362\u6bd4", |
|
||||||
"turkish lira sign": "\u571f\u8033\u5176\u91cc\u62c9", |
|
||||||
"nordic mark sign": "\u5317\u6b27\u9a6c\u514b", |
|
||||||
"manat sign": "\u9a6c\u7eb3\u7279\u7b26\u53f7", |
|
||||||
"ruble sign": "\u5362\u5e03\u7b26\u53f7", |
|
||||||
"yen character": "\u65e5\u5143\u5b57\u6837", |
|
||||||
"yuan character": "\u4eba\u6c11\u5e01\u5143\u5b57\u6837", |
|
||||||
"yuan character, in hong kong and taiwan": "\u5143\u5b57\u6837\uff08\u6e2f\u53f0\u5730\u533a\uff09", |
|
||||||
"yen\/yuan character variant one": "\u5143\u5b57\u6837\uff08\u5927\u5199\uff09", |
|
||||||
"Loading emoticons...": "\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7...", |
|
||||||
"Could not load emoticons": "\u4e0d\u80fd\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7", |
|
||||||
"People": "\u4eba\u7c7b", |
|
||||||
"Animals and Nature": "\u52a8\u7269\u548c\u81ea\u7136", |
|
||||||
"Food and Drink": "\u98df\u7269\u548c\u996e\u54c1", |
|
||||||
"Activity": "\u6d3b\u52a8", |
|
||||||
"Travel and Places": "\u65c5\u6e38\u548c\u5730\u70b9", |
|
||||||
"Objects": "\u7269\u4ef6", |
|
||||||
"Flags": "\u65d7\u5e1c", |
|
||||||
"Characters": "\u5b57\u7b26", |
|
||||||
"Characters (no spaces)": "\u5b57\u7b26(\u65e0\u7a7a\u683c)", |
|
||||||
"{0} characters": "{0} \u4e2a\u5b57\u7b26", |
|
||||||
"Error: Form submit field collision.": "\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002", |
|
||||||
"Error: No form element found.": "\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002", |
|
||||||
"Update": "\u66f4\u65b0", |
|
||||||
"Color swatch": "\u989c\u8272\u6837\u672c", |
|
||||||
"Turquoise": "\u9752\u7eff\u8272", |
|
||||||
"Green": "\u7eff\u8272", |
|
||||||
"Blue": "\u84dd\u8272", |
|
||||||
"Purple": "\u7d2b\u8272", |
|
||||||
"Navy Blue": "\u6d77\u519b\u84dd", |
|
||||||
"Dark Turquoise": "\u6df1\u84dd\u7eff\u8272", |
|
||||||
"Dark Green": "\u6df1\u7eff\u8272", |
|
||||||
"Medium Blue": "\u4e2d\u84dd\u8272", |
|
||||||
"Medium Purple": "\u4e2d\u7d2b\u8272", |
|
||||||
"Midnight Blue": "\u6df1\u84dd\u8272", |
|
||||||
"Yellow": "\u9ec4\u8272", |
|
||||||
"Orange": "\u6a59\u8272", |
|
||||||
"Red": "\u7ea2\u8272", |
|
||||||
"Light Gray": "\u6d45\u7070\u8272", |
|
||||||
"Gray": "\u7070\u8272", |
|
||||||
"Dark Yellow": "\u6697\u9ec4\u8272", |
|
||||||
"Dark Orange": "\u6df1\u6a59\u8272", |
|
||||||
"Dark Red": "\u6df1\u7ea2\u8272", |
|
||||||
"Medium Gray": "\u4e2d\u7070\u8272", |
|
||||||
"Dark Gray": "\u6df1\u7070\u8272", |
|
||||||
"Light Green": "\u6d45\u7eff\u8272", |
|
||||||
"Light Yellow": "\u6d45\u9ec4\u8272", |
|
||||||
"Light Red": "\u6d45\u7ea2\u8272", |
|
||||||
"Light Purple": "\u6d45\u7d2b\u8272", |
|
||||||
"Light Blue": "\u6d45\u84dd\u8272", |
|
||||||
"Dark Purple": "\u6df1\u7d2b\u8272", |
|
||||||
"Dark Blue": "\u6df1\u84dd\u8272", |
|
||||||
"Black": "\u9ed1\u8272", |
|
||||||
"White": "\u767d\u8272", |
|
||||||
"Switch to or from fullscreen mode": "\u5207\u6362\u5168\u5c4f\u6a21\u5f0f", |
|
||||||
"Open help dialog": "\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846", |
|
||||||
"history": "\u5386\u53f2", |
|
||||||
"styles": "\u6837\u5f0f", |
|
||||||
"formatting": "\u683c\u5f0f\u5316", |
|
||||||
"alignment": "\u5bf9\u9f50", |
|
||||||
"indentation": "\u7f29\u8fdb", |
|
||||||
"Font": "\u5b57\u4f53", |
|
||||||
"Size": "\u5b57\u53f7", |
|
||||||
"More...": "\u66f4\u591a...", |
|
||||||
"Select...": "\u9009\u62e9...", |
|
||||||
"Preferences": "\u9996\u9009\u9879", |
|
||||||
"Yes": "\u662f", |
|
||||||
"No": "\u5426", |
|
||||||
"Keyboard Navigation": "\u952e\u76d8\u6307\u5f15", |
|
||||||
"Version": "\u7248\u672c", |
|
||||||
"Code view": "\u4ee3\u7801\u89c6\u56fe", |
|
||||||
"Open popup menu for split buttons": "\u6253\u5f00\u5f39\u51fa\u5f0f\u83dc\u5355\uff0c\u7528\u4e8e\u62c6\u5206\u6309\u94ae", |
|
||||||
"List Properties": "\u5217\u8868\u5c5e\u6027", |
|
||||||
"List properties...": "\u6807\u9898\u5b57\u4f53\u5c5e\u6027", |
|
||||||
"Start list at number": "\u4ee5\u6570\u5b57\u5f00\u59cb\u5217\u8868", |
|
||||||
"Line height": "\u884c\u9ad8", |
|
||||||
"comments": "\u5907\u6ce8", |
|
||||||
"Format Painter": "\u683c\u5f0f\u5237", |
|
||||||
"Insert\/edit iframe": "\u63d2\u5165\/\u7f16\u8f91\u6846\u67b6", |
|
||||||
"Capitalization": "\u5927\u5199", |
|
||||||
"lowercase": "\u5c0f\u5199", |
|
||||||
"UPPERCASE": "\u5927\u5199", |
|
||||||
"Title Case": "\u9996\u5b57\u6bcd\u5927\u5199", |
|
||||||
"permanent pen": "\u8bb0\u53f7\u7b14", |
|
||||||
"Permanent Pen Properties": "\u6c38\u4e45\u7b14\u5c5e\u6027", |
|
||||||
"Permanent pen properties...": "\u6c38\u4e45\u7b14\u5c5e\u6027...", |
|
||||||
"case change": "\u6848\u4f8b\u66f4\u6539", |
|
||||||
"page embed": "\u9875\u9762\u5d4c\u5165", |
|
||||||
"Advanced sort...": "\u9ad8\u7ea7\u6392\u5e8f...", |
|
||||||
"Advanced Sort": "\u9ad8\u7ea7\u6392\u5e8f", |
|
||||||
"Sort table by column ascending": "\u6309\u5217\u5347\u5e8f\u8868", |
|
||||||
"Sort table by column descending": "\u6309\u5217\u964d\u5e8f\u8868", |
|
||||||
"Sort": "\u6392\u5e8f", |
|
||||||
"Order": "\u6392\u5e8f", |
|
||||||
"Sort by": "\u6392\u5e8f\u65b9\u5f0f", |
|
||||||
"Ascending": "\u5347\u5e8f", |
|
||||||
"Descending": "\u964d\u5e8f", |
|
||||||
"Column {0}": "\u5217{0}", |
|
||||||
"Row {0}": "\u884c{0}", |
|
||||||
"Spellcheck...": "\u62fc\u5199\u68c0\u67e5...", |
|
||||||
"Misspelled word": "\u62fc\u5199\u9519\u8bef\u7684\u5355\u8bcd", |
|
||||||
"Suggestions": "\u5efa\u8bae", |
|
||||||
"Change": "\u66f4\u6539", |
|
||||||
"Finding word suggestions": "\u67e5\u627e\u5355\u8bcd\u5efa\u8bae", |
|
||||||
"Success": "\u6210\u529f", |
|
||||||
"Repair": "\u4fee\u590d", |
|
||||||
"Issue {0} of {1}": "\u5171\u8ba1{1}\u95ee\u9898{0}", |
|
||||||
"Images must be marked as decorative or have an alternative text description": "\u56fe\u50cf\u5fc5\u987b\u6807\u8bb0\u4e3a\u88c5\u9970\u6027\u6216\u5177\u6709\u66ff\u4ee3\u6587\u672c\u63cf\u8ff0", |
|
||||||
"Images must have an alternative text description. Decorative images are not allowed.": "\u56fe\u50cf\u5fc5\u987b\u5177\u6709\u66ff\u4ee3\u6587\u672c\u63cf\u8ff0\u3002\u4e0d\u5141\u8bb8\u4f7f\u7528\u88c5\u9970\u56fe\u50cf\u3002", |
|
||||||
"Or provide alternative text:": "\u6216\u63d0\u4f9b\u5907\u9009\u6587\u672c\uff1a", |
|
||||||
"Make image decorative:": "\u4f7f\u56fe\u50cf\u88c5\u9970\uff1a", |
|
||||||
"ID attribute must be unique": "ID \u5c5e\u6027\u5fc5\u987b\u662f\u552f\u4e00\u7684", |
|
||||||
"Make ID unique": "\u4f7f ID \u72ec\u4e00\u65e0\u4e8c", |
|
||||||
"Keep this ID and remove all others": "\u4fdd\u7559\u6b64 ID \u5e76\u5220\u9664\u6240\u6709\u5176\u4ed6", |
|
||||||
"Remove this ID": "\u5220\u9664\u6b64 ID", |
|
||||||
"Remove all IDs": "\u6e05\u9664\u5168\u90e8IDs", |
|
||||||
"Checklist": "\u6e05\u5355", |
|
||||||
"Anchor": "\u951a\u70b9", |
|
||||||
"Special character": "\u7279\u6b8a\u7b26\u53f7", |
|
||||||
"Code sample": "\u4ee3\u7801\u793a\u4f8b", |
|
||||||
"Color": "\u989c\u8272", |
|
||||||
"Document properties": "\u6587\u6863\u5c5e\u6027", |
|
||||||
"Image description": "\u56fe\u7247\u63cf\u8ff0", |
|
||||||
"Image": "\u56fe\u7247", |
|
||||||
"Insert link": "\u63d2\u5165\u94fe\u63a5", |
|
||||||
"Target": "\u6253\u5f00\u65b9\u5f0f", |
|
||||||
"Link": "\u94fe\u63a5", |
|
||||||
"Poster": "\u5c01\u9762", |
|
||||||
"Media": "\u5a92\u4f53", |
|
||||||
"Print": "\u6253\u5370", |
|
||||||
"Prev": "\u4e0a\u4e00\u4e2a", |
|
||||||
"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362", |
|
||||||
"Whole words": "\u5168\u5b57\u5339\u914d", |
|
||||||
"Insert template": "\u63d2\u5165\u6a21\u677f" |
|
||||||
}); |
|
@ -1,419 +0,0 @@ |
|||||||
tinymce.addI18n('zh_TW',{ |
|
||||||
"Redo": "\u91cd\u505a", |
|
||||||
"Undo": "\u64a4\u92b7", |
|
||||||
"Cut": "\u526a\u4e0b", |
|
||||||
"Copy": "\u8907\u88fd", |
|
||||||
"Paste": "\u8cbc\u4e0a", |
|
||||||
"Select all": "\u5168\u9078", |
|
||||||
"New document": "\u65b0\u6587\u4ef6", |
|
||||||
"Ok": "\u78ba\u5b9a", |
|
||||||
"Cancel": "\u53d6\u6d88", |
|
||||||
"Visual aids": "\u5c0f\u5e6b\u624b", |
|
||||||
"Bold": "\u7c97\u9ad4", |
|
||||||
"Italic": "\u659c\u9ad4", |
|
||||||
"Underline": "\u4e0b\u5283\u7dda", |
|
||||||
"Strikethrough": "\u522a\u9664\u7dda", |
|
||||||
"Superscript": "\u4e0a\u6a19", |
|
||||||
"Subscript": "\u4e0b\u6a19", |
|
||||||
"Clear formatting": "\u6e05\u9664\u683c\u5f0f", |
|
||||||
"Align left": "\u5de6\u908a\u5c0d\u9f4a", |
|
||||||
"Align center": "\u4e2d\u9593\u5c0d\u9f4a", |
|
||||||
"Align right": "\u53f3\u908a\u5c0d\u9f4a", |
|
||||||
"Justify": "\u5de6\u53f3\u5c0d\u9f4a", |
|
||||||
"Bullet list": "\u9805\u76ee\u6e05\u55ae", |
|
||||||
"Numbered list": "\u6578\u5b57\u6e05\u55ae", |
|
||||||
"Decrease indent": "\u6e1b\u5c11\u7e2e\u6392", |
|
||||||
"Increase indent": "\u589e\u52a0\u7e2e\u6392", |
|
||||||
"Close": "\u95dc\u9589", |
|
||||||
"Formats": "\u683c\u5f0f", |
|
||||||
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u60a8\u7684\u700f\u89bd\u5668\u4e0d\u652f\u63f4\u5b58\u53d6\u526a\u8cbc\u7c3f\uff0c\u53ef\u4ee5\u4f7f\u7528\u5feb\u901f\u9375 Ctrl + X\/C\/V \u4ee3\u66ff\u526a\u4e0b\u3001\u8907\u88fd\u8207\u8cbc\u4e0a\u3002", |
|
||||||
"Headers": "\u6a19\u984c", |
|
||||||
"Header 1": "\u6a19\u984c 1", |
|
||||||
"Header 2": "\u6a19\u984c 2", |
|
||||||
"Header 3": "\u6a19\u984c 3", |
|
||||||
"Header 4": "\u6a19\u984c 4", |
|
||||||
"Header 5": "\u6a19\u984c 5", |
|
||||||
"Header 6": "\u6a19\u984c 6", |
|
||||||
"Headings": "\u6a19\u984c", |
|
||||||
"Heading 1": "\u6a19\u984c1", |
|
||||||
"Heading 2": "\u6a19\u984c2", |
|
||||||
"Heading 3": "\u6a19\u984c3", |
|
||||||
"Heading 4": "\u6a19\u984c4", |
|
||||||
"Heading 5": "\u6a19\u984c5", |
|
||||||
"Heading 6": "\u6a19\u984c6", |
|
||||||
"Preformatted": "\u9810\u5148\u683c\u5f0f\u5316\u7684", |
|
||||||
"Div": "Div", |
|
||||||
"Pre": "Pre", |
|
||||||
"Code": "\u4ee3\u78bc", |
|
||||||
"Paragraph": "\u6bb5\u843d", |
|
||||||
"Blockquote": "\u5f15\u6587\u5340\u584a", |
|
||||||
"Inline": "\u5167\u806f", |
|
||||||
"Blocks": "\u57fa\u584a", |
|
||||||
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u76ee\u524d\u5c07\u4ee5\u7d14\u6587\u5b57\u7684\u6a21\u5f0f\u8cbc\u4e0a\uff0c\u60a8\u53ef\u4ee5\u518d\u9ede\u9078\u4e00\u6b21\u53d6\u6d88\u3002", |
|
||||||
"Fonts": "\u5b57\u578b", |
|
||||||
"Font Sizes": "\u5b57\u578b\u5927\u5c0f", |
|
||||||
"Class": "\u985e\u578b", |
|
||||||
"Browse for an image": "\u5f9e\u5716\u7247\u4e2d\u700f\u89bd", |
|
||||||
"OR": "\u6216", |
|
||||||
"Drop an image here": "\u62d6\u66f3\u5716\u7247\u81f3\u6b64", |
|
||||||
"Upload": "\u4e0a\u50b3", |
|
||||||
"Block": "\u5340\u584a", |
|
||||||
"Align": "\u5c0d\u9f4a", |
|
||||||
"Default": "\u9810\u8a2d", |
|
||||||
"Circle": "\u7a7a\u5fc3\u5713", |
|
||||||
"Disc": "\u5be6\u5fc3\u5713", |
|
||||||
"Square": "\u6b63\u65b9\u5f62", |
|
||||||
"Lower Alpha": "\u5c0f\u5beb\u82f1\u6587\u5b57\u6bcd", |
|
||||||
"Lower Greek": "\u5e0c\u81d8\u5b57\u6bcd", |
|
||||||
"Lower Roman": "\u5c0f\u5beb\u7f85\u99ac\u6578\u5b57", |
|
||||||
"Upper Alpha": "\u5927\u5beb\u82f1\u6587\u5b57\u6bcd", |
|
||||||
"Upper Roman": "\u5927\u5beb\u7f85\u99ac\u6578\u5b57", |
|
||||||
"Anchor...": "\u9328\u9ede...", |
|
||||||
"Name": "\u540d\u7a31", |
|
||||||
"Id": "Id", |
|
||||||
"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "Id\u61c9\u4ee5\u5b57\u6bcd\u958b\u982d\uff0c\u5f8c\u9762\u63a5\u8457\u5b57\u6bcd\uff0c\u6578\u5b57\uff0c\u7834\u6298\u865f\uff0c\u9ede\u6578\uff0c\u5192\u865f\u6216\u4e0b\u5283\u7dda\u3002", |
|
||||||
"You have unsaved changes are you sure you want to navigate away?": "\u7de8\u8f2f\u5c1a\u672a\u88ab\u5132\u5b58\uff0c\u4f60\u78ba\u5b9a\u8981\u96e2\u958b\uff1f", |
|
||||||
"Restore last draft": "\u8f09\u5165\u4e0a\u4e00\u6b21\u7de8\u8f2f\u7684\u8349\u7a3f", |
|
||||||
"Special character...": "\u7279\u6b8a\u5b57\u5143......", |
|
||||||
"Source code": "\u539f\u59cb\u78bc", |
|
||||||
"Insert\/Edit code sample": "\u63d2\u5165\/\u7de8\u8f2f \u7a0b\u5f0f\u78bc\u7bc4\u4f8b", |
|
||||||
"Language": "\u8a9e\u8a00", |
|
||||||
"Code sample...": "\u7a0b\u5f0f\u78bc\u7bc4\u4f8b...", |
|
||||||
"Color Picker": "\u9078\u8272\u5668", |
|
||||||
"R": "\u7d05", |
|
||||||
"G": "\u7da0", |
|
||||||
"B": "\u85cd", |
|
||||||
"Left to right": "\u5f9e\u5de6\u5230\u53f3", |
|
||||||
"Right to left": "\u5f9e\u53f3\u5230\u5de6", |
|
||||||
"Emoticons...": "\u8868\u60c5\u7b26\u865f\u2026", |
|
||||||
"Metadata and Document Properties": "\u5f8c\u8a2d\u8cc7\u6599\u8207\u6587\u4ef6\u5c6c\u6027", |
|
||||||
"Title": "\u6a19\u984c", |
|
||||||
"Keywords": "\u95dc\u9375\u5b57", |
|
||||||
"Description": "\u63cf\u8ff0", |
|
||||||
"Robots": "\u6a5f\u5668\u4eba", |
|
||||||
"Author": "\u4f5c\u8005", |
|
||||||
"Encoding": "\u7de8\u78bc", |
|
||||||
"Fullscreen": "\u5168\u87a2\u5e55", |
|
||||||
"Action": "\u52d5\u4f5c", |
|
||||||
"Shortcut": "\u5feb\u901f\u9375", |
|
||||||
"Help": "\u5e6b\u52a9", |
|
||||||
"Address": "\u5730\u5740", |
|
||||||
"Focus to menubar": "\u8df3\u81f3\u9078\u55ae\u5217", |
|
||||||
"Focus to toolbar": "\u8df3\u81f3\u5de5\u5177\u5217", |
|
||||||
"Focus to element path": "\u8df3\u81f3HTML\u5143\u7d20\u5217", |
|
||||||
"Focus to contextual toolbar": "\u8df3\u81f3\u5feb\u6377\u9078\u55ae", |
|
||||||
"Insert link (if link plugin activated)": "\u65b0\u589e\u6377\u5f91 (\u6377\u5f91\u5916\u639b\u555f\u7528\u6642)", |
|
||||||
"Save (if save plugin activated)": "\u5132\u5b58 (\u5132\u5b58\u5916\u639b\u555f\u7528\u6642)", |
|
||||||
"Find (if searchreplace plugin activated)": "\u5c0b\u627e (\u5c0b\u627e\u53d6\u4ee3\u5916\u639b\u555f\u7528\u6642)", |
|
||||||
"Plugins installed ({0}):": "({0}) \u500b\u5916\u639b\u5df2\u5b89\u88dd\uff1a", |
|
||||||
"Premium plugins:": "\u52a0\u503c\u5916\u639b\uff1a", |
|
||||||
"Learn more...": "\u4e86\u89e3\u66f4\u591a...", |
|
||||||
"You are using {0}": "\u60a8\u6b63\u5728\u4f7f\u7528 {0}", |
|
||||||
"Plugins": "\u5916\u639b", |
|
||||||
"Handy Shortcuts": "\u5feb\u901f\u9375", |
|
||||||
"Horizontal line": "\u6c34\u5e73\u7dda", |
|
||||||
"Insert\/edit image": "\u63d2\u5165\/\u7de8\u8f2f \u5716\u7247", |
|
||||||
"Image description": "\u5716\u7247\u63cf\u8ff0", |
|
||||||
"Source": "\u5716\u7247\u7db2\u5740", |
|
||||||
"Dimensions": "\u5c3a\u5bf8", |
|
||||||
"Constrain proportions": "\u7b49\u6bd4\u4f8b\u7e2e\u653e", |
|
||||||
"General": "\u4e00\u822c", |
|
||||||
"Advanced": "\u9032\u968e", |
|
||||||
"Style": "\u6a23\u5f0f", |
|
||||||
"Vertical space": "\u9ad8\u5ea6", |
|
||||||
"Horizontal space": "\u5bec\u5ea6", |
|
||||||
"Border": "\u908a\u6846", |
|
||||||
"Insert image": "\u63d2\u5165\u5716\u7247", |
|
||||||
"Image...": "\u5716\u7247......", |
|
||||||
"Image list": "\u5716\u7247\u6e05\u55ae", |
|
||||||
"Rotate counterclockwise": "\u9006\u6642\u91dd\u65cb\u8f49", |
|
||||||
"Rotate clockwise": "\u9806\u6642\u91dd\u65cb\u8f49", |
|
||||||
"Flip vertically": "\u5782\u76f4\u7ffb\u8f49", |
|
||||||
"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f49", |
|
||||||
"Edit image": "\u7de8\u8f2f\u5716\u7247", |
|
||||||
"Image options": "\u5716\u7247\u9078\u9805", |
|
||||||
"Zoom in": "\u653e\u5927", |
|
||||||
"Zoom out": "\u7e2e\u5c0f", |
|
||||||
"Crop": "\u88c1\u526a", |
|
||||||
"Resize": "\u8abf\u6574\u5927\u5c0f", |
|
||||||
"Orientation": "\u65b9\u5411", |
|
||||||
"Brightness": "\u4eae\u5ea6", |
|
||||||
"Sharpen": "\u92b3\u5316", |
|
||||||
"Contrast": "\u5c0d\u6bd4", |
|
||||||
"Color levels": "\u984f\u8272\u5c64\u6b21", |
|
||||||
"Gamma": "\u4f3d\u99ac\u503c", |
|
||||||
"Invert": "\u53cd\u8f49", |
|
||||||
"Apply": "\u61c9\u7528", |
|
||||||
"Back": "\u5f8c\u9000", |
|
||||||
"Insert date\/time": "\u63d2\u5165 \u65e5\u671f\/\u6642\u9593", |
|
||||||
"Date\/time": "\u65e5\u671f\/\u6642\u9593", |
|
||||||
"Insert\/Edit Link": "\u63d2\u5165\/\u7de8\u8f2f\u9023\u7d50", |
|
||||||
"Insert\/edit link": "\u63d2\u5165\/\u7de8\u8f2f\u9023\u7d50", |
|
||||||
"Text to display": "\u986f\u793a\u6587\u5b57", |
|
||||||
"Url": "\u7db2\u5740", |
|
||||||
"Open link in...": "\u958b\u555f\u9023\u7d50\u65bc...", |
|
||||||
"Current window": "\u76ee\u524d\u8996\u7a97", |
|
||||||
"None": "\u7121", |
|
||||||
"New window": "\u53e6\u958b\u8996\u7a97", |
|
||||||
"Remove link": "\u79fb\u9664\u9023\u7d50", |
|
||||||
"Anchors": "\u52a0\u5165\u9328\u9ede", |
|
||||||
"Link...": "\u9023\u7d50...", |
|
||||||
"Paste or type a link": "\u8cbc\u4e0a\u6216\u8f38\u5165\u9023\u7d50", |
|
||||||
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5beb\u7684URL\u70ba\u96fb\u5b50\u90f5\u4ef6\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7db4\u55ce\uff1f", |
|
||||||
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5beb\u7684URL\u5c6c\u65bc\u5916\u90e8\u93c8\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7db4\u55ce\uff1f", |
|
||||||
"Link list": "\u9023\u7d50\u6e05\u55ae", |
|
||||||
"Insert video": "\u63d2\u5165\u5f71\u97f3", |
|
||||||
"Insert\/edit video": "\u63d2\u4ef6\/\u7de8\u8f2f \u5f71\u97f3", |
|
||||||
"Insert\/edit media": "\u63d2\u5165\/\u7de8\u8f2f \u5a92\u9ad4", |
|
||||||
"Alternative source": "\u66ff\u4ee3\u5f71\u97f3", |
|
||||||
"Alternative source URL": "\u66ff\u4ee3\u4f86\u6e90URL", |
|
||||||
"Media poster (Image URL)": "\u5a92\u9ad4\u6d77\u5831\uff08\u5f71\u50cfImage URL\uff09", |
|
||||||
"Paste your embed code below:": "\u8acb\u5c07\u60a8\u7684\u5d4c\u5165\u5f0f\u7a0b\u5f0f\u78bc\u8cbc\u5728\u4e0b\u9762:", |
|
||||||
"Embed": "\u5d4c\u5165\u78bc", |
|
||||||
"Media...": "\u5a92\u9ad4...", |
|
||||||
"Nonbreaking space": "\u4e0d\u5206\u884c\u7684\u7a7a\u683c", |
|
||||||
"Page break": "\u5206\u9801", |
|
||||||
"Paste as text": "\u4ee5\u7d14\u6587\u5b57\u8cbc\u4e0a", |
|
||||||
"Preview": "\u9810\u89bd", |
|
||||||
"Print...": "\u5217\u5370...", |
|
||||||
"Save": "\u5132\u5b58", |
|
||||||
"Find": "\u641c\u5c0b", |
|
||||||
"Replace with": "\u66f4\u63db", |
|
||||||
"Replace": "\u66ff\u63db", |
|
||||||
"Replace all": "\u66ff\u63db\u5168\u90e8", |
|
||||||
"Previous": "\u4e0a\u4e00\u500b", |
|
||||||
"Next": "\u4e0b\u4e00\u500b", |
|
||||||
"Find and replace...": "\u5c0b\u627e\u53ca\u53d6\u4ee3...", |
|
||||||
"Could not find the specified string.": "\u7121\u6cd5\u67e5\u8a62\u5230\u6b64\u7279\u5b9a\u5b57\u4e32", |
|
||||||
"Match case": "\u76f8\u5339\u914d\u6848\u4ef6", |
|
||||||
"Find whole words only": "\u50c5\u627e\u51fa\u5b8c\u6574\u5b57\u532f", |
|
||||||
"Spell check": "\u62fc\u5beb\u6aa2\u67e5", |
|
||||||
"Ignore": "\u5ffd\u7565", |
|
||||||
"Ignore all": "\u5ffd\u7565\u6240\u6709", |
|
||||||
"Finish": "\u5b8c\u6210", |
|
||||||
"Add to Dictionary": "\u52a0\u5165\u5b57\u5178\u4e2d", |
|
||||||
"Insert table": "\u63d2\u5165\u8868\u683c", |
|
||||||
"Table properties": "\u8868\u683c\u5c6c\u6027", |
|
||||||
"Delete table": "\u522a\u9664\u8868\u683c", |
|
||||||
"Cell": "\u5132\u5b58\u683c", |
|
||||||
"Row": "\u5217", |
|
||||||
"Column": "\u884c", |
|
||||||
"Cell properties": "\u5132\u5b58\u683c\u5c6c\u6027", |
|
||||||
"Merge cells": "\u5408\u4f75\u5132\u5b58\u683c", |
|
||||||
"Split cell": "\u5206\u5272\u5132\u5b58\u683c", |
|
||||||
"Insert row before": "\u63d2\u5165\u5217\u5728...\u4e4b\u524d", |
|
||||||
"Insert row after": "\u63d2\u5165\u5217\u5728...\u4e4b\u5f8c", |
|
||||||
"Delete row": "\u522a\u9664\u5217", |
|
||||||
"Row properties": "\u5217\u5c6c\u6027", |
|
||||||
"Cut row": "\u526a\u4e0b\u5217", |
|
||||||
"Copy row": "\u8907\u88fd\u5217", |
|
||||||
"Paste row before": "\u8cbc\u4e0a\u5217\u5728...\u4e4b\u524d", |
|
||||||
"Paste row after": "\u8cbc\u4e0a\u5217\u5728...\u4e4b\u5f8c", |
|
||||||
"Insert column before": "\u63d2\u5165\u6b04\u4f4d\u5728...\u4e4b\u524d", |
|
||||||
"Insert column after": "\u63d2\u5165\u6b04\u4f4d\u5728...\u4e4b\u5f8c", |
|
||||||
"Delete column": "\u522a\u9664\u884c", |
|
||||||
"Cols": "\u6b04\u4f4d\u6bb5", |
|
||||||
"Rows": "\u5217", |
|
||||||
"Width": "\u5bec\u5ea6", |
|
||||||
"Height": "\u9ad8\u5ea6", |
|
||||||
"Cell spacing": "\u5132\u5b58\u683c\u5f97\u9593\u8ddd", |
|
||||||
"Cell padding": "\u5132\u5b58\u683c\u7684\u908a\u8ddd", |
|
||||||
"Show caption": "\u986f\u793a\u6a19\u984c", |
|
||||||
"Left": "\u5de6\u908a", |
|
||||||
"Center": "\u4e2d\u9593", |
|
||||||
"Right": "\u53f3\u908a", |
|
||||||
"Cell type": "\u5132\u5b58\u683c\u7684\u985e\u578b", |
|
||||||
"Scope": "\u7bc4\u570d", |
|
||||||
"Alignment": "\u5c0d\u9f4a", |
|
||||||
"H Align": "\u6c34\u5e73\u4f4d\u7f6e", |
|
||||||
"V Align": "\u5782\u76f4\u4f4d\u7f6e", |
|
||||||
"Top": "\u7f6e\u9802", |
|
||||||
"Middle": "\u7f6e\u4e2d", |
|
||||||
"Bottom": "\u7f6e\u5e95", |
|
||||||
"Header cell": "\u6a19\u982d\u5132\u5b58\u683c", |
|
||||||
"Row group": "\u5217\u7fa4\u7d44", |
|
||||||
"Column group": "\u6b04\u4f4d\u7fa4\u7d44", |
|
||||||
"Row type": "\u884c\u7684\u985e\u578b", |
|
||||||
"Header": "\u6a19\u982d", |
|
||||||
"Body": "\u4e3b\u9ad4", |
|
||||||
"Footer": "\u9801\u5c3e", |
|
||||||
"Border color": "\u908a\u6846\u984f\u8272", |
|
||||||
"Insert template...": "\u63d2\u5165\u6a23\u7248...", |
|
||||||
"Templates": "\u6a23\u7248", |
|
||||||
"Template": "\u6a23\u677f", |
|
||||||
"Text color": "\u6587\u5b57\u984f\u8272", |
|
||||||
"Background color": "\u80cc\u666f\u984f\u8272", |
|
||||||
"Custom...": "\u81ea\u8a02", |
|
||||||
"Custom color": "\u81ea\u8a02\u984f\u8272", |
|
||||||
"No color": "No color", |
|
||||||
"Remove color": "\u79fb\u9664\u984f\u8272", |
|
||||||
"Table of Contents": "\u76ee\u9304", |
|
||||||
"Show blocks": "\u986f\u793a\u5340\u584a\u8cc7\u8a0a", |
|
||||||
"Show invisible characters": "\u986f\u793a\u96b1\u85cf\u5b57\u5143", |
|
||||||
"Word count": "\u8a08\u7b97\u5b57\u6578", |
|
||||||
"Count": "\u8a08\u7b97", |
|
||||||
"Document": "\u6587\u4ef6", |
|
||||||
"Selection": "\u9078\u9805", |
|
||||||
"Words": "\u5b57\u6578", |
|
||||||
"Words: {0}": "\u5b57\u6578\uff1a{0}", |
|
||||||
"{0} words": "{0} \u5b57\u5143", |
|
||||||
"File": "\u6a94\u6848", |
|
||||||
"Edit": "\u7de8\u8f2f", |
|
||||||
"Insert": "\u63d2\u5165", |
|
||||||
"View": "\u6aa2\u8996", |
|
||||||
"Format": "\u683c\u5f0f", |
|
||||||
"Table": "\u8868\u683c", |
|
||||||
"Tools": "\u5de5\u5177", |
|
||||||
"Powered by {0}": "\u7531 {0} \u63d0\u4f9b", |
|
||||||
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u8c50\u5bcc\u7684\u6587\u672c\u5340\u57df\u3002\u6309ALT-F9\u524d\u5f80\u4e3b\u9078\u55ae\u3002\u6309ALT-F10\u547c\u53eb\u5de5\u5177\u6b04\u3002\u6309ALT-0\u5c0b\u6c42\u5e6b\u52a9", |
|
||||||
"Image title": "\u5716\u7247\u6a19\u984c", |
|
||||||
"Border width": "\u6846\u7dda\u5bec\u5ea6", |
|
||||||
"Border style": "\u6846\u7dda\u6a23\u5f0f", |
|
||||||
"Error": "\u932f\u8aa4", |
|
||||||
"Warn": "\u8b66\u544a", |
|
||||||
"Valid": "\u6709\u6548", |
|
||||||
"To open the popup, press Shift+Enter": "\u8981\u958b\u555f\u5f48\u51fa\u8996\u7a97\uff0c\u8acb\u6309Shift+Enter", |
|
||||||
"Rich Text Area. Press ALT-0 for help.": "\u5bcc\u6587\u672c\u5340\u57df\u3002\u8acb\u6309ALT-0\u5c0b\u6c42\u5354\u52a9\u3002", |
|
||||||
"System Font": "\u7cfb\u7d71\u5b57\u578b", |
|
||||||
"Failed to upload image: {0}": "\u7121\u6cd5\u4e0a\u50b3\u5f71\u50cf\uff1a{0}", |
|
||||||
"Failed to load plugin: {0} from url {1}": "\u7121\u6cd5\u4e0a\u50b3\u63d2\u4ef6\uff1a{0}\u81eaurl{1}", |
|
||||||
"Failed to load plugin url: {0}": "\u7121\u6cd5\u4e0a\u50b3\u63d2\u4ef6\uff1a{0}", |
|
||||||
"Failed to initialize plugin: {0}": "\u7121\u6cd5\u555f\u52d5\u63d2\u4ef6\uff1a{0}", |
|
||||||
"example": "\u7bc4\u4f8b", |
|
||||||
"Search": "\u641c\u7d22", |
|
||||||
"All": "\u5168\u90e8", |
|
||||||
"Currency": "\u8ca8\u5e63", |
|
||||||
"Text": "\u6587\u672c", |
|
||||||
"Quotations": "\u5f15\u7528", |
|
||||||
"Mathematical": "\u6578\u5b78", |
|
||||||
"Extended Latin": "\u62c9\u4e01\u5b57\u6bcd\u64f4\u5145", |
|
||||||
"Symbols": "\u7b26\u865f", |
|
||||||
"Arrows": "\u7bad\u982d", |
|
||||||
"User Defined": "\u4f7f\u7528\u8005\u5df2\u5b9a\u7fa9", |
|
||||||
"dollar sign": "\u7f8e\u5143\u7b26\u865f", |
|
||||||
"currency sign": "\u8ca8\u5e63\u7b26\u865f", |
|
||||||
"euro-currency sign": "\u6b50\u5143\u7b26\u865f", |
|
||||||
"colon sign": "\u79d1\u6717\u7b26\u865f", |
|
||||||
"cruzeiro sign": "\u514b\u9b6f\u8cfd\u7f85\u7b26\u865f", |
|
||||||
"french franc sign": "\u6cd5\u6717\u7b26\u865f", |
|
||||||
"lira sign": "\u91cc\u62c9\u7b26\u865f", |
|
||||||
"mill sign": "\u6587\u7b26\u865f", |
|
||||||
"naira sign": "\u5948\u62c9\u7b26\u865f", |
|
||||||
"peseta sign": "\u6bd4\u585e\u5854\u7b26\u865f", |
|
||||||
"rupee sign": "\u76e7\u6bd4\u7b26\u865f", |
|
||||||
"won sign": "\u97d3\u571c\u7b26\u865f", |
|
||||||
"new sheqel sign": "\u65b0\u8b1d\u514b\u723e\u7b26\u865f", |
|
||||||
"dong sign": "\u8d8a\u5357\u76fe\u7b26\u865f", |
|
||||||
"kip sign": "\u8001\u64be\u5e63\u7b26\u865f", |
|
||||||
"tugrik sign": "\u8499\u53e4\u5e63\u7b26\u865f", |
|
||||||
"drachma sign": "\u5fb7\u514b\u62c9\u99ac\u7b26\u865f", |
|
||||||
"german penny symbol": "\u5fb7\u570b\u5206\u7b26\u865f", |
|
||||||
"peso sign": "\u62ab\u7d22\u7b26\u865f", |
|
||||||
"guarani sign": "\u5df4\u62c9\u572d\u5e63\u7b26\u865f", |
|
||||||
"austral sign": "\u963f\u6839\u5ef7\u5e63\u7b26\u865f", |
|
||||||
"hryvnia sign": "\u70cf\u514b\u862d\u5e63\u7b26\u865f", |
|
||||||
"cedi sign": "\u8fe6\u7d0d\u5e63\u7b26\u865f", |
|
||||||
"livre tournois sign": "\u91cc\u5f17\u723e\u7b26\u865f", |
|
||||||
"spesmilo sign": "\u570b\u969b\u5e63\u7b26\u865f", |
|
||||||
"tenge sign": "\u54c8\u85a9\u514b\u5e63\u7b26\u865f", |
|
||||||
"indian rupee sign": "\u5370\u5ea6\u76e7\u6bd4\u7b26\u865f", |
|
||||||
"turkish lira sign": "\u571f\u8033\u5176\u91cc\u62c9\u7b26\u865f", |
|
||||||
"nordic mark sign": "\u5317\u6b50\u99ac\u514b\u7b26\u865f", |
|
||||||
"manat sign": "\u4e9e\u585e\u62dc\u7136\u5e63\u7b26\u865f", |
|
||||||
"ruble sign": "\u76e7\u5e03\u7b26\u865f", |
|
||||||
"yen character": "\u65e5\u5713\u7b26\u865f", |
|
||||||
"yuan character": "\u4eba\u6c11\u5e63\u7b26\u865f", |
|
||||||
"yuan character, in hong kong and taiwan": "\u6e2f\u5143\u8207\u53f0\u5e63\u7b26\u865f", |
|
||||||
"yen\/yuan character variant one": "\u65e5\u5713\/\u4eba\u6c11\u5e63\u7b26\u865f\u8b8a\u5316\u578b", |
|
||||||
"Loading emoticons...": "\u8f09\u5165\u8868\u60c5\u7b26\u865f\u2026", |
|
||||||
"Could not load emoticons": "\u7121\u6cd5\u8f09\u5165\u8868\u60c5\u7b26\u865f", |
|
||||||
"People": "\u4eba", |
|
||||||
"Animals and Nature": "\u52d5\u7269\u8207\u81ea\u7136", |
|
||||||
"Food and Drink": "\u98f2\u98df", |
|
||||||
"Activity": "\u6d3b\u52d5", |
|
||||||
"Travel and Places": "\u65c5\u884c\u8207\u5730\u9ede", |
|
||||||
"Objects": "\u7269\u4ef6", |
|
||||||
"Flags": "\u65d7\u6a19", |
|
||||||
"Characters": "\u5b57\u5143", |
|
||||||
"Characters (no spaces)": "\u5b57\u5143\uff08\u7121\u7a7a\u683c\uff09", |
|
||||||
"{0} characters": "{0}\u5b57\u5143", |
|
||||||
"Error: Form submit field collision.": "\u932f\u8aa4\uff1a\u8868\u683c\u905e\u4ea4\u6b04\u4f4d\u885d\u7a81\u3002", |
|
||||||
"Error: No form element found.": "\u932f\u8aa4\uff1a\u627e\u4e0d\u5230\u8868\u683c\u5143\u7d20\u3002", |
|
||||||
"Update": "\u66f4\u65b0", |
|
||||||
"Color swatch": "\u8272\u5f69\u6a23\u672c", |
|
||||||
"Turquoise": "\u571f\u8033\u5176\u85cd", |
|
||||||
"Green": "\u7da0\u8272", |
|
||||||
"Blue": "\u85cd\u8272", |
|
||||||
"Purple": "\u7d2b\u8272", |
|
||||||
"Navy Blue": "\u6df1\u85cd\u8272", |
|
||||||
"Dark Turquoise": "\u6df1\u571f\u8033\u5176\u85cd", |
|
||||||
"Dark Green": "\u6df1\u7da0\u8272", |
|
||||||
"Medium Blue": "\u4e2d\u85cd\u8272", |
|
||||||
"Medium Purple": "\u4e2d\u7d2b\u8272", |
|
||||||
"Midnight Blue": "\u9ed1\u85cd\u8272", |
|
||||||
"Yellow": "\u9ec3\u8272", |
|
||||||
"Orange": "\u6a59\u8272", |
|
||||||
"Red": "\u7d05\u8272", |
|
||||||
"Light Gray": "\u6dfa\u7070\u8272", |
|
||||||
"Gray": "\u7070\u8272", |
|
||||||
"Dark Yellow": "\u6df1\u9ec3\u8272", |
|
||||||
"Dark Orange": "\u6df1\u6a59\u8272", |
|
||||||
"Dark Red": "\u6697\u7d05\u8272", |
|
||||||
"Medium Gray": "\u4e2d\u7070\u8272", |
|
||||||
"Dark Gray": "\u6df1\u7070\u8272", |
|
||||||
"Light Green": "\u6de1\u7da0\u8272", |
|
||||||
"Light Yellow": "\u6dfa\u9ec3\u8272", |
|
||||||
"Light Red": "\u6dfa\u7d05\u8272", |
|
||||||
"Light Purple": "\u6dfa\u7d2b\u8272", |
|
||||||
"Light Blue": "\u6dfa\u85cd\u8272", |
|
||||||
"Dark Purple": "\u6df1\u7d2b\u8272", |
|
||||||
"Dark Blue": "\u6df1\u85cd\u8272", |
|
||||||
"Black": "\u9ed1\u8272", |
|
||||||
"White": "\u767d\u8272", |
|
||||||
"Switch to or from fullscreen mode": "\u8f49\u63db\u81ea\/\u81f3\u5168\u87a2\u5e55\u6a21\u5f0f", |
|
||||||
"Open help dialog": "\u958b\u555f\u5354\u52a9\u5c0d\u8a71", |
|
||||||
"history": "\u6b77\u53f2", |
|
||||||
"styles": "\u6a23\u5f0f", |
|
||||||
"formatting": "\u683c\u5f0f", |
|
||||||
"alignment": "\u5c0d\u9f4a", |
|
||||||
"indentation": "\u7e2e\u6392", |
|
||||||
"permanent pen": "\u6c38\u4e45\u6027\u7b46", |
|
||||||
"comments": "\u8a3b\u89e3", |
|
||||||
"Format Painter": "\u8907\u88fd\u683c\u5f0f", |
|
||||||
"Insert\/edit iframe": "\u63d2\u5165\/\u7de8\u8f2fiframe", |
|
||||||
"Capitalization": "\u5927\u5beb", |
|
||||||
"lowercase": "\u5c0f\u5beb", |
|
||||||
"UPPERCASE": "\u5927\u5beb", |
|
||||||
"Title Case": "\u5b57\u9996\u5927\u5beb", |
|
||||||
"Permanent Pen Properties": "\u6c38\u4e45\u6a19\u8a18\u5c6c\u6027", |
|
||||||
"Permanent pen properties...": "\u6c38\u4e45\u6a19\u8a18\u5c6c\u6027......", |
|
||||||
"Font": "\u5b57\u578b", |
|
||||||
"Size": "\u5b57\u5f62\u5927\u5c0f", |
|
||||||
"More...": "\u66f4\u591a\u8cc7\u8a0a......", |
|
||||||
"Spellcheck Language": "\u62fc\u5beb\u8a9e\u8a00", |
|
||||||
"Select...": "\u9078\u64c7......", |
|
||||||
"Preferences": "\u9996\u9078\u9805", |
|
||||||
"Yes": "\u662f", |
|
||||||
"No": "\u5426", |
|
||||||
"Keyboard Navigation": "\u9375\u76e4\u5c0e\u822a", |
|
||||||
"Version": "\u7248\u672c", |
|
||||||
"Anchor": "\u52a0\u5165\u9328\u9ede", |
|
||||||
"Special character": "\u7279\u6b8a\u5b57\u5143", |
|
||||||
"Code sample": "\u7a0b\u5f0f\u78bc\u7bc4\u4f8b", |
|
||||||
"Color": "\u984f\u8272", |
|
||||||
"Emoticons": "\u8868\u60c5", |
|
||||||
"Document properties": "\u6587\u4ef6\u7684\u5c6c\u6027", |
|
||||||
"Image": "\u5716\u7247", |
|
||||||
"Insert link": "\u63d2\u5165\u9023\u7d50", |
|
||||||
"Target": "\u958b\u555f\u65b9\u5f0f", |
|
||||||
"Link": "\u9023\u7d50", |
|
||||||
"Poster": "\u9810\u89bd\u5716\u7247", |
|
||||||
"Media": "\u5a92\u9ad4", |
|
||||||
"Print": "\u5217\u5370", |
|
||||||
"Prev": "\u4e0a\u4e00\u500b", |
|
||||||
"Find and replace": "\u5c0b\u627e\u53ca\u53d6\u4ee3", |
|
||||||
"Whole words": "\u6574\u500b\u55ae\u5b57", |
|
||||||
"Spellcheck": "\u62fc\u5b57\u6aa2\u67e5", |
|
||||||
"Caption": "\u8868\u683c\u6a19\u984c", |
|
||||||
"Insert template": "\u63d2\u5165\u6a23\u7248" |
|
||||||
}); |
|
@ -1,7 +0,0 @@ |
|||||||
/** |
|
||||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved. |
|
||||||
* Licensed under the LGPL or a commercial license. |
|
||||||
* For LGPL see License.txt in the project root for license information. |
|
||||||
* For commercial licenses see https://www.tiny.cloud/ |
|
||||||
*/ |
|
||||||
body{background-color:#2f3742;color:#dfe0e4;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}a{color:#4099ff}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#6d737b}figure{display:table;margin:1rem auto}figure figcaption{color:#8a8f97;display:block;margin-top:.25rem;text-align:center}hr{border-color:#6d737b;border-style:solid;border-width:1px 0 0 0}code{background-color:#6d737b;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #6d737b;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #6d737b;margin-right:1.5rem;padding-right:1rem} |
|
@ -1,7 +0,0 @@ |
|||||||
/** |
|
||||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved. |
|
||||||
* Licensed under the LGPL or a commercial license. |
|
||||||
* For LGPL see License.txt in the project root for license information. |
|
||||||
* For commercial licenses see https://www.tiny.cloud/ |
|
||||||
*/ |
|
||||||
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem} |
|
@ -1,7 +0,0 @@ |
|||||||
/** |
|
||||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved. |
|
||||||
* Licensed under the LGPL or a commercial license. |
|
||||||
* For LGPL see License.txt in the project root for license information. |
|
||||||
* For commercial licenses see https://www.tiny.cloud/ |
|
||||||
*/ |
|
||||||
@media screen{html{background:#f4f4f4;min-height:100%}}body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif}@media screen{body{background-color:#fff;box-shadow:0 0 4px rgba(0,0,0,.15);box-sizing:border-box;margin:1rem auto 0;max-width:820px;min-height:calc(100vh - 1rem);padding:4rem 6rem 6rem 6rem}}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure figcaption{color:#999;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem} |
|
@ -1,7 +0,0 @@ |
|||||||
/** |
|
||||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved. |
|
||||||
* Licensed under the LGPL or a commercial license. |
|
||||||
* For LGPL see License.txt in the project root for license information. |
|
||||||
* For commercial licenses see https://www.tiny.cloud/ |
|
||||||
*/ |
|
||||||
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem auto;max-width:900px}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem} |
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,7 +0,0 @@ |
|||||||
/** |
|
||||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved. |
|
||||||
* Licensed under the LGPL or a commercial license. |
|
||||||
* For LGPL see License.txt in the project root for license information. |
|
||||||
* For commercial licenses see https://www.tiny.cloud/ |
|
||||||
*/ |
|
||||||
.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse} |
|
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,7 +0,0 @@ |
|||||||
/** |
|
||||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved. |
|
||||||
* Licensed under the LGPL or a commercial license. |
|
||||||
* For LGPL see License.txt in the project root for license information. |
|
||||||
* For commercial licenses see https://www.tiny.cloud/ |
|
||||||
*/ |
|
||||||
body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;left:0;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;position:fixed;top:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox.tox-tinymce.tox-fullscreen{background-color:transparent;z-index:1200}.tox-shadowhost.tox-fullscreen{z-index:1200}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} |
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,7 +0,0 @@ |
|||||||
/** |
|
||||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved. |
|
||||||
* Licensed under the LGPL or a commercial license. |
|
||||||
* For LGPL see License.txt in the project root for license information. |
|
||||||
* For commercial licenses see https://www.tiny.cloud/ |
|
||||||
*/ |
|
||||||
.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse} |
|
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,7 +0,0 @@ |
|||||||
/** |
|
||||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved. |
|
||||||
* Licensed under the LGPL or a commercial license. |
|
||||||
* For LGPL see License.txt in the project root for license information. |
|
||||||
* For commercial licenses see https://www.tiny.cloud/ |
|
||||||
*/ |
|
||||||
body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;left:0;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;position:fixed;top:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox.tox-tinymce.tox-fullscreen{background-color:transparent;z-index:1200}.tox-shadowhost.tox-fullscreen{z-index:1200}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} |
|
@ -1,31 +0,0 @@ |
|||||||
import axios from '@/utils/request'; |
|
||||||
|
|
||||||
export const queryOrgList = async (params?: Record<string, any>): Promise<any> => (await axios.get('/backend/core/org', { params })).data; |
|
||||||
export const queryOrg = async (id: number): Promise<any> => (await axios.get(`/backend/core/org/${id}`)).data; |
|
||||||
export const createOrg = async (data: Record<string, any>): Promise<any> => (await axios.post('/backend/core/org', data)).data; |
|
||||||
export const updateOrg = async (data: Record<string, any>): Promise<any> => (await axios.post('/backend/core/org?_method=put', data)).data; |
|
||||||
export const updateOrgOrder = async (data: number[]): Promise<any> => (await axios.post('/backend/core/org/order?_method=put', data)).data; |
|
||||||
export const deleteOrg = async (data: number[]): Promise<any> => (await axios.post('/backend/core/org?_method=delete', data)).data; |
|
||||||
|
|
||||||
export const queryRoleList = async (params?: Record<string, any>): Promise<any> => (await axios.get('/backend/core/role', { params })).data; |
|
||||||
export const queryRole = async (id: number): Promise<any> => (await axios.get(`/backend/core/role/${id}`)).data; |
|
||||||
export const createRole = async (data: Record<string, any>): Promise<any> => (await axios.post('/backend/core/role', data)).data; |
|
||||||
export const updateRole = async (data: Record<string, any>): Promise<any> => (await axios.post('/backend/core/role?_method=put', data)).data; |
|
||||||
export const updateRoleOrder = async (data: number[]): Promise<any> => (await axios.post('/backend/core/role/order?_method=put', data)).data; |
|
||||||
export const deleteRole = async (data: number[]): Promise<any> => (await axios.post('/backend/core/role?_method=delete', data)).data; |
|
||||||
|
|
||||||
export const queryGroupList = async (params?: Record<string, any>): Promise<any> => (await axios.get('/backend/core/group', { params })).data; |
|
||||||
export const queryGroup = async (id: number): Promise<any> => (await axios.get(`/backend/core/group/${id}`)).data; |
|
||||||
export const createGroup = async (data: Record<string, any>): Promise<any> => (await axios.post('/backend/core/group', data)).data; |
|
||||||
export const updateGroup = async (data: Record<string, any>): Promise<any> => (await axios.post('/backend/core/group?_method=put', data)).data; |
|
||||||
export const updateGroupOrder = async (data: number[]): Promise<any> => (await axios.post('/backend/core/group/order?_method=put', data)).data; |
|
||||||
export const deleteGroup = async (data: number[]): Promise<any> => (await axios.post('/backend/core/group?_method=delete', data)).data; |
|
||||||
|
|
||||||
export const queryUserPage = async (params?: Record<string, any>): Promise<any> => (await axios.get('/backend/core/user', { params })).data; |
|
||||||
export const queryUser = async (id: number): Promise<any> => (await axios.get(`/backend/core/user/${id}`)).data; |
|
||||||
export const createUser = async (data: Record<string, any>): Promise<any> => (await axios.post('/backend/core/user', data)).data; |
|
||||||
export const updateUser = async (data: Record<string, any>): Promise<any> => (await axios.post('/backend/core/user?_method=put', data)).data; |
|
||||||
export const deleteUser = async (data: number[]): Promise<any> => (await axios.post('/backend/core/user?_method=delete', data)).data; |
|
||||||
export const usernameValidation = async (username?: string): Promise<any> => (await axios.get('/backend/core/user/username-validation', { params: { username } })).data; |
|
||||||
export const emailValidation = async (email?: string): Promise<any> => (await axios.get('/backend/core/user/email-validation', { params: { email } })).data; |
|
||||||
export const mobileValidation = async (mobile?: string): Promise<any> => (await axios.get('/backend/core/user/mobile-validation', { params: { mobile } })).data; |
|
After Width: | Height: | Size: 1.5 KiB |
@ -0,0 +1,34 @@ |
|||||||
|
<template> |
||||||
|
<!-- 保存策略时的confirm询问 --> |
||||||
|
<el-dialog v-model="visible" width="500px"> |
||||||
|
<p>修改后的策略同步已关联这条策略的贷款产品,会导致关联产品下架并重新配置风控。</p> |
||||||
|
<p class="my-3 text-[#006BFF]">确定修改这条策略吗?</p> |
||||||
|
<el-checkbox v-model="syncCheck" label="策略修改同步之前关联的产品" /> |
||||||
|
<template #footer> |
||||||
|
<div class="dialog-footer"> |
||||||
|
<el-button @click="visible = false">取消</el-button> |
||||||
|
<el-button type="primary" @click="submit">确定</el-button> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
</el-dialog> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script setup lang="ts"> |
||||||
|
import { computed, ref } from 'vue'; |
||||||
|
|
||||||
|
const props = defineProps({ |
||||||
|
modelValue: { type: Boolean, default: false }, |
||||||
|
}); |
||||||
|
const emit = defineEmits(['update:modelValue', 'submit']); |
||||||
|
const visible = computed({ |
||||||
|
get: () => props.modelValue, |
||||||
|
set: (value) => { |
||||||
|
emit('update:modelValue', value); |
||||||
|
}, |
||||||
|
}); |
||||||
|
const syncCheck = ref<boolean>(false); |
||||||
|
const submit = () => { |
||||||
|
visible.value = false; |
||||||
|
emit('submit', +syncCheck.value); |
||||||
|
}; |
||||||
|
</script> |
@ -1,173 +0,0 @@ |
|||||||
<template> |
|
||||||
<!-- 五级分类 --> |
|
||||||
<el-table class="c-table" |
|
||||||
:data="form" |
|
||||||
:span-method="span" |
|
||||||
:cell-style="{background:'#fff'}" |
|
||||||
border> |
|
||||||
<el-table-column prop="recordName" |
|
||||||
label="产品类别" |
|
||||||
min-width="150" |
|
||||||
align="center"> |
|
||||||
</el-table-column> |
|
||||||
<el-table-column label="逾期时间" |
|
||||||
align="center"> |
|
||||||
<el-table-column label="未逾期" |
|
||||||
align="center"> |
|
||||||
<template #default="{ row }"> |
|
||||||
<el-select clearable |
|
||||||
v-model="row.notOverdue"> |
|
||||||
<el-option v-for="item in row.recordChildren[0].subject.itemList" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId" /> |
|
||||||
</el-select> |
|
||||||
</template> |
|
||||||
</el-table-column> |
|
||||||
<el-table-column label="1~30天" |
|
||||||
align="center"> |
|
||||||
<template #default="{ row }"> |
|
||||||
<el-select clearable |
|
||||||
v-model="row.thirtyDays"> |
|
||||||
<el-option v-for="item in row.recordChildren[0].subject.itemList" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId" /> |
|
||||||
</el-select> |
|
||||||
</template></el-table-column> |
|
||||||
<el-table-column label="31~90天" |
|
||||||
align="center"> |
|
||||||
<template #default="{ row }"> |
|
||||||
<el-select clearable |
|
||||||
v-model="row.ninetyDays"> |
|
||||||
<el-option v-for="item in row.recordChildren[0].subject.itemList" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId" /> |
|
||||||
</el-select> |
|
||||||
</template></el-table-column> |
|
||||||
<el-table-column label="91~180天" |
|
||||||
align="center"> |
|
||||||
<template #default="{ row }"> |
|
||||||
<el-select clearable |
|
||||||
v-model="row.oneHundredAndEightyDays"> |
|
||||||
<el-option v-for="item in row.recordChildren[0].subject.itemList" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId" /> |
|
||||||
</el-select> |
|
||||||
</template></el-table-column> |
|
||||||
<el-table-column label="181~360天" |
|
||||||
align="center"> |
|
||||||
<template #default="{ row }"> |
|
||||||
<el-select clearable |
|
||||||
v-model="row.threeHundredAndSixtyDays"> |
|
||||||
<el-option v-for="item in row.recordChildren[0].subject.itemList" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId" /> |
|
||||||
</el-select> |
|
||||||
</template></el-table-column> |
|
||||||
<el-table-column label="360天以上" |
|
||||||
align="center"> |
|
||||||
<template #default="{ row }"> |
|
||||||
<el-select clearable |
|
||||||
v-model="row.threeHundredAndSixtyDaysAbove"> |
|
||||||
<el-option v-for="item in row.recordChildren[0].subject.itemList" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId" /> |
|
||||||
</el-select> |
|
||||||
</template></el-table-column> |
|
||||||
</el-table-column> |
|
||||||
</el-table> |
|
||||||
|
|
||||||
<div class="flex justify-end"> |
|
||||||
<div class="submit" |
|
||||||
@click="submit">确认完成配置</div> |
|
||||||
</div> |
|
||||||
</template> |
|
||||||
|
|
||||||
<script setup lang="ts"> |
|
||||||
import { ref, onMounted } from 'vue'; |
|
||||||
import { ElMessage } from 'element-plus'; |
|
||||||
import { fiveLevelClassificationDetails, fiveLevelClassificationSave } from '@/api/model'; |
|
||||||
import { getProcessInformationBasedOnRoles, addOperation } from '@/api/judgment'; |
|
||||||
import { handleId, getIds } from '@/utils/common'; |
|
||||||
import Cookies from 'js-cookie'; |
|
||||||
|
|
||||||
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 getConfig = async () => { |
|
||||||
const { process } = await getProcessInformationBasedOnRoles(1029); |
|
||||||
const result = []; |
|
||||||
process.map((e, i) => { |
|
||||||
const cur = info.value.length ? info.value[i] : {}; |
|
||||||
result.push({ |
|
||||||
...getIds(), |
|
||||||
recordName: e.name, |
|
||||||
recordChildren: e.recordChildren, |
|
||||||
ninetyDays: +cur.ninetyDays || '', |
|
||||||
notOverdue: +cur.notOverdue || '', |
|
||||||
oneHundredAndEightyDays: +cur.oneHundredAndEightyDays || '', |
|
||||||
thirtyDays: +cur.thirtyDays || '', |
|
||||||
threeHundredAndSixtyDays: +cur.threeHundredAndSixtyDays || '', |
|
||||||
threeHundredAndSixtyDaysAbove: +cur.threeHundredAndSixtyDaysAbove || '', |
|
||||||
id: cur.id || '', |
|
||||||
stRecordId: e.id, |
|
||||||
}); |
|
||||||
}); |
|
||||||
form.value = result; |
|
||||||
}; |
|
||||||
// 详情 |
|
||||||
const getDetail = async () => { |
|
||||||
try { |
|
||||||
const { data } = await fiveLevelClassificationDetails(); |
|
||||||
info.value = data; |
|
||||||
getConfig(); |
|
||||||
} finally { |
|
||||||
} |
|
||||||
}; |
|
||||||
|
|
||||||
const fieldKeys = ['notOverdue', 'thirtyDays', 'ninetyDays', 'oneHundredAndEightyDays', 'threeHundredAndSixtyDays', 'threeHundredAndSixtyDaysAbove']; |
|
||||||
// 新增判分记录 |
|
||||||
const addRecord = async (data: Record<string, any>) => { |
|
||||||
const preIds = `1,${levelId},42,69,1029`; // 1,关卡id,角色(这个页面是风控经理策略) |
|
||||||
const rule = []; |
|
||||||
|
|
||||||
data.map((e) => { |
|
||||||
e.recordChildren.forEach((n, i) => { |
|
||||||
e[fieldKeys[i]] && rule.push(handleId(n.id, n.subjectId, e[fieldKeys[i]], `${preIds},${e.stRecordId},${n.id}`, 1)); |
|
||||||
}); |
|
||||||
}); |
|
||||||
|
|
||||||
await addOperation({ |
|
||||||
...getIds(), |
|
||||||
parentId: preIds, |
|
||||||
lcJudgmentRuleReq: rule, |
|
||||||
}); |
|
||||||
}; |
|
||||||
// 提交 |
|
||||||
const submit = async () => { |
|
||||||
let param = JSON.parse(JSON.stringify(form.value)); |
|
||||||
|
|
||||||
const recordParam = JSON.parse(JSON.stringify(param)); |
|
||||||
param.map((e) => { |
|
||||||
delete e.recordChildren; |
|
||||||
}); |
|
||||||
await fiveLevelClassificationSave({ fiveLevelClassificationList: param }); |
|
||||||
addRecord(recordParam); |
|
||||||
getDetail(); |
|
||||||
ElMessage.success('提交成功!'); |
|
||||||
}; |
|
||||||
onMounted(() => { |
|
||||||
getDetail(); |
|
||||||
}); |
|
||||||
</script> |
|
||||||
|
|
||||||
<style lang="scss" scoped> |
|
||||||
@import url(../../../styles/form.scss); |
|
||||||
</style> |
|
@ -0,0 +1,194 @@ |
|||||||
|
<template> |
||||||
|
<!-- 五级分类 --> |
||||||
|
<el-form label-width="90px" label-suffix=":" class="form" :disabled="disabled" v-loading="loading"> |
||||||
|
<el-form-item label="策略名称"> |
||||||
|
<div> |
||||||
|
<el-input class="w-[320px]" placeholder="请输入20以内字符" maxlength="20" clearable v-model="strategyName" /> |
||||||
|
<p v-if="bankIds.length" class="text-danger">不同步已关联产品,请修改策略名称。</p> |
||||||
|
</div> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="策略规则"> |
||||||
|
<el-table class="c-table" :data="form" :cell-style="{ background: '#fff' }" border> |
||||||
|
<el-table-column prop="recordName" label="产品类别" min-width="150" align="center"> </el-table-column> |
||||||
|
<el-table-column label="逾期时间" align="center"> |
||||||
|
<el-table-column label="未逾期" align="center"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-select clearable v-model="row.notOverdue"> |
||||||
|
<el-option v-for="item in row.recordChildren[0].subject.itemList" :key="item" :label="item.options" :value="item.itemId" /> |
||||||
|
</el-select> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column label="1~30天" align="center"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-select clearable v-model="row.thirtyDays"> |
||||||
|
<el-option v-for="item in row.recordChildren[0].subject.itemList" :key="item" :label="item.options" :value="item.itemId" /> |
||||||
|
</el-select> </template |
||||||
|
></el-table-column> |
||||||
|
<el-table-column label="31~90天" align="center"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-select clearable v-model="row.ninetyDays"> |
||||||
|
<el-option v-for="item in row.recordChildren[0].subject.itemList" :key="item" :label="item.options" :value="item.itemId" /> |
||||||
|
</el-select> </template |
||||||
|
></el-table-column> |
||||||
|
<el-table-column label="91~180天" align="center"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-select clearable v-model="row.oneHundredAndEightyDays"> |
||||||
|
<el-option v-for="item in row.recordChildren[0].subject.itemList" :key="item" :label="item.options" :value="item.itemId" /> |
||||||
|
</el-select> </template |
||||||
|
></el-table-column> |
||||||
|
<el-table-column label="181~360天" align="center"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-select clearable v-model="row.threeHundredAndSixtyDays"> |
||||||
|
<el-option v-for="item in row.recordChildren[0].subject.itemList" :key="item" :label="item.options" :value="item.itemId" /> |
||||||
|
</el-select> </template |
||||||
|
></el-table-column> |
||||||
|
<el-table-column label="360天以上" align="center"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-select clearable v-model="row.threeHundredAndSixtyDaysAbove"> |
||||||
|
<el-option v-for="item in row.recordChildren[0].subject.itemList" :key="item" :label="item.options" :value="item.itemId" /> |
||||||
|
</el-select> </template |
||||||
|
></el-table-column> |
||||||
|
</el-table-column> |
||||||
|
</el-table> |
||||||
|
</el-form-item> |
||||||
|
<div v-if="!disabled" class="flex justify-end mt-3"> |
||||||
|
<div class="dia-btn cancel" @click="emit('close')">取消</div> |
||||||
|
<div class="dia-btn" @click="confirmSubmit">确定</div> |
||||||
|
</div> |
||||||
|
</el-form> |
||||||
|
|
||||||
|
<Confirm v-model="syncVisible" @submit="submit" /> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script setup lang="ts"> |
||||||
|
import { ref, defineAsyncComponent, onMounted, toRefs } from 'vue'; |
||||||
|
import { ElMessage } from 'element-plus'; |
||||||
|
import { fiveLevelClassificationDetails, fiveLevelClassificationSave, isTheStrategyRelatedToTheProduct } from '@/api/model'; |
||||||
|
import { getProcessInformationBasedOnRoles, addOperation } from '@/api/judgment'; |
||||||
|
import { handleId, getIds } from '@/utils/common'; |
||||||
|
import Cookies from 'js-cookie'; |
||||||
|
import { getStat } from '@/store/useProduct'; |
||||||
|
|
||||||
|
const Confirm = defineAsyncComponent(() => import('@/components/StrategyConfirm.vue')); |
||||||
|
|
||||||
|
const props = defineProps({ |
||||||
|
disabled: { type: Boolean, default: false }, |
||||||
|
row: { type: Object }, |
||||||
|
}); |
||||||
|
|
||||||
|
const emit = defineEmits(['close']); |
||||||
|
const { strategyId, strategyName } = toRefs(props.row); |
||||||
|
const form = ref<Record<string, any>[]>([]); |
||||||
|
const info = ref<Record<string, any>[]>([]); |
||||||
|
const loading = ref<boolean>(false); |
||||||
|
const syncVisible = ref<boolean>(false); |
||||||
|
const bankIds = ref<Record<string, any>[]>([]); |
||||||
|
// 配置项 |
||||||
|
const getConfig = async () => { |
||||||
|
const { process } = await getProcessInformationBasedOnRoles(1029); |
||||||
|
const result = []; |
||||||
|
process.slice(1).map((e, i) => { |
||||||
|
const cur = info.value.length ? info.value[i] : {}; |
||||||
|
result.push({ |
||||||
|
...getIds(), |
||||||
|
recordName: e.name, |
||||||
|
recordChildren: e.recordChildren, |
||||||
|
ninetyDays: +cur.ninetyDays || '', |
||||||
|
notOverdue: +cur.notOverdue || '', |
||||||
|
oneHundredAndEightyDays: +cur.oneHundredAndEightyDays || '', |
||||||
|
thirtyDays: +cur.thirtyDays || '', |
||||||
|
threeHundredAndSixtyDays: +cur.threeHundredAndSixtyDays || '', |
||||||
|
threeHundredAndSixtyDaysAbove: +cur.threeHundredAndSixtyDaysAbove || '', |
||||||
|
id: cur.id || '', |
||||||
|
stRecordId: e.id, |
||||||
|
}); |
||||||
|
}); |
||||||
|
form.value = result; |
||||||
|
loading.value = false; |
||||||
|
}; |
||||||
|
// 详情 |
||||||
|
const getDetail = async () => { |
||||||
|
loading.value = true; |
||||||
|
try { |
||||||
|
if (strategyId.value) { |
||||||
|
const { data } = await fiveLevelClassificationDetails({ |
||||||
|
strategyId: strategyId.value, |
||||||
|
}); |
||||||
|
info.value = data; |
||||||
|
} |
||||||
|
getConfig(); |
||||||
|
|
||||||
|
// 编辑需要判断是否有绑定产品 |
||||||
|
if (strategyId.value && !props.disabled) { |
||||||
|
const res = await isTheStrategyRelatedToTheProduct({ |
||||||
|
tacticsId: strategyId.value, |
||||||
|
strategyType: 14, |
||||||
|
}); |
||||||
|
if (res.isRelated) bankIds.value = res.bankIds; |
||||||
|
} |
||||||
|
} finally { |
||||||
|
} |
||||||
|
}; |
||||||
|
onMounted(getDetail); |
||||||
|
|
||||||
|
const fieldKeys = ['notOverdue', 'thirtyDays', 'ninetyDays', 'oneHundredAndEightyDays', 'threeHundredAndSixtyDays', 'threeHundredAndSixtyDaysAbove']; |
||||||
|
// 新增判分记录 |
||||||
|
const addRecord = async (data: Record<string, any>) => { |
||||||
|
const preIds = `1,${Cookies.get('sand-level')},42,69,1029`; // 1,关卡id,角色(这个页面是风控经理策略) |
||||||
|
const rule = [handleId(140, 28, strategyName.value, `${preIds},140`, 3)]; |
||||||
|
|
||||||
|
data.map((e) => { |
||||||
|
e.recordChildren.forEach((n, i) => { |
||||||
|
e[fieldKeys[i]] && rule.push(handleId(n.id, n.subjectId, e[fieldKeys[i]], `${preIds},${e.stRecordId},${n.id}`, 1)); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
await addOperation({ |
||||||
|
...getIds(), |
||||||
|
parentId: preIds, |
||||||
|
lcJudgmentRuleReq: rule, |
||||||
|
}); |
||||||
|
loading.value = false; |
||||||
|
ElMessage.success('提交成功!'); |
||||||
|
syncVisible.value = false; |
||||||
|
emit('close', 1); |
||||||
|
}; |
||||||
|
// 提交 |
||||||
|
const submit = async (synchronizeUpdate?: number) => { |
||||||
|
loading.value = true; |
||||||
|
try { |
||||||
|
const param = JSON.parse(JSON.stringify(form.value)); |
||||||
|
|
||||||
|
const recordParam = JSON.parse(JSON.stringify(param)); |
||||||
|
param.map((e) => { |
||||||
|
delete e.recordChildren; |
||||||
|
}); |
||||||
|
await fiveLevelClassificationSave({ |
||||||
|
...getIds(), |
||||||
|
strategyId: strategyId.value, |
||||||
|
strategyName: strategyName.value, |
||||||
|
synchronizeUpdate, |
||||||
|
fiveLevelClassificationList: param, |
||||||
|
bankIds: bankIds.value, |
||||||
|
}); |
||||||
|
getStat(295); |
||||||
|
addRecord(recordParam); |
||||||
|
} catch (e) { |
||||||
|
loading.value = false; |
||||||
|
} |
||||||
|
}; |
||||||
|
const confirmSubmit = async () => { |
||||||
|
if (!strategyName.value) return ElMessage.error('请输入策略名称!'); |
||||||
|
|
||||||
|
// 编辑需要判断是否有绑定产品 |
||||||
|
if (bankIds.value.length) { |
||||||
|
syncVisible.value = true; |
||||||
|
} else { |
||||||
|
submit(); |
||||||
|
} |
||||||
|
}; |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
@import url(../../../../styles/form.scss); |
||||||
|
</style> |
@ -0,0 +1,157 @@ |
|||||||
|
<template> |
||||||
|
<div class="block"> |
||||||
|
<div class="flex justify-between items-center mb-5"> |
||||||
|
<search v-model="keyWord" @change="initList"></search> |
||||||
|
<div class="filter"> |
||||||
|
<el-popconfirm title="确定删除选中策略吗?" :disabled="!multipleSelection.length" @confirm.stop="delAll"> |
||||||
|
<template #reference> |
||||||
|
<div :class="['add-btn mr-2', { 'cursor-not-allowed': !multipleSelection.length }]"> |
||||||
|
<el-icon :size="24" color="#fff"> |
||||||
|
<Delete /> |
||||||
|
</el-icon> |
||||||
|
批量删除 |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
</el-popconfirm> |
||||||
|
|
||||||
|
<div class="add-btn" @click="toAdd"> |
||||||
|
<img src="@/assets/images/plus.png" alt="" class="icon" /> |
||||||
|
新增 |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<el-table ref="table" v-loading="loading" :data="list" @selection-change="handleSelectionChange"> |
||||||
|
<el-table-column type="selection" width="55" :selectable="handleDisable" /> |
||||||
|
<el-table-column label="序号" type="index" width="60" align="center" /> |
||||||
|
<el-table-column prop="strategyName" label="五级分类策略名称" min-width="180" /> |
||||||
|
<el-table-column prop="createTime" label="新增日期" min-width="140" /> |
||||||
|
<el-table-column label="操作" width="140"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-button type="primary" link @click="toDetail(row, true)" size="small">查看</el-button> |
||||||
|
<template v-if="!row.builtIn"> |
||||||
|
<el-button type="primary" link @click="toDetail(row)" size="small">编辑</el-button> |
||||||
|
<el-popconfirm title="确定删除这条策略吗?" @confirm.stop="handleDelete([row.strategyId])"> |
||||||
|
<template #reference> |
||||||
|
<el-button type="primary" link size="small">删除</el-button> |
||||||
|
</template> |
||||||
|
</el-popconfirm> |
||||||
|
</template> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
</el-table> |
||||||
|
<el-pagination |
||||||
|
v-model:currentPage="currentPage" |
||||||
|
v-model:pageSize="pageSize" |
||||||
|
:total="total" |
||||||
|
:page-sizes="pageSizes" |
||||||
|
:layout="pageLayout" |
||||||
|
@size-change="getList()" |
||||||
|
@current-change="getList()" |
||||||
|
small |
||||||
|
background |
||||||
|
class="px-3 py-2 justify-end" |
||||||
|
></el-pagination> |
||||||
|
|
||||||
|
<el-drawer v-model="visible" :title="(isDetail ? '查看' : curRow.strategyId ? '编辑' : '新增') + '五级分类策略'" size="100%" :z-index="10" class="model-drawer"> |
||||||
|
<Detail v-model:row="curRow" :disabled="isDetail" :key="i" @close="closeDrawer" /> |
||||||
|
</el-drawer> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script setup lang="ts"> |
||||||
|
import { onMounted, ref, watch, defineAsyncComponent } from 'vue'; |
||||||
|
import { ElMessage, ElMessageBox } from 'element-plus'; |
||||||
|
import { Delete } from '@element-plus/icons-vue'; |
||||||
|
import { pageSizes, pageLayout } from '@/utils/common'; |
||||||
|
import { fiveLevelClassification, fiveLevelClassificationDel } from '@/api/model'; |
||||||
|
import Search from '@/components/Search.vue'; |
||||||
|
|
||||||
|
const Detail = defineAsyncComponent(() => import('./Detail.vue')); |
||||||
|
|
||||||
|
const keyWord = ref<string>(); |
||||||
|
const currentPage = ref<number>(1); |
||||||
|
const pageSize = ref<number>(10); |
||||||
|
const total = ref<number>(0); |
||||||
|
const table = ref<any>(); |
||||||
|
|
||||||
|
const multipleSelection = ref<Record<string, any>[]>([]); |
||||||
|
const list = ref<Record<string, any>[]>([]); |
||||||
|
const loading = ref<boolean>(false); |
||||||
|
const visible = ref<boolean>(false); |
||||||
|
const curRow = ref<Record<string, any>>({ |
||||||
|
strategyId: '', |
||||||
|
strategyName: '', |
||||||
|
}); |
||||||
|
const isDetail = ref<boolean>(false); |
||||||
|
const i = ref<number>(0); |
||||||
|
// 列表 |
||||||
|
const getList = async () => { |
||||||
|
loading.value = true; |
||||||
|
try { |
||||||
|
const { page } = await fiveLevelClassification({ pageNum: currentPage.value, pageSize: pageSize.value, keyWord: keyWord.value }); |
||||||
|
list.value = page.records; |
||||||
|
total.value = page.total; |
||||||
|
} finally { |
||||||
|
loading.value = false; |
||||||
|
} |
||||||
|
}; |
||||||
|
// 重置列表 |
||||||
|
const initList = async () => { |
||||||
|
currentPage.value = 1; |
||||||
|
getList(); |
||||||
|
}; |
||||||
|
watch(keyWord, initList); |
||||||
|
onMounted(getList); |
||||||
|
|
||||||
|
// 多选框条件 |
||||||
|
const handleDisable = (row: Record<string, any>) => { |
||||||
|
// 内置数据禁用 |
||||||
|
if (row.builtIn) return false; |
||||||
|
return true; |
||||||
|
}; |
||||||
|
|
||||||
|
// 多选 |
||||||
|
const handleSelectionChange = (val: Record<string, any>[]) => { |
||||||
|
multipleSelection.value = val; |
||||||
|
}; |
||||||
|
const handleDelete = async (ids: number[]) => { |
||||||
|
try { |
||||||
|
const res = await fiveLevelClassificationDel({ ids }); |
||||||
|
// 删除失败则弹框 |
||||||
|
if (res.tip) { |
||||||
|
ElMessageBox.alert(res.message, '提示', { |
||||||
|
confirmButtonText: '确定', |
||||||
|
}); |
||||||
|
} else { |
||||||
|
getList(); |
||||||
|
ElMessage.success('删除成功!'); |
||||||
|
} |
||||||
|
} catch (e) {} |
||||||
|
}; |
||||||
|
// 批量删除 |
||||||
|
const delAll = async () => { |
||||||
|
handleDelete(multipleSelection.value.map((e) => e.strategyId)); |
||||||
|
}; |
||||||
|
// 新增 |
||||||
|
const toAdd = () => { |
||||||
|
i.value++; |
||||||
|
isDetail.value = false; |
||||||
|
curRow.value = { |
||||||
|
strategyId: '', |
||||||
|
strategyName: '', |
||||||
|
}; |
||||||
|
visible.value = true; |
||||||
|
}; |
||||||
|
// 产品详情 |
||||||
|
const toDetail = async (row: Record<string, any>, detail = false) => { |
||||||
|
i.value++; |
||||||
|
isDetail.value = detail; |
||||||
|
curRow.value = row; |
||||||
|
visible.value = true; |
||||||
|
}; |
||||||
|
// 关闭详情弹框 |
||||||
|
const closeDrawer = (refresh?: number) => { |
||||||
|
visible.value = false; |
||||||
|
refresh && initList(); |
||||||
|
}; |
||||||
|
</script> |
@ -1,186 +0,0 @@ |
|||||||
<template> |
|
||||||
<!-- 贷后检查 --> |
|
||||||
<div class="c-auto"> |
|
||||||
<el-table class="c-table" |
|
||||||
:data="form" |
|
||||||
:cell-style="{background:'#fff'}" |
|
||||||
border> |
|
||||||
<el-table-column prop="name" |
|
||||||
label="选用" |
|
||||||
width="100" |
|
||||||
align="center"> |
|
||||||
<template #default="{ row }"> |
|
||||||
<el-checkbox v-model="row.isChoose"></el-checkbox> |
|
||||||
</template> |
|
||||||
</el-table-column> |
|
||||||
<el-table-column prop="recordName" |
|
||||||
label="检查方式" |
|
||||||
min-width="150" |
|
||||||
align="center"></el-table-column> |
|
||||||
<el-table-column label="检查对象" |
|
||||||
min-width="200" |
|
||||||
align="center"> |
|
||||||
<template #default="{ row }"> |
|
||||||
<el-select v-if="row.recordChildren" |
|
||||||
clearable |
|
||||||
v-model="row.checkObject"> |
|
||||||
<el-option v-for="item in row?.recordChildren[1].subject.itemList" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId" /> |
|
||||||
</el-select> |
|
||||||
</template> |
|
||||||
</el-table-column> |
|
||||||
<el-table-column label="检查时间" |
|
||||||
min-width="270" |
|
||||||
align="center"> |
|
||||||
<template #default="{ row, $index }"> |
|
||||||
<span v-if="$index === 4">点击后触发。</span> |
|
||||||
<div v-else |
|
||||||
class="flex items-center"> |
|
||||||
<el-select v-if="row.recordChildren" |
|
||||||
clearable |
|
||||||
v-model="row.checkTimeType"> |
|
||||||
<el-option v-for="item in row?.recordChildren[2].recordChildren[0].subject.itemList" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId" /> |
|
||||||
</el-select> |
|
||||||
<el-input class="w-[100px] mx-2" |
|
||||||
placeholder="请输入" |
|
||||||
v-model="row.timeDays"></el-input> 日。 |
|
||||||
</div> |
|
||||||
</template> |
|
||||||
</el-table-column> |
|
||||||
<el-table-column label="检查内容" |
|
||||||
min-width="230" |
|
||||||
align="center"> |
|
||||||
<template #default="{ row }"> |
|
||||||
<el-checkbox v-model="row.governmentData">政务数据</el-checkbox> |
|
||||||
<el-checkbox v-model="row.creditData">征信数据</el-checkbox> |
|
||||||
</template> |
|
||||||
</el-table-column> |
|
||||||
</el-table> |
|
||||||
</div> |
|
||||||
|
|
||||||
<div class="flex justify-end"> |
|
||||||
<div class="submit" |
|
||||||
@click="submit">确认完成配置</div> |
|
||||||
</div> |
|
||||||
</template> |
|
||||||
|
|
||||||
<script setup lang="ts"> |
|
||||||
import { ref, onMounted } from 'vue'; |
|
||||||
import { ElMessage } from 'element-plus'; |
|
||||||
import { postLoanInspectionDetails, postLoanInspectionSave } from '@/api/model'; |
|
||||||
import { getProcessInformationBasedOnRoles, addOperation } from '@/api/judgment'; |
|
||||||
import type { TableColumnCtx } from 'element-plus'; |
|
||||||
import { handleId, getIds } from '@/utils/common'; |
|
||||||
import Cookies from 'js-cookie'; |
|
||||||
|
|
||||||
const form = ref<Record<string, any>[]>([]); |
|
||||||
const info = ref<Record<string, any>[]>([]); |
|
||||||
// 配置项 |
|
||||||
const getConfig = async () => { |
|
||||||
const { process } = await getProcessInformationBasedOnRoles(1030); |
|
||||||
const result = []; |
|
||||||
process.map((e, i) => { |
|
||||||
const cur = info.value.length ? info.value[i] : {}; |
|
||||||
let temp = { |
|
||||||
...getIds(), |
|
||||||
recordName: e.name, |
|
||||||
recordChildren: e.recordChildren, |
|
||||||
checkObject: +cur.checkObject || '', |
|
||||||
checkTimeType: +cur.checkTimeType || '', |
|
||||||
creditData: info.value.length ? !!cur.creditData : false, |
|
||||||
governmentData: info.value.length ? !!cur.governmentData : false, |
|
||||||
isChoose: info.value.length ? !!cur.isChoose : false, |
|
||||||
timeDays: cur.timeDays || '', |
|
||||||
id: cur.id || '', |
|
||||||
stRecordId: e.id, |
|
||||||
}; |
|
||||||
result.push(temp); |
|
||||||
}); |
|
||||||
form.value = result; |
|
||||||
}; |
|
||||||
// 详情 |
|
||||||
const getDetail = async () => { |
|
||||||
try { |
|
||||||
const { data } = await postLoanInspectionDetails(); |
|
||||||
info.value = data; |
|
||||||
getConfig(); |
|
||||||
} finally { |
|
||||||
} |
|
||||||
}; |
|
||||||
|
|
||||||
interface SpanMethodProps { |
|
||||||
row: Record<string, any>; |
|
||||||
column: TableColumnCtx<Record<string, any>>; |
|
||||||
rowIndex: number; |
|
||||||
columnIndex: number; |
|
||||||
} |
|
||||||
// 表格合并 |
|
||||||
const span = ({ row, column, rowIndex, columnIndex }: SpanMethodProps) => { |
|
||||||
if (columnIndex < 2) { |
|
||||||
if (rowIndex === 1) { |
|
||||||
return { |
|
||||||
rowspan: 2, |
|
||||||
colspan: 1, |
|
||||||
}; |
|
||||||
} else if (rowIndex === 2) { |
|
||||||
return { |
|
||||||
rowspan: 0, |
|
||||||
colspan: 0, |
|
||||||
}; |
|
||||||
} |
|
||||||
} |
|
||||||
}; |
|
||||||
// 新增判分记录 |
|
||||||
const addRecord = async (data: Record<string, any>) => { |
|
||||||
console.log('🚀 ~ addRecord ~ data:', data); |
|
||||||
const preIds = `1,${Cookies.get('sand-level')},42,69,1030`; // 1,关卡id,角色(这个页面是风控经理策略) |
|
||||||
const rule = []; |
|
||||||
|
|
||||||
data.forEach((e, i) => { |
|
||||||
e.isChoose && rule.push(handleId(1052, '', '', preIds + ',' + e.stRecordId + ',1052', '')); |
|
||||||
e.checkObject && rule.push(handleId(1053, 282, e.checkObject, preIds + ',' + e.stRecordId + ',1053', 1)); |
|
||||||
i !== 4 && e.checkTimeType && rule.push(handleId(1054, 283, e.checkTimeType, preIds + ',' + e.stRecordId + ',1054,1056', 1)); |
|
||||||
e.timeDays && rule.push(handleId(1057, 284, e.timeDays, preIds + ',' + e.stRecordId + ',1054,1057', 3)); |
|
||||||
|
|
||||||
const ids = []; |
|
||||||
e.governmentData && ids.push(778); |
|
||||||
e.creditData && ids.push(793); |
|
||||||
e.governmentData && rule.push(handleId(1055, 323, ids.join(), preIds + ',' + e.stRecordId + ',1055', 1)); |
|
||||||
}); |
|
||||||
|
|
||||||
await addOperation({ |
|
||||||
...getIds(), |
|
||||||
parentId: preIds, |
|
||||||
lcJudgmentRuleReq: rule, |
|
||||||
}); |
|
||||||
}; |
|
||||||
// 提交 |
|
||||||
const submit = async () => { |
|
||||||
let param = JSON.parse(JSON.stringify(form.value)); |
|
||||||
param.map((e, i) => { |
|
||||||
e.creditData = +e.creditData; |
|
||||||
e.governmentData = +e.governmentData; |
|
||||||
e.isChoose = +e.isChoose; |
|
||||||
}); |
|
||||||
const recordParam = JSON.parse(JSON.stringify(param)); |
|
||||||
param.map((e) => { |
|
||||||
delete e.recordChildren; |
|
||||||
}); |
|
||||||
await postLoanInspectionSave({ postLoanInspectionList: param }); |
|
||||||
addRecord(recordParam); |
|
||||||
getDetail(); |
|
||||||
ElMessage.success('提交成功!'); |
|
||||||
}; |
|
||||||
onMounted(() => { |
|
||||||
getDetail(); |
|
||||||
}); |
|
||||||
</script> |
|
||||||
|
|
||||||
<style lang="scss" scoped> |
|
||||||
@import url(../../../styles/form.scss); |
|
||||||
</style> |
|
@ -0,0 +1,219 @@ |
|||||||
|
<template> |
||||||
|
<!-- 贷后检查 --> |
||||||
|
<el-form label-width="90px" label-suffix=":" class="form" :disabled="disabled" v-loading="loading"> |
||||||
|
<el-form-item label="策略名称"> |
||||||
|
<div> |
||||||
|
<el-input class="w-[320px]" placeholder="请输入20以内字符" maxlength="20" clearable v-model="strategyName" /> |
||||||
|
<p v-if="bankIds.length" class="text-danger">不同步已关联产品,请修改策略名称。</p> |
||||||
|
</div> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="策略规则"> |
||||||
|
<el-table class="c-table" :data="form" :cell-style="{ background: '#fff' }" border> |
||||||
|
<el-table-column prop="name" label="选用" width="130" align="center"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-radio-group v-model="row.isChoose"> |
||||||
|
<el-radio v-for="(item, i) in opt1" :key="i" :label="item.id">{{ item.name }}</el-radio> |
||||||
|
</el-radio-group> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column prop="recordName" label="检查方式" min-width="150" align="center"></el-table-column> |
||||||
|
<el-table-column label="检查对象" min-width="200" align="center"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-select v-if="row.recordChildren" clearable v-model="row.checkObject"> |
||||||
|
<el-option v-for="item in row?.recordChildren[1].subject.itemList" :key="item" :label="item.options" :value="item.itemId" /> |
||||||
|
</el-select> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column label="检查时间" min-width="270" align="center"> |
||||||
|
<template #default="{ row, $index }"> |
||||||
|
<span v-if="$index === 4">点击后触发。</span> |
||||||
|
<div v-else class="flex items-center"> |
||||||
|
<el-select v-if="row.recordChildren" clearable v-model="row.checkTimeType"> |
||||||
|
<el-option v-for="item in row?.recordChildren[2].recordChildren[0].subject.itemList" :key="item" :label="item.options" :value="item.itemId" /> |
||||||
|
</el-select> |
||||||
|
<el-input class="w-[100px] mx-2" placeholder="请输入" v-model="row.timeDays"></el-input> 日。 |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column label="检查内容" min-width="230" align="center"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-checkbox v-model="row.governmentData">政务数据</el-checkbox> |
||||||
|
<el-checkbox v-model="row.creditData">征信数据</el-checkbox> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
</el-table> |
||||||
|
</el-form-item> |
||||||
|
<div v-if="!disabled" class="flex justify-end mt-3"> |
||||||
|
<div class="dia-btn cancel" @click="emit('close')">取消</div> |
||||||
|
<div class="dia-btn" @click="confirmSubmit">确定</div> |
||||||
|
</div> |
||||||
|
</el-form> |
||||||
|
|
||||||
|
<Confirm v-model="syncVisible" @submit="submit" /> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script setup lang="ts"> |
||||||
|
import { ref, defineAsyncComponent, onMounted, toRefs } from 'vue'; |
||||||
|
import { ElMessage } from 'element-plus'; |
||||||
|
import { postLoanInspectionDetails, postLoanInspectionSave, isTheStrategyRelatedToTheProduct } from '@/api/model'; |
||||||
|
import { getProcessInformationBasedOnRoles, addOperation } from '@/api/judgment'; |
||||||
|
import type { TableColumnCtx } from 'element-plus'; |
||||||
|
import { handleId, getIds, opt1 } from '@/utils/common'; |
||||||
|
import Cookies from 'js-cookie'; |
||||||
|
import { getStat } from '@/store/useProduct'; |
||||||
|
|
||||||
|
const Confirm = defineAsyncComponent(() => import('@/components/StrategyConfirm.vue')); |
||||||
|
|
||||||
|
const props = defineProps({ |
||||||
|
disabled: { type: Boolean, default: false }, |
||||||
|
row: { type: Object }, |
||||||
|
}); |
||||||
|
|
||||||
|
const emit = defineEmits(['close']); |
||||||
|
const { strategyId, strategyName } = toRefs(props.row); |
||||||
|
const form = ref<Record<string, any>[]>([]); |
||||||
|
const info = ref<Record<string, any>[]>([]); |
||||||
|
const loading = ref<boolean>(false); |
||||||
|
const syncVisible = ref<boolean>(false); |
||||||
|
const bankIds = ref<Record<string, any>[]>([]); |
||||||
|
// 配置项 |
||||||
|
const getConfig = async () => { |
||||||
|
const { process } = await getProcessInformationBasedOnRoles(1030); |
||||||
|
const result = []; |
||||||
|
process.slice(1).map((e, i) => { |
||||||
|
const cur = info.value.length ? info.value[i] : {}; |
||||||
|
const temp = { |
||||||
|
...getIds(), |
||||||
|
recordName: e.name, |
||||||
|
recordChildren: e.recordChildren, |
||||||
|
checkObject: +cur.checkObject || '', |
||||||
|
checkTimeType: +cur.checkTimeType || '', |
||||||
|
creditData: info.value.length ? !!cur.creditData : false, |
||||||
|
governmentData: info.value.length ? !!cur.governmentData : false, |
||||||
|
isChoose: info.value.length ? cur.isChoose : '', |
||||||
|
timeDays: cur.timeDays || '', |
||||||
|
id: cur.id || '', |
||||||
|
stRecordId: e.id, |
||||||
|
}; |
||||||
|
result.push(temp); |
||||||
|
}); |
||||||
|
form.value = result; |
||||||
|
loading.value = false; |
||||||
|
}; |
||||||
|
// 详情 |
||||||
|
const getDetail = async () => { |
||||||
|
loading.value = true; |
||||||
|
try { |
||||||
|
if (strategyId.value) { |
||||||
|
const { data } = await postLoanInspectionDetails({ |
||||||
|
strategyId: strategyId.value, |
||||||
|
}); |
||||||
|
info.value = data; |
||||||
|
} |
||||||
|
getConfig(); |
||||||
|
|
||||||
|
// 编辑需要判断是否有绑定产品 |
||||||
|
if (strategyId.value && !props.disabled) { |
||||||
|
const res = await isTheStrategyRelatedToTheProduct({ |
||||||
|
tacticsId: strategyId.value, |
||||||
|
strategyType: 15, |
||||||
|
}); |
||||||
|
if (res.isRelated) bankIds.value = res.bankIds; |
||||||
|
} |
||||||
|
} finally { |
||||||
|
} |
||||||
|
}; |
||||||
|
onMounted(getDetail); |
||||||
|
|
||||||
|
interface SpanMethodProps { |
||||||
|
row: Record<string, any>; |
||||||
|
column: TableColumnCtx<Record<string, any>>; |
||||||
|
rowIndex: number; |
||||||
|
columnIndex: number; |
||||||
|
} |
||||||
|
// 表格合并 |
||||||
|
const span = ({ row, column, rowIndex, columnIndex }: SpanMethodProps) => { |
||||||
|
if (columnIndex < 2) { |
||||||
|
if (rowIndex === 1) { |
||||||
|
return { |
||||||
|
rowspan: 2, |
||||||
|
colspan: 1, |
||||||
|
}; |
||||||
|
} |
||||||
|
if (rowIndex === 2) { |
||||||
|
return { |
||||||
|
rowspan: 0, |
||||||
|
colspan: 0, |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
// 新增判分记录 |
||||||
|
const addRecord = async (data: Record<string, any>) => { |
||||||
|
const preIds = `1,${Cookies.get('sand-level')},42,69,1030`; // 1,关卡id,角色(这个页面是风控经理策略) |
||||||
|
const rule = [handleId(140, 28, strategyName.value, `${preIds},140`, 3)]; |
||||||
|
|
||||||
|
data.forEach((e, i) => { |
||||||
|
e.isChoose && rule.push(handleId(1052, 140, e.isChoose, `${preIds},${e.stRecordId},1052`, 1)); |
||||||
|
e.checkObject && rule.push(handleId(1053, 282, e.checkObject, `${preIds},${e.stRecordId},1053`, 1)); |
||||||
|
i !== 4 && e.checkTimeType && rule.push(handleId(1054, 283, e.checkTimeType, `${preIds},${e.stRecordId},1054,1056`, 1)); |
||||||
|
e.timeDays && rule.push(handleId(1057, 284, e.timeDays, `${preIds},${e.stRecordId},1054,1057`, 3)); |
||||||
|
|
||||||
|
const ids = []; |
||||||
|
e.governmentData && ids.push(778); |
||||||
|
e.creditData && ids.push(793); |
||||||
|
e.governmentData && rule.push(handleId(1055, 323, ids.join(), `${preIds},${e.stRecordId},1055`, 1)); |
||||||
|
}); |
||||||
|
|
||||||
|
await addOperation({ |
||||||
|
...getIds(), |
||||||
|
parentId: preIds, |
||||||
|
lcJudgmentRuleReq: rule, |
||||||
|
}); |
||||||
|
loading.value = false; |
||||||
|
ElMessage.success('提交成功!'); |
||||||
|
syncVisible.value = false; |
||||||
|
emit('close', 1); |
||||||
|
}; |
||||||
|
// 提交 |
||||||
|
const submit = async (synchronizeUpdate?: number) => { |
||||||
|
loading.value = true; |
||||||
|
try { |
||||||
|
const param = JSON.parse(JSON.stringify(form.value)); |
||||||
|
param.map((e, i) => { |
||||||
|
e.creditData = +e.creditData; |
||||||
|
e.governmentData = +e.governmentData; |
||||||
|
}); |
||||||
|
const recordParam = JSON.parse(JSON.stringify(param)); |
||||||
|
param.map((e) => { |
||||||
|
delete e.recordChildren; |
||||||
|
}); |
||||||
|
await postLoanInspectionSave({ |
||||||
|
...getIds(), |
||||||
|
strategyId: strategyId.value, |
||||||
|
strategyName: strategyName.value, |
||||||
|
synchronizeUpdate, |
||||||
|
postLoanInspectionList: param, |
||||||
|
bankIds: bankIds.value, |
||||||
|
}); |
||||||
|
getStat(295); |
||||||
|
addRecord(recordParam); |
||||||
|
} catch (e) { |
||||||
|
loading.value = false; |
||||||
|
} |
||||||
|
}; |
||||||
|
const confirmSubmit = async () => { |
||||||
|
if (!strategyName.value) return ElMessage.error('请输入策略名称!'); |
||||||
|
|
||||||
|
// 编辑需要判断是否有绑定产品 |
||||||
|
if (bankIds.value.length) { |
||||||
|
syncVisible.value = true; |
||||||
|
} else { |
||||||
|
submit(); |
||||||
|
} |
||||||
|
}; |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
@import url(../../../../styles/form.scss); |
||||||
|
</style> |
@ -0,0 +1,157 @@ |
|||||||
|
<template> |
||||||
|
<div class="block"> |
||||||
|
<div class="flex justify-between items-center mb-5"> |
||||||
|
<search v-model="keyWord" @change="initList"></search> |
||||||
|
<div class="filter"> |
||||||
|
<el-popconfirm title="确定删除选中策略吗?" :disabled="!multipleSelection.length" @confirm.stop="delAll"> |
||||||
|
<template #reference> |
||||||
|
<div :class="['add-btn mr-2', { 'cursor-not-allowed': !multipleSelection.length }]"> |
||||||
|
<el-icon :size="24" color="#fff"> |
||||||
|
<Delete /> |
||||||
|
</el-icon> |
||||||
|
批量删除 |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
</el-popconfirm> |
||||||
|
|
||||||
|
<div class="add-btn" @click="toAdd"> |
||||||
|
<img src="@/assets/images/plus.png" alt="" class="icon" /> |
||||||
|
新增 |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<el-table ref="table" v-loading="loading" :data="list" @selection-change="handleSelectionChange"> |
||||||
|
<el-table-column type="selection" width="55" :selectable="handleDisable" /> |
||||||
|
<el-table-column label="序号" type="index" width="60" align="center" /> |
||||||
|
<el-table-column prop="strategyName" label="贷后检查策略名称" min-width="180" /> |
||||||
|
<el-table-column prop="createTime" label="新增日期" min-width="140" /> |
||||||
|
<el-table-column label="操作" width="140"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-button type="primary" link @click="toDetail(row, true)" size="small">查看</el-button> |
||||||
|
<template v-if="!row.builtIn"> |
||||||
|
<el-button type="primary" link @click="toDetail(row)" size="small">编辑</el-button> |
||||||
|
<el-popconfirm title="确定删除这条策略吗?" @confirm.stop="handleDelete([row.strategyId])"> |
||||||
|
<template #reference> |
||||||
|
<el-button type="primary" link size="small">删除</el-button> |
||||||
|
</template> |
||||||
|
</el-popconfirm> |
||||||
|
</template> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
</el-table> |
||||||
|
<el-pagination |
||||||
|
v-model:currentPage="currentPage" |
||||||
|
v-model:pageSize="pageSize" |
||||||
|
:total="total" |
||||||
|
:page-sizes="pageSizes" |
||||||
|
:layout="pageLayout" |
||||||
|
@size-change="getList()" |
||||||
|
@current-change="getList()" |
||||||
|
small |
||||||
|
background |
||||||
|
class="px-3 py-2 justify-end" |
||||||
|
></el-pagination> |
||||||
|
|
||||||
|
<el-drawer v-model="visible" :title="(isDetail ? '查看' : curRow.strategyId ? '编辑' : '新增') + '贷后检查策略'" size="100%" :z-index="10" class="model-drawer"> |
||||||
|
<Detail v-model:row="curRow" :disabled="isDetail" :key="i" @close="closeDrawer" /> |
||||||
|
</el-drawer> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script setup lang="ts"> |
||||||
|
import { onMounted, ref, watch, defineAsyncComponent } from 'vue'; |
||||||
|
import { ElMessage, ElMessageBox } from 'element-plus'; |
||||||
|
import { Delete } from '@element-plus/icons-vue'; |
||||||
|
import { pageSizes, pageLayout } from '@/utils/common'; |
||||||
|
import { postLoanInspection, postLoanInspectionDel } from '@/api/model'; |
||||||
|
import Search from '@/components/Search.vue'; |
||||||
|
|
||||||
|
const Detail = defineAsyncComponent(() => import('./Detail.vue')); |
||||||
|
|
||||||
|
const keyWord = ref<string>(); |
||||||
|
const currentPage = ref<number>(1); |
||||||
|
const pageSize = ref<number>(10); |
||||||
|
const total = ref<number>(0); |
||||||
|
const table = ref<any>(); |
||||||
|
|
||||||
|
const multipleSelection = ref<Record<string, any>[]>([]); |
||||||
|
const list = ref<Record<string, any>[]>([]); |
||||||
|
const loading = ref<boolean>(false); |
||||||
|
const visible = ref<boolean>(false); |
||||||
|
const curRow = ref<Record<string, any>>({ |
||||||
|
strategyId: '', |
||||||
|
strategyName: '', |
||||||
|
}); |
||||||
|
const isDetail = ref<boolean>(false); |
||||||
|
const i = ref<number>(0); |
||||||
|
// 列表 |
||||||
|
const getList = async () => { |
||||||
|
loading.value = true; |
||||||
|
try { |
||||||
|
const { page } = await postLoanInspection({ pageNum: currentPage.value, pageSize: pageSize.value, keyWord: keyWord.value }); |
||||||
|
list.value = page.records; |
||||||
|
total.value = page.total; |
||||||
|
} finally { |
||||||
|
loading.value = false; |
||||||
|
} |
||||||
|
}; |
||||||
|
// 重置列表 |
||||||
|
const initList = async () => { |
||||||
|
currentPage.value = 1; |
||||||
|
getList(); |
||||||
|
}; |
||||||
|
watch(keyWord, initList); |
||||||
|
onMounted(getList); |
||||||
|
|
||||||
|
// 多选框条件 |
||||||
|
const handleDisable = (row: Record<string, any>) => { |
||||||
|
// 内置数据禁用 |
||||||
|
if (row.builtIn) return false; |
||||||
|
return true; |
||||||
|
}; |
||||||
|
|
||||||
|
// 多选 |
||||||
|
const handleSelectionChange = (val: Record<string, any>[]) => { |
||||||
|
multipleSelection.value = val; |
||||||
|
}; |
||||||
|
const handleDelete = async (ids: number[]) => { |
||||||
|
try { |
||||||
|
const res = await postLoanInspectionDel({ ids }); |
||||||
|
// 删除失败则弹框 |
||||||
|
if (res.tip) { |
||||||
|
ElMessageBox.alert(res.message, '提示', { |
||||||
|
confirmButtonText: '确定', |
||||||
|
}); |
||||||
|
} else { |
||||||
|
getList(); |
||||||
|
ElMessage.success('删除成功!'); |
||||||
|
} |
||||||
|
} catch (e) {} |
||||||
|
}; |
||||||
|
// 批量删除 |
||||||
|
const delAll = async () => { |
||||||
|
handleDelete(multipleSelection.value.map((e) => e.strategyId)); |
||||||
|
}; |
||||||
|
// 新增 |
||||||
|
const toAdd = () => { |
||||||
|
i.value++; |
||||||
|
isDetail.value = false; |
||||||
|
curRow.value = { |
||||||
|
strategyId: '', |
||||||
|
strategyName: '', |
||||||
|
}; |
||||||
|
visible.value = true; |
||||||
|
}; |
||||||
|
// 产品详情 |
||||||
|
const toDetail = async (row: Record<string, any>, detail = false) => { |
||||||
|
i.value++; |
||||||
|
isDetail.value = detail; |
||||||
|
curRow.value = row; |
||||||
|
visible.value = true; |
||||||
|
}; |
||||||
|
// 关闭详情弹框 |
||||||
|
const closeDrawer = (refresh?: number) => { |
||||||
|
visible.value = false; |
||||||
|
refresh && initList(); |
||||||
|
}; |
||||||
|
</script> |
@ -1,344 +0,0 @@ |
|||||||
<template> |
|
||||||
<!-- 贷后评分 --> |
|
||||||
<el-table class="c-table" |
|
||||||
:data="form" |
|
||||||
:span-method="span" |
|
||||||
:cell-style="{background:'#fff'}" |
|
||||||
border> |
|
||||||
<el-table-column prop="recordName" |
|
||||||
label="指标" |
|
||||||
min-width="80" |
|
||||||
align="center"></el-table-column> |
|
||||||
<el-table-column prop="recordName" |
|
||||||
label="公式/取值" |
|
||||||
min-width="200" |
|
||||||
align="center"> |
|
||||||
<template #default="{ row, $index }"> |
|
||||||
<div class="flex items-center"> |
|
||||||
<template v-if="$index === 1"> |
|
||||||
存贷比 = |
|
||||||
<div class="inline-flex flex-col justify-center mx-2"> |
|
||||||
<el-select v-if="row.recordChildren" |
|
||||||
class="w-[140px]" |
|
||||||
clearable |
|
||||||
v-model="row.formulaOne"> |
|
||||||
<el-option v-for="item in row?.recordChildren[0].subject.itemList" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId" /> |
|
||||||
</el-select> |
|
||||||
<p class="h-[1px] my-2 bg-[#cdcdcd]"></p> |
|
||||||
<el-select v-if="row.recordChildren" |
|
||||||
class="w-[140px]" |
|
||||||
clearable |
|
||||||
v-model="row.formulaTwo"> |
|
||||||
<el-option v-for="item in row?.recordChildren[1].subject.itemList" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId" /> |
|
||||||
</el-select> |
|
||||||
</div> |
|
||||||
x 100% |
|
||||||
</template> |
|
||||||
<template v-if="$index === 6"> |
|
||||||
房屋净值 = |
|
||||||
<el-select v-if="row.recordChildren" |
|
||||||
class="w-[140px] mx-2" |
|
||||||
clearable |
|
||||||
v-model="row.formulaOne"> |
|
||||||
<el-option v-for="item in row?.recordChildren[0].subject.itemList" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId" /> |
|
||||||
</el-select> |
|
||||||
- |
|
||||||
<el-select v-if="row.recordChildren" |
|
||||||
class="w-[140px] ml-2" |
|
||||||
clearable |
|
||||||
v-model="row.formulaTwo"> |
|
||||||
<el-option v-for="item in row?.recordChildren[1].subject.itemList" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId" /> |
|
||||||
</el-select> |
|
||||||
</template> |
|
||||||
<template v-if="$index === 9"> |
|
||||||
近 |
|
||||||
<el-input class="w-[80px] mx-2" |
|
||||||
placeholder="请输入" |
|
||||||
v-model="row.formulaOne"></el-input> |
|
||||||
<el-select v-if="row.recordChildren" |
|
||||||
class="w-[140px] mr-2" |
|
||||||
clearable |
|
||||||
v-model="row.formulaTwo"> |
|
||||||
<el-option v-for="item in row?.recordChildren[1].subject.itemList" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId" /> |
|
||||||
</el-select> |
|
||||||
内逾期次数。 |
|
||||||
</template> |
|
||||||
<template v-if="$index === 12"> |
|
||||||
从 |
|
||||||
<el-select v-if="row.recordChildren" |
|
||||||
class="w-[140px] mx-2" |
|
||||||
clearable |
|
||||||
v-model="row.formulaOne"> |
|
||||||
<el-option v-for="item in row?.recordChildren[0].subject.itemList" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId" /> |
|
||||||
</el-select> |
|
||||||
开始算,还款当天不计算利息。 |
|
||||||
</template> |
|
||||||
<template v-if="$index === 15">当前尚未偿还的贷款总额。</template> |
|
||||||
<template v-if="$index === 18"> |
|
||||||
平均额度使用率 = |
|
||||||
<div class="inline-flex flex-col justify-center mx-2"> |
|
||||||
<el-select v-if="row.recordChildren" |
|
||||||
class="w-[140px]" |
|
||||||
clearable |
|
||||||
v-model="row.formulaOne"> |
|
||||||
<el-option v-for="item in row?.recordChildren[0].subject.itemList" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId" /> |
|
||||||
</el-select> |
|
||||||
<p class="h-[1px] my-2 bg-[#cdcdcd]"></p> |
|
||||||
<el-select v-if="row.recordChildren" |
|
||||||
class="w-[140px]" |
|
||||||
clearable |
|
||||||
v-model="row.formulaTwo"> |
|
||||||
<el-option v-for="item in row?.recordChildren[1].subject.itemList" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId" /> |
|
||||||
</el-select> |
|
||||||
</div> |
|
||||||
x 100% |
|
||||||
</template> |
|
||||||
<template v-if="$index === 22"> |
|
||||||
最大用信率 = |
|
||||||
<div class="inline-flex flex-col justify-center mx-2"> |
|
||||||
<el-select v-if="row.recordChildren" |
|
||||||
class="w-[140px]" |
|
||||||
clearable |
|
||||||
v-model="row.formulaOne"> |
|
||||||
<el-option v-for="item in row?.recordChildren[0].subject.itemList" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId" /> |
|
||||||
</el-select> |
|
||||||
<p class="h-[1px] my-2 bg-[#cdcdcd]"></p> |
|
||||||
<el-select v-if="row.recordChildren" |
|
||||||
class="w-[140px]" |
|
||||||
clearable |
|
||||||
v-model="row.formulaTwo"> |
|
||||||
<el-option v-for="item in row?.recordChildren[1].subject.itemList" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId" /> |
|
||||||
</el-select> |
|
||||||
</div> |
|
||||||
x 100% |
|
||||||
</template> |
|
||||||
<template v-if="$index === 26">到目前为止使用额度的次数。</template> |
|
||||||
<template v-if="$index === 30">到目前为止客户可以使用的最大额度。</template> |
|
||||||
<template v-if="$index === 35">客户贷记卡已经逾期的总月数。</template> |
|
||||||
<template v-if="$index === 37">客户在行所有贷款已经逾期的总月数。</template> |
|
||||||
</div> |
|
||||||
</template> |
|
||||||
</el-table-column> |
|
||||||
<el-table-column prop="ruleName" |
|
||||||
label="取值" |
|
||||||
min-width="100" |
|
||||||
align="center"></el-table-column> |
|
||||||
<el-table-column label="分数" |
|
||||||
min-width="80" |
|
||||||
align="center"> |
|
||||||
<template #default="{ row }"> |
|
||||||
<el-select v-if="row.subject" |
|
||||||
clearable |
|
||||||
v-model="row.score"> |
|
||||||
<el-option v-for="item in row.subject.itemList.sort((a, b) => +a.options - +b.options)" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId" /> |
|
||||||
</el-select> |
|
||||||
<span v-else>600</span> |
|
||||||
</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, onMounted } from 'vue'; |
|
||||||
import { ElMessage } from 'element-plus'; |
|
||||||
import { postCreditScoreDetails, postCreditScoreSave } from '@/api/model'; |
|
||||||
import { getProcessInformationBasedOnRoles, addOperation } from '@/api/judgment'; |
|
||||||
import type { TableColumnCtx } from 'element-plus'; |
|
||||||
import { handleId, getIds } from '@/utils/common'; |
|
||||||
import Cookies from 'js-cookie'; |
|
||||||
|
|
||||||
const form = ref<Record<string, any>[]>([]); |
|
||||||
const info = ref<Record<string, any>[]>([]); |
|
||||||
// 配置项 |
|
||||||
const getConfig = async () => { |
|
||||||
const { process } = await getProcessInformationBasedOnRoles(1031); |
|
||||||
const result = [ |
|
||||||
{ |
|
||||||
recordName: '基准分', |
|
||||||
}, |
|
||||||
]; |
|
||||||
process.map((e, i) => { |
|
||||||
let temp = { |
|
||||||
...getIds(), |
|
||||||
recordName: e.name, |
|
||||||
recordChildren: e.recordChildren, |
|
||||||
formulaOne: '', |
|
||||||
formulaTwo: '', |
|
||||||
score: '', |
|
||||||
id: '', |
|
||||||
stRecordId: e.id, |
|
||||||
middleId: e.recordChildren[e.recordChildren.length - 1]?.id, |
|
||||||
}; |
|
||||||
// 遍历“取值”这个流程 |
|
||||||
e.recordChildren[e.recordChildren.length - 1]?.recordChildren?.map((n, j) => { |
|
||||||
temp = JSON.parse(JSON.stringify(temp)); |
|
||||||
temp.index = j; |
|
||||||
temp.ruleName = n.name; |
|
||||||
temp.subject = n.subject; |
|
||||||
temp.ruleId = n.id; |
|
||||||
result.push(temp); |
|
||||||
}); |
|
||||||
}); |
|
||||||
if (info.value.length) { |
|
||||||
result.forEach((e, i) => { |
|
||||||
if (i) { |
|
||||||
e.formulaOne = info.value[i - 1].formulaOne ? +info.value[i - 1].formulaOne : ''; |
|
||||||
e.indexId = info.value[i - 1].indexId; |
|
||||||
e.formulaTwo = info.value[i - 1].formulaTwo ? +info.value[i - 1].formulaTwo : ''; |
|
||||||
e.score = info.value[i - 1].score ? +info.value[i - 1].score : ''; |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
form.value = result; |
|
||||||
console.log('🚀 ~ file: 1031.vue:83 ~ getConfig ~ result:', result); |
|
||||||
}; |
|
||||||
// 详情 |
|
||||||
const getDetail = async () => { |
|
||||||
try { |
|
||||||
const { data } = await postCreditScoreDetails(); |
|
||||||
info.value = data; |
|
||||||
getConfig(); |
|
||||||
} finally { |
|
||||||
} |
|
||||||
}; |
|
||||||
|
|
||||||
interface SpanMethodProps { |
|
||||||
row: Record<string, any>; |
|
||||||
column: TableColumnCtx<Record<string, any>>; |
|
||||||
rowIndex: number; |
|
||||||
columnIndex: number; |
|
||||||
} |
|
||||||
const rowMerge1 = [1, 30]; |
|
||||||
const rowMerge2 = [6, 9, 12, 15]; |
|
||||||
const rowMerge3 = [9, 18, 22, 26]; |
|
||||||
const rowMerge4 = [35, 37]; |
|
||||||
// 表格合并 |
|
||||||
const span = ({ row, column, rowIndex, columnIndex }: SpanMethodProps) => { |
|
||||||
if (!rowIndex) { |
|
||||||
if (!columnIndex) { |
|
||||||
return { |
|
||||||
rowspan: 1, |
|
||||||
colspan: 3, |
|
||||||
}; |
|
||||||
} else if (columnIndex === 3) { |
|
||||||
return { |
|
||||||
rowspan: 1, |
|
||||||
colspan: 1, |
|
||||||
}; |
|
||||||
} else { |
|
||||||
return { |
|
||||||
rowspan: 0, |
|
||||||
colspan: 0, |
|
||||||
}; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
if (columnIndex < 2) { |
|
||||||
if (rowMerge1.includes(rowIndex)) { |
|
||||||
return { |
|
||||||
rowspan: 5, |
|
||||||
colspan: 1, |
|
||||||
}; |
|
||||||
} else if (rowMerge2.includes(rowIndex)) { |
|
||||||
return { |
|
||||||
rowspan: 3, |
|
||||||
colspan: 1, |
|
||||||
}; |
|
||||||
} else if (rowMerge3.includes(rowIndex)) { |
|
||||||
return { |
|
||||||
rowspan: 4, |
|
||||||
colspan: 1, |
|
||||||
}; |
|
||||||
} else if (rowMerge4.includes(rowIndex)) { |
|
||||||
return { |
|
||||||
rowspan: 2, |
|
||||||
colspan: 1, |
|
||||||
}; |
|
||||||
} else { |
|
||||||
return { |
|
||||||
rowspan: 0, |
|
||||||
colspan: 0, |
|
||||||
}; |
|
||||||
} |
|
||||||
} |
|
||||||
}; |
|
||||||
// 新增判分记录 |
|
||||||
const addRecord = async (data: Record<string, any>) => { |
|
||||||
const preIds = `1,${Cookies.get('sand-level')},42,69,1031`; // 1,关卡id,角色(这个页面是风控经理策略) |
|
||||||
const rule = []; |
|
||||||
|
|
||||||
data.forEach((e, i) => { |
|
||||||
e.score && rule.push(handleId(e.ruleId, e.subject.subjectId, e.score, `${preIds},${e.stRecordId},${e.middleId},${e.ruleId}`, 1)); |
|
||||||
if (i === 1 || i === 6 || i === 18 || i === 22) { |
|
||||||
e.formulaOne && rule.push(handleId(1061, 285, e.formulaOne, `${preIds},${e.stRecordId},1061`, 1)); |
|
||||||
e.formulaTwo && rule.push(handleId(1062, 285, e.formulaTwo, `${preIds},${e.stRecordId},1062`, 1)); |
|
||||||
} |
|
||||||
}); |
|
||||||
data[9].formulaOne && rule.push(handleId(1075, 288, data[9].formulaOne, `${preIds},1074,1075`, 3)); |
|
||||||
data[9].formulaTwo && rule.push(handleId(1076, 289, data[9].formulaTwo, `${preIds},1074,1076`, 1)); |
|
||||||
data[12].formulaOne && rule.push(handleId(1083, 291, data[12].formulaOne, `${preIds},1082,1083`, 1)); |
|
||||||
|
|
||||||
await addOperation({ |
|
||||||
...getIds(), |
|
||||||
parentId: preIds, |
|
||||||
lcJudgmentRuleReq: rule, |
|
||||||
}); |
|
||||||
}; |
|
||||||
// 提交 |
|
||||||
const submit = async () => { |
|
||||||
let param = JSON.parse(JSON.stringify(form.value)); |
|
||||||
const recordParam = JSON.parse(JSON.stringify(param)); |
|
||||||
param.map((e) => { |
|
||||||
delete e.recordChildren; |
|
||||||
}); |
|
||||||
await postCreditScoreSave({ postCreditScoreList: param }); |
|
||||||
addRecord(recordParam); |
|
||||||
getDetail(); |
|
||||||
ElMessage.success('提交成功!'); |
|
||||||
}; |
|
||||||
onMounted(() => { |
|
||||||
getDetail(); |
|
||||||
}); |
|
||||||
</script> |
|
||||||
|
|
||||||
<style lang="scss" scoped> |
|
||||||
@import url(../../../styles/form.scss); |
|
||||||
</style> |
|
@ -0,0 +1,336 @@ |
|||||||
|
<template> |
||||||
|
<!-- 贷后评分 --> |
||||||
|
<el-form label-width="90px" label-suffix=":" class="form" :disabled="disabled" v-loading="loading"> |
||||||
|
<el-form-item label="策略名称"> |
||||||
|
<div> |
||||||
|
<el-input class="w-[320px]" placeholder="请输入20以内字符" maxlength="20" clearable v-model="strategyName" /> |
||||||
|
<p v-if="bankIds.length" class="text-danger">不同步已关联产品,请修改策略名称。</p> |
||||||
|
</div> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="策略规则"> |
||||||
|
<el-table class="c-table" :data="form" :span-method="span" :cell-style="{ background: '#fff' }" border> |
||||||
|
<el-table-column prop="name" label="选用" width="130" align="center"> |
||||||
|
<template #default="{ row, $index }"> |
||||||
|
<el-radio-group v-if="$index" v-model="row.isChoose"> |
||||||
|
<el-radio v-for="(item, i) in opt1" :key="i" :label="item.id">{{ item.name }}</el-radio> |
||||||
|
</el-radio-group> |
||||||
|
<span v-else>基准分</span> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column prop="recordName" label="指标" min-width="80" align="center"></el-table-column> |
||||||
|
<el-table-column prop="recordName" label="公式/取值" min-width="200" align="center"> |
||||||
|
<template #default="{ row, $index }"> |
||||||
|
<div class="flex items-center"> |
||||||
|
<template v-if="$index === 1"> |
||||||
|
存贷比 = |
||||||
|
<div class="inline-flex flex-col justify-center mx-2"> |
||||||
|
<el-select v-if="row.recordChildren" class="w-[140px]" clearable v-model="row.formulaOne" disabled> |
||||||
|
<el-option v-for="item in row?.recordChildren[1].subject.itemList" :key="item" :label="item.options" :value="item.itemId" /> |
||||||
|
</el-select> |
||||||
|
<p class="h-[1px] my-2 bg-[#cdcdcd]"></p> |
||||||
|
<el-select v-if="row.recordChildren" class="w-[140px]" clearable v-model="row.formulaTwo" disabled> |
||||||
|
<el-option v-for="item in row?.recordChildren[2].subject.itemList" :key="item" :label="item.options" :value="item.itemId" /> |
||||||
|
</el-select> |
||||||
|
</div> |
||||||
|
x 100% |
||||||
|
</template> |
||||||
|
<template v-if="$index === 6"> |
||||||
|
房屋净值 = |
||||||
|
<el-select v-if="row.recordChildren" class="w-[140px] mx-2" clearable v-model="row.formulaOne" disabled> |
||||||
|
<el-option v-for="item in row?.recordChildren[1].subject.itemList" :key="item" :label="item.options" :value="item.itemId" /> |
||||||
|
</el-select> |
||||||
|
- |
||||||
|
<el-select v-if="row.recordChildren" class="w-[140px] ml-2" clearable v-model="row.formulaTwo" disabled> |
||||||
|
<el-option v-for="item in row?.recordChildren[2].subject.itemList" :key="item" :label="item.options" :value="item.itemId" /> |
||||||
|
</el-select> |
||||||
|
</template> |
||||||
|
<template v-if="$index === 9"> |
||||||
|
近 |
||||||
|
<el-input class="w-[80px] mx-2" placeholder="请输入" v-model="row.formulaOne" disabled></el-input> |
||||||
|
<el-select v-if="row.recordChildren" class="w-[140px] mr-2" clearable v-model="row.formulaTwo" disabled> |
||||||
|
<el-option v-for="item in row?.recordChildren[2].subject.itemList" :key="item" :label="item.options" :value="item.itemId" /> |
||||||
|
</el-select> |
||||||
|
内逾期次数。 |
||||||
|
</template> |
||||||
|
<template v-if="$index === 12"> |
||||||
|
从 |
||||||
|
<el-select v-if="row.recordChildren" class="w-[140px] mx-2" clearable v-model="row.formulaOne" disabled> |
||||||
|
<el-option v-for="item in row?.recordChildren[1].subject.itemList" :key="item" :label="item.options" :value="item.itemId" /> |
||||||
|
</el-select> |
||||||
|
开始算,还款当天不计算利息。 |
||||||
|
</template> |
||||||
|
<template v-if="$index === 15">当前尚未偿还的贷款总额。</template> |
||||||
|
<template v-if="$index === 18"> |
||||||
|
平均额度使用率 = |
||||||
|
<div class="inline-flex flex-col justify-center mx-2"> |
||||||
|
<el-select v-if="row.recordChildren" class="w-[140px]" clearable v-model="row.formulaOne" disabled> |
||||||
|
<el-option v-for="item in row?.recordChildren[1].subject.itemList" :key="item" :label="item.options" :value="item.itemId" /> |
||||||
|
</el-select> |
||||||
|
<p class="h-[1px] my-2 bg-[#cdcdcd]"></p> |
||||||
|
<el-select v-if="row.recordChildren" class="w-[140px]" clearable v-model="row.formulaTwo" disabled> |
||||||
|
<el-option v-for="item in row?.recordChildren[2].subject.itemList" :key="item" :label="item.options" :value="item.itemId" /> |
||||||
|
</el-select> |
||||||
|
</div> |
||||||
|
x 100% |
||||||
|
</template> |
||||||
|
<template v-if="$index === 22"> |
||||||
|
最大用信率 = |
||||||
|
<div class="inline-flex flex-col justify-center mx-2"> |
||||||
|
<el-select v-if="row.recordChildren" class="w-[140px]" clearable v-model="row.formulaOne" disabled> |
||||||
|
<el-option v-for="item in row?.recordChildren[1].subject.itemList" :key="item" :label="item.options" :value="item.itemId" /> |
||||||
|
</el-select> |
||||||
|
<p class="h-[1px] my-2 bg-[#cdcdcd]"></p> |
||||||
|
<el-select v-if="row.recordChildren" class="w-[140px]" clearable v-model="row.formulaTwo" disabled> |
||||||
|
<el-option v-for="item in row?.recordChildren[2].subject.itemList" :key="item" :label="item.options" :value="item.itemId" /> |
||||||
|
</el-select> |
||||||
|
</div> |
||||||
|
x 100% |
||||||
|
</template> |
||||||
|
<template v-if="$index === 26">到目前为止使用额度的次数。</template> |
||||||
|
<template v-if="$index === 30">到目前为止客户可以使用的最大额度。</template> |
||||||
|
<template v-if="$index === 35">客户贷记卡已经逾期的总月数。</template> |
||||||
|
<template v-if="$index === 37">客户在行所有贷款已经逾期的总月数。</template> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column prop="ruleName" label="取值" min-width="100" align="center"></el-table-column> |
||||||
|
<el-table-column label="分数" min-width="80" align="center"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-select v-if="row.subject" clearable v-model="row.score"> |
||||||
|
<el-option v-for="item in row.subject.itemList.sort((a, b) => +a.options - +b.options)" :key="item" :label="item.options" :value="item.itemId" /> |
||||||
|
</el-select> |
||||||
|
<span v-else>600</span> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
</el-table> |
||||||
|
</el-form-item> |
||||||
|
<div v-if="!disabled" class="flex justify-end mt-3"> |
||||||
|
<div class="dia-btn cancel" @click="emit('close')">取消</div> |
||||||
|
<div class="dia-btn" @click="confirmSubmit">确定</div> |
||||||
|
</div> |
||||||
|
</el-form> |
||||||
|
|
||||||
|
<Confirm v-model="syncVisible" @submit="submit" /> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script setup lang="ts"> |
||||||
|
import { ref, defineAsyncComponent, onMounted, toRefs } from 'vue'; |
||||||
|
import { ElMessage } from 'element-plus'; |
||||||
|
import { postCreditScoreDetails, postCreditScoreSave, isTheStrategyRelatedToTheProduct } from '@/api/model'; |
||||||
|
import { getProcessInformationBasedOnRoles, addOperation } from '@/api/judgment'; |
||||||
|
import type { TableColumnCtx } from 'element-plus'; |
||||||
|
import { handleId, getIds, opt1 } from '@/utils/common'; |
||||||
|
import Cookies from 'js-cookie'; |
||||||
|
import { getStat } from '@/store/useProduct'; |
||||||
|
|
||||||
|
const Confirm = defineAsyncComponent(() => import('@/components/StrategyConfirm.vue')); |
||||||
|
|
||||||
|
const props = defineProps({ |
||||||
|
disabled: { type: Boolean, default: false }, |
||||||
|
row: { type: Object }, |
||||||
|
}); |
||||||
|
|
||||||
|
const emit = defineEmits(['close']); |
||||||
|
const { strategyId, strategyName } = toRefs(props.row); |
||||||
|
const form = ref<Record<string, any>[]>([]); |
||||||
|
const info = ref<Record<string, any>[]>([]); |
||||||
|
// 公式的默认答案 |
||||||
|
const answer = [[697, 693], [698, 691], [1, 707], [716], [], [695, 696], [696, 694]]; |
||||||
|
const loading = ref<boolean>(false); |
||||||
|
const syncVisible = ref<boolean>(false); |
||||||
|
const bankIds = ref<Record<string, any>[]>([]); |
||||||
|
// 配置项 |
||||||
|
const getConfig = async () => { |
||||||
|
const { process } = await getProcessInformationBasedOnRoles(1031); |
||||||
|
const result = [ |
||||||
|
{ |
||||||
|
recordName: '基准分', |
||||||
|
}, |
||||||
|
]; |
||||||
|
process.slice(1).map((e, i) => { |
||||||
|
let temp = { |
||||||
|
...getIds(), |
||||||
|
recordName: e.name, |
||||||
|
recordChildren: e.recordChildren, |
||||||
|
formulaOne: i < 7 ? answer[i][0] || '' : '', |
||||||
|
formulaTwo: i < 7 ? answer[i][1] || '' : '', |
||||||
|
score: '', |
||||||
|
id: '', |
||||||
|
stRecordId: e.id, |
||||||
|
middleId: e.recordChildren[e.recordChildren.length - 1]?.id, |
||||||
|
}; |
||||||
|
// 遍历“取值”这个流程 |
||||||
|
e.recordChildren[e.recordChildren.length - 1]?.recordChildren?.map((n, j) => { |
||||||
|
temp = JSON.parse(JSON.stringify(temp)); |
||||||
|
temp.index = j; |
||||||
|
temp.ruleName = n.name; |
||||||
|
temp.subject = n.subject; |
||||||
|
temp.ruleId = n.id; |
||||||
|
temp.isChoose = ''; |
||||||
|
result.push(temp); |
||||||
|
}); |
||||||
|
}); |
||||||
|
if (info.value.length) { |
||||||
|
result.forEach((e, i) => { |
||||||
|
if (i) { |
||||||
|
e.indexId = info.value[i - 1].indexId; |
||||||
|
e.isChoose = info.value[i - 1].isChoose; |
||||||
|
e.score = info.value[i - 1].score ? +info.value[i - 1].score : ''; |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
form.value = result; |
||||||
|
loading.value = false; |
||||||
|
}; |
||||||
|
// 详情 |
||||||
|
const getDetail = async () => { |
||||||
|
loading.value = true; |
||||||
|
try { |
||||||
|
if (strategyId.value) { |
||||||
|
const { data } = await postCreditScoreDetails({ |
||||||
|
strategyId: strategyId.value, |
||||||
|
}); |
||||||
|
info.value = data.slice(1); |
||||||
|
} |
||||||
|
getConfig(); |
||||||
|
|
||||||
|
// 编辑需要判断是否有绑定产品 |
||||||
|
if (strategyId.value && !props.disabled) { |
||||||
|
const res = await isTheStrategyRelatedToTheProduct({ |
||||||
|
tacticsId: strategyId.value, |
||||||
|
strategyType: 16, |
||||||
|
}); |
||||||
|
if (res.isRelated) bankIds.value = res.bankIds; |
||||||
|
} |
||||||
|
} finally { |
||||||
|
} |
||||||
|
}; |
||||||
|
onMounted(getDetail); |
||||||
|
|
||||||
|
interface SpanMethodProps { |
||||||
|
row: Record<string, any>; |
||||||
|
column: TableColumnCtx<Record<string, any>>; |
||||||
|
rowIndex: number; |
||||||
|
columnIndex: number; |
||||||
|
} |
||||||
|
const rowMerge1 = [1, 30]; |
||||||
|
const rowMerge2 = [6, 9, 12, 15]; |
||||||
|
const rowMerge3 = [9, 18, 22, 26]; |
||||||
|
const rowMerge4 = [35, 37]; |
||||||
|
// 表格合并 |
||||||
|
const span = ({ row, column, rowIndex, columnIndex }: SpanMethodProps) => { |
||||||
|
if (!rowIndex) { |
||||||
|
if (!columnIndex) { |
||||||
|
return { |
||||||
|
rowspan: 1, |
||||||
|
colspan: 4, |
||||||
|
}; |
||||||
|
} |
||||||
|
if (columnIndex === 4) { |
||||||
|
return { |
||||||
|
rowspan: 1, |
||||||
|
colspan: 1, |
||||||
|
}; |
||||||
|
} |
||||||
|
return { |
||||||
|
rowspan: 0, |
||||||
|
colspan: 0, |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
if (columnIndex < 3) { |
||||||
|
if (rowMerge1.includes(rowIndex)) { |
||||||
|
return { |
||||||
|
rowspan: 5, |
||||||
|
colspan: 1, |
||||||
|
}; |
||||||
|
} |
||||||
|
if (rowMerge2.includes(rowIndex)) { |
||||||
|
return { |
||||||
|
rowspan: 3, |
||||||
|
colspan: 1, |
||||||
|
}; |
||||||
|
} |
||||||
|
if (rowMerge3.includes(rowIndex)) { |
||||||
|
return { |
||||||
|
rowspan: 4, |
||||||
|
colspan: 1, |
||||||
|
}; |
||||||
|
} |
||||||
|
if (rowMerge4.includes(rowIndex)) { |
||||||
|
return { |
||||||
|
rowspan: 2, |
||||||
|
colspan: 1, |
||||||
|
}; |
||||||
|
} |
||||||
|
return { |
||||||
|
rowspan: 0, |
||||||
|
colspan: 0, |
||||||
|
}; |
||||||
|
} |
||||||
|
}; |
||||||
|
// 新增判分记录 |
||||||
|
const addRecord = async (data: Record<string, any>) => { |
||||||
|
const preIds = `1,${Cookies.get('sand-level')},42,69,1031`; // 1,关卡id,角色(这个页面是风控经理策略) |
||||||
|
const rule = [handleId(140, 28, strategyName.value, `${preIds},140`, 3)]; |
||||||
|
|
||||||
|
data.forEach((e, i) => { |
||||||
|
e.isChoose && rule.push(handleId(1052, 140, e.isChoose, `${preIds},${e.stRecordId},1052`, 1)); |
||||||
|
e.score && rule.push(handleId(e.ruleId, e.subject.subjectId, e.score, `${preIds},${e.stRecordId},${e.middleId},${e.ruleId}`, 1)); |
||||||
|
if (i === 1 || i === 6 || i === 18 || i === 22) { |
||||||
|
e.formulaOne && rule.push(handleId(1061, 285, e.formulaOne, `${preIds},${e.stRecordId},1061`, 1)); |
||||||
|
e.formulaTwo && rule.push(handleId(1062, 285, e.formulaTwo, `${preIds},${e.stRecordId},1062`, 1)); |
||||||
|
} |
||||||
|
}); |
||||||
|
data[9].formulaOne && rule.push(handleId(1075, 288, data[9].formulaOne, `${preIds},1074,1075`, 3)); |
||||||
|
data[9].formulaTwo && rule.push(handleId(1076, 289, data[9].formulaTwo, `${preIds},1074,1076`, 1)); |
||||||
|
data[12].formulaOne && rule.push(handleId(1083, 291, data[12].formulaOne, `${preIds},1082,1083`, 1)); |
||||||
|
|
||||||
|
await addOperation({ |
||||||
|
...getIds(), |
||||||
|
parentId: preIds, |
||||||
|
lcJudgmentRuleReq: rule, |
||||||
|
}); |
||||||
|
loading.value = false; |
||||||
|
ElMessage.success('提交成功!'); |
||||||
|
syncVisible.value = false; |
||||||
|
emit('close', 1); |
||||||
|
}; |
||||||
|
// 提交 |
||||||
|
const submit = async (synchronizeUpdate?: number) => { |
||||||
|
loading.value = true; |
||||||
|
try { |
||||||
|
const param = JSON.parse(JSON.stringify(form.value)); |
||||||
|
const recordParam = JSON.parse(JSON.stringify(param)); |
||||||
|
param.map((e) => { |
||||||
|
delete e.recordChildren; |
||||||
|
}); |
||||||
|
await postCreditScoreSave({ |
||||||
|
...getIds(), |
||||||
|
strategyId: strategyId.value, |
||||||
|
strategyName: strategyName.value, |
||||||
|
synchronizeUpdate, |
||||||
|
postCreditScoreList: param, |
||||||
|
bankIds: bankIds.value, |
||||||
|
}); |
||||||
|
getStat(295); |
||||||
|
addRecord(recordParam); |
||||||
|
} catch (e) { |
||||||
|
loading.value = false; |
||||||
|
} |
||||||
|
}; |
||||||
|
const confirmSubmit = async () => { |
||||||
|
if (!strategyName.value) return ElMessage.error('请输入策略名称!'); |
||||||
|
|
||||||
|
// 编辑需要判断是否有绑定产品 |
||||||
|
if (bankIds.value.length) { |
||||||
|
syncVisible.value = true; |
||||||
|
} else { |
||||||
|
submit(); |
||||||
|
} |
||||||
|
}; |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
@import url(../../../../styles/form.scss); |
||||||
|
</style> |
@ -0,0 +1,157 @@ |
|||||||
|
<template> |
||||||
|
<div class="block"> |
||||||
|
<div class="flex justify-between items-center mb-5"> |
||||||
|
<search v-model="keyWord" @change="initList"></search> |
||||||
|
<div class="filter"> |
||||||
|
<el-popconfirm title="确定删除选中策略吗?" :disabled="!multipleSelection.length" @confirm.stop="delAll"> |
||||||
|
<template #reference> |
||||||
|
<div :class="['add-btn mr-2', { 'cursor-not-allowed': !multipleSelection.length }]"> |
||||||
|
<el-icon :size="24" color="#fff"> |
||||||
|
<Delete /> |
||||||
|
</el-icon> |
||||||
|
批量删除 |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
</el-popconfirm> |
||||||
|
|
||||||
|
<div class="add-btn" @click="toAdd"> |
||||||
|
<img src="@/assets/images/plus.png" alt="" class="icon" /> |
||||||
|
新增 |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<el-table ref="table" v-loading="loading" :data="list" @selection-change="handleSelectionChange"> |
||||||
|
<el-table-column type="selection" width="55" :selectable="handleDisable" /> |
||||||
|
<el-table-column label="序号" type="index" width="60" align="center" /> |
||||||
|
<el-table-column prop="strategyName" label="贷后评分策略名称" min-width="180" /> |
||||||
|
<el-table-column prop="createTime" label="新增日期" min-width="140" /> |
||||||
|
<el-table-column label="操作" width="140"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-button type="primary" link @click="toDetail(row, true)" size="small">查看</el-button> |
||||||
|
<template v-if="!row.builtIn"> |
||||||
|
<el-button type="primary" link @click="toDetail(row)" size="small">编辑</el-button> |
||||||
|
<el-popconfirm title="确定删除这条策略吗?" @confirm.stop="handleDelete([row.strategyId])"> |
||||||
|
<template #reference> |
||||||
|
<el-button type="primary" link size="small">删除</el-button> |
||||||
|
</template> |
||||||
|
</el-popconfirm> |
||||||
|
</template> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
</el-table> |
||||||
|
<el-pagination |
||||||
|
v-model:currentPage="currentPage" |
||||||
|
v-model:pageSize="pageSize" |
||||||
|
:total="total" |
||||||
|
:page-sizes="pageSizes" |
||||||
|
:layout="pageLayout" |
||||||
|
@size-change="getList()" |
||||||
|
@current-change="getList()" |
||||||
|
small |
||||||
|
background |
||||||
|
class="px-3 py-2 justify-end" |
||||||
|
></el-pagination> |
||||||
|
|
||||||
|
<el-drawer v-model="visible" :title="(isDetail ? '查看' : curRow.strategyId ? '编辑' : '新增') + '贷后评分策略'" size="100%" :z-index="10" class="model-drawer"> |
||||||
|
<Detail v-model:row="curRow" :disabled="isDetail" :key="i" @close="closeDrawer" /> |
||||||
|
</el-drawer> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script setup lang="ts"> |
||||||
|
import { onMounted, ref, watch, defineAsyncComponent } from 'vue'; |
||||||
|
import { ElMessage, ElMessageBox } from 'element-plus'; |
||||||
|
import { Delete } from '@element-plus/icons-vue'; |
||||||
|
import { pageSizes, pageLayout } from '@/utils/common'; |
||||||
|
import { postCreditScore, postCreditScoreDel } from '@/api/model'; |
||||||
|
import Search from '@/components/Search.vue'; |
||||||
|
|
||||||
|
const Detail = defineAsyncComponent(() => import('./Detail.vue')); |
||||||
|
|
||||||
|
const keyWord = ref<string>(); |
||||||
|
const currentPage = ref<number>(1); |
||||||
|
const pageSize = ref<number>(10); |
||||||
|
const total = ref<number>(0); |
||||||
|
const table = ref<any>(); |
||||||
|
|
||||||
|
const multipleSelection = ref<Record<string, any>[]>([]); |
||||||
|
const list = ref<Record<string, any>[]>([]); |
||||||
|
const loading = ref<boolean>(false); |
||||||
|
const visible = ref<boolean>(false); |
||||||
|
const curRow = ref<Record<string, any>>({ |
||||||
|
strategyId: '', |
||||||
|
strategyName: '', |
||||||
|
}); |
||||||
|
const isDetail = ref<boolean>(false); |
||||||
|
const i = ref<number>(0); |
||||||
|
// 列表 |
||||||
|
const getList = async () => { |
||||||
|
loading.value = true; |
||||||
|
try { |
||||||
|
const { page } = await postCreditScore({ pageNum: currentPage.value, pageSize: pageSize.value, keyWord: keyWord.value }); |
||||||
|
list.value = page.records; |
||||||
|
total.value = page.total; |
||||||
|
} finally { |
||||||
|
loading.value = false; |
||||||
|
} |
||||||
|
}; |
||||||
|
// 重置列表 |
||||||
|
const initList = async () => { |
||||||
|
currentPage.value = 1; |
||||||
|
getList(); |
||||||
|
}; |
||||||
|
watch(keyWord, initList); |
||||||
|
onMounted(getList); |
||||||
|
|
||||||
|
// 多选框条件 |
||||||
|
const handleDisable = (row: Record<string, any>) => { |
||||||
|
// 内置数据禁用 |
||||||
|
if (row.builtIn) return false; |
||||||
|
return true; |
||||||
|
}; |
||||||
|
|
||||||
|
// 多选 |
||||||
|
const handleSelectionChange = (val: Record<string, any>[]) => { |
||||||
|
multipleSelection.value = val; |
||||||
|
}; |
||||||
|
const handleDelete = async (ids: number[]) => { |
||||||
|
try { |
||||||
|
const res = await postCreditScoreDel({ ids }); |
||||||
|
// 删除失败则弹框 |
||||||
|
if (res.tip) { |
||||||
|
ElMessageBox.alert(res.message, '提示', { |
||||||
|
confirmButtonText: '确定', |
||||||
|
}); |
||||||
|
} else { |
||||||
|
getList(); |
||||||
|
ElMessage.success('删除成功!'); |
||||||
|
} |
||||||
|
} catch (e) {} |
||||||
|
}; |
||||||
|
// 批量删除 |
||||||
|
const delAll = async () => { |
||||||
|
handleDelete(multipleSelection.value.map((e) => e.strategyId)); |
||||||
|
}; |
||||||
|
// 新增 |
||||||
|
const toAdd = () => { |
||||||
|
i.value++; |
||||||
|
isDetail.value = false; |
||||||
|
curRow.value = { |
||||||
|
strategyId: '', |
||||||
|
strategyName: '', |
||||||
|
}; |
||||||
|
visible.value = true; |
||||||
|
}; |
||||||
|
// 产品详情 |
||||||
|
const toDetail = async (row: Record<string, any>, detail = false) => { |
||||||
|
i.value++; |
||||||
|
isDetail.value = detail; |
||||||
|
curRow.value = row; |
||||||
|
visible.value = true; |
||||||
|
}; |
||||||
|
// 关闭详情弹框 |
||||||
|
const closeDrawer = (refresh?: number) => { |
||||||
|
visible.value = false; |
||||||
|
refresh && initList(); |
||||||
|
}; |
||||||
|
</script> |
@ -1,130 +0,0 @@ |
|||||||
<template> |
|
||||||
<!-- 贷后预警 --> |
|
||||||
<el-table class="c-table" |
|
||||||
:data="form" |
|
||||||
:cell-style="{background:'#fff'}" |
|
||||||
border> |
|
||||||
<el-table-column label="选用" |
|
||||||
width="80" |
|
||||||
align="center"> |
|
||||||
<template #default="{ row }"> |
|
||||||
<el-checkbox v-model="row.isChoose"></el-checkbox> |
|
||||||
</template> |
|
||||||
</el-table-column> |
|
||||||
<el-table-column prop="recordName" |
|
||||||
label="风险类型" |
|
||||||
align="center"></el-table-column> |
|
||||||
<el-table-column label="风险等级" |
|
||||||
align="center"> |
|
||||||
<template #default="{ row }"> |
|
||||||
<div class="flex"> |
|
||||||
<el-select v-if="row.recordChildren" |
|
||||||
class="mr-2" |
|
||||||
clearable |
|
||||||
v-model="row.riskGradeType"> |
|
||||||
<el-option v-for="item in row?.recordChildren[1].recordChildren[0].subject.itemList" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId" /> |
|
||||||
</el-select> |
|
||||||
|
|
||||||
<el-select v-if="row.recordChildren" |
|
||||||
clearable |
|
||||||
v-model="row.riskGrade"> |
|
||||||
<el-option v-for="item in row?.recordChildren[1].recordChildren[1].subject.itemList" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId" /> |
|
||||||
</el-select> |
|
||||||
</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, onMounted } from 'vue'; |
|
||||||
import { ElMessage } from 'element-plus'; |
|
||||||
import { postLoanWarningDetails, postLoanWarningSave } from '@/api/model'; |
|
||||||
import { getProcessInformationBasedOnRoles, addOperation } from '@/api/judgment'; |
|
||||||
import { handleId, getIds } from '@/utils/common'; |
|
||||||
import Cookies from 'js-cookie'; |
|
||||||
|
|
||||||
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 getConfig = async () => { |
|
||||||
const { process } = await getProcessInformationBasedOnRoles(1032); |
|
||||||
const result = []; |
|
||||||
process.map((e, i) => { |
|
||||||
const cur = info.value.length ? info.value[i] : {}; |
|
||||||
result.push({ |
|
||||||
...getIds(), |
|
||||||
recordName: e.name, |
|
||||||
recordChildren: e.recordChildren, |
|
||||||
riskGrade: +cur.riskGrade || '', |
|
||||||
riskGradeType: +cur.riskGradeType || '', |
|
||||||
isChoose: info.value.length ? !!cur.isChoose : false, |
|
||||||
id: cur.id || '', |
|
||||||
stRecordId: e.id, |
|
||||||
}); |
|
||||||
}); |
|
||||||
form.value = result; |
|
||||||
}; |
|
||||||
// 详情 |
|
||||||
const getDetail = async () => { |
|
||||||
try { |
|
||||||
const { data } = await postLoanWarningDetails(); |
|
||||||
info.value = data; |
|
||||||
getConfig(); |
|
||||||
} finally { |
|
||||||
} |
|
||||||
}; |
|
||||||
|
|
||||||
// 新增判分记录 |
|
||||||
const addRecord = async (data: Record<string, any>) => { |
|
||||||
const preIds = `1,${levelId},42,69,1032`; // 1,关卡id,角色(这个页面是风控经理策略) |
|
||||||
const rule = []; |
|
||||||
|
|
||||||
data.map((e) => { |
|
||||||
e.isChoose && rule.push(handleId(1052, '', '', `${preIds},${e.stRecordId},1052`, '')); |
|
||||||
e.riskGradeType && rule.push(handleId(1147, 299, e.riskGradeType, `${preIds},${e.stRecordId},1146,1147`, 1)); |
|
||||||
e.riskGrade && rule.push(handleId(1148, 300, e.riskGrade, `${preIds},${e.stRecordId},1146,1148`, 1)); |
|
||||||
}); |
|
||||||
|
|
||||||
await addOperation({ |
|
||||||
...getIds(), |
|
||||||
parentId: preIds, |
|
||||||
lcJudgmentRuleReq: rule, |
|
||||||
}); |
|
||||||
}; |
|
||||||
// 提交 |
|
||||||
const submit = async () => { |
|
||||||
let param = JSON.parse(JSON.stringify(form.value)); |
|
||||||
param.forEach((e) => { |
|
||||||
e.isChoose = +e.isChoose; |
|
||||||
}); |
|
||||||
|
|
||||||
const recordParam = JSON.parse(JSON.stringify(param)); |
|
||||||
param.forEach((e) => { |
|
||||||
delete e.recordChildren; |
|
||||||
}); |
|
||||||
await postLoanWarningSave({ postLoanWarningList: param }); |
|
||||||
addRecord(recordParam); |
|
||||||
getDetail(); |
|
||||||
ElMessage.success('提交成功!'); |
|
||||||
}; |
|
||||||
onMounted(() => { |
|
||||||
getDetail(); |
|
||||||
}); |
|
||||||
</script> |
|
||||||
|
|
||||||
<style lang="scss" scoped> |
|
||||||
@import url(../../../styles/form.scss); |
|
||||||
</style> |
|
@ -0,0 +1,169 @@ |
|||||||
|
<template> |
||||||
|
<!-- 贷后预警 --> |
||||||
|
<el-form label-width="90px" label-suffix=":" class="form" :disabled="disabled" v-loading="loading"> |
||||||
|
<el-form-item label="策略名称"> |
||||||
|
<div> |
||||||
|
<el-input class="w-[320px]" placeholder="请输入20以内字符" maxlength="20" clearable v-model="strategyName" /> |
||||||
|
<p v-if="bankIds.length" class="text-danger">不同步已关联产品,请修改策略名称。</p> |
||||||
|
</div> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="策略规则"> |
||||||
|
<el-table class="c-table" :data="form" :cell-style="{ background: '#fff' }" border> |
||||||
|
<el-table-column label="选用" width="130" align="center"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-radio-group v-model="row.isChoose"> |
||||||
|
<el-radio v-for="(item, i) in opt1" :key="i" :label="item.id">{{ item.name }}</el-radio> |
||||||
|
</el-radio-group> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column prop="recordName" label="风险类型" align="center"></el-table-column> |
||||||
|
<el-table-column label="风险等级" align="center"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<div class="flex"> |
||||||
|
<el-select v-if="row.recordChildren" class="mr-2" clearable v-model="row.riskGradeType"> |
||||||
|
<el-option v-for="item in row?.recordChildren[1].recordChildren[0].subject.itemList" :key="item" :label="item.options" :value="item.itemId" /> |
||||||
|
</el-select> |
||||||
|
|
||||||
|
<el-select v-if="row.recordChildren" clearable v-model="row.riskGrade"> |
||||||
|
<el-option v-for="item in row?.recordChildren[1].recordChildren[1].subject.itemList" :key="item" :label="item.options" :value="item.itemId" /> |
||||||
|
</el-select> |
||||||
|
</div> </template |
||||||
|
></el-table-column> |
||||||
|
</el-table> |
||||||
|
</el-form-item> |
||||||
|
<div v-if="!disabled" class="flex justify-end mt-3"> |
||||||
|
<div class="dia-btn cancel" @click="emit('close')">取消</div> |
||||||
|
<div class="dia-btn" @click="confirmSubmit">确定</div> |
||||||
|
</div> |
||||||
|
</el-form> |
||||||
|
|
||||||
|
<Confirm v-model="syncVisible" @submit="submit" /> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script setup lang="ts"> |
||||||
|
import { ref, defineAsyncComponent, onMounted, toRefs } from 'vue'; |
||||||
|
import { ElMessage } from 'element-plus'; |
||||||
|
import { postLoanWarningDetails, postLoanWarningSave, isTheStrategyRelatedToTheProduct } from '@/api/model'; |
||||||
|
import { getProcessInformationBasedOnRoles, addOperation } from '@/api/judgment'; |
||||||
|
import { handleId, getIds, opt1 } from '@/utils/common'; |
||||||
|
import Cookies from 'js-cookie'; |
||||||
|
import { getStat } from '@/store/useProduct'; |
||||||
|
|
||||||
|
const Confirm = defineAsyncComponent(() => import('@/components/StrategyConfirm.vue')); |
||||||
|
|
||||||
|
const props = defineProps({ |
||||||
|
disabled: { type: Boolean, default: false }, |
||||||
|
row: { type: Object }, |
||||||
|
}); |
||||||
|
|
||||||
|
const emit = defineEmits(['close']); |
||||||
|
const { strategyId, strategyName } = toRefs(props.row); |
||||||
|
const form = ref<Record<string, any>[]>([]); |
||||||
|
const info = ref<Record<string, any>[]>([]); |
||||||
|
const loading = ref<boolean>(false); |
||||||
|
const syncVisible = ref<boolean>(false); |
||||||
|
const bankIds = ref<Record<string, any>[]>([]); |
||||||
|
// 配置项 |
||||||
|
const getConfig = async () => { |
||||||
|
const { process } = await getProcessInformationBasedOnRoles(1032); |
||||||
|
const result = []; |
||||||
|
process.slice(1).map((e, i) => { |
||||||
|
const cur = info.value.length ? info.value[i] : {}; |
||||||
|
result.push({ |
||||||
|
...getIds(), |
||||||
|
recordName: e.name, |
||||||
|
recordChildren: e.recordChildren, |
||||||
|
riskGrade: +cur.riskGrade || '', |
||||||
|
riskGradeType: +cur.riskGradeType || '', |
||||||
|
isChoose: info.value.length ? cur.isChoose : '', |
||||||
|
id: cur.id || '', |
||||||
|
stRecordId: e.id, |
||||||
|
}); |
||||||
|
}); |
||||||
|
form.value = result; |
||||||
|
loading.value = false; |
||||||
|
}; |
||||||
|
// 详情 |
||||||
|
const getDetail = async () => { |
||||||
|
loading.value = true; |
||||||
|
try { |
||||||
|
if (strategyId.value) { |
||||||
|
const { data } = await postLoanWarningDetails({ |
||||||
|
strategyId: strategyId.value, |
||||||
|
}); |
||||||
|
info.value = data; |
||||||
|
} |
||||||
|
getConfig(); |
||||||
|
|
||||||
|
// 编辑需要判断是否有绑定产品 |
||||||
|
if (strategyId.value && !props.disabled) { |
||||||
|
const res = await isTheStrategyRelatedToTheProduct({ |
||||||
|
tacticsId: strategyId.value, |
||||||
|
strategyType: 17, |
||||||
|
}); |
||||||
|
if (res.isRelated) bankIds.value = res.bankIds; |
||||||
|
} |
||||||
|
} finally { |
||||||
|
} |
||||||
|
}; |
||||||
|
onMounted(getDetail); |
||||||
|
|
||||||
|
// 新增判分记录 |
||||||
|
const addRecord = async (data: Record<string, any>) => { |
||||||
|
const preIds = `1,${Cookies.get('sand-level')},42,69,1032`; // 1,关卡id,角色(这个页面是风控经理策略) |
||||||
|
const rule = [handleId(140, 28, strategyName.value, `${preIds},140`, 3)]; |
||||||
|
|
||||||
|
data.map((e) => { |
||||||
|
e.isChoose && rule.push(handleId(1052, 140, e.isChoose, `${preIds},${e.stRecordId},1052`, 1)); |
||||||
|
|
||||||
|
e.riskGradeType && rule.push(handleId(1147, 299, e.riskGradeType, `${preIds},${e.stRecordId},1146,1147`, 1)); |
||||||
|
e.riskGrade && rule.push(handleId(1148, 300, e.riskGrade, `${preIds},${e.stRecordId},1146,1148`, 1)); |
||||||
|
}); |
||||||
|
|
||||||
|
await addOperation({ |
||||||
|
...getIds(), |
||||||
|
parentId: preIds, |
||||||
|
lcJudgmentRuleReq: rule, |
||||||
|
}); |
||||||
|
loading.value = false; |
||||||
|
ElMessage.success('提交成功!'); |
||||||
|
syncVisible.value = false; |
||||||
|
emit('close', 1); |
||||||
|
}; |
||||||
|
// 提交 |
||||||
|
const submit = async (synchronizeUpdate?: number) => { |
||||||
|
loading.value = true; |
||||||
|
try { |
||||||
|
const param = JSON.parse(JSON.stringify(form.value)); |
||||||
|
param.forEach((e) => { |
||||||
|
delete e.recordChildren; |
||||||
|
}); |
||||||
|
await postLoanWarningSave({ |
||||||
|
...getIds(), |
||||||
|
strategyId: strategyId.value, |
||||||
|
strategyName: strategyName.value, |
||||||
|
synchronizeUpdate, |
||||||
|
postLoanWarningList: param, |
||||||
|
bankIds: bankIds.value, |
||||||
|
}); |
||||||
|
getStat(295); |
||||||
|
addRecord(param); |
||||||
|
} catch (e) { |
||||||
|
loading.value = false; |
||||||
|
} |
||||||
|
}; |
||||||
|
const confirmSubmit = async () => { |
||||||
|
if (!strategyName.value) return ElMessage.error('请输入策略名称!'); |
||||||
|
|
||||||
|
// 编辑需要判断是否有绑定产品 |
||||||
|
if (bankIds.value.length) { |
||||||
|
syncVisible.value = true; |
||||||
|
} else { |
||||||
|
submit(); |
||||||
|
} |
||||||
|
}; |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
@import url(../../../../styles/form.scss); |
||||||
|
</style> |
@ -0,0 +1,157 @@ |
|||||||
|
<template> |
||||||
|
<div class="block"> |
||||||
|
<div class="flex justify-between items-center mb-5"> |
||||||
|
<search v-model="keyWord" @change="initList"></search> |
||||||
|
<div class="filter"> |
||||||
|
<el-popconfirm title="确定删除选中策略吗?" :disabled="!multipleSelection.length" @confirm.stop="delAll"> |
||||||
|
<template #reference> |
||||||
|
<div :class="['add-btn mr-2', { 'cursor-not-allowed': !multipleSelection.length }]"> |
||||||
|
<el-icon :size="24" color="#fff"> |
||||||
|
<Delete /> |
||||||
|
</el-icon> |
||||||
|
批量删除 |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
</el-popconfirm> |
||||||
|
|
||||||
|
<div class="add-btn" @click="toAdd"> |
||||||
|
<img src="@/assets/images/plus.png" alt="" class="icon" /> |
||||||
|
新增 |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<el-table ref="table" v-loading="loading" :data="list" @selection-change="handleSelectionChange"> |
||||||
|
<el-table-column type="selection" width="55" :selectable="handleDisable" /> |
||||||
|
<el-table-column label="序号" type="index" width="60" align="center" /> |
||||||
|
<el-table-column prop="strategyName" label="贷后预警策略名称" min-width="180" /> |
||||||
|
<el-table-column prop="createTime" label="新增日期" min-width="140" /> |
||||||
|
<el-table-column label="操作" width="140"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-button type="primary" link @click="toDetail(row, true)" size="small">查看</el-button> |
||||||
|
<template v-if="!row.builtIn"> |
||||||
|
<el-button type="primary" link @click="toDetail(row)" size="small">编辑</el-button> |
||||||
|
<el-popconfirm title="确定删除这条策略吗?" @confirm.stop="handleDelete([row.strategyId])"> |
||||||
|
<template #reference> |
||||||
|
<el-button type="primary" link size="small">删除</el-button> |
||||||
|
</template> |
||||||
|
</el-popconfirm> |
||||||
|
</template> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
</el-table> |
||||||
|
<el-pagination |
||||||
|
v-model:currentPage="currentPage" |
||||||
|
v-model:pageSize="pageSize" |
||||||
|
:total="total" |
||||||
|
:page-sizes="pageSizes" |
||||||
|
:layout="pageLayout" |
||||||
|
@size-change="getList()" |
||||||
|
@current-change="getList()" |
||||||
|
small |
||||||
|
background |
||||||
|
class="px-3 py-2 justify-end" |
||||||
|
></el-pagination> |
||||||
|
|
||||||
|
<el-drawer v-model="visible" :title="(isDetail ? '查看' : curRow.strategyId ? '编辑' : '新增') + '贷后预警策略'" size="100%" :z-index="10" class="model-drawer"> |
||||||
|
<Detail v-model:row="curRow" :disabled="isDetail" :key="i" @close="closeDrawer" /> |
||||||
|
</el-drawer> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script setup lang="ts"> |
||||||
|
import { onMounted, ref, watch, defineAsyncComponent } from 'vue'; |
||||||
|
import { ElMessage, ElMessageBox } from 'element-plus'; |
||||||
|
import { Delete } from '@element-plus/icons-vue'; |
||||||
|
import { pageSizes, pageLayout } from '@/utils/common'; |
||||||
|
import { postLoanWarning, postLoanWarningDel } from '@/api/model'; |
||||||
|
import Search from '@/components/Search.vue'; |
||||||
|
|
||||||
|
const Detail = defineAsyncComponent(() => import('./Detail.vue')); |
||||||
|
|
||||||
|
const keyWord = ref<string>(); |
||||||
|
const currentPage = ref<number>(1); |
||||||
|
const pageSize = ref<number>(10); |
||||||
|
const total = ref<number>(0); |
||||||
|
const table = ref<any>(); |
||||||
|
|
||||||
|
const multipleSelection = ref<Record<string, any>[]>([]); |
||||||
|
const list = ref<Record<string, any>[]>([]); |
||||||
|
const loading = ref<boolean>(false); |
||||||
|
const visible = ref<boolean>(false); |
||||||
|
const curRow = ref<Record<string, any>>({ |
||||||
|
strategyId: '', |
||||||
|
strategyName: '', |
||||||
|
}); |
||||||
|
const isDetail = ref<boolean>(false); |
||||||
|
const i = ref<number>(0); |
||||||
|
// 列表 |
||||||
|
const getList = async () => { |
||||||
|
loading.value = true; |
||||||
|
try { |
||||||
|
const { page } = await postLoanWarning({ pageNum: currentPage.value, pageSize: pageSize.value, keyWord: keyWord.value }); |
||||||
|
list.value = page.records; |
||||||
|
total.value = page.total; |
||||||
|
} finally { |
||||||
|
loading.value = false; |
||||||
|
} |
||||||
|
}; |
||||||
|
// 重置列表 |
||||||
|
const initList = async () => { |
||||||
|
currentPage.value = 1; |
||||||
|
getList(); |
||||||
|
}; |
||||||
|
watch(keyWord, initList); |
||||||
|
onMounted(getList); |
||||||
|
|
||||||
|
// 多选框条件 |
||||||
|
const handleDisable = (row: Record<string, any>) => { |
||||||
|
// 内置数据禁用 |
||||||
|
if (row.builtIn) return false; |
||||||
|
return true; |
||||||
|
}; |
||||||
|
|
||||||
|
// 多选 |
||||||
|
const handleSelectionChange = (val: Record<string, any>[]) => { |
||||||
|
multipleSelection.value = val; |
||||||
|
}; |
||||||
|
const handleDelete = async (ids: number[]) => { |
||||||
|
try { |
||||||
|
const res = await postLoanWarningDel({ ids }); |
||||||
|
// 删除失败则弹框 |
||||||
|
if (res.tip) { |
||||||
|
ElMessageBox.alert(res.message, '提示', { |
||||||
|
confirmButtonText: '确定', |
||||||
|
}); |
||||||
|
} else { |
||||||
|
getList(); |
||||||
|
ElMessage.success('删除成功!'); |
||||||
|
} |
||||||
|
} catch (e) {} |
||||||
|
}; |
||||||
|
// 批量删除 |
||||||
|
const delAll = async () => { |
||||||
|
handleDelete(multipleSelection.value.map((e) => e.strategyId)); |
||||||
|
}; |
||||||
|
// 新增 |
||||||
|
const toAdd = () => { |
||||||
|
i.value++; |
||||||
|
isDetail.value = false; |
||||||
|
curRow.value = { |
||||||
|
strategyId: '', |
||||||
|
strategyName: '', |
||||||
|
}; |
||||||
|
visible.value = true; |
||||||
|
}; |
||||||
|
// 产品详情 |
||||||
|
const toDetail = async (row: Record<string, any>, detail = false) => { |
||||||
|
i.value++; |
||||||
|
isDetail.value = detail; |
||||||
|
curRow.value = row; |
||||||
|
visible.value = true; |
||||||
|
}; |
||||||
|
// 关闭详情弹框 |
||||||
|
const closeDrawer = (refresh?: number) => { |
||||||
|
visible.value = false; |
||||||
|
refresh && initList(); |
||||||
|
}; |
||||||
|
</script> |
@ -1,195 +0,0 @@ |
|||||||
<template> |
|
||||||
<!-- 贷后催收 --> |
|
||||||
<el-table class="c-table" |
|
||||||
:data="form" |
|
||||||
:span-method="span" |
|
||||||
:cell-style="{background:'#fff'}" |
|
||||||
border> |
|
||||||
<el-table-column prop="recordName" |
|
||||||
label="逾期时长" |
|
||||||
width="150" |
|
||||||
align="center"> |
|
||||||
</el-table-column> |
|
||||||
<el-table-column label="选择催收方式" |
|
||||||
width="440" |
|
||||||
align="center"> |
|
||||||
<template #default="{ row }"> |
|
||||||
<el-checkbox v-model="row.shortMessageCollection">短信催收</el-checkbox> |
|
||||||
<el-checkbox v-model="row.appCollection">APP催收</el-checkbox> |
|
||||||
<el-checkbox v-model="row.automaticOutboundCall">自动外呼</el-checkbox> |
|
||||||
<el-checkbox v-model="row.manualCollection">人工催收</el-checkbox> |
|
||||||
</template> |
|
||||||
</el-table-column> |
|
||||||
<el-table-column label="短信/APP/自动外呼 话术" |
|
||||||
min-width="310" |
|
||||||
align="center"> |
|
||||||
<template #default="{ row }"> |
|
||||||
<p v-if="row.recordChildren && row.verbalTrick">{{ row?.recordChildren[0]?.subject?.itemList.find(e => e.itemId === row.verbalTrick)?.options }}</p> |
|
||||||
<el-button type="primary" |
|
||||||
:icon="Plus" |
|
||||||
@click="showDia(row)">选择</el-button> |
|
||||||
|
|
||||||
<!-- <el-select v-if="row.recordChildren" |
|
||||||
class="w-full type-select" |
|
||||||
v-model="row.verbalTrick"> |
|
||||||
<el-option v-for="item in row?.recordChildren[0]?.subject?.itemList" |
|
||||||
:key="item" |
|
||||||
:label="item.options" |
|
||||||
:value="item.itemId"> |
|
||||||
<span>{{ item.options }}</span> |
|
||||||
</el-option> |
|
||||||
</el-select> --> |
|
||||||
</template></el-table-column> |
|
||||||
</el-table> |
|
||||||
|
|
||||||
<div class="flex justify-end"> |
|
||||||
<div class="submit" |
|
||||||
@click="submit">确认完成配置</div> |
|
||||||
</div> |
|
||||||
|
|
||||||
<el-dialog v-model="selectDia" |
|
||||||
custom-class="select-dia"> |
|
||||||
<div class="selects" |
|
||||||
v-if="curRow.recordChildren"> |
|
||||||
<div v-for="item in |
|
||||||
curRow?.recordChildren[0]?.subject?.itemList" |
|
||||||
:key="item" |
|
||||||
class="line" |
|
||||||
@click="curRow.verbalTrick = item.itemId"> |
|
||||||
<el-radio v-model="curRow.verbalTrick" |
|
||||||
:label="item.itemId"></el-radio> |
|
||||||
<span>{{ item.options }}</span> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
<template #footer> |
|
||||||
<span class="dialog-footer"> |
|
||||||
<el-button type="primary" |
|
||||||
@click="selectDia = false">关闭</el-button> |
|
||||||
</span> |
|
||||||
</template> |
|
||||||
</el-dialog> |
|
||||||
</template> |
|
||||||
|
|
||||||
<script setup lang="ts"> |
|
||||||
import { ref, onMounted } from 'vue'; |
|
||||||
import { Plus } from '@element-plus/icons-vue'; |
|
||||||
import { ElMessage } from 'element-plus'; |
|
||||||
import { collectionAfterLoanDetails, collectionAfterLoanSave } from '@/api/model'; |
|
||||||
import { getProcessInformationBasedOnRoles, addOperation } from '@/api/judgment'; |
|
||||||
import { handleId, getIds } from '@/utils/common'; |
|
||||||
import Cookies from 'js-cookie'; |
|
||||||
|
|
||||||
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 curRow = ref<Record<string, any>>({}); |
|
||||||
const selectDia = ref<boolean>(false); |
|
||||||
// 配置项 |
|
||||||
const getConfig = async () => { |
|
||||||
const { process } = await getProcessInformationBasedOnRoles(1033); |
|
||||||
const result = []; |
|
||||||
process[0].recordChildren.map((e, i) => { |
|
||||||
const cur = info.value.length ? info.value[i] : {}; |
|
||||||
result.push({ |
|
||||||
...getIds(), |
|
||||||
recordName: e.name, |
|
||||||
recordChildren: e.recordChildren, |
|
||||||
appCollection: info.value.length ? !!cur.appCollection : false, |
|
||||||
automaticOutboundCall: info.value.length ? !!cur.automaticOutboundCall : false, |
|
||||||
shortMessageCollection: info.value.length ? !!cur.shortMessageCollection : false, |
|
||||||
manualCollection: info.value.length ? !!cur.manualCollection : false, |
|
||||||
verbalTrick: cur.verbalTrick ? +cur.verbalTrick : '', |
|
||||||
id: cur.id || '', |
|
||||||
stRecordId: e.id, |
|
||||||
}); |
|
||||||
}); |
|
||||||
form.value = result; |
|
||||||
console.log('🚀 ~ getConfig ~ result:', result); |
|
||||||
}; |
|
||||||
// 详情 |
|
||||||
const getDetail = async () => { |
|
||||||
try { |
|
||||||
const { data } = await collectionAfterLoanDetails(); |
|
||||||
info.value = data; |
|
||||||
getConfig(); |
|
||||||
} finally { |
|
||||||
} |
|
||||||
}; |
|
||||||
// 弹框 |
|
||||||
const showDia = (row: Record<string, any>) => { |
|
||||||
selectDia.value = true; |
|
||||||
curRow.value = row; |
|
||||||
}; |
|
||||||
// 新增判分记录 |
|
||||||
const addRecord = async (data: Record<string, any>) => { |
|
||||||
const preIds = `1,${levelId},42,69,1033,1149`; // 1,关卡id,角色(这个页面是风控经理策略) |
|
||||||
const rule = []; |
|
||||||
|
|
||||||
data.map((e) => { |
|
||||||
e.recordChildren.forEach((n, i) => { |
|
||||||
if (i) { |
|
||||||
const ids = []; |
|
||||||
e.shortMessageCollection && ids.push(774); |
|
||||||
e.appCollection && ids.push(775); |
|
||||||
e.automaticOutboundCall && ids.push(776); |
|
||||||
e.manualCollection && ids.push(777); |
|
||||||
ids.length && rule.push(handleId(n.id, n.subjectId, ids.join(), `${preIds},${e.stRecordId},${n.id}`, 1)); |
|
||||||
} else { |
|
||||||
e.verbalTrick && rule.push(handleId(n.id, n.subjectId, e.verbalTrick, `${preIds},${e.stRecordId},${n.id}`, 1)); |
|
||||||
} |
|
||||||
}); |
|
||||||
}); |
|
||||||
|
|
||||||
await addOperation({ |
|
||||||
...getIds(), |
|
||||||
parentId: preIds, |
|
||||||
lcJudgmentRuleReq: rule, |
|
||||||
}); |
|
||||||
}; |
|
||||||
// 提交 |
|
||||||
const submit = async () => { |
|
||||||
let param = JSON.parse(JSON.stringify(form.value)); |
|
||||||
param.map((e) => { |
|
||||||
e.appCollection = +e.appCollection; |
|
||||||
e.automaticOutboundCall = +e.automaticOutboundCall; |
|
||||||
e.shortMessageCollection = +e.shortMessageCollection; |
|
||||||
e.manualCollection = +e.manualCollection; |
|
||||||
}); |
|
||||||
|
|
||||||
const recordParam = JSON.parse(JSON.stringify(param)); |
|
||||||
param.map((e) => { |
|
||||||
delete e.recordChildren; |
|
||||||
}); |
|
||||||
await collectionAfterLoanSave({ collectionAfterLoanList: param }); |
|
||||||
addRecord(recordParam); |
|
||||||
getDetail(); |
|
||||||
ElMessage.success('提交成功!'); |
|
||||||
}; |
|
||||||
onMounted(() => { |
|
||||||
getDetail(); |
|
||||||
}); |
|
||||||
</script> |
|
||||||
|
|
||||||
<style lang="scss" scoped> |
|
||||||
@import url(../../../styles/form.scss); |
|
||||||
.select-dia { |
|
||||||
.selects { |
|
||||||
margin-top: 20px; |
|
||||||
} |
|
||||||
.line { |
|
||||||
display: flex; |
|
||||||
align-items: flex-start; |
|
||||||
margin-bottom: 10px; |
|
||||||
cursor: pointer; |
|
||||||
} |
|
||||||
background-color: #fff; |
|
||||||
.el-radio { |
|
||||||
height: 20px; |
|
||||||
margin-right: 10px; |
|
||||||
:deep(.el-radio__label) { |
|
||||||
display: none; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
</style> |
|
@ -0,0 +1,229 @@ |
|||||||
|
<template> |
||||||
|
<!-- 贷后催收 --> |
||||||
|
<el-form label-width="90px" label-suffix=":" class="form" :disabled="disabled"> |
||||||
|
<el-form-item label="策略名称"> |
||||||
|
<div> |
||||||
|
<el-input class="w-[320px]" placeholder="请输入20以内字符" maxlength="20" clearable v-model="strategyName" /> |
||||||
|
<p v-if="bankIds.length" class="text-danger">不同步已关联产品,请修改策略名称。</p> |
||||||
|
</div> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="策略规则"> |
||||||
|
<el-table class="c-table" :data="form" :span-method="span" :cell-style="{ background: '#fff' }" border> |
||||||
|
<el-table-column prop="name" label="选用" width="130" align="center"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-radio-group v-model="row.isChoose"> |
||||||
|
<el-radio v-for="(item, i) in opt1" :key="i" :label="item.id">{{ item.name }}</el-radio> |
||||||
|
</el-radio-group> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column prop="recordName" label="逾期时长" width="150" align="center"> </el-table-column> |
||||||
|
<el-table-column label="选择催收方式" width="440" align="center"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-checkbox v-model="row.shortMessageCollection">短信催收</el-checkbox> |
||||||
|
<el-checkbox v-model="row.appCollection">APP催收</el-checkbox> |
||||||
|
<el-checkbox v-model="row.automaticOutboundCall">自动外呼</el-checkbox> |
||||||
|
<el-checkbox v-model="row.manualCollection">人工催收</el-checkbox> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column label="短信/APP/自动外呼 话术" min-width="310" align="center"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<p v-if="row.recordChildren && row.verbalTrick">{{ row?.recordChildren[1]?.subject?.itemList.find((e) => e.itemId === row.verbalTrick)?.options }}</p> |
||||||
|
<el-button type="primary" :icon="Plus" @click="showDia(row)">选择</el-button> |
||||||
|
</template></el-table-column |
||||||
|
> |
||||||
|
</el-table> |
||||||
|
</el-form-item> |
||||||
|
</el-form> |
||||||
|
<div v-if="!disabled" class="flex justify-end mt-3"> |
||||||
|
<div class="dia-btn cancel" @click="emit('close')">取消</div> |
||||||
|
<div class="dia-btn" @click="confirmSubmit">确定</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<Confirm v-model="syncVisible" @submit="submit" /> |
||||||
|
|
||||||
|
<el-dialog v-model="selectDia" custom-class="select-dia"> |
||||||
|
<div class="selects" v-if="curRow.recordChildren"> |
||||||
|
<div v-for="item in curRow?.recordChildren[1]?.subject?.itemList" :key="item" class="line" @click="curRow.verbalTrick = item.itemId"> |
||||||
|
<el-radio v-model="curRow.verbalTrick" :label="item.itemId"></el-radio> |
||||||
|
<span>{{ item.options }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<template #footer> |
||||||
|
<span class="dialog-footer"> |
||||||
|
<el-button type="primary" @click="selectDia = false">关闭</el-button> |
||||||
|
</span> |
||||||
|
</template> |
||||||
|
</el-dialog> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script setup lang="ts"> |
||||||
|
import { ref, defineAsyncComponent, onMounted, toRefs } from 'vue'; |
||||||
|
import { Plus } from '@element-plus/icons-vue'; |
||||||
|
import { ElMessage } from 'element-plus'; |
||||||
|
import { collectionAfterLoanDetails, collectionAfterLoanSave, isTheStrategyRelatedToTheProduct } from '@/api/model'; |
||||||
|
import { getProcessInformationBasedOnRoles, addOperation } from '@/api/judgment'; |
||||||
|
import { handleId, getIds, opt1 } from '@/utils/common'; |
||||||
|
import Cookies from 'js-cookie'; |
||||||
|
import { getStat } from '@/store/useProduct'; |
||||||
|
|
||||||
|
const Confirm = defineAsyncComponent(() => import('@/components/StrategyConfirm.vue')); |
||||||
|
|
||||||
|
const props = defineProps({ |
||||||
|
disabled: { type: Boolean, default: false }, |
||||||
|
row: { type: Object }, |
||||||
|
}); |
||||||
|
|
||||||
|
const emit = defineEmits(['close']); |
||||||
|
const { strategyId, strategyName } = toRefs(props.row); |
||||||
|
const form = ref<Record<string, any>[]>([]); |
||||||
|
const info = ref<Record<string, any>[]>([]); |
||||||
|
const curRow = ref<Record<string, any>>({}); |
||||||
|
const selectDia = ref<boolean>(false); |
||||||
|
const syncVisible = ref<boolean>(false); |
||||||
|
const bankIds = ref<Record<string, any>[]>([]); |
||||||
|
// 配置项 |
||||||
|
const getConfig = async () => { |
||||||
|
const { process } = await getProcessInformationBasedOnRoles(1033); |
||||||
|
const result = []; |
||||||
|
process[1].recordChildren.map((e, i) => { |
||||||
|
const cur = info.value.length ? info.value[i] : {}; |
||||||
|
result.push({ |
||||||
|
...getIds(), |
||||||
|
recordName: e.name, |
||||||
|
recordChildren: e.recordChildren, |
||||||
|
isChoose: info.value.length ? cur.isChoose : '', |
||||||
|
appCollection: info.value.length ? !!cur.appCollection : false, |
||||||
|
automaticOutboundCall: info.value.length ? !!cur.automaticOutboundCall : false, |
||||||
|
shortMessageCollection: info.value.length ? !!cur.shortMessageCollection : false, |
||||||
|
manualCollection: info.value.length ? !!cur.manualCollection : false, |
||||||
|
verbalTrick: cur.verbalTrick ? +cur.verbalTrick : '', |
||||||
|
id: cur.id || '', |
||||||
|
stRecordId: e.id, |
||||||
|
}); |
||||||
|
}); |
||||||
|
form.value = result; |
||||||
|
}; |
||||||
|
// 详情 |
||||||
|
const getDetail = async () => { |
||||||
|
try { |
||||||
|
if (strategyId.value) { |
||||||
|
const { data } = await collectionAfterLoanDetails({ |
||||||
|
strategyId: strategyId.value, |
||||||
|
}); |
||||||
|
info.value = data; |
||||||
|
} |
||||||
|
getConfig(); |
||||||
|
|
||||||
|
// 编辑需要判断是否有绑定产品 |
||||||
|
if (strategyId.value && !props.disabled) { |
||||||
|
const res = await isTheStrategyRelatedToTheProduct({ |
||||||
|
tacticsId: strategyId.value, |
||||||
|
strategyType: 18, |
||||||
|
}); |
||||||
|
if (res.isRelated) bankIds.value = res.bankIds; |
||||||
|
} |
||||||
|
} finally { |
||||||
|
} |
||||||
|
}; |
||||||
|
onMounted(getDetail); |
||||||
|
// 弹框 |
||||||
|
const showDia = (row: Record<string, any>) => { |
||||||
|
selectDia.value = true; |
||||||
|
curRow.value = row; |
||||||
|
}; |
||||||
|
// 新增判分记录 |
||||||
|
const addRecord = async (data: Record<string, any>) => { |
||||||
|
let preIds = `1,${Cookies.get('sand-level')},42,69,1033`; // 1,关卡id,角色(这个页面是风控经理策略) |
||||||
|
const rule = [handleId(140, 28, strategyName.value, `${preIds},140`, 3)]; |
||||||
|
|
||||||
|
preIds += ',1149'; |
||||||
|
data.map((e) => { |
||||||
|
e.recordChildren.forEach((n, i) => { |
||||||
|
if (i === 2) { |
||||||
|
// 催收方式 |
||||||
|
const ids = []; |
||||||
|
e.shortMessageCollection && ids.push(774); |
||||||
|
e.appCollection && ids.push(775); |
||||||
|
e.automaticOutboundCall && ids.push(776); |
||||||
|
e.manualCollection && ids.push(777); |
||||||
|
ids.length && rule.push(handleId(n.id, n.subjectId, ids.join(), `${preIds},${e.stRecordId},${n.id}`, 1)); |
||||||
|
} else if (i === 1) { |
||||||
|
// 话术 |
||||||
|
e.verbalTrick && rule.push(handleId(n.id, n.subjectId, e.verbalTrick, `${preIds},${e.stRecordId},${n.id}`, 1)); |
||||||
|
} else { |
||||||
|
// 选用 |
||||||
|
e.isChoose && rule.push(handleId(1052, 140, e.isChoose, `${preIds},${e.stRecordId},1052`, 1)); |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
await addOperation({ |
||||||
|
...getIds(), |
||||||
|
parentId: preIds, |
||||||
|
lcJudgmentRuleReq: rule, |
||||||
|
}); |
||||||
|
ElMessage.success('提交成功!'); |
||||||
|
syncVisible.value = false; |
||||||
|
emit('close', 1); |
||||||
|
}; |
||||||
|
// 提交 |
||||||
|
const submit = async (synchronizeUpdate?: number) => { |
||||||
|
try { |
||||||
|
const param = JSON.parse(JSON.stringify(form.value)); |
||||||
|
param.map((e) => { |
||||||
|
e.appCollection = +e.appCollection; |
||||||
|
e.automaticOutboundCall = +e.automaticOutboundCall; |
||||||
|
e.shortMessageCollection = +e.shortMessageCollection; |
||||||
|
e.manualCollection = +e.manualCollection; |
||||||
|
}); |
||||||
|
|
||||||
|
const recordParam = JSON.parse(JSON.stringify(param)); |
||||||
|
param.map((e) => { |
||||||
|
delete e.recordChildren; |
||||||
|
}); |
||||||
|
await collectionAfterLoanSave({ |
||||||
|
...getIds(), |
||||||
|
strategyId: strategyId.value, |
||||||
|
strategyName: strategyName.value, |
||||||
|
synchronizeUpdate, |
||||||
|
collectionAfterLoanList: param, |
||||||
|
bankIds: bankIds.value, |
||||||
|
}); |
||||||
|
getStat(295); |
||||||
|
addRecord(recordParam); |
||||||
|
} catch (e) {} |
||||||
|
}; |
||||||
|
const confirmSubmit = async () => { |
||||||
|
if (!strategyName.value) return ElMessage.error('请输入策略名称!'); |
||||||
|
|
||||||
|
// 编辑需要判断是否有绑定产品 |
||||||
|
if (bankIds.value.length) { |
||||||
|
syncVisible.value = true; |
||||||
|
} else { |
||||||
|
submit(); |
||||||
|
} |
||||||
|
}; |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
@import url(../../../../styles/form.scss); |
||||||
|
.select-dia { |
||||||
|
.selects { |
||||||
|
margin-top: 20px; |
||||||
|
} |
||||||
|
.line { |
||||||
|
display: flex; |
||||||
|
align-items: flex-start; |
||||||
|
margin-bottom: 10px; |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
background-color: #fff; |
||||||
|
.el-radio { |
||||||
|
height: 20px; |
||||||
|
margin-right: 10px; |
||||||
|
:deep(.el-radio__label) { |
||||||
|
display: none; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</style> |
@ -0,0 +1,157 @@ |
|||||||
|
<template> |
||||||
|
<div class="block"> |
||||||
|
<div class="flex justify-between items-center mb-5"> |
||||||
|
<search v-model="keyWord" @change="initList"></search> |
||||||
|
<div class="filter"> |
||||||
|
<el-popconfirm title="确定删除选中策略吗?" :disabled="!multipleSelection.length" @confirm.stop="delAll"> |
||||||
|
<template #reference> |
||||||
|
<div :class="['add-btn mr-2', { 'cursor-not-allowed': !multipleSelection.length }]"> |
||||||
|
<el-icon :size="24" color="#fff"> |
||||||
|
<Delete /> |
||||||
|
</el-icon> |
||||||
|
批量删除 |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
</el-popconfirm> |
||||||
|
|
||||||
|
<div class="add-btn" @click="toAdd"> |
||||||
|
<img src="@/assets/images/plus.png" alt="" class="icon" /> |
||||||
|
新增 |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<el-table ref="table" v-loading="loading" :data="list" @selection-change="handleSelectionChange"> |
||||||
|
<el-table-column type="selection" width="55" :selectable="handleDisable" /> |
||||||
|
<el-table-column label="序号" type="index" width="60" align="center" /> |
||||||
|
<el-table-column prop="strategyName" label="贷后催收策略名称" min-width="180" /> |
||||||
|
<el-table-column prop="createTime" label="新增日期" min-width="140" /> |
||||||
|
<el-table-column label="操作" width="140"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-button type="primary" link @click="toDetail(row, true)" size="small">查看</el-button> |
||||||
|
<template v-if="!row.builtIn"> |
||||||
|
<el-button type="primary" link @click="toDetail(row)" size="small">编辑</el-button> |
||||||
|
<el-popconfirm title="确定删除这条策略吗?" @confirm.stop="handleDelete([row.strategyId])"> |
||||||
|
<template #reference> |
||||||
|
<el-button type="primary" link size="small">删除</el-button> |
||||||
|
</template> |
||||||
|
</el-popconfirm> |
||||||
|
</template> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
</el-table> |
||||||
|
<el-pagination |
||||||
|
v-model:currentPage="currentPage" |
||||||
|
v-model:pageSize="pageSize" |
||||||
|
:total="total" |
||||||
|
:page-sizes="pageSizes" |
||||||
|
:layout="pageLayout" |
||||||
|
@size-change="getList()" |
||||||
|
@current-change="getList()" |
||||||
|
small |
||||||
|
background |
||||||
|
class="px-3 py-2 justify-end" |
||||||
|
></el-pagination> |
||||||
|
|
||||||
|
<el-drawer v-model="visible" :title="(isDetail ? '查看' : curRow.strategyId ? '编辑' : '新增') + '贷后催收策略'" size="100%" :z-index="10" class="model-drawer"> |
||||||
|
<Detail v-model:row="curRow" :disabled="isDetail" :key="i" @close="closeDrawer" /> |
||||||
|
</el-drawer> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script setup lang="ts"> |
||||||
|
import { onMounted, ref, watch, defineAsyncComponent } from 'vue'; |
||||||
|
import { ElMessage, ElMessageBox } from 'element-plus'; |
||||||
|
import { Delete } from '@element-plus/icons-vue'; |
||||||
|
import { pageSizes, pageLayout } from '@/utils/common'; |
||||||
|
import { collectionAfterLoan, collectionAfterLoanDel } from '@/api/model'; |
||||||
|
import Search from '@/components/Search.vue'; |
||||||
|
|
||||||
|
const Detail = defineAsyncComponent(() => import('./Detail.vue')); |
||||||
|
|
||||||
|
const keyWord = ref<string>(); |
||||||
|
const currentPage = ref<number>(1); |
||||||
|
const pageSize = ref<number>(10); |
||||||
|
const total = ref<number>(0); |
||||||
|
const table = ref<any>(); |
||||||
|
|
||||||
|
const multipleSelection = ref<Record<string, any>[]>([]); |
||||||
|
const list = ref<Record<string, any>[]>([]); |
||||||
|
const loading = ref<boolean>(false); |
||||||
|
const visible = ref<boolean>(false); |
||||||
|
const curRow = ref<Record<string, any>>({ |
||||||
|
strategyId: '', |
||||||
|
strategyName: '', |
||||||
|
}); |
||||||
|
const isDetail = ref<boolean>(false); |
||||||
|
const i = ref<number>(0); |
||||||
|
// 列表 |
||||||
|
const getList = async () => { |
||||||
|
loading.value = true; |
||||||
|
try { |
||||||
|
const { page } = await collectionAfterLoan({ pageNum: currentPage.value, pageSize: pageSize.value, keyWord: keyWord.value }); |
||||||
|
list.value = page.records; |
||||||
|
total.value = page.total; |
||||||
|
} finally { |
||||||
|
loading.value = false; |
||||||
|
} |
||||||
|
}; |
||||||
|
// 重置列表 |
||||||
|
const initList = async () => { |
||||||
|
currentPage.value = 1; |
||||||
|
getList(); |
||||||
|
}; |
||||||
|
watch(keyWord, initList); |
||||||
|
onMounted(getList); |
||||||
|
|
||||||
|
// 多选框条件 |
||||||
|
const handleDisable = (row: Record<string, any>) => { |
||||||
|
// 内置数据禁用 |
||||||
|
if (row.builtIn) return false; |
||||||
|
return true; |
||||||
|
}; |
||||||
|
|
||||||
|
// 多选 |
||||||
|
const handleSelectionChange = (val: Record<string, any>[]) => { |
||||||
|
multipleSelection.value = val; |
||||||
|
}; |
||||||
|
const handleDelete = async (ids: number[]) => { |
||||||
|
try { |
||||||
|
const res = await collectionAfterLoanDel({ ids }); |
||||||
|
// 删除失败则弹框 |
||||||
|
if (res.tip) { |
||||||
|
ElMessageBox.alert(res.message, '提示', { |
||||||
|
confirmButtonText: '确定', |
||||||
|
}); |
||||||
|
} else { |
||||||
|
getList(); |
||||||
|
ElMessage.success('删除成功!'); |
||||||
|
} |
||||||
|
} catch (e) {} |
||||||
|
}; |
||||||
|
// 批量删除 |
||||||
|
const delAll = async () => { |
||||||
|
handleDelete(multipleSelection.value.map((e) => e.strategyId)); |
||||||
|
}; |
||||||
|
// 新增 |
||||||
|
const toAdd = () => { |
||||||
|
i.value++; |
||||||
|
isDetail.value = false; |
||||||
|
curRow.value = { |
||||||
|
strategyId: '', |
||||||
|
strategyName: '', |
||||||
|
}; |
||||||
|
visible.value = true; |
||||||
|
}; |
||||||
|
// 产品详情 |
||||||
|
const toDetail = async (row: Record<string, any>, detail = false) => { |
||||||
|
i.value++; |
||||||
|
isDetail.value = detail; |
||||||
|
curRow.value = row; |
||||||
|
visible.value = true; |
||||||
|
}; |
||||||
|
// 关闭详情弹框 |
||||||
|
const closeDrawer = (refresh?: number) => { |
||||||
|
visible.value = false; |
||||||
|
refresh && initList(); |
||||||
|
}; |
||||||
|
</script> |
@ -1,64 +1,71 @@ |
|||||||
<template> |
<template> |
||||||
<div class="block card-list flex py-0"> |
<div v-if="list.length"> |
||||||
<div class="left"> |
<div class="menu-card"> |
||||||
<ul class="products"> |
<el-menu class="left" :default-active="curMenu" @select="handleSelect"> |
||||||
<li v-for="(item, i) in list" |
<el-menu-item v-for="(item, i) in list" :key="i" :index="String(item.id)">{{ item.name }}</el-menu-item> |
||||||
:key="i" |
</el-menu> |
||||||
:class="{ active: item.id === id }" |
<div class="right"> |
||||||
@click="switchProduct(item.id)"> |
<component v-if="loadedComponents[activeComponent]" :is="loadedComponents[activeComponent]" /> |
||||||
<h6>{{ item.name }}</h6> |
</div> |
||||||
<p class="meta">{{ item.remark }}</p> |
|
||||||
</li> |
|
||||||
</ul> |
|
||||||
</div> |
|
||||||
<div class="right"> |
|
||||||
<Com1 v-if="id == 1029" /> |
|
||||||
<Com2 v-else-if="id == 1030" /> |
|
||||||
<Com3 v-else-if="id == 1031" /> |
|
||||||
<Com4 v-else-if="id == 1032" /> |
|
||||||
<Com5 v-else-if="id == 1033" /> |
|
||||||
</div> |
</div> |
||||||
</div> |
</div> |
||||||
</template> |
</template> |
||||||
|
|
||||||
<script setup lang="ts"> |
<script setup lang="ts"> |
||||||
import { computed, onMounted, ref } from 'vue'; |
import { computed, onMounted, ref, defineAsyncComponent, markRaw } from 'vue'; |
||||||
import { getProcessInformationBasedOnRoles } from '@/api/judgment'; |
import { getProcessInformationBasedOnRoles } from '@/api/judgment'; |
||||||
import { useRouter, useRoute } from 'vue-router'; |
import { useRouter, useRoute } from 'vue-router'; |
||||||
import Cookies from 'js-cookie'; |
|
||||||
import Com1 from './1029.vue'; |
|
||||||
import Com2 from './1030.vue'; |
|
||||||
import Com3 from './1031.vue'; |
|
||||||
import Com4 from './1032.vue'; |
|
||||||
import Com5 from './1033.vue'; |
|
||||||
|
|
||||||
const router = useRouter(); |
const router = useRouter(); |
||||||
const route = useRoute(); |
const route = useRoute(); |
||||||
const projectId = +Cookies.get('sand-projectId'); |
|
||||||
const levelId = +Cookies.get('sand-level'); |
|
||||||
const list = ref<Array<Record<string, any>>>([]); |
const list = ref<Array<Record<string, any>>>([]); |
||||||
const id = computed(() => +route.query.id); |
const curMenu = computed({ |
||||||
|
get() { |
||||||
|
return route.query.id; |
||||||
|
}, |
||||||
|
set() {}, |
||||||
|
}); |
||||||
|
|
||||||
// 切换 |
const asyncComponents = { |
||||||
const switchProduct = (productId: number | string) => { |
'1029': defineAsyncComponent(() => import('./1029/Index.vue')), |
||||||
router.push(`/product/afterLoan?i=4&role=42&id=${productId}`); |
'1030': defineAsyncComponent(() => import('./1030/Index.vue')), |
||||||
|
'1031': defineAsyncComponent(() => import('./1031/Index.vue')), |
||||||
|
'1032': defineAsyncComponent(() => import('./1032/Index.vue')), |
||||||
|
'1033': defineAsyncComponent(() => import('./1033/Index.vue')), |
||||||
|
}; |
||||||
|
const loadedComponents = markRaw({}); |
||||||
|
const activeComponent = ref<string>(''); |
||||||
|
|
||||||
|
// 加载组件的方法 |
||||||
|
const loadComponent = async (componentName: string) => { |
||||||
|
if (!loadedComponents[componentName]) { |
||||||
|
try { |
||||||
|
loadedComponents[componentName] = asyncComponents[componentName]; |
||||||
|
activeComponent.value = componentName; |
||||||
|
} catch (error) { |
||||||
|
console.error(`Failed to load component ${componentName}`, error); |
||||||
|
} |
||||||
|
} else { |
||||||
|
activeComponent.value = componentName; |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
const handleSelect = async (key: string) => { |
||||||
|
curMenu.value = key; |
||||||
|
await loadComponent(key); |
||||||
|
router.push(`/product/afterLoan?i=${route.query.i}&role=${route.query.role}&id=${key}`); |
||||||
}; |
}; |
||||||
// 列表 |
// 列表 |
||||||
const getList = async (refresh?: number) => { |
const getList = async () => { |
||||||
const { process } = await getProcessInformationBasedOnRoles(69); |
const { process } = await getProcessInformationBasedOnRoles(69); |
||||||
// eslint-disable-next-line no-unused-expressions |
|
||||||
!id.value && switchProduct(process[0].id); |
|
||||||
list.value = process; |
list.value = process; |
||||||
|
handleSelect(curMenu.value || process[0].recordChildren[0].id); |
||||||
}; |
}; |
||||||
onMounted(() => { |
onMounted(getList); |
||||||
getList(); |
|
||||||
}); |
|
||||||
</script> |
</script> |
||||||
|
|
||||||
<style lang="scss" scoped> |
<style lang="scss" scoped> |
||||||
.card-list { |
.left { |
||||||
.left { |
@apply w-[200px]; |
||||||
@apply max-h-[calc(100vh-120px)]; |
|
||||||
} |
|
||||||
} |
} |
||||||
</style> |
</style> |
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,304 +0,0 @@ |
|||||||
<template> |
|
||||||
<!-- 个人额度模型 --> |
|
||||||
<el-form label-width="80px" |
|
||||||
class="form" |
|
||||||
status-icon> |
|
||||||
<h6 class="step-name mb-2">{{ formProcess[0]?.name }}</h6> |
|
||||||
<el-form-item label="不超过"> |
|
||||||
<el-select v-model="form.firstMode"> |
|
||||||
<el-option v-for="item in formProcess[0]?.recordChildren[0]?.subject?.itemList" |
|
||||||
:key="item" |
|
||||||
:value="item.options" /> |
|
||||||
</el-select> |
|
||||||
</el-form-item> |
|
||||||
<h6 class="step-name mt-4 mb-2">{{ formProcess[1]?.name }}</h6> |
|
||||||
<el-form-item label="不超过"> |
|
||||||
<el-select v-model="form.secondMode"> |
|
||||||
<el-option v-for="item in formProcess[1]?.recordChildren[0]?.subject?.itemList" |
|
||||||
:key="item" |
|
||||||
:value="item.options" /> |
|
||||||
</el-select> |
|
||||||
</el-form-item> |
|
||||||
<h6 class="step-name mt-4 mb-2">{{ formProcess[2]?.name }}</h6> |
|
||||||
<el-form-item label="不超过"> |
|
||||||
<el-select v-model="form.thirdMode"> |
|
||||||
<el-option v-for="item in formProcess[2]?.recordChildren[0]?.subject?.itemList" |
|
||||||
:key="item" |
|
||||||
:value="item.options" /> |
|
||||||
</el-select> |
|
||||||
</el-form-item> |
|
||||||
<el-form-item label="且"></el-form-item> |
|
||||||
<el-form-item label="不超过"> |
|
||||||
<el-select v-model="form.andThird"> |
|
||||||
<el-option v-for="item in formProcess[2]?.recordChildren[1]?.subject?.itemList" |
|
||||||
:key="item" |
|
||||||
:value="item.options" /> |
|
||||||
</el-select> |
|
||||||
</el-form-item> |
|
||||||
<el-form-item label="额度模型"> |
|
||||||
<el-table class="c-table" |
|
||||||
:data="form.individualCreditModels" |
|
||||||
:span-method="span" |
|
||||||
:cell-style="{background:'#fff'}" |
|
||||||
border> |
|
||||||
<el-table-column prop="indexName" |
|
||||||
label="指标名称" |
|
||||||
min-width="100" |
|
||||||
align="center"> |
|
||||||
<template #default="{ row, $index }"> |
|
||||||
<span :class="{'text-[#006bff]': !$index || $index === len}">{{ row?.indexName }}</span> |
|
||||||
</template> |
|
||||||
</el-table-column> |
|
||||||
<el-table-column label="描述" |
|
||||||
min-width="150"> |
|
||||||
<template #default="{ row, $index }"> |
|
||||||
<span :class="{'text-[#006bff]': !$index || $index === len}">{{ row?.description }}</span> |
|
||||||
</template> |
|
||||||
</el-table-column> |
|
||||||
<el-table-column label="分值" |
|
||||||
min-width="150"> |
|
||||||
<template #default="{ row, $index }"> |
|
||||||
<div v-if="$index !== len" |
|
||||||
class="flex items-center"> |
|
||||||
<span v-if="!$index" |
|
||||||
class="mr-2 whitespace-nowrap">{{ row?.subject?.name }}</span> |
|
||||||
<el-select v-if="row.subject" |
|
||||||
v-model="row.score"> |
|
||||||
<el-option v-for="item in row?.subject?.itemList.sort((a, b) => +(a.options.replace(/[^\d-]/, '')) - +(b.options.replace(/[^\d-]/, '')))" |
|
||||||
:key="item" |
|
||||||
:value="item.options" /> |
|
||||||
</el-select> |
|
||||||
</div> |
|
||||||
<span v-else |
|
||||||
class="text-[#006bff]">以上分值合计</span> |
|
||||||
</template> |
|
||||||
</el-table-column> |
|
||||||
</el-table> |
|
||||||
</el-form-item> |
|
||||||
</el-form> |
|
||||||
|
|
||||||
<div class="flex justify-end"> |
|
||||||
<div class="submit" |
|
||||||
@click="submit">确认完成配置</div> |
|
||||||
</div> |
|
||||||
</template> |
|
||||||
|
|
||||||
<script setup lang="ts"> |
|
||||||
import { ref, onMounted } from 'vue'; |
|
||||||
import { ElMessage, ElLoading } from 'element-plus'; |
|
||||||
import { personalCreditModelDetails, personalCreditModelSaveOrUpdate } from '@/api/model'; |
|
||||||
import { getProcessInformationBasedOnRoles, addOperation } from '@/api/judgment'; |
|
||||||
import type { TableColumnCtx } from 'element-plus'; |
|
||||||
import { useRouter, useRoute } from 'vue-router'; |
|
||||||
import { handleId, getIds } from '@/utils/common'; |
|
||||||
import Cookies from 'js-cookie'; |
|
||||||
|
|
||||||
const router = useRouter(); |
|
||||||
const route = useRoute(); |
|
||||||
let loading = null; |
|
||||||
const form = ref<Record<string, any>>({ |
|
||||||
...getIds(), |
|
||||||
andThird: '', |
|
||||||
firstMode: '', |
|
||||||
secondMode: '', |
|
||||||
thirdMode: '', |
|
||||||
type: 1, |
|
||||||
individualCreditModels: [], |
|
||||||
}); |
|
||||||
const formProcess = ref<Record<string, any>[]>([]); |
|
||||||
const info = ref<Record<string, any>[]>([]); |
|
||||||
const len = ref<number>(0); |
|
||||||
// 配置项 |
|
||||||
const getConfig = async () => { |
|
||||||
const { process } = await getProcessInformationBasedOnRoles(772); |
|
||||||
formProcess.value = process.slice(0, 3); |
|
||||||
const list = process[3]?.recordChildren; |
|
||||||
let cur = info.value.length ? info.value[0] : {}; |
|
||||||
const result = [ |
|
||||||
{ |
|
||||||
modelId: cur?.modelId || '', |
|
||||||
id: cur?.id || '', |
|
||||||
indexName: list[0]?.name, |
|
||||||
description: list[0]?.remark, |
|
||||||
subject: list[0]?.recordChildren[0]?.subject, |
|
||||||
score: cur?.score || '', |
|
||||||
}, |
|
||||||
]; |
|
||||||
const length = list.length - 1; |
|
||||||
list?.forEach((e, i) => { |
|
||||||
if (i && i !== length) { |
|
||||||
cur = info.value.length ? info.value[i] : {}; |
|
||||||
let temp = { |
|
||||||
indexName: e.name, |
|
||||||
recordChildren: e.recordChildren, |
|
||||||
stRecordId: e.id, |
|
||||||
ruleId: e?.recordChildren[0]?.id || '', |
|
||||||
description: e?.recordChildren[0]?.name || '', |
|
||||||
subject: e?.recordChildren[0]?.subject || [], |
|
||||||
score: '', |
|
||||||
}; |
|
||||||
|
|
||||||
result.push(temp); |
|
||||||
e?.recordChildren.forEach((n, j) => { |
|
||||||
if (j) { |
|
||||||
temp = JSON.parse(JSON.stringify(temp)); |
|
||||||
temp.description = n.name; |
|
||||||
temp.subject = n.subject; |
|
||||||
temp.ruleId = n.id; |
|
||||||
result.push(temp); |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
}); |
|
||||||
cur = info.value.length ? info.value[info.value.length - 1] : {}; |
|
||||||
result.push({ |
|
||||||
indexName: list[length]?.name, |
|
||||||
description: list[length]?.remark, |
|
||||||
subject: list[length]?.subject, |
|
||||||
score: '', |
|
||||||
}); |
|
||||||
len.value = result.length - 1; |
|
||||||
if (info.value.length) { |
|
||||||
result.forEach((e, i) => { |
|
||||||
result[i].score = info.value[i].score; |
|
||||||
result[i].id = info.value[i].id; |
|
||||||
result[i].modelId = info.value[i].modelId; |
|
||||||
}); |
|
||||||
} |
|
||||||
form.value.individualCreditModels = result; |
|
||||||
loading.close(); |
|
||||||
}; |
|
||||||
// 详情 |
|
||||||
const getDetail = async (load?: number) => { |
|
||||||
if (load) loading = ElLoading.service(); |
|
||||||
try { |
|
||||||
const { data } = await personalCreditModelDetails(); |
|
||||||
if (data) { |
|
||||||
form.value = data; |
|
||||||
info.value = data.individualCreditModels; |
|
||||||
} |
|
||||||
getConfig(); |
|
||||||
} finally { |
|
||||||
} |
|
||||||
}; |
|
||||||
onMounted(() => { |
|
||||||
getDetail(1); |
|
||||||
}); |
|
||||||
|
|
||||||
interface SpanMethodProps { |
|
||||||
row: Record<string, any>; |
|
||||||
column: TableColumnCtx<Record<string, any>>; |
|
||||||
rowIndex: number; |
|
||||||
columnIndex: number; |
|
||||||
} |
|
||||||
const rowMerge1 = [1, 7, 16, 23, 71, 75, 87, 98]; |
|
||||||
const rowMerge2 = [5, 30, 59, 61, 63, 79]; |
|
||||||
const rowMerge3 = [11, 38, 45]; |
|
||||||
const rowMerge4 = [20, 27, 50, 53, 56, 65, 68, 81, 84, 102, 105, 108]; |
|
||||||
const rowMerge5 = [0, 43, 44, 111]; |
|
||||||
// 表格合并 |
|
||||||
const span = ({ row, column, rowIndex, columnIndex }: SpanMethodProps) => { |
|
||||||
if (columnIndex === 0) { |
|
||||||
if (rowMerge1.includes(rowIndex)) { |
|
||||||
return { |
|
||||||
rowspan: 4, |
|
||||||
colspan: 1, |
|
||||||
}; |
|
||||||
} else if (rowMerge2.includes(rowIndex)) { |
|
||||||
return { |
|
||||||
rowspan: 2, |
|
||||||
colspan: 1, |
|
||||||
}; |
|
||||||
} else if (rowMerge3.includes(rowIndex)) { |
|
||||||
return { |
|
||||||
rowspan: 5, |
|
||||||
colspan: 1, |
|
||||||
}; |
|
||||||
} else if (rowMerge4.includes(rowIndex)) { |
|
||||||
return { |
|
||||||
rowspan: 3, |
|
||||||
colspan: 1, |
|
||||||
}; |
|
||||||
} else if (rowIndex === 32) { |
|
||||||
return { |
|
||||||
rowspan: 6, |
|
||||||
colspan: 1, |
|
||||||
}; |
|
||||||
} else if (rowIndex === 91) { |
|
||||||
return { |
|
||||||
rowspan: 7, |
|
||||||
colspan: 1, |
|
||||||
}; |
|
||||||
} else if (rowMerge5.includes(rowIndex)) { |
|
||||||
return { |
|
||||||
rowspan: 1, |
|
||||||
colspan: 1, |
|
||||||
}; |
|
||||||
} else { |
|
||||||
return { |
|
||||||
rowspan: 0, |
|
||||||
colspan: 0, |
|
||||||
}; |
|
||||||
} |
|
||||||
} |
|
||||||
}; |
|
||||||
|
|
||||||
const getItemId = (name: string): number | string => { |
|
||||||
if (!name) return ''; |
|
||||||
return formProcess.value[0]?.recordChildren[0]?.subject?.itemList.find((e) => e.options === name)?.itemId; |
|
||||||
}; |
|
||||||
|
|
||||||
// 新增判分记录 |
|
||||||
const addRecord = async (data: Record<string, any>) => { |
|
||||||
let preIds = `1,${Cookies.get('sand-level')},42,68,756,772`; // 1,关卡id,角色(这个页面是风控经理策略),其他看判分点接口 |
|
||||||
const rule: Array<Record<string, any>> = []; |
|
||||||
data.firstMode && rule.push(handleId(777, 236, getItemId(data.firstMode), preIds + ',774,777', 1)); |
|
||||||
data.secondMode && rule.push(handleId(777, 236, getItemId(data.secondMode), preIds + ',775,777', 1)); |
|
||||||
data.thirdMode && rule.push(handleId(777, 236, getItemId(data.thirdMode), preIds + ',776,777', 1)); |
|
||||||
data.andThird && rule.push(handleId(778, 236, getItemId(data.andThird), preIds + ',776,778', 1)); |
|
||||||
|
|
||||||
preIds += `,788`; |
|
||||||
form.value.individualCreditModels[0].score && |
|
||||||
rule.push( |
|
||||||
handleId( |
|
||||||
790, |
|
||||||
238, |
|
||||||
form.value?.individualCreditModels[0]?.subject?.itemList.find((e) => e.options === form.value.individualCreditModels[0].score)?.itemId, |
|
||||||
preIds + ',789,790', |
|
||||||
1, |
|
||||||
), |
|
||||||
); |
|
||||||
form.value.individualCreditModels.forEach((e, i) => { |
|
||||||
if (i && i !== len.value && e.subject) { |
|
||||||
e.score && rule.push(handleId(e.ruleId, e.subject.subjectId, e?.subject?.itemList?.find((n) => n.options === e.score)?.itemId, `${preIds},${e.stRecordId},${e.ruleId}`, 1)); |
|
||||||
} |
|
||||||
}); |
|
||||||
await addOperation({ |
|
||||||
...getIds(), |
|
||||||
parentId: preIds, |
|
||||||
lcJudgmentRuleReq: rule, |
|
||||||
}); |
|
||||||
}; |
|
||||||
// 提交 |
|
||||||
const submit = async () => { |
|
||||||
const param = JSON.parse(JSON.stringify(form.value)); |
|
||||||
param?.individualCreditModels.forEach((e, i) => { |
|
||||||
delete e.recordChildren; |
|
||||||
delete e.subject; |
|
||||||
}); |
|
||||||
loading = ElLoading.service(); |
|
||||||
await personalCreditModelSaveOrUpdate(param); |
|
||||||
addRecord(param); |
|
||||||
getDetail(); |
|
||||||
ElMessage.success('提交成功!'); |
|
||||||
}; |
|
||||||
</script> |
|
||||||
|
|
||||||
<style lang="scss" scoped> |
|
||||||
@import url(../../../styles/form.scss); |
|
||||||
.c-table { |
|
||||||
:deep(.el-input__inner) { |
|
||||||
@apply px-2; |
|
||||||
} |
|
||||||
} |
|
||||||
</style> |
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue