From a4f102defd2c7918617717f3307b6a3ef63859ff Mon Sep 17 00:00:00 2001
From: Mr Ke <kelq@hugeinfo.com.cn>
Date: Fri, 29 May 2020 18:03:17 +0800
Subject: [PATCH] 绩效总览 (列表、详情)、绩效指标 (配置)

---
 src/module/login/login.jsx                         |    2 
 src/components/oa/merits/meritsDispose/index.jsx   |  219 +++++++++
 src/components/oa/merits/meritsOverview/index.scss |   14 
 src/index.css                                      |    7 
 src/module/oa/merits/meritsExamine.jsx             |   33 +
 src/components/oa/merits/meritsDispose/index.scss  |   20 
 src/routeDom/oaRouteDom.jsx                        |   10 
 src/api/httpurl.js                                 |    2 
 src/module/oa/merits/meritsOverview.jsx            |   33 +
 src/components/oa/merits/meritsExamine/index.jsx   |   92 +++
 src/index.js                                       |   28 +
 report.20200529.103416.21856.0.001.json            |  483 ++++++++++++++++++++
 src/api/request.js                                 |    7 
 src/components/oa/merits/meritsOverview/index.jsx  |  104 ++++
 src/menu/index.js                                  |    2 
 src/components/common/TableView/index.jsx          |   56 +
 src/components/oa/logManage/browseLog/index.jsx    |    1 
 src/components/oa/merits/meritsExamine/index.scss  |   14 
 src/module/oa/merits/meritsDispose.jsx             |   34 +
 src/components/common/SearchFormView/index.jsx     |   55 +
 src/components/oa/merits/meritsDetail/index.jsx    |  145 ++++++
 src/components/common/HeadView/index.jsx           |    1 
 src/menu/menu.oa.js                                |    4 
 src/components/oa/merits/meritsDetail/index.scss   |   17 
 src/module/oa/merits/meritsDetail.jsx              |   33 +
 25 files changed, 1,369 insertions(+), 47 deletions(-)

