forked from huge/frontEnd/hugeOA

Mr Ke
2020-05-29 a4f102defd2c7918617717f3307b6a3ef63859ff
绩效总览 (列表、详情)、绩效指标 (配置)
13 files added
12 files modified
1416 ■■■■■ changed files
report.20200529.103416.21856.0.001.json 483 ●●●●● patch | view | raw | blame | history
src/api/httpurl.js 2 ●●● patch | view | raw | blame | history
src/api/request.js 7 ●●●●● patch | view | raw | blame | history
src/components/common/HeadView/index.jsx 1 ●●●● patch | view | raw | blame | history
src/components/common/SearchFormView/index.jsx 55 ●●●● patch | view | raw | blame | history
src/components/common/TableView/index.jsx 56 ●●●●● patch | view | raw | blame | history
src/components/oa/logManage/browseLog/index.jsx 1 ●●●● patch | view | raw | blame | history
src/components/oa/merits/meritsDetail/index.jsx 145 ●●●●● patch | view | raw | blame | history
src/components/oa/merits/meritsDetail/index.scss 17 ●●●●● patch | view | raw | blame | history
src/components/oa/merits/meritsDispose/index.jsx 219 ●●●●● patch | view | raw | blame | history
src/components/oa/merits/meritsDispose/index.scss 20 ●●●●● patch | view | raw | blame | history
src/components/oa/merits/meritsExamine/index.jsx 92 ●●●●● patch | view | raw | blame | history
src/components/oa/merits/meritsExamine/index.scss 14 ●●●●● patch | view | raw | blame | history
src/components/oa/merits/meritsOverview/index.jsx 104 ●●●●● patch | view | raw | blame | history
src/components/oa/merits/meritsOverview/index.scss 14 ●●●●● patch | view | raw | blame | history
src/index.css 7 ●●●●● patch | view | raw | blame | history
src/index.js 28 ●●●● patch | view | raw | blame | history
src/menu/index.js 2 ●●● patch | view | raw | blame | history
src/menu/menu.oa.js 4 ●●●● patch | view | raw | blame | history
src/module/login/login.jsx 2 ●●● patch | view | raw | blame | history
src/module/oa/merits/meritsDetail.jsx 33 ●●●●● patch | view | raw | blame | history
src/module/oa/merits/meritsDispose.jsx 34 ●●●●● patch | view | raw | blame | history
src/module/oa/merits/meritsExamine.jsx 33 ●●●●● patch | view | raw | blame | history
src/module/oa/merits/meritsOverview.jsx 33 ●●●●● patch | view | raw | blame | history
src/routeDom/oaRouteDom.jsx 10 ●●●●● patch | view | raw | blame | history
report.20200529.103416.21856.0.001.json
New file
@@ -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"
  ]
}
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";
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');
    });
}
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';
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>
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>
        )
    }
src/components/oa/logManage/browseLog/index.jsx
@@ -70,7 +70,6 @@
    ];
  }
  fontNumber(date) {
    const length = date.length
    if (length > 16) {
src/components/oa/merits/meritsDetail/index.jsx
New file
@@ -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>
    )
  }
}
src/components/oa/merits/meritsDetail/index.scss
New file
@@ -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;
    }
  }
}
src/components/oa/merits/meritsDispose/index.jsx
New file
@@ -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>
    )
  }
}
src/components/oa/merits/meritsDispose/index.scss
New file
@@ -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;
    }
  }
}
src/components/oa/merits/meritsExamine/index.jsx
New file
@@ -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>
    )
  }
}
src/components/oa/merits/meritsExamine/index.scss
New file
@@ -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;
  }
}
src/components/oa/merits/meritsOverview/index.jsx
New file
@@ -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>
    )
  }
}
src/components/oa/merits/meritsOverview/index.scss
New file
@@ -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;
  }
}
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{
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>
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';
export { default as getMenuListByPermission } from './menu.permission';
src/menu/menu.oa.js
@@ -175,12 +175,12 @@
      },
      {
        key: '/merits/meritsDispose',
        name: '参数配置',
        name: '绩效指标',
        path: '/merits/meritsDispose',
        permKey: '/merits/meritsDispose',
        children: [],
        parentKey: 'merits',
      },
      }
    ],
  },
];
src/module/login/login.jsx
@@ -27,7 +27,7 @@
    };
  }
  componentWillMount() {
    document.title = '恒巨信息OA-用户登录'
    document.title = '恒巨信息OA-用户登录';
  }
  handleSubmit = e => {
src/module/oa/merits/meritsDetail.jsx
New file
@@ -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>
    )
  }
}
src/module/oa/merits/meritsDispose.jsx
New file
@@ -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>
    )
  }
}
src/module/oa/merits/meritsExamine.jsx
New file
@@ -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>
    )
  }
}
src/module/oa/merits/meritsOverview.jsx
New file
@@ -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>
    )
  }
}
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>