diff --git a/report.20200529.103416.21856.0.001.json b/report.20200529.103416.21856.0.001.json
new file mode 100644
index 0000000..20e60b9
--- /dev/null
+++ b/report.20200529.103416.21856.0.001.json
@@ -0,0 +1,483 @@
+
+{
+  "header": {
+    "event": "Allocation failed - JavaScript heap out of memory",
+    "trigger": "FatalError",
+    "filename": "report.20200529.103416.21856.0.001.json",
+    "dumpEventTime": "2020-05-29T10:34:16Z",
+    "dumpEventTimeStamp": "1590719656961",
+    "processId": 21856,
+    "cwd": "E:\\HugeInfo_Code\\oa",
+    "commandLine": [
+      "node",
+      "E:\\HugeInfo_Code\\oa\\node_modules\\_react-app-rewired@2.1.5@react-app-rewired\\scripts\\start.js"
+    ],
+    "nodejsVersion": "v12.2.0",
+    "wordSize": 64,
+    "arch": "x64",
+    "platform": "win32",
+    "componentVersions": {
+      "node": "12.2.0",
+      "v8": "7.4.288.21-node.17",
+      "uv": "1.28.0",
+      "zlib": "1.2.11",
+      "brotli": "1.0.7",
+      "ares": "1.15.0",
+      "modules": "72",
+      "nghttp2": "1.38.0",
+      "napi": "4",
+      "llhttp": "1.1.3",
+      "http_parser": "2.8.0",
+      "openssl": "1.1.1b",
+      "cldr": "35.1",
+      "icu": "64.2",
+      "tz": "2019a",
+      "unicode": "12.1"
+    },
+    "release": {
+      "name": "node",
+      "headersUrl": "https://nodejs.org/download/release/v12.2.0/node-v12.2.0-headers.tar.gz",
+      "sourceUrl": "https://nodejs.org/download/release/v12.2.0/node-v12.2.0.tar.gz",
+      "libUrl": "https://nodejs.org/download/release/v12.2.0/win-x64/node.lib"
+    },
+    "osName": "Windows_NT",
+    "osRelease": "10.0.18363",
+    "osVersion": "Windows 10 Home China",
+    "osMachine": "x86_64",
+    "host": "LAPTOP-RI7D261L"
+  },
+  "javascriptStack": {
+    "message": "No stack.",
+    "stack": [
+      "Unavailable."
+    ]
+  },
+  "nativeStack": [
+    {
+      "pc": "0x00007ff7c8ef4e09",
+      "symbol": "std::basic_ostream<char,std::char_traits<char> >::operator<<+9161"
+    },
+    {
+      "pc": "0x00007ff7c8ef8764",
+      "symbol": "std::basic_ostream<char,std::char_traits<char> >::operator<<+23844"
+    },
+    {
+      "pc": "0x00007ff7c8ef7785",
+      "symbol": "std::basic_ostream<char,std::char_traits<char> >::operator<<+19781"
+    },
+    {
+      "pc": "0x00007ff7c8fdf9ab",
+      "symbol": "uv_loop_fork+47931"
+    },
+    {
+      "pc": "0x00007ff7c93171fe",
+      "symbol": "v8::internal::Parser::ReportMessageAt+206"
+    },
+    {
+      "pc": "0x00007ff7c92eb27a",
+      "symbol": "v8::internal::wasm::StreamingDecoder::NotifyCompilationEnded+666"
+    },
+    {
+      "pc": "0x00007ff7c93816bc",
+      "symbol": "v8::internal::Heap::CreateFillerObjectAt+2972"
+    },
+    {
+      "pc": "0x00007ff7c938942f",
+      "symbol": "v8::internal::LocalEmbedderHeapTracer::NotifyV8MarkingWorklistWasEmpty+5375"
+    },
+    {
+      "pc": "0x00007ff7c937faa3",
+      "symbol": "v8::internal::Heap::CollectGarbage+1235"
+    },
+    {
+      "pc": "0x00007ff7c937e1a4",
+      "symbol": "v8::internal::GCTracer::AddScopeSample+1316"
+    },
+    {
+      "pc": "0x00007ff7c93bedd3",
+      "symbol": "v8::internal::Factory::NewFillerObject+67"
+    },
+    {
+      "pc": "0x00007ff7c96e57d6",
+      "symbol": "v8::internal::OptimizingCompileDispatcher::Unblock+116966"
+    },
+    {
+      "pc": "0x00007ff7c9b80366",
+      "symbol": "v8::internal::NativesCollection<0>::GetScriptsSource+660214"
+    }
+  ],
+  "javascriptHeap": {
+    "totalMemory": 2156130304,
+    "totalCommittedMemory": 2156130304,
+    "usedMemory": 1876224704,
+    "availableMemory": 76994904,
+    "memoryLimit": 2197815296,
+    "heapSpaces": {
+      "read_only_space": {
+        "memorySize": 524288,
+        "committedMemory": 524288,
+        "capacity": 523976,
+        "used": 31712,
+        "available": 492264
+      },
+      "new_space": {
+        "memorySize": 33554432,
+        "committedMemory": 33554432,
+        "capacity": 16767232,
+        "used": 762392,
+        "available": 16004840
+      },
+      "old_space": {
+        "memorySize": 1971970048,
+        "committedMemory": 1971970048,
+        "capacity": 1732711024,
+        "used": 1730665448,
+        "available": 2045576
+      },
+      "code_space": {
+        "memorySize": 3833856,
+        "committedMemory": 3833856,
+        "capacity": 3244960,
+        "used": 3244960,
+        "available": 0
+      },
+      "map_space": {
+        "memorySize": 7868416,
+        "committedMemory": 7868416,
+        "capacity": 3334400,
+        "used": 3334400,
+        "available": 0
+      },
+      "large_object_space": {
+        "memorySize": 137756672,
+        "committedMemory": 137756672,
+        "capacity": 137635488,
+        "used": 137635488,
+        "available": 0
+      },
+      "code_large_object_space": {
+        "memorySize": 622592,
+        "committedMemory": 622592,
+        "capacity": 550304,
+        "used": 550304,
+        "available": 0
+      },
+      "new_large_object_space": {
+        "memorySize": 0,
+        "committedMemory": 0,
+        "capacity": 16767232,
+        "used": 0,
+        "available": 16767232
+      }
+    }
+  },
+  "resourceUsage": {
+    "userCpuSeconds": 474.046,
+    "kernelCpuSeconds": 220.39,
+    "cpuConsumptionPercent": 13.2299,
+    "maxRss": 2717171712,
+    "pageFaults": {
+      "IORequired": 4563168,
+      "IONotRequired": 0
+    },
+    "fsActivity": {
+      "reads": 13095,
+      "writes": 577
+    }
+  },
+  "libuv": [
+  ],
+  "environmentVariables": {
+    "=C:": "C:\\",
+    "ALLUSERSPROFILE": "C:\\ProgramData",
+    "APPDATA": "C:\\Users\\Mr Ke\\AppData\\Roaming",
+    "AUTHORINFO": "\"Ke Liqin <545800322@qq.com>\"",
+    "BABEL_ENV": "development",
+    "CLASSPATH": ".;C:\\Program Files\\Java\\jdk1.8.0_131\\lib;C:\\Program Files\\Java\\jdk1.8.0_131\\lib\\tools.jar",
+    "COLORTERM": "truecolor",
+    "CommonProgramFiles": "C:\\Program Files\\Common Files",
+    "CommonProgramFiles(x86)": "C:\\Program Files (x86)\\Common Files",
+    "CommonProgramW6432": "C:\\Program Files\\Common Files",
+    "COMPUTERNAME": "LAPTOP-RI7D261L",
+    "ComSpec": "C:\\WINDOWS\\system32\\cmd.exe",
+    "configsetroot": "C:\\WINDOWS\\ConfigSetRoot",
+    "DriverData": "C:\\Windows\\System32\\Drivers\\DriverData",
+    "FPS_BROWSER_APP_PROFILE_STRING": "Internet Explorer",
+    "FPS_BROWSER_USER_PROFILE_STRING": "Default",
+    "GIT_ASKPASS": "d:\\Program Files\\Microsoft VS Code\\resources\\app\\extensions\\git\\dist\\askpass.sh",
+    "HOME": "C:\\Users\\Mr Ke",
+    "HOMEDRIVE": "C:",
+    "HOMEPATH": "\\Users\\Mr Ke",
+    "INIT_CWD": "E:\\HugeInfo_Code\\oa",
+    "JAVA_HOME": "C:\\Program Files\\Java\\jdk1.8.0_131",
+    "LANG": "zh_CN.UTF-8",
+    "LOCALAPPDATA": "C:\\Users\\Mr Ke\\AppData\\Local",
+    "LOGONSERVER": "\\\\LAPTOP-RI7D261L",
+    "NODE": "C:\\Program Files\\nodejs\\node.exe",
+    "NODE_ENV": "development",
+    "NODE_EXE": "C:\\Program Files\\nodejs\\\\node.exe",
+    "NODE_PATH": "",
+    "NPM_CLI_JS": "C:\\Program Files\\nodejs\\\\node_modules\\npm\\bin\\npm-cli.js",
+    "npm_config_access": "",
+    "npm_config_allow_same_version": "",
+    "npm_config_also": "",
+    "npm_config_always_auth": "",
+    "npm_config_argv": "{\"remain\":[],\"cooked\":[\"start\"],\"original\":[\"start\"]}",
+    "npm_config_audit": "true",
+    "npm_config_audit_level": "low",
+    "npm_config_auth_type": "legacy",
+    "npm_config_before": "",
+    "npm_config_bin_links": "true",
+    "npm_config_browser": "",
+    "npm_config_ca": "",
+    "npm_config_cache": "C:\\Users\\Mr Ke\\AppData\\Roaming\\npm-cache",
+    "npm_config_cache_lock_retries": "10",
+    "npm_config_cache_lock_stale": "60000",
+    "npm_config_cache_lock_wait": "10000",
+    "npm_config_cache_max": "Infinity",
+    "npm_config_cache_min": "10",
+    "npm_config_cafile": "",
+    "npm_config_cert": "",
+    "npm_config_cidr": "",
+    "npm_config_color": "true",
+    "npm_config_commit_hooks": "true",
+    "npm_config_depth": "Infinity",
+    "npm_config_description": "true",
+    "npm_config_dev": "",
+    "npm_config_disturl": "https://npm.taobao.org/dist",
+    "npm_config_dry_run": "",
+    "npm_config_editor": "notepad.exe",
+    "npm_config_engine_strict": "",
+    "npm_config_fetch_retries": "2",
+    "npm_config_fetch_retry_factor": "10",
+    "npm_config_fetch_retry_maxtimeout": "60000",
+    "npm_config_fetch_retry_mintimeout": "10000",
+    "npm_config_force": "",
+    "npm_config_git": "git",
+    "npm_config_git_tag_version": "true",
+    "npm_config_global": "",
+    "npm_config_globalconfig": "C:\\Users\\Mr Ke\\AppData\\Roaming\\npm\\etc\\npmrc",
+    "npm_config_globalignorefile": "C:\\Users\\Mr Ke\\AppData\\Roaming\\npm\\etc\\npmignore",
+    "npm_config_global_style": "",
+    "npm_config_group": "",
+    "npm_config_ham_it_up": "",
+    "npm_config_heading": "npm",
+    "npm_config_https_proxy": "",
+    "npm_config_if_present": "",
+    "npm_config_ignore_prepublish": "",
+    "npm_config_ignore_scripts": "",
+    "npm_config_init_author_email": "",
+    "npm_config_init_author_name": "",
+    "npm_config_init_author_url": "",
+    "npm_config_init_license": "ISC",
+    "npm_config_init_module": "C:\\Users\\Mr Ke\\.npm-init.js",
+    "npm_config_init_version": "1.0.0",
+    "npm_config_json": "",
+    "npm_config_key": "",
+    "npm_config_legacy_bundling": "",
+    "npm_config_link": "",
+    "npm_config_local_address": "",
+    "npm_config_loglevel": "notice",
+    "npm_config_logs_max": "10",
+    "npm_config_long": "",
+    "npm_config_maxsockets": "50",
+    "npm_config_message": "%s",
+    "npm_config_metrics_registry": "https://registry.npm.taobao.org/",
+    "npm_config_node_gyp": "C:\\Users\\Mr Ke\\AppData\\Roaming\\nvm\\v12.2.0\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js",
+    "npm_config_node_options": "",
+    "npm_config_node_version": "12.2.0",
+    "npm_config_noproxy": "",
+    "npm_config_offline": "",
+    "npm_config_onload_script": "",
+    "npm_config_only": "",
+    "npm_config_optional": "true",
+    "npm_config_otp": "",
+    "npm_config_package_lock": "true",
+    "npm_config_package_lock_only": "",
+    "npm_config_parseable": "",
+    "npm_config_prefer_offline": "",
+    "npm_config_prefer_online": "",
+    "npm_config_prefix": "C:\\Users\\Mr Ke\\AppData\\Roaming\\npm",
+    "npm_config_preid": "",
+    "npm_config_production": "",
+    "npm_config_progress": "true",
+    "npm_config_proxy": "",
+    "npm_config_read_only": "",
+    "npm_config_rebuild_bundle": "true",
+    "npm_config_registry": "https://registry.npm.taobao.org/",
+    "npm_config_rollback": "true",
+    "npm_config_save": "true",
+    "npm_config_save_bundle": "",
+    "npm_config_save_dev": "",
+    "npm_config_save_exact": "",
+    "npm_config_save_optional": "",
+    "npm_config_save_prefix": "^",
+    "npm_config_save_prod": "",
+    "npm_config_scope": "",
+    "npm_config_scripts_prepend_node_path": "warn-only",
+    "npm_config_script_shell": "",
+    "npm_config_searchexclude": "",
+    "npm_config_searchlimit": "20",
+    "npm_config_searchopts": "",
+    "npm_config_searchstaleness": "900",
+    "npm_config_send_metrics": "",
+    "npm_config_shell": "C:\\WINDOWS\\system32\\cmd.exe",
+    "npm_config_shrinkwrap": "true",
+    "npm_config_sign_git_commit": "",
+    "npm_config_sign_git_tag": "",
+    "npm_config_sso_poll_frequency": "500",
+    "npm_config_sso_type": "oauth",
+    "npm_config_strict_ssl": "true",
+    "npm_config_tag": "latest",
+    "npm_config_tag_version_prefix": "v",
+    "npm_config_timing": "",
+    "npm_config_tmp": "C:\\Users\\MRKE~1\\AppData\\Local\\Temp",
+    "npm_config_umask": "0000",
+    "npm_config_unicode": "",
+    "npm_config_unsafe_perm": "true",
+    "npm_config_update_notifier": "true",
+    "npm_config_usage": "",
+    "npm_config_user": "",
+    "npm_config_userconfig": "C:\\Users\\Mr Ke\\.npmrc",
+    "npm_config_user_agent": "npm/6.9.0 node/v12.2.0 win32 x64",
+    "npm_config_version": "",
+    "npm_config_versions": "",
+    "npm_config_viewer": "browser",
+    "npm_execpath": "C:\\Users\\Mr Ke\\AppData\\Roaming\\nvm\\v12.2.0\\node_modules\\npm\\bin\\npm-cli.js",
+    "npm_lifecycle_event": "start",
+    "npm_lifecycle_script": "react-app-rewired start",
+    "npm_node_execpath": "C:\\Program Files\\nodejs\\node.exe",
+    "npm_package_browserslist_development_0": "ie 8",
+    "npm_package_browserslist_development_1": "last 1 chrome version",
+    "npm_package_browserslist_development_2": "last 1 firefox version",
+    "npm_package_browserslist_development_3": "last 1 safari version",
+    "npm_package_browserslist_production_0": ">0.2%",
+    "npm_package_browserslist_production_1": "not dead",
+    "npm_package_browserslist_production_2": "not op_mini all",
+    "npm_package_dependencies_antd": "^3.26.11",
+    "npm_package_dependencies_axios": "^0.19.2",
+    "npm_package_dependencies_braft_editor": "^2.3.9",
+    "npm_package_dependencies_mocker_api": "^1.9.0",
+    "npm_package_dependencies_node_sass": "^4.13.1",
+    "npm_package_dependencies_react": "^16.12.0",
+    "npm_package_dependencies_react_app_polyfill": "^1.0.6",
+    "npm_package_dependencies_react_dom": "^16.12.0",
+    "npm_package_dependencies_react_router_dom": "^5.1.2",
+    "npm_package_dependencies_react_scripts": "3.4.0",
+    "npm_package_dependencies_sass_loader": "^8.0.2",
+    "npm_package_dependencies_wangeditor": "^3.1.1",
+    "npm_package_dependencies__testing_library_jest_dom": "^4.2.4",
+    "npm_package_dependencies__testing_library_react": "^9.3.2",
+    "npm_package_dependencies__testing_library_user_event": "^7.1.2",
+    "npm_package_description": "This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).",
+    "npm_package_devDependencies_babel_plugin_import": "^1.13.0",
+    "npm_package_devDependencies_customize_cra": "^0.9.1",
+    "npm_package_devDependencies_es6_promise": "^4.2.8",
+    "npm_package_devDependencies_less": "^3.11.1",
+    "npm_package_devDependencies_less_loader": "^5.0.0",
+    "npm_package_devDependencies_mockjs": "^1.0.1-beta3",
+    "npm_package_devDependencies_moment": "^2.24.0",
+    "npm_package_devDependencies_react_app_rewired": "^2.1.5",
+    "npm_package_devDependencies__babel_plugin_proposal_class_properties": "^7.8.3",
+    "npm_package_eslintConfig_extends": "react-app",
+    "npm_package_gitHead": "77a2a090ff1b9d1b03795d696954a28ba0e0871f",
+    "npm_package_homepage": "http://.",
+    "npm_package_name": "my-app",
+    "npm_package_private": "true",
+    "npm_package_readmeFilename": "README.md",
+    "npm_package_scripts_build": "react-app-rewired build",
+    "npm_package_scripts_eject": "react-app-rewired eject",
+    "npm_package_scripts_mock": "mocker ./mock",
+    "npm_package_scripts_page": "node .pjcode/page",
+    "npm_package_scripts_start": "react-app-rewired start",
+    "npm_package_scripts_test": "react-app-rewired test",
+    "npm_package_scripts_view": "node .pjcode/view",
+    "npm_package_version": "0.1.0",
+    "NPM_PREFIX_NPM_CLI_JS": "C:\\Users\\Mr Ke\\AppData\\Roaming\\npm\\node_modules\\npm\\bin\\npm-cli.js",
+    "NUMBER_OF_PROCESSORS": "8",
+    "NVM_HOME": "C:\\Users\\Mr Ke\\AppData\\Roaming\\nvm",
+    "NVM_SYMLINK": "C:\\Program Files\\nodejs",
+    "OneDrive": "C:\\Users\\Mr Ke\\OneDrive",
+    "OS": "Windows_NT",
+    "Path": "C:\\Users\\Mr Ke\\AppData\\Roaming\\nvm\\v12.2.0\\node_modules\\npm\\node_modules\\npm-lifecycle\\node-gyp-bin;E:\\HugeInfo_Code\\oa\\node_modules\\.bin;C:\\ProgramData\\Oracle\\Java\\javapath;D:\\Program Files\\Git\\cmd;C:\\Windows\\System32;C:\\Program Files (x86)\\Common Files\\Thunder Network\\KanKan\\Codecs;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\WINDOWS\\System32\\OpenSSH\\;C:\\Program Files\\NVIDIA Corporation\\NVIDIA NvDLISR;\"C:\\Program Files\\Java\\jdk1.8.0_131\\bin;C:\\Program Files\\Java\\jdk1.8.0_131\\jre\\bin\";C:\\Program Files (x86)\\NVIDIA Corporation\\PhysX\\Common;D:\\Program Files\\Yarn\\bin\\;C:\\Program Files\\TortoiseSVN\\bin;C:\\Users\\Mr Ke\\AppData\\Roaming\\nvm;C:\\Program Files\\nodejs;C:\\Users\\Mr Ke\\AppData\\Local\\Programs\\Python\\Python37\\Scripts\\;C:\\Users\\Mr Ke\\AppData\\Local\\Programs\\Python\\Python37\\;C:\\Users\\Mr Ke\\AppData\\Local\\Microsoft\\WindowsApps;D:\\Program Files\\Microsoft VS Code\\bin;C:\\Users\\Mr Ke\\AppData\\Local\\BypassRuntm;C:\\Users\\Mr Ke\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\Mr Ke\\AppData\\Local\\Yarn\\bin;C:\\Users\\Mr Ke\\AppData\\Roaming\\npm;C:\\Users\\Mr Ke\\AppData\\Roaming\\nvm;C:\\Program Files\\nodejs",
+    "PATHEXT": ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JSE;.WSF;.WSH;.MSC;.CPL",
+    "PROCESSOR_ARCHITECTURE": "AMD64",
+    "PROCESSOR_IDENTIFIER": "Intel64 Family 6 Model 158 Stepping 10, GenuineIntel",
+    "PROCESSOR_LEVEL": "6",
+    "PROCESSOR_REVISION": "9e0a",
+    "ProgramData": "C:\\ProgramData",
+    "ProgramFiles": "C:\\Program Files",
+    "ProgramFiles(x86)": "C:\\Program Files (x86)",
+    "ProgramW6432": "C:\\Program Files",
+    "PROMPT": "$P$G",
+    "PSModulePath": "C:\\Users\\Mr Ke\\Documents\\WindowsPowerShell\\Modules;C:\\Program Files\\WindowsPowerShell\\Modules;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules",
+    "PUBLIC": "C:\\Users\\Public",
+    "REACT_APP_CODER": "liuwh",
+    "REACT_APP_EMAIL": "",
+    "SESSIONNAME": "Console",
+    "SystemDrive": "C:",
+    "SystemRoot": "C:\\WINDOWS",
+    "TEMP": "C:\\Users\\MRKE~1\\AppData\\Local\\Temp",
+    "TERM_PROGRAM": "vscode",
+    "TERM_PROGRAM_VERSION": "1.45.1",
+    "TMP": "C:\\Users\\MRKE~1\\AppData\\Local\\Temp",
+    "USERDOMAIN": "LAPTOP-RI7D261L",
+    "USERDOMAIN_ROAMINGPROFILE": "LAPTOP-RI7D261L",
+    "USERNAME": "Mr Ke",
+    "USERPROFILE": "C:\\Users\\Mr Ke",
+    "VSCODE_GIT_ASKPASS_MAIN": "d:\\Program Files\\Microsoft VS Code\\resources\\app\\extensions\\git\\dist\\askpass-main.js",
+    "VSCODE_GIT_ASKPASS_NODE": "D:\\Program Files\\Microsoft VS Code\\Code.exe",
+    "VSCODE_GIT_IPC_HANDLE": "\\\\.\\pipe\\vscode-git-0f14f4766a-sock",
+    "WEBPACK_DEV_SERVER": "true",
+    "windir": "C:\\WINDOWS"
+  },
+  "sharedObjects": [
+    "C:\\Program Files\\nodejs\\node.exe",
+    "C:\\WINDOWS\\SYSTEM32\\ntdll.dll",
+    "C:\\WINDOWS\\System32\\KERNEL32.DLL",
+    "C:\\WINDOWS\\System32\\KERNELBASE.dll",
+    "C:\\WINDOWS\\System32\\WS2_32.dll",
+    "C:\\WINDOWS\\System32\\RPCRT4.dll",
+    "C:\\WINDOWS\\System32\\ADVAPI32.dll",
+    "C:\\WINDOWS\\System32\\msvcrt.dll",
+    "C:\\WINDOWS\\System32\\sechost.dll",
+    "C:\\WINDOWS\\System32\\USER32.dll",
+    "C:\\WINDOWS\\System32\\win32u.dll",
+    "C:\\WINDOWS\\System32\\GDI32.dll",
+    "C:\\WINDOWS\\System32\\gdi32full.dll",
+    "C:\\WINDOWS\\SYSTEM32\\dbghelp.dll",
+    "C:\\WINDOWS\\System32\\msvcp_win.dll",
+    "C:\\WINDOWS\\System32\\ucrtbase.dll",
+    "C:\\WINDOWS\\System32\\PSAPI.DLL",
+    "C:\\WINDOWS\\System32\\CRYPT32.dll",
+    "C:\\WINDOWS\\System32\\MSASN1.dll",
+    "C:\\WINDOWS\\SYSTEM32\\USERENV.dll",
+    "C:\\WINDOWS\\SYSTEM32\\IPHLPAPI.DLL",
+    "C:\\WINDOWS\\System32\\bcrypt.dll",
+    "C:\\WINDOWS\\System32\\profapi.dll",
+    "C:\\WINDOWS\\SYSTEM32\\WINMM.dll",
+    "C:\\WINDOWS\\SYSTEM32\\winmmbase.dll",
+    "C:\\WINDOWS\\System32\\cfgmgr32.dll",
+    "C:\\WINDOWS\\System32\\bcryptPrimitives.dll",
+    "C:\\WINDOWS\\System32\\IMM32.DLL",
+    "C:\\WINDOWS\\System32\\powrprof.dll",
+    "C:\\WINDOWS\\System32\\UMPDC.dll",
+    "C:\\WINDOWS\\system32\\uxtheme.dll",
+    "C:\\WINDOWS\\System32\\combase.dll",
+    "C:\\WINDOWS\\system32\\mswsock.dll",
+    "C:\\WINDOWS\\System32\\kernel.appcore.dll",
+    "C:\\WINDOWS\\SYSTEM32\\CRYPTBASE.DLL",
+    "C:\\WINDOWS\\System32\\NSI.dll",
+    "C:\\WINDOWS\\SYSTEM32\\dhcpcsvc6.DLL",
+    "C:\\WINDOWS\\SYSTEM32\\dhcpcsvc.DLL",
+    "C:\\WINDOWS\\SYSTEM32\\DNSAPI.dll",
+    "C:\\WINDOWS\\system32\\napinsp.dll",
+    "C:\\WINDOWS\\system32\\pnrpnsp.dll",
+    "C:\\WINDOWS\\System32\\winrnr.dll",
+    "C:\\WINDOWS\\system32\\NLAapi.dll",
+    "C:\\WINDOWS\\system32\\wshbth.dll",
+    "C:\\Windows\\System32\\rasadhlp.dll",
+    "C:\\WINDOWS\\System32\\fwpuclnt.dll",
+    "\\\\?\\E:\\HugeInfo_Code\\oa\\node_modules\\_node-sass@4.13.1@node-sass\\vendor\\win32-x64-72\\binding.node"
+  ]
+}
\ No newline at end of file
diff --git a/src/api/httpurl.js b/src/api/httpurl.js
index 2db8601..6c15c9e 100644
--- a/src/api/httpurl.js
+++ b/src/api/httpurl.js
@@ -1,5 +1,5 @@
 //内网测试地址
-let StagingUrl = 'http://192.168.0.12:9072';
+let StagingUrl = 'http://192.168.3.12:9072';
 // let StagingUrl = "http://120.79.193.119:9072";
 // let StagingUrl = "http://120.79.193.119:9075";
 
diff --git a/src/api/request.js b/src/api/request.js
index 5d6752d..10f16d4 100644
--- a/src/api/request.js
+++ b/src/api/request.js
@@ -3,7 +3,9 @@
 import { message } from 'antd';
 import { NetworkState, BASE_URL, MockUrl } from './httpurl';
 
+import { createHashHistory } from 'history';
 const CODE_SUCCESS = '200';
+const history = createHashHistory();
 
 let recognitionParams = [].reduce((p, n) => {
   if (eval(n)) {
@@ -64,8 +66,7 @@
         code == '10003'
       ) {
         // token失效重新返回登录页面
-        // this.props.history.push({ pathname: '/login' });
-        window.location.href = window.location.origin + '#/login';
+        history.push('/login');
       } else {
         message.warning(msg);
         return false;
@@ -73,6 +74,6 @@
     })
     .catch((err) => {
       console.log(err);
-      window.location.href = window.location.origin + '#/login';
+      // history.push('/login');
     });
 }
diff --git a/src/components/common/HeadView/index.jsx b/src/components/common/HeadView/index.jsx
index 9927dd1..b69749f 100644
--- a/src/components/common/HeadView/index.jsx
+++ b/src/components/common/HeadView/index.jsx
@@ -24,6 +24,7 @@
         // 清空用户相关信息
         window.localStorage.setItem('menu', '');
         window.localStorage.setItem('token', '');
+        window.localStorage.setItem('role', '');
         message.success('退出成功!');
         fun({ role: '' });
         window.location.href = window.location.origin + '/#/login';
diff --git a/src/components/common/SearchFormView/index.jsx b/src/components/common/SearchFormView/index.jsx
index bbc7bc1..c709027 100644
--- a/src/components/common/SearchFormView/index.jsx
+++ b/src/components/common/SearchFormView/index.jsx
@@ -9,7 +9,7 @@
 import { Row, Col, Form, Input, Button, Select, DatePicker, Divider, Card } from 'antd';
 import moment from 'moment';
 
-const { RangePicker } = DatePicker;
+const { RangePicker, MonthPicker } = DatePicker;
 import './index.scss';
 
 // data参数:数据模板
@@ -106,8 +106,16 @@
         });
     };
 
+    //月份选择器
+    monthPickerChange = (name, m, d) => {
+        this.props.setFormData({
+            ...this.props.formData,
+            [name]: d
+        })
+    }
+
     render() {
-        const { formData = {}, data = [], children, width = "25%" } = this.props;
+        const { formData = {}, data = [], children, width = "25%", showReset = true } = this.props;
         let size = 'default';
 
         return (
@@ -128,13 +136,13 @@
                                                             style={{ width: '100%' }}
                                                             placeholder={item.name}
                                                             value={formData[item.key]}
-                                                            allowClear
+                                                            // allowClear
                                                             onChange={this.handleSelectChange(item.key)}>
                                                             {item.list &&
                                                                 item.list.map(item => (
                                                                     <Select.Option
-                                                                        value={item.id}
-                                                                        key={item.id}>
+                                                                        value={item.value}
+                                                                        key={item.value}>
                                                                         {item.name}
                                                                     </Select.Option>
                                                                 ))}
@@ -201,6 +209,22 @@
                                                         />
                                                     </Form.Item>
                                                 );
+                                            case 'monthPicker':
+                                                return (
+                                                    <Form.Item label={item.label}>
+                                                        <MonthPicker
+                                                            style={{ width: '100%' }}
+                                                            size={size}
+                                                            placeholder={item.name}
+                                                            onChange={(date, dateString) => {
+                                                                console.log(date, dateString);
+                                                                this.monthPickerChange(item.key, date, dateString);
+                                                            }}
+                                                            value={formData[item.key] ? moment(formData[item.key], 'YYYY-MM') : undefined}
+                                                        />
+                                                    </Form.Item>
+
+                                                )
                                             // case 'br':
                                             //     return (
                                             //         <Col span={24} style={{ marginBottom: '10px' }} />
@@ -223,15 +247,18 @@
                                         查询
                                 </Button>
                                 </Col>
-                                <Col>
-                                    <Button
-                                        size={size}
-                                        onClick={() => {
-                                            this.onClick('reset');
-                                        }}>
-                                        重置
-                                </Button>
-                                </Col>
+                                {
+                                    showReset ?
+                                        <Col>
+                                            <Button
+                                                size={size}
+                                                onClick={() => {
+                                                    this.onClick('reset');
+                                                }}>
+                                                重置
+                                            </Button>
+                                        </Col> : null
+                                }
                                 {
                                     children &&
                                     <Col>
diff --git a/src/components/common/TableView/index.jsx b/src/components/common/TableView/index.jsx
index 41d88c8..3522f21 100644
--- a/src/components/common/TableView/index.jsx
+++ b/src/components/common/TableView/index.jsx
@@ -25,7 +25,7 @@
     }
 
     componentDidMount() {
-        let { page, size } = this.props.formData;
+        let { page = 1, size } = this.props.formData;
         this.loadData(page, size);
     }
 
@@ -43,18 +43,31 @@
                 size
             }
         }).then(res => {
-            if (res) {
-                res.content = res.content.map(({ ...a }, idx) => ({
-                    ...a,
-                    index: idx + 1 + 10 * (page - 1),
-                    key: idx,
-                }));
-            }
-            this.setState({
-                tableData: res ? res.content : [],
-                loading: false,
-                totalElements: res ? res.totalElements : 0,
-            });
+            if (res && res)
+                if (res) {
+                    if (res.content) {
+                        res.content = res.content.map(({ ...a }, idx) => ({
+                            ...a,
+                            index: idx + 1 + 10 * (page - 1),
+                            key: idx,
+                        }));
+                        this.setState({
+                            tableData: res ? res.content : [],
+                            loading: false,
+                            totalElements: res ? res.totalElements : 0,
+                        });
+                    } else {
+                        res = res.map(({ ...a }, idx) => ({
+                            ...a,
+                            index: idx + 1 + 10 * (page - 1),
+                            key: idx,
+                        }));
+                        this.setState({
+                            tableData: res,
+                            loading: false,
+                        })
+                    }
+                }
         });
     };
 
@@ -84,9 +97,18 @@
         return originalElement;
     };
 
+    onSetDataSource = ({ index, data }, callBack) => {
+        console.log(index, data);
+        let { tableData } = this.state;
+        tableData[index] = data;
+        this.setState({
+            tableData
+        })
+    }
+
     render() {
-        const { columns, rowSelection } = this.props;
-        const { page, size } = this.props.formData;
+        const { columns, rowSelection, showPagination = true } = this.props;
+        const { page, size, } = this.props.formData;
         return (
             <div className="table-view-main">
                 <Table
@@ -96,7 +118,7 @@
                     dataSource={this.state.tableData}
                     loading={{ spinning: this.state.loading }}
                     columns={columns}
-                    pagination={{
+                    pagination={showPagination ? {
                         pageSize: Number(size),
                         onChange: this.pageChange,
                         total: this.state.totalElements,
@@ -107,7 +129,7 @@
                         showQuickJumper: true,
                         defaultCurrent: 1,
                         current: Number(page),
-                    }} />
+                    } : false} />
             </div>
         )
     }
diff --git a/src/components/oa/logManage/browseLog/index.jsx b/src/components/oa/logManage/browseLog/index.jsx
index d7c38c3..4f8351a 100644
--- a/src/components/oa/logManage/browseLog/index.jsx
+++ b/src/components/oa/logManage/browseLog/index.jsx
@@ -70,7 +70,6 @@
     ];
   }
 
-
   fontNumber(date) {
     const length = date.length
     if (length > 16) {
diff --git a/src/components/oa/merits/meritsDetail/index.jsx b/src/components/oa/merits/meritsDetail/index.jsx
new file mode 100644
index 0000000..210cf34
--- /dev/null
+++ b/src/components/oa/merits/meritsDetail/index.jsx
@@ -0,0 +1,145 @@
+/* eslint-disable */
+/**liuwh
+ * 5/29/2020, 10:38:14 AM
+ * doc comment for the file goes here
+ */
+
+/** 绩效详情 */
+import React, { ReactNode, ReactEventHandler, Component } from 'react';
+import TableView from '../../../common/TableView';
+import { Row, Col, Button, InputNumber, message } from 'antd';
+import { createHashHistory } from 'history';
+import './index.scss';
+const history = createHashHistory();
+import fetch from '../../../../api/request';
+
+
+export default class MeritsDetail extends Component {
+  constructor(props) {
+    super(props);
+    this.config = {
+    };
+    this.state = {
+      formData: {
+        __key: Date.now(),
+        ...this.props.match.params
+      },
+
+    };
+  }
+
+  componentDidMount() { }
+
+  setFormData = data => {
+    console.log('form', data);
+    this.setState({
+      formData: data,
+    });
+  }
+
+  // 保存操作
+  onSave = (item) => {
+    console.log('item', item);
+    let { id , meritsGrade} = item;
+    fetch({
+      url: `api/merits/assess/modifyGrade`,
+      params: {
+        id,
+        meritsGrade
+      }
+    }).then( res=> {
+      if(res) {
+        message.success('保存成功');
+        this.setState({
+          formData: {
+            ...this.state.formData,
+            __key: Date.now()
+          }
+        })
+      }
+    })
+
+  }
+
+  renderColumns = () => {
+    return [
+      { title: '编号', dataIndex: 'id', width: '3%' },
+      { title: '评分项目', dataIndex: 'scoreItems', width: '6%' },
+      { title: '评分目标', dataIndex: 'scoreTarget', width: '10%' },
+      {
+        title: '定义与标准', dataIndex: 'standard', width: '25%', render: (cur, item) => {
+          return <div dangerouslySetInnerHTML={{
+            __html: cur.replace(/\n/g, "<br/>")
+          }}></div>
+        }
+      },
+      {
+        title: '系统取数指标', dataIndex: 'systemStandard', width: '10%', render: (cur, item) => {
+          return <div dangerouslySetInnerHTML={{
+            __html: cur.replace(/\n/g, "<br/>")
+          }}></div>
+        }
+      },
+      { title: '数据来源', dataIndex: 'dataSources', width: '8%' },
+      { title: '取值范围', dataIndex: 'valueRange', width: '5%' },
+      {
+        title: '计算方式', dataIndex: 'countMethod', width: '8%', render: (cur, item) => {
+          return <div dangerouslySetInnerHTML={{
+            __html: cur.replace(/\n/g, "<br/>")
+          }}></div>
+        }
+      },
+      {
+        title: '权重(%)', dataIndex: 'weight', width: '6%'
+      },
+      {
+        title: '配分(分)', dataIndex: 'allotment', width: '6%'
+      },
+      {
+        title: '考评得分(分)', dataIndex: 'meritsGrade', width: '6%', render: (cur, item, index) => {
+          return <InputNumber size="small" min={0}
+            max={100} formatter={cur => `${cur}分`} parser={value => value.replace('分', '')} value={cur || 0} onChange={(value) => {
+              item['meritsGrade'] = value;
+              this.refs['table-view'].onSetDataSource({ index, data: item })
+            }} />
+        }
+      },
+      {
+        title: '操作', dataIndex: 'operation', width: '10%', render: (cur, item) => {
+          return <a onClick={() => { this.onSave(item) }}>保存</a>
+        }
+      }
+
+    ];
+  }
+
+  onBack = () => {
+    history.goBack();
+  }
+
+  render() {
+    const { formData } = this.state;
+
+    let tableParams = {
+      url: `api/merits/assess/findMeritsDetail`,
+      formData,
+      key: formData.__key,
+      columns: this.renderColumns(),
+      extraFromData: {},
+      setFormData: this.setFormData,
+      showPagination: false
+    }
+
+    return (
+      <div className="merits-detail-main">
+        <h2>2020年4月绩效评分表(初级研发工程师)</h2>
+        <TableView {...tableParams} ref="table-view" />
+        <Row className="margin-top">
+          <Col>
+            <Button onClick={this.onBack}>返回</Button>
+          </Col>
+        </Row>
+      </div>
+    )
+  }
+}
diff --git a/src/components/oa/merits/meritsDetail/index.scss b/src/components/oa/merits/meritsDetail/index.scss
new file mode 100644
index 0000000..9c192c6
--- /dev/null
+++ b/src/components/oa/merits/meritsDetail/index.scss
@@ -0,0 +1,17 @@
+/* eslint-disable */
+/**liuwh
+ * 5/29/2020, 10:38:14 AM
+ * doc comment for the file goes here
+ */
+
+/** Happy Coding */
+.merits-detail {
+  &-main {
+    background: #fff;
+    margin: 20px;
+    padding: 20px;
+    & .ant-table-tbody {
+      font-size: 12px !important;
+    }
+  }
+}
diff --git a/src/components/oa/merits/meritsDispose/index.jsx b/src/components/oa/merits/meritsDispose/index.jsx
new file mode 100644
index 0000000..847687e
--- /dev/null
+++ b/src/components/oa/merits/meritsDispose/index.jsx
@@ -0,0 +1,219 @@
+/* eslint-disable */
+/**liuwh
+ * 5/29/2020, 11:49:58 AM
+ * doc comment for the file goes here
+ */
+
+/** 绩效指标 */
+import React, { ReactNode, ReactEventHandler, Component } from 'react';
+import { Input, Row, InputNumber, Tag, Popconfirm, Divider, message } from 'antd';
+import TableView from '../../../common/TableView';
+import SearchFormView from '../../../common/SearchFormView';
+import fetch from '../../../../api/request'
+
+import './index.scss';
+
+export default class MeritsDispose extends Component {
+  constructor(props) {
+    super(props);
+    this.config = {
+    };
+    this.state = {
+      formData: {
+        __key: Date.now(),
+      },
+      selectData: null,//岗位下拉
+    };
+  }
+
+  componentWillMount() { }
+
+  componentDidMount() {
+
+    fetch({
+      url: `api/merits/index/queryMeritsPost`,
+    }).then(res => {
+      console.log('res', res);
+      if (res) {
+        this.setState({
+          selectData: res.map(({ name, id }) => ({ name, value: id })),
+          formData: {
+            ...this.state.formData,
+            meritsPostId: res[0].id
+          }
+        })
+      }
+    })
+  }
+
+  setFormData = data => {
+    console.log('form', data);
+    this.setState({
+      formData: data,
+    });
+  }
+
+  // 启用/禁用功能
+  openCloseIndex = (item) => {
+    let { selectData } = this.state;
+    let { validStatus, meritsPostRelationId, meritsPostId, id } = item;
+    fetch({
+      url: `api/merits/index/openCloseIndex/${!validStatus}`,
+      method: 'POST',
+      data: {
+        ...item,
+        id: meritsPostRelationId,
+        validStatus: !validStatus ? 1 : 2,
+        meritsIndexId: id,
+        meritsPostName: selectData.find(({ value }) => value == meritsPostId).name
+      }
+    }).then(res => {
+      console.log('res', res);
+      if (res) {
+        message.success(validStatus ? '禁用成功' : '启用成功');
+        this.setState({
+          formData: {
+            ...this.state.formData,
+            __key: Date.now()
+          }
+        })
+      }
+    })
+  }
+
+  // 保存处于启用状态的的设置值
+  saveOpenIndex = (item) => {
+    let { selectData } = this.state;
+
+    let { validStatus, meritsPostRelationId, meritsPostId, id } = item;
+    fetch({
+      url: `api/merits/index/openCloseIndex/${validStatus}`,
+      method: 'POST',
+      data: {
+        ...item,
+        id: meritsPostRelationId,
+        validStatus: validStatus ? 1 : 2,
+        meritsIndexId: id,
+        meritsPostName: selectData.find(({ value }) => value == meritsPostId).name
+      }
+    }).then(res => {
+      console.log('res', res);
+      if (res) {
+        message.success('保存成功');
+        this.setState({
+          formData: {
+            ...this.state.formData,
+            __key: Date.now()
+          }
+        })
+      }
+    })
+  }
+
+  renderColumns = () => {
+    return [
+      { title: '编号', dataIndex: 'id', width: '3%' },
+      { title: '评分项目', dataIndex: 'scoreItems', width: '6%' },
+      { title: '评分目标', dataIndex: 'scoreTarget', width: '10%' },
+      {
+        title: '定义与标准', dataIndex: 'standard', width: '25%', render: (cur, item) => {
+          return <div dangerouslySetInnerHTML={{
+            __html: cur.replace(/\n/g, "<br/>")
+          }}></div>
+        }
+      },
+      {
+        title: '系统取数指标', dataIndex: 'systemStandard', width: '10%', render: (cur, item) => {
+          return <div dangerouslySetInnerHTML={{
+            __html: cur.replace(/\n/g, "<br/>")
+          }}></div>
+        }
+      },
+      { title: '数据来源', dataIndex: 'dataSources', width: '8%' },
+      { title: '取值范围', dataIndex: 'valueRange', width: '5%' },
+      {
+        title: '计算方式', dataIndex: 'countMethod', width: '8%', render: (cur, item) => {
+          return <div dangerouslySetInnerHTML={{
+            __html: cur.replace(/\n/g, "<br/>")
+          }}></div>
+        }
+      },
+      {
+        title: '权重(%)', dataIndex: 'weight', width: '6%', render: (cur, item, index) => {
+          return <InputNumber size="small" min={0} disabled={item.validStatus ? false : true}
+            max={100} formatter={cur => `${cur}%`} parser={value => value.replace('%', '')} value={cur || 0} onChange={(value) => {
+              item['weight'] = value;
+              this.refs['table-view'].onSetDataSource({ index, data: item })
+            }} />
+        }
+      },
+      {
+        title: '配分(分)', dataIndex: 'allotment', width: '6%', render: (cur, item, index) => {
+          return <InputNumber size="small" min={0} disabled={item.validStatus ? false : true}
+            max={100} formatter={cur => `${cur}分`} parser={value => value.replace('分', '')} value={cur || 0} onChange={(value) => {
+              item['allotment'] = value;
+              this.refs['table-view'].onSetDataSource({ index, data: item })
+            }} />
+        }
+      },
+      {
+        title: '操作', dataIndex: 'operation', width: '10%', render: (cur, item) => {
+          return <Row>
+            {/* 有效状态 */}
+
+            {item.validStatus && <Popconfirm placement="topRight" title={'您确定要禁用吗?'} onConfirm={() => {
+              this.openCloseIndex(item);
+            }} okText="是" cancelText="否">
+              <Tag>禁用</Tag>
+            </Popconfirm>}
+            {!item.validStatus && <Popconfirm placement="topRight" title={'您确定要启用吗?'} onConfirm={() => {
+              this.openCloseIndex(item);
+            }} okText="是" cancelText="否">
+              <Tag color="#58bc58">启用</Tag>
+            </Popconfirm>}
+
+            {/* 待启用状态--保存功能 */}
+            {item.validStatus && <React.Fragment>
+              <Divider type="vertical" />
+              <a onClick={() => {
+                this.saveOpenIndex(item)
+              }}>保存</a>
+            </React.Fragment>}
+
+          </Row>
+        }
+      },
+    ];
+  }
+
+  render() {
+    const { formData, selectData } = this.state;
+    let tableParams = {
+      url: `api/merits/index/queryMeritsIndex`,
+      formData,
+      key: formData.__key,
+      columns: this.renderColumns(),
+      extraFromData: {},
+      setFormData: this.setFormData,
+      showPagination: false,
+    }
+
+    return (
+      <div className="merits-dispose-main">
+        {
+          selectData &&
+          <React.Fragment>
+            <SearchFormView
+              formData={formData}
+              setFormData={this.setFormData}
+              showReset={false}
+              data={[
+                { type: 'select', name: '岗位', label: '岗位', key: 'meritsPostId', list: selectData, },
+              ]} />
+            <TableView {...tableParams} ref={'table-view'} />
+          </React.Fragment>
+        }
+      </div>
+    )
+  }
+}
diff --git a/src/components/oa/merits/meritsDispose/index.scss b/src/components/oa/merits/meritsDispose/index.scss
new file mode 100644
index 0000000..abc3b10
--- /dev/null
+++ b/src/components/oa/merits/meritsDispose/index.scss
@@ -0,0 +1,20 @@
+/* eslint-disable */
+/**liuwh
+ * 5/29/2020, 11:49:58 AM
+ * doc comment for the file goes here
+ */
+
+/** Happy Coding */
+.merits-dispose {
+  &-main {
+    background: #fff;
+    margin: 20px;
+    padding: 20px;
+    & .ant-table-tbody {
+      font-size: 12px !important;
+    }
+    & .ant-tag {
+      cursor: pointer;
+    }
+  }
+}
diff --git a/src/components/oa/merits/meritsExamine/index.jsx b/src/components/oa/merits/meritsExamine/index.jsx
new file mode 100644
index 0000000..09e234c
--- /dev/null
+++ b/src/components/oa/merits/meritsExamine/index.jsx
@@ -0,0 +1,92 @@
+/* eslint-disable */
+/**liuwh
+ * 5/29/2020, 2:34:37 PM
+ * doc comment for the file goes here
+ */
+
+/** Happy Coding */
+import React, { ReactNode, ReactEventHandler, Component } from 'react';
+import { Input } from 'antd';
+import TableView from '../../../common/TableView';
+import SearchFormView from '../../../common/SearchFormView';
+import './index.scss';
+
+
+export default class MeritsExamine extends Component {
+  constructor(props) {
+    super(props);
+    this.config = {
+    };
+    this.state = {
+      formData: {
+        __key: Date.now(),
+        page: 1,
+        size: 10,
+        keyWord: ''
+      },
+    };
+  }
+
+  componentWillMount() { }
+
+  componentDidMount() { }
+
+  setFormData = data => {
+    console.log('form', data);
+    this.setState({
+      formData: data,
+    });
+  }
+
+  renderColumns = () => {
+    return [
+      { title: '序号', dataIndex: 'index' },
+      { title: '评分项目', dataIndex: 'name' },
+      { title: '评分目标', dataIndex: 'bumen' },
+      { title: '定义与标准', dataIndex: 'gangwei' },
+      { title: '系统取数指标', dataIndex: 'month' },
+      { title: '数据来源', dataIndex: 'renwu' },
+      { title: '取值范围', dataIndex: 'quexian' },
+      { title: '计算方式', dataIndex: 'score' },
+      {
+        title: '权重', dataIndex: 'quanzhogn', width: '10%', render: (cur, item, index) => {
+          return <Input size="small" onChange={() => {
+            console.log(this.refs);
+            this.refs['table-view'].onSetDataSource({ index, data: item })
+          }} />
+        }
+      },
+      {
+        title: '配分', dataIndex: 'peifen', width: '10%', render: (cur, item) => {
+          return <Input size="small" />
+        }
+      },
+      {
+        title: '操作', dataIndex: 'operation', render: (cur, item, ) => {
+          return null
+        }
+      },
+    ];
+  }
+
+  render() {
+    const { formData } = this.state;
+    let tableParams = {
+      url: `api/log/queryLog`,
+      formData,
+      key: formData.__key,
+      columns: this.renderColumns(),
+      extraFromData: {
+        logType: '1',
+      },
+      setFormData: this.setFormData,
+      showPagination: false,
+    }
+
+    return (
+      <div className="merits-examine-main">
+        <TableView {...tableParams} ref={'table-view'} />
+      </div>
+    )
+  }
+}
diff --git a/src/components/oa/merits/meritsExamine/index.scss b/src/components/oa/merits/meritsExamine/index.scss
new file mode 100644
index 0000000..a56e308
--- /dev/null
+++ b/src/components/oa/merits/meritsExamine/index.scss
@@ -0,0 +1,14 @@
+/* eslint-disable */
+/**liuwh
+ * 5/29/2020, 2:34:37 PM
+ * doc comment for the file goes here
+ */
+
+/** Happy Coding */
+.merits-examine {
+  &-main {
+    background: #fff;
+    margin: 20px;
+    padding: 20px;
+  }
+}
diff --git a/src/components/oa/merits/meritsOverview/index.jsx b/src/components/oa/merits/meritsOverview/index.jsx
new file mode 100644
index 0000000..20bd6b4
--- /dev/null
+++ b/src/components/oa/merits/meritsOverview/index.jsx
@@ -0,0 +1,104 @@
+/* eslint-disable */
+/**liuwh
+ * 5/29/2020, 9:55:19 AM
+ * doc comment for the file goes here
+ */
+
+/** 绩效总览 */
+import React, { ReactNode, ReactEventHandler, Component } from 'react';
+import { Row, Col, Divider } from 'antd';
+import TableView from '../../../common/TableView';
+import SearchFormView from '../../../common/SearchFormView';
+import { createHashHistory } from 'history';
+import fetch from '../../../../api/request';
+import './index.scss';
+
+const history = createHashHistory();
+
+export default class MeritsOverview extends Component {
+  constructor(props) {
+    super(props);
+    this.config = {
+    };
+    this.state = {
+      formData: {
+        __key: Date.now(),
+        page: 1,
+        size: 10,
+        keyWord: ''
+      },
+    };
+  }
+
+  componentDidMount() {
+
+
+  }
+
+  setFormData = data => {
+    console.log('form', data);
+    this.setState({
+      formData: data,
+    });
+  }
+
+  linkDetail = (item) => {
+    let { userId, countMonth } = item;
+    history.push(`/merits/meritsOverview/meritsDetail/${userId}/${countMonth}`)
+  }
+
+  renderColumns = () => {
+    return [
+      { title: '序号', dataIndex: 'index' },
+      { title: '姓名', dataIndex: 'userName' },
+      { title: '部门', dataIndex: 'userDeptName' },
+      { title: '岗位', dataIndex: 'meritsPostName' },
+      { title: '考评月份', dataIndex: 'countMonth' },
+      { title: '总任务数', dataIndex: 'taskNumber' },
+      { title: '总缺陷数', dataIndex: 'defectNumber' },
+      { title: '考评得分(分)', dataIndex: 'meritsGrade' },
+      {
+        title: '操作', dataIndex: 'operation', render: (cur, item) => {
+          return <Row>
+            <a onClick={() => this.linkDetail(item)}>详情</a>
+          </Row>
+        }
+      },
+    ];
+  }
+
+
+
+  render() {
+    const { formData } = this.state;
+
+    let tableParams = {
+      url: `api/merits/assess/queryMerits`,
+      formData,
+      key: formData.__key,
+      columns: this.renderColumns(),
+      extraFromData: {},
+      setFormData: this.setFormData
+    }
+    return (
+      <div className="merits-overview-main">
+        <SearchFormView
+          formData={formData}
+          setFormData={this.setFormData}
+          data={[
+            { type: 'select', name: '部门', label: '部门', key: 'bumen', list: [{ name: '1', value: '部门1' }, { name: '2', value: '部门2' }], },
+            { type: 'select', name: '岗位', label: '岗位', key: 'gangwei', list: [{ name: '1', value: '岗位1' }, { name: '2', value: '岗位2' }], },
+            { type: 'input', name: '姓名', label: '姓名', key: 'name' },
+            {
+              type: 'monthPicker',
+              label: '考评月份',
+              name: '考评月份',
+              key: 'kpyf',
+            },
+          ]} />
+        <TableView {...tableParams} />
+      </div>
+    )
+  }
+}
+
diff --git a/src/components/oa/merits/meritsOverview/index.scss b/src/components/oa/merits/meritsOverview/index.scss
new file mode 100644
index 0000000..8d34cda
--- /dev/null
+++ b/src/components/oa/merits/meritsOverview/index.scss
@@ -0,0 +1,14 @@
+/* eslint-disable */
+/**liuwh
+ * 5/29/2020, 9:55:19 AM
+ * doc comment for the file goes here
+ */
+
+/** Happy Coding */
+.merits-overview {
+  &-main {
+    background: #fff;
+    margin: 20px;
+    padding: 20px;
+  }
+}
diff --git a/src/index.css b/src/index.css
index 07d27b8..f7df747 100644
--- a/src/index.css
+++ b/src/index.css
@@ -54,6 +54,9 @@
   margin: 20px 0 !important;
 }
 
+.margin-top{
+  margin-top: 20px;
+}
 .margin-bottom{
   margin-bottom: 20px;
 }
@@ -64,10 +67,6 @@
 
 .ant-divider-horizontal{
   margin: 20px 0 !important;
-}
-
-.margin-bottom{
-  margin-bottom: 20px;
 }
 
 .ant-card-head-title{
diff --git a/src/index.js b/src/index.js
index 642bba7..167584b 100644
--- a/src/index.js
+++ b/src/index.js
@@ -22,6 +22,7 @@
 // oa路由映射
 import OaRouteDom from './routeDom/oaRouteDom';
 import UserRouteDom from './routeDom/userRouteDom';
+import { oaMenus, userMenus } from './menu';
 
 export const Context = React.createContext();
 
@@ -42,9 +43,12 @@
 
   componentDidMount() {
     let pathname = history.location.pathname;
+    console.log(history, pathname);
     let menusListByRole = window.localStorage.getItem('menusListByRole')
       ? JSON.parse(window.localStorage.getItem('menusListByRole'))
       : [];
+
+    // let menuMap = { oa: { menus: oaMenus }, user: { menus: userMenus } };
 
     let role = Object.keys(menusListByRole)
       .reduce((p, n) => {
@@ -73,6 +77,18 @@
         role,
       },
     });
+
+    if (!role && menusListByRole.length == 0) {
+      history.push('/login');
+    }
+    if (!role && window.localStorage.getItem('role')) {
+      this.setState({
+        context: {
+          ...this.state.context,
+          role: window.localStorage.getItem('role'),
+        },
+      });
+    }
   }
 
   setContext = (data) => {
@@ -83,6 +99,7 @@
         ...data,
       }, //更新context
     });
+    window.localStorage.setItem('role', data.role || '');
   };
 
   render() {
@@ -109,9 +126,14 @@
                 </Switch>
                 <Layout>
                   <Content>
-                    <Route path="/login" component={()=>( <Login setContext={this.setContext}/>)} />
-                    {context.role == 'oa' && <OaRouteDom />}
-                    {context.role == 'user' && <UserRouteDom />}
+                    <Switch>
+                      <Route
+                        path="/login"
+                        component={() => <Login setContext={this.setContext} />}
+                      />
+                      {context.role == 'oa' && <OaRouteDom />}
+                      {context.role == 'user' && <UserRouteDom />}
+                    </Switch>
                   </Content>
                 </Layout>
               </Layout>
diff --git a/src/menu/index.js b/src/menu/index.js
index 452d5ae..a0dd13b 100644
--- a/src/menu/index.js
+++ b/src/menu/index.js
@@ -1,3 +1,3 @@
 export { default as oaMenus } from './menu.oa';
 export { default as userMenus } from './menu.user';
-export { default as getMenuListByPermission } from './menu.permission';
\ No newline at end of file
+export { default as getMenuListByPermission } from './menu.permission';
diff --git a/src/menu/menu.oa.js b/src/menu/menu.oa.js
index 6838ce9..0fcf654 100644
--- a/src/menu/menu.oa.js
+++ b/src/menu/menu.oa.js
@@ -175,12 +175,12 @@
       },
       {
         key: '/merits/meritsDispose',
-        name: '参数配置',
+        name: '绩效指标',
         path: '/merits/meritsDispose',
         permKey: '/merits/meritsDispose',
         children: [],
         parentKey: 'merits',
-      },
+      }
     ],
   },
 ];
diff --git a/src/module/login/login.jsx b/src/module/login/login.jsx
index 591d4c7..c8b24b2 100644
--- a/src/module/login/login.jsx
+++ b/src/module/login/login.jsx
@@ -27,7 +27,7 @@
     };
   }
   componentWillMount() {
-    document.title = '恒巨信息OA-用户登录'
+    document.title = '恒巨信息OA-用户登录';
   }
 
   handleSubmit = e => {
diff --git a/src/module/oa/merits/meritsDetail.jsx b/src/module/oa/merits/meritsDetail.jsx
new file mode 100644
index 0000000..75da704
--- /dev/null
+++ b/src/module/oa/merits/meritsDetail.jsx
@@ -0,0 +1,33 @@
+/* eslint-disable */
+/**liuwh
+ * 5/29/2020, 10:36:57 AM
+ * doc comment for the file goes here
+ */
+
+/** 绩效详情 */
+import React, { ReactNode, ReactEventHandler, Component } from 'react';
+import MeritsDetailPage from '../../../components/oa/merits/meritsDetail';
+
+export default class MeritsDetail extends Component {
+  constructor(props) {
+    super(props);
+    this.config = {
+    };
+    this.state = {
+    };
+  }
+
+  componentWillMount() { }
+
+  componentDidMount() { }
+
+  componentDidShow() { }
+
+  render() {
+    return (
+      <div className="merits-detail-page-main">
+        <MeritsDetailPage  {...this.props} />
+      </div>
+    )
+  }
+}
diff --git a/src/module/oa/merits/meritsDispose.jsx b/src/module/oa/merits/meritsDispose.jsx
new file mode 100644
index 0000000..91e60c4
--- /dev/null
+++ b/src/module/oa/merits/meritsDispose.jsx
@@ -0,0 +1,34 @@
+/* eslint-disable */
+/**liuwh
+ * 5/29/2020, 11:49:16 AM
+ * doc comment for the file goes here
+ */
+
+/** 绩效指标 */
+import React, { ReactNode, ReactEventHandler, Component } from 'react';
+import MeritsDisposePage from '../../../components/oa/merits/meritsDispose';
+
+export default class MeritsDispose extends Component {
+  constructor(props) {
+    super(props);
+    this.config = {
+    };
+    this.state = {
+    };
+  }
+
+  componentWillMount() { }
+
+  componentDidMount() { }
+
+  componentDidShow() { }
+
+  render() {
+    return (
+      <div className="merits-dispose-page-main">
+        <MeritsDisposePage />
+      </div>
+    )
+  }
+}
+
diff --git a/src/module/oa/merits/meritsExamine.jsx b/src/module/oa/merits/meritsExamine.jsx
new file mode 100644
index 0000000..eb7aa11
--- /dev/null
+++ b/src/module/oa/merits/meritsExamine.jsx
@@ -0,0 +1,33 @@
+/* eslint-disable */
+/**liuwh
+ * 5/29/2020, 2:33:47 PM
+ * doc comment for the file goes here
+ */
+
+/** 绩效考核 */
+import React, { ReactNode, ReactEventHandler, Component } from 'react';
+import MeritsExaminePage from '../../../components/oa/merits/meritsExamine';
+
+export default class MeritsExamine extends Component {
+  constructor(props) {
+    super(props);
+    this.config = {
+    };
+    this.state = {
+    };
+  }
+
+  componentWillMount() { }
+
+  componentDidMount() { }
+
+  componentDidShow() { }
+
+  render() {
+    return (
+      <div className="merits-examine-page-main">
+        <MeritsExaminePage />
+      </div>
+    )
+  }
+}
diff --git a/src/module/oa/merits/meritsOverview.jsx b/src/module/oa/merits/meritsOverview.jsx
new file mode 100644
index 0000000..5ce3c22
--- /dev/null
+++ b/src/module/oa/merits/meritsOverview.jsx
@@ -0,0 +1,33 @@
+/* eslint-disable */
+/**liuwh
+ * 5/29/2020, 9:58:58 AM
+ * doc comment for the file goes here
+ */
+
+/** Happy Coding */
+import React, { ReactNode, ReactEventHandler, Component } from 'react';
+import MeritsOverviewPage from '../../../components/oa/merits/meritsOverview';//绩效总览
+
+export default class MeritsOverview extends Component {
+  constructor(props) {
+    super(props);
+    this.config = {
+    };
+    this.state = {
+    };
+  }
+
+  componentWillMount() { }
+
+  componentDidMount() { }
+
+  componentDidShow() { }
+
+  render() {
+    return (
+      <div className="merits-overview-page-main">
+        <MeritsOverviewPage />
+      </div>
+    )
+  }
+}
diff --git a/src/routeDom/oaRouteDom.jsx b/src/routeDom/oaRouteDom.jsx
index 2d3a957..eff360c 100644
--- a/src/routeDom/oaRouteDom.jsx
+++ b/src/routeDom/oaRouteDom.jsx
@@ -20,6 +20,10 @@
 import Rawler from '../module/oa/logManage/Rawler'; //爬虫词条管理
 import Information from '../module/oa/personal/information'; //个人信息
 import UserManage from '../components/oa/basicConfig/UserManage'; //用户管理
+import MeritsOverview from '../module/oa/merits/meritsOverview';//绩效管理--绩效总览
+import MeritsDetail from '../module/oa/merits/meritsDetail';//绩效管理--绩效详情
+import MeritsDispose from '../module/oa/merits/meritsDispose';//绩效管理--绩效指标
+import MeritsExamine from '../module/oa/merits/meritsExamine';//绩效管理--绩效考核
 
 export default function OaRouteDom({ }) {
   return (<Switch>
@@ -33,6 +37,12 @@
     <Route path="/logManage/operLog" component={OperLog} />
     <Route path="/logManage/rawler" component={Rawler} />
     <Route path="/personal/information" component={Information} />
+    <Route path="/merits/meritsOverview/meritsDetail/:userId/:meritsMonth" component={MeritsDetail} />
+    <Route path="/merits/meritsOverview" component={MeritsOverview} />
+    <Route path="/merits/meritsDispose" component={MeritsDispose} />
+    <Route path="/merits/meritsExamine" component={MeritsExamine} />
+
+
     {/* <Route path="/" component={Workbench} /> */}
     <Redirect from="/" to="/index" component={Workbench} />
   </Switch>

--
Gitblit v1.8.0