Просмотр исходного кода

绩效考核,批量录入结果值,考核明细流程节点样式修改,考核指标表格中修改内容

manywhy 4 месяцев назад
Родитель
Сommit
18d63680fb
79 измененных файлов с 14157 добавлено и 3498 удалено
  1. 20 0
      babel.config.js
  2. 2 3
      build/webpack.prod.conf.js
  3. 0 10
      config/index.js
  4. BIN
      dist.rar
  5. BIN
      gdy_pc_8.rar
  6. 7 4
      package.json
  7. 36 11
      src/App.vue
  8. 1 1
      src/components/LoadingAll.vue
  9. 6 6
      src/components/PageHead.vue
  10. 3 2
      src/components/PageHeadTwo.vue
  11. 1 1
      src/components/organization/Post.vue
  12. 5 7
      src/index.vue
  13. 21 1
      src/main.js
  14. 16 6
      src/okr/components/TargetDetail/Evolve.vue
  15. 49 23
      src/okr/components/TargetDetail/Interaction.vue
  16. 45 22
      src/okr/components/TargetDetail/Replay.vue
  17. 704 521
      src/okr/components/public/TargetDetail.vue
  18. 9 5
      src/okr/components/public/TargetSearch.vue
  19. 83 29
      src/okr/components/public/TargetType.vue
  20. 198 169
      src/okr/components/public/TaskDetail.vue
  21. 193 154
      src/okr/components/public/TaskItem.vue
  22. 2 2
      src/okr/utils/auth.js
  23. 120 105
      src/okr/views/okrIndex.vue
  24. 48 39
      src/okr/views/targetMt/myTargert.vue
  25. 2 2
      src/okr/views/targetSet/JurisdictionSet.vue
  26. 4 3
      src/performance/components/assessManage/SelectAttendanceGroup.vue
  27. 225 51
      src/performance/components/evaluate/BasicMessage.vue
  28. 60 40
      src/performance/components/evaluate/Flow.vue
  29. 1478 0
      src/performance/components/evaluate/Template copy.vue
  30. 422 234
      src/performance/components/evaluate/Template.vue
  31. 3 3
      src/performance/components/public/ActionPlan.vue
  32. 1 1
      src/performance/components/public/ClassSet.vue
  33. 1 1
      src/performance/components/public/TesultType.vue
  34. 7 3
      src/performance/components/public/TrackManagement.vue
  35. 578 0
      src/performance/views/assessManagement/TargetListComp copy.vue
  36. 911 0
      src/performance/views/assessManagement/TargetListComp.vue
  37. 497 0
      src/performance/views/assessManagement/TargetSearch.vue
  38. 216 213
      src/performance/views/assessManagement/assessDetails.vue
  39. 151 0
      src/performance/views/assessManagement/assessManagement copy.vue
  40. 1299 87
      src/performance/views/assessManagement/assessManagement.vue
  41. 20 6
      src/performance/views/assessManagement/careOf.vue
  42. 39 31
      src/performance/views/assessManagement/classDtail.vue
  43. 72 33
      src/performance/views/assessManagement/evaluateSet.vue
  44. 39 43
      src/performance/views/assessManagement/sponsor/sponsorAssess.vue
  45. 2619 0
      src/performance/views/assessManagement/staffAssDet copy.vue
  46. 330 225
      src/performance/views/assessManagement/staffAssDet.vue
  47. 2 2
      src/performance/views/assessManagement/updateTarget.vue
  48. 33 31
      src/performance/views/evaluate/evaluate.vue
  49. 6 6
      src/performance/views/job/job.vue
  50. 262 103
      src/performance/views/myPerformance/adjustment.vue
  51. 205 107
      src/performance/views/myPerformance/adjustment2.vue
  52. 237 88
      src/performance/views/myPerformance/formulate.vue
  53. 4 6
      src/performance/views/myPerformance/myPerformance.vue
  54. 404 299
      src/performance/views/myPerformance/resultSet.vue
  55. 473 269
      src/performance/views/myPerformance/resultSetAll.vue
  56. 436 269
      src/performance/views/myPerformance/resultSetAll2.vue
  57. 189 0
      src/performance/views/myPerformance/resultSetComp/BatchUpload.vue
  58. 3 3
      src/performance/views/performanceIndex.vue
  59. 1 1
      src/performance/views/set/basicsSet.vue
  60. 7 7
      src/performance/views/set/jurisdictionSet.vue
  61. 62 37
      src/performance/views/statement/analyse.vue
  62. 90 34
      src/performance/views/statement/statistics.vue
  63. 3 4
      src/permission.js
  64. 9 3
      src/point/views/setting/jfRule.vue
  65. 215 82
      src/point/views/setting/pk.vue
  66. 917 0
      src/point/views/setting/pk222.vue
  67. 14 14
      src/router/performanceRouter.js
  68. 9 9
      src/utils/axiosKc.js
  69. 4 4
      src/utils/axiosKq.js
  70. 3 3
      src/utils/axiosUpload.js
  71. 3 3
      src/utils/axiosUser.js
  72. 23 17
      src/views/deptRankSwiper.vue
  73. BIN
      static/images/gs1.jpg
  74. BIN
      static/images/gs1.png
  75. BIN
      static/images/gs2.jpg
  76. BIN
      static/images/gs2.png
  77. BIN
      static/images/gs3.jpg
  78. BIN
      static/images/gs3.png
  79. BIN
      static/images/gs4.jpg

+ 20 - 0
babel.config.js

@@ -0,0 +1,20 @@
+
+
+//	先定义一个空数组,然后判断当前项目是处于开发阶段还是处于发布阶段
+// 这是项目在发布阶段需要用到的babel插件
+const prodPlugins = []
+if (process.env.NODE_ENV === 'production') {
+    prodPlugins.push("transform-remove-console")
+
+}
+
+
+module.exports = {
+    presets: [
+        '@vue/cli-plugin-babel/preset',
+        ["@babel/preset-env", { "modules": false }]
+    ],
+    plugins: [
+        ...prodPlugins
+    ]
+}

+ 2 - 3
build/webpack.prod.conf.js

@@ -127,9 +127,8 @@ const webpackConfig = merge(baseWebpackConfig, {
     minimizer: [
       new UglifyJsPlugin({
         uglifyOptions: {
-          mangle: {
-            safari10: true
-          }
+          ecma: 8,
+          safari10: true
         },
         sourceMap: config.build.productionSourceMap,
         cache: true,

+ 0 - 10
config/index.js

@@ -7,18 +7,14 @@ module.exports = {
     assetsSubDirectory: 'static',
     assetsPublicPath: '',
     proxyTable: {},
-	
     host: 'localhost',
     port: 9527, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
     autoOpenBrowser: false,
     errorOverlay: true,
     notifyOnErrors: false,
     poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
-
-
     useEslint: false,
     showEslintErrorsInOverlay: false,
-
     devtool: 'cheap-source-map',
     cssSourceMap: false
   },
@@ -26,11 +22,9 @@ module.exports = {
   build: {
     // Template for index.html
     index: path.resolve(__dirname, '../dist/index.html'),
-
     // Paths
     assetsRoot: path.resolve(__dirname, '../dist'),
     assetsSubDirectory: 'static',
-
     /**
      * You can set by youself according to actual condition
      * You will need to set this if you plan to deploy your site under a sub path,
@@ -39,27 +33,23 @@ module.exports = {
      * In most cases please use '/' !!!
      */
     assetsPublicPath: '', // If you are deployed on the root path, please use '/'
-
     /**
      * Source Maps
      */
     productionSourceMap: false,
     // https://webpack.js.org/configuration/devtool/#production
     devtool: 'source-map',
-
     // Gzip off by default as many popular static hosts such as
     // Surge or Netlify already gzip all static assets for you.
     // Before setting to `true`, make sure to:
     // npm install --save-dev compression-webpack-plugin
     productionGzip: true,
     productionGzipExtensions: ['js', 'css'],
-
     // Run the build command with an extra argument to
     // View the bundle analyzer report after build finishes:
     // `npm run build:prod --report`
     // Set to `true` or `false` to always turn it on or off
     bundleAnalyzerReport: process.env.npm_config_report || false,
-
     // `npm run build:prod --generate_report`
     generateAnalyzerReport: process.env.npm_config_generate_report || false
   }



+ 7 - 4
package.json

@@ -32,6 +32,7 @@
     "babel-runtime": "^6.26.0",
     "clipboard": "^2.0.11",
     "connect": "^3.7.0",
+    "date-fns": "^4.1.0",
     "dhtmlx-gantt": "^8.0.6",
     "echarts": "^4.9.0",
     "element-ui": "^2.14.1",
@@ -48,6 +49,7 @@
     "qrcodejs2": "0.0.2",
     "qs": "^6.11.2",
     "swiper": "^5.4.5",
+    "uglify-js": "^3.19.3",
     "vue": "^2.7.15",
     "vue-baidu-map": "^0.21.20",
     "vue-calendar-component": "^2.8.2",
@@ -63,16 +65,17 @@
   },
   "devDependencies": {
     "autoprefixer": "8.5.0",
-    "babel-core": "6.26.3",
+    "babel-core": "^6.26.3",
     "babel-eslint": "8.2.6",
     "babel-helper-vue-jsx-merge-props": "2.0.3",
-    "babel-loader": "7.1.5",
+    "babel-loader": "^7.1.5",
     "babel-plugin-dynamic-import-node": "2.0.0",
     "babel-plugin-syntax-jsx": "6.18.0",
+    "babel-plugin-transform-remove-console": "^6.9.4",
     "babel-plugin-transform-runtime": "6.23.0",
     "babel-plugin-transform-vue-jsx": "3.7.0",
     "babel-polyfill": "^6.26.0",
-    "babel-preset-env": "1.7.0",
+    "babel-preset-env": "^1.7.0",
     "babel-preset-stage-2": "6.24.1",
     "chalk": "2.4.1",
     "compression-webpack-plugin": "^1.1.11",
@@ -105,7 +108,7 @@
     "serve-static": "1.13.2",
     "shelljs": "0.8.2",
     "svg-sprite-loader": "3.8.0",
-    "uglifyjs-webpack-plugin": "1.2.7",
+    "uglifyjs-webpack-plugin": "2.2.0",
     "url-loader": "1.0.1",
     "vue-loader": "15.3.0",
     "vue-okr-tree": "^1.0.12",

+ 36 - 11
src/App.vue

@@ -14,17 +14,17 @@
         getVersions() {
           let versions=this.$getCache('versions');
           this.$axiosUser('get', '/api/pro/version').then(res => {
-                let {set, version}=res.data.data;
-                if(!set){
-                  return false
-                }
-                if(!versions){
-                  this.$setCache('versions',version);
-                  return false
-                }
-                if(versions!=version){
-                  this.$store.dispatch('LogOut')
-                }
+            let {set, version}=res.data.data;
+            if(!set){
+              return false
+            }
+            if(!versions){
+              this.$setCache('versions',version);
+              return false
+            }
+            if(versions!=version){
+              this.$store.dispatch('LogOut')
+            }
           })
         },
     }
@@ -53,4 +53,29 @@
     overflow: initial;
     text-overflow: initial;
   }
+
+  /* 设置滚动条的宽度和背景色 */
+  .el-main::-webkit-scrollbar {
+    width: 10px;
+    height: 10px;
+    background-color: #f9f9f9;
+  }
+
+  /* 设置滚动条滑块的样式 */
+    .el-main::-webkit-scrollbar-thumb {
+    border-radius: 10px;
+    background-color: #c1c1c1;
+  }
+
+  /* 设置滚动条滑块hover样式 */
+  .el-main::-webkit-scrollbar-thumb:hover {
+    background-color: #a8a8a8;
+  }
+
+  /* 设置滚动条轨道的样式 */
+    .el-main::-webkit-scrollbar-track {
+    box-shadow: inset 0 0 5px rgba(87, 175, 187, 0.1);
+    border-radius: 10px;
+    background: #ededed;
+  }
 </style>

+ 1 - 1
src/components/LoadingAll.vue

@@ -72,7 +72,7 @@ export default {
   methods: {
     returnImg(){
       let arr=['static/images/pc-mubiao.jpg','static/images/pc-jifen.jpg','static/images/pc-jixiao.jpg','static/images/pc-xunjian.jpg']
-      return arr[this.isType-1]
+      return arr[this.isType - 1]
     },
     init(){
       let arr=['okr','integral','performance','sm'];

+ 6 - 6
src/components/PageHead.vue

@@ -1,12 +1,12 @@
 <template>
   <div class="PageHead">
-      <div class="flex-box-ce">
-         <span class="return" @click="routePush?$router.push(routePush):$router.go(-1)">返回</span>
-         <span v-if="phName!=''">{{phName}}</span>
-         <div v-else class="slot">
-           <slot name="headMent"></slot>
-         </div>
+    <div class="flex-box-ce">
+      <span class="return" @click=" routePush ? $router.push(routePush) : $router.go(-1) ">返回</span>
+      <span v-if="phName!=''" style="font-size: 16px; font-weight: 600;">{{phName}}</span>
+      <div v-else class="slot">
+        <slot name="headMent"></slot>
       </div>
+    </div>
   </div>
 </template>
 

+ 3 - 2
src/components/PageHeadTwo.vue

@@ -47,14 +47,15 @@ export default {
 .text {
   font-size: 16px;
   padding-left: 30px;
+  position: relative;
 }
 .text::before {
   position: absolute;
   content: '';
   width: 1px;
-  height: 60px;
+  height: 80px;
   background-color: #ebebeb;
-  left: 34px;
+  left: 20px;
   top: 50%;
   margin-top: -18px;
 }

+ 1 - 1
src/components/organization/Post.vue

@@ -5,7 +5,7 @@
     </el-alert>
     <div class="box br-5 all boxMinHeight">
       <div class="main flex-box">
-        <div class="main-left" style="padding: 20px;padding-right: 0px;">
+        <div class="main-left" style="padding: 20px;  box-sizing: border-box; ">
           <div style="margin-bottom: 16px;" class="flex-box-v flex-center-center">
             <div style="margin-bottom: 6px;"><el-button type="primary" @click="openAdd(1)">新建分类</el-button></div>
             <div><el-button type="primary"  @click.stop="openV(1)">新增岗位</el-button></div>

+ 5 - 7
src/index.vue

@@ -830,14 +830,12 @@ export default {
   overflow-y: scroll;
   padding: 10px;
   min-width: 1100px;
+  box-sizing: border-box;
+}
+.el-main::-webkit-scrollbar {
+  display: none;
 }
-// .el-main::-webkit-scrollbar {
-//   width: 8px;
-//   background-color: #fff;
-// }
-// .el-main::-webkit-scrollbar-thumb {
-//   background-color: #;
-// }
+
 .logo-box {
   cursor: pointer;
   width: 70px;

+ 21 - 1
src/main.js

@@ -7,7 +7,26 @@ import moment from 'moment' // 时间库
 import App from './App'
 import router from './router'
 import store from './store'
-import {getDept,openUrl, getToken, getCourseId,getTyps,getLocal, getTypsName, supremeAuthority, getUserData, getEmployeeMap,getEmployeeMapAll,getEmployeeMapItem,getIsIdentity,getCache,setCache,removeCache,returnDeptName,getIsAdministrator} from '@/utils/auth'
+import {
+  getDept,
+  openUrl, 
+  getToken, 
+  getCourseId,
+  getTyps,
+  getLocal, 
+  getTypsName, 
+  supremeAuthority, 
+  getUserData, 
+  getEmployeeMap,
+  getEmployeeMapAll,
+  getEmployeeMapItem,
+  getIsIdentity,
+  getCache,
+  setCache,
+  removeCache,
+  returnDeptName,
+  getIsAdministrator
+} from '@/utils/auth'
 import './performanceSet' // 绩效系统相关配置
 import {onFilePreView } from '@/okr/utils/auth';
 // import { VueOkrTree } from "vue-okr-tree";
@@ -114,6 +133,7 @@ Object.keys(filters).forEach(key => {
   Vue.filter(key, filters[key])
 })
 
+
 Vue.config.productionTip = false
 
 new Vue({

+ 16 - 6
src/okr/components/TargetDetail/Evolve.vue

@@ -2,14 +2,14 @@
   <div style="padding-top: 20px;">
     <div>
       <div class="flex-box-end" style="margin-bottom: 14px;" >
-        <div class="cursor add-task" @click="operation(1)" v-if="isOperation"><i class="el-icon-plus" style="padding-right: 5px;"></i>添加进展</div>
+        <div class="cursor add-task" @click="operation(1)" v-if="isOperation && !readonly"><i class="el-icon-plus" style="padding-right: 5px;"></i>添加进展</div>
       </div>
       <div v-for="(item, index) in krProcessList" :key="index" class="record-list" style="background-color: #F8FCFF;margin-bottom: 14px;">
         <div class="flex-box-ce record-date fontColorB">
           <userImage :user_name="item.userInfo.name||'系统'" :img_url="item.userInfo.img_url" fontSize="12" width="32px" height="32px"></userImage>
           <div class="record-name">{{ item.userInfo.name||'系统' }}</div>
           <span class="fontColorC flex-1">{{ item.create_time }} 添加了进展</span>
-          <span class="blue cursor" style="padding-right: 10px;display: none;" v-if="userId==item.userInfo.id" @click="operation(2,item)">编辑</span>
+          <span class="blue cursor" style="padding-right: 10px;display: none;" v-if="userId == item.userInfo.id && !readonly" @click="operation(2,item)">编辑</span>
         </div>
         <div class="record-content">
           <pre class="pre fontColorA" style="font-size: 15px;" v-if="item.content">{{ item.content }}</pre>
@@ -43,6 +43,10 @@ export default {
   name: 'Evolve',
   components:{AddEvole,Tooltip},
   props: {
+    readonly: {
+      type: Boolean,
+      default: false
+    },
     target_id: {//对象id 根据对象种类不同而不同
       type: Number,
       default: 0,
@@ -85,15 +89,21 @@ export default {
         this.title='编辑'
         this.target_data=item;
         this.isShowAddJz=true;
-      }else{
-        this.$axiosUser('get', '/api/pro/okr/process/list', {target_type:this.target_type,target_id:this.target_id,page:1,page_size:100}).then(res=>{
-            this.getProcess();
+      } else {
+        let url = ""
+        if (!this.readonly) url = '/api/pro/okr/process/list'
+        else url = '/api/pro/okr/public/process/list'
+        this.$axiosUser('get', url, {target_type:this.target_type,target_id:this.target_id,page:1,page_size:100}).then(res=>{
+          this.getProcess();
         })
       }
     },
     //kr进展
     getProcess(){
-      this.$axiosUser('get', '/api/pro/okr/process/list', {target_type:this.target_type,target_id:this.target_id,page:1,page_size:100}).then(res=>{
+      let url = ""
+      if (!this.readonly) url = '/api/pro/okr/process/list'
+      else url = '/api/pro/okr/public/process/list'
+      this.$axiosUser('get', url, {target_type:this.target_type,target_id:this.target_id,page:1,page_size:100}).then(res=>{
         let list=res.data.data.list
         list.forEach(item=>{
           item.userInfo=this.$getEmployeeMapItem(item.publisher_id);

+ 49 - 23
src/okr/components/TargetDetail/Interaction.vue

@@ -3,27 +3,36 @@
     <div class="scroll-bar" :class="{'setHeight':target_type==4}">
       <template v-if="target_type!=5">
         <div class="fontColorC hoverBlue" style="font-size: 12px;">
-          <span @click="isShowAll=!isShowAll">全部操作 {{total}} <i :class="isShowAll? 'el-icon-arrow-up':'el-icon-arrow-down'"></i></span>
+          <span @click="isShowAll=!isShowAll">全部操作 {{total}} <i
+              :class="isShowAll? 'el-icon-arrow-up':'el-icon-arrow-down'"></i></span>
         </div>
         <Record :record="record" :isShowAll="isShowAll"></Record>
       </template>
 
       <div class="fontColorC flex-box-ce flex-d-center">
-        <span class="hoverBlue" style="font-size: 12px;" @click="isShowAll2=!isShowAll2">全部沟通 {{total2}} <i :class="isShowAll2? 'el-icon-arrow-up':'el-icon-arrow-down'"></i></span>
+        <span class="hoverBlue" style="font-size: 12px;" @click="isShowAll2=!isShowAll2">全部沟通 {{total2}} <i
+            :class="isShowAll2? 'el-icon-arrow-up':'el-icon-arrow-down'"></i></span>
         <div class="flex-box-ce">
-            <el-checkbox v-model="checked">仅看有附件的</el-checkbox>
-            <el-input  class="input" maxlength="20" prefix-icon="el-icon-search" style="width: 206px;margin: 0 10px;" size="small" v-model="keyword" clearable placeholder="按沟通内容搜索" />
-            <el-button @click="huiFu({},true)"  class="primaryBtn"  size="small"><i class="el-icon-edit"></i>立即沟通</el-button>
+          <el-checkbox v-model="checked">仅看有附件的</el-checkbox>
+          <el-input class="input" maxlength="20" prefix-icon="el-icon-search" style="width: 206px;margin: 0 10px;"
+            size="small" v-model="keyword" clearable placeholder="按沟通内容搜索" />
+          <el-button v-if="!readonly" @click="huiFu({},true)" class="primaryBtn" size="small"><i
+              class="el-icon-edit"></i>立即沟通</el-button>
         </div>
       </div>
       <div class="record" v-if="feedbackList.length > 0" style="margin: 20px 0;">
         <div v-for="(item, index) in feedbackList" :key="index" class="record-list" v-if="isShowAll2">
           <div class="flex-box-ce record-date fontColorB">
-            <userImage :user_name="item.userInfo.name" :img_url="item.userInfo.img_url" fontSize="12" width="32px" height="32px"></userImage>
-            <div class="record-name">{{ item.userInfo.name }} <span v-if="item.reply_employee_id"><span style="font-weight: 500;" class="fontColorF">回复</span> {{$getEmployeeMapItem(item.reply_employee_id).name}}</span></div>
+            <userImage :user_name="item.userInfo.name" :img_url="item.userInfo.img_url" fontSize="12" width="32px"
+              height="32px"></userImage>
+            <div class="record-name">
+              {{ item.userInfo.name }} 
+              <span v-if="item.reply_employee_id">
+                <span  style="font-weight: 500;" class="fontColorF">回复</span>
+                {{$getEmployeeMapItem(item.reply_employee_id).name}}</span></div>
             <span class="fontColorC flex-1">{{ item.create_time }}</span>
-            <span class="blue cursor" style="padding-right: 10px;display: none;" @click="huiFu(item)">回复</span>
-            <el-popconfirm title="此操作不可恢复,您确定删除吗?" @confirm="deleteFeedback(item)" v-if="userId==item.userInfo.id">
+            <span v-if="!readonly" class="blue cursor" style="padding-right: 10px;display: none;" @click="huiFu(item)">回复</span>
+            <el-popconfirm title="此操作不可恢复,您确定删除吗?" @confirm="deleteFeedback(item)" v-if="userId==item.userInfo.id && !readonly">
               <span slot="reference" class="blue cursor" style="display: none;">删除</span>
             </el-popconfirm>
           </div>
@@ -31,27 +40,32 @@
             <pre class="pre fontColorB">{{ item.content }}</pre>
           </div>
           <div v-if="item.files.length>0" class="flex-box-ce" style="margin-top: 20px;">
-              <div class="files-box flex-box-ce" v-for="(f,index2) in item.files" :key="index2">
-                <el-image v-if="f.type=='img'" style="width: 30px; height: 30px;cursor: pointer;" :src="f.file" :preview-src-list="[f.file]"></el-image>
-                <span v-else ><img  @click="$onFilePreView(f.file)" style="width: 30px; height: 30px;cursor: pointer;" src="static/images/excel_icon.png"/></span>
-                <Tooltip :preHtml="f.name">
-                    <div style="margin-left: 10px;width: 120px;">{{f.name}}</div>
-                </Tooltip>
-              </div>
+            <div class="files-box flex-box-ce" v-for="(f,index2) in item.files" :key="index2">
+              <el-image v-if="f.type=='img'" style="width: 30px; height: 30px;cursor: pointer;" :src="f.file"
+                :preview-src-list="[f.file]"></el-image>
+              <span v-else><img @click="$onFilePreView(f.file)" style="width: 30px; height: 30px;cursor: pointer;"
+                  src="static/images/excel_icon.png" /></span>
+              <Tooltip :preHtml="f.name">
+                <div style="margin-left: 10px;width: 120px;">{{f.name}}</div>
+              </Tooltip>
+            </div>
           </div>
 
-          <div v-if="item.notice_employee_ids.length>0" class="flex-box-ce" style="margin-top: 20px;padding-left: 40px;">
-              <div>@人员:</div>
-              <span class="green" v-for="(f,index2) in item.notice_employee_ids" :key="index2" style="padding-left: 5px;">{{f.name}}</span>
+          <div v-if="item.notice_employee_ids.length>0" class="flex-box-ce"
+            style="margin-top: 20px;padding-left: 40px;">
+            <div>@人员:</div>
+            <span class="green" v-for="(f,index2) in item.notice_employee_ids" :key="index2"
+              style="padding-left: 5px;">{{f.name}}</span>
           </div>
         </div>
       </div>
       <div class="dotted-line" v-else style="margin: 20px 0;">
-            <div>暂无沟通记录<span class="blue cursor" @click="huiFu({},true)">去沟通</span></div>
+        <div>暂无沟通记录<span v-if="!readonly" class="blue cursor" @click="huiFu({},true)">去沟通</span></div>
       </div>
     </div>
     <!-- 沟通弹窗 -->
-    <AddInteraction :visible.sync="isShowCommunication" :userInfo="userInfo" :replyId="reply_id" :target_type="target_type" :target_id="target_id" @confirm="getLog"></AddInteraction>
+    <AddInteraction :visible.sync="isShowCommunication" :userInfo="userInfo" :replyId="reply_id"
+      :target_type="target_type" :target_id="target_id" @confirm="getLog"></AddInteraction>
   </div>
 </template>
 
@@ -64,6 +78,10 @@ export default {
   name: 'Interaction',
   components: { Record, AddInteraction,Tooltip },
   props: {
+    readonly: {
+      type: Boolean,
+      default: false,
+    },
     target_id: {//对象id 根据对象种类不同而不同
       type: Number,
       default: 0,
@@ -125,8 +143,16 @@ export default {
       this.isShowCommunication=true;
     },
     getLog() {
-      let axios= this.$axiosUser('get', '/api/pro/okr/log',{target_id:this.target_id,target_type:this.target_type})
-      let axios2= this.$axiosUser('get', '/api/pro/okr/feedback/list', {target_id:this.target_id,target_type:this.target_type,page:0,page_size:100,keyword:this.keyword,file:this.checked? 1:0})
+      let url1 = "", url2 = "";
+      if (!this.readonly) {
+        url1 = '/api/pro/okr/log'
+        url2 = '/api/pro/okr/feedback/list'
+      } else {
+        url1 = '/api/pro/okr/public/log'
+        url2 = '/api/pro/okr/public/feedback/list'
+      }
+      let axios = this.$axiosUser('get', url1, {target_id:this.target_id,target_type:this.target_type})
+      let axios2 = this.$axiosUser('get', url2, {target_id:this.target_id,target_type:this.target_type,page:0,page_size:100,keyword:this.keyword,file:this.checked? 1:0})
       let urls=this.target_type==5? [axios2]:[axios,axios2];
 
       Promise.all(urls).then(res => {

+ 45 - 22
src/okr/components/TargetDetail/Replay.vue

@@ -1,24 +1,28 @@
 <template>
   <div>
 
-    <div class="flex-box-ce flex-d-center" v-if="isOperation">
+    <div class="flex-box-ce flex-d-center" v-if="isOperation && !readonly">
       <!-- <el-date-picker v-model="time" type="daterange" size="mini" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker> -->
       <div class="add-task" @click="isShowFp = true"><i class="el-icon-plus"></i> 添加复盘</div>
     </div>
 
     <div style="padding: 10px 0;">
-      <div class="flex-box-ce flex-d-center cursor record-list" v-for="(item, index) in list" :key="index" @click="openDetail(item.id)">
+      <div class="flex-box-ce flex-d-center cursor record-list" v-for="(item, index) in list" :key="index"
+        @click="openDetail(item.id)">
         <div class="black" style="font-weight: 700;font-size: 16px;">{{index+1}} 复盘({{item.ct}})</div>
         <div class="blue">
-          <span style="padding-right: 10px;" class="cursor" v-if="isOperation"><i class="el-icon-edit-outline"></i>编辑</span>
+          <span style="padding-right: 10px;" class="cursor" v-if="isOperation && !readonly"><i
+              class="el-icon-edit-outline"></i>编辑</span>
           <!-- <span class="cursor">查看详情</span> -->
         </div>
       </div>
-      <div class="dotted-line" v-if="list.length==0"><div>尚未复盘过</div></div>
+      <div class="dotted-line" v-if="list.length==0">
+        <div>尚未复盘过</div>
+      </div>
     </div>
 
     <!-- 复盘目标 -->
-    <el-dialog title="复盘" :visible.sync="isShowFp" :append-to-body="true"   width="600px" :close-on-click-modal="false">
+    <el-dialog title="复盘" :visible.sync="isShowFp" :append-to-body="true" width="600px" :close-on-click-modal="false">
       <div style="max-height: 500px;overflow: auto;height: 500px;" class="scroll-bar">
         <div class="flex-box-ce">
           <div class="add-task-title">复盘对象</div>
@@ -29,39 +33,44 @@
         </div>
         <div style="margin-bottom: 10px;">
           <div class="add-task-title">价值与收获</div>
-          <el-input type="textarea" v-model="form.summary"  aria-required maxlength="500" show-word-limit clearable placeholder="我们在过程中学到了什么?(必填)" />
+          <el-input type="textarea" v-model="form.summary" :disabled="readonly" aria-required maxlength="500"
+            show-word-limit clearable placeholder="我们在过程中学到了什么?(必填)" />
         </div>
         <div style="margin-bottom: 10px;">
           <div class="add-task-title">问题与不足</div>
-          <el-input type="textarea" v-model="content"  maxlength="500" show-word-limit clearable placeholder="请描述出现的某个问题并针对该问题展开分析(必填)" />
+          <el-input type="textarea" v-model="content" :disabled="readonly" maxlength="500" show-word-limit clearable
+            placeholder="请描述出现的某个问题并针对该问题展开分析(必填)" />
         </div>
         <div style="margin-bottom: 10px;">
           <div class="add-task-title2">根本原因</div>
-          <el-input type="textarea" v-model="reason"  maxlength="500" show-word-limit clearable placeholder="请填写问题出现的根本原因(必填)" />
+          <el-input type="textarea" v-model="reason" :disabled="readonly" maxlength="500" show-word-limit clearable
+            placeholder="请填写问题出现的根本原因(必填)" />
         </div>
         <div style="margin-bottom: 10px;">
           <div class="add-task-title2">相应解决措施</div>
-          <el-input type="textarea" v-model="plan"  maxlength="500" show-word-limit clearable placeholder="请根据上述原因给出可落地的解决措施(必填)" />
+          <el-input type="textarea" v-model="plan" :disabled="readonly" maxlength="500" show-word-limit clearable
+            placeholder="请根据上述原因给出可落地的解决措施(必填)" />
         </div>
         <div style="margin-bottom: 10px;">
           <div class="add-task-title">复盘参与人员</div>
           <div class="flex-box-ce flex-d-wrap">
-            <div class="flex-box-ce userItem" v-for="item in employee_selected_all.employee" :key="item.id" style="margin-right: 10px;">
-               <userImage :id="item.id" width="30px" height="30px"  fontSize="14" :user_name="item.name"></userImage>
-               <span style="font-weight: 600;padding-left: 10px;" class="fontColorB">{{item.name}}</span>
+            <div class="flex-box-ce userItem" v-for="item in employee_selected_all.employee" :key="item.id"
+              style="margin-right: 10px;">
+              <userImage :id="item.id" width="30px" height="30px" fontSize="14" :user_name="item.name"></userImage>
+              <span style="font-weight: 600;padding-left: 10px;" class="fontColorB">{{item.name}}</span>
             </div>
-            <div class="aite" @click="show_employee_selector_all=true">+</div>
+            <div v-if="!readonly" class="aite" @click="show_employee_selector_all=true">+</div>
           </div>
         </div>
         <div style="height: 100px;"></div>
       </div>
       <div class="flex-box-end" style="margin-top:10px;">
-        <el-popconfirm title="此操作不可恢复,您确定删除吗?" @confirm="deleteR" v-if="form.replay_id&&isOperation">
+        <el-popconfirm title="此操作不可恢复,您确定删除吗?" @confirm="deleteR" v-if="form.replay_id && isOperation && !readonly">
           <el-button slot="reference" type="danger" plain>删除</el-button>
         </el-popconfirm>
         <div class="flex-1"></div>
         <el-button @click="isShowFp=false">取消</el-button>
-        <el-button type="primary" @click="confirm"  v-if="isOperation">确定</el-button>
+        <el-button type="primary" @click="confirm" v-if="isOperation">确定</el-button>
       </div>
     </el-dialog>
 
@@ -69,7 +78,8 @@
     <AddTask :visible.sync="isShowAddTask"></AddTask>
 
     <!-- @人员 -->
-    <EmployeeSelector :is_filtration_creator="false" title="选择人员"  :selected="employee_selected_all" :visible.sync="show_employee_selector_all" @confirm="employee_confirm_all"/>
+    <EmployeeSelector :is_filtration_creator="false" title="选择人员" :selected="employee_selected_all"
+      :visible.sync="show_employee_selector_all" @confirm="employee_confirm_all" />
 
   </div>
 </template>
@@ -81,6 +91,10 @@ export default {
   name: 'Replay',
   components:{AddTask,EmployeeSelector},
   props: {
+    readonly: {
+      type: Boolean,
+      default: false
+    },
     target_id: {//对象id 根据对象种类不同而不同
       type: Number,
       default: 0,
@@ -147,12 +161,15 @@ export default {
   methods: {
     deleteR(){
       this.$axiosUser('post', '/api/pro/okr/replay/delete', {replay_id:this.form.replay_id}).then(res=>{
-          this.getReplay();
-          this.isShowFp=false;
+        this.getReplay();
+        this.isShowFp=false;
       })
     },
-    openDetail(id){
-      this.$axiosUser('get', '/api/pro/okr/replay/info', {replay_id:id}).then(res=>{
+    openDetail(id) {
+      let url = ""
+      if (!this.readonly) url = '/api/pro/okr/replay/info'
+      else url = '/api/pro/okr/public/replay/info'
+      this.$axiosUser('get', url, {replay_id:id}).then(res=>{
         let data=res.data.data
         this.form={
           replay_id:data.id,
@@ -177,8 +194,14 @@ export default {
           return item.id
         });
     },
-    getReplay(){
-      this.$axiosUser('get', '/api/pro/okr/replay/list', {target_type:this.target_type,target_id:this.target_id,page:1,page_size:100}).then(res=>{
+    getReplay() {
+      let url = "";
+      if (!this.readonly) {
+        url = '/api/pro/okr/replay/list'
+      } else {
+        url = '/api/pro/okr/public/replay/list'
+      }
+      this.$axiosUser('get', url, {target_type:this.target_type,target_id:this.target_id,page:1,page_size:100}).then(res=>{
         let list=res.data.data.list
         this.list=list
       })

Разница между файлами не показана из-за своего большого размера
+ 704 - 521
src/okr/components/public/TargetDetail.vue


+ 9 - 5
src/okr/components/public/TargetSearch.vue

@@ -1,7 +1,7 @@
 <template>
   <el-dialog :title="title" :visible.sync="visible_" :close-on-click-modal="false" :before-close="close_before" append-to-body @open="openDialog" width="760px">
      <el-tabs v-model="activeName">
-       <el-tab-pane label="关联OKR" name="okr" v-if="showSelectType==1||showSelectType==3">
+       <el-tab-pane label="关联OKR" name="okr" v-if="showSelectType == 1 || showSelectType == 3">
          <div class="flex-box-ce" style="padding-bottom: 10px;margin-top: 20px;">
            <el-select class="select" size="small" v-model="year" placeholder="年份">
              <el-option  v-for="item in yearArr" :key="item.value" :label="item.label":value="item.value"></el-option>
@@ -24,7 +24,7 @@
                  <div style="font-size: 13px;">
                    <div class="flex-box-ce" style="margin-bottom: 10px;">
                        <template v-if="showType!=2">
-                         <div class="radio" :class="{'radio-active':(selectId==item.id&&type==item.type)}" @click.stop="activeId(item,1)"></div>
+                         <div class="radio" :class="{'radio-active':(selectId==item.id && type ==item.type)}" @click.stop="activeId(item,1)"></div>
                          <div class="date">{{item.dateStr}}</div>
                        </template>
                        <Tooltip :preHtml="item.name"><span class="flex-1">{{item.name}}</span></Tooltip>
@@ -36,7 +36,11 @@
                  </div>
                </template>
                <div v-loading="loading">
-                   <div v-if="showType!=1" class="flex-box-ce taskItem" v-for="(item2,index2) in item.krs" :key="index2" :style="{paddingLeft:showType==2? '40px':'120px'}">
+                   <div 
+                      v-if="showType!=1" class="flex-box-ce taskItem" 
+                      v-for="(item2,index2) in item.krs" 
+                      :key="index2" 
+                      :style="{paddingLeft:showType==2? '40px':'120px'}">
                      <div class="radio" style="margin-right: 10px;" :class="{'radio-active':(selectId==item2.id&&type==item2.type)}" @click.stop="activeId(item2,2)"></div>
                      <div class="flex-1">KR{{index2+1}}:{{item2.name}}</div>
                    </div>
@@ -47,8 +51,8 @@
          </div>
          <el-pagination style="text-align: center;margin-top: 20px;" :current-page.sync="page" :page-sizes="[10, 20, 50, 100]"  layout="total,prev,pager,next,sizes" :total="total" @size-change="handleSizeChange"  @current-change="handleCurrentChange" :page-size="page_size"></el-pagination>
        </el-tab-pane>
-       <el-tab-pane label="关联项目" name="project" v-if="showSelectType==2||showSelectType==3">
-         <div class="flex-box-ce" style="padding-bottom: 10px;margin-top: 20px;">
+       <el-tab-pane label="关联项目" name="project" v-if="showSelectType == 2 || showSelectType ==3">
+         <div class="flex-box-ce" style="padding-bottom: 10px; margin-top: 20px;">
           <el-select class="select" size="small" v-model="projectData.composite_state" placeholder="状态" style="width: 100px;">
             <el-option v-for="item in statusArr" :key="item.value" :label="item.label"  :value="item.value"></el-option>
           </el-select>

+ 83 - 29
src/okr/components/public/TargetType.vue

@@ -1,11 +1,45 @@
-<template>
  <el-popover :placement="placement" :trigger="trigger" v-model="isShow" @show="showPop">
    <div class="searchBox">
      <el-form ref="form" label-width="80px" class="form">
        <el-form-item label="目标类型">
          <el-radio-group v-model="id">
            <el-radio :label="1">公司</el-radio>
            <el-radio :label="2">部门</el-radio>
            <!-- <el-radio :label="3">团队</el-radio> -->
            <el-radio :label="4">个人</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item label="部门" v-if="id ==2">
-           <el-cascader v-model="depts" :options="dept_tree"  style="width: 100%;" ref="dept" filterable change-on-select placeholder="请选择部门"></el-cascader>
        </el-form-item>
      </el-form>
      <div class="flex-box-end" style="margin-top: 20px;" v-if="can_edit">
        <el-button size="small" plain round @click="isShow = false">取 消</el-button>
        <el-button size="small" type="primary" plain round @click="confirm">确 定</el-button>
      </div>
    </div>
    <!-- 内容 -->
    <template slot="reference">
-        <slot></slot>
    </template>
  </el-popover>
</template>

<script>
export default {
  name: 'TargetType',
  props: {
+<template>
+  <el-popover :placement="placement" :trigger="trigger" v-model="isShow" @show="showPop">
+    <div class="searchBox">
+      <el-form ref="form" label-width="80px" class="form">
+        <el-form-item label="目标类型">
+          <el-radio-group v-model="id">
+            <el-radio :label="1">公司</el-radio>
+            <el-radio :label="2">部门</el-radio>
+            <!-- <el-radio :label="3">团队</el-radio> -->
+            <el-radio :label="4">个人</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="部门" v-if="id ==2">
+           <el-cascader v-model="depts" :options="dept_tree"  style="width: 100%;" ref="dept" filterable change-on-select placeholder="请选择部门"></el-cascader>
+        </el-form-item>
+      </el-form>
+      <div class="flex-box-end" style="margin-top: 20px;" v-if="can_edit">
+        <el-button size="small" plain round @click="isShow = false">取 消</el-button>
+        <el-button size="small" type="primary" plain round @click="confirm">确 定</el-button>
+      </div>
+    </div>
+    <!-- 内容 -->
+    <template slot="reference">
+        <slot></slot>
+    </template>
+  </el-popover>
+</template>
+
+<script>
+export default {
+  name: 'TargetType',
+  props: {
     visible: {
       // 是否显示组件
       type: Boolean,
       default: false
-    },
    belong_type: {
      type: Number,
      default: 4
    },
+    },
+   
+    belong_type: {
+      type: Number,
+      default: 4
+    },
     deptId: {
       type: Number,
       default: 0
@@ -25,12 +59,20 @@
     placement:{
       type: String,
       default: 'bottom-start'
-    }
  },
  data() {
    return {
      isShow: false,
      id: 4,
+    }
+  },
+  data() {
+    return {
+      isShow: false,
+      id: 4,
       depts:[],
       dept_id:0,
       dept_tree:[],
       oneruleId:[],
-      echoGather:[],
    };
  },
  watch: {
+      echoGather:[],
+    };
+  },
+  watch: {
     depts(val){
       this.dept_id=val[val.length-1];
       if(this.$refs.dept){
@@ -51,11 +93,14 @@
           this.$emit('update:visible', false);
       }
     }
-  },
  created() {
+  },
+  created() {
     if (this.$getCache('dept_tree')) {
       this.dept_tree = this.getTreeData(this.$getCache('dept_tree'));
     }
-  },
  mounted() {},
  methods: {
+  },
+  mounted() {},
+  methods: {
     // 递归判断列表,把最后的children设为undefined
     getTreeData(data) {
       for (var i = 0; i < data.length; i++) {
@@ -66,37 +111,46 @@
         }
       }
       return data;
-    },
    showPop() {
      this.id = this.belong_type;
+    },
+    showPop() {
+      this.id = this.belong_type;
       this.oneruleId=[];
       if(this.deptId&&this.id==2){
         this.getTreeDatas(this.dept_tree,this.deptId);
         this.depts=this.oneruleId
-      }
    },
-		getTreeDatas(data, item) {
-			for (let i in data) {
-				if (data[i].id == item) {
-					if (data[i].pid == 0) {
-						this.oneruleId.unshift(data[i].id);
-						break;
-					} else {
-						this.oneruleId.unshift(data[i].id);
-						this.getTreeDatas(this.dept_tree, data[i].pid);
-					}
-				} else {
-					if (data[i].children) {
-						this.getTreeDatas(data[i].children, item);
-					}
-				}
-			}
-			return;
-		},
    confirm() {
+      }
+    },
+		getTreeDatas(data, item) {
+			for (let i in data) {
+				if (data[i].id == item) {
+					if (data[i].pid == 0) {
+						this.oneruleId.unshift(data[i].id);
+						break;
+					} else {
+						this.oneruleId.unshift(data[i].id);
+						this.getTreeDatas(this.dept_tree, data[i].pid);
+					}
+				} else {
+					if (data[i].children) {
+						this.getTreeDatas(data[i].children, item);
+					}
+				}
+			}
+			return;
+		},
+    confirm() {
       if(this.id==2&&this.depts.length==0){
          this.$message.error("请选择部门");
          return false
       }
       this.$emit('confirm',{dept_id:this.dept_id,id:this.id,targetId:this.targetId});
       this.isShow = false;
-    },
  }
};
</script>

<style scoped="scoped" lang="scss">
+    },
+  }
+};
+</script>
+
+<style scoped="scoped" lang="scss">
   .dept_wdiv {
     width: 100%;
     position: relative;

+ 198 - 169
src/okr/components/public/TaskDetail.vue

@@ -1,6 +1,6 @@
 <template>
     <div>
-      <el-dialog  :visible.sync="visible_" class="dialog-task-detail" append-to-body width="740px" top="3%" :show-close="false" :before-close="close_before">
+      <el-dialog :visible.sync="visible_" class="dialog-task-detail" append-to-body width="740px" top="3%" :show-close="false" :before-close="close_before" @close="close_before">
 
         <div class="task-header flex-box-ce br-5" style="padding: 10px;border-bottom: 1px solid #f1f1f1;">
             <Tooltip :preHtml="taskDetail.stateInfo.name">
@@ -10,14 +10,14 @@
               </div>
             </Tooltip>
             <div class="flex-1">
-              <div v-if="taskDetail.pid" class="mu-task font-flex-word" @click="openTask(taskDetail.pid)">
+              <div v-if="taskDetail.pid" class="mu-task font-flex-word" @click="!readonly && openTask(taskDetail.pid)">
                 <i class="el-icon-upload2"></i>
                 <span>{{taskDetail.pname}}</span>
               </div>
             </div>
             <div class="flex-box-ce">
-              <template v-if="taskDetail.visible==1">
-                <el-button v-if="taskDetail.can_finish==1||taskDetail.can_start_review==1" @click="handleCommand(3)"  type="primary" size="mini" style="margin-right: 20px;" round>完成任务</el-button>
+              <template v-if="!readonly && taskDetail.visible == 1">
+                <el-button v-if="taskDetail.can_finish == 1 || taskDetail.can_start_review == 1" @click="handleCommand(3)"  type="primary" size="mini" style="margin-right: 20px;" round>完成任务</el-button>
                 <el-dropdown @command="handleCommand" trigger="click" class="hoverBlue">
                  <i class="el-icon-more"></i>
                  <el-dropdown-menu slot="dropdown">
@@ -30,22 +30,22 @@
                   </el-dropdown-menu>
                 </el-dropdown>
               </template>
-              <i @click="close_before()" class="el-icon-close black cursor" style="font-size: 18px;padding: 10px;"></i>
+              <!-- <i @click="!readonly && close_before()" class="el-icon-close black cursor" style="font-size: 18px;padding: 10px;"></i> -->
             </div>
         </div>
-        <div class="scroll-bar task-main" v-if="taskDetail.visible==1" style="overflow-y: scroll;height: 800px;position: relative;padding: 10px 20px;" v-loading="loading">
+        <div class="scroll-bar task-main" v-if="taskDetail.visible == 1 || readonly" style="overflow-y: scroll;height: 800px;position: relative;padding: 10px 20px;" v-loading="loading">
           <div class="border-bottom">
             <div class="flex-box">
-              <div @click="selectUser(1)" class="cursor" v-if="taskDetail.can_edit_normal">
+              <div @click="selectUser(1)" class="cursor" v-if="!readonly && taskDetail.can_edit_normal">
                 <Tooltip preHtml="更换负责人">
                     <userImage :id="taskDetail.userInfo.id" width="40px" height="40px" :user_name="taskDetail.userInfo.name"></userImage>
                 </Tooltip>
               </div>
               <userImage v-else :id="taskDetail.userInfo.id" width="40px" height="40px" :user_name="taskDetail.userInfo.name"></userImage>
-              <div class="flex-1" style="margin-left: 10px;">
+              <div class="flex-1" style="display: flex; align-items: center; margin-left: 10px;">
                   <el-input class="input-border" :disabled="!taskDetail.can_edit_normal"  @focus="inputFocus(1)" v-model="taskDetail.name" type="textarea" maxlength="100" show-word-limit  autosize placeholder="请输入可衡量的关键成果"></el-input>
                   <CollapseTransition>
-                    <div v-if="isShowInput" style="box-shadow: 3px 5px 5px #F3F5F8;padding: 6px;box-sizing: border-box;border-radius: 5px;" >
+                    <div v-if="!readonly && isShowInput" style="box-shadow: 3px 5px 5px #F3F5F8;padding: 6px;box-sizing: border-box; border-radius: 5px;" >
                         <div class="red"><span v-if="isShowError">请输入任务名称</span>&nbsp</div>
                         <div class="flex-box-end">
                           <el-button size="small" round @click="inputFocus(2)">取消</el-button>
@@ -58,7 +58,7 @@
             <div class="flex-box-ce kr-message-item">
               <div class="label"><i class="el-icon-time"></i>起止时间</div>
               <div class="showUpdate flex-box-ce" style="width: 360px;">
-                  {{taskDetail.start_date}}~{{taskDetail.end_date}} <i v-if="taskDetail.can_edit_normal"  @click="isShowDqMyTarget=true" class="el-icon-edit" style="display: none;">编辑</i>
+                  {{taskDetail.start_date}}~{{taskDetail.end_date}} <i v-if="!readonly && taskDetail.can_edit_normal"  @click="isShowDqMyTarget=true" class="el-icon-edit" style="display: none;">编辑</i>
               </div>
 
               <span v-if="taskDetail.day>0" class="fontColorA" style="margin-left: 10px;">剩余<span class="green" style="font-size: 16px;font-weight: 700;"> {{taskDetail.day}} </span>天</span>
@@ -71,7 +71,10 @@
             </div>
             <div style="background-color: #FAFBFC;padding: 8px;margin-top: 20px;" class="br-5 flex-box">
               <div class="blue" style="height: 36px;line-height: 36px;">任务描述:</div>
-              <div class="flex-1">
+              <div v-if="readonly">
+                <el-input class="input-border2"  maxlength="500" show-word-limit :disabled="true" v-model="taskDetail.content" type="textarea" autosize></el-input>
+              </div>
+              <div v-else class="flex-1">
                 <el-input class="input-border2"  maxlength="500" show-word-limit :disabled="!taskDetail.can_edit_normal" @focus="inputFocus2(1)" v-model="taskDetail.content" type="textarea"  autosize placeholder="请输入任务描述"></el-input>
                 <CollapseTransition>
                   <div v-if="isShowInput2" style="box-shadow: 3px 5px 5px #F3F5F8;padding: 6px;box-sizing: border-box;border-radius: 5px;" >
@@ -87,7 +90,7 @@
             <div style="padding: 8px;background-color: #F6FAFF;margin-top: 16px;">
                 <div class="flex-box-ce flex-d-center" >
                   <span class="blue"><i class="el-icon-bangzhu"></i>量化</span>
-                  <template v-if="taskDetail.can_edit_normal">
+                  <template v-if="!readonly && taskDetail.can_edit_normal">
                     <el-popover placement="bottom" trigger="click" title="请输入目标值" v-if="!taskDetail.quantify.target" v-model="isShowTarget">
                         <div style="width: 300px;">
                           <el-input class="w270" placeholder="请输入数值" v-model="target" @input="target = target.replace(/[^\d]/g, '');">
@@ -102,14 +105,14 @@
                         </div>
                         <span class="blue cursor" slot="reference"><i class="el-icon-plus"></i>设为量化任务</span>
                     </el-popover>
-                    <Tooltip preHtml="删除" v-else>
+                    <Tooltip preHtml="删除" v-else-if="!readonly">
                       <el-popconfirm title="您确定删除目标值和实际值吗" @confirm="deleteTarget">
                         <i class="cursor el-icon-delete" slot="reference"></i>
                       </el-popconfirm>
                     </Tooltip>
                   </template>
                 </div>
-                <div class="flex-box-ce fontColorC" style="padding: 6px 0;font-size: 14px;border-top:1px dotted #dashed;margin-top:6px" v-if="taskDetail.quantify.target">
+                <div class="flex-box-ce fontColorC" style="padding: 6px 0;font-size: 14px;border-top:1px dotted #dashed; margin-top:6px" v-if="taskDetail.quantify.target">
                   <el-popover placement="bottom" trigger="manual" title="请输入目标值" v-model="isShowTarget">
                       <div style="width: 300px;">
                         <el-input class="w270" placeholder="请输入数值" v-model="target" @input="target = target.replace(/[^\d]/g, '');">
@@ -123,8 +126,8 @@
                         </div>
                       </div>
                       <div style="margin-right: 40px;" slot="reference">
-                        <div class="cursor" @click="isShowTarget = !isShowTarget" v-if="taskDetail.can_edit_normal">目标值 <span class="numVal">{{taskDetail.quantify.target}}</span>{{taskDetail.quantify.unit}}<i class="el-icon-caret-bottom"></i></div>
-                        <div v-else>目标值 <span class="numVal">{{taskDetail.quantify.target}}</span>{{taskDetail.quantify.unit}}<i class="el-icon-caret-bottom"></i></div>
+                        <div class="cursor" @click="isShowTarget = !isShowTarget" v-if="!readonly && taskDetail.can_edit_normal">目标值 <span class="numVal">{{taskDetail.quantify.target}}</span>{{taskDetail.quantify.unit}}<i class="el-icon-caret-bottom"></i></div>
+                        <div v-else>目标值 <span class="numVal">{{taskDetail.quantify.target}}</span>{{taskDetail.quantify.unit}}</div>
                       </div>
                   </el-popover>
 
@@ -160,8 +163,8 @@
                         </div>
                       </div>
                       <div slot="reference">
-                        <div class="cursor" v-if="taskDetail.can_edit_normal" @click="isShowResult = !isShowResult">实际值 <span class="numVal">{{taskDetail.quantify.result}}</span>{{taskDetail.quantify.unit}}<i class="el-icon-caret-bottom"></i></div>
-                        <div v-else>实际值 <span class="numVal">{{taskDetail.quantify.result}}</span>{{taskDetail.quantify.unit}}<i class="el-icon-caret-bottom"></i></div>
+                        <div class="cursor" v-if="!readonly && taskDetail.can_edit_normal" @click="isShowResult = !isShowResult">实际值 <span class="numVal">{{taskDetail.quantify.result}}</span>{{taskDetail.quantify.unit}}<i class="el-icon-caret-bottom"></i></div>
+                        <div v-else>实际值 <span class="numVal">{{taskDetail.quantify.result}}</span>{{taskDetail.quantify.unit}}</div>
                       </div>
                   </el-popover>
                 </div>
@@ -172,32 +175,34 @@
                 <div class="showUpdate flex-box-ce">
                     <Progress :isShowLeftVal="true" :value="Number(taskDetail.process)" :inputStyle="{ height: '10px', width: '120px', lineHeight: '10px' }"></Progress>
                     <el-input ref="process" v-if="isShowProcessInput" @blur="processUpdate" style="width: 60px;margin-left:10px" size="mini" v-model="process" @input="process = process.replace(/[^\d]/g, '');"/>
-                    <div class="updateprocess" v-if="taskDetail.can_edit_normal&&!taskDetail.quantify.target" @click="openProcess">更新进度</div>
+                    <div class="updateprocess" v-if="!readonly && taskDetail.can_edit_normal && !taskDetail.quantify.target" @click="openProcess">更新进度</div>
 
                     <!-- <i class="el-icon-edit" style="display: none;" v-if="taskDetail.can_edit_normal&&!taskDetail.quantify.target" @click="openProcess">编辑</i> -->
                 </div>
-                <div v-if="taskDetail.quantify.target" style="padding-left: 20px;" class="orange">请填写【实际值】,进度将自动更新</div>
+                <div v-if="!readonly && taskDetail.quantify.target" style="padding-left: 20px;" class="orange">请填写【实际值】,进度将自动更新</div>
               </div>
               <div class="flex-box-ce kr-message-item">
                 <div class="label"><i class="el-icon-alarm-clock"></i>反馈时间</div>
-                <div class="showUpdate flex-box-ce" v-if="taskDetail.can_edit_normal">
+                <div class="showUpdate flex-box-ce" v-if="!readonly && taskDetail.can_edit_normal">
                   <Feedback @confirm="activeFeedbackTime">
                       <span class="flex-box-ce" v-if="!feedbackData.feedbackTime"><span>请选择反馈时间</span><i class="el-icon-edit" style="display: none;">编辑</i></span>
-                      <span v-else class="flex-box-ce"><span class="green">{{feedbackData.feedbackTime}}</span><i class="el-icon-edit" style="display: none;">编辑</i></span>
+                      <span v-else class="flex-box-ce"><span class="green">{{feedbackData.feedbackTime}}</span><i v-if="!readonly" class="el-icon-edit" style="display: none;">编辑</i></span>
                   </Feedback>
                   <i class="el-icon-error" style="display: none;" v-if="feedbackData.feedbackTime" @click="deleteTime"></i>
                 </div>
                 <div class="showUpdate flex-box-ce" v-else>
-                  <span class="flex-box-ce" v-if="!feedbackData.feedbackTime"><span>请选择反馈时间</span></span>
-                  <span v-else><span class="green">{{feedbackData.feedbackTime}}</span></span>
+                  <span class="flex-box-ce" v-if="!readonly && !feedbackData.feedbackTime"><span>请选择反馈时间</span></span>
+                  <span v-else><span class="green">{{feedbackData.feedbackTime || '暂无反馈时间'}}</span></span>
                 </div>
               </div>
 
               <div class="flex-box-ce kr-message-item">
                 <div class="label"><i class="el-icon-alarm-clock"></i>预估工时</div>
                 <div v-if="!isShowWh">
-                  <span v-if="!taskDetail.wh" class="showUpdate flex-box-ce"><span>暂未设置</span><i v-if="taskDetail.can_edit_normal" class="el-icon-edit" style="display: none;" @click="isShowWh=!isShowWh">编辑</i></span>
-                  <span v-else  class="showUpdate flex-box-ce"><span style="color:#D3A7F8">{{taskDetail.wh}}</span>  小时<i class="el-icon-edit" v-if="taskDetail.can_edit_normal" style="display: none;" @click="isShowWh=!isShowWh">编辑</i></span>
+                  <span v-if="!taskDetail.wh" class="showUpdate flex-box-ce">
+                    <span>暂未设置</span>
+                    <i v-if="!readonly && taskDetail.can_edit_normal" class="el-icon-edit" style="display: none;" @click="isShowWh=!isShowWh">编辑</i></span>
+                  <span v-else  class="showUpdate flex-box-ce"><span style="color:#D3A7F8">{{taskDetail.wh}}</span>  小时<i class="el-icon-edit" v-if="!readonly && taskDetail.can_edit_normal" style="display: none;" @click="isShowWh=!isShowWh">编辑</i></span>
                 </div>
                 <div v-else>
                   <el-input @blur="inputBlur" ref="input" style="width: 60px;" size="mini" maxlength="9"  v-model="wh" @input="wh = wh.replace(/[^\d]/g, '');"/>
@@ -206,7 +211,7 @@
               </div>
               <div class="flex-box kr-message-item">
                 <div class="label"><svg-icon icon-class="#icon-kaisuohuansuo" class="svgIcon"></svg-icon>&nbsp;可见范围</div>
-                <div class="flex-1">
+                <div class="flex-1" >
                   <el-popover placement="bottom-start" trigger="manual" v-model="isShowSelect">
                     <div class="searchBox">
                       <el-form ref="form" label-width="80px" class="form">
@@ -232,9 +237,9 @@
                     <template slot="reference">
                        <div>
                          <div>
-                           <span v-if="taskDetail.visible_type==1" class="showUpdate  flex-box-ce">全公司 <i class="el-icon-edit" style="display: none;" v-if="taskDetail.can_edit_normal" @click="openVisibleType()">编辑</i></span>
-                           <span v-if="taskDetail.visible_type==5" class="showUpdate  flex-box-ce">指定部门 <i class="el-icon-edit" style="display: none;" v-if="taskDetail.can_edit_normal" @click="openVisibleType()">编辑</i></span>
-                           <span v-if="taskDetail.visible_type==2" class="showUpdate  flex-box-ce">相关成员 <i class="el-icon-edit" style="display: none;" v-if="taskDetail.can_edit_normal" @click="openVisibleType()">编辑</i></span>
+                           <span v-if="taskDetail.visible_type==1" class="showUpdate  flex-box-ce">全公司 <i class="el-icon-edit" style="display: none;" v-if="!readonly && taskDetail.can_edit_normal" @click="openVisibleType()">编辑</i></span>
+                           <span v-if="taskDetail.visible_type==5" class="showUpdate  flex-box-ce">指定部门 <i class="el-icon-edit" style="display: none;" v-if="!readonly && taskDetail.can_edit_normal" @click="openVisibleType()">编辑</i></span>
+                           <span v-if="taskDetail.visible_type==2" class="showUpdate  flex-box-ce">相关成员 <i class="el-icon-edit" style="display: none;" v-if="!readonly && taskDetail.can_edit_normal" @click="openVisibleType()">编辑</i></span>
                          </div>
                          <div v-if="taskDetail.visible_type==5" style="margin-top: 10px;">{{deptVisibleName2}}</div>
                        </div>
@@ -252,26 +257,26 @@
                     <div class="flex-1">
                          <div class="fontColorC" style="margin-bottom:8px;">发布人</div>
                          <div class="flex-box-ce">
-                               <userImage :id="taskDetail.p_userInfo.id" width="32px" height="32px" fontSize="13" :user_name="taskDetail.p_userInfo.name"></userImage>
-                               <span style="margin-left: 10px;" class="fontColorA">{{ taskDetail.p_userInfo.name }}</span>
+                            <userImage :id="taskDetail.p_userInfo.id" width="32px" height="32px" fontSize="13" :user_name="taskDetail.p_userInfo.name"></userImage>
+                            <span style="margin-left: 10px;" class="fontColorA">{{ taskDetail.p_userInfo.name }}</span>
                          </div>
                     </div>
                     <div class="flex-1">
                          <div class="fontColorC" style="margin-bottom:8px;">负责人</div>
-                         <div class="flex-box-ce cursor" @click="selectUser(1)" v-if="taskDetail.can_edit_normal">
-                               <userImage :id="taskDetail.userInfo.id" width="32px" height="32px" fontSize="13" :user_name="taskDetail.userInfo.name"></userImage>
-                               <span style="margin-left: 10px;" class="fontColorA">{{ taskDetail.userInfo.name }}</span>
+                         <div class="flex-box-ce cursor" @click="selectUser(1)" v-if="!readonly && taskDetail.can_edit_normal">
+                            <userImage :id="taskDetail.userInfo.id" width="32px" height="32px" fontSize="13" :user_name="taskDetail.userInfo.name"></userImage>
+                            <span style="margin-left: 10px;" class="fontColorA">{{ taskDetail.userInfo.name }}</span>
                          </div>
                          <div class="flex-box-ce" v-else>
-                               <userImage :id="taskDetail.userInfo.id" width="32px" height="32px" fontSize="13" :user_name="taskDetail.userInfo.name"></userImage>
-                               <span style="margin-left: 10px;" class="fontColorA">{{ taskDetail.userInfo.name }}</span>
+                            <userImage :id="taskDetail.userInfo.id" width="32px" height="32px" fontSize="13" :user_name="taskDetail.userInfo.name"></userImage>
+                            <span style="margin-left: 10px;" class="fontColorA">{{ taskDetail.userInfo.name }}</span>
                          </div>
                     </div>
                   </div>
                   <div style="margin: 14px 0;">
                        <div class="fontColorC" style="margin-bottom:8px;">审批人</div>
                        <div class="flex-box" v-if="taskDetail.reviewer_id">
-                         <div class="flex-box-ce cursor userItem" @click.prevent.stop="selectUser(2)" v-if="taskDetail.can_edit_reviewer">
+                         <div class="flex-box-ce cursor userItem" @click.prevent.stop="selectUser(2)" v-if="!readonly && taskDetail.can_edit_reviewer">
                                <userImage :id="taskDetail.r_userInfo.id" width="32px" height="32px" fontSize="13" :user_name="taskDetail.r_userInfo.name"></userImage>
                                <span style="margin-left: 10px;" class="fontColorA">{{ taskDetail.r_userInfo.name }}</span>
                                <i class="el-icon-error" @click.prevent.stop="deleteReview()"></i>
@@ -282,7 +287,7 @@
                            </div>
                        </div>
                        <template v-else>
-                            <i v-if="taskDetail.can_edit_reviewer" class="el-icon-plus icon-border cursor" @click="selectUser(2)"></i>
+                        <i v-if="taskDetail.can_edit_reviewer" class="el-icon-plus icon-border cursor" @click="!readonly && selectUser(2)"></i>
                        </template>
                   </div>
                   <div>
@@ -291,9 +296,9 @@
                          <div class="flex-box-ce cursor userItem" v-for="item in taskDetail.joiner_employee_items" :key="item.id" style="margin-right: 10px;">
                              <userImage :id="item.id" width="32px" height="32px" fontSize="13" :user_name="item.name"></userImage>
                              <span style="padding-left: 10px;" class="fontColorA">{{item.name}}</span>
-                             <i class="el-icon-error" @click="joinerUpdate(false,item.id)" v-if="taskDetail.can_edit_normal"></i>
+                             <i class="el-icon-error" @click="joinerUpdate(false,item.id)" v-if="!readonly && taskDetail.can_edit_normal"></i>
                          </div>
-                         <i class="el-icon-plus icon-border cursor" @click="selectUser(3)" v-if="taskDetail.can_edit_normal"></i>
+                         <i class="el-icon-plus icon-border cursor" @click="!readonly && selectUser(3)" v-if="taskDetail.can_edit_normal"></i>
                        </div>
                   </div>
                 </div>
@@ -302,8 +307,8 @@
                   <div class="label"><i class="el-icon-tickets"></i>母任务</div>
                   <div>
                     <span v-if="taskDetail.pid" class="showUpdate flex-box-ce">
-                      <span class="hoverBlue" @click="openTask(taskDetail.pid)">{{taskDetail.pname}}</span>
-                       <template v-if="taskDetail.can_edit_normal">
+                      <span class="hoverBlue" @click="!readonly && openTask(taskDetail.pid)">{{taskDetail.pname}}</span>
+                       <template v-if="!readonly && taskDetail.can_edit_normal">
                           <Tooltip preHtml="取消关联">
                               <i class="el-icon-error" style="display: none;" @click="relieveKr(3)"></i>
                           </Tooltip>
@@ -312,7 +317,7 @@
                           </Tooltip>
                       </template>
                     </span>
-                    <span v-else class="showUpdate flex-box-ce">暂无母任务 <i v-if="taskDetail.can_edit_normal" class="el-icon-plus" style="display: none;" @click="isShowRelevanceTask=true">添加</i></span>
+                    <span v-else class="showUpdate flex-box-ce">暂无母任务 <i v-if="!readonly && taskDetail.can_edit_normal" class="el-icon-plus" style="display: none;" @click="isShowRelevanceTask=true">添加</i></span>
                   </div>
                 </div>
                 <div class="flex-box-ce kr-message-item">
@@ -331,14 +336,14 @@
                     <span v-if="taskDetail.main.kr_id" class="showUpdate flex-box-ce">
                       <div style="max-width: 200px;" class="flex-box-ce font-flex-word">
                           <span class="krIcon">O</span>
-                          <span class="clamp cursor" style="max-width: 300px;" @click="openDetail(taskDetail.main.o_id,1)">{{taskDetail.main.o_name}}</span>
+                          <span class="clamp cursor" style="max-width: 300px;" @click="!readonly && openDetail(taskDetail.main.o_id,1)">{{taskDetail.main.o_name}}</span>
                       </div>
                       <div style="padding:0 10px">-</div>
                       <div style="max-width: 200px;" class="flex-box-ce font-flex-word">
                           <span class="krIcon">KR</span>
-                          <span class="clamp cursor" style="max-width: 300px;" @click="openDetail(taskDetail.main.kr_id,2)">{{taskDetail.main.kr_name}}</span>
+                          <span class="clamp cursor" style="max-width: 300px;" @click="!readonly && openDetail(taskDetail.main.kr_id,2)">{{taskDetail.main.kr_name}}</span>
                       </div>
-                      <template v-if="taskDetail.can_edit_normal">
+                      <template v-if="!readonly && taskDetail.can_edit_normal">
                         <Tooltip preHtml="更改所属KR/项目:请先更改母任务的所属KR/项目或取消关联母任务" v-if="taskDetail.pid">
                             <i class="el-icon-edit" style="display: none;">编辑</i>
                         </Tooltip>
@@ -361,7 +366,7 @@
                           <span class="krIcon">里程碑</span>
                           <span class="clamp" style="max-width: 300px;">{{taskDetail.main.milestone_name}}</span>
                       </div>
-                      <template v-if="taskDetail.can_edit_normal">
+                      <template v-if="!readonly && taskDetail.can_edit_normal">
                         <Tooltip preHtml="更改所属KR/项目:请先更改母任务的所属KR/项目或取消关联母任务" v-if="taskDetail.pid">
                             <i class="el-icon-edit" style="display: none;">编辑</i>
                         </Tooltip>
@@ -379,7 +384,7 @@
                           <span class="krIcon">项目</span>
                           <span class="clamp" style="max-width: 300px;">{{taskDetail.main.project_name}}</span>
                       </div>
-                      <template v-if="taskDetail.can_edit_normal">
+                      <template v-if="!readonly && taskDetail.can_edit_normal">
                         <Tooltip preHtml="更改所属KR/项目:请先更改母任务的所属KR/项目或取消关联母任务" v-if="taskDetail.pid">
                             <i class="el-icon-edit" style="display: none;">编辑</i>
                         </Tooltip>
@@ -397,7 +402,7 @@
                             <i class="el-icon-edit" style="display: none;">编辑</i>
                         </Tooltip>
                         <Tooltip preHtml="编辑" v-else>
-                          <i class="el-icon-plus" style="display: none;" @click="openGlKr(1)" v-if="taskDetail.can_edit_normal">编辑</i>
+                          <i class="el-icon-plus" style="display: none;" @click="openGlKr(1)" v-if="!readonly && taskDetail.can_edit_normal">编辑</i>
                         </Tooltip>
                     </span>
                   </div>
@@ -416,7 +421,7 @@
                            <span class="krIcon">KR</span>
                            <span @click="openDetail(item.kr_id,2)" style="max-width: 200px;"  class="font-flex-word cursor">{{item.kr_name}}</span>
                         </div>
-                        <template v-if="taskDetail.can_edit_normal">
+                        <template v-if="!readonly && taskDetail.can_edit_normal">
                             <i class="el-icon-error" style="display: none;" @click="relieveKr(2,item)"></i>
                             <Tooltip preHtml="新增">
                               <i class="el-icon-plus" style="display: none;" @click="openGlKr(2)">新增</i>
@@ -426,7 +431,7 @@
                     </template>
                     <span v-else class="showUpdate cursor flex-box-ce">暂无
                        <Tooltip preHtml="新增">
-                         <i class="el-icon-plus cursor" style="display: none;" @click="openGlKr(2)" v-if="taskDetail.can_edit_normal">新增</i>
+                         <i class="el-icon-plus cursor" style="display: none;" @click="openGlKr(2)" v-if="!readonly && taskDetail.can_edit_normal">新增</i>
                        </Tooltip>
                     </span>
                   </div>
@@ -436,7 +441,7 @@
                   <div class="label"><i class="el-icon-paperclip"></i>任务附件</div>
                   <div>
                     <uploadOss :file-list="[]" :headers="$xtoken" :action="$action" :limit="1" :accept="$acceptImgFile" :multiple="true" :on-success="handleSuccess" :before-upload="beforeFilesUpload">
-                         <span class="fontColorC cursor" v-if="taskDetail.can_edit_normal"><i class="el-icon-paperclip green" style="padding-right: 5px;"></i>添加附件</span>
+                         <span class="fontColorC cursor" v-if="!readonly && taskDetail.can_edit_normal"><i class="el-icon-paperclip green" style="padding-right: 5px;"></i>添加附件</span>
                     </uploadOss>
                     <div v-if="files.length>0" class="flex-box-ce flex-d-wrap" style="margin-top: 20px;">
                         <div class="files-box flex-box-ce" v-for="(item,index) in files" :key="index">
@@ -445,7 +450,7 @@
                           <Tooltip :preHtml="item.name">
                               <div style="margin-left: 10px;width: 120px;">{{item.name}}</div>
                           </Tooltip>
-                          <Tooltip preHtml="删除" v-if="taskDetail.can_edit_normal">
+                          <Tooltip preHtml="删除" v-if="!readonly && taskDetail.can_edit_normal">
                               <i class="el-icon-error cursor" @click="deleteFlie(item.file)"></i>
                           </Tooltip>
                         </div>
@@ -463,16 +468,17 @@
           <div class="flex-box-ce" style="border-bottom:1px solid #f1f1f1">
             <div class="tabs-item" :class="tabsIndex == item.code ? 'tabs-item-active' : ''" v-for="(item, index) in tabs" :key="index" @click="tabAction(item)">
               {{ item.name }}
-              <span v-if="item.code==2&&taskTotal">({{taskTotal}})</span>
+              <span v-if="item.code==2 && taskTotal">({{taskTotal}})</span>
             </div>
           </div>
 
           <div style="padding: 20px 0;">
             <template v-if="tabsIndex==1">
-              <Interaction v-if="tabsIndex == 1" :target_id="id" :target_type="3" ref="Interaction"></Interaction>
+              <Interaction v-if="tabsIndex == 1" :readonly="readonly" :target_id="id" :target_type="3" ref="Interaction"></Interaction>
             </template>
             <template v-if="tabsIndex==2">
-                <div class="flex-box-end" v-if="taskDetail.can_edit_normal" style="margin-bottom: 10px;"><div class="blue cursor" @click="isShowAddTask=true"><i class="el-icon-plus"></i> 添加子任务</div></div>
+                <div class="flex-box-end" v-if="!readonly && taskDetail.can_edit_normal" style="margin-bottom: 10px;">
+                  <div class="blue cursor" @click="isShowAddTask=true"><i class="el-icon-plus"></i> 添加子任务</div></div>
                 <div>
                   <div class="flex-box-ce child-task-item" v-for="(item,index) in taskList" :key="index">
                       <Tooltip :preHtml="item.stateInfo.name">
@@ -484,19 +490,19 @@
                       <div class="blue" style="margin-right: 10px;">{{item.process}}%</div>
                       <div>{{$moment(item.end_date).format('MM/DD')}}</div>
                       <div style="margin: 0 10px;">{{item.userInfo.name}}</div>
-                      <el-popconfirm title="此操作不可恢复,您确定删除吗?" @confirm="deleteTask(item)" v-if="taskDetail.can_delete">
+                      <el-popconfirm title="此操作不可恢复,您确定删除吗?" @confirm="deleteTask(item)" v-if="!readonly && taskDetail.can_delete">
                         <div style="width: 30px; text-align: center;" slot="reference">
                             <span class="red" style="display:none">删除</span>
                         </div>
                       </el-popconfirm>
                   </div>
                   <div class="dotted-line" v-if="taskList.length==0">
-                        <div>暂无子任务</div>
+                      <div>暂无子任务</div>
                   </div>
                 </div>
             </template>
             <template v-if="tabsIndex==3">
-               <Evolve :target_id="id" :target_type="3" style="padding: 0;" :isOperation="isOperation"></Evolve>
+               <Evolve :target_id="id" :target_type="3" style="padding: 0;" :isOperation="isOperation" :readonly="readonly"></Evolve>
             </template>
             <template v-if="tabsIndex==4">
                 <div v-if="taskDetail.review_info.length>0">
@@ -516,16 +522,18 @@
                           <p class="pre" style="margin: 10px 0;">理由: {{item.refuse_content}}</p>
                         </div>
                       </div>
-                      <template v-if="item.status==0&&item.reviewer_id==userInfo.id&&index==0">
-                        <el-button size="mini" round   type="danger" plain @click="reviewT(2)">拒绝</el-button>
-                        <el-button size="mini" round  type="primary" plain @click="reviewT(1)">通过</el-button>
+                      <template v-if="item.status==0 && item.reviewer_id == userInfo.id && index == 0">
+                        <el-button v-if="!readonly" size="mini" round type="danger" plain @click="reviewT(2)">拒绝</el-button>
+                        <el-button v-if="!readonly" size="mini" round type="primary" plain @click="reviewT(1)">通过</el-button>
                       </template>
                     </div>
                 </div>
                 <div class="dotted-line" v-else><div>暂无任何审批</div></div>
             </template>
             <template v-if="tabsIndex==5">
-               <div class="flex-box-end" style="margin-bottom: 10px;" v-if="isOperation"><div class="blue cursor" @click="openPlan()"><i class="el-icon-plus"></i>添加工时</div></div>
+               <div class="flex-box-end" style="margin-bottom: 10px;" v-if="!readonly && isOperation">
+                <div class="blue cursor" @click="openPlan()"><i class="el-icon-plus"></i>添加工时</div>
+              </div>
                <template v-if="planList.length>0">
                  <div class="flex-box-ce fontColorC" style="margin-bottom: 20px;">
                     <span style="font-size: 14px;">任务工时总计</span>
@@ -542,7 +550,7 @@
                          <span v-if="item.isShow">收起 <i class="el-icon-arrow-down"></i></span>
                          <span v-else>展开 <i class="el-icon-arrow-up"></i></span>
                         </span>
-                       <div style="width: 30px; text-align: center;"><span class="orange" style="display:none" v-if="isOperation" @click.prevent.stop="openPlan(item)">编辑</span></div>
+                       <div style="width: 30px; text-align: center;"><span class="orange" style="display:none" v-if="!readonly && isOperation" @click.prevent.stop="openPlan(item)">编辑</span></div>
                    </div>
                    <CollapseTransition>
                      <div style="padding: 8px 20px;background-color: #F6FAFF;font-size: 13px;margin-bottom:10px" v-show="item.isShow">
@@ -582,7 +590,7 @@
             </el-form>
         </div>
         <div class="flex-box-end" style="margin-top: 50px;">
-          <el-button size="small"  @click="isShowDqMyTarget = false">取 消</el-button>
+          <el-button size="small"  @click="close_before">取 消</el-button>
           <el-button size="small" type="primary"  @click="confirmTime">确 定</el-button>
         </div>
       </el-dialog>
@@ -659,6 +667,10 @@ export default {
   name: 'TaskDetail',
   components:{uploadOss,AddTask,Interaction,Evolve,CollapseTransition,Tooltip,EmployeeSelector,Feedback,Progress,TargetSearch,RelevanceTask,TargetDetail,AddEvole},
   props: {
+    readonly: {
+      type: Boolean,
+      default: false
+    },
     visible: {
       // 是否显示组件
       type: Boolean,
@@ -688,10 +700,12 @@ export default {
     },
     visible(val) {
       this.visible_ = JSON.parse(JSON.stringify(val));
-      this.tabsIndex=0;
+      this.tabsIndex = 0;
+      this.getUnitList();
+
       if(val){
-        this.isShowGd=false;
-        this.id=this.taskId;
+        this.isShowGd = false;
+        this.id = this.taskId;
         if(this.isApprove){
           this.tabsIndex=4;
         }else{
@@ -702,16 +716,16 @@ export default {
       }
     },
     isShowTarget(val){
-      if(val){
-        this.target=this.taskDetail.quantify.target;//目标
-        this.unit=this.taskDetail.quantify.unit||this.$getCache('unitList')[0].name;//单位
+      if (val) {
+        this.target = this.taskDetail.quantify.target;//目标
+        this.unit = this.taskDetail.quantify.unit || this.$getCache('unitList')[0].name;//单位
         // this.result=this.taskDetail.quantify.result;//结果值
       }
     },
     isShowResult(val){
       if(val){
-        this.unit=this.taskDetail.quantify.unit||this.$getCache('unitList')[0].name;//单位
-        this.result=this.taskDetail.quantify.result;//结果值
+        this.unit = this.taskDetail.quantify.unit || this.$getCache('unitList')[0].name;//单位
+        this.result = this.taskDetail.quantify.result;//结果值
       }else{
         this.content='';
         this.files_lh=[];
@@ -875,6 +889,13 @@ export default {
     };
   },
   methods: {
+    getUnitList() {
+      this.$axiosUser('get', '/api/pro/okr/public/kr/unit_list').then(res => {
+        let data = res.data.data;
+        data.reverse()
+        this.$setCache('unitList', data)
+      })
+    },
     deleteFlie2(index){
       this.files_lh.splice(index,1);
       this.files_lh_list.splice(index,1);
@@ -901,12 +922,12 @@ export default {
     },
     deleteFlie(file){
       this.$axiosUser('post', '/api/pro/okr/plan/file/delete',{plan_id:this.id,file:file}).then(res => {
-            this.getTaskDateil()
+        this.getTaskDateil()
       })
     },
     handleSuccess(response, file, fileList) {
        this.$axiosUser('post', '/api/pro/okr/plan/file',{plan_id:this.id,file:fileList[0].url}).then(res => {
-             this.getTaskDateil()
+          this.getTaskDateil()
        })
     },
     // 图片上传
@@ -1034,27 +1055,27 @@ export default {
       })
     },
     floatAdd(arg1,arg2){ //解决JS精度问题
-            var r1,r2,m;
-            try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
-            try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
-            m=Math.pow(10,Math.max(r1,r2));
-            return parseInt(Math.round(arg1*m)+Math.round(arg2*m))/m;
+      var r1,r2,m;
+      try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
+      try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
+      m=Math.pow(10,Math.max(r1,r2));
+      return parseInt(Math.round(arg1*m)+Math.round(arg2*m))/m;
     },
     deleteTime(){
       this.$axiosUser('POST', '/api/pro/okr/plan/feedback/clear',{plan_id:this.id}).then(res => {
-           this.getTaskDateil();
+        this.getTaskDateil();
       })
     },
     deleteReview(){
       let params={plan_id:this.id,reviewer_id:0};
       this.$axiosUser('POST', '/api/pro/okr/plan/reviewer', params).then(res => {
-          this.getTaskDateil()
+        this.getTaskDateil()
       })
     },
     reviewT(index){
       if(index==1){
         this.$axiosUser('POST', '/api/pro/okr/plan/state/agree',{plan_id:this.id}).then(res => {
-             this.getTaskDateil();
+          this.getTaskDateil();
         })
       }else{
         this.$prompt('请输入拒绝理由', '提示', {
@@ -1066,48 +1087,51 @@ export default {
               return false;
             }
             this.$axiosUser('POST', '/api/pro/okr/plan/state/refuse',{plan_id:this.id,content:value}).then(res => {
-                 this.getTaskDateil();
+              this.getTaskDateil();
             })
         }).catch(() => {});
       }
     },
     deleteTask(item){
         this.$axiosUser('POST', '/api/pro/okr/plan/relate/delete',{plan_id:item.id,target_type:3,target_id:this.id,type:1}).then(res => {
-             this.getTaskList();
+          this.getTaskList();
         })
     },
-    getTaskList(){
-      this.$axiosUser('get', '/api/pro/okr/plan/list/sub',{plan_id:this.id}).then(res => {
-           let list=res.data.data.list
-           list.forEach(item=>{
-             item.isShow=false;
-             item.stateInfo=taskStatus(item.composite_state);
-             item.userInfo=this.$getEmployeeMapItem(item.owner_id)
-           })
-           this.taskTotal=res.data.data.total
-           this.taskList=list;
+    getTaskList() {
+      let api_url = ""
+      if (!this.readonly) api_url = '/api/pro/okr/plan/list/sub'
+      else api_url = '/api/pro/okr/public/plan/list/sub'
+      this.$axiosUser('get', api_url, {plan_id: this.id}).then(res => {
+        let list=res.data.data.list
+        list.forEach(item=>{
+          item.isShow = false;
+          item.stateInfo = taskStatus(item.composite_state);
+          item.userInfo=this.$getEmployeeMapItem(item.owner_id)
+        })
+        this.taskTotal=res.data.data.total
+        this.taskList=list;
       })
     },
     relieveKr(index,item){
       if(index==1){ //KR
         this.$axiosUser('POST', '/api/pro/okr/plan/relate/delete',{plan_id:this.id,target_type:2,target_id:this.taskDetail.main.kr_id,type:2}).then(res => {
-             this.getTaskDateil();
+          this.getTaskDateil();
         })
       }else if(index==2){ //其他KR
         this.$axiosUser('POST', '/api/pro/okr/plan/relate/delete',{plan_id:this.id,target_type:2,target_id:item.kr_id,type:3}).then(res => {
-             this.getTaskDateil();
+          this.getTaskDateil();
         })
       }else if(index==4){ //项目
         this.$axiosUser('POST', '/api/pro/okr/plan/relate/delete',{plan_id:this.id,target_type:4,target_id:this.taskDetail.main.project_id,type:2}).then(res => {
-             this.getTaskDateil();
+          this.getTaskDateil();
         })
       }else if(index==5){ //里程碑
         this.$axiosUser('POST', '/api/pro/okr/plan/relate/delete',{plan_id:this.id,target_type:5,target_id:this.taskDetail.main.milestone_id,type:2}).then(res => {
-             this.getTaskDateil();
+          this.getTaskDateil();
         })
       }else{ //母任务
         this.$axiosUser('POST', '/api/pro/okr/plan/relate/delete',{plan_id:this.id,target_type:3,target_id:this.taskDetail.pid,type:1}).then(res => {
-             this.getTaskDateil();
+          this.getTaskDateil();
         })
       }
     },
@@ -1115,7 +1139,7 @@ export default {
     ActiveRelevanceTask(item){
         if(item.id){
           this.$axiosUser('POST', '/api/pro/okr/plan/relate/plan',{plan_id:this.id,target_plan_id:item.id}).then(res => {
-               this.getTaskDateil();
+            this.getTaskDateil();
           })
         }else{
           this.relieveKr(3)
@@ -1140,7 +1164,7 @@ export default {
             target_id:e.item.id,
           };
           this.$axiosUser('POST',url,data).then(res => {
-              this.getTaskDateil();
+            this.getTaskDateil();
           })
         }
     },
@@ -1153,20 +1177,20 @@ export default {
     },
     processUpdate(item){
 
-      // this.$axiosUser('post','api/okr/process/create',{target_type:3,target_id:this.id,process:this.process||0}).then(res => {
-          this.getTaskDateil(()=>{
-            if(item.process&&item.process>=100){
-              this.$confirm('当前任务进度已达到100%,是否将任务设为 【已完成】 状态?', '提示', {
-                confirmButtonText: '确定',
-                cancelButtonText: '取消',
-                type: 'success '
-              }).then(() => {
-                  this.handleCommand(3)
-              })
-            }
-          });
-      // })
-      // this.isShowProcessInput=false;
+    // this.$axiosUser('post','api/okr/process/create',{target_type:3,target_id:this.id,process:this.process||0}).then(res => {
+      this.getTaskDateil(()=>{
+        if(item.process&&item.process>=100){
+          this.$confirm('当前任务进度已达到100%,是否将任务设为 【已完成】 状态?', '提示', {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'success '
+          }).then(() => {
+              this.handleCommand(3)
+          })
+        }
+      });
+    // })
+    // this.isShowProcessInput=false;
     },
     operation(index){
       if(!this.target){
@@ -1178,9 +1202,9 @@ export default {
         return false
       }
       if(index==1){ //计划新增量化配置
-          this.$axiosUser('post','api/pro/okr/plan/quantify',{plan_id:this.id,target:this.target,unit:this.unit}).then(res => {
-              this.getTaskDateil();
-          })
+        this.$axiosUser('post','api/pro/okr/plan/quantify',{plan_id:this.id,target:this.target,unit:this.unit}).then(res => {
+          this.getTaskDateil();
+        })
       }
       if(index==2){ //实际值配置
           let data={plan_id:this.id,result:this.result,content:this.content};
@@ -1203,8 +1227,8 @@ export default {
           return false
       }
       let data={
-        plan_id:this.id,
-        visible_type:this.visible_type,
+        plan_id: this.id,
+        visible_type: this.visible_type,
       }
       if(this.visible_type==5){
         let dept_ids=this.dept_selected.dept.map(item=>{
@@ -1349,54 +1373,55 @@ export default {
     //任务详情
     getTaskDateil(func=function(){}){
        this.initData()
-       this.loading=true;
-       this.$axiosUser('get', '/api/pro/okr/plan/info',{plan_id:this.id}).then(res => {
-            let data=res.data.data;
-            data.day=this.$moment(data.end_date).diff(this.$moment().format('YYYY-MM-DD'), 'day')
-            data.stateInfo=taskStatus(data.composite_state);
-            data.p_userInfo=this.$getEmployeeMapItem(data.publisher_id)//发布人
-            data.userInfo=this.$getEmployeeMapItem(data.owner_id)//负责人
-            data.r_userInfo=this.$getEmployeeMapItem(data.reviewer_id)//审批人
-            data.joiner_employee_items=data.joiner_ids.map(e=>{//参与人员
-                return this.$getEmployeeMapItem(e)
-            })
-            if(data.quantify.target){
-              this.target=data.quantify.target||'';
-              this.result=data.quantify.result||'';
-              this.unit=data.quantify.unit;
-            }
-            if(data.feedback){
-              let feedback=data.feedback;
-              if(feedback.scope_type==1){ //每日
-                this.feedbackData.feedbackTime='每天 '+feedback.daily_time;
-              }else if(feedback.scope_type==3||feedback.scope_type==4){ //每周||每月
-                this.feedbackData.feedbackTime=`${feedback.scope_type==3? '每周/':'每月'}${this.returnTime(feedback)}`
-              }else{ //其他
-                this.feedbackData.feedbackTime=feedback.special_date
-              }
-            }
-            if(data.pid){
-              this.pid=data.pid
-            }
-            this.isOperation=getOperation(data.publisher_id,data.owner_id);
-            this.fileList=data.files
-            this.files=data.files
-            this.wh=data.wh
-            this.taskDetail=data;
-            if(data.visible_type==5){//部门可见
-              this.dept_tree = this.$getCache('dept_tree');
-              data.special_dept_ids.forEach(id=>{
-                  this.getDept(id,this.dept_tree);
-              })
+       this.loading = true;
+        let url = !this.readonly ? '/api/pro/okr/plan/info' : '/api/pro/okr/public/plan/info'
+      this.$axiosUser('get', url,{plan_id:this.id}).then(res => {
+          let data=res.data.data;
+          data.day=this.$moment(data.end_date).diff(this.$moment().format('YYYY-MM-DD'), 'day')
+          data.stateInfo=taskStatus(data.composite_state);
+          data.p_userInfo=this.$getEmployeeMapItem(data.publisher_id)//发布人
+          data.userInfo=this.$getEmployeeMapItem(data.owner_id)//负责人
+          data.r_userInfo=this.$getEmployeeMapItem(data.reviewer_id)//审批人
+          data.joiner_employee_items=data.joiner_ids.map(e=>{//参与人员
+              return this.$getEmployeeMapItem(e)
+          })
+          if(data.quantify.target){
+            this.target=data.quantify.target||'';
+            this.result=data.quantify.result||'';
+            this.unit=data.quantify.unit;
+          }
+          if(data.feedback){
+            let feedback=data.feedback;
+            if(feedback.scope_type==1){ //每日
+              this.feedbackData.feedbackTime='每天 '+feedback.daily_time;
+            }else if(feedback.scope_type==3||feedback.scope_type==4){ //每周||每月
+              this.feedbackData.feedbackTime=`${feedback.scope_type==3? '每周/':'每月'}${this.returnTime(feedback)}`
+            }else{ //其他
+              this.feedbackData.feedbackTime=feedback.special_date
             }
-            func()
+          }
+          if(data.pid){
+            this.pid=data.pid
+          }
+          this.isOperation=getOperation(data.publisher_id,data.owner_id);
+          this.fileList=data.files
+          this.files=data.files
+          this.wh=data.wh
+          this.taskDetail=data;
+          if(data.visible_type==5){//部门可见
+            this.dept_tree = this.$getCache('dept_tree');
+            data.special_dept_ids.forEach(id=>{
+                this.getDept(id,this.dept_tree);
+            })
+          }
+          func()
        }).finally(res=>{
           this.loading=false;
        })
     },
     initData(){
-       this.target=0;//目标
-       this.unit=this.$getCache('unitList')[0].name;//单位
+       this.target = 0;//目标
+       this.unit = this.$getCache('unitList')[0].name;//单位
        this.result=0;//结果值
        this.feedbackData={//反馈时间
           feedbackTime:'',
@@ -1430,9 +1455,12 @@ export default {
     },
     deleteTarget(){
       this.$axiosUser('post', 'api/pro/okr/plan/quantify/remove', {plan_id:this.id}).then(res => {
-          this.getTaskDateil();
+        this.getTaskDateil();
       })
     },
+    closeDialog() {
+      this.$emit("closeDialog")
+    },
     confirmTime(){
       if(!this.time||this.time.length==0){
         this.$message.error("请选择时间");
@@ -1444,8 +1472,8 @@ export default {
         end_date:this.time[1],
       }
       this.$axiosUser('post', 'api/pro/okr/plan/time', params).then(res => {
-          this.isShowDqMyTarget=false;
-          this.getTaskDateil();
+        this.isShowDqMyTarget=false;
+        this.getTaskDateil();
       })
     },
     inputFocus(index){
@@ -1483,8 +1511,9 @@ export default {
     tabAction(item) {
       this.tabsIndex = item.code;
     },
-    close_before(done=function(){}) {
-      this.visible_=false;
+    close_before(done = function () { }) {
+      console.log("关闭")
+      this.visible_ = false;
       this.$emit('update:visible', false);
       this.$emit('confirm', {});
       done();

+ 193 - 154
src/okr/components/public/TaskItem.vue

@@ -1,139 +1,167 @@
 <template>
-    <div>
-      <CollapseTransition>
-        <div v-show="isShow">
-          <div class="taskBox" v-if="projects.length>0">
-            <div v-for="(item,index) in projects" :key="index" class="flex-box-ce isSimpleShow" @click.prevent.stop="openDetail2(item)">
-                <div class="flex-1 clamp2" style="padding-right: 30px;">
-                  <i class="el-icon-s-finance" style="margin-right: 10px;"></i>
-                  <Tooltip :preHtml="item.name" class="hoverBlue"><span>{{item.name}}</span></Tooltip>
-                </div>
+  <div>
+    <CollapseTransition>
+      <div v-show="isShow">
+        <div class="taskBox" v-if="projects.length > 0">
+          <!-- 项目 -->
+          <div v-for="(item,index) in projects" :key="item.name" class="flex-box-ce isSimpleShow"
+            @click.prevent.stop="!readonly && openDetail2(item)">
+            <div class="flex-1 clamp2" style="padding-right: 30px;">
+              <i class="el-icon-s-finance" style="margin-right: 10px;"></i>
+              <Tooltip :preHtml="item.name" class="hoverBlue"><span>{{item.name}}</span></Tooltip>
+            </div>
+            <template v-if="isParent">
+              <div class="hover-border2"> <svg-icon icon-class="#icon-biaoqian_wode"
+                  class="svgIcon"></svg-icon><span>{{$getEmployeeMapItem(item.owner_id).name}}</span></div>
+              <div class="hover-border2" style="margin: 0 30px;text-align: center;width: 52px;">
+                <span>{{$moment(item.end_date).format('MM/DD')}}</span>
+              </div>
+              <div class="flex-box-ce" v-if="item.process">
+                <el-progress :stroke-width="3" v-if="item.process>100" color="#2879ff" :show-text="false" :width="20"
+                  type="circle" :percentage="100"></el-progress>
+                <el-progress :stroke-width="3" v-else :show-text="false" color="#2879ff" :width="20" type="circle"
+                  :percentage="Number(item.process)"></el-progress>
+                <span style="padding-left: 5px;">{{item.process}}%</span>
+              </div>
+              <div v-if="item.can_edit && !readonly" style="width: 20px;height: 20px;margin-left: 30px;cursor: pointer;"
+                @click.prevent.stop="qxGl(item)">
+                <Tooltip preHtml="取消关联"><i class="el-icon-link"></i></Tooltip>
+              </div>
+              <div v-else style="width: 20px;height: 20px;margin-left: 30px;"></div>
+            </template>
+          </div>
+          <!-- 项目 -->
+        </div>
+        <div class="taskBox">
+          <template v-if="parentList.length>0">
+            <div v-for="(item,index) in parentList" :key="index">
+              <div class="flex-box-ce isSimpleShow">
                 <template v-if="isParent">
-                  <div class="hover-border2"> <svg-icon icon-class="#icon-biaoqian_wode" class="svgIcon"></svg-icon><span>{{$getEmployeeMapItem(item.owner_id).name}}</span></div>
-                  <div class="hover-border2" style="margin: 0 30px;text-align: center;width: 52px;">
+                  <i class="caret" v-if="item.statistics.plan_total > 0"
+                    :class="item.isShow? 'el-icon-caret-bottom':'el-icon-caret-right'" @click="showTask(item)"></i>
+                </template>
+                <template v-else>
+                  <i class="caret" v-if="item.child&&item.child.length>0"
+                    :class="item.isShow? 'el-icon-caret-bottom':'el-icon-caret-right'" @click="showTask(item)"></i>
+                </template>
+                <Tooltip :preHtml="item.stateInfo.name">
+                  <i :class="item.stateInfo.icon" style="margin-right: 10px;">
+                  </i>
+                </Tooltip>
+                <!-- 可操作 -->
+                <template v-if="isSimpleShow==1">
+                  <div class="flex-1 clamp2" style="padding-right: 30px;">
+                    <Tooltip :preHtml="item.name"><span class="hoverBlue"
+                        @click.prevent.stop="openDetail(item)">{{item.name}}</span></Tooltip>
+                  </div>
+                  <div class="hover-border" @click="openSelectTime(item,2)"> <svg-icon icon-class="#icon-biaoqian_wode"
+                      class="svgIcon"></svg-icon><span>{{item.userInfo.name}}</span></div>
+                  <div class="hover-border" style="margin: 0 30px;text-align: center;width: 52px;"
+                    @click="openSelectTime(item,1)">
                     <span>{{$moment(item.end_date).format('MM/DD')}}</span>
                   </div>
                   <div class="flex-box-ce" v-if="item.process">
-                    <el-progress :stroke-width="3" v-if="item.process>100" color="#2879ff" :show-text="false" :width="20" type="circle" :percentage="100"></el-progress>
-                    <el-progress :stroke-width="3" v-else :show-text="false" color="#2879ff" :width="20" type="circle" :percentage="Number(item.process)"></el-progress>
+                    <el-progress :stroke-width="3" v-if="item.process>100" :color="customColorMethod(item.level)"
+                      :show-text="false" :width="20" type="circle" :percentage="100"></el-progress>
+                    <el-progress :stroke-width="3" v-else :show-text="false" :color="customColorMethod(item.level)"
+                      :width="20" type="circle" :percentage="Number(item.process)"></el-progress>
                     <span style="padding-left: 5px;">{{item.process}}%</span>
                   </div>
-                  <div v-if="item.can_edit" style="width: 20px;height: 20px;margin-left: 30px;cursor: pointer;" @click.prevent.stop="qxGl(item)">
-                     <Tooltip preHtml="取消关联"><i class="el-icon-link"></i></Tooltip>
-                  </div>
+                  <template
+                    v-if="!readonly && (item.can_stop == 1 || item.can_cancel == 1||item.can_finish==1||item.can_reset==1||isShowBinding)">
+                    <el-dropdown @command="handleCommand($event,item)" trigger="click" class="hoverBlue">
+                      <i class="el-icon-more"></i>
+                      <el-dropdown-menu slot="dropdown">
+                        <el-dropdown-item :command="1" v-if="item.can_stop==1">暂停任务</el-dropdown-item>
+                        <el-dropdown-item :command="2" v-if="item.can_cancel==1">取消任务</el-dropdown-item>
+                        <el-dropdown-item :command="3" v-if="item.can_finish==1">完成任务</el-dropdown-item>
+                        <el-dropdown-item :command="4" v-if="item.can_reset==1">重置任务</el-dropdown-item>
+                        <el-dropdown-item :command="5"
+                          v-if="isShowBinding && item.can_edit_normal==1">取消关联</el-dropdown-item>
+                      </el-dropdown-menu>
+                    </el-dropdown>
+                  </template>
                   <div v-else style="width: 20px;height: 20px;margin-left: 30px;"></div>
                 </template>
-            </div>
-          </div>
-          <div class="taskBox">
-              <template v-if="parentList.length>0">
-                <div v-for="(item,index) in parentList" :key="index">
-                  <div class="flex-box-ce isSimpleShow">
-                    <template v-if="isParent">
-                      <i class="caret" v-if="item.statistics.plan_total>0" :class="item.isShow? 'el-icon-caret-bottom':'el-icon-caret-right'" @click="showTask(item)"></i>
-                    </template>
-                    <template v-else>
-                      <i class="caret" v-if="item.child&&item.child.length>0" :class="item.isShow? 'el-icon-caret-bottom':'el-icon-caret-right'" @click="showTask(item)"></i>
-                    </template>
-                    <Tooltip :preHtml="item.stateInfo.name"><i :class="item.stateInfo.icon" style="margin-right: 10px;"></i></Tooltip>
-                    <!-- 可操作 -->
-                    <template v-if="isSimpleShow==1">
-                      <div class="flex-1 clamp2" style="padding-right: 30px;">
-                        <Tooltip :preHtml="item.name"><span class="hoverBlue" @click.prevent.stop="openDetail(item)">{{item.name}}</span></Tooltip>
-                      </div>
-                      <div class="hover-border" @click="openSelectTime(item,2)"> <svg-icon icon-class="#icon-biaoqian_wode" class="svgIcon"></svg-icon><span>{{item.userInfo.name}}</span></div>
-                      <div class="hover-border" style="margin: 0 30px;text-align: center;width: 52px;" @click="openSelectTime(item,1)">
-                        <span>{{$moment(item.end_date).format('MM/DD')}}</span>
-                      </div>
-                      <div class="flex-box-ce" v-if="item.process">
-                       <el-progress :stroke-width="3" v-if="item.process>100" :color="customColorMethod(item.level)" :show-text="false" :width="20" type="circle" :percentage="100"></el-progress>
-                       <el-progress :stroke-width="3" v-else :show-text="false" :color="customColorMethod(item.level)" :width="20" type="circle" :percentage="Number(item.process)"></el-progress>
-                        <span style="padding-left: 5px;">{{item.process}}%</span>
-                      </div>
-                      <template v-if="item.can_stop==1||item.can_cancel==1||item.can_finish==1||item.can_reset==1||isShowBinding">
-                        <el-dropdown @command="handleCommand($event,item)" trigger="click" class="hoverBlue">
-                         <i class="el-icon-more"></i>
-                         <el-dropdown-menu slot="dropdown">
-                            <el-dropdown-item :command="1" v-if="item.can_stop==1">暂停任务</el-dropdown-item>
-                            <el-dropdown-item :command="2" v-if="item.can_cancel==1">取消任务</el-dropdown-item>
-                            <el-dropdown-item :command="3" v-if="item.can_finish==1">完成任务</el-dropdown-item>
-                            <el-dropdown-item :command="4" v-if="item.can_reset==1">重置任务</el-dropdown-item>
-                            <el-dropdown-item :command="5" v-if="isShowBinding&&item.can_edit_normal==1">取消关联</el-dropdown-item>
-                          </el-dropdown-menu>
-                        </el-dropdown>
-                      </template>
-                      <div v-else style="width: 20px;height: 20px;margin-left: 30px;"></div>
-                    </template>
-                    <!-- 不可操作 -->
-                    <template v-if="isSimpleShow==2">
-                      <div class="flex-1 clamp2" style="padding-right: 30px;">
-                        <Tooltip :preHtml="item.name"><span class="hoverBlue" @click.prevent.stop="openDetail(item)">{{item.name}}</span></Tooltip>
-                      </div>
-                      <div class="hover-border2"> <svg-icon icon-class="#icon-biaoqian_wode" class="svgIcon"></svg-icon><span>{{item.userInfo.name}}</span></div>
-                      <div class="hover-border2" style="margin: 0 30px;text-align: center;width: 52px;">
-                        <span>{{$moment(item.end_date).format('MM/DD')}}</span>
-                      </div>
-                      <div class="flex-box-ce" v-if="item.process">
-                        <el-progress :stroke-width="3" v-if="item.process>100" :color="customColorMethod(item.level)" :show-text="false" :width="20" type="circle" :percentage="100"></el-progress>
-                        <el-progress :stroke-width="3" v-else :show-text="false" :color="customColorMethod(item.level)" :width="20" type="circle" :percentage="Number(item.process)"></el-progress>
-                        <span style="padding-left: 5px;">{{item.process}}%</span>
-                      </div>
-                      <div  style="width: 20px;height: 20px;margin-left: 30px;"></div>
-                    </template>
-                    <!-- 已结束 -->
-                    <template v-if="isSimpleShow==3">
-                        <div class="flex-1 clamp2 hoverBlue" @click.prevent.stop="openDetail(item)">
-                          <Tooltip :preHtml="item.name"><span>{{item.name}}</span></Tooltip>
-                        </div>
-                        <div class="hover-border2" v-if="item.composite_state==2||item.composite_state==3">
-                          <span v-if="item.day>0">剩余<span class="green">{{item.day}}</span>天</span>
-                          <span v-if="item.day<0">过期<span class="red">{{Math.abs(item.day)}}</span>天</span>
-                        </div>
-                    </template>
+                <!-- 不可操作 -->
+                <template v-if="isSimpleShow==2">
+                  <div class="flex-1 clamp2" style="padding-right: 30px;">
+                    <Tooltip :preHtml="item.name"><span class="hoverBlue"
+                        @click.prevent.stop="openDetail(item)">{{item.name}}</span></Tooltip>
                   </div>
-                 <template v-if="isParent">
-                    <TaskItem v-if="item.statistics.plan_total>0" :isShowBinding="false" :isShow="item.isShow" :isParent="isParent" :taskId="item.id"  :isSimpleShow="isSimpleShow"  @confirm="openDetail"></TaskItem>
-                  </template>
-                  <template v-else>
-                    <TaskItem v-if="item.child&&item.child.length>0" :isShowBinding="false" :isShow="item.isShow" :list="item.child" :isSimpleShow="isSimpleShow"  @confirm="openDetail"></TaskItem>
-                  </template>
-                </div>
-              </template>
-              <div v-else>
-                <template v-if="isParent&&projects.length==0">
-                  <div class="zhu"></div>
-                  <div class="zhu"></div>
+                  <div class="hover-border2"> <svg-icon icon-class="#icon-biaoqian_wode"
+                      class="svgIcon"></svg-icon><span>{{item.userInfo.name}}</span></div>
+                  <div class="hover-border2" style="margin: 0 30px;text-align: center;width: 52px;">
+                    <span>{{$moment(item.end_date).format('MM/DD')}}</span>
+                  </div>
+                  <div class="flex-box-ce" v-if="item.process">
+                    <el-progress :stroke-width="3" v-if="item.process>100" :color="customColorMethod(item.level)"
+                      :show-text="false" :width="20" type="circle" :percentage="100"></el-progress>
+                    <el-progress :stroke-width="3" v-else :show-text="false" :color="customColorMethod(item.level)"
+                      :width="20" type="circle" :percentage="Number(item.process)"></el-progress>
+                    <span style="padding-left: 5px;">{{item.process}}%</span>
+                  </div>
+                  <div style="width: 20px;height: 20px;margin-left: 30px;"></div>
                 </template>
-                <template v-else>
-                  <div class="orange" v-if="projects.length==0&&parentList.length==0" style="margin-bottom: 8px;font-size: 13px;">用“项目/任务”推动目标达成,合理规划安排工作</div>
+                <!-- 已结束 -->
+                <template v-if="isSimpleShow==3">
+                  <div class="flex-1 clamp2 hoverBlue" @click.prevent.stop="openDetail(item)">
+                    <Tooltip :preHtml="item.name"><span>{{item.name}}</span></Tooltip>
+                  </div>
+                  <div class="hover-border2" v-if="item.composite_state==2||item.composite_state==3">
+                    <span v-if="item.day>0">剩余<span class="green">{{item.day}}</span>天</span>
+                    <span v-if="item.day<0">过期<span class="red">{{Math.abs(item.day)}}</span>天</span>
+                  </div>
                 </template>
-
               </div>
+              <template v-if="isParent">
+                <TaskItem v-if="item.statistics.plan_total>0" :isShowBinding="false" :isShow="item.isShow"
+                  :isParent="isParent" :taskId="item.id" :isSimpleShow="isSimpleShow" @confirm="openDetail"></TaskItem>
+              </template>
+              <template v-else>
+                <TaskItem v-if="item.child && item.child.length>0" :isShowBinding="false" :isShow="item.isShow"
+                  :list="item.child" :isSimpleShow="isSimpleShow" @confirm="openDetail"></TaskItem>
+              </template>
             </div>
+          </template>
+          <div v-else>
+            <template v-if="isParent && projects.length==0">
+              <div class="zhu"></div>
+              <div class="zhu"></div>
+            </template>
+            <template v-else>
+              <div class="orange" v-if="projects.length==0&&parentList.length==0"
+                style="margin-bottom: 8px;font-size: 13px;">用“项目/任务”推动目标达成,合理规划安排工作</div>
+            </template>
+
+          </div>
         </div>
-      </CollapseTransition>
+      </div>
+    </CollapseTransition>
 
-      <TaskDetail v-if="isShowTaskDetail2" :visible.sync="isShowTaskDetail" :taskId="selectTaskItem.id" @confirm="closeDetail"></TaskDetail>
+    <TaskDetail v-if="isShowTaskDetail2" :visible.sync="isShowTaskDetail" :readonly="readonly"
+      :taskId="selectTaskItem.id" @closeDialog="closeDialog" @confirm="closeDetail"></TaskDetail>
 
-      <!-- 修改起止时间 -->
-      <el-dialog title="修改起止时间" :visible.sync="isShowDqMyTarget" :append-to-body="true" width="600px">
-        <div>
-            <el-form ref="form" label-width="80px" class="form">
-                <el-form-item label="起止时间">
-                    <el-date-picker :picker-options="instantPickerOptions" v-model="time"
-                    :clearable="false" type="datetimerange" range-separator="至" value-format="yyyy-MM-dd HH:mm:ss"
-                    start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['8:00:00', '18:00:00']"></el-date-picker>
-                </el-form-item>
-            </el-form>
-        </div>
-        <div class="flex-box-end" style="margin-top: 50px;">
-        <el-button size="small"  @click="isShowDqMyTarget = false">取 消</el-button>
-        <el-button size="small" type="primary"  @click="confirmTime">确 定</el-button>
-        </div>
-      </el-dialog>
-      <!-- 选择负责人 -->
-      <EmployeeSelector :is_filtration_creator="false" title="选择人员" :isChecKedAll="false" :isRequired="true" :multi="false" :selected="employee_selected" :visible.sync="show_employee_selector" @confirm="employee_confirm"/>
-    </div>
+    <!-- 修改起止时间 -->
+    <el-dialog title="修改起止时间" :visible.sync="isShowDqMyTarget" :append-to-body="true" width="600px">
+      <div>
+        <el-form ref="form" label-width="80px" class="form">
+          <el-form-item label="起止时间">
+            <el-date-picker :picker-options="instantPickerOptions" v-model="time" :clearable="false"
+              type="datetimerange" range-separator="至" value-format="yyyy-MM-dd HH:mm:ss" start-placeholder="开始日期"
+              end-placeholder="结束日期" :default-time="['8:00:00', '18:00:00']"></el-date-picker>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div class="flex-box-end" style="margin-top: 50px;">
+        <el-button size="small" @click="isShowDqMyTarget = false">取 消</el-button>
+        <el-button size="small" type="primary" @click="confirmTime">确 定</el-button>
+      </div>
+    </el-dialog>
+    <!-- 选择负责人 -->
+    <EmployeeSelector :is_filtration_creator="false" title="选择人员" :isChecKedAll="false" :isRequired="true"
+      :multi="false" :selected="employee_selected" :visible.sync="show_employee_selector" @confirm="employee_confirm" />
+  </div>
 </template>
 
 <script>
@@ -145,12 +173,16 @@ import EmployeeSelector from '@/components/EmployeeSelector';
 import Progress from '@/okr/components/public/Progress'; //进度条
 import moment from 'moment' // 时间库
 export default {
-  name:'TaskItem',
+  name:'TaskItemComp',
   components:{CollapseTransition,Tooltip,TaskDetail,EmployeeSelector,Progress},
-  props:{
+  props: {
+      readonly: {
+        type: Boolean,
+        default: false,
+      },
       isParent:{ //是否 一层层请求任务
-          type: Boolean,
-          default: false,
+        type: Boolean,
+        default: false,
       },
       krId:{ //KrID
         type: Number,
@@ -255,40 +287,39 @@ export default {
   },
   watch: {
     isShow(val){
-      if(val){
-        this.parentList=[];
-        if(this.isParent){ //KR进来
+      if (val) {
+        this.parentList = [];
+        if(this.isParent) { //KR进来
           if(!this.isShowChild){
             this.getTask();
           }else{
-            let list=this.list;
+            let list = this.list;
             list.forEach(item=>{
-              item.stateInfo=taskStatus(item.composite_state);
-              item.userInfo=this.$getEmployeeMapItem(item.owner_id);
-              item.day=this.$moment(item.end_date).diff(this.$moment().format('YYYY-MM-DD'), 'day');
-              item.isShow=false;
+              item.stateInfo = taskStatus(item.composite_state);
+              item.userInfo= this.$getEmployeeMapItem(item.owner_id);
+              item.day = this.$moment(item.end_date).diff(this.$moment().format('YYYY-MM-DD'), 'day');
+              item.isShow = false;
             })
             // console.log("渲染了",list,this.isParent,this.isShowChild)
-            this.parentList=list;
-
+            this.parentList = list;
           }
         }else{
-          let list=this.list;
+          let list = this.list;
           list.forEach(item=>{
             item.stateInfo=taskStatus(item.composite_state);
             item.userInfo=this.$getEmployeeMapItem(item.owner_id);
             item.day=this.$moment(item.end_date).diff(this.$moment().format('YYYY-MM-DD'), 'day');
             item.isShow=false;
           })
-          this.parentList=list;
-          this.projects=this.projectsList
+          this.parentList = list;
+          this.projects = this.projectsList
         }
       }
     },
     isShowTaskDetail(val){
-       if(!val){
-         this.isShowTaskDetail2=false;
-       }
+      if(!val){
+        this.isShowTaskDetail2=false;
+      }
     }
   },
   methods: {
@@ -301,6 +332,10 @@ export default {
       //   return '#F16060';
       // }
     },
+    closeDialog() {
+      this.isShowTaskDetail = false
+      this.isShowTaskDetail2 = false
+    },
     closeDetail(){
       this.$emit('confirm',{});
     },
@@ -347,15 +382,15 @@ export default {
         return false
       }
       this.$axiosUser('post', url, {plan_id:item.id}).then(res => {
-          this.closeDetail();
+        this.closeDetail();
       })
     },
     employee_confirm(val){
       let user=val.employee[0]
       let params={plan_id:this.selectTaskItem.id,owner_id:user.id};
       this.$axiosUser('POST', 'api/pro/okr/plan/owner', params).then(res => {
-           this.selectTaskItem.userInfo=user
-           this.$forceUpdate();
+        this.selectTaskItem.userInfo=user
+        this.$forceUpdate();
       })
     },
     confirmTime(){
@@ -388,20 +423,24 @@ export default {
     },
     getTask(){
       let data={};
-      let url={};
-      if(this.krId){
-        data.kr_id=this.krId
-        url="api/pro/okr/kr/sub/list"
+      let url = {};
+      
+      if(this.krId) {
+        data.kr_id = this.krId;
+        if (!this.readonly) url = "api/pro/okr/kr/sub/list"
+        else url = "api/pro/okr/public/kr/sub/list"
       }else{
-        data.plan_id=this.taskId
-        url="api/pro/okr/plan/list/sub"
+        data.plan_id = this.taskId
+        if (!this.readonly) url = "api/pro/okr/plan/list/sub"
+        else url = url = "api/pro/okr/public/plan/list/sub"
+        
       }
       this.$axiosUser('get',url,data).then(res => {
-          let list=this.krId? res.data.data.plans:res.data.data.list;
-          list.forEach(item=>{
-            item.isShow=false;
-            item.stateInfo=taskStatus(item.composite_state);
-            item.userInfo=this.$getEmployeeMapItem(item.owner_id)
+          let list = this.krId ? res.data.data.plans : res.data.data.list;
+          list.forEach(item => {
+            item.isShow = false;
+            item.stateInfo = taskStatus(item.composite_state);
+            item.userInfo = this.$getEmployeeMapItem(item.owner_id)
           })
           this.parentList=list;
           if(this.krId){
@@ -416,7 +455,7 @@ export default {
       if(!item.id){
         return false
       }
-      this.selectTaskItem=item;
+      this.selectTaskItem = item;
       this.isShowTaskDetail2=true;
       this.$nextTick(()=>{
         this.isShowTaskDetail=true;

+ 2 - 2
src/okr/utils/auth.js

@@ -34,7 +34,7 @@ export function getDateStr(item,isShowId){
 }
 
 //目标类型
-export function getBelongType(value,isAll) {
+export function getBelongType(value, isAll) {
   let scopeArr = [{
       value: 1,
       label: '公司',
@@ -65,7 +65,7 @@ export function getBelongType(value,isAll) {
   if (value) {
     let obj={};
     scopeArr.forEach(item=>{
-      if(value==item.value){obj=item;}
+      if(value == item.value ){ obj = item;}
     })
     return obj
   }

+ 120 - 105
src/okr/views/okrIndex.vue

@@ -1,50 +1,53 @@
 <template>
   <el-container>
-     <LoadingAll :isType="1">
-       <el-container>
-         <el-aside>
-           <div class="flex-box-ce" style="padding: 20px;padding-left: 20px;border-bottom: 1px solid #f1f1f1;">
-             <span style="font-weight: 600;font-size: 16px;" class="flex-1">目标系统</span>
-             <div class="tzBox" @click="openHome(2)">
-               <el-badge :value="sumTotal" v-if="sumTotal>0">
-                 <svg-icon icon-class="#icon-tongzhi1" class="svgIcon" style="font-size:22px;"></svg-icon>
-               </el-badge>
-               <el-badge v-else>
-                 <svg-icon icon-class="#icon-tongzhi1" class="svgIcon" style="font-size:22px;"></svg-icon>
-               </el-badge>
-             </div>
-           </div>
-           <el-menu :default-active="activeIndex" class="el-menu-vertical-demo" ref="elMenu" :router="true" @select="activeRouter" :unique-opened="true">
-             <template v-for="(item, index) in routers">
-               <div :key="index">
-                 <el-menu-item :index="returnIndex(index, 0)" :route="item.children[0].path" :ref="item.children[0].path" v-if="item.label=='目标设置'||item.label=='目标复盘'">
-                   <div class="flex-box-ce">
-                     <svg-icon :icon-class="item.icon" class="svgIcon"></svg-icon>
-                     <span slot="title" style="margin-left: 5px;">{{ item.children[0].label }}</span>
-                   </div>
-                 </el-menu-item>
-                 <el-submenu :index="index.toString()" :key="index" v-else>
-                   <template slot="title">
-                     <div class="flex-box-ce">
-                       <svg-icon :icon-class="item.icon" class="svgIcon"></svg-icon>
-                       <span style="margin-left: 5px;">{{ item.label }}</span>
-                     </div>
-                   </template>
-                   <template v-for="(item2, index2) in item.children" v-if="!item2.meta.isHide">
-                     <el-menu-item :index="returnIndex(index, index2)" :ref="item2.path" :route="item2.path" :key="index2" class="font-flex-word">
-                       <span slot="title" style="margin-left: 10px;width:120px">{{ item2.label }}</span>
-                     </el-menu-item>
-                   </template>
-                 </el-submenu>
-               </div>
-             </template>
-           </el-menu>
-         </el-aside>
-         <el-main>
-           <keep-alive :include="keepAliveView"><router-view/></keep-alive>
-         </el-main>
-       </el-container>
-     </LoadingAll>
+    <LoadingAll :isType="1">
+      <el-container>
+        <el-aside>
+          <div class="flex-box-ce" style="padding: 20px;padding-left: 20px;border-bottom: 1px solid #f1f1f1;">
+            <span style="font-weight: 600;font-size: 16px;" class="flex-1">目标系统</span>
+            <div class="tzBox" @click="openHome(2)">
+              <el-badge :value="sumTotal" v-if="sumTotal > 0">
+                <svg-icon icon-class="#icon-tongzhi1" class="svgIcon" style="font-size:22px;"></svg-icon>
+              </el-badge>
+              <el-badge v-else>
+                <svg-icon icon-class="#icon-tongzhi1" class="svgIcon" style="font-size:22px;"></svg-icon>
+              </el-badge>
+            </div>
+          </div>
+          <el-menu :default-active="activeIndex" class="el-menu-vertical-demo" ref="elMenu" :router="true"
+            @select="activeRouter" :unique-opened="true">
+            <template v-for="(item, index) in routers">
+              <div :key="index">
+                <el-menu-item :index="returnIndex(index, 0)" :route="item.children[0].path" :ref="item.children[0].path"
+                  v-if="item.label == '目标设置' || item.label == '目标复盘'">
+                  <div class="flex-box-ce">
+                    <svg-icon :icon-class="item.icon" class="svgIcon"></svg-icon>
+                    <span slot="title" style="margin-left: 5px;">{{ item.children[0].label }}</span>
+                  </div>
+                </el-menu-item>
+                <el-submenu :index="index.toString()" :key="index" v-else>
+                  <template slot="title">
+                    <div class="flex-box-ce">
+                      <svg-icon :icon-class="item.icon" class="svgIcon"></svg-icon>
+                      <span style="margin-left: 5px;">{{ item.label }}</span>
+                    </div>
+                  </template>
+                  <template v-for="(item2, index2) in item.children" v-if="!item2.meta.isHide">
+                    <el-menu-item :index="returnIndex(index, index2)" :ref="item2.path" :route="item2.path"
+                      :key="index2" class="font-flex-word">
+                      <span slot="title" style="margin-left: 10px;width:120px">{{ item2.label }}</span>
+                    </el-menu-item>
+                  </template>
+                </el-submenu>
+              </div>
+            </template>
+          </el-menu>
+        </el-aside>
+        <el-main>
+          <keep-alive :include="keepAliveView"><router-view /></keep-alive>
+        </el-main>
+      </el-container>
+    </LoadingAll>
   </el-container>
 </template>
 
@@ -52,29 +55,29 @@
 import { mapGetters, mapState } from 'vuex';
 import LoadingAll from '@/components/LoadingAll';
 export default {
-  components:{LoadingAll},
+  components: { LoadingAll },
   data() {
     return {
       activeIndex: '0-0',
       routers: [],
       userInfo: this.$userInfo(),
-      keepAliveView:['myProject','deptProject','publicProject','allProject'],  //需要缓存的组件名称列表,用逗号分隔
-      keepAliveView2:['myProject','deptProject','publicProject','allProject'],  //需要缓存的组件名称列表,用逗号分隔
+      keepAliveView: ['myProject', 'deptProject', 'publicProject', 'allProject'],  //需要缓存的组件名称列表,用逗号分隔
+      keepAliveView2: ['myProject', 'deptProject', 'publicProject', 'allProject'],  //需要缓存的组件名称列表,用逗号分隔
     };
   },
   watch: {
     $route(to, form) {
       // 缓存页面,达到缓存页面条件的效果
-      if(to.name=='myProject'&&form.name!='projectDetail'){
+      if (to.name == 'myProject' && form.name != 'projectDetail') {
         this.returnArr('myProject')
-      }else if(to.name=='deptProject'&&form.name!='projectDetail'){
+      } else if (to.name == 'deptProject' && form.name != 'projectDetail') {
         this.returnArr('deptProject')
-      }else if(to.name=='publicProject'&&form.name!='projectDetail'){
+      } else if (to.name == 'publicProject' && form.name != 'projectDetail') {
         this.returnArr('publicProject')
-      }else if(to.name=='allProject'&&form.name!='projectDetail'){
+      } else if (to.name == 'allProject' && form.name != 'projectDetail') {
         this.returnArr('allProject')
-      }else{
-         this.keepAliveView=JSON.parse(JSON.stringify(this.keepAliveView2));
+      } else {
+        this.keepAliveView = JSON.parse(JSON.stringify(this.keepAliveView2));
       }
 
       var str = to.path;
@@ -92,105 +95,105 @@ export default {
   },
   computed: {
     // 使用对象展开运算符将 getter 混入 computed 对象中
-    ...mapGetters(['sumTotal','site_info']),
+    ...mapGetters(['sumTotal', 'site_info']),
   },
   created() {
-    if(this.site_info.okr&&this.site_info.okr.enable){
-      this.getUnitList(()=>{
+    if (this.site_info.okr && this.site_info.okr.enable) {
+      this.getUnitList(() => {
         this.initRouter();
       });
       this.$store.dispatch('getSumTotal'); //通知数量
     }
   },
   methods: {
-    returnArr(str){
-      this.keepAliveView=this.keepAliveView.filter(item=>{
-        return item!=str;
+    returnArr(str) {
+      this.keepAliveView = this.keepAliveView.filter(item => {
+        return item != str;
       })
-      setTimeout(()=>{
-         this.keepAliveView=JSON.parse(JSON.stringify(this.keepAliveView2));
-      },1000)
+      setTimeout(() => {
+        this.keepAliveView = JSON.parse(JSON.stringify(this.keepAliveView2));
+      }, 1000)
     },
-    getUnitList(fun){
+    getUnitList(fun) {
       this.$axiosUser('get', '/api/pro/okr/kr/unit_list').then(res => {
-        let data=res.data.data;
+        let data = res.data.data;
         data.reverse()
-        this.$setCache('unitList',data)
+        this.$setCache('unitList', data)
         fun()
       })
     },
     initRouter() {
-      let dept_manager=this.$getIsIdentity('dept_manager'); //是否部门管理员
-      let is_okr_manager=this.userInfo.is_okr_manager;//是否目标管理员
+      let dept_manager = this.$getIsIdentity('dept_manager'); //是否部门管理员
+      let is_okr_manager = this.userInfo.is_okr_manager;//是否目标管理员
       let routers = [
-         { label: '工作计划', children: this.returnRoutersArr('planTask'), icon: '#icon-jihua',isShow:true },
-         { label: '目标管理', children: this.returnRoutersArr('targertAdministration'), icon: '#icon-zhiyeshengyamubiao',isShow:true },
-         { label: '目标复盘', children: this.returnRoutersArr('replay'), icon: '#icon-daifucha',isShow:true },
-         { label: '项目管理', children: this.returnRoutersArr('project'), icon: '#icon-xiangmu',isShow:true },
+        { label: '工作计划', children: this.returnRoutersArr('planTask'), icon: '#icon-jihua', isShow: true },
+        { label: '目标管理', children: this.returnRoutersArr('targertAdministration'), icon: '#icon-zhiyeshengyamubiao', isShow: true },
+        { label: '目标复盘', children: this.returnRoutersArr('replay'), icon: '#icon-daifucha', isShow: true },
+        { label: '项目管理', children: this.returnRoutersArr('project'), icon: '#icon-xiangmu', isShow: true },
       ];
-      routers[1].children.forEach(item=>{
-        if(item.label=='我的上级'){
-          if(is_okr_manager){
-            item.meta.isHide=true;
+      routers[1].children.forEach(item => {
+        if (item.label == '我的上级') {
+          if (is_okr_manager) {
+            item.meta.isHide = true;
           }
         }
-        if(item.label=='我的部门'){
-          if(is_okr_manager||this.userInfo.employee_detail.dept_list.length==0){
-            item.meta.isHide=true;
+        if (item.label == '我的部门') {
+          if (is_okr_manager || this.userInfo.employee_detail.dept_list.length == 0) {
+            item.meta.isHide = true;
           }
         }
 
 
-        if(item.label=='我的下级'){
-          if(!is_okr_manager&&!dept_manager){
-            item.meta.isHide=true;
+        if (item.label == '我的下级') {
+          if (!is_okr_manager && !dept_manager) {
+            item.meta.isHide = true;
           }
         }
       })
-      if(is_okr_manager){
-        routers.unshift({ label: '目标分析', children: this.returnRoutersArr('targetAnalyse'), icon: '#icon-fenxi',isShow:true })
-        routers.push({ label: '目标设置', children: this.returnRoutersArr('targetSet'), icon: '#icon-shezhi_jichushezhi',isShow:true });
-      }else{
-        routers.push({ label: '目标分析', children: this.returnRoutersArr('targetAnalyse'), icon: '#icon-fenxi',isShow:true })
+      if (is_okr_manager) {
+        routers.unshift({ label: '目标分析', children: this.returnRoutersArr('targetAnalyse'), icon: '#icon-fenxi', isShow: true })
+        routers.push({ label: '目标设置', children: this.returnRoutersArr('targetSet'), icon: '#icon-shezhi_jichushezhi', isShow: true });
+      } else {
+        routers.push({ label: '目标分析', children: this.returnRoutersArr('targetAnalyse'), icon: '#icon-fenxi', isShow: true })
       }
-      this.routers=routers;
+      this.routers = routers;
       this.$nextTick(() => {
-        let okr_path=this.$getCache('okr_path');
+        let okr_path = this.$getCache('okr_path');
         if (okr_path) {
           this.activeIndex = okr_path;
-          if(okr_path=='0-0'){
-            is_okr_manager? this.$router.push({ path:'/targetExecute'}):this.$router.push({ path:'/planTable'})
+          if (okr_path == '0-0') {
+            is_okr_manager ? this.$router.push({ path: '/targetExecute' }) : this.$router.push({ path: '/planTable' })
           }
         }
       });
     },
     returnRoutersArr(str) {
       let routers = [];
-      let is_okr_manager=this.userInfo.is_okr_manager;//是否目标管理员
+      let is_okr_manager = this.userInfo.is_okr_manager;//是否目标管理员
       this.$router.options.routes[0].children.some((item, i) => {
         if (item.name == 'okrIndex') {
-          routers=item.children
+          routers = item.children
           return true;
         }
       });
       var routersArr = [];
       routers.forEach(item => {
-        if (!item.hidden&&item.meta.groupCode == str) {
+        if (!item.hidden && item.meta.groupCode == str) {
           //获取对应模块的路由
-          if(str=='project'){
-            if(item.name=='deptProject'){
-              if(this.userInfo.employee_detail.manage_dept_ids.length>0){
+          if (str == 'project') {
+            if (item.name == 'deptProject') {
+              if (this.userInfo.employee_detail.manage_dept_ids.length > 0) {
                 routersArr.push(item);
               }
-            }else if(item.name=='allProject'){
-              if(is_okr_manager){
+            } else if (item.name == 'allProject') {
+              if (is_okr_manager) {
                 routersArr.push(item);
               }
-            }else{
+            } else {
               routersArr.push(item);
             }
 
-          }else{
+          } else {
             routersArr.push(item);
           }
         }
@@ -219,11 +222,13 @@ export default {
   width: 200px;
   height: 200px;
 }
+
 .data-all {
   margin-bottom: 10%;
   color: #595959;
-    text-align: center;
+  text-align: center;
 }
+
 .tzBox {
   width: 40px;
   // height: 40px;
@@ -231,23 +236,29 @@ export default {
   cursor: pointer;
   // border-radius: 3px;
 }
+
 .tzBox:hover {
   background-color: #f4f6f9;
 }
+
 .svgIcon {
   font-size: 20px;
   color: #99a9bf;
 }
+
 .el-menu-vertical-demo:not(.el-menu--collapse) {
   width: 180px;
 }
+
 .el-menu-vertical-demo:not(.el-menu--collapse) {
   width: 180px;
 }
+
 .el-menu {
   overflow: hidden;
   border: none;
 }
+
 /deep/ .el-aside {
   transition: width 0.28s;
   width: 180px !important;
@@ -255,6 +266,7 @@ export default {
   background-color: #fff;
   border-radius: 5px;
 }
+
 /deep/ .el-aside::-webkit-scrollbar {
   width: 0px;
   background-color: #fff;
@@ -268,18 +280,17 @@ export default {
   height: 100%;
   overflow: hidden;
 }
+
 .el-main {
   height: calc(100vh - 80px);
   overflow-y: scroll;
   padding: 0 10px;
   min-width: 1000px;
 }
-
-
 </style>
 <style>
 /* 解决table fixed 错位问题 */
-.el-table td.is-hidden > * {
+.el-table td.is-hidden>* {
   visibility: inherit;
 }
 
@@ -287,19 +298,23 @@ export default {
   padding: 10px !important;
   text-align: center;
 }
+
 .primaryBtn {
   color: #409eff;
   border: 1px solid #409eff;
   background-color: #fff;
 }
+
 .primaryBtn:hover {
   background-color: #ecf5ff !important;
 }
+
 .dangerBtn {
   color: #f56c6c;
   border: 1px solid #f56c6c;
   background-color: #fff;
 }
+
 .dangerBtn:hover {
   color: #f56c6c !important;
   border: 1px solid #f56c6c !important;

+ 48 - 39
src/okr/views/targetMt/myTargert.vue

@@ -1,12 +1,12 @@
 <template>
   <div class="boxMinHeight">
     <div class="flex-box">
-      <div style="width: 160px;background-color: #fff;border-radius: 10px;margin-right: 10px;padding: 20px 10px;height: calc(100vh - 80px);" v-if="myTargertType==5||myTargertType==6||myTargertType==7">
+      <div style="width: 160px;background-color: #fff;border-radius: 10px;margin-right: 10px; padding: 20px 10px;height: calc(100vh - 80px);" v-if="myTargertType==5||myTargertType==6||myTargertType==7">
         <div style="margin-bottom:10px;font-size:16px;text-align: center;" class="cursor" @click="show_attentionUser=true">
         {{myTargertType==5? '关注的人':myTargertType==6? '我的上级':'我的下级'}} <i class="el-icon-circle-plus-outline blue"></i>
         </div>
         <div style="height: calc(100vh - 140px);overflow-y:auto;" class="scroll-bar">
-          <div class="flex-box-ce user-item" :class="selectUserData.id==item.id? 'userActive':''" v-for="item in userList" :key="item.id" @click="selectUserData=item">
+          <div class="flex-box-ce user-item" :class="selectUserData.id == item.id? 'userActive':''" v-for="item in userList" :key="item.id" @click="selectUserData=item">
             <userImage :id="item.id" width="36px" height="36px" fontSize="14" :user_name="item.name"></userImage>
             <Tooltip :preHtml="item.name">
              <div class="font-flex-word" style="margin-left: 10px;font-size: 14px;">{{ item.name }}</div>
@@ -397,6 +397,10 @@
           </div>
         </div>
 
+
+
+
+
       </div>
     </div>
 
@@ -747,13 +751,13 @@ export default {
   },
   data() {
     return {
-      wait:false,
-      getDateStr:getDateStr,
+      wait: false,
+      getDateStr: getDateStr,
       loading:false,
       dateParameter:{
-        year:this.$moment().format('YYYY'),
-        cycle_type:0,
-        dateId:1,
+        year: this.$moment().format('YYYY'),
+        cycle_type: 0,
+        dateId: 1,
         name:'全部周期'
       },
       yearStr:2022,
@@ -765,8 +769,13 @@ export default {
       getBelongType:getBelongType,
       idText:'owner_id',
 
-      addDateParameter:{year:this.$moment().format('YYYY'),cycle_type:4,dateId:this.$moment().format('M'),name:`${this.$moment().format('M')}月`},
-      monthDateVal:[this.$moment().startOf('month').format('YYYY-MM-DD'),this.$moment().endOf('month').format('YYYY-MM-DD')],//添加目标周期日期
+      addDateParameter: {
+        year: this.$moment().format('YYYY'),
+        cycle_type: 4,
+        dateId: this.$moment().format('M'),
+        name: `${this.$moment().format('M')}月`
+      },
+      monthDateVal:[this.$moment().startOf('month').format('YYYY-MM-DD'), this.$moment().endOf('month').format('YYYY-MM-DD')],//添加目标周期日期
 
       addDateParameter2:{year:this.$moment().format('YYYY'),cycle_type:4,dateId:this.$moment().format('M'),name:`${this.$moment().format('M')}月`},
       monthDateVal2:[this.$moment().startOf('month').format('YYYY-MM-DD'),this.$moment().endOf('month').format('YYYY-MM-DD')],//添加目标周期日期
@@ -922,10 +931,10 @@ export default {
   methods: {
     // 关联项目
     confirmProject(item){
-        this.$axiosUser('post', '/api/pro/okr/project/bind',{project_id:item.item.id,kr_id:this.selectKrItem.id}).then(res => {
-          this.$message.success("已关联")
-          this.getTargetDateil(this.selectKrItem.o_id,true);
-        });
+      this.$axiosUser('post', '/api/pro/okr/project/bind',{project_id:item.item.id,kr_id:this.selectKrItem.id}).then(res => {
+        this.$message.success("已关联")
+        this.getTargetDateil(this.selectKrItem.o_id,true);
+      });
     },
     //添加项目
     ActiveAddProject(){
@@ -1017,8 +1026,8 @@ export default {
     },
     deleteTarget(){
       this.$axiosUser('post', '/api/pro/okr/obj/d', { o_id: this.showDetailId }).then(res => {
-           this.getTargetList();
-           this.isShowDeleteTarget=false;
+        this.getTargetList();
+        this.isShowDeleteTarget=false;
       });
     },
     keyinput:_debounce(function(val) {
@@ -1088,15 +1097,14 @@ export default {
       this.os=item.os
       this.isShowDqMyTarget=true;
     },
-    openDetail(item,type){
+    openDetail(item, type){
       if(type){
-        this.showDetailType=type;//打开详情的类型
+        this.showDetailType = type;//打开详情的类型
       }else{
-        this.showDetailType=item.type
+        this.showDetailType = item.type
       }
-      this.o_id=type==2?item.o_id:item.id;
+      this.o_id = type == 2 ? item.o_id : item.id;
       this.showDetailId=item.id;//打开详情的ID
-
       this.isShowTargetDetail=true;
     },
     openSelectTargetType(){
@@ -1191,16 +1199,16 @@ export default {
       }
     },
     openDuiQi(type,item){
-      if(item&&!item.can_edit){return}
-      if(type==1){//添加目标 对齐
+      if(item && !item.can_edit ){ return }
+      if(type == 1){//添加目标 对齐
 
-      }else if(type==2){ //列表对齐目标
-        this.selectAlignItem=item;
-      }else if(type==3){//编辑对齐目标
+      }else if(type == 2){ //列表对齐目标
+        this.selectAlignItem = item;
+      }else if(type == 3){//编辑对齐目标
 
       }
-      this.selectAlignIndex=type
-      this.isShowDateSearch=true
+      this.selectAlignIndex = type
+      this.isShowDateSearch = true
     },
     updateDuiQi(item){
       let params={object_id:this.selectAlignItem.id}
@@ -1215,9 +1223,10 @@ export default {
          // this.isShowAdd=false;
       });
     },
+    
     //动态更新目标详情
-    getTargetDateil(targetId,isShowText){
-      let id=targetId? targetId:this.selectAlignItem.id
+    getTargetDateil(targetId, isShowText) {
+      let id= targetId ? targetId: this.selectAlignItem.id
       this.$axiosUser('get', '/api/pro/okr/obj/list', {page:1,page_size:1,ids:JSON.stringify([id])}).then(res => {
           let data=res.data.data.list[0]||'';
           if(data){
@@ -1356,11 +1365,11 @@ export default {
     //目标列表
     getTargetList(isUpdatePage) {
       let params = {
-        page:isUpdatePage? this.page:1,
+        page:isUpdatePage ? this.page:1,
         page_size: this.page_size,
-        cycle_type:this.dateParameter.cycle_type,
-        year:this.dateParameter.year,
-        belong_type:this.belong_type,
+        cycle_type: this.dateParameter.cycle_type,
+        year: this.dateParameter.year,
+        belong_type: this.belong_type,
         quarter:0,
         half_year:0,
         month:0,
@@ -1435,12 +1444,12 @@ export default {
     },
     // 更新任务
     updateTask(item){
-        item.isShow=false;
+      item.isShow=false;
+      this.$forceUpdate();
+      this.$nextTick(()=>{
+        item.isShow=true;
         this.$forceUpdate();
-        this.$nextTick(()=>{
-          item.isShow=true;
-           this.$forceUpdate();
-        })
+      })
     },
     //关联任务
     ActiveRelevanceTask(item){
@@ -1538,7 +1547,7 @@ export default {
       }
     },
     showTask(item){
-      item.isShow=!item.isShow;
+      item.isShow = !item.isShow;
       this.$forceUpdate();
     },
     employee_confirm_all(val){

+ 2 - 2
src/okr/views/targetSet/JurisdictionSet.vue

@@ -91,8 +91,8 @@ export default {
     getList(){
       this.loading=false;
       this.$axiosUser('get', '/api/pro/okr/manage').then(res => {
-        let list=res.data.data.list;
-        this.AdministratorList=list;
+        let list = res.data.data.list;
+        this.AdministratorList = list;
       }).finally(()=>{
         this.loading=false;
       });

+ 4 - 3
src/performance/components/assessManage/SelectAttendanceGroup.vue

@@ -12,7 +12,8 @@
     <el-container>
       <el-aside style="width:438px;">
         <div class="flex-box flex-d-center asideHead">
-          <span v-for="(item,index) in activeList" :key="index" :class="{'active':item.value == asidetableparams.cycle_type}" @click="cliasideHead(item.value)">{{item.label}}</span>
+          <span style="width: 60px;">考核周期:</span>
+          <span v-for="(item,index) in activeList" :key="index" :class="{'active': item.value == asidetableparams.cycle_type}" @click="cliasideHead(item.value)">{{item.label}}</span>
         </div>
         <div style="padding: 15px 5px 15px 0;">
           <JxSearch :screen="1" title="请输入关键字搜索" @confirm="groupSearch"></JxSearch>
@@ -97,7 +98,7 @@ export default {
       asidetableData:[],//考核模板数据列表
       asidetableparams:{
         search_words :null,
-        cycle_type :0,//选项时间的标识
+        cycle_type: 2 ,//选项时间的标识
         page :0,
         page_size:null,
       },
@@ -106,7 +107,7 @@ export default {
 
       visible_:false,//弹窗开关
       activeList: [
-        { value: 0, label: "全部" },
+        // { value: 0, label: "全部" },
         { value: 2, label: "月度" },
         { value: 3, label: "季度" },
         { value: 4, label: "半年度" },

+ 225 - 51
src/performance/components/evaluate/BasicMessage.vue

@@ -1,36 +1,63 @@
 
 <template>
   <div class="all" v-loading="loading">
+    <div style="width: 100%; display: flex; justify-content: center; align-items: center;" class="flex-box-ce">
+      <div class="content-title">简单三步,实现高效绩效考核</div>
+    </div>
+
+    <div class="step-list">
+
+      <div class="step-item step-item-1">
+        <div class="step-num step-num-1">01</div>
+        <div class="step-title">基本信息</div>
+        <div class="step-desc">录入考核周期, 考核人员, 管理人员,绩效等级配置</div>
+      </div>
+      <i class="el-icon-right navsvg3"></i>
+      <div class="step-item step-item-2">
+        <div class="step-num step-num-2">02</div>
+        <div class="step-title">考核指标</div>
+        <div class="step-desc">设置评分方式,分维度设置量化指标,非量化指标,额外加分项,额外扣分项</div>
+      </div>
+      <i class="el-icon-right navsvg3"></i>
+      <div class="step-item step-item-3">
+        <div class="step-num step-num-3">03</div>
+        <div class="step-title">流程设置</div>
+        <div class="step-desc">考核目标确认与执行,多种评分方式,过程管控跟踪</div>
+      </div>
+    </div>
+    <el-alert style="width: 80%; margin: 0 auto; " type="warning" show-icon
+      title="相同岗位且考核流程一致时,可建立同一个考核表;考核流程不同时,请分开多个考核表进行考核" :closable="false"></el-alert>
+
     <div class="demo-ruleForm">
-      <div class="title">分组信息</div>
-      <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="120px">
-        <el-form-item label="考核模板名称" prop="name">
+      <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="150px">
+        <el-form-item label="考核表名称" prop="name">
           <el-popover placement="right" width="400" trigger="hover" v-model="visible">
             <div class="fontColorB">
-              考核模板用来做什么?
+              考核用来做什么?
               <br />
-              相同考核周期、考核内容的员工可以放在同一考核模板,支持跨部门同岗位统一考核
+              相同考核周期、考核内容的员工可以放在同一考核,支持跨部门同岗位统一考核
               <br />
-              如:20个销售员可以放在同个考核模板里面
+              如:20个销售员可以放在同个考核里面
             </div>
-            <el-input type="textarea" v-model="ruleForm.name" slot="reference" placeholder="请输入名称" class="width-250 scroll-bar"
-            :autosize="{ minRows: 3, maxRows: 6}"
-            show-word-limit maxlength="100"
-            ></el-input>
+            <el-input type="text" v-model="ruleForm.name" slot="reference" placeholder="请输入名称" clearable show-word-limit
+              maxlength="100"></el-input>
           </el-popover>
         </el-form-item>
-        <el-form-item label="周期类型">
+        <el-form-item label="考核周期">
           <el-radio-group v-model="ruleForm.cycle_type">
-            <el-radio :label="item.value" v-for="(item,index) in $getCycleType_jx()" :key="item.value" v-show="item.value!=0">{{item.label}}</el-radio>
+            <el-radio-button v-show="item.value!=0" :label="item.value" v-for="(item,index) in $getCycleType_jx()"
+              :key="item.value">{{item.label}}
+            </el-radio-button>
           </el-radio-group>
         </el-form-item>
-        <el-form-item label="考核模板管理员">
-          <div class="border flex-box-ce">
+        <el-form-item label="考核管理员">
+          <div class="border flex-box-ce" style="width: 480px;">
             <div class="flex-1" v-if="Administrator.length == 0">请选择管理员</div>
-            <div v-else style="width: 180px;" class="font-flex-word">
+            <div v-else style="width: 400px;" class="font-flex-word">
               <span v-for="(item, index) in Administrator" :key="index">
                 <i v-if="index != 0">,</i>{{ item.name }}
               </span>
+
             </div>
             <span v-if="Administrator.length >0" class="blue">{{Administrator.length}}人</span>
             <i class="el-icon-arrow-down icon-right" v-else></i>
@@ -38,9 +65,9 @@
           </div>
         </el-form-item>
         <el-form-item label="被考核人员" prop="employee_ids">
-          <div class="border flex-box-ce">
+          <div class="border flex-box-ce" style="width: 480px;">
             <div class="flex-1" v-if="selected.employee.length == 0">请选择被考核人员</div>
-            <div v-else style="width: 180px;" class="font-flex-word">
+            <div v-else style="width: 400px;" class="font-flex-word">
               <span v-for="(item, index) in selected.employee" :key="index">
                 <i v-if="index != 0">,</i>{{ item.name }}
               </span>
@@ -50,46 +77,55 @@
             <div @click="setAdministrator = true" class="inputDc"></div>
           </div>
         </el-form-item>
+        <!-- <el-form-item label="系统默认等级配置">
+          <el-button type="text" @click="setGrade">个性化设置绩效等级</el-button>
+        </el-form-item>
+        <ClassSet ref="ClassSet" readOnly :inputs="inputs" :inputsStyle="{ paddingLeft: '150px', width: '700px' }">
+        </ClassSet> -->
       </el-form>
     </div>
 
+
+
     <!-- 选择子管理员 -->
-    <EmployeeSelector :selected="selected"  :visible.sync="setAdministrator" :is_filtration_creator="false" @confirm="confirmAdministrator" />
+    <EmployeeSelector :selected="selected" :visible.sync="setAdministrator" :is_filtration_creator="false"
+      @confirm="confirmAdministrator" />
 
     <BrawerBox drawerTitle="从绩效管理员中选择" :showDrawer.sync="isChecks">
       <template slot="main">
-       <ul>
+        <ul>
           <li v-for="(item, index) in gzList" :key="index" class="li">
-              <el-popover v-if="item.disabled" class="without-outline" placement="bottom"  width="850" trigger="hover" content="该管理员具有全部考核模板的权限,无法取消勾选,如须调整可联系绩效系统主管理员前往“权限设置”处进行调整。">
-                <el-checkbox slot="reference" v-model="item.check" class="flex-box-ce" :disabled="item.disabled">
-                  <div class="flex-box-ce">
-                    <userImage :user_name="item.name" :img_url="item.img_url"></userImage>
-                    <div style="margin: 0 10px;">{{item.name}}</div>
-                   <div v-if="item.dept.length>0" style="width: 200px;" class="font-flex-word">
-                        <span v-for="(deptItme,index2) in item.dept" :key="index2">
-                          {{deptItme.name}}
-                        </span>
-                    </div>
-                  </div>
-                </el-checkbox>
-              </el-popover>
-              <el-checkbox  v-else v-model="item.check" class="flex-box-ce">
+            <el-popover v-if="item.disabled" class="without-outline" placement="bottom" width="850" trigger="hover"
+              content="该管理员具有全部考核模板的权限,无法取消勾选,如须调整可联系绩效系统主管理员前往“权限设置”处进行调整。">
+              <el-checkbox slot="reference" v-model="item.check" class="flex-box-ce" :disabled="item.disabled">
                 <div class="flex-box-ce">
                   <userImage :user_name="item.name" :img_url="item.img_url"></userImage>
                   <div style="margin: 0 10px;">{{item.name}}</div>
-                   <div v-if="item.dept.length>0" style="width: 200px;" class="font-flex-word">
-                        <span v-for="(deptItme,index2) in item.dept" :key="index2">
-                          {{deptItme.name}}
-                        </span>
-                    </div>
+                  <div v-if="item.dept.length>0" style="width: 200px;" class="font-flex-word">
+                    <span v-for="(deptItme,index2) in item.dept" :key="index2">
+                      {{deptItme.name}}
+                    </span>
+                  </div>
                 </div>
               </el-checkbox>
+            </el-popover>
+            <el-checkbox v-else v-model="item.check" class="flex-box-ce">
+              <div class="flex-box-ce">
+                <userImage :user_name="item.name" :img_url="item.img_url"></userImage>
+                <div style="margin: 0 10px;">{{item.name}}</div>
+                <div v-if="item.dept.length>0" style="width: 200px;" class="font-flex-word">
+                  <span v-for="(deptItme,index2) in item.dept" :key="index2">
+                    {{deptItme.name}}
+                  </span>
+                </div>
+              </div>
+            </el-checkbox>
           </li>
-      </ul>
+        </ul>
       </template>
       <template slot="footer">
-          <el-button plain @click="isChecks = false">取消</el-button>
-          <el-button type="primary" @click="submitForm()">保存</el-button>
+        <el-button plain @click="isChecks = false">取消</el-button>
+        <el-button type="primary" @click="submitForm()">保存</el-button>
       </template>
     </BrawerBox>
   </div>
@@ -98,8 +134,10 @@
 <script>
 import EmployeeSelector from '@/components/EmployeeSelector';
 import BrawerBox from '@/performance/components/public/BrawerBox'
+import ClassSet from '@/performance/components/public/ClassSet';
+
 export default {
-  components: { EmployeeSelector,BrawerBox },
+  components: { EmployeeSelector, BrawerBox, ClassSet },
   name: 'BasicMessage',
   props:{
     data:{
@@ -109,6 +147,7 @@ export default {
   },
   data() {
     return {
+      inputs: [],
       visible: false,
       loading:false,
       setAdministrator: false,
@@ -129,13 +168,13 @@ export default {
     };
   },
   watch: {
-    data(val){
-       if(val.name){
-         this.recoverData();
-       }
+    data(val) {
+      if (val.name) {
+        this.recoverData();
+      }
     },
     Administrator(val) {
-       let ids=val.map(item=>{
+       let ids = val.map(item=>{
          return item.id
        })
        this.ruleForm.mannager_ids=ids.toString()||'';
@@ -151,14 +190,41 @@ export default {
       this.loading=true;
       setTimeout(() => {
         this.getList();
+        this.getAllSet();
       }, 200);
   },
   methods: {
+    setGrade() {
+      this.$router.push('/basicsSet')
+    },
+    // 获取全局设置
+    getAllSet() {
+      this.$axiosUser('get', 'api/pro/per/user/base_config').then(res => {
+        let data = res.data.data;
+        let levels = data.level_scope.levels;
+        this.level_enable = data.level_enable;
+        var inputs = [];
+        var max = 0;//最大值
+        if (levels) {
+          levels.forEach((item, index) => {
+            var obj;
+            if (index == 0) {
+              obj = { name: item.name, max: Number(item.value), min: 0 };
+            } else {
+              obj = { name: item.name, max: Number(item.value), min: max };//当不是第一个等级时,最小值为上一个的最大值
+            }
+            max = item.value;
+            inputs.push(obj);
+          })
+          this.inputs = inputs
+        }
+      })
+    },
     // 编辑时复原整个流程数据
     recoverData(){
-        this.ruleForm.name=this.data.name;
-        this.ruleForm.cycle_type=this.data.cycle_type;//周期类型 1-天 2-月度 3-季度 4-半年度 5-年度 6-自定义
-        this.selected.employee=this.data.employees
+      this.ruleForm.name = this.data.name;
+      this.ruleForm.cycle_type=this.data.cycle_type;//周期类型 1-天 2-月度 3-季度 4-半年度 5-年度 6-自定义
+      this.selected.employee=this.data.employees
     },
     // 获取子管理员
     getList(){
@@ -261,8 +327,116 @@ export default {
   color: #606266;
 }
 .all {
-  padding: 20px;
+  padding: 20px 0;
   font-size: 14px;
+  box-sizing: border-box;
+  width: 100%;
+  height: 100%;
+  background-color: #fff;
+}
+.content-title {
+  width: 300px;
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  font-size: 22px;
+  font-weight: 600;
+  position: relative;
+}
+.content-title::before {
+  content: "";
+  display: block;
+  position: absolute;
+  width: 30px;
+  height: 30px;
+  border-radius: 50%;
+  background: linear-gradient(180deg, hsla(0, 0%, 100%, 0), #cdf4ff);
+  bottom: 0px;
+  left: -10px;
+}
+.content-title::after {
+  content: "";
+  display: block;
+  position: absolute;
+  width: 48px;
+  height: 30px;
+  background: linear-gradient(90deg, hsla(0, 0%, 100%, 0), #cdf4ff);
+  top: -6px;
+  right: -15px;
+}
+.step-list {
+  width: 80%;
+  margin: 40px auto;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  & .step-item-1 {
+    background: linear-gradient(to bottom, #F0F3FF, #fff);
+  }
+
+  & .step-item-2 {
+    background: linear-gradient(to bottom, #EEF6DD, #fff);
+  }
+
+  & .step-item-3 {
+    background: linear-gradient(to bottom, #FEF2E5, #fff);
+  }
+
+  .navsvg3 {
+    margin: 0px 40px;
+    color: #e1e1e1;
+    display: block;
+    font-size: 30px;
+  }
+
+  .step-item {
+    flex: 1;
+    height: 160px;
+    border-radius: 30px;
+    position: relative;
+
+    .step-num {
+      font-size: 40px;
+      font-weight: 700;
+      position: absolute;
+      top: -20px;
+      left: -20px;
+
+    }
+
+    .step-num-1 {
+      -webkit-text-stroke: 2px #B7C3FF;
+      -webkit-text-fill-color: transparent;
+    }
+
+    .step-num-2 {
+      -webkit-text-stroke: 2px #73b836;
+      -webkit-text-fill-color: transparent;
+    }
+
+    .step-num-3 {
+      -webkit-text-stroke: 2px #DBA666;
+      -webkit-text-fill-color: transparent;
+    }
+
+    .step-title {
+      text-align: center;
+      font-size: 18px;
+      margin: 30px 0;
+      color: #141c28;
+      font-weight: 600;
+    }
+
+    .step-desc {
+      margin: 0 auto;
+      width: 280px;
+      font-size: 16px;
+      text-align: center;
+      line-height: 30px;
+      color: #6f7886;
+    }
+  }
 }
 .demo-ruleForm {
   width: 600px;

+ 60 - 40
src/performance/components/evaluate/Flow.vue

@@ -2,22 +2,28 @@
 <template>
   <div class="all">
     <!-- <header class="flex-box-ce header"> -->
-      <!-- <div class="flex-1">具体流程</div> -->
-      <!-- <div class="blue" style="cursor: pointer;" @click="isRule = true">同步规则</div> -->
+    <!-- <div class="flex-1">具体流程</div> -->
+    <!-- <div class="blue" style="cursor: pointer;" @click="isRule = true">同步规则</div> -->
     <!-- </header> -->
+
     <div class="main">
+
       <div class="main-top">
-<!--        <div class="flex-box-ce">
+        <!--        <div class="flex-box-ce">
           <span>流程方式:</span>
           <el-radio v-model="type" class="radio" disabled="disabled" :label="1">按评分人设置流程</el-radio>
         </div> -->
+        <el-alert style="width: 100%; margin: 20px 0; " type="warning" show-icon
+          title="绩效管理流程化,每个节点进度清晰可见,考核目标批量派发,评分流程自定义;员工按目标执行计划,过程管控全记录;"
+          :closable="false"></el-alert>
         <div class="flex-box-ce flex-d-wrap">
           <div @click="activeFlow(item.index)" class="flex-box-v flex-center-center flow-item  flex-d-wrap"
-          :class="[isActive == item.index ? 'isActive' : '']"
-          v-for="(item, index) in flowList" :key="index"  v-show="item.isShow">
-              <div class="fontColorA">{{ item.name }}</div>
-              <div class="fontColorC" style="font-size: 13px;" v-if="item.stateText">{{ item.stateText }}</div>
-              <i class="el-icon-right fontColorD" v-if="flowList.length != index + 1" style="font-size: 26px;margin: 0 20px;"></i>
+            :class="[isActive == item.index ? 'isActive' : '']" v-for="(item, index) in flowList" :key="index"
+            v-show="item.isShow">
+            <div class="fontColorA">{{ item.name }}</div>
+            <div class="fontColorC" style="font-size: 13px;" v-if="item.stateText">{{ item.stateText }}</div>
+            <i class="el-icon-right fontColorD" v-if="flowList.length != index + 1"
+              style="font-size: 26px;margin: 0 20px;"></i>
           </div>
         </div>
         <!-- 目标制定 -->
@@ -34,14 +40,17 @@
               <div class="flex-box-ce" style="margin-top: 10px;" v-show="target.type == 4">
                 <span>被考评人的</span>
                 <el-select v-model="target.manager_level" placeholder="请选择级别" style="margin: 0 10px;">
-                  <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option>
+                  <el-option v-for="item in options" :key="item.value" :label="item.label"
+                    :value="item.value"></el-option>
                 </el-select>
-                <el-tooltip class="item" effect="dark" content="找不到确认人时,由上级管理员替代" placement="top-start"><i class="fontColorC el-icon-warning"></i></el-tooltip>
+                <el-tooltip class="item" effect="dark" content="找不到确认人时,由上级管理员替代" placement="top-start"><i
+                    class="fontColorC el-icon-warning"></i></el-tooltip>
               </div>
-             <div class="border flex-box-ce" style="position: relative;" v-show="target.type == 3">
+              <div class="border flex-box-ce" style="position: relative;" v-show="target.type == 3">
                 <div class="fontColorC flex-1" v-if="target.employeeList.length == 0">请选择指定人员</div>
                 <div v-else style="width: 180px;" class="font-flex-word">
-                  <span v-for="(j, index2) in target.employeeList" :key="index2"><i v-if="index2 != 0">,</i>{{ j.name }}</span>
+                  <span v-for="(j, index2) in target.employeeList" :key="index2"><i v-if="index2 != 0">,</i>{{ j.name
+                    }}</span>
                 </div>
                 <span v-if="target.employeeList.length > 0" class="blue">{{ target.employeeList.length }}人</span>
                 <i class="el-icon-arrow-down icon-right" v-else></i>
@@ -70,13 +79,15 @@
           </div>
         </div>
         <!-- 评分:上级评分 -->
-        <SuperiorFlow v-show="isActive == 3" ref="SuperiorFlow" @setInput="setInput" :data="superiorFlow"></SuperiorFlow>
+        <SuperiorFlow v-show="isActive == 3" ref="SuperiorFlow" @setInput="setInput" :data="superiorFlow">
+        </SuperiorFlow>
         <!-- 评分:指定评分人 -->
         <div v-show="isActive == 4">
           <div class="nweTitle">指定评分人
             <el-tooltip effect="dark" content="当指标有指定评分人时,应用以下配置" placement="top">
-                <i class="el-icon-warning blue"></i>
-            </el-tooltip></div>
+              <i class="el-icon-warning blue"></i>
+            </el-tooltip>
+          </div>
           <div class="flex-box-ce" style="margin-left: 13px;margin-bottom: 20px;">
             <span class="label">评分人:</span>
             <div style="color: #606266;">指定评分人</div>
@@ -91,8 +102,9 @@
         <Examine v-show="isActive == 5" ref="Examine" @setIs="setIs" :data="examine"></Examine>
         <!-- 抄送 -->
         <div v-show="isActive == 6">
-          <div class="nweTitle">抄送<el-switch v-model="cc.enable" style="margin-left: 10px;" :active-value="1" :inactive-value="0"></el-switch></div>
-          <el-form :model="cc"  label-width="120px" v-show="cc.enable==1">
+          <div class="nweTitle">抄送<el-switch v-model="cc.enable" style="margin-left: 10px;" :active-value="1"
+              :inactive-value="0"></el-switch></div>
+          <el-form :model="cc" label-width="120px" v-show="cc.enable==1">
             <el-form-item label="抄送人:">
               <el-radio-group v-model="cc.type">
                 <el-radio :label="1">管理员</el-radio>
@@ -100,8 +112,9 @@
               </el-radio-group>
               <div class="flex-box-ce" style="margin-top: 10px;" v-show="cc.type == 1">
                 <span>被考评人的</span>
-                <el-select v-model="cc.manager_level" placeholder="请选择级别"  style="margin: 0 10px;">
-                  <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option>
+                <el-select v-model="cc.manager_level" placeholder="请选择级别" style="margin: 0 10px;">
+                  <el-option v-for="item in options" :key="item.value" :label="item.label"
+                    :value="item.value"></el-option>
                 </el-select>
               </div>
               <div class="border flex-box-ce" style="position: relative;" v-show="cc.type == 2">
@@ -152,8 +165,10 @@
           <span>3</span>
           <div class="label">评分节点同步</div>
           <div>评分节点同步
-            <el-tooltip effect="dark"placement="top">
-              <div slot="content"><i class="el-icon-caret-right" style="color: #fff;"></i>已经进入评分的流程会重置到第一个评分环节继续评分<br/><i class="el-icon-caret-right" style="color: #fff;"></i>未开始评分的评分流程直接更新</div>
+            <el-tooltip effect="dark" placement="top">
+              <div slot="content"><i class="el-icon-caret-right"
+                  style="color: #fff;"></i>已经进入评分的流程会重置到第一个评分环节继续评分<br /><i class="el-icon-caret-right"
+                  style="color: #fff;"></i>未开始评分的评分流程直接更新</div>
               <i class="el-icon-warning blue"></i>
             </el-tooltip>
           </div>
@@ -170,25 +185,27 @@
       </span>
     </el-dialog>
 
-	   <!-- 选择考核 -->
-	   <BrawerBox drawerTitle="选择考核" :showDrawer.sync="isChecks">
-		  <template slot="main">
-			 <el-input placeholder="搜索考核" v-model="radio"></el-input>
-			 <ul class="ul">
-			   <li v-for="(item, index) in gzList" :key="index" class="flex-box-ce li">
-				  <el-checkbox class="flex-1" v-model="item.check" :label="item.label" @change="actionCheck($event,item)"></el-checkbox>
-				  <div class="blue" v-if="item.num>0">{{item.num}} 人</div>
-			   </li>
-			 </ul>
-		  </template>
-		  <template slot="footer">
-			  <el-button plain @click="isChecks = false">取消</el-button>
-			  <el-button type="primary" :loading="loading" @click="submitForm('detailForm')">确定</el-button>
-		  </template>
-		</BrawerBox>
+    <!-- 选择考核 -->
+    <BrawerBox drawerTitle="选择考核" :showDrawer.sync="isChecks">
+      <template slot="main">
+        <el-input placeholder="搜索考核" v-model="radio"></el-input>
+        <ul class="ul">
+          <li v-for="(item, index) in gzList" :key="index" class="flex-box-ce li">
+            <el-checkbox class="flex-1" v-model="item.check" :label="item.label"
+              @change="actionCheck($event,item)"></el-checkbox>
+            <div class="blue" v-if="item.num>0">{{item.num}} 人</div>
+          </li>
+        </ul>
+      </template>
+      <template slot="footer">
+        <el-button plain @click="isChecks = false">取消</el-button>
+        <el-button type="primary" :loading="loading" @click="submitForm('detailForm')">确定</el-button>
+      </template>
+    </BrawerBox>
 
     <!-- 选择同步人员 -->
-    <EmployeeSelector :selected="selected" :is_filtration_creator="false"  :visible.sync="setAdministrator" @confirm="confirmAdministrator" />
+    <EmployeeSelector :selected="selected" :is_filtration_creator="false" :visible.sync="setAdministrator"
+      @confirm="confirmAdministrator" />
   </div>
 </template>
 <script>
@@ -541,14 +558,17 @@ export default {
 <style scoped="scoped">
 .all {
   font-size: 14px;
-   min-height: 600px;
+  min-height: 650px;
+  background: #fff;
+  padding: 0 20px;
+  box-sizing: border-box;
 }
 .header {
   border-bottom: 1px solid #ebebeb;
   padding: 20px;
   font-size: 16px;
 }
-.main-top,
+
 .main-bottom {
   padding: 20px 0px;
 }

+ 1478 - 0
src/performance/components/evaluate/Template copy.vue

@@ -0,0 +1,1478 @@
+<template>
+  <div class="all" v-loading="indexLoading">
+    <div class="content">
+      <div class="title">总分计算公式</div>
+      <div class="flex-box-ce" style="width: 100%;">
+        <div class="flex-1 message flex-box-v flex-center-center">
+          <template v-if="ruleForm.calc_type == 1">
+            <div class="message-text">
+              <span v-if="ruleForm.calc_dimension">总分=评分 X 维度权重,再累加</span>
+              <span v-else>总分=评分直接累加</span>
+            </div>
+          </template>
+          <template v-if="ruleForm.calc_type == 2">
+            <div class="message-text">
+              <span v-if="ruleForm.calc_dimension">总分=评分 X 维度权重 X 指标权重,再累加</span>
+              <span v-else>总分=评分 X 指标权重,再累加</span>
+            </div>
+          </template>
+          <el-popover placement="bottom" width="500" trigger="hover">
+            <div style="padding: 10px;">
+              <div class="flex-box-ce popover-text">
+                <template v-if="ruleForm.calc_type == 1">
+                  <div class="fontColorB">
+                    <span v-if="ruleForm.calc_dimension">
+                      <span class="blue" slot="reference">示例</span>
+                      总分=评分 X 维度权重,再累加
+                    </span>
+                    <span v-else>
+                      <span class="blue" slot="reference">示例</span>
+                      总分=评分直接累加
+                    </span>
+                  </div>
+                </template>
+                <template v-if="ruleForm.calc_type == 2">
+                  <div class="fontColorB">
+                    <span v-if="ruleForm.calc_dimension">
+                      <span class="blue" slot="reference">示例</span>
+                      总分=评分 X 维度权重 X 指标权重,再累加
+                    </span>
+                    <span v-else>
+                      <span class="blue" slot="reference">示例</span>
+                      总分=评分 X 指标权重,再累加
+                    </span>
+                  </div>
+                </template>
+              </div>
+            </div>
+            <template v-if="ruleForm.calc_type == 1">
+              <img v-if="ruleForm.calc_dimension" src="static/images/gs3.png" class="popover-img" style="height: auto;" />
+              <img v-else src="static/images/gs4.png" class="popover-img" style="height: auto;" />
+            </template>
+            <template v-if="ruleForm.calc_type == 2">
+              <img v-if="ruleForm.calc_dimension" src="static/images/gs1.png" class="popover-img" style="height: auto;" />
+              <img v-else src="static/images/gs2.png" class="popover-img" style="height: auto;" />
+            </template>
+            <span class="blue" slot="reference">示例</span>
+          </el-popover>
+        </div>
+        <div class="flex-box-v flex-center-center fontColorB" style="padding: 0 20px;height: 100px;">
+          <div style="font-size: 14px;margin-bottom: 5px;">修改总分计算公式</div>
+          <div><i class="el-icon-d-arrow-right" style="font-size: 18px;"></i></div>
+        </div>
+        <div class="flex-1 message">
+          <el-form ref="detailForm" label-width="150px">
+            <el-form-item label="指标评分计算方式" style="margin-bottom: 0px;margin-top: 15px;">
+              <el-radio-group v-model="ruleForm.calc_type">
+                <el-radio :label="1">加和计算</el-radio>
+                <el-radio :label="2">加权计算</el-radio>
+             </el-radio-group>
+            </el-form-item>
+            <el-form-item label="维度权重参与计算" style="margin-bottom: 0px;">
+              <el-switch v-model="ruleForm.calc_dimension" :active-value="1" :inactive-value="0">备选项</el-switch>
+            </el-form-item>
+          </el-form>
+        </div>
+      </div>
+    </div>
+    <div class="flex-box-ce pop-up">
+      <el-button type="primary" @click="addDimensionality = true">
+        <i class="el-icon-plus"></i>
+        添加考核维度
+      </el-button>
+      <div class="fontColorB" style="margin-left: 20px;" v-if="dimensionalityList.length > 0">
+        共 <span class="blue">{{ sumText.num }}</span> 个维度
+        <span v-if="ruleForm.calc_dimension == 1">
+          ,所有维度权重合计:
+          <span style="font-weight: 600;color: #222;">{{ sumText.val }}</span>
+          %
+        </span>
+      </div>
+    </div>
+
+    <div class="wds" v-for="(item, index) in dimensionalityList" :key="index">
+      <div class="wd-header">
+        <div class="flex-box-ce wd-title">
+          <div class="flex-1 fontColorA" style="font-size: 18px;">{{ item.name }}</div>
+          <div class="flex-box-ce titles">
+            <div v-if="item.index_type == 1">量化指标</div>
+            <div v-if="item.index_type == 2">非量化指标</div>
+            <div v-if="item.index_type == 3">额外加分项</div>
+            <div v-if="item.index_type == 4">额外扣分项</div>
+            <div v-if="item.index_type != 3 && item.index_type != 4 && ruleForm.calc_dimension == 1">维度权重{{ item.dimension_weight }}%</div>
+          </div>
+          <el-tooltip effect="dark" content="编辑维度" placement="top"><i class="el-icon-edit" @click="compileItem(item, index)" style="margin-right: 10px;"></i></el-tooltip>
+          <el-tooltip effect="dark" content="删除维度" placement="top"><i class="el-icon-delete-solid" @click="deleteItem(item, index)"></i></el-tooltip>
+        </div>
+      </div>
+      <el-table :data="item.index" style="width: 100%;" border >
+        <el-table-column prop="name" label="指标名称" align="center" width="200">
+          <template slot-scope="scope">
+            <el-input class="item" v-model="scope.row.name" placeholder="请输入指标名称" clearable></el-input>
+          </template>
+          
+        </el-table-column>
+        <el-table-column prop="per_remark" align="center" :label="item.index_type == 3 || item.index_type == 4 ? (item.index_type == 3 ? '加分标准' : '扣分标准') : '考核标准'" width="200">
+          <template slot-scope="scope">
+            <el-input class="item" v-model="scope.row.per_remark"  clearable></el-input>
+              <!-- <PreBox :value="scope.row.per_remark"></PreBox> -->
+          </template>
+        </el-table-column>
+        <el-table-column v-if="item.index_type == 3 || item.index_type == 4" prop="point_limit" align="center" :label="item.index_type == 3 ? '加分上限' : '扣分上限'" width="200">
+          <template slot-scope="scope">
+            <el-input class="item" v-model="scope.row.point_limit"  clearable></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column v-if="item.index_type == 1" prop="target" align="center" label="目标值" width="200">
+          <template slot-scope="scope">
+            <el-input class="item" v-model="scope.row.target"  clearable></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column v-if="item.index_type == 1" prop="unit" label="量化指标单位" align="center" width="200">
+          <template slot-scope="scope">
+            <el-input class="item" v-model="scope.row.unit" clearable></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column v-if="item.index_type == 1 || item.index_type == 2" prop="weight" label="权重(%)" align="center" width="200">
+          <template slot-scope="scope">
+            <el-input class="item" v-model="scope.row.weight" clearable>
+              <template slot="append">%</template>
+            </el-input>
+          </template>
+        </el-table-column>
+        <el-table-column  prop="result_type" label="结果值录入" align="center" width="200">
+          <template slot-scope="scope" width="200">
+            <el-select v-model="scope.row.result_type" @change="changeResultType(scope, index)">
+              <el-option value="none" label="不开启"></el-option>
+              <el-option value="self" label="被考核人"></el-option>
+              <el-option value="special" label="指定员工"></el-option>
+              <el-option value="supervisor" label="直接管理员"></el-option>
+            </el-select>
+          </template>
+        </el-table-column>
+        <el-table-column prop="remark" label="备注" width="200" align="center">
+          <template slot-scope="scope">
+            <el-input class="item" v-model="scope.row.remark" clearable>
+            </el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="auto_calculation" label="自动算分" width="200" align="center">
+          <template slot-scope="scope">
+            <el-switch v-model="scope.row.auto_calculation" :disabled="scope.row.result_type == 'none'" :active-value="1" :inactive-value="0"></el-switch>
+          </template>
+        </el-table-column>
+
+        <el-table-column prop="reviewer_name" label="开启指定评分人" width="200" align="center">
+          <template slot-scope="scope">
+            <el-switch v-model="scope.row.auto_calculation" :disabled="scope.row.result_type == 'none'" :active-value="1" :inactive-value="0"></el-switch>
+          </template>
+        </el-table-column>
+        <el-table-column prop="reviewer_name" label="指定评分人" width="200"></el-table-column>
+        <el-table-column prop="reviewer_name" label="管理记录人" width="200"></el-table-column>
+        <el-table-column prop="reviewer_name" label="评级列表" width="200"></el-table-column>
+        <el-table-column label="操作" align="center" fixed="right" width="100">
+          <template slot-scope="scope">
+            <el-button @click="compileIndex(scope, index)" type="text" >编辑</el-button>
+            <el-button @click="deleteIndex(scope, index)" type="text" >删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="wd-footer flex-box-ce">
+        <div class="flex-box flex-1">
+          <!-- <el-button class="primaryBtn" @click="selectIndex(item, index)">
+            <i class="el-icon-s-operation blue"></i>
+            选择指标项
+          </el-button> -->
+          <el-button class="primaryBtn" @click="addIndex(item, index)">
+            <i class="el-icon-plus blue"></i>
+            增加指标项
+          </el-button>
+        </div>
+        <div class="orange" style="font-size: 16px;font-weight: 700;">
+          共
+          <span class="blue">{{ getIndexNum(index, 1) }}</span>
+          项指标
+          <span v-if="item.index_type == 1 || item.index_type == 2">
+            ,所有指标权重合计:
+            <span style="font-weight: 600;color: #222;">{{ getIndexNum(index, 2) }}</span>
+            %
+          </span>
+        </div>
+      </div>
+    </div>
+
+    <!-- 提示弹窗 -->
+    <el-dialog
+      :title="ruleForm.calc_type == 1 ? '维度权重参与计算(加和)' : '维度权重参与计算(加权)'"
+      :visible.sync="dialogVisible"
+      width="500px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <el-alert type="warning" :closable="false" show-icon style="margin: 20px 0;">
+        <p><b>请谨慎启用<维度权重参与计算>,如不符合以下条件,请勿启用</b></p>
+        <li class="headLi" style="margin-bottom: 10px;">- 必须保证每个考核维度内的指标权重总和为100%</li>
+        <li class="headLi">- 维度权重会参与计算得分,可参考下图</li>
+      </el-alert>
+      <img src="static/images/gs3.png" v-if="ruleForm.calc_type == 1" style="width: 100%;height: auto;" />
+      <img src="static/images/gs1.png" v-else style="width: 100%;height: auto;" />
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="ruleForm.calc_dimension = 0">不启用</el-button>
+        <el-button @click="dialogVisible = false">启用</el-button>
+      </span>
+    </el-dialog>
+
+    <!-- 新增指标 -->
+    <BrawerBox drawerTitle="指标设置" :showDrawer.sync="isAddIndex" :closeModal="false">
+      <template slot="main">
+        <el-form ref="saveAddIndex" :model="addIndexForm" :rules="addIndexFormRule" @submit.native.prevent label-width="120px">
+          <el-form-item label="指标类型:" prop="type">
+            <el-select v-model="addIndexForm.type" disabled placeholder="请选择指标类型" class="width-250">
+              <el-option label="量化指标" :value="1"></el-option>
+              <el-option label="非量化指标" :value="2"></el-option>
+              <el-option label="额外加分项" :value="3"></el-option>
+              <el-option label="额外扣分项" :value="4"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="指标名称:" prop="name">
+            <el-input v-model="addIndexForm.name" placeholder="请输入指标名称" maxlength="30" show-word-limit></el-input>
+          </el-form-item>
+          <el-form-item :label="fromName" prop="per_remark">
+            <el-input type="textarea" placeholder="请输入" v-model="addIndexForm.per_remark" autosize clearable show-word-limit maxlength="500"></el-input>
+          </el-form-item>
+          <el-form-item label="加分上限" prop="point_limit" v-if="addIndexForm.type == 3">
+            <el-input placeholder="请输入加分上限" v-model="addIndexForm.point_limit" id="input3" @input="checkCountry2('input3')"></el-input>
+          </el-form-item>
+          <el-form-item label="扣分上限" prop="point_limit" v-if="addIndexForm.type == 4">
+            <el-input placeholder="请输入扣分上限" v-model="addIndexForm.point_limit" id="input4" @input="checkCountry2('input4')"></el-input>
+          </el-form-item>
+          <el-form-item label="目标值:" prop="target"v-if="addIndexForm.type == 1">
+            <el-input v-model="addIndexForm.target" placeholder="请输入目标值"></el-input>
+          </el-form-item>
+          <el-form-item label="量化指标单位:" prop="unit" v-if="addIndexForm.type == 1">
+            <el-input v-model="addIndexForm.unit" placeholder="请输入量化指标单位"></el-input>
+          </el-form-item>
+          <el-form-item >
+              <template slot="label">
+                <span>结果值录入:</span>
+                <el-tooltip effect="dark" placement="top">
+                  <template slot="content">
+                    结果值用来记录考核周期内指标的实际完成情况<br/>
+                    开启后,评分前需要先录入结果值,否则不能评分<br/>
+                    量化指标必须填写结果值<br/>
+                    其他类型指标必须提供结果附件作为凭据
+                  </template>
+                  <i class="el-icon-warning"></i>
+                </el-tooltip>
+              </template>
+            <el-select v-model="addIndexForm.result_type" placeholder="请选择指标类型" class="width-250">
+              <el-option label="不开启" value="none"></el-option>
+              <el-option label="被考核人" value="self"></el-option>
+              <el-option label="指定员工" value="special"></el-option>
+              <el-option label="直接管理员" value="supervisor"></el-option>
+            </el-select>
+            <div v-if="addIndexForm.result_type == 'special'" style="position: relative; margin-top: 10px;"  class="width-250">
+              <el-input v-model="assignUser.name" placeholder="请选择指定员工"></el-input>
+              <div @click="addUser(1)" class="inputDc"></div>
+            </div>
+          </el-form-item>
+          <el-form-item label="权重:" prop="weight" v-if="addIndexForm.type == 2 || addIndexForm.type == 1">
+            <el-input placeholder="请输入权重(1~100)" id="input2" @input="checkCountry('input2')" v-model.number="addIndexForm.weight">
+              <template slot="append">
+                %
+              </template>
+            </el-input>
+          </el-form-item>
+          <el-form-item label="备注:" prop="remark">
+            <el-input type="textarea" placeholder="请输入" v-model="addIndexForm.remark" :rows="4" show-word-limit maxlength="500"></el-input>
+          </el-form-item>
+          <el-form-item label="自动算分" v-if="addIndexForm.type == 1">
+              <template slot="label">
+                <span>自动算分:</span>
+                <el-tooltip effect="dark" placement="top">
+                  <template slot="content">
+                    <div>需开启结果值录入</div>
+                  </template>
+                  <i class="el-icon-warning"></i>
+                </el-tooltip>
+              </template>
+              <el-switch v-model="addIndexForm.expression.auto_calculation" :disabled="addIndexForm.result_type=='none'" :active-value="1" :inactive-value="0"></el-switch>
+              <div v-if="addIndexForm.expression.auto_calculation==1" class="pointBox">
+                 <div v-if="addIndexForm.expression.expression" style="padding: 10px;padding-top: 0;">
+                    <div class="flex-box-ce">
+                      <div class="flex-1">评分公式</div>
+                      <div class="blue" style="cursor: pointer;" @click="isShowTestCalculate=true">测试计算公式</div>
+                    </div>
+                    <div @click="isE=true" v-html="expressionStr" style="background-color: #f1f1f1;padding: 10px;text-align: left;border-radius: 5px;cursor: pointer;"></div>
+                  </div>
+                  <div  v-else class="blue" style="text-align: center;padding-top: 30px;cursor: pointer;" @click="isE=true">设置评分计算方式</div>
+              </div>
+
+              <div class="fontColorC" style="line-height: 24px;">开启后,系统将根据评分公式自动计算指标得分,供评分人参考实现快速评分</div>
+          </el-form-item>
+          <el-form-item label="开启指定评分人:" prop="isReviewer">
+            <el-switch v-model="addIndexForm.isReviewer"></el-switch>
+            <div style="position: relative;" v-if="addIndexForm.isReviewer">
+              <el-input v-model="assignScoreUser.name" placeholder="请选择评分人" class="width-250"></el-input>
+              <div @click="addUser(2)" class="inputDc"></div>
+            </div>
+          </el-form-item>
+          <el-form-item label="管理记录人" prop="employee_ids">
+            <div class="border flex-box-ce">
+              <div class="flex-1" v-if="record_ids.length == 0">请选择记录人</div>
+              <div v-else style="width: 250px;" class="font-flex-word">
+                <span v-for="(item, index) in record_ids" :key="index">
+                  <i v-if="index != 0">,</i>{{ item.name }}
+                </span>
+              </div>
+              <span v-if="record_ids.length >0" class="blue">{{record_ids.length}}人</span>
+              <i class="el-icon-arrow-down icon-right" v-else></i>
+              <div @click="isShowRecordFun()" class="inputDc"></div>
+            </div>
+          </el-form-item>
+        </el-form>
+        <div>
+          <span style="font-weight: 600;font-size: 14px;color: #606266;">按分数展示对应的评级:</span>
+          <el-select v-model="addIndexForm.index_level_id" @change="levelReadOnly" filterable clearable placeholder="请选择对应的评级">
+            <el-option
+              v-for="item in levelOptions"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id">
+            </el-option>
+          </el-select>
+        </div>
+        <ClassSet v-if="addIndexForm.index_level_id!=0&&getIs" ref="ClassSet" :readOnly="true" :inputs="inputs" style="padding-top: 20px;" :inputsStyle="{paddingLeft:'0px',width: '450px'}"></ClassSet>
+      </template>
+      <template slot="footer">
+        <el-button plain @click="closeAddIndexForm('saveAddIndex')">取消</el-button>
+        <el-button type="primary" @click="saveAddIndex('saveAddIndex', 1)" v-if="isSave">提交</el-button>
+        <el-button type="primary" @click="saveAddIndex('saveAddIndex', 2)" v-else>保存</el-button>
+      </template>
+    </BrawerBox>
+
+    <!-- 选择指标项 -->
+    <BrawerBox drawerTitle="选择指标项" :showDrawer.sync="isSelectIndex">
+      <template slot="main">
+        <div class="flex-box-ce">
+          <el-select v-model="cate_id" filterable placeholder="请选择或搜索分类" class="flex-2">
+            <el-option v-for="item in indexTypeList" :key="item.value" :label="item.label" :value="item.value"></el-option>
+          </el-select>
+          <el-select v-model="tabIds" multiple placeholder="标签搜索" class="flex-1" style="margin-left: 10px;" v-if="tabs.length > 0">
+            <el-option v-for="item in tabs" :key="item.id" :label="item.name" :value="item.id"></el-option>
+          </el-select>
+        </div>
+        <template v-if="indexList.length > 0">
+          <div class="flex-box-ce li" style="margin-top: 20px;"><el-checkbox class="flex-box-ce" v-model="isAllSelectIndex" label="全选"></el-checkbox></div>
+          <div class="infinite-list-wrapper scroll-bar">
+              <ul class="ul" v-loading="indexLoading2" v-infinite-scroll="load" infinite-scroll-disabled="disabled">
+                <li v-for="(item, index) in indexList" :key="index" class="flex-box li">
+                  <el-checkbox class="flex-box-ce" v-model="item.check" :label="item.name">
+                    <div>
+                      <div>
+						  <i class="el-icon-pie-chart blue" v-if="item.enable_ds == 1"></i>
+						  {{item.name}}
+					  </div>
+                      <div class="fontColorD" style="font-size: 12px; width: ;">{{item.cate_name}}</div>
+                    </div>
+                  </el-checkbox>
+                </li>
+                <div class="fontColorC" style="text-align: center;padding: 10px 0;font-size: 12px;">没有更多了</div>
+              </ul>
+          </div>
+        </template>
+        <NoData v-else></NoData>
+      </template>
+      <template slot="footer">
+        <el-button plain @click="isSelectIndex = false">取消</el-button>
+        <el-button type="primary" :loading="indexLoading2" @click="selectCate()">确定</el-button>
+      </template>
+    </BrawerBox>
+
+    <!-- 添加维度 -->
+    <BrawerBox drawerTitle="维度设置" :showDrawer.sync="addDimensionality" :closeModal="false">
+      <template slot="main">
+        <el-form ref="detailForm" :model="dimensionalityForm" @submit.native.prevent label-width="150px" class="detailForm">
+          <el-form-item prop="name" label="维度名称:" :rules="[{ required: true, message: '维度名称不能为空' }]">
+            <el-input type="textarea" v-model="dimensionalityForm.name" :rows="2" :autofocus="false" placeholder="请输入维度名称" class="width-250" clearable   maxlength="30" show-word-limit></el-input>
+          </el-form-item>
+          <el-form-item label="维度指标类型:">
+            <el-select v-model="dimensionalityForm.index_type" :disabled="compileWd" placeholder="请选择指标类型" class="width-250">
+              <el-option label="量化指标" :value="1"></el-option>
+              <el-option label="非量化指标" :value="2"></el-option>
+              <el-option label="额外加分项" :value="3"></el-option>
+              <el-option label="额外扣分项" :value="4"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item
+            label="维度权重:"
+            prop="dimension_weight"
+            :rules="[{ required: true, message: '维度权重不能为空' }]"
+            v-if="dimensionalityForm.index_type != 3 && dimensionalityForm.index_type != 4 && ruleForm.calc_dimension"
+          >
+            <el-input placeholder="请输入" v-model.number="dimensionalityForm.dimension_weight" @input="checkCountry('input')" class="width-250" id="input">
+              <el-button slot="append">%</el-button>
+            </el-input>
+          </el-form-item>
+        </el-form>
+      </template>
+      <template slot="footer">
+        <el-button plain @click="closeWd()">取消</el-button>
+        <el-button type="primary" @click="saveForm('detailForm')" v-if="compileWd">保存</el-button>
+        <el-button type="primary" @click="submitForm('detailForm')" v-else>提交</el-button>
+      </template>
+    </BrawerBox>
+
+    <!-- 评分人 -->
+    <EmployeeSelector :multi="false" :is_filtration_creator="false" :selected="selected" :isChecKedAll="false" :visible.sync="setAdministrator" @confirm="confirmAdministrator" />
+    <!-- 管理记录人 -->
+    <EmployeeSelector :is_filtration_creator="false" :selected="selected2"  :visible.sync="isShowRecord" @confirm="confirmAdministrator2"/>
+
+    <!-- 编辑公式 -->
+    <Equation :visible.sync="isE" :expression.sync="expression"></Equation>
+
+    <!-- 测试计算 -->
+    <TestCalculate :visible.sync="isShowTestCalculate" :str="expressionStr" :expression="expression.expression"></TestCalculate>
+  </div>
+</template>
+
+<script>
+import EmployeeSelector from '@/components/EmployeeSelector';
+import BrawerBox from '@/performance/components/public/BrawerBox';
+import ClassSet from '@/performance/components/public/ClassSet';
+import Equation from '@/performance/components/public/Equation';
+import TestCalculate from '@/performance/components/public/TestCalculate';
+import {getExpressionStr} from '@/performance/utils/auth'
+export default {
+  components: { EmployeeSelector, BrawerBox , ClassSet,Equation,TestCalculate},
+  name: 'Template',
+  props: {
+    data: {
+      type: Object,
+      default: {}
+    }
+  },
+  data() {
+    return {
+      inputs: [],//分值区间(只读)
+      levelOptions: [],//指标等级列表
+      loading: false,
+      compileWd: false, //编辑维度时控制是否可选择
+      dimension: true,
+      ruleForm: {
+        calc_type: 1, //指标评分计算方式 1-加和计算 2-加权计算
+        calc_dimension: 0 //是否维度权重参与计算 1-是 0-否
+      },
+      dialogVisible: false, //弹窗
+      addDimensionality: false, //显示添加维度
+      dimensionalityForm: {
+        name: '',
+        index_type: 1, //维度类型
+        dimension_weight: 100, //维度权重
+        index_num: 0, //所含指标数量
+        weight_type: '', //所含指标总权重
+        target_index: true, //制定目标时是否可以增加指标 1-可以 0-不可以
+        // all_dimension_index_weight:0,//维度内指标总权重数值
+        // total_weight:0,//所有维度所有指标总权重.
+        index: []
+      },
+      dimensionalityList: [],
+      selectItemIndex: 0, //选择的维度下标,
+      selectItemIndex_index: 0, //选择的指标下标,
+
+      indexLoading: false,
+      isSelectIndex: false, //选择指标弹窗控制
+      isAllSelectIndex: false, //是否全选指标
+      cate_id: 0,
+      indexType: 0, //指标分类
+      indexList: [],
+      indexTypeList: [],
+
+      indexLoading2: false,
+      indexPage:1,
+      isAfterLoading:false,//是否加载完
+
+      // 添加指标
+      selected2:{ employee: [], dept: [] },//已经选择人员
+      isAddIndex: false,
+      addIndexForm: {
+        // cate_id: '', //指标分类id
+        id: 0,
+        custom: 1,
+        name: '', //指标名称
+        per_remark: '', //考核标准
+        remark: '', //备注
+        type: '', //默认1 指标种类 1-量化指标 2-非量化指标 3-额外加分项 4-额外扣分项
+        unit: '', //量化指标单位
+        target: '', //目标值
+        result_type: 'none', //(结果值录入者设置,none-不开启 self-被考核人 special-指定员工 supervisor-指定主管’
+        result_employee_id: '', //结果值录入者id, 只有result_type为special时才需要指定
+        weight: '', //权重 0-100之间
+        reviewer_id: '', //指定审批人(评分人)id
+        point_limit: '', //分数上限,只对额外加分项以及额外扣分项有用
+        // tag_ids:'',//指标id 数组或逗号分割
+        // 自定义
+        isReviewer: false, //
+        index_level_id: '',//指标等级
+        record_ids:[],//管理记录人
+        expression:{
+          type: 1,                //1用户模式 2 开发者模式
+          logic_type: 1,        //1连续区间  2  列举  3  百分比加减   4 无条件
+          compare: 1,            //1  结果值  2 结果值/目标值 3结果值=目标值
+          reference: 1,            // 1手动输入   2选择系统字段
+          logic_section: [],            //连续区间的算分逻辑数组
+          logic_enum: [],            //列举的算分逻辑数组
+          logic_percent: [],            //百分比加减的算分逻辑数组
+          logic_eq: [],            //无条件的算分逻辑数组
+          expression: "",        //最终表达式
+          auto_calculation:0,   //是否开启表达式算分  0 否   1 是
+          scorer_change:1,        ////评分人是否允许修改  1 允许   2 不允许
+        }
+      },
+      record_ids:[],
+      isShowRecord:false,
+      fromName: '考核标准:',
+      assignUser: {}, //指定人员
+      assignScoreUser: {}, //指定评分人
+      selected: { employee: [], dept: [] }, //已经选择人员
+      setAdministrator: false,
+      isUserIndex: 1, //判断选择什么人,1是指定人员,2是评分人
+      isSave: true, //判断指标是提交还是编辑
+      addIndexFormRule: {
+        name: [{ required: true, message: '请输入指标名称'}, { min: 2, message: '最少2个字'}],
+        per_remark: [{ required: true, message: '请输入考核标准'}, { min: 2, message: '最少2个字'}],
+        weight: [{ required: true, message: '请输入权重'}]
+      },
+      ids: [], //需要过滤的指标ID
+      isTan: true,
+      sumText: {
+        num: 0,
+        val: 0
+      },
+      // 标签相关
+      tabs: [],
+      tabIds: [],
+
+      //自动计分
+      expression:{
+        type: 1,                //1用户模式 2 开发者模式
+        logic_type: 1,        //1连续区间  2  列举  3  百分比加减   4 无条件
+        compare: 1,            //1  结果值  2 结果值/目标值 3结果值=目标值
+        reference: 1,            // 1手动输入   2选择系统字段
+        logic_section: [],            //连续区间的算分逻辑数组
+        logic_enum: [],            //列举的算分逻辑数组
+        logic_percent: [],            //百分比加减的算分逻辑数组
+        logic_eq: [],            //无条件的算分逻辑数组
+        expression: "",        //最终表达式
+        auto_calculation:0,   //是否开启表达式算分  0 否   1 是
+        scorer_change:1,        ////评分人是否允许修改  1 允许   2 不允许
+      },
+      isE:false,
+      isShowTestCalculate:false,
+      expressionStr:'',//预览公式
+
+    };
+  },
+  watch: {
+    'addIndexForm.result_type'(val){
+      if(val=='none'){
+        this.addIndexForm.expression.auto_calculation=0;
+      }
+    },
+    isAllSelectIndex(val) {
+      this.indexList.forEach(item => {
+        item.check = val;
+      });
+    },
+    'addIndexForm.type'(val) {
+      if (val == 3) {
+        this.fromName = '加分标准:';
+      } else if (val == 4) {
+        this.fromName = '扣分标准:';
+      } else {
+        this.fromName = '考核标准:';
+      }
+    },
+    data(val) {
+      if (val.calc_type) {
+        this.recoverData();
+      }
+    },
+    'ruleForm.calc_dimension'(val) {
+      this.dialogVisible = false;
+      if (val == 1 && this.isTan) {
+        this.dialogVisible = true;
+      }
+    },
+    cate_id() {
+      this.indexPage=1;
+      this.isAfterLoading=false;
+      this.getIndexList();
+    },
+    isSelectIndex(val) {
+      //关闭选择指标时清空过滤的指标
+      if (!val) {
+        this.ids=[];
+        this.tabIds=[];
+        this.isAfterLoading=false;
+        this.isAllSelectIndex=false
+        this.cate_id=0
+        this.indexPage=1;
+      }
+    },
+    tabIds(val) {
+      this.indexPage=1;
+      this.isAfterLoading=false;
+      this.isAllSelectIndex=false
+      this.getIndexList();
+    },
+    record_ids(val) {
+       let ids=val.map(item=>{
+         return item.id
+       })
+       this.addIndexForm.record_ids = ids || '';
+    },
+    expression(val){
+      this.addIndexForm.expression=val;
+      this.expressionStr=getExpressionStr(this.expression);
+    },
+  },
+  created() {
+    this.getTagList();
+    this.getIndexType();
+    this.gradeSetList();
+  },
+  computed: {
+    getIs(){
+      if(this.levelOptions.length>0){
+        let is=false;
+        this.levelOptions.forEach(item=>{
+          if(item.id==this.addIndexForm.index_level_id){
+            is=true;
+          }
+        })
+        return is;
+      }else{
+        return false
+      }
+    },
+    disabled () {
+      return this.indexLoading2||this.isAfterLoading
+    },
+  },
+  methods: {
+
+    changeResultType(e, index) {
+      // console.log(v);
+      if(e.row.result_type == 'special') {
+        this.addUser(1);
+        this.selectItemIndex = index;
+        this.selectItemIndex_index = e.$index;
+        // console.log(this.assignUser);
+        // let index = {
+        //   id: this.addIndexForm.id ? this.addIndexForm.id : 0, //对应的指标库id,0-标识为自定义添加的指标
+        //   custom: this.addIndexForm.custom,
+        //   type: this.addIndexForm.type, //指标种类 1-量化指标 2-非量化指标 3-额外加分项 4-额外扣分项
+        //   name: this.addIndexForm.name, //指标名
+        //   per_remark: this.addIndexForm.per_remark, //考核标准,加分标准,扣分标准等说明
+        //   remark: this.addIndexForm.remark, //指标备注
+        //   target: this.addIndexForm.target, //目标值
+        //   unit: this.addIndexForm.unit, //量化指标单位
+        //   point_limit: this.addIndexForm.point_limit, //分数上限,只对额外加分项以及额外扣分项有用
+        //   weight: this.addIndexForm.weight, //权重 0-100之间
+        //   result_type: 'special', //结果值录入者设置,none-不开启 self-被考核人 special-指定员工 supervisor-指定主管)
+        //   // 当录入者是指定人员时才录入
+        //   result_employee_id: this.assignUser.id, //结果值录入者id,只有result_type为special时才需要指定
+        //   result_employee_name: this.assignUser.name,
+        // }
+        // this.dimensionalityList[this.selectItemIndex].index.splice(this.selectItemIndex_index, 1, index); //替换元素
+      }
+    },
+    isShowRecordFun(){
+      this.selected2.employee = this.record_ids;
+      this.isShowRecord=true;
+    },
+    confirmAdministrator2(e){
+      this.record_ids = e.employee.length > 0 ? e.employee : []
+    },
+    load () {
+      this.indexLoading2 = true
+      this.indexPage=this.indexPage+1;
+      setTimeout(() => {
+        this.getIndexList();
+        this.indexLoading2 = false
+      }, 500)
+    },
+    levelReadOnly(item){
+      var newArr = this.levelOptions.filter(function (obj) {
+          return obj.id == item;
+      });
+      if(newArr.length > 0){
+        this.islevel(newArr[0])
+      }
+    },
+    islevel(levels){
+      var inputs=[];
+      var max=0;//最大值
+      levels.scope.forEach((item,index)=>{
+        var obj;
+        if(index==0){
+          obj={name:item.name,max:Number(item.value),min:0};
+        }else{
+          obj={name:item.name,max:Number(item.value),min:max};//当不是第一个等级时,最小值为上一个的最大值
+        }
+        max=item.value;
+        inputs.push(obj);
+      })
+      this.$nextTick(()=>{
+        this.inputs=inputs
+      })
+    },
+    //指标等级列表
+    gradeSetList(){
+      this.$axiosUser('get', '/api/pro/per/index/level/list').then(res => {
+        if(res.data.code == 1){
+          let list = res.data.data.list
+          this.levelOptions = list
+        }
+      })
+    },
+    checkCountry2(str) {
+      //解决v-model与oninput同时使用失效问题
+      var dom = document.getElementById(str);
+      var value = dom.value;
+      //写你自己的输入规则
+      value = value.replace(/[^\d]/g, '');
+      dom.value = value; //输入框赋值
+      this.addIndexForm.point_limit = dom.value;
+    },
+    checkCountry(str) {
+      //解决v-model与oninput同时使用失效问题
+      var dom = document.getElementById(str);
+      var value = dom.value;
+      //写你自己的输入规则
+      value = value.replace(/[^\d]/g, '');
+      if (value > 100) {
+        str == 'input' ? (this.dimensionalityForm.dimension_weight = '') : (this.addIndexForm.weight = '');
+        this.$message.error('不能大于100');
+        return false;
+      }
+      dom.value = value; //输入框赋值
+      str == 'input' ? (this.dimensionalityForm.dimension_weight = dom.value) : (this.addIndexForm.weight = dom.value);
+    },
+    // 统计指标
+    getIndexNum(index, type) {
+      let num = this.dimensionalityList[index].index.length;
+      let val = 0;
+      if (type == 1) {
+        return num;
+      } else {
+        this.dimensionalityList[index].index.forEach(item => {
+          val += Number(item.weight);
+        });
+        return val;
+      }
+    },
+    // 统计维度
+    getNum() {
+      let num = this.dimensionalityList.length;
+      let val = 0;
+      this.dimensionalityList.forEach(item => {
+        if(item.index_type==1||item.index_type==2){
+          val += Number(item.dimension_weight);
+        }
+      });
+      this.sumText = {
+        num: num,
+        val: val
+      };
+    },
+    // 编辑时复原整个流程数据
+    recoverData() {
+      let data = this.data;
+      let employeeMap = this.$getEmployeeMapAll();
+      this.isTan = false;
+      this.ruleForm.calc_type = data.calc_type;
+      this.ruleForm.calc_dimension = data.calc_dimension;
+      data.dimension.forEach(item => {
+        if (item.index.length > 0) {
+          item.index.forEach(item2 => {
+            item2.result_employee_name = employeeMap[item2.result_employee_id] ? employeeMap[item2.result_employee_id].name : '';
+            item2.reviewer_name = employeeMap[item2.reviewer_id] ? employeeMap[item2.reviewer_id].name : '';
+          });
+        }
+      });
+      this.dimensionalityList = data.dimension;
+      this.$nextTick(() => {
+        setTimeout(() => {
+          this.isTan = true;
+          this.getNum();
+        }, 200);
+      });
+    },
+    // 保存||编辑指标
+    saveAddIndex(formName, val) {
+      this.$refs[formName].validate(valid => {
+        if (valid) {
+          if (this.addIndexForm.result_type == 'special') {
+            if (!this.assignUser.id) {
+              this.$message.error('请选择指定人员');
+              return;
+            }
+          }
+          if (this.addIndexForm.type == 3 || this.addIndexForm.type == 4) {
+            if (this.addIndexForm.point_limit === 0) {
+              this.$message.error('分数上限不能为0');
+              return;
+            }
+          }
+          if (this.addIndexForm.type == 1 || this.addIndexForm.type == 2) {
+            if (this.addIndexForm.weight == 0) {
+              this.$message.error('权重不能为0');
+              return;
+            }
+            if(this.addIndexForm.weight>100){
+              this.$message.error("权重不能大于100")
+              return
+            }
+          }
+          if (this.addIndexForm.isReviewer) {
+            if (!this.assignScoreUser.id) {
+              this.$message.error('请选择指定评分人');
+              return;
+            }
+          }
+          if(this.addIndexForm.type==1) {
+            if(this.addIndexForm.expression.auto_calculation==1 && !this.addIndexForm.expression.expression){
+              this.$message.error('请设置评分计算方式');
+              return;
+            }
+          }
+
+          var index = {
+            id: this.addIndexForm.id ? this.addIndexForm.id : 0, //对应的指标库id,0-标识为自定义添加的指标
+            custom: this.addIndexForm.custom,
+            type: this.addIndexForm.type, //指标种类 1-量化指标 2-非量化指标 3-额外加分项 4-额外扣分项
+            name: this.addIndexForm.name, //指标名
+            per_remark: this.addIndexForm.per_remark, //考核标准,加分标准,扣分标准等说明
+            remark: this.addIndexForm.remark, //指标备注
+            target: this.addIndexForm.target, //目标值
+            unit: this.addIndexForm.unit, //量化指标单位
+            point_limit: this.addIndexForm.point_limit, //分数上限,只对额外加分项以及额外扣分项有用
+            weight: this.addIndexForm.weight, //权重 0-100之间
+            result_type: this.addIndexForm.result_type, //结果值录入者设置,none-不开启 self-被考核人 special-指定员工 supervisor-指定主管)
+            index_level_id: this.addIndexForm.index_level_id,//指标等级
+            // 当录入者是指定人员时才录入
+            result_employee_id: this.addIndexForm.result_type == 'special' ? this.assignUser.id : '', //结果值录入者id,只有result_type为special时才需要指定
+            result_employee_name: this.addIndexForm.result_type == 'special' ? this.assignUser.name : '',
+
+            // 当开启了指定审批人时才录入值
+            reviewer_id: this.addIndexForm.isReviewer ? this.assignScoreUser.id : '', //指定审批人(评分人)id
+            reviewer_name: this.addIndexForm.isReviewer ? this.assignScoreUser.name : '', //指定审批人名称
+            record_ids:this.addIndexForm.record_ids.length>0? this.addIndexForm.record_ids:[],//指定跟踪管理记录人 数组
+            // 自动评分
+            expression:JSON.parse(JSON.stringify(this.expression)),
+          };
+          if (val == 1) {
+            this.dimensionalityList[this.selectItemIndex].index.push(index);
+          } else {
+            this.dimensionalityList[this.selectItemIndex].index.splice(this.selectItemIndex_index, 1, index); //替换元素
+          }
+          this.closeAddIndexForm(formName);
+        }
+      });
+    },
+    // 删除维度
+    deleteItem(e, index) {
+      this.$confirm('确定删除该维度所有内容,删除后无法恢复', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          this.dimensionalityList.splice(index, 1);
+          this.getNum();
+        })
+        .catch(() => {});
+    },
+    // 编辑维度
+    compileItem(e, index) {
+      this.selectItemIndex = index;
+      this.dimensionalityForm = JSON.parse(JSON.stringify(e));
+      this.compileWd = true;
+      this.addDimensionality = true;
+    },
+    closeAddIndexForm(formName) {
+      // 清空数据
+      this.addIndexForm = {
+        id: 0,
+        custom: 1,
+        name: '', //指标名称
+        per_remark: '', //考核标准
+        remark: '', //备注
+        type: '', //默认1 指标种类 1-量化指标 2-非量化指标 3-额外加分项 4-额外扣分项
+        unit: '', //量化指标单位
+        target: '', //目标值
+        result_type: 'none', //(结果值录入者设置,none-不开启 self-被考核人 special-指定员工 supervisor-指定主管’
+        result_employee_id: '', //结果值录入者id, 只有result_type为special时才需要指定
+        weight: 0, //权重 0-100之间
+        reviewer_id: '', //指定审批人(评分人)id
+        point_limit: '', //分数上限,只对额外加分项以及额外扣分项有用
+        // tag_ids:'',//指标id 数组或逗号分割
+        // 自定义
+        isReviewer: false, //
+        index_level_id: '',
+        record_ids:[],
+        expression:{
+          type: 1,                //1用户模式 2 开发者模式
+          logic_type: 1,        //1连续区间  2  列举  3  百分比加减   4 无条件
+          compare: 1,            //1  结果值  2 结果值/目标值 3结果值=目标值
+          reference: 1,            // 1手动输入   2选择系统字段
+          logic_section: [],            //连续区间的算分逻辑数组
+          logic_enum: [],            //列举的算分逻辑数组
+          logic_percent: [],            //百分比加减的算分逻辑数组
+          logic_eq: [],            //无条件的算分逻辑数组
+          expression: "",        //最终表达式
+          auto_calculation:0,   //是否开启表达式算分  0 否   1 是
+          scorer_change:1,        ////评分人是否允许修改  1 允许   2 不允许
+        }
+      };
+      this.expression={
+        type: 1,                //1用户模式 2 开发者模式
+        logic_type: 1,        //1连续区间  2  列举  3  百分比加减   4 无条件
+        compare: 1,            //1  结果值  2 结果值/目标值 3结果值=目标值
+        reference: 1,            // 1手动输入   2选择系统字段
+        logic_section: [],            //连续区间的算分逻辑数组
+        logic_enum: [],            //列举的算分逻辑数组
+        logic_percent: [],            //百分比加减的算分逻辑数组
+        logic_eq: [],            //无条件的算分逻辑数组
+        expression: "",        //最终表达式
+        auto_calculation:0,   //是否开启表达式算分  0 否   1 是
+        scorer_change:1,        ////评分人是否允许修改  1 允许   2 不允许
+      };
+      this.assignUser = {}; //指定人员
+      this.assignScoreUser = {}; //指定评分人
+      this.record_ids=[];
+      this.isSave = true;
+      this.isAddIndex = false;
+    },
+    //添加指标
+    addIndex(e, index) {
+      this.selectItemIndex = index;
+      this.addIndexForm.type = e.index_type;
+      this.isAddIndex = true;
+    },
+    //选择指标
+    selectIndex(e, index) {
+      this.selectItemIndex = index;
+      this.indexType = e.index_type;
+      this.ids = e.index.map(item => {
+        //过滤已经选择的指标
+        return item.id;
+      });
+      this.indexLoading = true;
+      this.getIndexList(() => {
+        this.indexLoading = false;
+        this.isSelectIndex = true;
+      });
+    },
+    //删除指标
+    deleteIndex(e, index) {
+      this.$confirm('确定删除该指标', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          this.dimensionalityList[index].index.splice(e.$index, 1);
+        })
+        .catch(() => {});
+    },
+    //编辑指标
+    compileIndex(e, index) {
+      this.selectItemIndex = index;
+      this.selectItemIndex_index = e.$index;
+      let obj = e.row;
+      this.addIndexForm = {
+        id: obj.id,
+        custom: obj.custom,
+        name: obj.name, //指标名称
+        per_remark: obj.per_remark, //考核标准
+        remark: obj.remark, //备注
+        type: obj.type, //默认1 指标种类 1-量化指标 2-非量化指标 3-额外加分项 4-额外扣分项
+        unit: obj.unit, //量化指标单位
+        target: obj.target, //目标值
+        result_type: obj.result_type, //(结果值录入者设置,none-不开启 self-被考核人 special-指定员工 supervisor-指定主管’
+        result_employee_id: obj.result_employee_id, //结果值录入者id, 只有result_type为special时才需要指定
+        weight: obj.weight, //权重 0-100之间
+        reviewer_id: obj.reviewer_id, //指定审批人(评分人)id
+        point_limit: obj.point_limit, //分数上限,只对额外加分项以及额外扣分项有用
+        index_level_id: obj.index_level_id? obj.index_level_id:'',
+        // 自定义
+        isReviewer: obj.reviewer_id ? true : false, //是否显示指定审批人
+        record_ids: obj.record_ids?obj.record_ids:[],
+        expression:{
+          type: 1,                //1用户模式 2 开发者模式
+          logic_type: 1,        //1连续区间  2  列举  3  百分比加减   4 无条件
+          compare: 1,            //1  结果值  2 结果值/目标值 3结果值=目标值
+          reference: 1,            // 1手动输入   2选择系统字段
+          logic_section: [],            //连续区间的算分逻辑数组
+          logic_enum: [],            //列举的算分逻辑数组
+          logic_percent: [],            //百分比加减的算分逻辑数组
+          logic_eq: [],            //无条件的算分逻辑数组
+          expression: "",        //最终表达式
+          auto_calculation:0,   //是否开启表达式算分  0 否   1 是
+          scorer_change:1,        ////评分人是否允许修改  1 允许   2 不允许
+        }
+      };
+      if(obj.type == 1){//自动评分
+        this.addIndexForm.expression=JSON.parse(JSON.stringify(obj.expression));
+        this.expression=JSON.parse(JSON.stringify(obj.expression));
+      }
+      if(obj.index_level_id && obj.index_level_id > 0 && obj.index_level_id != ''){
+        this.levelReadOnly(obj.index_level_id)
+      }
+      let employeeMap = this.$getEmployeeMapAll();
+      // 管理记录
+      if(obj.record_ids){
+        this.record_ids=obj.record_ids.map(e=>{
+          let user=employeeMap[e]
+          return user
+        })
+      }
+      if(obj.result_employee_id){
+        this.assignUser = {
+          name:employeeMap[obj.result_employee_id].name,
+          id: employeeMap[obj.result_employee_id].id
+        }
+      }
+      if(obj.reviewer_id){
+        this.assignScoreUser = {
+          name:employeeMap[obj.reviewer_id].name,
+          id: employeeMap[obj.reviewer_id].id
+        };
+      }
+      this.isSave = false;
+      this.isAddIndex = true;
+    },
+    //保存人员
+    confirmAdministrator(e) {
+      if (this.isUserIndex == 1) {
+        this.assignUser = e.employee.length > 0 ? e.employee[0] : [];
+
+        let index = {
+          // id: this.addIndexForm.id ? this.addIndexForm.id : 0, //对应的指标库id,0-标识为自定义添加的指标
+          // custom: this.addIndexForm.custom,
+          // type: this.addIndexForm.type, //指标种类 1-量化指标 2-非量化指标 3-额外加分项 4-额外扣分项
+          // name: this.addIndexForm.name, //指标名
+          // per_remark: this.addIndexForm.per_remark, //考核标准,加分标准,扣分标准等说明
+          // remark: this.addIndexForm.remark, //指标备注
+          // target: this.addIndexForm.target, //目标值
+          // unit: this.addIndexForm.unit, //量化指标单位
+          // point_limit: this.addIndexForm.point_limit, //分数上限,只对额外加分项以及额外扣分项有用
+          // weight: this.addIndexForm.weight, //权重 0-100之间
+          result_type: 'special', //结果值录入者设置,none-不开启 self-被考核人 special-指定员工 supervisor-指定主管)
+          // 当录入者是指定人员时才录入
+          result_employee_id: this.assignUser.id, //结果值录入者id,只有result_type为special时才需要指定
+          result_employee_name: this.assignUser.name,
+        }
+        this.dimensionalityList[this.selectItemIndex].index.splice(this.selectItemIndex_index, 1, index); //替换元素
+      } else {
+        this.assignScoreUser = e.employee.length > 0 ? e.employee[0] : [];
+      }
+      
+      this.setAdministrator = false;
+    },
+    //筛选指标分类
+    selectCate() {
+      let indexList = JSON.parse(JSON.stringify(this.indexList));
+      let arr = [];
+      indexList.forEach(item => {
+        if (item.check) {
+          if(item.type==3||item.type==4){
+            if(item.point_limit==0){
+              item.point_limit="";
+            }
+          }
+          arr.push(item);
+        }
+      });
+      this.dimensionalityList[this.selectItemIndex].index.push(...arr);
+      this.isSelectIndex = false;
+    },
+    //选择人员
+    addUser(index) {
+      if (index == 1) {
+        this.selected.employee = this.assignUser.name ? [this.assignUser] : [];
+      } else {
+        this.selected.employee = this.assignScoreUser.name ? [this.assignScoreUser] : [];
+      }
+      this.isUserIndex = index;
+      this.setAdministrator = true;
+    },
+    //获取指标分类
+    getIndexType() {
+      this.$axiosUser('get', 'api/pro/per/index/cate/list', { page: 0 }).then(res => {
+        let data = res.data.data.list;
+        let indexTypeList = [{ label: '全部', value: 0 }];
+        data.forEach(item => {
+          indexTypeList.push({ label: item.name, value: item.id });
+        });
+        this.indexTypeList = indexTypeList;
+      });
+    },
+    //获取指标
+    getIndexList(fun = function() {}) {
+      let employeeMap=this.$getEmployeeMapAll()
+      this.$axiosUser('get', '/api/pro/per/index/list', { type: this.indexType, cate_id: this.cate_id,page:this.indexPage,page_size:30,tag_ids: JSON.stringify(this.tabIds) }).then(res => {
+          let list = res.data.data.list || [];
+          let indexList=[];
+          list.forEach(item => {
+            if(this.ids.indexOf(item.id)<0){//过滤已经选择的指标
+              item.check = false;
+              item.result_employee_name=employeeMap[item.result_employee_id]? employeeMap[item.result_employee_id].name:''
+              item.reviewer_name=employeeMap[item.reviewer_id]? employeeMap[item.reviewer_id].name:''
+              item.custom=0;
+              indexList.push(item)
+            }
+         });
+         if(list.length!=30){
+           this.isAfterLoading=true;
+         }
+         if (this.indexPage === 1) {
+           this.indexList = indexList;
+         } else {
+           this.indexList = this.indexList.concat(indexList);
+         }
+          fun();
+       })
+    },
+    //关闭维度
+    closeWd() {
+      this.dimensionalityForm = {
+        name: '',
+        index_type: 1, //维度类型
+        dimension_weight: 100, //维度权重
+        index_num: 0, //所含指标数量
+        weight_type: 0, //所含指标总权重
+        target_index: true, //制定目标时是否可以增加指标 1-可以 0-不可以
+        index: []
+      };
+      this.$nextTick(() => {
+        //消除form自动触发验证的问题
+        this.$refs.detailForm.clearValidate();
+      });
+      this.getNum();
+      this.compileWd = false;
+      this.addDimensionality = false;
+    },
+    //保存维度
+    saveForm(formName) {
+      this.$refs[formName].validate(valid => {
+        if (valid) {
+          let isName = true;
+          if (this.dimensionalityList[this.selectItemIndex].name != this.dimensionalityForm.name) {
+            //排除修改本身名称的情况
+            this.dimensionalityList.some(item => {
+              if (item.name == this.dimensionalityForm.name) {
+                isName = false;
+                return true;
+              }
+            });
+          }
+          if (!isName) {
+            this.$message.error('维度名称不能重复');
+            return false;
+          }
+          if (this.ruleForm.calc_dimension && (this.dimensionalityForm.index_type == 1 || this.dimensionalityForm.index_type == 2)) {
+            if (this.dimensionalityForm.dimension_weight == 0) {
+              this.$message.error('权重不能为0');
+              return;
+            }
+          }
+          if (this.dimensionalityForm.dimension_weight > 100) {
+            this.$message.error('权重不能大于100');
+            return;
+          }
+          this.dimensionalityList[this.selectItemIndex] = this.dimensionalityForm;
+          this.$nextTick(() => {
+            this.closeWd();
+          });
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    //获取标签列表
+    getTagList() {
+      this.$axiosUser('get', '/api/pro/per/index/tag').then(res => {
+        this.tabs = res.data.data.list || [];
+      });
+    },
+    // 添加维度
+    submitForm(formName) {
+      this.$refs[formName].validate(valid => {
+        if (valid) {
+          let isName = true;
+          this.dimensionalityList.some(item => {
+            if (item.name == this.dimensionalityForm.name) {
+              isName = false;
+              return true;
+            }
+          });
+          if (!isName) {
+            this.$message.error('维度名称不能重复');
+            return false;
+          }
+          if (this.ruleForm.calc_dimension && (this.dimensionalityForm.index_type == 1 || this.dimensionalityForm.index_type == 2)) {
+            if (this.dimensionalityForm.dimension_weight == 0) {
+              this.$message.error('权重不能为0');
+              return;
+            }
+          }
+          if (this.dimensionalityForm.dimension_weight > 100) {
+            this.$message.error('权重不能大于100');
+            return;
+          }
+          this.dimensionalityList.push(this.dimensionalityForm);
+          this.$nextTick(() => {
+            this.closeWd();
+          });
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    }
+  }
+};
+</script>
+<style scoped="scoped">
+  .border {
+    -webkit-appearance: none;
+    background-color: #fff;
+    background-image: none;
+    border-radius: 4px;
+    border: 1px solid #dcdfe6;
+    -webkit-box-sizing: border-box;
+    box-sizing: border-box;
+    color: #C0C4CF;
+    font-size: inherit;
+    height: auto;
+    outline: 0;
+    padding: 0 15px;
+    width: 330px;
+    position: relative;
+    cursor: pointer;
+  }
+  .border .font-flex-word{
+    color: #606266;
+  }
+  .infinite-list-wrapper{
+    height: calc(100vh - 270px);
+    overflow:auto;
+    overflow-x:hidden
+  }
+.pop-up{
+  position: sticky;
+  top: 0px;
+  z-index: 999;
+  background-color: #fff;
+}
+.diy-tip {
+  margin-bottom: 10px;
+  border: 1px solid #e6a23c;
+  padding: 20px 16px;
+  background-color: #fdf6ec;
+  p {
+    color: #e6a23c !important;
+    font-size: 15px;
+    margin: 0 !important;
+    padding-bottom: 4px;
+  }
+}
+::v-deep .el-dialog__header {
+  padding: 20px;
+  border-bottom: 1px solid #ebebeb;
+}
+::v-deep .el-dialog__body {
+  padding: 20px;
+  padding-top: 0px;
+}
+.all {
+  font-size: 14px;
+  padding: 20px 0;
+}
+.title {
+  font-weight: 600;
+  margin-bottom: 15px;
+  position: relative;
+  left: 0;
+  font-size: 16px;
+  color: #606266;
+}
+.title::after {
+  content: " ";
+  position: absolute;
+  width: 4px;
+  height: 18px;
+  background-color: #409EFF;
+  left: -10px;
+  top: 2px;
+}
+.popover-img {
+  width: 100%;
+  height: 200px;
+}
+.el-icon-warning {
+  color: #ccc;
+}
+.inputDc {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+  z-index: 9;
+  cursor: pointer;
+}
+.inputDc1 {
+  position: absolute;
+  top: 0;
+  left: 85px;
+  bottom: 0;
+  z-index: 9;
+}
+.inputDc2 {
+  position: absolute;
+  top: 0;
+  left: 195px;
+  bottom: 0;
+  z-index: 9;
+}
+.content {
+  /* background-color: #f9fdff; */
+  padding: 15px;
+  margin-bottom: 20px;
+  /* border: 1px solid #ecf5ff; */
+  border-radius: 4px;
+}
+.message {
+  background-color: #ecf5ff;
+  height: 100px;
+  border-radius: 5px;
+}
+.message-text {
+  font-size: 16px;
+  color: #222;
+  margin-bottom: 8px;
+}
+.blue {
+  cursor: pointer;
+  padding: 0 5px;
+}
+.width-250 {
+  width: 250px;
+}
+.wd-header {
+  background-color: #ECF5FF;
+}
+.wd-header i {
+  font-size: 24px;
+  margin-left: 10px;
+  cursor: pointer;
+  color: #888888;
+}
+.wds {
+  border: 1px solid #ebebeb;
+  margin-top: 20px;
+}
+.wd-title {
+  padding: 12px 20px;
+  /* border-bottom: 1px solid #ebebeb; */
+  color: #777777;
+}
+.wd-footer {
+  padding: 12px 20px;
+}
+.titles div {
+  padding-right: 12px;
+  margin-right: 12px;
+  border-right: 1px solid #ccc;
+}
+/* .titles div:last-child {
+  border-right: none;
+} */
+.el-icon-edit:hover {
+  color: #409EFF;
+}
+.el-icon-delete-solid:hover {
+  color: #f56c6c;
+}
+.ul {
+  margin: 20px 0;
+  margin-top: 0;
+}
+.li {
+  border-bottom: 1px solid #ebebeb;
+}
+.li .flex-box-ce {
+  padding: 15px 0;
+}
+.li:hover {
+  background-color: #f5f7fa;
+}
+::v-deep .el-textarea__inner::-webkit-scrollbar {
+  width: 6px;
+  height: 4px;
+}
+/*外层轨道。可以用display:none让其不显示,也可以添加背景图片,颜色改变显示效果*/
+::v-deep .el-textarea__inner::-webkit-scrollbar-track {
+  width: 6px;
+  background-color: #fff0;
+  -webkit-border-radius: 2em;
+  -moz-border-radius: 2em;
+  border-radius: 2em;
+}
+/*滚动条的设置*/
+::v-deep .el-textarea__inner::-webkit-scrollbar-thumb {
+  background-color: #fff0;
+  background-clip: padding-box;
+  -webkit-border-radius: 2em;
+  -moz-border-radius: 2em;
+  border-radius: 2em;
+}
+/*滚动条移上去的背景*/
+::v-deep .el-textarea__inner:hover::-webkit-scrollbar-thumb {
+  background-color: rgba(144, 147, 153, 0.3);
+  height: 20px;
+}
+
+
+/* 修改滚动条的宽度 */
+::v-deep .el-table__body-wrapper::-webkit-scrollbar {
+  width: 6px; /* 对于水平滚动条 */
+  height: 6px; /* 对于垂直滚动条 */
+  background-color: #f9f9f9;
+}
+ 
+/* 修改滚动条滑块的样式 */
+::v-deep .el-table__body-wrapper::-webkit-scrollbar-thumb {
+  border-radius: 10px;
+  background-color: #c1c1c1;
+}
+ 
+/* 修改滚动条轨道的样式 */
+::v-deep .el-table__body-wrapper::-webkit-scrollbar-track {
+  box-shadow: inset 0 0 5px rgba(87, 175, 187, 0.1);
+  border-radius: 10px;
+  background: #ededed;
+}
+
+::v-deep .el-table__body-wrapper::-webkit-scrollbar-thumb:hover {
+  background-color: #a8a8a8;
+}
+
+
+</style>

Разница между файлами не показана из-за своего большого размера
+ 422 - 234
src/performance/components/evaluate/Template.vue


+ 3 - 3
src/performance/components/public/ActionPlan.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
     <el-drawer title="执行计划" :visible.sync="showDrawerTow" direction="btt" class="all-derawer" :before-close="handleClose">
-      <div class="flex-box" style="height: calc(100vh - 10%);">
+      <div class="flex-box" style="height: calc(100vh - 30%);">
         <div class="drawer-left scroll-bar">
           <div class="draft-content" v-for="(item, index) in actionPlanList" :key="index">
             <div class="drawer-left-title font-flex-word">{{ item.name }}</div>
@@ -550,8 +550,8 @@ export default {
 
 <style scoped="scoped">
 .all-derawer ::v-deep.el-drawer {
-  height: 90% !important;
-  border-radius: 10px 10px 0 0;
+  height: 70% !important;
+  border-radius: 20px 20px 0 0;
   background-color: #f5f7fa;
   min-width: 1100px !important;
 }

+ 1 - 1
src/performance/components/public/ClassSet.vue

@@ -138,7 +138,7 @@ export default {
 }
 .el-icon-delete {
   margin-left: 10px;
-  font-size: 24px;
+  font-size: 14px;
   color: #777777;
   cursor: pointer;
 }

+ 1 - 1
src/performance/components/public/TesultType.vue

@@ -89,7 +89,7 @@ export default {
 }
 .el-icon-delete {
   margin-left: 10px;
-  font-size: 24px;
+  font-size: 14px;
   color: #777777;
   cursor: pointer;
 }

+ 7 - 3
src/performance/components/public/TrackManagement.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
   <el-drawer title="跟踪管理记录" :visible.sync="showDrawerTow" direction="btt" class="all-derawer" :before-close="handleClose">
-    <div class="flex-box" style="height: calc(100vh - 10%);">
+    <div class="flex-box" style="height: calc(100vh - 30%);">
       <div class="drawer-left scroll-bar">
         <div class="draft-content" v-for="(item, index) in actionPlanList" :key="index" v-if="item.index.length > 0">
           <div class="drawer-left-title font-flex-word">{{ item.name }}</div>
@@ -16,6 +16,7 @@
             <div style="padding: 0 10px;" class="blue">({{ item2.mamage_record.length }})</div>
           </div>
         </div>
+        
       </div>
       <div class="drawer-right flex-box-v scroll-bar flex-1" style="overflow: auto;background-color: #fff;">
         <div class="drawer-right-header">
@@ -652,11 +653,14 @@ export default {
 ::v-deep .el-icon-picture-outline {
 }
 .all-derawer ::v-deep.el-drawer {
-  height: 90% !important;
-  border-radius: 10px 10px 0 0;
+  height: 70% !important;
+  border-radius: 20px 20px 0 0;
   background-color: #f5f7fa;
   min-width: 1100px !important;
 }
+.all-derawer ::v-deep.el-drawer__body::-webkit-scrollbar{
+  display: none !important;
+}
 .all-derawer ::v-deep.el-drawer__header {
   background-color: #f5f7fa;
   padding: 12px 20px;

+ 578 - 0
src/performance/views/assessManagement/TargetListComp copy.vue

@@ -0,0 +1,578 @@
+<template>
+    <div>
+        <el-dialog title="" :visible.sync="dialogVisible" :fullscreen="true" center>
+            <div>
+                <template>
+                    <div class="title">关联OKR</div>
+                    <div class="itemBox" v-for="(item, index) in okrList" :key="item.id">
+                        <template>
+                            <div class="flex-box-ce fontColorC">
+                                <img class="jt" src="static/images/jt2.png">
+                                <div class="hoverBlue flex-1" style="margin-left: 16px;">
+                                    <span>对齐目标</span>
+                                </div>
+                                <div>
+                                    <span>起止时间:{{ item.start_time + ' ~ ' + item.end_time }}</span>
+                                </div>
+                            </div>
+                            <div class="flex-box" style="margin: 10px 0;">
+                                <div class="huan"><span></span></div>
+                                <div class="flex-1" style="padding-left: 10px;">
+                                    <div class="flex-box-ce">
+                                        <div class="flex-1"
+                                            style="padding-right: 30px; font-size: 18px; font-weight: 550; color: #141c28;"
+                                            @click="openDetail(item, 1)">
+                                            <span class="clamp2 hoverBlue">{{ item.name }}</span>
+                                        </div>
+                                        <Tooltip preHtml="目标评分">
+                                            <div class="orange-box"
+                                                style="width: 40px; border-radius: 25px; text-align: center;">{{
+                                                item.score }}</div>
+                                        </Tooltip>
+                                        <div class="fontColorC" style="padding:0 10px;">
+                                            <svg-icon icon-class="#icon-biaoqian_wode" class="svgIcon"></svg-icon>
+                                            {{ $getEmployeeMapItem(item.owner_id).name }}
+                                        </div>
+                                        <div style="position: relative;">
+                                            <!-- 进度条 -->
+                                            <Progress :status="item.risk_level"
+                                                :value="item.process ? Number(item.process) : 0"
+                                                :cursor="item.isOperation" style="margin-right: 20px;"></Progress>
+                                            <div v-if="item.process != item.process_last"
+                                                style="position: absolute; font-size: 12px;">
+                                                <!-- 上升百分比 -->
+                                                <span v-if="item.process - item.process_last > 0" class="green">
+                                                    <i class="el-icon-top"></i>
+                                                    {{ Math.abs(item.process - item.process_last).toFixed(2) }}%
+                                                </span>
+                                                <!-- 下降百分比 -->
+                                                <span v-else class="red">
+                                                    <i class="el-icon-bottom"></i>
+                                                    {{ Math.abs(item.process - item.process_last).toFixed(2) }}%
+                                                </span>
+                                            </div>
+                                        </div>
+
+                                    </div>
+                                    <div class="flex-box-ce fontColorC" style="margin: 12px 0; font-size: 13px;">
+
+                                        <div class="flex-1"></div>
+                                        <div class="flex-box-ce fontColorB" style="padding-right:20px">
+                                            <span class="width-120" style="padding-left:6px">负责人</span>
+                                            <span class="width-120" style="text-align: center;">截止时间</span>
+                                            <span class="width-120">完成度</span>
+                                        </div>
+                                    </div>
+
+                                    <!-- kr -->
+                                    <CollapseTransition :key="item.id">
+                                        <div>
+                                            <div class="fontColorC" v-for="(krItem, index2) in item.son_krs"
+                                                :key="krItem.id">
+                                                <div class="flex-box-ce kr-item" style="margin-right: 20px;">
+                                                    <span class="okr-index cursor" @click="openDetail(krItem, 2)">KR{{
+                                                        index2 + 1 }}</span>
+                                                    <div class="flex-1" style="margin-right: 30px;">
+                                                        <span class="clamp2 hoverBlue" @click="openDetail(krItem, 2)">{{
+                                                            krItem.name }}</span>
+                                                    </div>
+
+                                                    <template>
+                                                        <div class="width-120">
+                                                            <svg-icon icon-class="#icon-biaoqian_wode"
+                                                                class="svgIcon"></svg-icon>
+                                                            {{ $getEmployeeMapItem(krItem.owner_id).name }}
+                                                        </div>
+                                                        <div class="width-120" style="text-align: center;">
+                                                            <span>{{ $moment(krItem.end_time).format('MM/DD') }}</span>
+                                                        </div>
+                                                    </template>
+
+                                                    <div class="flex-box-ce width-120"
+                                                        :class="{ cursor: krItem.isOperation }"
+                                                        style="text-align: center;">
+                                                        <template v-if="krItem.process && krItem.process / 100 > 100">
+                                                            <el-progress :stroke-width="3"
+                                                                :color="customColorMethod(krItem.risk_level)"
+                                                                :show-text="false" :width="20" type="circle"
+                                                                :percentage="100"
+                                                                style="padding-left: 5px;"></el-progress>
+                                                        </template>
+                                                        <template v-else>
+                                                            <el-progress :stroke-width="3"
+                                                                :color="customColorMethod(krItem.risk_level)"
+                                                                :show-text="false" :width="20" type="circle"
+                                                                v-if="krItem.process"
+                                                                :percentage="krItem.process && Number(krItem.process)"
+                                                                style="padding-left: 5px;"></el-progress>
+                                                        </template>
+                                                        <span style="padding-left: 5px;">{{ krItem.process && krItem.process / 100}}%</span>
+                                                    </div>
+                                                </div>
+
+                                            </div>
+                                        </div>
+                                    </CollapseTransition>
+                                </div>
+                            </div>
+                        </template>
+                    </div>
+                    <!-- <div style="text-align: center;background-color: #fff;padding:10px 0;border-radius: 10px;">
+            <el-pagination layout="total,prev,pager,next,sizes" :current-page.sync="searchForm.page" :total="15"
+              @size-change="handleSizeChange" @current-change="handleCurrentChange" :page-sizes="[10, 20, 50, 100]"
+              :page-size="searchForm.pageSize"></el-pagination>
+          </div> -->
+                </template>
+            </div>
+            <div slot="footer">
+                <el-button @click="close">取 消</el-button>
+                <el-button type="primary" @click="close">确 定</el-button>
+            </div>
+        </el-dialog>
+        <!-- 目标详情 -->
+        <TargetDetail :type="showDetailType" :id="showDetailId" v-if="isShowTargetDetail" readonly
+            :showDrawer.sync="isShowTargetDetail" @confirm="getTargetDateil(o_id, true)"></TargetDetail>
+    </div>
+</template>
+
+<script>
+import TargetDetail from '@/okr/components/public/TargetDetail'; //目标详情
+import Tooltip from '@/components/Tooltip'; //鼠标悬浮显示文字
+import Progress from '@/okr/components/public/Progress'; //进度条
+import TargetType from '@/okr/components/public/TargetType'; //目标类型
+import CollapseTransition from '@/okr/utils/collapse-transition';
+import TaskItem from '@/okr/components/public/TaskItem'; //任务内容
+
+export default {
+    components: {
+        TargetDetail,
+        Tooltip,
+        Progress,
+        TargetType,
+        CollapseTransition,
+        TaskItem
+    },
+    props: {
+        dialogVisible: {
+            type: Boolean,
+            default: false
+        },
+    },
+    data() {
+        return {
+            showDetailId: 0,//打开详情的ID
+            showDetailType: 1,//打开详情的类型
+            searchForm: {
+                page: 1,
+                pageSize: 10,
+            },
+            
+            okrList: [],
+            isShowTargetDetail: false
+        }
+    },
+    created() {
+        let params = {
+            page: 1,
+            page_size: 10,
+            cycle_type: 0,
+            year: 2024,
+            belong_type: 0,
+            quarter: 0,
+            half_year: 0,
+            month: 0,
+            owner_id: 3036,
+            sort_ct: 2
+        }
+        this.$axiosUser('get', '/api/pro/okr/public/obj/search', params).then(res => {
+            if (res.data.code == 1) {
+                this.okrList = res.data.data.list;
+                console.log(this.okrList)
+                // this.headoptions = res.data.data.list;
+                // this.headvalue = Number(assID);
+            }
+        });
+    },
+    methods: {
+        close() {
+            this.emit("close")
+        },
+        customColorMethod(index) {
+            if (index == 1) {
+                return '#2879ff';
+            } else if (index == 2) {
+                return '#FF9600';
+            } else {
+                return '#F16060';
+            }
+        },
+        updateTargetType() { },
+        openDetail(item, type) {
+            if (type) {
+                this.showDetailType = type;//打开详情的类型
+            } else {
+                this.showDetailType = item.type
+            }
+            this.o_id = type == 2 ? item.o_id : item.id;
+            this.showDetailId = item.id;//打开详情的ID
+            this.isShowTargetDetail = true;
+        },
+        //动态更新目标详情
+        getTargetDateil(targetId, isShowText) {
+            let id = targetId ? targetId : this.selectAlignItem.id
+            this.$axiosUser('get', '/api/pro/okr/obj/list', { page: 1, page_size: 1, ids: JSON.stringify([id]) }).then(res => {
+                let data = res.data.data.list[0] || '';
+                if (data) {
+                    this.targetList.some((item, index) => {
+                        if (item.id == id) {
+                            data.isShow = this.targetList[index].isShow
+                            data.isShowSelectPeriod = false;
+                            data.dateStr = getDateStr(data)
+                            data.owner_userInfo = this.$getEmployeeMapItem(data.owner_id);
+                            data.isOperation = getOperation(data.publisher_id, data.owner_id);
+                            if (data.krs.length > 0) {
+                                data.krs.forEach(e => {
+                                    e.isOperation = getOperation(e.publisher_id, e.owner_id);
+                                })
+                            }
+                            this.targetList[index] = data;
+                            if (!isShowText) {
+                                this.$message.success('操作成功')
+                            }
+                            this.$forceUpdate();
+                            return true
+                        }
+                    })
+                }
+                // else {
+                //     this.getTargetList();
+                // }
+            })
+        },
+    }
+}
+</script>
+
+<style scoped lang="scss">
+.el-dialog {
+    ::v-deep .el-dialog__header {
+        width: 80% !important;
+    }
+}
+
+.width-120 {
+    width: 100px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+
+.selectUser ::v-deep input {
+    border-radius: 20px;
+}
+
+.user-item {
+    padding: 4px 6px;
+    border-radius: 5px;
+    cursor: pointer;
+}
+
+.userActive {
+    background-color: #ecf5ff;
+    color: #409EFF;
+}
+
+.span-item span {
+    font-size: 14px;
+    padding: 8px 20px;
+    border-bottom: 2px solid #f1f1f1;
+    // border-radius: 3px;
+    color: #89919f;
+    cursor: pointer;
+}
+
+.spanActive {
+    border-bottom: 2px solid #409EFF !important;
+    color: #409EFF !important;
+}
+
+.okrs-box {
+    padding: 10px 0;
+    border-bottom: 1px solid #f1f1f1;
+    cursor: pointer;
+}
+
+.okrs-box:hover {
+    background-color: #f4f6f9;
+}
+
+.message-items {
+    margin-top: 10px;
+    font-size: 12px;
+}
+
+.message-items div {
+    margin-right: 20px;
+    cursor: pointer;
+}
+
+.message-items i {
+    padding-right: 5px;
+}
+
+.weight {
+    width: 90px;
+    margin-right: 5px;
+    padding: 5px;
+    border: 1px dotted #fff;
+    border-radius: 5px;
+    cursor: pointer;
+}
+
+.weight:hover {
+    border: 1px dotted #ccc;
+}
+
+.weight span {
+    display: inline-block;
+    width: 50px;
+    text-align: center;
+    color: #e6a23c;
+}
+
+.kr-item {
+    padding: 4px 0;
+    position: relative;
+    margin-bottom: 8px;
+    border-radius: 5px;
+}
+
+.kr-item:hover {
+    background-color: #f4f6f9;
+}
+
+.huan {
+    position: relative;
+    width: 24px;
+    height: 24px;
+    border-radius: 100%;
+    background-color: #E9F1FE;
+    box-sizing: border-box;
+    margin: 0 3px;
+    text-align: center;
+    line-height: 25px;
+}
+
+.huan span {
+    border: 2px solid #409EFF;
+    border-radius: 100%;
+    width: 12px;
+    height: 12px;
+    display: inline-block;
+}
+
+.add-task-title {
+    padding: 10px;
+    position: relative;
+}
+
+.add-task-title::after {
+    content: "";
+    position: absolute;
+    width: 4px;
+    height: 14px;
+    border-radius: 5px;
+    background-color: #409EFF;
+    left: 0;
+    top: 13px;
+}
+
+.inputDc {
+    position: absolute;
+    top: 0;
+    right: 0;
+    left: 0;
+    bottom: 0;
+    z-index: 9;
+    cursor: pointer;
+}
+
+.el-icon-more {
+    width: 20px;
+    height: 20px;
+    box-sizing: border-box;
+    text-align: center;
+    line-height: 20px;
+    cursor: pointer;
+}
+
+.el-icon-more:hover {
+    background-color: #606266;
+    border-radius: 25px;
+    color: #fff;
+}
+
+.border {
+    -webkit-appearance: none;
+    background-color: #fff;
+    background-image: none;
+    border-radius: 4px;
+    border: 1px solid #dcdfe6;
+    -webkit-box-sizing: border-box;
+    box-sizing: border-box;
+    color: #C0C4CF;
+    font-size: inherit;
+    height: auto;
+    outline: 0;
+    padding: 0 15px;
+    padding-right: 10px;
+    line-height: 34px;
+    width: 270px;
+    position: relative;
+    cursor: pointer;
+}
+
+.border .font-flex-word {
+    color: #606266;
+}
+
+.border:hover {
+    border: 1px solid #c0c4cc;
+}
+
+.add-task-item {
+    position: relative;
+}
+
+.add-task-item:hover i {
+    cursor: pointer;
+    opacity: 1 !important;
+}
+
+.add-task {
+    // padding-left: 30px;
+}
+
+.oBox {
+    box-shadow: 0 0px 10px #F0F4FA;
+    border-radius: 3px;
+    padding: 5px 8px;
+}
+
+.add-task ::v-deep input {
+    border: none;
+    padding-right: 80px;
+}
+
+.oBox ::v-deep input {
+    border: none;
+    font-size: 18px;
+    font-weight: 600;
+    color: #141c28;
+    padding-right: 80px;
+}
+
+.oBox ::v-deep input::-webkit-input-placeholder {
+    font-weight: 500;
+}
+
+.edit {
+    display: none;
+    position: relative;
+    top: 1px;
+    padding-left: 5px;
+    transition: all .3s;
+}
+
+.edit:hover {
+    color: #409EFF !important;
+}
+
+.selectBox {
+    background-color: #fff;
+    border-radius: 25px;
+    padding: 10px 20px;
+}
+
+.header {
+    margin-bottom: 10px;
+    border-radius: 10px;
+    padding: 10px;
+    background-color: #fff;
+}
+
+.caret {
+    position: absolute;
+    width: 30px;
+    height: 30px;
+    text-align: center;
+    line-height: 30px;
+    left: -30px;
+    top: 50%;
+    margin-top: -15px;
+    box-sizing: border-box;
+    cursor: pointer;
+}
+
+.jt {
+    width: 24px;
+    position: relative;
+    top: 2px;
+    left: 4px;
+    transform: rotateY(180deg);
+    margin-left: 0px;
+}
+
+.title {
+    width: 60%;
+    margin: 0 auto 20px auto;
+    height: 50px;
+    line-height: 50px;
+    border-bottom: 1px solid #dcdfe6;
+    text-align: center;
+    font-size: 20px;
+    font-weight: 600;
+}
+
+.itemBox {
+    width: 60%;
+    padding: 20px;
+    border-radius: 10px;
+    background-color: #fff;
+    margin: 0 auto 20px auto;
+    box-shadow: 0 2px 12px #EBF0F6;
+}
+
+::v-deep .el-tabs__item {
+    color: #89919f;
+}
+
+::v-deep .is-active {
+    color: #409EFF;
+    font-weight: 600;
+}
+
+::v-deep .el-tabs__nav .is-active {
+    font-size: 16px;
+}
+
+::v-deep .el-tabs__header {
+    margin: 0px;
+}
+
+
+
+.select {
+    margin-right: 6px;
+}
+
+.select ::v-deep .el-input__inner {
+    border-radius: 25px;
+}
+
+.input ::v-deep .el-input__inner {
+    border: none;
+    border-bottom: 1px solid #f1f1f1;
+    border-radius: 0px;
+}
+</style>

+ 911 - 0
src/performance/views/assessManagement/TargetListComp.vue

@@ -0,0 +1,911 @@
+<template>
+    <div>
+        <el-dialog title="" :visible="dialogVisible" :fullscreen="true" center @close="close">
+            <div>
+                <!-- 条件筛选 -->
+                <div style="position: sticky; top: 0; background: #fff; z-index: 10;">
+                    <div class="title">关联OKR</div>
+                    <div class="flex-box-ce"
+                        style="width: 60%; margin: 20px auto; padding-bottom: 10px; margin-top: 20px; justify-content: space-around;">
+                        <el-select class="select" style="width: 120px;" size="small" v-model="year" placeholder="年份">
+                            <el-option v-for="item in yearArr" :key="item.value" :label="item.label"
+                                :value="item.value"></el-option>
+                        </el-select>
+                        <el-select class="select" style="width: 120px;" size="small" v-model="dataId" placeholder="周期">
+                            <el-option v-for="item in options" :key="item.value" :label="item.name"
+                                :value="item.value"></el-option>
+                        </el-select>
+                        <el-select class="select" style="width: 120px;" size="small" v-model="belong_type"
+                            placeholder="类型">
+                            <el-option v-for="item in getBelongType2" :key="item.value" :label="item.label"
+                                :value="item.value"></el-option>
+                        </el-select>
+                        <el-select class="select" style="width: 200px;" filterable size="small" v-model="owner_id"
+                            clearable placeholder="负责人">
+                            <el-option v-for="item in employeeMap" :key="item.id" :label="item.name"
+                                :value="item.id"></el-option>
+                        </el-select>
+                        <el-input class="input" style="width: 260px;" maxlength="10" show-word-limit size="small"
+                            v-model="key_word" clearable placeholder="请输入关键字" />
+                    </div>
+                    <!-- 条件筛选 -->
+                </div>
+                <template v-if="okrList && okrList.length > 0">
+                    <div class="itemBox" v-for="(item, index) in okrList" :key="item.id">
+                        <template v-if="item.finish_status == 0">
+                            <div class="flex-box-ce fontColorC">
+                                <img class="jt" src="static/images/jt2.png">
+                                <div class="hoverBlue flex-1" style="margin-left: 16px;">
+                                    <span @click.stop="openDuiQi(2, item)" v-if="!item.p_kr && !item.p_objectives">对齐目标</span>
+                                    <template v-else>
+                                        <template v-if="item.kr_id">
+                                            <span v-if="item.p_kr">{{ item.p_kr.name }}</span>
+                                            <span v-else @click.stop="openDuiQi(2, item)">对齐目标</span>
+                                        </template>
+                                        <template v-else-if="item.o_id">
+                                            <span v-if="item.p_objectives">{{ item.p_objectives.name }}</span>
+                                            <span v-else>对齐目标</span>
+                                        </template>
+
+                                    </template>
+                                </div>
+                            </div>
+                            <div class="flex-box" style="margin: 10px 0;">
+                                <div class="huan" @click="showTask(item)">
+                                    <span></span>
+                                    <i :class="item.isShow ? 'el-icon-d-arrow-left' : 'el-icon-d-arrow-right'"
+                                        class="blue"
+                                        style="position: absolute;top: 30px;left: 5px;transform: rotate(90deg);"></i>
+                                </div>
+                                <div class="flex-1" style="padding-left: 10px;">
+                                    <div class="flex-box-ce">
+                                        <div class="flex-1"
+                                            style="padding-right: 30px; font-size: 18; font-weight: 550; color: #141c28;">
+                                            <span class="clamp2 hoverBlue" @click="openDetail(item, 1)">{{ item.name }}</span>
+                                        </div>
+                                        <Tooltip preHtml="目标评分">
+                                            <div v-if="item.score >= 0" class="orange-box"
+                                                style="width: 40px;border-radius: 25px;text-align: center;">
+                                                {{ item.score }}</div>
+                                        </Tooltip>
+                                        <div class="fontColorC" style="padding:0 10px;">
+                                            <svg-icon icon-class="#icon-biaoqian_wode" class="svgIcon"></svg-icon>
+                                            {{ $getEmployeeMapItem(item.owner_id).name }}
+                                        </div>
+
+                                        <div style="position: relative;">
+                                            <Progress :status="item.risk_level" :value="Number(item.process)"
+                                                :cursor="item.isOperation" style="margin-right: 20px;"></Progress>
+                                            <div v-if="item.process != item.process_last"
+                                                style="position: absolute;font-size: 12px;">
+                                                <span v-if="item.process - item.process_last > 0" class="green"><i
+                                                        class="el-icon-top"></i>{{
+                                                    Math.abs(item.process -
+                                                    item.process_last).toFixed(2) }}%</span>
+                                                <span v-else class="red"><i class="el-icon-bottom"></i>{{
+                                                    Math.abs(item.process - item.process_last).toFixed(2) }}%</span>
+                                            </div>
+                                        </div> 
+                                    </div>
+                                    <div class="flex-box-ce fontColorC" style="margin: 12px 0;font-size: 13px;">
+                                        <div class="hover-border">
+                                            <svg-icon :icon-class="getBelongType1(item.belong_type).icon"
+                                                class="svgIcon"></svg-icon>
+                                            <span v-if="item.belong_type != 2">{{
+                                                getBelongType1(item.belong_type).label }}</span>
+                                            <span v-else>{{ $getDept(item.dept_id).name }}</span>
+                                        </div>
+                                        <div style="margin:0 10px;">
+                                            <i class="el-icon-alarm-clock"></i>
+                                            <span>{{ item.year }}年{{ item.dateStr }}</span>
+                                        </div>
+                                        <div v-if="item.os.length > 0" style="margin-left: 10px;"><i
+                                                class="el-icon-upload2"></i>对齐我的: <span class="hoverBlue"
+                                                @click="openDqMyTarget(item)">{{ item.os.length }}项目标</span></div>
+                                        <div class="flex-1"></div>
+                                        <div class="flex-box-ce fontColorB" style="padding-right:20px">
+                                            <span class="width-120" style="padding-left:6px">负责人</span>
+                                            <span class="width-120">截止时间</span>
+                                            <span class="width-120">完成度</span>
+                                        </div>
+                                    </div>
+
+                                    <!-- kr -->
+                                    <CollapseTransition :key="item.id">
+                                        <div
+                                            style="padding-left: 30px;position: relative;left: -30px;width: calc(100% + 30px);">
+                                            <div class="fontColorC" v-for="(krItem, index2) in item.krs"
+                                                :key="krItem.id">
+                                                <div class="flex-box-ce kr-item">
+                                                    <i v-if="krItem.statistics.plan_total > 0 || krItem.statistics.project_total > 0"
+                                                        class="caret"
+                                                        :class="krItem.isShow ? 'el-icon-caret-bottom' : 'el-icon-caret-right'"
+                                                        @click="showTask(krItem)"></i>
+                                                    <span class="okr-index cursor" @click="openDetail(krItem, 2)">KR{{
+                                                        index2 + 1 }}</span>
+                                                    <div class="flex-1" style="padding-right: 30px;">
+                                                        <span class="clamp2 hoverBlue" @click="openDetail(krItem, 2)">{{
+                                                            krItem.name }}</span>
+                                                    </div>
+
+                                                    <!-- 可编辑 -->
+                                                    <template v-if="krItem.can_edit">
+                                                        <div class="hover-border width-120">
+                                                            <svg-icon icon-class="#icon-biaoqian_wode"
+                                                                class="svgIcon"></svg-icon>{{
+                                                            $getEmployeeMapItem(krItem.owner_id).name }}
+                                                        </div>
+                                                        <div class="width-120">
+                                                            <span>{{ $moment(krItem.end_time).format('MM/DD')
+                                                                }}</span>
+                                                        </div>
+                                                    </template>
+                                                    <!-- 不可编辑 -->
+                                                    <template v-else>
+                                                        <div class="width-120"><svg-icon
+                                                                icon-class="#icon-biaoqian_wode"
+                                                                class="svgIcon"></svg-icon>{{
+                                                            $getEmployeeMapItem(krItem.owner_id).name }}
+                                                        </div>
+                                                        <div class="width-120">
+                                                            <span>{{ $moment(krItem.end_time).format('MM/DD')
+                                                                }}</span>
+                                                        </div>
+                                                    </template>
+
+                                                    <div class="flex-box-ce width-120"
+                                                        :class="{ cursor: krItem.isOperation }">
+                                                        <template v-if="krItem.process > 100">
+                                                            <el-progress :stroke-width="3"
+                                                                :color="customColorMethod(krItem.risk_level)"
+                                                                :show-text="false" :width="20" type="circle"
+                                                                :percentage="100"></el-progress>
+                                                        </template>
+                                                        <template v-else>
+                                                            <el-progress :stroke-width="3"
+                                                                :color="customColorMethod(krItem.risk_level)"
+                                                                :show-text="false" :width="20" type="circle"
+                                                                v-if="krItem.process"
+                                                                :percentage="Number(krItem.process)"></el-progress>
+                                                        </template>
+                                                        <span style="padding-left: 5px;">{{ krItem.process
+                                                            }}%</span>
+                                                    </div>
+
+
+                                                </div>
+                                                <!-- 任务部分 -->
+                                                <!-- <template v-if="krItem.isShow"> -->
+                                                <TaskItem :isShow="krItem.isShow" :krId="krItem.id" :isSimpleShow="2"
+                                                    readonly :isParent="true" @confirm="updateTask(krItem)"></TaskItem>
+                                                <!-- </template> -->
+                                            </div>
+                                        </div>
+                                    </CollapseTransition>
+                                </div>
+                            </div>
+                        </template>
+                        <!-- 结束目标 -->
+                        <template v-else>
+                            <div class="flex-box-ce fontColorC">
+                                <img class="jt" src="static/images/jt2.png">
+                                <div class="hoverBlue flex-1" style="margin-left: 16px;">
+                                    <span @click.stop="openDuiQi(2, item)"
+                                        v-if="!item.p_kr && !item.p_objectives"></span>
+                                    <template v-else>
+                                        <template v-if="item.kr_id">
+                                            <span v-if="item.p_kr" @click="openDetail({ id: item.kr_id, type: 2 })">{{
+                                                item.p_kr.name }}</span>
+                                            <span v-else @click.stop="openDuiQi(2, item)"
+                                                style="padding-left: 2rem;">对齐目标</span>
+                                            <span v-else @click.stop="openDuiQi(2, item)">对齐目标</span>
+                                        </template>
+                                        <template v-else-if="item.o_id">
+                                            <span v-if="item.p_objectives"
+                                                @click="openDetail({ id: item.o_id, type: 1 })">{{
+                                                item.p_objectives.name }}</span>
+                                            <span v-else @click.stop="openDuiQi(2, item)">对齐目标</span>
+                                        </template>
+
+                                    </template>
+                                </div>
+                            </div>
+                            <div class="flex-box" style="margin: 10px 0;">
+                                <div class="huan" @click="showTask(item)"><span></span><i
+                                        :class="item.isShow ? 'el-icon-d-arrow-left' : 'el-icon-d-arrow-right'"
+                                        class="blue"
+                                        style="position: absolute;top: 30px;left: 5px;transform: rotate(90deg);"></i>
+                                </div>
+                                <div class="flex-1" style="padding-left: 10px;">
+                                    <div class="flex-box-ce">
+                                        <div class="flex-box-ce flex-1" style="padding-right: 30px;">
+                                            <div class="hoverBlue flex-1"
+                                                style="font-size: 18px;font-weight:550;color: #141c28;padding-right: 20px;"
+                                                @click="openDetail(item, 1)">{{ item.name }}</div>
+                                            <span style="padding: 2px 6px;background-color: #f1f1f1;"
+                                                class="fontColorC">已结束</span>
+                                        </div>
+                                        <Tooltip preHtml="目标评分">
+                                            <div v-if="item.score >= 0" class="orange-box"
+                                                style="width: 40px;border-radius: 25px;text-align: center;">
+                                                {{ item.score }}</div>
+                                        </Tooltip>
+                                        <div class="fontColorC" style="padding:0 10px;">
+                                            <svg-icon icon-class="#icon-biaoqian_wode" class="svgIcon"></svg-icon>
+                                            {{ $getEmployeeMapItem(item.owner_id).name }}
+                                        </div>
+                                        <div style="position: relative;">
+                                            <Progress :status="item.risk_level" :value="Number(item.process)"
+                                                style="margin-right: 20px;" :cursor="item.isOperation"></Progress>
+                                            <div v-if="item.process != item.process_last"
+                                                style="position: absolute;font-size: 13px;">
+                                                <span v-if="item.process > item.process_last" class="green"><i
+                                                        class="el-icon-top"></i>{{
+                                                    item.process_last }}%</span>
+                                                <span v-else class="red"><i class="el-icon-bottom"></i>{{
+                                                    item.process_last }}%</span>
+                                            </div>
+                                        </div>
+
+                                    </div>
+
+                                    <div class="flex-box-ce fontColorC" style="margin: 12px 0;font-size: 13px;">
+                                        <div style="padding: 3px;"><svg-icon icon-class="#icon-biaoqian_wode"
+                                                class="svgIcon"></svg-icon>{{
+                                            getBelongType1(item.belong_type).label
+                                            }}
+                                        </div>
+                                        <div style="margin:0 10px;"><i class="el-icon-alarm-clock"></i><span>{{
+                                                item.year }}年{{ item.dateStr }}</span>
+                                        </div>
+                                        <div v-if="item.os.length > 0" style="margin-left: 20px;"><i
+                                                class="el-icon-upload2"></i>对齐我的: <span class="hoverBlue"
+                                                @click="openDqMyTarget(item)">{{ item.os.length }}项目标</span></div>
+                                        <div class="flex-1"></div>
+                                        <div class="flex-box-ce fontColorB" style="padding-right:20px">
+                                            <span class="width-120" style="padding-left:6px">负责人</span>
+                                            <span class="width-120">截止时间</span>
+                                            <span class="width-120">完成度</span>
+                                        </div>
+                                    </div>
+
+                                    <CollapseTransition>
+                                        <div v-show="item.isShow"
+                                            style="padding-left: 30px;position: relative;left: -30px;width: calc(100% + 30px);">
+                                            <div class="fontColorC" v-for="(krItem, index2) in item.krs" :key="index2">
+                                                <div class="flex-box-ce kr-item">
+                                                    <i v-if="krItem.statistics.plan_total > 0" class="caret"
+                                                        :class="krItem.isShow ? 'el-icon-caret-bottom' : 'el-icon-caret-right'"
+                                                        @click="showTask(krItem)"></i>
+                                                    <span class="okr-index cursor" @click="openDetail(krItem, 2)">KR{{
+                                                        index2 + 1 }}</span>
+                                                    <div class="flex-1" style="padding-right: 30px;"><span
+                                                            class="clamp2 hoverBlue" @click="openDetail(krItem, 2)">{{
+                                                            krItem.name }}</span></div>
+                                                    <div class="width-120" style="padding: 3px;">
+                                                        <svg-icon icon-class="#icon-biaoqian_wode"
+                                                            class="svgIcon"></svg-icon>{{
+                                                        $getEmployeeMapItem(krItem.owner_id).name }}
+                                                    </div>
+                                                    <div class="width-120">
+                                                        <span>{{ $moment(krItem.end_time).format('MM/DD') }}</span>
+                                                    </div>
+                                                    <div class="flex-box-ce width-120">
+                                                        <template v-if="krItem.process > 100">
+                                                            <el-progress :stroke-width="3" :show-text="false"
+                                                                :width="20" type="circle"
+                                                                :percentage="100"></el-progress>
+                                                        </template>
+                                                        <template v-else>
+                                                            <el-progress :stroke-width="3" :show-text="false"
+                                                                :width="20" type="circle" v-if="krItem.process"
+                                                                :percentage="Number(krItem.process)"></el-progress>
+                                                        </template>
+                                                        <span style="padding-left: 5px;">{{ krItem.process
+                                                            }}%</span>
+                                                    </div>
+                                                    <div style="width: 20px;height: 20px;"></div>
+                                                </div>
+
+                                                <TaskItem :isShow="krItem.isShow" :isShowBinding="true"
+                                                    :krId="krItem.id" :isParent="true">
+                                                </TaskItem>
+                                            </div>
+                                        </div>
+                                    </CollapseTransition>
+
+                                </div>
+                            </div>
+                        </template>
+                    </div>
+                    <div style="text-align: center; background-color: #fff;padding:10px 0;border-radius: 10px;">
+                        <el-pagination layout="total,prev,pager,next,sizes" :current-page.sync="page" :total="total"
+                            @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                            :page-sizes="[10, 20, 50, 100]" :page-size="page_size"></el-pagination>
+                    </div>
+                </template>
+
+                <div class="flex-box-v flex-center-center" v-else
+                    style="width: 60%; margin: 0 auto; padding: 26px 35px;background-color: #fff;border: 1px solid #e8e8e8;border-radius: 4px;height: 400px;">
+                    <img src="static/images/invite_new_company.png"
+                        style="width: 200px;height: 200px;margin-bottom: 10px;" />
+                    <div class="fontColorB">没有找到关联的OKR</div>
+                </div>
+
+            </div>
+            <div slot="footer">
+                <el-button @click="close">取 消</el-button>
+                <el-button type="primary" @click="close">确 定</el-button>
+            </div>
+        </el-dialog>
+        <!-- 目标详情 -->
+        <TargetDetail v-if="isShowTargetDetail" :type="showDetailType" :id="showDetailId" readonly
+            :showDrawer.sync="isShowTargetDetail" @confirm="getTargetDateil(o_id, true)"></TargetDetail>
+    </div>
+</template>
+
+<script>
+import TargetDetail from '@/okr/components/public/TargetDetail'; //目标详情
+import Tooltip from '@/components/Tooltip'; //鼠标悬浮显示文字
+import Progress from '@/okr/components/public/Progress'; //进度条
+import TargetType from '@/okr/components/public/TargetType'; //目标类型
+import CollapseTransition from '@/okr/utils/collapse-transition';
+import TaskItem from '@/okr/components/public/TaskItem'; //任务内容
+import InputBox from '@/okr/components/public/InputBox'; //input组件
+import { getBelongType, getYearArr, getDateStr } from '@/okr/utils/auth';
+import { _debounce } from '@/utils/auth';
+
+export default {
+    components: {
+        TargetDetail,
+        Tooltip,
+        Progress,
+        TargetType,
+        CollapseTransition,
+        TaskItem,
+        InputBox
+    },
+    props: {
+        dialogVisible: {
+            type: Boolean,
+            default: false
+        },
+        ids: {
+            type: Array,
+            default: () => []
+        }
+    },
+    data() {
+        return {
+            showDetailId: 0,//打开详情的ID
+            showDetailType: 1,//打开详情的类型
+            yearArr: getYearArr(),
+            total: 0,
+            options: [
+                { name: '全部周期', id: 1, cycle_type: 0, value: 1, code: 'year' },
+                { name: '年度', id: 1, cycle_type: 1, value: 2, code: 'year' },
+                { name: '上半年', id: 1, cycle_type: 3, value: 3, code: 'half_year' },
+                { name: '下半年', id: 2, cycle_type: 3, value: 4, code: 'half_year' },
+                { name: '第一季度', id: 1, cycle_type: 2, value: 5, code: 'quarter' },
+                { name: '第二季度', id: 2, cycle_type: 2, value: 6, code: 'quarter' },
+                { name: '第三季度', id: 3, cycle_type: 2, value: 7, code: 'quarter' },
+                { name: '第四季度', id: 4, cycle_type: 2, value: 8, code: 'quarter' },
+                { name: '1月', id: 1, cycle_type: 4, value: 9, code: 'month' },
+                { name: '2月', id: 2, cycle_type: 4, value: 10, code: 'month' },
+                { name: '3月', id: 3, cycle_type: 4, value: 11, code: 'month' },
+                { name: '4月', id: 4, cycle_type: 4, value: 12, code: 'month' },
+                { name: '5月', id: 5, cycle_type: 4, value: 13, code: 'month' },
+                { name: '6月', id: 6, cycle_type: 4, value: 14, code: 'month' },
+                { name: '7月', id: 7, cycle_type: 4, value: 15, code: 'month' },
+                { name: '8月', id: 8, cycle_type: 4, value: 16, code: 'month' },
+                { name: '9月', id: 9, cycle_type: 4, value: 17, code: 'month' },
+                { name: '10月', id: 10, cycle_type: 4, value: 18, code: 'month' },
+                { name: '11月', id: 11, cycle_type: 4, value: 19, code: 'month' },
+                { name: '12月', id: 12, cycle_type: 4, value: 20, code: 'month' }
+            ],
+            page: 1,
+            page_size: 10,
+            dataId: 1,
+            key_word: "",
+            belong_type: 0,
+            year: Number(this.$moment().format('YYYY')),
+            owner_id: "",
+            searchForm: {
+                page: 1,
+                page_size: 10,
+                belong_type: 0,
+                quarter: 0,
+                owner_id: "",
+                half_year: 0,
+                month: 0,
+                sort_ct: 2,
+                ids: JSON.stringify(this.ids),
+                composite_states: "1,2,3,4,5"
+            },
+            getBelongType1: getBelongType,
+            getBelongType2: getBelongType(false, true),
+            employeeMap: this.$getEmployeeMap(),
+            okrList: [],
+            isShowTargetDetail: false
+        }
+    },
+    created() {
+        this.getTargetList();
+        this.getUnitList();
+    },
+    watch: {
+
+        key_word: {
+            deep: true,
+            handler: _debounce(function (val) {
+                this.page = 1;
+                this.getTargetList();
+            })
+        },
+
+        dataId(val) {
+            this.getTargetList();
+        },
+        belong_type(val) {
+            this.getTargetList();
+        },
+        year(val) {
+            this.getTargetList();
+        },
+        owner_id(val) {
+            this.getTargetList();
+        },
+    },
+    methods: {
+        openDuiQi(type, data) {},
+        getUnitList() {
+            this.$axiosUser('get', '/api/pro/okr/public/kr/unit_list').then(res => {
+                let data = res.data.data;
+                data.reverse()
+                this.$setCache('unitList', data)
+            })
+        },
+        getTargetList() {
+            let params = {
+                page: 1,
+                page_size: this.page_size,
+                owner_id: this.owner_id,
+                belong_type: this.belong_type,
+                cycle_type: 0,
+                year: this.year,
+                quarter: 0,
+                half_year: 0,
+                month: 0,
+                ids: JSON.stringify(this.ids),
+                composite_states: '1,2,3,4,5',
+                sort_ct: 2,
+            };
+
+            if (this.key_word) {
+                params.key_word = this.key_word
+            }
+            if (this.dataId > 2) {
+                let dateParameter = this.options.filter(item => {
+                    return item.value == this.dataId
+                })
+                dateParameter = dateParameter[0]
+                params.cycle_type = dateParameter.cycle_type
+                params[dateParameter.code] = dateParameter.id
+            } else if (this.dataId == 2) {
+                params.cycle_type = 1
+            }
+
+            this.$axiosUser('get', '/api/pro/okr/public/obj/list', params).then(res => {
+                if (res.data.code == 1) {
+                    this.okrList = res.data.data.list;
+                    this.total = this.okrList.length;
+                    if (this.okrList && this.okrList.length > 0) {
+                        this.okrList.forEach(item => {
+                            item.isShow = false;
+                            if (item.krs.length > 0) {
+                                item.krs.forEach(e => {
+                                    e.isShow = false;
+                                })
+                            }
+                        })
+                    }
+                    console.log(this.okrList)
+                }
+            });
+        },
+        updateTask(item) { },
+        close() {
+            this.$emit("close")
+        },
+        showTask(item) {
+            item.isShow = !item.isShow;
+            this.$forceUpdate();
+        },
+        customColorMethod(index) {
+            if (index == 1) {
+                return '#2879ff';
+            } else if (index == 2) {
+                return '#FF9600';
+            } else {
+                return '#F16060';
+            }
+        },
+        updateTargetType() { },
+        openDetail(item, type) {
+            if (type) {
+                this.showDetailType = type;//打开详情的类型
+            } else {
+                this.showDetailType = item.type
+            }
+            this.o_id = type == 2 ? item.o_id : item.id;
+            this.showDetailId = item.id;//打开详情的ID
+            this.isShowTargetDetail = true;
+        },
+        //动态更新目标详情
+        getTargetDateil(targetId, isShowText) {
+            let id = targetId ? targetId : this.selectAlignItem.id
+            this.$axiosUser('get', '/api/pro/okr/public/obj/list', { page: 1, page_size: 1, ids: JSON.stringify([id]) }).then(res => {
+                let data = res.data.data.list[0] || '';
+                if (data) {
+                    if (this.targetList && this.targetList.length > 0) {
+                        this.targetList.some((item, index) => {
+                            if (item.id == id) {
+                                data.isShow = this.targetList[index].isShow
+                                data.isShowSelectPeriod = false;
+                                data.dateStr = getDateStr(data)
+                                data.owner_userInfo = this.$getEmployeeMapItem(data.owner_id);
+                                data.isOperation = getOperation(data.publisher_id, data.owner_id);
+                                if (data.krs.length > 0) {
+                                    data.krs.forEach(e => {
+                                        e.isOperation = getOperation(e.publisher_id, e.owner_id);
+                                    })
+                                }
+                                this.targetList[index] = data;
+                                if (!isShowText) {
+                                    this.$message.success('操作成功')
+                                }
+                                this.$forceUpdate();
+                                return true
+                            }
+                        })
+                    }
+                }
+            })
+        },
+        handleSizeChange(val) {
+            this.page = 1;
+            this.page_size = val;
+            this.getTargetList();
+        },
+        // 页面跳转
+        handleCurrentChange(val) {
+            this.page = val;
+            this.getTargetList(true);
+        },
+    }
+}
+</script>
+
+<style scoped lang="scss">
+.el-dialog {
+    ::v-deep .el-dialog__header {
+        width: 80% !important;
+    }
+}
+
+.width-120 {
+    width: 100px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+
+.selectUser ::v-deep input {
+    border-radius: 20px;
+}
+
+.user-item {
+    padding: 4px 6px;
+    border-radius: 5px;
+    cursor: pointer;
+}
+
+.userActive {
+    background-color: #ecf5ff;
+    color: #409EFF;
+}
+
+.span-item span {
+    font-size: 14px;
+    padding: 8px 20px;
+    border-bottom: 2px solid #f1f1f1;
+    // border-radius: 3px;
+    color: #89919f;
+    cursor: pointer;
+}
+
+.spanActive {
+    border-bottom: 2px solid #409EFF !important;
+    color: #409EFF !important;
+}
+
+.okrs-box {
+    padding: 10px 0;
+    border-bottom: 1px solid #f1f1f1;
+    cursor: pointer;
+}
+
+.okrs-box:hover {
+    background-color: #f4f6f9;
+}
+
+.message-items {
+    margin-top: 10px;
+    font-size: 12px;
+}
+
+.message-items div {
+    margin-right: 20px;
+    cursor: pointer;
+}
+
+.message-items i {
+    padding-right: 5px;
+}
+
+.weight {
+    width: 90px;
+    margin-right: 5px;
+    padding: 5px;
+    border: 1px dotted #fff;
+    border-radius: 5px;
+    cursor: pointer;
+}
+
+.weight:hover {
+    border: 1px dotted #ccc;
+}
+
+.weight span {
+    display: inline-block;
+    width: 50px;
+    text-align: center;
+    color: #e6a23c;
+}
+
+.kr-item {
+    padding: 4px 0;
+    position: relative;
+    margin-bottom: 8px;
+    border-radius: 5px;
+}
+
+.kr-item:hover {
+    background-color: #f4f6f9;
+}
+
+.huan {
+    position: relative;
+    width: 24px;
+    height: 24px;
+    border-radius: 100%;
+    background-color: #E9F1FE;
+    box-sizing: border-box;
+    margin: 0 3px;
+    text-align: center;
+    line-height: 25px;
+}
+
+.huan span {
+    border: 2px solid #409EFF;
+    border-radius: 100%;
+    width: 12px;
+    height: 12px;
+    display: inline-block;
+}
+
+.add-task-title {
+    padding: 10px;
+    position: relative;
+}
+
+.add-task-title::after {
+    content: "";
+    position: absolute;
+    width: 4px;
+    height: 14px;
+    border-radius: 5px;
+    background-color: #409EFF;
+    left: 0;
+    top: 13px;
+}
+
+.inputDc {
+    position: absolute;
+    top: 0;
+    right: 0;
+    left: 0;
+    bottom: 0;
+    z-index: 9;
+    cursor: pointer;
+}
+
+.el-icon-more {
+    width: 20px;
+    height: 20px;
+    box-sizing: border-box;
+    text-align: center;
+    line-height: 20px;
+    cursor: pointer;
+}
+
+.el-icon-more:hover {
+    background-color: #606266;
+    border-radius: 25px;
+    color: #fff;
+}
+
+.border {
+    -webkit-appearance: none;
+    background-color: #fff;
+    background-image: none;
+    border-radius: 4px;
+    border: 1px solid #dcdfe6;
+    -webkit-box-sizing: border-box;
+    box-sizing: border-box;
+    color: #C0C4CF;
+    font-size: inherit;
+    height: auto;
+    outline: 0;
+    padding: 0 15px;
+    padding-right: 10px;
+    line-height: 34px;
+    width: 270px;
+    position: relative;
+    cursor: pointer;
+}
+
+.border .font-flex-word {
+    color: #606266;
+}
+
+.border:hover {
+    border: 1px solid #c0c4cc;
+}
+
+.add-task-item {
+    position: relative;
+}
+
+.add-task-item:hover i {
+    cursor: pointer;
+    opacity: 1 !important;
+}
+
+.add-task {
+    // padding-left: 30px;
+}
+
+.oBox {
+    box-shadow: 0 0px 10px #F0F4FA;
+    border-radius: 3px;
+    padding: 5px 8px;
+}
+
+.add-task ::v-deep input {
+    border: none;
+    padding-right: 80px;
+}
+
+.oBox ::v-deep input {
+    border: none;
+    font-size: 18px;
+    font-weight: 600;
+    color: #141c28;
+    padding-right: 80px;
+}
+
+.oBox ::v-deep input::-webkit-input-placeholder {
+    font-weight: 500;
+}
+
+.edit {
+    display: none;
+    position: relative;
+    top: 1px;
+    padding-left: 5px;
+    transition: all .3s;
+}
+
+.edit:hover {
+    color: #409EFF !important;
+}
+
+.selectBox {
+    background-color: #fff;
+    border-radius: 25px;
+    padding: 10px 20px;
+}
+
+.header {
+    margin-bottom: 10px;
+    border-radius: 10px;
+    padding: 10px;
+    background-color: #fff;
+}
+
+.caret {
+    position: absolute;
+    width: 30px;
+    height: 30px;
+    text-align: center;
+    line-height: 30px;
+    left: -30px;
+    top: 50%;
+    margin-top: -15px;
+    box-sizing: border-box;
+    cursor: pointer;
+}
+
+.jt {
+    width: 24px;
+    position: relative;
+    top: 2px;
+    left: 4px;
+    transform: rotateY(180deg);
+    margin-left: 0px;
+}
+
+.title {
+    width: 60%;
+    margin: 0 auto 20px auto;
+    height: 50px;
+    line-height: 50px;
+    border-bottom: 1px solid #dcdfe6;
+    text-align: center;
+    font-size: 20px;
+    font-weight: 600;
+}
+
+.itemBox {
+    width: 60%;
+    padding: 20px;
+    border-radius: 10px;
+    background-color: #fff;
+    margin: 0 auto 20px auto;
+    box-shadow: 0 2px 12px #EBF0F6;
+}
+
+::v-deep .el-tabs__item {
+    color: #89919f;
+}
+
+::v-deep .is-active {
+    color: #409EFF;
+    font-weight: 600;
+}
+
+::v-deep .el-tabs__nav .is-active {
+    font-size: 16px;
+}
+
+::v-deep .el-tabs__header {
+    margin: 0px;
+}
+
+
+
+.select {
+    margin-right: 6px;
+}
+
+.select ::v-deep .el-input__inner {
+    border-radius: 25px;
+}
+
+.input ::v-deep .el-input__inner {
+    border: none;
+    border-bottom: 1px solid #f1f1f1;
+    border-radius: 0px;
+}
+</style>

+ 497 - 0
src/performance/views/assessManagement/TargetSearch.vue

@@ -0,0 +1,497 @@
+<template>
+  <el-dialog :title="title" width="50%" :visible.sync="visible_" :close-on-click-modal="false"
+    :before-close="close_before" append-to-body @open="openDialog" show-close>
+    <el-tabs v-model="activeName">
+      <el-tab-pane label="关联OKR" name="okr">
+        <div class="flex-box-ce" style=" margin: 20px 0; justify-content: space-around;">
+          <el-select class="select" style="width: 120px;" size="small" v-model="year" placeholder="年份">
+            <el-option v-for="item in yearArr" :key="item.value" :label="item.label" :value="item.value"></el-option>
+          </el-select>
+          <el-select class="select" style="width: 120px;" size="small" v-model="dataId" placeholder="周期">
+            <el-option v-for="item in options" :key="item.value" :label="item.name" :value="item.value"></el-option>
+          </el-select>
+          <el-select class="select" style="width: 120px;" size="small" v-model="belong_type" placeholder="类型">
+            <el-option v-for="item in getBelongType" :key="item.value" :label="item.label"
+              :value="item.value"></el-option>
+          </el-select>
+          <el-select class="select" style="width: 200px;" filterable size="small" v-model="owner_id" clearable
+            placeholder="负责人">
+            <el-option v-for="item in employeeMap" :key="item.id" :label="item.name" :value="item.id"></el-option>
+          </el-select>
+          <el-input class="input" style="width: 260px;" maxlength="10" show-word-limit size="small" v-model="key_word"
+            clearable placeholder="请输入关键字" />
+        </div>
+        <div style="display: flex; align-items: center; justify-content: space-between;">
+          <div style="flex: 1; margin-right: 20px; height: 500px; overflow-y: scroll;" class="scroll-bar">
+            <el-collapse v-model="activeNames">
+              <el-collapse-item v-for="(item, index) in targetList" :key="index" :name='item.id'
+                :class="{ items: showType == 1 }">
+                <template slot="title">
+                  <el-checkbox-group v-model="checkList">
+                    <el-checkbox :label="item.id" :value="item.id" @change="handleCheckboxChange(item.id, item.name)">
+                      <div class="flex-box-ce">
+                        <div class="date">{{ item.dateStr }}</div>
+                        <Tooltip :preHtml="item.name">
+                          <span class="flex-1"
+                            style="display: inline-block; width: 350px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">{{
+                            item.name }}</span>
+                        </Tooltip>
+                      </div>
+                      <div class="flex-box-ce fontColorC" style="margin: 10px 0 0 20px;">
+                        <div>{{ item.userInfo.name }}</div>
+                        <div class="dateDateil">{{ item.start_time }}~{{ item.end_time }}</div>
+                      </div>
+                    </el-checkbox>
+                  </el-checkbox-group>
+                </template>
+                <div v-loading="loading">
+                  <template v-if="showType != 1">
+                    <div class="flex-box-ce taskItem" v-for="(item2, index2) in item.son_krs" :key="index2"
+                      :style="{ paddingLeft: showType == 2 ? '40px' : '120px' }">
+                      <div class="flex-1">KR{{ index2 + 1 }}:{{ item2.name }}</div>
+                    </div>
+                  </template>
+                </div>
+              </el-collapse-item>
+            </el-collapse>
+            <NoData v-if="targetList.length == 0"></NoData>
+          </div>
+
+          <div v-if="checkList && checkList.length > 0" class="scroll-bar"
+            style="width: 38%; height: 500px; overflow-y: scroll; position: relative; border: 1px solid #ccc; border-radius: 8px; padding: 10px; box-sizing: border-box; margin-bottom: 10px;">
+            <div style="margin-bottom: 10px;">已选: </div>
+            <i class="el-icon-close" style="position: absolute; top: 10px; right: 10px;"
+              @click="clearSelectedData()"></i>
+            <el-tag v-for="item in selectedData" :key="item.id" style="margin: 0 10px 10px 0;" closable
+              @close="handleClose(item)">{{ item.name }}</el-tag>
+          </div>
+        </div>
+
+
+
+        <el-pagination style="text-align: center;margin-top: 20px;" :current-page.sync="page"
+          :page-sizes="[10, 20, 50, 100]" layout="total,prev,pager,next,sizes" :total="total"
+          @size-change="handleSizeChange" @current-change="handleCurrentChange" :page-size="page_size"></el-pagination>
+      </el-tab-pane>
+    </el-tabs>
+
+    <div class="flex-box-ce flex-box-end" style="margin: 15px">
+      <el-button @click="close">取 消</el-button>
+      <el-button type="primary" @click="confirm" :disabled="!(checkList && checkList.length > 0)">确 定</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import CollapseTransition from '@/okr/utils/collapse-transition';
+import {getBelongType,getYearArr,getDateStr} from '@/okr/utils/auth';
+import {_debounce} from '@/utils/auth';
+import Tooltip from '@/components/Tooltip'; //鼠标悬浮显示文字
+export default {
+  props: {
+    title: {
+      // 标题
+      type: String,
+      default: '对齐目标'
+    },
+    showType: {// 0显示O和KR 1显示O 2显示KR
+      type: Number,
+      default: 0,
+    },
+    visible: {
+      // 是否显示组件
+      type: Boolean,
+      default: false
+    },
+    id: {// 默认选中
+      type: Number,
+      default: 0,
+    },
+    isJudge:{  //判断O或者KR的发布者与负责人是否是当前登录者  只有‘目标复盘“用到了
+      type: Boolean,
+      default: false
+    },
+    isFinish:{ //是否显示已结束的目标
+      type: Boolean,
+      default: false
+    },
+    isOwner:{ //负责人是否默认选中自己
+      type: Boolean,
+      default: false
+    },
+    showSelectType: {// 1只能关联OKR  2能关联项目  3两个都可以
+      type: Number,
+      default: 1,
+    },
+  },
+  components:{CollapseTransition,Tooltip},
+  name: 'TargetSearch',
+  data() {
+    return {
+      page:1,
+      page_size:10,
+      total:0,
+      visible_: false,
+      loading:false,
+      key_word:'',
+      yearArr:getYearArr(),
+      year: Number(this.$moment().format('YYYY')),
+      getBelongType: getBelongType(false,true),
+      belong_type:0,
+      owner_id:'',
+      employeeMap: this.$getEmployeeMap(),
+      options: [
+        { name: '全部周期', id: 1, cycle_type:0,value:1,code:'year' },
+        { name: '年度', id: 1, cycle_type: 1,value:2,code:'year' },
+        { name: '上半年', id: 1, cycle_type: 3,value:3,code:'half_year' },
+        { name: '下半年', id: 2, cycle_type: 3,value:4,code:'half_year' },
+        { name: '第一季度', id: 1, cycle_type: 2,value:5,code:'quarter' },
+        { name: '第二季度', id: 2, cycle_type: 2,value:6,code:'quarter' },
+        { name: '第三季度', id: 3, cycle_type: 2,value:7,code:'quarter' },
+        { name: '第四季度', id: 4, cycle_type: 2,value:8,code:'quarter' },
+        { name: '1月', id: 1, cycle_type: 4,value:9,code:'month' },
+        { name: '2月', id: 2, cycle_type: 4,value:10,code:'month' },
+        { name: '3月', id: 3, cycle_type: 4,value:11,code:'month'},
+        { name: '4月', id: 4, cycle_type: 4,value:12,code:'month' },
+        { name: '5月', id: 5, cycle_type: 4,value:13,code:'month' },
+        { name: '6月', id: 6, cycle_type: 4,value:14,code:'month' },
+        { name: '7月', id: 7, cycle_type: 4,value:15,code:'month' },
+        { name: '8月', id: 8, cycle_type: 4,value:16,code:'month' },
+        { name: '9月', id: 9, cycle_type: 4,value:17,code:'month' },
+        { name: '10月', id: 10, cycle_type: 4,value:18,code:'month' },
+        { name: '11月', id: 11, cycle_type: 4,value:19,code:'month' },
+        { name: '12月', id: 12, cycle_type: 4,value:20,code:'month' }
+      ],
+      dataId: 1,
+      targetList:[],
+      selectId:'',//选择对齐的ID
+      selectItme:{},
+      activeNames:[],
+      activeNames2:[],
+      type:1,
+      activeName:'okr',
+      statusArr: [
+        {value: 0,label: '全部状态'},
+        {value: 1,label: '未开始'},
+        {value: 2,label: '进行中'},
+        {value: 3,label: '已逾期'},
+        {value: 4,label: '已完成'},
+      ],
+      userType: 0,
+      checkList: [],
+      selectedData: []
+    };
+  },
+  watch: {
+    key_word: {
+      deep: true,
+      handler: _debounce(function(val) {
+        this.page = 1;
+        this.getTargetList();
+      })
+    },
+    
+    dataId(val){
+      this.getTargetList();
+    },
+    belong_type(val){
+      this.getTargetList();
+    },
+    year(val){
+      this.getTargetList();
+    },
+    owner_id(val){
+      this.getTargetList();
+    },
+    visible(val) {
+      this.visible_ = JSON.parse(JSON.stringify(val));
+      if(val && this.showType == 2){
+          this.owner_id=this.$userInfo().id;
+      }
+      if(this.showSelectType == 2){
+        this.activeName='project';
+      }else{
+        this.activeName='okr';
+      }
+    },
+    
+
+  },
+  created() {
+    let userInfo=this.$userInfo();
+    if(this.isOwner && !userInfo.is_okr_manager){
+       this.owner_id = userInfo.id
+    }
+    
+  },
+  methods: {
+    clearSelectedData() {
+      this.selectedData = [];
+      this.checkList = [];
+    },
+    handleClose(item) {
+      this.selectedData = this.selectedData.filter(select => item.id !== select.id)
+      this.checkList = this.checkList.filter(check => item.id !== check)
+      console.log(this.checkList );
+    },
+    handleCheckboxChange(id, name) {
+      let obj = {};
+      obj.id = id;
+      obj.name = name;
+      if (this.selectedData.find(item => item.id == id)) {
+        this.selectedData = this.selectedData.filter(item => item.id !== obj.id);
+      } else {
+        this.selectedData.push(obj)
+      }
+    },
+    openM(e){
+      if(e&&e.length>0){
+        let is=true;
+        this.projectList.forEach(item=>{
+          if(item.id==e[e.length-1]&&item.statistics.milestone_total==0){
+            is=false;
+          }
+          if(item.id==e[e.length-1]&&item.tasks&&item.tasks.length>0){
+            is=false;
+          }
+        })
+        if(is){
+          this.getMilestoneList(e[e.length-1])
+        }
+      }
+    },
+
+    getMilestoneList(id){
+      this.$axiosUser('get', '/api/pro/okr/project/milestones',{project_id:id}).then(res => {
+          let milestones=res.data.data.milestones;
+          milestones.forEach(item=>{
+            item.type=5;
+          })
+          this.projectList.forEach(item=>{
+            if(item.id==id){
+              item.tasks=milestones;
+            }
+          })
+          this.activeNames2=JSON.parse(JSON.stringify(this.activeNames2))
+      })
+    },
+
+    
+    handleSizeChange(val) {
+      this.page=1;
+      this.page_size = val;
+      this.getTargetList();
+    },
+    // 页面跳转
+    handleCurrentChange(val) {
+      this.page = val;
+      this.getTargetList(true);
+    },
+    handleSizeChange2(val) {
+      this.page2=1;
+      this.page_size2 = val;
+      this.getProjectList();
+    },
+    // 页面跳转
+    handleCurrentChange2(val) {
+      this.page2 = val;
+      this.getProjectList(true);
+    },
+    handleChange(e){
+      if(e){
+        let obj={};
+        this.targetList.some(item=>{
+          if(item.id==e){
+            item.krs.length==0? obj=item:obj=false
+            return true
+          }
+        })
+        if(!obj){return false }
+        this.loading=true;
+        this.$axiosUser('get', '/api/pro/okr/obj/sub/list', {o_id:e}).then(res => {
+          let krs=res.data.data.krs;
+          obj.krs=krs
+        }).finally(()=>{
+           this.loading=false;
+        })
+      }
+    },
+    activeId(item, type){
+      if(item.id == this.selectId && item.type == this.type){
+        this.selectItme={};
+        this.selectId='';
+        this.type='';
+      }else{
+        this.selectItme=item;
+        this.selectId=item.id;
+        this.type=item.type;
+      }
+    },
+    //打开Dialog的回调,用刷每次打开都初始化selected
+    openDialog() {
+     if(this.id){
+       this.selectId = this.id
+       this.type = 1;
+     }else{
+       this.selectId=''
+     }
+      this.selectItme={},
+      this.getTargetList();
+    },
+    //目标列表
+    getTargetList(is) {
+      is ? '':this.page=1;
+      let params = {
+        page: is? this.page:1,
+        page_size: this.page_size,
+        owner_id: this.owner_id,
+        belong_type: this.belong_type,
+        cycle_type:0,
+        year:this.year,
+        quarter:0,
+        half_year:0,
+        month:0,
+        composite_states:'1,2,3,4,5',
+        sort_ct: 2,
+      };
+      if(this.isFinish){
+        params.composite_states='1,2,3,4,5,6';
+      }
+      if(this.key_word){
+        params.key_word = this.key_word
+      }
+      if(this.dataId > 2){
+        let dateParameter = this.options.filter(item=>{
+          return item.value == this.dataId
+        })
+        dateParameter = dateParameter[0]
+        params.cycle_type = dateParameter.cycle_type
+        params[dateParameter.code]=dateParameter.id
+      }else if(this.dataId==2){
+        params.cycle_type = 1
+      } 
+      this.selectItme={};
+      this.$axiosUser('get', '/api/pro/okr/public/obj/search', params).then(res => {
+        if (res.data.code == 1) {
+          let list=res.data.data.list
+          list.forEach((item,index)=>{
+            index==0? this.activeNames=[item.id]:'';
+            item.isShow=false;
+            item.userInfo=this.$getEmployeeMapItem(item.owner_id);
+            item.dateStr=getDateStr(item);
+            item.type=1
+            if (item.son_krs.length>0){
+              item.son_krs.forEach((e)=>{
+                e.type = 2
+              })
+            }
+          })
+          this.targetList = list;
+          console.log(this.tartgetList);
+          this.total = res.data.data.total;
+        }
+    	})
+    },
+    close_before(done) {
+      this.close();
+      done();
+    },
+    //关闭||清空数据
+    close() {
+      this.checkList = [];
+      this.selectedData = [];
+      this.$emit('update:visible', false);
+    },
+    // 确定
+    confirm() {
+      this.$emit('confirm', this.checkList);
+      this.close();
+    }
+  }
+};
+</script>
+
+<style scoped lang="scss">
+ ::v-deep .el-tabs__nav .is-active {
+      font-size: 16px;
+      font-weight: 600;
+  }
+::v-deep .el-dialog__header{
+  display: none !important;
+}
+.items ::v-deep .el-collapse-item__arrow{
+  display: none !important;
+}
+.dateDateil{
+  border-left:1px solid #f1f1f1;
+  border-right:1px solid #f1f1f1;
+  padding: 0 10px;
+  margin: 0 10px;
+}
+.taskItem{
+  padding: 10px 0;
+  border-top: 1px dotted #f1f1f1;
+  padding-left: 120px;
+}
+.date{
+  width: 80px;
+  background-color: #EDF1FF;
+  color: #409EFF;
+  text-align: center;
+  box-sizing: border-box;
+  border-radius: 25px;
+  margin: 0 10px;
+  line-height: 20px;
+}
+.radio{
+  width: 18px;
+  height: 18px;
+  border-radius: 100%;
+  border: 1px solid #CBCED2;
+  box-sizing: border-box;
+  position: relative;
+  cursor: pointer;
+}
+.radio-active{
+  border: 1px solid #409EFF;
+}
+.radio-active::after{
+  content: "";
+  position: absolute;
+  width: 10px;
+  height: 10px;
+  border-radius: 100%;
+  background-color: #409EFF;
+  left: 50%;
+  top: 50%;
+  margin-left: -5px;
+  margin-top: -5px;
+}
+::v-deep .el-collapse-item__header{
+  padding: 10px;
+  height: auto;
+  line-height: normal;
+}
+::v-deep .el-collapse-item__content{
+  padding: 0;
+}
+
+
+::v-deep .el-dialog__body {
+  padding: 10px 20px;
+  min-height: 630px;
+}
+.select{
+  width: 100px;
+  margin-right: 6px;
+}
+.select ::v-deep .el-input__inner{
+  // border: none;
+  border-radius: 25px;
+}
+.input ::v-deep .el-input__inner{
+  border: none;
+  border-bottom: 1px dotted #DCDFE6;
+  border-radius: 0px;
+}
+</style>

+ 216 - 213
src/performance/views/assessManagement/assessDetails.vue

@@ -1,32 +1,22 @@
 <template>
   <div class="all boxMinHeight">
-    <PageHead :routePush="pushAssMan">
-      <template slot="headMent">
-        <div class="flex-box-ce">
-          <el-cascader
-            v-model="headValue"
-            :options="options"
-            :props="props"
-            :show-all-levels="false"
-          ></el-cascader>
-<!--          <el-cascader
-            v-model="headValue"
-            :options="options"
-            :show-all-levels="false"
-            :props="{
-              expandTrigger: 'hover',
-              label: 'name',
-              value: 'id',
-              children: 'list'
-            }"
-          ></el-cascader> -->
-          <img v-if="all_finish" src="static/images/guidang.png" class="guidang" />
-        </div>
-      </template>
-    </PageHead>
+
+
+    <!-- 头部筛选条件,按钮组,流程节点 -->
     <header>
-      <div class="flex-box flex-d-center" v-loading="isLoad">
-        <div class="flex-box">
+      <div class="flex-box " v-loading="isLoad">
+        <PageHead :routePush="pushAssMan">
+          <template slot="headMent">
+            <div class="flex-box-ce">
+              <el-cascader v-model="headValue" :options="options" :props="props" :show-all-levels="false"
+                style="width: 300px;"></el-cascader>
+              <img v-if="all_finish" src="static/images/guidang.png" class="guidang" />
+            </div>
+          </template>
+        </PageHead>
+
+        <div class="flex-box" style="margin-left: 20px;">
+          <!-- 选择部门下拉框 -->
           <div class="dept_wdiv">
             <div class="dept_inp" @click="show_dept_selector = true">
               <span v-if="deptVisibleName != ''">{{ deptVisibleName }}</span>
@@ -34,58 +24,68 @@
             </div>
             <i class="el-icon-arrow-down"></i>
           </div>
-          <EmployeeSelector
-            :title="'选择部门'"
-            :isChecKedAll="false"
-            :can_select_employee="false"
-            :can_select_dept="true"
-            :dept_children="false"
-            :selected="dept_selected"
-            :visible.sync="show_dept_selector"
-            @confirm="dept_confirm"
-          />
-          <el-select v-model="groupValue" @change="groupChange" clearable class="margin-l width-300" placeholder="选择考核模板">
+          <EmployeeSelector :title="'选择部门'" :isChecKedAll="false" :can_select_employee="false" :can_select_dept="true"
+            :dept_children="false" :selected="dept_selected" :visible.sync="show_dept_selector"
+            @confirm="dept_confirm" />
+          <!-- 选择部门下拉框 -->
+          <!-- 选择考核模板下拉框 -->
+          <el-select v-model="groupValue" @change="groupChange" clearable class="margin-l width-300"
+            placeholder="选择考核模板">
             <el-option v-for="item in groupOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
           </el-select>
+          <!-- 选择考核模板下拉框 -->
+          <!-- 姓名搜索 -->
           <el-select v-model="employee_ids" multiple filterable clearable class="margin-l" placeholder="姓名搜索">
             <el-option v-for="item in employees" :key="item.id" :label="item.name" :value="item.id"></el-option>
           </el-select>
+          <!-- 姓名搜索 -->
         </div>
-        <div>
-          <template v-if="!all_finish">
-            <el-button v-if="$getRole(1) || $getRole(2)" class="primaryBtn" @click="isManagement = true">人员管理</el-button>
+      </div>
+
+      <!-- 按钮组 -->
+      <div class="flex-box-ce" style="margin-top: 20px;">
+        <template v-if="!all_finish">
+          <el-button-group>
+            <el-button type="primary" icon="el-icon-s-promotion" v-if="$getRole(1) && $isAuthoritys_jx($7)"
+              @click="amhrsponsor">发起考核</el-button>
+            <el-button type="primary" icon="el-icon-s-custom" v-if="$getRole(1) || $getRole(2)"
+              @click="isManagement = true">人员管理</el-button>
             <!-- 主管理员、有【开始评分】权限的子管理员 -->
-            <el-button v-if="$getRole(1) && $isAuthoritys_jx($8)" type="primary" @click="startisChecks">开始评分</el-button>
-            <!-- 主管理员、有【菜单权限】权限的子管理员 -->
-            <el-dropdown v-if="$getRole(1)" style="margin-left:11px;" @command="handleCommand">
-              <el-button>更多</el-button>
-              <el-dropdown-menu slot="dropdown">
-                <el-dropdown-item v-for="(item, index) in dropdownMenu" :key="index" :command="item.key" :divided="item.bordok" v-if="item.isShow">
-                  {{ item.name }}
-                </el-dropdown-item>
-              </el-dropdown-menu>
-            </el-dropdown>
-          </template>
-        </div>
+            <el-button type="primary" icon="el-icon-edit-outline" v-if="$getRole(1) && $isAuthoritys_jx($8)"
+              @click="startisChecks">开始评分</el-button>
+          </el-button-group>
+          <!-- 主管理员、有【菜单权限】权限的子管理员 -->
+          <el-dropdown v-if="$getRole(1)" style="margin-left:11px;" @command="handleCommand">
+            <el-button>更多 <i class="el-icon-arrow-down"></i></el-button>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item v-for="(item, index) in dropdownMenu" :key="index" :command="item.key"
+                :divided="item.bordok" v-if="item.isShow">
+                {{ item.name }}
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </template>
       </div>
+      <!-- 按钮组 -->
+      <div class="navigationL flex-box-ce flex-d-wrap">
 
-      <div class="navigationL flex-box-ce">
-        <div v-for="(item, index) in navigationList" :key="index" class="flex-box-ce" @click="navClick(item)">
+        <div v-for="(item, index) in navigationList" :key="index" class="flex-box-ce" 
+          @click="navClick(item)">
           <template v-if="item.num">
             <el-badge :value="item.num" class="item">
               <span class="flex-box-ce" :class="{ action: navcli == item.id }">
                 <div>{{ item.name }}</div>
                 <div v-if="item.hint">
                   &nbsp;
-                    <el-tooltip class="item" effect="dark" :content="item.hint" placement="top">
-                      <i class="el-icon-warning-outline navsvg1" v-if="item.hint"></i>
-                    </el-tooltip>
+                  <el-tooltip class="item" effect="dark" :content="item.hint" placement="top">
+                    <i class="el-icon-warning-outline navsvg1" v-if="item.hint"></i>
+                  </el-tooltip>
                 </div>
               </span>
             </el-badge>
           </template>
           <span class="flex-box-ce" :class="{ action: navcli == item.id }" v-else>
-            <div>{{ item.name }}</div>
+            <div>{{ index ? index : '' }} {{ item.name }}</div>
             <div v-if="item.hint">
               &nbsp;
               <el-tooltip class="item" effect="dark" :content="item.hint" placement="top">
@@ -94,31 +94,33 @@
             </div>
           </span>
           <div v-if="index == 0" class="navsvg2"></div>
+
           <i v-if="navigationList.length != index + 1 && index != 0" class="el-icon-right navsvg3"></i>
         </div>
       </div>
+
+
       <template v-if="$getRole(1)">
-        <div style="margin: 15px 0;" class="fontColorB" v-if="navcli != 0 && navcli != 3 && navcli != 11">
-          当前“{{ getNode }}”节点人数:{{ total }}人,可联系相关负责“{{ getNode }}"人员推进考核进度
-          <span class="blue" style="cursor: pointer;" @click="isPending = true">查看名单</span>
-        </div>
+        <el-alert type="warning" style="margin-bottom: 15px;" v-if="navcli != 0 && navcli != 3 && navcli != 11"
+          :closable="false">
+          该绩效节点“<span style="font-weight: 600;">{{ getNode }}</span>”
+          参与人员:<span style="font-weight: 600;">{{ total }}</span>人,
+          <!-- 已完成录入<span style="font-weight: 600;">{{ asstabData.length }}</span>人,
+          未完成录入<span style="font-weight: 600;">{{ total - asstabData.length }}</span>人 -->
+          <span class="blue" style="cursor: pointer; margin-left: 10px" @click="isPending = true">查看名单</span>
+        </el-alert>
       </template>
-      <div v-if="navcli==3&&$getRole(1) && $isAuthoritys_jx($8)"><el-button type="primary" @click="pf()">批量开始评分</el-button></div>
+      <div v-if="navcli==3 && $getRole(1) && $isAuthoritys_jx($8)" style="margin-bottom: 15px;">
+        <el-button type="primary" @click="pf()">批量开始评分</el-button>
+      </div>
 
-      <el-table :data="asstabData" v-loading="assDetLoad" @row-click="assDetClick" style="width: 100%" @selection-change="handleSelectionChange">
-        <el-table-column type="selection" width="55" v-if="navcli==3"></el-table-column>
+      <el-table :data="asstabData" v-loading="assDetLoad" @row-click="assDetClick" style="width: 100%"
+        :header-cell-style="{ background: '#ECF5FF' }" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" v-if="navcli == 3"></el-table-column>
         <el-table-column label="姓名">
           <template slot-scope="scope">
-            <userImage
-              class="fl"
-              :id="scope.row.employee_id"
-              style="margin-top: 9px;"
-              :user_name="scope.row.name"
-              :img_url="scope.row.img_url"
-              width="35px"
-              height="35px"
-              fontSize="12px"
-            ></userImage>
+            <userImage class="fl" :id="scope.row.employee_id" style="margin-top: 9px;" :user_name="scope.row.name"
+              :img_url="scope.row.img_url" width="35px" height="35px" fontSize="12px"></userImage>
             <span style="margin-left: 10px; line-height: 50px;">{{ scope.row.name }}</span>
           </template>
         </el-table-column>
@@ -166,25 +168,25 @@
               <el-button type="text" size="medium" @click.stop="theResultsOf1(scope.row,1)">调整考核结果</el-button>
               <el-button type="text" size="medium" @click.stop="theResultsOf1(scope.row,2)">调整绩效等级</el-button>
             </template>
-            <el-button type="text" v-if="navcli==3&&$getRole(1) && $isAuthoritys_jx($8)" size="medium" @click.stop="pf(scope.row)">开始评分</el-button>
+            <el-button type="text" v-if="navcli==3&&$getRole(1) && $isAuthoritys_jx($8)" size="medium"
+              @click.stop="pf(scope.row)">开始评分</el-button>
           </template>
         </el-table-column>
       </el-table>
-      <Pagination
-        :page="asstabParams.page"
-        :page_size="asstabParams.page_size"
-        :total="total"
-        @handleSizeChange="handleSizeChange"
-        @handleCurrentChange="handleCurrentChange"
-      ></Pagination>
+      <Pagination :page="asstabParams.page" :page_size="asstabParams.page_size" :total="total"
+        @handleSizeChange="handleSizeChange" @handleCurrentChange="handleCurrentChange"></Pagination>
     </header>
+    <!-- 头部筛选条件,按钮组 -->
 
     <BrawerBox drawerTitle="请选择开始评分的考核模板" :showDrawer.sync="isChecks">
       <template slot="main">
         <div v-loading="isChecksLoad">
-          <div style="padding-top:10px;"><JxSearch :screen="2" title="搜索考核模板" ref="braSearch" @confirm="braSearch"></JxSearch></div>
+          <div style="padding-top:10px;">
+            <JxSearch :screen="2" title="搜索考核模板" ref="braSearch" @confirm="braSearch"></JxSearch>
+          </div>
           <template v-if="scoreGroup.length > 0">
-            <div class="flex-box-ce li" style="margin-top: 20px;"><el-checkbox class="flex-box-ce" v-model="isAllSelectIndex" label="全选"></el-checkbox></div>
+            <div class="flex-box-ce li" style="margin-top: 20px;"><el-checkbox class="flex-box-ce"
+                v-model="isAllSelectIndex" label="全选"></el-checkbox></div>
             <ul class="ul">
               <li v-for="(item, index) in scoreGroup" :key="index" class="flex-box-ce li">
                 <el-checkbox class="flex-box-ce" style="padding: 0;" :disabled="item.disabled" v-model="item.check">
@@ -210,31 +212,14 @@
       </template>
     </BrawerBox>
     <!-- 导出执行记录 -->
-    <EmployeeSelector
-      :title="'选择人员'"
-      :isChecKedAll="false"
-      :max="20"
-      :isRequired="true"
-      :can_select_employee="true"
-      :can_select_dept="false"
-      :user_employee_list="true"
-      :employee_list="employee_list"
-      :visible.sync="isDerive"
-      @confirm="confirmDerive"
-    />
+    <EmployeeSelector :title="'选择人员'" :isChecKedAll="false" :max="20" :isRequired="true" :can_select_employee="true"
+      :can_select_dept="false" :user_employee_list="true" :employee_list="employee_list" :visible.sync="isDerive"
+      @confirm="confirmDerive" />
 
     <!-- 公式结果 -->
-    <EmployeeSelector
-      :title="'结果公布'"
-      :is_filtration_creator="false"
-      :can_select_employee="true"
-      :can_select_dept="false"
-      :user_employee_list="true"
-      :employee_list="employee_list"
-      :selected="selected"
-      :visible.sync="isResult"
-      @confirm="confirmResult"
-    />
+    <EmployeeSelector :title="'结果公布'" :is_filtration_creator="false" :can_select_employee="true"
+      :can_select_dept="false" :user_employee_list="true" :employee_list="employee_list" :selected="selected"
+      :visible.sync="isResult" @confirm="confirmResult" />
 
     <!-- 更多-管理 -->
     <BrawerBox drawerTitle="人员管理" :showDrawer.sync="isManagement">
@@ -258,41 +243,26 @@
     </BrawerBox>
 
     <!-- 更多-管理-人员选择添加 -->
-    <EmployeeSelector
-      title="添加被考核人员"
-      :is_filtration_creator="false"
-      :can_select_employee="true"
-      :can_select_dept="false"
-      :user_employee_list="true"
-      :isRequired="true"
-      :employee_list="add_employee_list"
-      :visible.sync="isShowUser"
-      @confirm="confirmUser">
-        <template slot="footer">
-          <div style="text-align: center;" class="orange flex-1">*添加成功后,别忘了帮Ta加入【绩效等级配置】喔!*</div>
-        </template>
-      </EmployeeSelector>
+    <EmployeeSelector title="添加被考核人员" :is_filtration_creator="false" :can_select_employee="true"
+      :can_select_dept="false" :user_employee_list="true" :isRequired="true" :employee_list="add_employee_list"
+      :visible.sync="isShowUser" @confirm="confirmUser">
+      <template slot="footer">
+        <div style="text-align: center;" class="orange flex-1">*添加成功后,别忘了帮Ta加入【绩效等级配置】喔!*</div>
+      </template>
+    </EmployeeSelector>
 
     <!-- 更多-管理-人员选择删除 -->
 
-    <EmployeeSelector
-      :title="packageName + ':选择被删除人员'"
-      :is_filtration_creator="false"
-      :can_select_employee="true"
-      :can_select_dept="false"
-      :isRequired="true"
-      :user_employee_list="true"
-      :include_deleted="true"
-      :employee_list="employee_list"
-      :visible.sync="isShowUser2"
-      @confirm="confirmUser2"
-    >
+    <EmployeeSelector :title="packageName + ':选择被删除人员'" :is_filtration_creator="false" :can_select_employee="true"
+      :can_select_dept="false" :isRequired="true" :user_employee_list="true" :include_deleted="true"
+      :employee_list="employee_list" :visible.sync="isShowUser2" @confirm="confirmUser2">
       <template slot="header">
         <div style="text-align: center;" class="orange">*当所有人员都被选中删除时,该周期的绩效考核也会自动删除*</div>
       </template>
     </EmployeeSelector>
 
-    <el-dialog :title="theResults == 1 ? '调整考核结果' : '调整绩效等级'" :visible.sync="comtheResults" width="500px" :close-on-click-modal="false">
+    <el-dialog :title="theResults == 1 ? '调整考核结果' : '调整绩效等级'" :visible.sync="comtheResults" width="500px"
+      :close-on-click-modal="false">
       <div class="">
         <div>
           员工姓名:
@@ -304,7 +274,9 @@
           <br />
           <div class="flex-box">
             <span style="line-height:36px;">新考核结果:</span>
-            <el-input v-model="theResultInp" @input="theResultInp = theResultInp.match(/\d+(\.\d{0,2})?/) ? theResultInp.match(/\d+(\.\d{0,2})?/)[0] : ''" style="width:250px;" placeholder="请输入新考核结果"></el-input>
+            <el-input v-model="theResultInp"
+              @input="theResultInp = theResultInp.match(/\d+(\.\d{0,2})?/) ? theResultInp.match(/\d+(\.\d{0,2})?/)[0] : ''"
+              style="width:250px;" placeholder="请输入新考核结果"></el-input>
           </div>
         </div>
         <div v-else>
@@ -313,7 +285,7 @@
           <div class="flex-box-ce">
             <span>新绩效等级:</span>
             <el-select v-model="level" placeholder="请选择" style="width: 200px;">
-                <el-option v-for="(item,index) in levels" :key="index" :label="item.name" :value="item.name"></el-option>
+              <el-option v-for="(item,index) in levels" :key="index" :label="item.name" :value="item.name"></el-option>
             </el-select>
           </div>
         </div>
@@ -336,7 +308,7 @@
         <el-table-column prop="reason" label="描述"></el-table-column>
       </el-table>
       <span slot="footer" class="dialog-footer" v-if="selectUser.length==showData.length">
-        <el-button type="primary"  @click="isShowData=false">确 定</el-button>
+        <el-button type="primary" @click="isShowData=false">确 定</el-button>
       </span>
     </el-dialog>
 
@@ -344,15 +316,11 @@
     <BrawerBox :drawerTitle="'“' + getNode + '” 相关负责人名单'" :showDrawer.sync="isPending">
       <template slot="main">
         <div>
-          <div
-            class="flex-box-ce"
-            style="border-bottom: 1px solid #f1f1f1;padding: 10px 0;"
-            v-for="(item, index) in pending_employee_list"
-            :key="index"
-            v-if="pending_employee_list.length > 0"
-          >
+          <div class="flex-box-ce" style="border-bottom: 1px solid #f1f1f1;padding: 10px 0;"
+            v-for="(item, index) in pending_employee_list" :key="index" v-if="pending_employee_list.length > 0">
             <div class="flex-box-ce">
-              <userImage style="margin-right: 10px;" :user_name="item.name" :img_url="item.img_url" width="38px" height="38px" fontSize="12px"></userImage>
+              <userImage style="margin-right: 10px;" :user_name="item.name" :img_url="item.img_url" width="38px"
+                height="38px" fontSize="12px"></userImage>
               <span>{{ item.name }}</span>
             </div>
             <div style="margin-left: 10px;" class="flex-1">
@@ -384,9 +352,10 @@ export default {
   name: 'assessDetails',
   data() {
     return {
+      date_remark: '',
       pending_employee_list: [], //待处理人员
       isPending: false,
-      total: 0,
+      total: 0, // 当前节点考核总人数
       nowass: false, //已开始评分显示隐藏
       pushAssMan: null, //头部跳转
       assDetLoad: false, //loading
@@ -408,9 +377,10 @@ export default {
       scoreGroup: [], //评分考核模板
       isAllSelectIndex: false,
       GroupList: [], //评分考核模板备份搜索数据
+      // 流程节点
       navigationList: [
         //导航
-        { id: 0, name: '参与人数', num: 0 },
+        { id: 0, name: '考核周期: ', num: 0 },
         { id: 1, name: '目标制定', num: 0 },
         { id: 2, name: '目标确认', num: 0 },
         {
@@ -424,11 +394,12 @@ export default {
         { id: 9, name: '审批', num: 0 },
         { id: 11, name: '结束', num: 0 }
       ],
-      navcli: 0, //导航当前选中
+      navcli: 0, // 导航当前选中
       svaeNavcli: 0, //保存的选中
+      // 头部筛选条件
       asstabParams: {
         package_id: 0, //考核包id
-        dept_ids: [], //部门id
+        dept_ids: [], //部门idx
         group_ids: [], //考核模板ID
         doing_id: 0, //状态ID
         employee_ids: [], //搜索人员ID
@@ -436,7 +407,7 @@ export default {
         page_size: 10
       },
       employee_ids: [],
-      asstabData: [],
+      asstabData: [], // 表格数据
       employees: [], //被考核人员列表
       //更多
       dropdownMenu: [
@@ -498,6 +469,7 @@ export default {
   },
   components: { PageHead, JxSearch, EmployeeSelector, BrawerBox },
   computed: {
+    /* 选择节点名称 */ 
     getNode() {
       let name;
       this.navigationList.some(item => {
@@ -567,18 +539,29 @@ export default {
       this.assDelList();
     }
   },
+  activated() {
+    let amfTabL;
+    let that = this;
+    if (that.$route.query.amfTabLckick) {
+      amfTabL = JSON.parse(that.$route.query.amfTabLckick);
+    }
+    if (amfTabL) {
+      that.pushAssMan = amfTabL.pushs ? amfTabL.pushs : null;
+      that.asstabParams.package_id = amfTabL.id;
+      that.svaeNavcli = amfTabL.navcli ? amfTabL.navcli : 0;
+      that.asstabParams.doing_id = amfTabL.navcli ? amfTabL.navcli : 0;
+      that.getInitData(this.asstabParams.package_id, () => { });
+      that.assDelList(); //请求绩效详情列表
+      that.getDcl();
+    }
+  },
   created() {
-    that=this;
+    that = this;
     let amfTabL;
     if (this.$route.query.amfTabLckick) {
       amfTabL = JSON.parse(this.$route.query.amfTabLckick);
     }
     let assessDetails = this.$getCache('assessDetails'); //缓存的数据
-    // if(assessDetails){
-    //   this.pushAssMan =assessDetails[2]?assessDetails[2]:null
-    //   this.asstabParams.package_id = assessDetails[1];
-    //   this.assessTree(assessDetails[0],assessDetails[1]); //请求绩效树
-    // }else
     if (amfTabL) {
       this.pushAssMan = amfTabL.pushs ? amfTabL.pushs : null;
       this.asstabParams.package_id = amfTabL.id;
@@ -888,13 +871,13 @@ export default {
         cancelButtonText: '取消',
         type: 'warning'
       })
-        .then(() => {
-          this.$axiosUser('post', '/api/pro/per/package/change_finish', { package_id: this.asstabParams.package_id }).then(res => {
-            this.$message.success('操作成功');
-            this.getInitData(this.asstabParams.package_id);
-          });
-        })
-        .catch(() => {});
+      .then(() => {
+        this.$axiosUser('post', '/api/pro/per/package/change_finish', { package_id: this.asstabParams.package_id }).then(res => {
+          this.$message.success('操作成功');
+          this.getInitData(this.asstabParams.package_id);
+        });
+      })
+      .catch(() => {});
     },
     isSelectable(row, index) {
       this.nowass = row.all_exec_over ? true : false;
@@ -904,6 +887,10 @@ export default {
         return true;
       }
     },
+    //发起考核
+    amhrsponsor() {
+      this.$router.push({ name: 'sponsorAssess' });
+    },
     //开始评分
     startisChecks() {
       this.isChecks = true;
@@ -955,18 +942,21 @@ export default {
           this.employee_list = employee_list;
           this.selected.employee = employee;
           this.employees = employees;
-          // // 设置各节点数量
-          // let statistics=res.data.data.statistics;
-          // let navigationList=JSON.parse(JSON.stringify(this.navigationList));
-          // let sum=0;
-          // navigationList.forEach(item=>{
-          //   item.num=statistics[item.id]
-          //   if(item.id!=0){
-          //      sum+=statistics[item.id]
-          //   }
-          // })
-          // navigationList[0].num=sum;
-          // this.navigationList=navigationList;
+
+          // 设置各节点数量
+          let statistics = res.data.data.statistics;
+
+          let navigationList = JSON.parse(JSON.stringify(this.navigationList));
+          let sum = 0;
+          navigationList.forEach(item => {
+            if (item.id == 0) item.name = "考核周期: " + this.date_remark
+            item.num = statistics[item.id]
+            if(item.id != 0){
+               sum += statistics[item.id]
+            }
+          })
+          navigationList[0].num=sum;
+          this.navigationList = navigationList;
           fun();
         }).finally(() => {
           this.isLoad = false;
@@ -992,7 +982,9 @@ export default {
             }
           });
           this.asstabData = list;
-          this.total = res.data.data.total;
+        this.total = res.data.data.total;
+        this.date_remark = res.data.data.date_remark
+
       }).finally(() => {
         this.assDetLoad = false;
       });
@@ -1007,6 +999,7 @@ export default {
       }
       this.assDelList();
     },
+    // 开始评分
     beginGrade() {
       let multipleSelection = [];
       let employeeMap = this.$getEmployeeMapAll();
@@ -1069,8 +1062,8 @@ export default {
           this.tableDataLoad = false;
       });
     },
+    //请求绩效树
     assessTree(id, id2) {
-      //请求绩效树
       this.assDetLoad = true;
       this.$axiosUser('get', '/api/pro/per/package/list', { page: 0, is_manage_scope: 1 }).then(res => {
         if (res.data.code == 1) {
@@ -1161,6 +1154,7 @@ export default {
 };
 </script>
 <style scoped lang="scss">
+/* 归档图片动画 */ 
 .guidang {
   margin-left: 20px;
   width: 70px;
@@ -1174,11 +1168,14 @@ export default {
     transform: scale(1);
   }
 }
+/* 归档图片动画 */
 .all {
+  min-width: 1400px;
   position: relative;
   font-size: 14px;
   background-color: #fff;
   padding: 20px;
+  box-sizing: border-box;
 }
 .navsvg1 {
   font-size: 15px;
@@ -1189,20 +1186,22 @@ export default {
   width: 4px;
   height: 20px;
   background-color: #e1e1e1;
-  margin: 0 20px;
+  margin: -20px 30px 0 30px;
 }
+
 .navsvg3 {
-  margin: 0px 20px;
+  margin: -20px 20px 0 20px;
   color: #e1e1e1;
   display: block;
   font-size: 18px;
 }
 header {
-  margin-top: 25px;
+  margin-top: 15px;
   .dept_wdiv {
-    width: 120px;
+    width: 200px;
     position: relative;
     .dept_inp {
+      width: 100%;
       position: absolute;
       top: 0;
       right: 0;
@@ -1211,9 +1210,11 @@ header {
       z-index: 9;
       border: 1px solid #e0e0e0;
       border-radius: 3px;
-      line-height: 32px;
+      line-height: 36px;
+      height: 36px;
       font-size: 12px;
       padding: 0 10px;
+      box-sizing: border-box;
       overflow: hidden;
       white-space: nowrap;
       text-overflow: ellipsis;
@@ -1230,40 +1231,42 @@ header {
       color: #b5b5b5;
     }
   }
-  .navigationL {
-    width: 100%;
-    height: 50px;
-    margin: 15px 0px 15px 0;
-    span {
-      display: flex;
-      cursor: pointer;
-      font-size: 14px;
-      padding: 10px 20px;
-      position: relative;
+    .navigationL {
       width: 100%;
-      border: 1px solid #e1e1e1;
-      border-radius: 3px;
-      justify-content: center;
-      color: #303133;
-      background-color: #f5f7fa;
+      margin: 30px 0;
+  
+      span {
+        display: flex;
+        cursor: pointer;
+        font-size: 14px;
+        width: 180px;
+        height: 60px;
+        position: relative;
+        border-radius: 3px;
+        align-items: center;
+        justify-content: center;
+        color: #303133;
+        background-color: #ecf5ff;
+        margin-bottom: 20px;
+      }
+  
+      span:hover {
+        color: #428eff;
+        border: 1px solid #409EFF;
+        background-color: #ecf5ff;
+      }
+  
+      /deep/ .action {
+        color: #428eff;
+        border: 1px solid #409EFF;
+        background-color: #ecf5ff;
+      }
     }
-    span:hover {
-      color: #428eff;
-      border: 1px solid #409EFF;
-      background-color: #ecf5ff;
+  
+    /deep/ .el-table tr:hover {
+      cursor: pointer;
     }
-    /deep/ .action {
-      color: #428eff;
-      border: 1px solid #409EFF;
-      background-color: #ecf5ff;
     }
-  }
-
-  /deep/ .el-table tr:hover {
-    cursor: pointer;
-  }
-}
-
 .braTab {
   padding: 20px 0 0 20px;
   /deep/ .el-table tr:hover {

+ 151 - 0
src/performance/views/assessManagement/assessManagement copy.vue

@@ -0,0 +1,151 @@
+<template>
+  <div class="all boxMinHeight">
+    <header class="flex-box flex-d-center">
+      <div class="flex-box">
+        <el-select v-model="amhlvalue"  style="width:100px;" placeholder="请选择">
+          <el-option v-for="item in amhlList" :key="item.value" :label="item.label" :value="item.value"></el-option>
+        </el-select>
+        <div style="margin-left:10px;width:250px;"><JxSearch :screen="2"  title="搜索考核名称" @confirm="searchList"></JxSearch></div>
+      </div>
+      <div>
+        <!-- <el-button icon="el-icon-s-promotion" v-if="$getRole(1) && $isAuthoritys_jx($7)"  type="primary" @click="amhrsponsor">发起考核</el-button> -->
+        <!-- <el-button  @click="amhrImport">导入历史绩效</el-button> -->
+      </div>
+    </header>
+
+    <footer v-loading="tableDataLoad">
+      <el-table :data="tableData" @row-click="amfTabLckick" style="width: 100%;">
+        <el-table-column prop="name" label="考核名称"></el-table-column>
+        <el-table-column prop="date" label="考核周期"></el-table-column>
+<!--        <el-table-column prop="employee_num" label="参与人数">
+          <template slot-scope="scope">
+            <div style="width:55px;text-align:center;">{{ scope.row.employee_num }}</div>
+          </template>
+        </el-table-column> -->
+        <el-table-column prop="peoplenum" label="操作">
+          <template slot-scope="scope">
+            <el-button type="text" size="medium" @click="amfTabLckick(scope.row)">查看</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <Pagination :page="assessData.page" :page_size="assessData.page_size" :total="total" @handleSizeChange="handleSizeChange" @handleCurrentChange="handleCurrentChange"></Pagination>
+    </footer>
+  </div>
+</template>
+
+<script>
+import JxSearch from '@/performance/components/public/JxSearch';
+export default {
+  name:'assessManagement',
+  data() {
+    return {
+      tableDataLoad: false, //列表load
+      amhlvalue: 0, //当前删选的时间
+      amhlList: [
+        { value: 0, label: '全部' },
+        { value: 2, label: '月度' },
+        { value: 3, label: '季度' },
+        { value: 4, label: '半年度' },
+        { value: 5, label: '年度' },
+        { value: 1, label: '日' },
+        { value: 6, label: '自定义' }
+      ],
+      total: 10,
+      assessData: {
+        cycle_type: 0, //周期类型
+        keywords: '', //搜索字
+        page: 1, //当期页
+        page_size: 10 ,//一页多少数据
+        is_manage_scope:1,
+      },
+
+      tableData: []
+    };
+  },
+  components: { JxSearch },
+  watch: {
+    amhlvalue(val) {
+      this.assessData.cycle_type = val;
+      this.assessData.page = 1;
+      this.assessBagList();
+    }
+  },
+  created() {
+    this.assessBagList();
+  },
+  activated() {
+    this.assessBagList();
+  },
+  methods: {
+    assessBagList() {
+      this.tableDataLoad = true;
+      this.$axiosUser('get', '/api/pro/per/package/list', this.assessData)
+        .then(res => {
+          if (res.data.code == 1) {
+            this.tableData = res.data.data.list;
+            this.total = res.data.data.total;
+          }
+        })
+        .finally(() => {
+          this.tableDataLoad = false;
+        });
+    },
+    searchList(data) {
+      //搜索
+      this.assessData.page = 1;
+      this.assessData.keywords = data;
+      this.assessBagList();
+    },
+    //发起考核
+    amhrsponsor() {
+      this.$router.push({ name: 'sponsorAssess' });
+    },
+    //导入历史绩效
+    amhrImport() {},
+
+    //点击表格某一行
+    amfTabLckick(row) {
+      this.$router.push({ path: '/assessDetails', query: { amfTabLckick: JSON.stringify(row) } });
+    },
+
+    // 页面变更
+    handleCurrentChange(val) {
+      this.assessData.page = val;
+      this.assessBagList();
+    },
+    // 页面跳转
+    handleSizeChange(val) {
+      this.assessData.page_size = val;
+      this.assessBagList();
+    }
+  }
+};
+</script>
+
+<style scoped="scoped" lang="scss">
+.all {
+  position: relative;
+  background-color: #fff;
+  padding: 20px;
+}
+header {
+ margin-bottom: 20px;
+}
+footer {
+  /deep/ .el-table__row {
+    height: 60px;
+  }
+  // /deep/ .el-table__row .cell {
+  //   font-size: 13px;
+  // }
+  /deep/ .has-gutter tr {
+    background-color: rgb(240, 240, 240);
+  }
+  /deep/ .el-table tr:hover {
+    cursor: pointer;
+  }
+}
+.color_blue {
+  color: #1299f9;
+}
+</style>

+ 1299 - 87
src/performance/views/assessManagement/assessManagement.vue

@@ -1,151 +1,1363 @@
 <template>
   <div class="all boxMinHeight">
-    <header class="flex-box flex-d-center">
-      <div class="flex-box">
-        <el-select v-model="amhlvalue"  style="width:100px;" placeholder="请选择">
-          <el-option v-for="item in amhlList" :key="item.value" :label="item.label" :value="item.value"></el-option>
-        </el-select>
-        <div style="margin-left:10px;width:250px;"><JxSearch :screen="2"  title="搜索考核名称" @confirm="searchList"></JxSearch></div>
-      </div>
+
+
+    <!-- 头部筛选条件,按钮组,流程节点 -->
+    <header>
       <div>
-        <el-button icon="el-icon-s-promotion" v-if="$getRole(1)&&$isAuthoritys_jx($7)"  type="primary" @click="amhrsponsor">发起考核</el-button>
-        <!-- <el-button  @click="amhrImport">导入历史绩效</el-button> -->
+        <el-row :gutter="10" type="flex" justify="space-between">
+          <el-col :span="24">
+            <div class="flex-box">
+              <div class="flex-box-ce" style="margin-right: 10px;">
+                <el-cascader v-model="headValue" :options="options" :props="props" :show-all-levels="false"
+                  style="width: 300px;"></el-cascader>
+              </div>
+              <!-- 选择部门下拉框 -->
+              <div class="dept_wdiv">
+                <div class="dept_inp" @click="show_dept_selector = true">
+                  <span v-if="deptVisibleName != ''">{{ deptVisibleName }}</span>
+                  <span v-else style="color: #b9b9b9;">选择部门</span>
+                </div>
+                <i class="el-icon-arrow-down"></i>
+              </div>
+              <EmployeeSelector :title="'选择部门'" :isChecKedAll="false" :can_select_employee="false"
+                :can_select_dept="true" :dept_children="false" :selected="dept_selected"
+                :visible.sync="show_dept_selector" @confirm="dept_confirm" />
+              <!-- 选择部门下拉框 -->
+              <!-- 选择考核模板下拉框 -->
+              <el-select v-model="groupValue" @change="groupChange" clearable class="margin-l width-300"
+                placeholder="选择考核表">
+                <el-option v-for="item in groupOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
+              </el-select>
+              <!-- 选择考核模板下拉框 -->
+              <!-- 姓名搜索 -->
+              <el-select v-model="employee_ids" multiple filterable clearable class="margin-l" placeholder="姓名搜索">
+                <el-option v-for="item in employees" :key="item.id" :label="item.name" :value="item.id"></el-option>
+              </el-select>
+              <!-- 姓名搜索 -->
+              <img v-if="all_finish" src="static/images/guidang.png" class="guidang" />
+            </div>
+          </el-col>
+        </el-row>
+        <el-row :gutter="10" style="margin-top: 20px;">
+          <el-col :span="24">
+            <!-- 按钮组 -->
+            <div class="flex-box-ce">
+              <template v-if="!all_finish">
+                <el-button-group>
+                  <el-button type="primary" icon="el-icon-s-promotion" v-if="$getRole(1) && $isAuthoritys_jx($7)"
+                    @click="amhrsponsor">发起考核</el-button>
+                  <el-button type="primary" icon="el-icon-s-custom" v-if="$getRole(1) || $getRole(2)"
+                    @click="isManagement = true">人员管理</el-button>
+                  <!-- 主管理员、有【开始评分】权限的子管理员 -->
+                  <el-button type="primary" icon="el-icon-edit-outline" v-if="$getRole(1) && $isAuthoritys_jx($8)"
+                    @click="startisChecks">开始评分</el-button>
+                </el-button-group>
+                <!-- 主管理员、有【菜单权限】权限的子管理员 -->
+                <el-dropdown v-if="$getRole(1)" style="margin-left:11px;" @command="handleCommand">
+                  <el-button>更多 <i class="el-icon-arrow-down"></i></el-button>
+                  <el-dropdown-menu slot="dropdown">
+                    <el-dropdown-item v-for="(item, index) in dropdownMenu" :key="index" :command="item.key"
+                      :divided="item.bordok" v-if="item.isShow">
+                      {{ item.name }}
+                    </el-dropdown-item>
+                  </el-dropdown-menu>
+                </el-dropdown>
+              </template>
+            </div>
+            <!-- 按钮组 -->
+          </el-col>
+        </el-row>
+      </div>
+
+
+
+      <div class="navigationL flex-box-ce flex-d-wrap">
+
+        <div v-for="(item, index) in navigationList" :key="index" class="flex-box-ce" 
+          @click="navClick(item)">
+          <template v-if="item.num">
+            <el-badge :value="item.num" class="item">
+              <span class="flex-box-ce" :class="{ action: navcli == item.id }">
+                <div>{{ index ? index : '' }} {{ item.name }}</div>
+                <div v-if="item.hint">
+                  &nbsp;
+                  <el-tooltip class="item" effect="dark" :content="item.hint" placement="top">
+                    <i class="el-icon-warning-outline navsvg1" v-if="item.hint"></i>
+                  </el-tooltip>
+                </div>
+              </span>
+            </el-badge>
+          </template>
+          <span class="flex-box-ce" :class="{ action: navcli == item.id }" v-else>
+            <div>{{ index ? index : '' }} {{ item.name }}</div>
+            <div v-if="item.hint">
+              &nbsp;
+              <el-tooltip class="item" effect="dark" :content="item.hint" placement="top">
+                <i class="el-icon-warning-outline navsvg1" v-if="item.hint"></i>
+              </el-tooltip>
+            </div>
+          </span>
+          <div v-if="index == 0" class="navsvg2"></div>
+
+          <i v-if="navigationList.length != index + 1 && index != 0" class="el-icon-right navsvg3"></i>
+        </div>
+      </div>
+
+
+      <template v-if="$getRole(1)">
+        <el-alert type="warning" style="margin-bottom: 15px;" v-if="navcli != 0 && navcli != 3 && navcli != 11"
+          :closable="false">
+          该绩效节点“<span style="font-weight: 600;">{{ getNode }}</span>”
+          参与人员:<span style="font-weight: 600;">{{ total }}</span>人,
+          <!-- 已完成录入<span style="font-weight: 600;">{{ asstabData.length }}</span>人,
+          未完成录入<span style="font-weight: 600;">{{ total - asstabData.length }}</span>人 -->
+          <span class="blue" style="cursor: pointer; margin-left: 10px" @click="isPending = true">查看名单</span>
+        </el-alert>
+      </template>
+      <div v-if="navcli == 3 && $getRole(1) && $isAuthoritys_jx($8)" style="margin-bottom: 15px;">
+        <el-button type="primary" @click="pf()">批量开始评分</el-button>
       </div>
     </header>
+    <!-- 头部筛选条件,按钮组 -->
 
-    <footer v-loading="tableDataLoad">
-      <el-table :data="tableData" @row-click="amfTabLckick" style="width: 100%">
-        <el-table-column prop="name" label="考核名称"></el-table-column>
-        <el-table-column prop="date" label="考核周期"></el-table-column>
-<!--        <el-table-column prop="employee_num" label="参与人数">
-          <template slot-scope="scope">
-            <div style="width:55px;text-align:center;">{{ scope.row.employee_num }}</div>
+
+
+    <el-table :data="asstabData" v-loading="assDetLoad" @row-click="assDetClick" style="width: 100%; margin-top: 20px;"
+      :header-cell-style="{ background: '#ECF5FF' }" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" v-if="navcli == 3"></el-table-column>
+      <el-table-column label="姓名" min-width="200">
+        <template slot-scope="scope">
+          <userImage class="fl" :id="scope.row.employee_id" style="margin-top: 9px;" :user_name="scope.row.name"
+            :img_url="scope.row.img_url" width="35px" height="35px" fontSize="12px"></userImage>
+          <span style="margin-left: 10px; line-height: 50px;">{{ scope.row.name }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="dept_list" label="部门" min-width="300">
+        <template slot-scope="scope">
+          <template v-if="scope.row.dept_list.length > 0">
+            <span v-for="(item, index) in scope.row.dept_list" :key="index">
+              {{ item.dept_name }}
+              <span v-if="scope.row.dept_list.length - index > 1">,</span>
+            </span>
+          </template>
+          <span v-else>--</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="group_name" label="考核表" min-width="200">
+        <template slot-scope="scope">
+          <span v-if="!scope.row.relevance_group.delete_time">{{ scope.row.relevance_group.name }}</span>
+          <span v-else class="red">该考核表已被删除</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="final_point" min-width="140" label="考核结果">
+        <template slot-scope="scope">
+          <template v-if="scope.row.final_point">
+            <span v-if="$getRole(1)">{{ scope.row.final_point }}</span>
+            <span v-else-if="scope.row.publicity">{{ scope.row.final_point }}</span>
+            <span v-else>-</span>
+          </template>
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="final_level" min-width="140" label="绩效等级">
+        <template slot-scope="scope">
+          <template v-if="scope.row.final_level">
+            <span v-if="$getRole(1)">{{ scope.row.final_level }}</span>
+            <span v-else-if="scope.row.publicity">{{ scope.row.final_level }}</span>
+            <span v-else>-</span>
+          </template>
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="peoplenum" min-width="200" label="操作">
+        <template slot-scope="scope">
+          <el-button type="text" size="medium" @click="assDetClick(scope.row)">查看</el-button>
+          <template v-if="$isAuthoritys_jx($9) && !all_finish && scope.row.doing_id == 11">
+            <el-button type="text" size="medium" @click.stop="theResultsOf1(scope.row, 1)">调整考核结果</el-button>
+            <el-button type="text" size="medium" @click.stop="theResultsOf1(scope.row, 2)">调整绩效等级</el-button>
+          </template>
+          <el-button type="text" v-if="navcli == 3 && $getRole(1) && $isAuthoritys_jx($8)" size="medium"
+            @click.stop="pf(scope.row)">开始评分</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <Pagination :page="asstabParams.page" :page_size="asstabParams.page_size" :total="total"
+      @handleSizeChange="handleSizeChange" @handleCurrentChange="handleCurrentChange"></Pagination>
+
+
+    <BrawerBox drawerTitle="请选择开始评分的考核模板" :showDrawer.sync="isChecks">
+      <template slot="main">
+        <div v-loading="isChecksLoad">
+          <div style="padding-top:10px;">
+            <JxSearch :screen="2" title="搜索考核模板" ref="braSearch" @confirm="braSearch"></JxSearch>
+          </div>
+          <template v-if="scoreGroup.length > 0">
+            <div class="flex-box-ce li" style="margin-top: 20px;"><el-checkbox class="flex-box-ce"
+                v-model="isAllSelectIndex" label="全选"></el-checkbox></div>
+            <ul class="ul">
+              <li v-for="(item, index) in scoreGroup" :key="index" class="flex-box-ce li">
+                <el-checkbox class="flex-box-ce" style="padding: 0;" :disabled="item.disabled" v-model="item.check">
+                  <div class="flex-box-ce">
+                    <div class="flex-1">
+                      <!-- <span v-if="item.all_exec_over" class="blue-box" style="padding: 5px 10px; border-radius: 3px; width: 80px;height: 24px; font-size: 12px;">已开始评分</span> -->
+                      <span>{{ item.name }}</span>
+                    </div>
+                    <div class="blue" v-if="item.count_employee > 0">{{ item.count_employee }} 人</div>
+                  </div>
+                </el-checkbox>
+              </li>
+              <div class="fontColorC" style="text-align: center;padding: 10px 0;font-size: 12px;">没有更多了</div>
+            </ul>
           </template>
-        </el-table-column> -->
-        <el-table-column prop="peoplenum" label="操作">
+          <NoData v-else></NoData>
+        </div>
+      </template>
+      <template slot="footer">
+        <div style="position: absolute;left: 20px;font-size: 14px;color: #2b7ce0">已选择:{{ getLeng }}个</div>
+        <el-button plain @click="isChecks = false">取消</el-button>
+        <el-button type="primary" @click="beginGrade">开始评分</el-button>
+      </template>
+    </BrawerBox>
+    <!-- 导出执行记录 -->
+    <EmployeeSelector :title="'选择人员'" :isChecKedAll="false" :max="20" :isRequired="true" :can_select_employee="true"
+      :can_select_dept="false" :user_employee_list="true" :employee_list="employee_list" :visible.sync="isDerive"
+      @confirm="confirmDerive" />
+
+    <!-- 公式结果 -->
+    <EmployeeSelector :title="'结果公布'" :is_filtration_creator="false" :can_select_employee="true"
+      :can_select_dept="false" :user_employee_list="true" :employee_list="employee_list" :selected="selected"
+      :visible.sync="isResult" @confirm="confirmResult" />
+
+    <!-- 更多-管理 -->
+    <BrawerBox drawerTitle="人员管理" :showDrawer.sync="isManagement">
+      <template slot="main">
+        <div class="m-content">
+          <div>
+            <div class="m-title">变更参与考核人员({{ employee_list.length }}人)</div>
+            <div class="flex-box-ce" style="margin-top: 20px;">
+              <div style="margin-right: 20px;cursor: pointer;" @click="showSelectUser(1)">
+                <i class="el-icon-circle-plus-outline blue"></i>
+                添加
+              </div>
+              <div style="cursor: pointer;" @click="showSelectUser(2)">
+                <i class="el-icon-remove-outline red"></i>
+                删除
+              </div>
+            </div>
+          </div>
+        </div>
+      </template>
+    </BrawerBox>
+
+    <!-- 更多-管理-人员选择添加 -->
+    <EmployeeSelector title="添加被考核人员" :is_filtration_creator="false" :can_select_employee="true"
+      :can_select_dept="false" :user_employee_list="true" :isRequired="true" :employee_list="add_employee_list"
+      :visible.sync="isShowUser" @confirm="confirmUser">
+      <template slot="footer">
+        <div style="text-align: center;" class="orange flex-1">*添加成功后,别忘了帮Ta加入【绩效等级配置】喔!*</div>
+      </template>
+    </EmployeeSelector>
+
+    <!-- 更多-管理-人员选择删除 -->
+
+    <EmployeeSelector :title="packageName + ':选择被删除人员'" :is_filtration_creator="false" :can_select_employee="true"
+      :can_select_dept="false" :isRequired="true" :user_employee_list="true" :include_deleted="true"
+      :employee_list="employee_list" :visible.sync="isShowUser2" @confirm="confirmUser2">
+      <template slot="header">
+        <div style="text-align: center;" class="orange">*当所有人员都被选中删除时,该周期的绩效考核也会自动删除*</div>
+      </template>
+    </EmployeeSelector>
+
+    <el-dialog :title="theResults == 1 ? '调整考核结果' : '调整绩效等级'" :visible.sync="comtheResults" width="500px"
+      :close-on-click-modal="false">
+      <div class="">
+        <div>
+          员工姓名:
+          <span style="padding-left: 14px;">{{ theResultsList.name }}</span>
+        </div>
+        <br />
+        <div v-if="theResults == 1">
+          <div>原考核结果:<span>{{ theResultsList.final_point }}</span></div>
+          <br />
+          <div class="flex-box">
+            <span style="line-height:36px;">新考核结果:</span>
+            <el-input v-model="theResultInp"
+              @input="theResultInp = theResultInp.match(/\d+(\.\d{0,2})?/) ? theResultInp.match(/\d+(\.\d{0,2})?/)[0] : ''"
+              style="width:250px;" placeholder="请输入新考核结果"></el-input>
+          </div>
+        </div>
+        <div v-else>
+          <div>原绩效等级:<span>{{ theResultsList.final_level }}</span></div>
+          <br />
+          <div class="flex-box-ce">
+            <span>新绩效等级:</span>
+            <el-select v-model="level" placeholder="请选择" style="width: 200px;">
+              <el-option v-for="(item, index) in levels" :key="index" :label="item.name" :value="item.name"></el-option>
+            </el-select>
+          </div>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="comtheResults = false">取 消</el-button>
+        <el-button type="primary" :disabled="theResultsButid" @click="savecomtheResults()">确 定</el-button>
+      </span>
+    </el-dialog>
+
+    <el-dialog title="结果" :visible.sync="isShowData" @close="close_list" :append-to-body="true" width="700px">
+      <el-table :data="showData" style="max-height: 600px;overflow: auto;">
+        <el-table-column prop="name" label="名称"></el-table-column>
+        <el-table-column prop="successText" label="结果">
           <template slot-scope="scope">
-            <el-button type="text" size="medium" @click="amfTabLckick(scope.row)">查看</el-button>
+            <span v-if="scope.row.successText == '失败'" class="red">失败</span>
+            <span v-else class="green">成功</span>
           </template>
         </el-table-column>
+        <el-table-column prop="reason" label="描述"></el-table-column>
       </el-table>
-      <Pagination :page="assessData.page" :page_size="assessData.page_size" :total="total" @handleSizeChange="handleSizeChange" @handleCurrentChange="handleCurrentChange"></Pagination>
-    </footer>
+      <span slot="footer" class="dialog-footer" v-if="selectUser.length == showData.length">
+        <el-button type="primary" @click="isShowData = false">确 定</el-button>
+      </span>
+    </el-dialog>
+
+    <!-- 待处理人员列表 -->
+    <BrawerBox :drawerTitle="'“' + getNode + '” 相关负责人名单'" :showDrawer.sync="isPending">
+      <template slot="main">
+        <div>
+          <div class="flex-box-ce" style="border-bottom: 1px solid #f1f1f1;padding: 10px 0;"
+            v-for="(item, index) in pending_employee_list" :key="index" v-if="pending_employee_list.length > 0">
+            <div class="flex-box-ce">
+              <userImage style="margin-right: 10px;" :user_name="item.name" :img_url="item.img_url" width="38px"
+                height="38px" fontSize="12px"></userImage>
+              <span>{{ item.name }}</span>
+            </div>
+            <div style="margin-left: 10px;" class="flex-1">
+              <template v-if="item.dept_list.length > 0">
+                <span v-for="(e, index2) in item.dept_list" :key="index2" class="fontColorC">
+                  {{ e.dept_name }}
+                  <span v-if="item.dept_list.length - index > 1">,</span>
+                </span>
+              </template>
+            </div>
+          </div>
+          <NoData v-if="pending_employee_list.length == 0"></NoData>
+        </div>
+      </template>
+      <template slot="footer">
+        <!-- <el-button plain  @click="isPending = false">取消</el-button> -->
+        <el-button type="primary" @click="getPending">导出人员名单</el-button>
+      </template>
+    </BrawerBox>
   </div>
 </template>
-
 <script>
-import JxSearch from '@/performance/components/public/JxSearch';
+let that;
+import PageHead from '@/components/PageHead'; //头部---返回
+import JxSearch from '@/performance/components/public/JxSearch'; //搜索
+import EmployeeSelector from '@/components/EmployeeSelector';
+import BrawerBox from '@/performance/components/public/BrawerBox';
 export default {
-  name:'assessManagement',
+  name: 'assessDetails',
   data() {
     return {
-      tableDataLoad: false, //列表load
-      amhlvalue: 0, //当前删选的时间
-      amhlList: [
-        { value: 0, label: '全部' },
-        { value: 2, label: '月度' },
-        { value: 3, label: '季度' },
-        { value: 4, label: '半年度' },
-        { value: 5, label: '年度' },
-        { value: 1, label: '日' },
-        { value: 6, label: '自定义' }
+      date_remark: "",
+      isHeadShow: false,
+      pending_employee_list: [], //待处理人员
+      isPending: false,
+      total: 0, // 当前节点考核总人数
+      nowass: false, //已开始评分显示隐藏
+      pushAssMan: null, //头部跳转
+      assDetLoad: false, //loading
+      isLoad: false,
+      headValue: [], //顶部选择考核
+      options: [], //顶部考核数据
+      props: {},
+      groupValue: [], //选择考核模板val
+      groupOptions: [], //选择考核模板数据
+      scoreGroup: [], //评分考核模板
+      isAllSelectIndex: false,
+      GroupList: [], //评分考核模板备份搜索数据
+      // 流程节点
+      navigationList: [
+        //导航
+        { id: 0, name: '考核周期: ', num: 0 },
+        { id: 1, name: '目标制定', num: 0 },
+        { id: 2, name: '目标确认', num: 0 },
+        {
+          id: 3,
+          name: '执行中',
+          num: 0,
+          hint: '目标制定并确认完毕后,进入到【执行中】阶段,期间员工执行计划,上级跟踪过程。进入结果数据收集和评分阶段'
+        },
+        { id: 4, name: '结果值录入', num: 0 },
+        { id: 5, name: '评分', num: 0 },
+        { id: 9, name: '审批', num: 0 },
+        { id: 11, name: '结束', num: 0 }
       ],
-      total: 10,
-      assessData: {
-        cycle_type: 0, //周期类型
-        keywords: '', //搜索字
-        page: 1, //当期页
-        page_size: 10 ,//一页多少数据
-        is_manage_scope:1,
+      navcli: 0, // 导航当前选中
+      svaeNavcli: 0, //保存的选中
+      // 头部筛选条件
+      asstabParams: {
+        package_id: 0, //考核包id
+        dept_ids: [], //部门idx
+        group_ids: [], //考核模板ID
+        doing_id: 0, //状态ID
+        employee_ids: [], //搜索人员ID
+        page: 1,
+        page_size: 10
       },
+      employee_ids: [],
+      asstabData: [], // 表格数据
+      employees: [], //被考核人员列表
+      //更多
+      dropdownMenu: [
+        { key: 'a', name: '等级配置', isShow: this.$isAuthoritys_jx(this.$10) },
+        { key: 'b', name: '结果公布', isShow: true },
+        { key: 'c', name: '导出明细', bordok: true, isShow: this.$isAuthoritys_jx(this.$11) },
+        { key: 'd', name: '导出结果', isShow: this.$isAuthoritys_jx(this.$11) },
+        { key: 'k', name: '导出执行计划', isShow: this.$getRole(1) || this.$getRole(2) },
+        { key: 'y', name: '批量修改目标值', isShow: true },
+        { key: 'j', name: '批量转交', isShow: true },
+        // { key: 'e', name: '自定义导出' },
+        // { key: 'f', name: '批量操作', bordok: true },
+        { key: 'h', name: '归档&统计', bordok: true, isShow: false },
+        // { key: 'g', name: '管理', bordok: true, isShow: true }
+      ],
+      // 选择部门
+      deptVisibleName: '',
+      dept_selected: { dept: [], employee: [] },
+      show_dept_selector: false,
+      deptList_id: [],
+      isChecks: false, //评分开关
+      isChecksLoad: false,
+      allassList: [], //所有流程数据
+      searchList: [], //搜索备份
+      searchdet: '', //搜索值
+      packageName: '', //考核包名称
+      // 公式结果相关
+      isResult: false,
+      employee_list: [], //人员列表
+      selected: { dept: [], employee: [] }, //已选择公式人员
+      // 更多-管理
+      isManagement: false,
+      ManagementTitle: '删除被考核人员',
+      add_employee_list: [], //可以被添加到绩效包的人员
+      isShowUser: false, //控制添加人员
+      isShowUser2: false, //控制删除人员
+      selected: { dept: [], employee: [] }, //已选择公式人员
+      userInfo: this.$userInfo(),
+      theResults: 1, //结果点击按钮
+      theResultsList: {}, //点击的结果
+      comtheResults: false, //切换结果控制
+      theResultInp: '', //调整考核结果值
+      theResultsButid: false,
+      deleteNum: 0, //记录考核包人数
+      isShowData: false,
+      showData: [],
+      all_process_done: false, //是否所有人都完成流程了
+      all_finish: false, //是否已经归档
+
+      isDerive: false,//导出执行人员
+      level: '',
+      levels: [],
 
-      tableData: []
+      selectUser: [],
+      pfIndex: 0,
     };
   },
-  components: { JxSearch },
-  watch: {
-    amhlvalue(val) {
-      this.assessData.cycle_type = val;
-      this.assessData.page = 1;
-      this.assessBagList();
+  components: { PageHead, JxSearch, EmployeeSelector, BrawerBox },
+  computed: {
+    /* 选择节点名称 */
+    getNode() {
+      let name;
+      this.navigationList.some(item => {
+        if (item.id == this.navcli) {
+          name = item.name;
+          return true;
+        }
+      });
+      return name;
+    },
+    getLeng() {
+      let num = 0;
+      this.scoreGroup.forEach(item => {
+        if (item.check) {
+          num += 1;
+        }
+      });
+      return num;
     }
   },
-  created() {
-    this.assessBagList();
+  watch: {
+    isChecks(val) {
+      if (!val) {
+        this.isAllSelectIndex = false;
+      }
+    },
+    isAllSelectIndex(val) {
+      this.scoreGroup.forEach(item => {
+        if (!item.disabled) {
+          item.check = val;
+        }
+      });
+    },
+    headValue(val) {
+      if (!(this.options && this.options.length > 0)) return
+      this.options.some(item => {
+        if (item.id == val[0]) {
+          item.list.some(e => {
+            if (e.id == val[1]) {
+              this.packageName = e.name;
+              return true;
+            }
+          });
+          return true;
+        }
+      });
+      let arr = JSON.parse(JSON.stringify(val));
+      arr.push(this.pushAssMan);
+      this.$setCache('assessDetails', arr); //当点击考核记录进入详情,返后时要还原到之前的考核包
+      this.asstabParams.package_id = val[val.length - 1];
+      this.asstabParams.group_ids = []; //置空
+
+      if (this.svaeNavcli) {
+        this.navcli = this.svaeNavcli;
+        this.asstabParams.doing_id = this.svaeNavcli; //置空
+        this.svaeNavcli = 0;
+      } else {
+        this.navcli = 0;
+        this.asstabParams.doing_id = 0; //置空
+      }
+      this.getInitData(this.asstabParams.package_id, () => { });
+      this.assDelList(); //请求绩效详情列表
+      this.getDcl();
+    },
+    employee_ids(val) {
+      this.asstabParams.employee_ids = JSON.stringify(val);
+      this.asstabParams.page = 1;
+      this.assDelList();
+    }
   },
   activated() {
-    this.assessBagList();
+    let that = this;
+    let params = {
+      cycle_type: 2, //周期类型
+      keywords: '', //搜索字
+      page: 1, //当期页
+      page_size: 10,//一页多少数据
+      is_manage_scope: 1,
+    }
+    let amfTabL;
+    that.$axiosUser('get', '/api/pro/per/package/list', params)
+    .then(res => {
+      if (res.data.code == 1) {
+        that.tableData = res.data.data.list;
+        amfTabL = that.tableData[0];
+        if (amfTabL) {
+          that.asstabParams.package_id = amfTabL.id;
+          that.pushAssMan = amfTabL.pushs ? amfTabL.pushs : null;
+          that.svaeNavcli = amfTabL.navcli ? amfTabL.navcli : 0;
+          that.asstabParams.doing_id = amfTabL.navcli ? amfTabL.navcli : 0;
+          that.getInitData(this.asstabParams.package_id, () => { });
+          that.assDelList(); //请求绩效详情列表
+          that.getDcl();
+        }
+      }
+    })
+  },
+
+  
+
+  created() {
+    let that = this;
+    let params = {
+      cycle_type: 2, //周期类型
+      keywords: '', //搜索字
+      page: 1, //当期页
+      page_size: 10,//一页多少数据
+      is_manage_scope: 1,
+    }
+    let amfTabL;
+    that.$axiosUser('get', '/api/pro/per/package/list', params)
+      .then(res => {
+        if (res.data.code == 1) {
+          that.tableData = res.data.data.list;
+          amfTabL = that.tableData[0];
+          if (amfTabL) {
+            let assessDetails = that.$getCache('assessDetails'); //缓存的数据
+            that.pushAssMan = amfTabL.pushs ? amfTabL.pushs : null;
+            that.asstabParams.package_id = amfTabL.id;
+            that.assessTree(amfTabL.cycle_type, amfTabL.id); //请求绩效树
+            that.svaeNavcli = amfTabL.navcli ? amfTabL.navcli : 0;
+            that.asstabParams.doing_id = amfTabL.navcli ? amfTabL.navcli : 0;
+            that.props = {
+              lazy: true,
+              label: 'name',
+              value: 'id',
+              children: 'list',
+              lazyLoad(node, resolve) {
+                const { level } = node;
+                that.getAssessTree(node, resolve);
+              }
+            }
+            //回显绩效树的选中
+            that.getAddEmployee();
+          }
+
+        }
+      })
+
   },
   methods: {
-    assessBagList() {
-      this.tableDataLoad = true;
-      this.$axiosUser('get', '/api/pro/per/package/list', this.assessData)
+    kspf(is) {
+      let userInfo = this.selectUser[this.pfIndex];
+      if (userInfo) {
+        let data = {
+          id: userInfo.id, //绩效包ID
+          single: 1 //非单人
+        };
+        this.$axiosUser('post', '/api/pro/per/package/start_score', data).then(res => {
+          if (!is) {
+            if (!res.data.data.result) {
+              let list = res.data.data.list;
+              list.forEach(item => {
+                item.successText = '失败';
+                item.name = this.$getEmployeeMapItem(userInfo.employee_id).name;
+                item.reason = item.reason;
+              });
+              this.showData.unshift(...list)
+            } else {
+              let data = {
+                successText: '成功',
+                name: this.$getEmployeeMapItem(userInfo.employee_id).name,
+                reason: '已开始评分'
+              }
+              this.showData.unshift(data)
+            }
+            this.pfIndex++;
+            this.kspf();
+          } else {
+            this.$message.success(res.data.msg);
+            this.isChecks = false;
+            this.getInitData(this.asstabParams.package_id);
+            this.assDelList();
+          }
+        });
+      } else {
+        this.isChecks = false;
+        this.getInitData(this.asstabParams.package_id);
+        this.assDelList();
+      }
+    },
+    pf(item) {
+      //开始评分按钮
+      if (item) {
+        this.selectUser = [item];
+      }
+      if (this.selectUser.length == 0) {
+        this.$message.warning('请选择开始评分的人员');
+        return;
+      }
+      this.$confirm('所选员工的绩效考核将自动进入评分流程,确认开始评分?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消'
+      }).then(() => {
+        if (this.selectUser.length == 1) {
+          this.kspf(true);
+        } else {
+          this.pfIndex = 0;
+          this.isShowData = true;
+          this.kspf();
+        }
+      }).catch(() => { });
+    },
+    handleSelectionChange(val) {
+      this.selectUser = val
+    },
+    confirmDerive(obj) {
+      if (obj.employee.length == 0) {
+        this.$message.error('请选择人员');
+        return false;
+      }
+      let site_id = this.$getCache('site_info').id;
+      let employee = obj.employee.map(item => {
+        return item.id;
+      });
+      let url = `${this.$serverdomain}/api/pro/download/schedule?site_id=${site_id}&employee_ids=${JSON.stringify(employee)}&package_id=${this.asstabParams.package_id}&searcher_id=${this.userInfo.id
+        }`;
+      window.open(url, '_blank');
+    },
+
+    getPending() {
+      let site_info = this.$getCache('site_info');
+      let url = `${this.$serverdomain}/api/pro/download/doing_list?site_id=${site_info.id}&searcher_id=${this.userInfo.id}&package_id=${this.asstabParams.package_id}&node_type=${this.navcli
+        }`;
+      window.open(url, '_blank');
+    },
+    getDcl() {
+      if (this.navcli == 0 || !this.$getRole(1)) {
+        return false;
+      }
+      this.$axiosUser('get', 'api/pro/per/package/msg/doing_list', { package_id: this.asstabParams.package_id, node_type: this.navcli }).then(res => {
+        let list = res.data.data.list;
+        list.forEach(item => {
+          let user = this.$getEmployeeMapItem(item.employee_id);
+          if (!user) {
+            return false;
+          }
+          item.dept_list = user.employee_detail.dept_list;
+          item.name = user.name;
+          item.img_url = user.img_url;
+        });
+        this.pending_employee_list = list;
+      });
+    },
+    // 关闭
+    close_list() {
+      this.showData = [];
+    },
+    // 获取可被添加人员
+    getAddEmployee(fun = function () { }) {
+      this.$axiosUser('get', 'api/pro/per/package/get_subtraction_employee', { package_id: this.asstabParams.package_id }).then(res => {
+        this.add_employee_list = res.data.data.list;
+        fun();
+      });
+    },
+    // 添加人员
+    confirmUser(val) {
+      let employee_ids = val.employee.map(item => {
+        return item.id;
+      });
+      let data = {
+        package_id: this.asstabParams.package_id,
+        employee_ids: JSON.stringify(employee_ids)
+      };
+      this.$axiosUser('post', '/api/pro/per/package/add_package_employee', data).then(res => {
+        this.$message.success('添加成功');
+        this.isManagement = false;
+        this.getInitData(this.asstabParams.package_id, () => { });
+        this.assDelList();
+      });
+    },
+    //删除人员
+    confirmUser2(val) {
+      this.$confirm('被考核人删除后,本次考核相关数据将被清空,无法恢复,请确认是否删除?', '删除确认', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消'
+      })
+        .then(() => {
+          let employee_ids = val.employee.map(item => {
+            return item.id;
+          });
+          let data = {
+            package_id: this.asstabParams.package_id,
+            employee_ids: JSON.stringify(employee_ids)
+          };
+          this.$axiosUser('post', '/api/pro/per/package/delete_package_employee', data).then(res => {
+            if (employee_ids.length == this.deleteNum) {
+              this.$alert('删除成功,考核包已无考核人员,该周期的绩效考核也会自动删除', '提示', {
+                confirmButtonText: '确定',
+                showClose: false,
+                callback: action => {
+                  this.$router.go(-1);
+                }
+              });
+            } else {
+              this.$message.success('删除成功');
+              this.isManagement = false;
+              this.getInitData(this.asstabParams.package_id, () => { });
+              this.assDelList();
+            }
+          });
+        })
+        .catch(() => { });
+    },
+    savecomtheResults(dataId, db) {
+      this.theResultsButid = true;
+      let data = {
+        id: this.theResultsList.id,
+        change_type: this.theResults,
+      };
+      if (this.theResults == 1) {
+        data.point = this.theResultInp
+      } else {
+        if (!this.level) {
+          this.$message.error('请选择新等级')
+          this.theResultsButid = false;
+          return false
+        }
+        data.level = this.level
+      }
+      this.$axiosUser('post', '/api/pro/per/package/adjustment', data)
         .then(res => {
           if (res.data.code == 1) {
-            this.tableData = res.data.data.list;
-            this.total = res.data.data.total;
+            this.comtheResults = false;
+            this.level = '';
+            this.assDelList();
           }
         })
         .finally(() => {
-          this.tableDataLoad = false;
+          setTimeout(() => {
+            this.theResultsButid = false;
+          }, 300);
         });
     },
-    searchList(data) {
-      //搜索
-      this.assessData.page = 1;
-      this.assessData.keywords = data;
-      this.assessBagList();
+    theResultsOf1(data, num) {
+      this.theResultsList = data;
+      this.theResults = num;
+      if (num == 2) {
+        this.getLevels(data);
+        return false
+      }
+      this.comtheResults = true;
+    },
+    getLevels(data) {
+      this.$axiosUser('get', '/api/pro/per/package/levels', { pe_id: data.id }).then(res => {
+        this.levels = res.data.data.levels
+        this.comtheResults = true;
+      });
+    },
+    // 更多-选择人员
+    showSelectUser(index) {
+      switch (index) {
+        case 1:
+          // this.getAddEmployee(() => {
+          this.isShowUser = true;
+          // });
+          break;
+        case 2:
+          this.isShowUser2 = true;
+          break;
+      }
+    },
+    // 添加考核人
+    openManagement() {
+      this.$router.push({ path: '/addPersonnel', query: { packageId: this.asstabParams.package_id } });
+    },
+    // 提交公式结果
+    confirmResult(val) {
+      let noData = val.employee.map(item => {
+        return item.id;
+      });
+      let publicity = {
+        publicity: noData, //公布人员id列表
+        concealment: [] //未公布人员id列表
+      };
+      this.$axiosUser('post', '/api/pro/per/package/edit_publicity', { id: this.asstabParams.package_id, publicity: JSON.stringify(publicity) }).then(res => {
+        this.$message.success('操作成功');
+        this.assDelList();
+        this.getInitData(this.asstabParams.package_id, () => { });
+      });
+    },
+    // 更多
+    handleCommand(val) {
+      switch (val) {
+        case 'a': //等级配置
+          this.$router.push({
+            path: '/classDtail',
+            query: {
+              packageName: this.packageName,
+              packageId: this.asstabParams.package_id,
+              employee_list: JSON.stringify(this.employee_list)
+            }
+          });
+          break;
+        case 'b': //公式结果
+          this.isResult = true;
+          break;
+        case 'c': //导出明细
+          this.$axiosUser('get', '/api/pro/per/package/export/detail', { package_id: this.asstabParams.package_id }).then(res => {
+            this.$alert('系统正在处理中,处理完将在工作台以“消息”形式通知您,请留意消息通知', '提示', {
+              confirmButtonText: '我知道了',
+              callback: action => { }
+            });
+          });
+          break;
+        case 'd': //导出结果
+          this.$axiosUser('get', '/api/pro/per/package/export/result', { package_id: this.asstabParams.package_id }).then(res => {
+            this.$alert('系统正在处理中,处理完将在工作台以“消息”形式通知您,请留意消息通知', '提示', {
+              confirmButtonText: '我知道了',
+              callback: action => { }
+            });
+          });
+          break;
+        case 'g': //管理
+          this.isManagement = true;
+          break;
+        case 'h': //归档
+          this.pigeonhole();
+          break;
+        case 'y': //批量修改目标值
+          this.$router.push({ path: '/updateTarget', query: { packageId: this.asstabParams.package_id, packageName: this.packageName, index: '2' } });
+          break;
+        case 'j': //批量修改目标值
+          this.$router.push({ path: '/updateTarget', query: { packageId: this.asstabParams.package_id, packageName: this.packageName, index: '1' } });
+          break;
+        case 'k': //批量修改目标值
+          this.isDerive = true;
+          break;
+      }
+    },
+    // 归档
+    pigeonhole() {
+      this.$confirm('为保证统计数据一致且正确,归档操作不可撤销,归档后不能再修改考核内容,请确认考核信息无误后再归档。', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          this.$axiosUser('post', '/api/pro/per/package/change_finish', { package_id: this.asstabParams.package_id }).then(res => {
+            this.$message.success('操作成功');
+            this.getInitData(this.asstabParams.package_id);
+          });
+        })
+        .catch(() => { });
+    },
+    isSelectable(row, index) {
+      this.nowass = row.all_exec_over ? true : false;
+      if (row.all_exec_over) {
+        return false;
+      } else {
+        return true;
+      }
     },
     //发起考核
     amhrsponsor() {
       this.$router.push({ name: 'sponsorAssess' });
     },
-    //导入历史绩效
-    amhrImport() {},
-
-    //点击表格某一行
-    amfTabLckick(row) {
-      this.$router.push({ path: '/assessDetails', query: { amfTabLckick: JSON.stringify(row) } });
+    //开始评分
+    startisChecks() {
+      this.isChecks = true;
     },
-
     // 页面变更
     handleCurrentChange(val) {
-      this.assessData.page = val;
-      this.assessBagList();
+      this.asstabParams.page = val;
+      this.assDelList();
     },
     // 页面跳转
     handleSizeChange(val) {
-      this.assessData.page_size = val;
-      this.assessBagList();
+      this.asstabParams.page_size = val;
+      this.assDelList();
+    },
+    getInitData(id, fun = function () { }) {
+      this.isLoad = true;
+      this.$axiosUser('get', '/api/pro/per/package/info_v3_aid', { package_id: id }).then(res => {
+        let groups = res.data.data.groups;
+        this.all_finish = res.data.data.all_finish;
+        this.all_process_done = res.data.data.all_process_done;
+        this.dropdownMenu.forEach((item, index) => {
+          if (item.key == 'h' && !this.all_finish && this.all_process_done) {
+            if (this.all_finish) {
+              this.$set(this.dropdownMenu[index], 'isShow', false);
+            } else {
+              this.$set(this.dropdownMenu[index], 'isShow', true);
+            }
+          }
+        });
+        groups.forEach(item => {
+          item.check = false;
+          if (item.all_exec_over) {
+            item.disabled = true;
+          }
+        });
+        this.groupOptions = groups; //考核模板下拉
+        this.scoreGroup = groups; //评分考核模板
+        this.GroupList = groups; //考核模板搜索
+        // 公式结果数据
+        let employees = res.data.data.employees;
+        let employee_list = [];
+        let employee = [];
+        employees.forEach(item => {
+          employee_list.push(this.$getEmployeeMapItem(item.id));
+          if (item.publicity) {
+            employee.push(this.$getEmployeeMapItem(item.id));
+          }
+        });
+        this.employee_list = employee_list;
+        this.selected.employee = employee;
+        this.employees = employees;
+        // 设置各节点数量
+        let statistics = res.data.data.statistics;
+        let navigationList = JSON.parse(JSON.stringify(this.navigationList));
+        let sum = 0;
+        navigationList.forEach(item => {
+          if (item.id == 0) item.name = "考核周期: " + this.date_remark
+          item.num = statistics[item.id]
+          if (item.id != 0) {
+            sum += statistics[item.id]
+          }
+        })
+        navigationList[0].num = sum;
+        this.navigationList = navigationList;
+        fun();
+      }).finally(() => {
+        this.isLoad = false;
+      });
+    },
+    assDelList() {
+      this.assDetLoad = true;
+      this.$axiosUser('get', '/api/pro/per/package/info_v3', this.asstabParams).then(res => {
+        let list = res.data.data.list || [];
+        list.forEach(item => {
+          let user = this.$getEmployeeMapItem(item.employee_id);
+          if (user.employee_detail) {
+            item.dept_list = user.employee_detail.dept_list;
+          } else {
+            item.dept_list = [];
+          }
+          item.name = user.name;
+          item.img_url = user.img_url;
+          if (item.todo.length > 0) {
+            item.todo.forEach(e => {
+              e.userInfo = this.$getEmployeeMapItem(e.employee_id);
+            });
+          }
+        });
+        this.asstabData = list;
+        this.total = res.data.data.total;
+        this.date_remark = res.data.data.date_remark;
+        this.navigationList.forEach(item => {
+          if (item.id == 0) item.name = "考核周期: " + this.date_remark
+        })
+      }).finally(() => {
+        this.assDetLoad = false;
+      });
+    },
+    groupChange(data) {
+      //考核模板选中
+      this.asstabParams.page = 1;
+      if (data) {
+        this.asstabParams.group_ids = JSON.stringify([data]);
+      } else {
+        this.asstabParams.group_ids = JSON.stringify([]);
+      }
+      this.assDelList();
+    },
+    // 开始评分
+    beginGrade() {
+      let multipleSelection = [];
+      let employeeMap = this.$getEmployeeMapAll();
+      this.scoreGroup.forEach(item => {
+        if (item.check && item.exec_list.length > 0) {
+          item.exec_list.forEach(item2 => {
+            item2.id = item2.pe_id
+            multipleSelection.push(item2);
+          })
+        }
+      });
+      //开始评分按钮
+      if (multipleSelection.length == 0) {
+        this.$message.warning('请选择开始评分的考核模板');
+        return;
+      }
+      this.selectUser = multipleSelection
+      this.pf();
+      return false
+
+      this.$confirm('所选考核模板员工的绩效考核将自动进入评分流程,确认开始评分?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消'
+      }).then(() => {
+        let data = {
+          package_id: this.asstabParams.package_id, //绩效包ID
+          group_ids: JSON.stringify(multipleSelection), //考核模板列表
+          single: 0 //非单人
+        };
+        this.$axiosUser('post', '/api/pro/per/package/start_score', data).then(res => {
+          if (!res.data.data.result) {
+            let list = res.data.data.list;
+            list.forEach(item => {
+              item.successText = item.success ? '成功' : '失败';
+              item.name = employeeMap[item.employee_id].name;
+              item.reason = item.success ? '已开始评分' : item.reason;
+            });
+            this.showData = list;
+            this.isShowData = true;
+          } else {
+            this.$message.success(res.data.msg);
+          }
+          this.isChecks = false;
+          this.assDelList(); //请求绩效详情列表
+        });
+      }).catch(() => { });
+    },
+    getAssessTree(node, resolve) {
+      if (this.options && this.options.length == 0) {
+        return
+      }
+      this.tableDataLoad = true;
+      this.$axiosUser('get', 'api/pro/per/package/list', { page: 0, is_manage_scope: 1, cycle_type: node.value }).then(res => {
+        let data = res.data.data.list;
+        data.forEach(item => {
+          item.leaf = true;
+        })
+
+        resolve(data)
+      }).finally(() => {
+        this.tableDataLoad = false;
+      });
+    },
+    //请求绩效树
+    assessTree(id, id2) {
+      this.assDetLoad = true;
+      this.$axiosUser('get', '/api/pro/per/package/list', { page: 0, is_manage_scope: 1 }).then(res => {
+        if (res.data.code == 1) {
+          let data = res.data.data.list;
+          data.forEach(item => {
+            item.leaf = true;
+          })
+          let arr = [
+            { name: '月度', id: 2, list: [] },
+            { name: '日', id: 1, list: [] },
+            { name: '季度', id: 3, list: [] },
+            { name: '半年度', id: 4, list: [] },
+            { name: '年度', id: 5, list: [] },
+            { name: '自定义', id: 6, list: [] }
+          ];
+          let arr2 = [
+            { name: '月度', id: 2, list: [] },
+            { name: '日', id: 1, list: [] },
+            { name: '季度', id: 3, list: [] },
+            { name: '半年度', id: 4, list: [] },
+            { name: '年度', id: 5, list: [] },
+            { name: '自定义', id: 6, list: [] }
+          ];
+          data.forEach(item => {
+            arr.forEach(item2 => {
+              if (item2.id == item.cycle_type) {
+                item2.list.push(item);
+              }
+            });
+          });
+          arr.some((item, index) => {
+            if (item.id == id) {
+              arr2[index].list = item.list;
+              return true;
+            }
+          });
+          this.options = arr2;
+          this.$nextTick(() => {
+            this.headValue.push(id, id2);
+          })
+        }
+      });
+    },
+    navClick(item) {
+      this.navcli = item.id;
+      this.asstabParams.page = 1;
+      this.asstabParams.doing_id = item.id;
+      this.getDcl();
+      this.assDelList();
+    },
+    dept_confirm(data) {
+      //部门选择
+      this.dept_selected = { dept: [], employee: [] };
+      this.deptList_id = [];
+      this.deptVisibleName = '';
+      if (data.dept !== null && data.dept.length != 0) {
+        this.dept_selected = data;
+        data.dept.forEach((element, index) => {
+          this.deptList_id.push(element.dept_id);
+          this.deptVisibleName += element.dept_name;
+          if (data.dept.length - index > 1) {
+            this.deptVisibleName += ',';
+          }
+        });
+      }
+      this.asstabParams.page = 1;
+      this.asstabParams.dept_ids = JSON.stringify(this.deptList_id);
+      this.assDelList();
+    },
+    assDetClick(row) {
+      //列表点击
+      this.$router.push({
+        path: '/staffAssDet',
+        query: { assID: this.asstabParams.package_id, employeeID: row.id, employeeIDs: row.employee_id }
+      });
+    },
+    braSearch(data) {
+      //评分搜索
+      this.scoreGroup = this.GroupList.filter(item => item.name.includes(data));
+    }
+  },
+  beforeRouteLeave(to, from, next) {
+    if (to.name != 'staffAssDet') {
+      localStorage.removeItem('assessDetails');
     }
+    next();
   }
 };
 </script>
+<style scoped lang="scss">
+/* 归档图片动画 */
+.guidang {
+  margin-left: auto;
+  width: 70px;
+  animation: example 1s;
+}
+
+@keyframes example {
+  from {
+    transform: scale(1.4);
+  }
 
-<style scoped="scoped" lang="scss">
+  to {
+    transform: scale(1);
+  }
+}
+
+/* 归档图片动画 */
 .all {
   position: relative;
+  font-size: 14px;
   background-color: #fff;
-  padding: 20px;
+  padding: 10px 20px;
+  box-sizing: border-box;
 }
-header {
- margin-bottom: 20px;
+
+.navsvg1 {
+  font-size: 15px;
+  position: relative;
+  margin-top: 2px;
 }
-footer {
-  /deep/ .el-table__row {
-    height: 60px;
+
+.navsvg2 {
+  width: 4px;
+  height: 20px;
+  background-color: #e1e1e1;
+  margin: -20px 30px 0 30px;
+}
+
+.navsvg3 {
+  margin: -20px 20px 0 20px;
+  color: #e1e1e1;
+  display: block;
+  font-size: 18px;
+}
+
+header {
+  margin-top: 15px;
+
+  .dept_wdiv {
+    width: 200px;
+    position: relative;
+
+    .dept_inp {
+      width: 100%;
+      height: 38px;
+      position: absolute;
+      top: 0;
+      right: 0;
+      left: 0;
+      bottom: 0;
+      z-index: 9;
+      border: 1px solid #e0e0e0;
+      border-radius: 3px;
+      line-height: 32px;
+      font-size: 12px;
+      padding: 0 10px;
+      overflow: hidden;
+      white-space: nowrap;
+      text-overflow: ellipsis;
+      cursor: pointer;
+      color: #676767;
+    }
+
+    i {
+      position: absolute;
+      top: 0;
+      right: 0;
+      top: 10px;
+      right: 10px;
+      font-size: 14px;
+      color: #b5b5b5;
+    }
   }
-  // /deep/ .el-table__row .cell {
-  //   font-size: 13px;
-  // }
-  /deep/ .has-gutter tr {
-    background-color: rgb(240, 240, 240);
+
+  .navigationL {
+    width: 100%;
+    margin: 30px 0;
+    span {
+      display: flex;
+      cursor: pointer;
+      font-size: 14px;
+      width: 180px;
+      height: 60px;
+      position: relative;
+      border-radius: 3px;
+      align-items: center;
+      justify-content: center;
+      color: #303133;
+      background-color: #ecf5ff;
+      margin-bottom: 20px;
+    }
+
+    span:hover {
+      color: #428eff;
+      border: 1px solid #409EFF;
+      background-color: #ecf5ff;
+    }
+
+    /deep/ .action {
+      color: #428eff;
+      border: 1px solid #409EFF;
+      background-color: #ecf5ff;
+    }
   }
+
   /deep/ .el-table tr:hover {
     cursor: pointer;
   }
 }
-.color_blue {
-  color: #1299f9;
+
+.braTab {
+  padding: 20px 0 0 20px;
+
+  /deep/ .el-table tr:hover {
+    cursor: pointer;
+  }
+
+  /deep/ .el-table__row {
+    .cell {
+      padding-left: 10px;
+    }
+  }
+
+  /deep/ td .cell {
+    padding: 10px 0;
+  }
+}
+
+.margin-l {
+  margin-left: 10px;
+}
+
+.width-300 {
+  width: 300px;
+}
+
+.m-content {}
+
+.m-title {
+  color: #909399;
 }
+
+.ul {
+  margin: 20px 0;
+  margin-top: 0;
+}
+
+.li {
+  border-bottom: 1px solid #ebebeb;
+}
+
+.li .flex-box-ce {
+  padding: 15px 0;
+}
+
+.li:hover {
+  background-color: #f5f7fa;
+}
+
+
 </style>

+ 20 - 6
src/performance/views/assessManagement/careOf.vue

@@ -1,6 +1,12 @@
 <template>
   <div class="all">
     <div class="main">
+      <!-- <el-alert type="warning" style="margin-bottom: 15px;" :closable="false">
+        请及时修改考核表中的相关负责人员
+        <span class="blue" style="cursor: pointer; margin-left: 10px" @click="handleEdit()">去修改</span>
+      </el-alert> -->
+      <el-alert type="warning" title="如果需要修改转交人,请及时修改考核表中的相关负责人员" show-icon :closable="false"
+        style="margin-bottom: 20px;">去修改</el-alert>
       <div class="flex-box" style="height: 140px;position: relative;">
         <div class="num">1</div>
         <div style="margin-left: 30px;">
@@ -15,7 +21,8 @@
         <div style="margin-left: 30px;">
           <div class="title">选择需要转交的节点</div>
           <div style="padding-top: 10px;">
-            <el-checkbox v-for="(item, index) in selectList" :disabled="!item.num" v-model="item.isSelect" :key="item.name">{{ item.name }} ({{ item.num }})</el-checkbox>
+            <el-checkbox v-for="(item, index) in selectList" :disabled="!item.num" v-model="item.isSelect"
+              :key="item.name">{{ item.name }} ({{ item.num }})</el-checkbox>
           </div>
         </div>
       </div>
@@ -29,10 +36,14 @@
         </div>
       </div>
     </div>
-    <div class="footer" style="padding-left: 70px;margin-top: 40px;"><el-button type="primary" @click="submitForm()" round style="width: 150px;">批量转交</el-button></div>
-    <el-dialog title="转交结果" :visible.sync="isResult" width="800" :close-on-click-modal="false" :close-on-press-escape="false" :show-close="false">
+    <div class="footer" style="padding-left: 70px; margin-top: 40px;">
+      <el-button type="primary" @click="submitForm()" round style="width: 150px;">批量转交</el-button>
+    </div>
+    <el-dialog title="转交结果" :visible.sync="isResult" width="800" :close-on-click-modal="false"
+      :close-on-press-escape="false" :show-close="false">
       <div>
-        <div style="margin-top: 20px;border: 1px solid #f1f1f1;max-height: 500px;overflow-y: auto;" class="scroll-bar">
+        <el-alert type="warning" title="请及时修改考核表中的相关负责人员" show-icon :closable="false"></el-alert>
+        <div style="margin-top: 20px;border: 1px solid #f1f1f1;max-height: 500px; overflow-y: auto;" class="scroll-bar">
           <div class="flex-box-ce results" style="font-weight: 600;">
             <div style="border-right: 1px solid #f1f1f1;width: 50px;">序号</div>
             <div class="flex-1" style="border-right: 1px solid #f1f1f1;">被转交对象</div>
@@ -107,6 +118,7 @@ export default {
     this.employees = this.$getEmployeeMap();
   },
   methods: {
+    handleEdit() {},
     empty() {
       this.to_employee_id = '';
       this.employee_id = '';
@@ -185,6 +197,7 @@ export default {
       let url = data.node_id ? 'api/pro/per/package/transfer' : 'api/pro/per/package/transfer_manager';
       this.$axiosUser('post', url, data)
         .then(res => {
+          console.log(res);
           data.msg = res.data.msg;
           data.status = 1;
           this.results.unshift(data);
@@ -195,7 +208,7 @@ export default {
           this.results.unshift(data);
         })
         .finally(() => {
-          this.resultIndex++;
+          this.resultIndex ++;
           this.opneWebSocket();
         });
     },
@@ -297,7 +310,8 @@ export default {
   position: relative;
   font-size: 14px;
   background-color: #fff;
-  padding: 20px;
+  padding: 0 20px;
+  box-sizing: border-box;
 }
 .title {
   font-size: 16px;

+ 39 - 31
src/performance/views/assessManagement/classDtail.vue

@@ -24,7 +24,7 @@
       <div class="table-box" style="margin-top: 30px;">
         <el-table :data="tableData" :header-cell-style="{ background: '#ECF5FF' }" v-loading="loading">
           <el-table-column prop="name" label="等级配置名称"></el-table-column>
-<!--          <el-table-column prop="pl_exec" label="状态">
+          <!--          <el-table-column prop="pl_exec" label="状态">
             <template slot-scope="scope">
               <span v-if="scope.row.pl_exec == 0" class="orange">未执行配置</span>
               <span v-else class="blue">已执行配置</span>
@@ -67,12 +67,7 @@
               <span>{{ scope.row.score_no }}人</span>
             </template>
           </el-table-column>
-          <el-table-column label="操作">
-            <template slot-scope="scope">
-              <el-button @click="compileIndex(scope.row)" type="text">编辑</el-button>
-              <el-button @click="deleteIndex(scope.row)" type="text">删除</el-button>
-            </template>
-          </el-table-column>
+
           <el-table-column label="绩效确认">
             <template slot-scope="scope">
               <!-- <el-link> -->
@@ -82,7 +77,14 @@
                   已配置(<span v-if="scope.row.plc.status" class="blue">已确认</span><span v-else class="orange">未确认</span>)
                 </template>
               </el-link>
-              <el-link type="success" v-if="scope.row.plc && scope.row.plc.status" style="margin-left: 10px;" @click="cxFq(scope.row)">重新发起</el-link>
+              <el-link type="success" v-if="scope.row.plc && scope.row.plc.status" style="margin-left: 10px;"
+                @click="cxFq(scope.row)">重新发起</el-link>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作">
+            <template slot-scope="scope">
+              <el-button @click="compileIndex(scope.row)" type="text">编辑</el-button>
+              <el-button @click="deleteIndex(scope.row)" type="text">删除</el-button>
             </template>
           </el-table-column>
         </el-table>
@@ -100,29 +102,38 @@
             <div style="margin-bottom: 20px;" class="fontColorC">检查确认要求:(分值或等级分布人数,至少填一项)</div>
             <div>
               <div class="flex-box" style="margin-bottom: 20px;">
-                <label style="min-width: 80px;font-size: 14px;color: #606266;font-weight: 600;padding: 0px 10px;">分值要求</label>
+                <label
+                  style="min-width: 80px;font-size: 14px;color: #606266;font-weight: 600;padding: 0px 10px;">分值要求</label>
                 <el-switch v-model="affirmFrom.config.scope.enable" :active-value="1" :inactive-value="0"></el-switch>
               </div>
-              <div style="margin-bottom: 20px;padding-left: 10px;" class="flex-box-ce" v-if="affirmFrom.config.scope.enable">
-                <el-input v-model.trim.number="affirmFrom.config.scope.min" style="width: 80px;" placeholder="最小值"></el-input>
+              <div style="margin-bottom: 20px;padding-left: 10px;" class="flex-box-ce"
+                v-if="affirmFrom.config.scope.enable">
+                <el-input v-model.trim.number="affirmFrom.config.scope.min" style="width: 80px;"
+                  placeholder="最小值"></el-input>
                 <span class="inputs-text"><span>≤</span>分数 ≤</span>
-                <el-input v-model.trim.number="affirmFrom.config.scope.max" style="width: 80px" placeholder="最大值"></el-input>
+                <el-input v-model.trim.number="affirmFrom.config.scope.max" style="width: 80px"
+                  placeholder="最大值"></el-input>
               </div>
               <div class="flex-box" style="margin-bottom: 20px;">
-                <label style="min-width: 80px;font-size: 14px;color: #606266;font-weight: 600;padding:0 10px;">等级分布人数要求</label>
+                <label
+                  style="min-width: 80px;font-size: 14px;color: #606266;font-weight: 600;padding:0 10px;">等级分布人数要求</label>
                 <el-switch v-model="affirmFrom.config.levels.enable" :active-value="1" :inactive-value="0"></el-switch>
               </div>
               <template v-if="affirmFrom.config.levels.enable">
                 <div class="fontColorC" style="font-size: 12px;padding-left: 10px;margin-bottom: 10px;">
-                  参与人数必须与分配名额一致,参与人数为<span class="blue" style="font-weight:700;">{{ userSum }}</span>人,已分配名额<span class="blue" style="font-weight:700;">{{ getSum }}</span>人
+                  参与人数必须与分配名额一致,参与人数为 <span class="blue" style="font-weight:700;">{{ userSum }}</span> 人,已分配名额 <span
+                    class="blue" style="font-weight:700;">{{ getSum }}</span> 人
                 </div>
                 <div style="margin-bottom: 20px;padding-left: 10px;">
-                  <div class="flex-box-ce" style="margin-bottom: 8px;" v-for="(item, index) in affirmFrom.config.levels.levels" :key="index">
+                  <div class="flex-box-ce" style="margin-bottom: 8px;"
+                    v-for="(item, index) in affirmFrom.config.levels.levels" :key="index">
                     <el-input v-model="item.name" placeholder="请输入" style="width: 150px;"></el-input>
-                    <el-input class="inputs-text" :key="index" v-model="item.count" placeholder="请输入" style="width: 150px;"></el-input>
+                    <el-input class="inputs-text" :key="index" v-model="item.count" placeholder="请输入"
+                      style="width: 150px;"></el-input>
                     <div>{{ item.count }}人</div>
                     <template v-if="!plc||!plc.status">
-                      <i class="el-icon-delete" v-if="affirmFrom.config.levels.levels.length!=1" @click="deleteInput(index)"></i>
+                      <i class="el-icon-delete" v-if="affirmFrom.config.levels.levels.length!=1"
+                        @click="deleteInput(index)"></i>
                     </template>
                   </div>
                   <div class="blue inputs-add" v-if="!plc||!plc.status">
@@ -150,7 +161,8 @@
     <BrawerBox :drawerTitle="configurationName" :showDrawer.sync="isConfiguration" :closeModal="false">
       <template slot="main">
         <el-form :rules="classRules" :model="classFrom" ref="configuration" label-width="120px">
-          <el-form-item label="等级配置名称:" prop="name"><el-input maxlength="100" show-word-limit placeholder="请输入等级配置名称" v-model="classFrom.name" style="width: 250px;"></el-input></el-form-item>
+          <el-form-item label="等级配置名称:" prop="name"><el-input maxlength="100" show-word-limit placeholder="请输入等级配置名称"
+              v-model="classFrom.name" style="width: 250px;"></el-input></el-form-item>
           <el-form-item label="参与人员:" prop="employee_ids">
             <div class="border flex-box-ce">
               <div class="flex-1" v-if="users.length == 0">请选择参与人员</div>
@@ -182,25 +194,21 @@
       </template>
     </BrawerBox>
     <!-- 选择子管理员 -->
-    <EmployeeSelector
-      title="选择人员"
-      :selected="selected"
-      :user_employee_list="true"
-      :employee_list="employee_list"
-      :visible.sync="setUser"
-      :is_filtration_creator="false"
-      @confirm="confirm"
-    />
+    <EmployeeSelector title="选择人员" :selected="selected" :user_employee_list="true" :employee_list="employee_list"
+      :visible.sync="setUser" :is_filtration_creator="false" @confirm="confirm" />
     <!--执行等级配置  -->
     <BrawerBox drawerTitle="执行等级配置" :showDrawer.sync="isExecute">
       <template slot="main">
-        <div class="flex-box-ce"><el-input prefix-icon="el-icon-search" placeholder="搜索考核" v-model="searchVal"></el-input></div>
+        <div class="flex-box-ce"><el-input prefix-icon="el-icon-search" placeholder="搜索考核"
+            v-model="searchVal"></el-input></div>
         <template v-if="classList.length > 0">
           <div class="flex-box-ce li" style="margin-top: 20px;">
-            <el-checkbox class="flex-box-ce" v-model="isAllSelectIndex" label="全选" style="padding: 15px 0;"></el-checkbox>
+            <el-checkbox class="flex-box-ce" v-model="isAllSelectIndex" label="全选"
+              style="padding: 15px 0;"></el-checkbox>
           </div>
           <ul class="ul">
-            <li v-for="(item, index) in classList" :key="index" class="flex-box-ce li" v-if="item.name.indexOf(searchVal) >= 0">
+            <li v-for="(item, index) in classList" :key="index" class="flex-box-ce li"
+              v-if="item.name.indexOf(searchVal) >= 0">
               <el-checkbox class="flex-box-ce" v-model="item.check" style="padding: 15px 0;">
                 <div class="flex-box-ce">
                   <div class="flex-1">{{ item.name }}</div>
@@ -665,7 +673,7 @@ export default {
 <style scoped="scoped" lang="scss">
   .el-icon-delete {
     margin-left: 10px;
-    font-size: 24px;
+    font-size: 14px;
     color: #777777;
     cursor: pointer;
   }

+ 72 - 33
src/performance/views/assessManagement/evaluateSet.vue

@@ -1,16 +1,23 @@
 <template>
   <div class="all">
+    <div class="title">考核表列表</div>
+    <!-- <el-alert type="warning" title="相同岗位且考核流程一致时,可建立同一个考核表;考核流程不同时,请分开多个考核表进行考核" :closable="false"></el-alert> -->
     <header class="flex-box-ce">
-      <div class="flex-1"><el-input prefix-icon="el-icon-search" placeholder="搜索考核模板" v-model="search_words" class="width-250" clearable></el-input></div>
+      <div class="flex-1"><el-input prefix-icon="el-icon-search" placeholder="搜索考核表" v-model="search_words"
+          class="width-250" clearable></el-input></div>
       <div class="flex-box-ce" v-if="$isAuthoritys_jx($14)">
-        <el-button type="text" style="margin-right: 10px;text-decoration:underline" @click="openUsers">无考核模板人员</el-button>
-        <el-button type="primary" style="margin-right: 10px;" @click="handleCommand('A')">新增考核模板</el-button>
-        <el-button class="primaryBtn" @click="handleCommand('B')">复制考核模板</el-button>
+        <el-button-group>
+          <!-- <el-button type="primary" icon="el-icon-upload2" @click="handleCommand('A')">导入考核表</el-button> -->
+          <el-button type="primary" icon="el-icon-folder-add" @click="handleCommand('A')">创建考核表</el-button>
+          <el-button type="primary" icon="el-icon-document-copy" @click="handleCommand('B')">复制考核表</el-button>
+          <el-button type="primary" icon="el-icon-user" @click="openUsers">未参与考核人员</el-button>
+        </el-button-group>
+
       </div>
     </header>
-    <div class="main">
-      <div style="margin-top: 20px;">
-        <div class="orange">相同岗位且考核流程一致时,可建立同一个考核模板;考核流程不同时,请分开多个考核模板进行考核</div>
+    <div class="main" style="margin-top: 10px;">
+      <div>
+        <el-alert type="warning" title="创建考核表是发起绩效考核的必要前提" :closable="false" show-icon></el-alert>
         <el-table :data="tableData" class="table-box scroll-bar" style="width: 100%;" v-loading="loading">
           <el-table-column prop="name" sortable label="名称">
             <template slot-scope="scope">
@@ -26,29 +33,33 @@
           <el-table-column prop="address" label="操作">
             <template slot-scope="scope">
               <div class="is">
-                <el-link type="primary" @click="compile(scope.row,'1')">人员分组</el-link>
-                <el-link type="primary" style="margin: 0 10px;" @click="compile(scope.row,'2')">考核模板</el-link>
-                <el-link type="primary" @click="compile(scope.row,'3')">具体流程</el-link>
-
-              <!-- <el-tooltip effect="dark" content="编辑" placement="top"><i class="el-icon-edit orange" @click="compile(scope.row)"></i></el-tooltip>
+                <el-link type="primary" @click="compile(scope.row,'2')" style="margin-right: 10px;">考核内容</el-link>
+                <el-link type="primary" @click="compile(scope.row,'1')" style="margin-right: 10px;">人员设置</el-link>
+                <el-link type="primary" @click="compile(scope.row,'3')" style="margin-right: 10px;">流程设置</el-link>
+                <!-- <el-tooltip effect="dark" content="编辑" placement="top"><i class="el-icon-edit orange" @click="compile(scope.row)"></i></el-tooltip>
                 <el-tooltip effect="dark" content="预览流程" placement="top"><i class="el-icon-tickets blue" @click="preview(scope.row)"></i></el-tooltip>
                 <el-tooltip effect="dark" content="删除" placement="top"><i class="el-icon-delete red" @click="deleteItem(scope.row.id)"></i></el-tooltip> -->
+                <el-dropdown placement="bottom" :show-timeout="150" :hide-timeout="150">
+                  <span class="el-dropdown-links">···</span>
+                  <el-dropdown-menu slot="dropdown">
+                    <el-dropdown-item :disabled="false">
+                      <el-button type="text" class="color-red" v-loading.fullscreen.lock="bodyLoad"
+                        @click.stop="preview(scope.row)">预览流程</el-button>
+                    </el-dropdown-item>
+                    <el-dropdown-item :disabled="false">
+                      <el-button type="text" class="color-red" v-loading.fullscreen.lock="bodyLoad"
+                        @click.stop="deleteItem(scope.row.id)">删除</el-button>
+                    </el-dropdown-item>
+                  </el-dropdown-menu>
+                </el-dropdown>
               </div>
-              <el-dropdown placement="bottom" :show-timeout="150" :hide-timeout="150">
-                <span class="el-dropdown-links">···</span>
-                <el-dropdown-menu slot="dropdown">
-                  <el-dropdown-item :disabled="false">
-                    <el-button type="text" class="color-red" v-loading.fullscreen.lock="bodyLoad" @click.stop="preview(scope.row)">预览流程</el-button>
-                  </el-dropdown-item>
-                  <el-dropdown-item :disabled="false">
-                    <el-button type="text" class="color-red" v-loading.fullscreen.lock="bodyLoad" @click.stop="deleteItem(scope.row.id)">删除</el-button>
-                  </el-dropdown-item>
-                </el-dropdown-menu>
-              </el-dropdown>
+
+
             </template>
           </el-table-column>
         </el-table>
-        <Pagination :page="page" :page_size="page_size" :total="total" @handleSizeChange="handleSizeChange" @handleCurrentChange="handleCurrentChange"></Pagination>
+        <Pagination :page="page" :page_size="page_size" :total="total" @handleSizeChange="handleSizeChange"
+          @handleCurrentChange="handleCurrentChange"></Pagination>
       </div>
     </div>
 
@@ -57,11 +68,13 @@
         <div class="flex-box-ce">
           <el-input prefix-icon="el-icon-search" placeholder="搜索考核" v-model="search_words2"></el-input>
           <el-select v-model="cycle_type" placeholder="" style="margin: 0 10px;">
-            <el-option v-for="item in $getCycleType_jx()" :key="item.value" :label="item.label" :value="item.value"></el-option>
+            <el-option v-for="item in $getCycleType_jx()" :key="item.value" :label="item.label"
+              :value="item.value"></el-option>
           </el-select>
         </div>
         <ul class="ul" v-if="allData.length > 0">
-          <li v-for="(item, index) in allData" :key="index" class="flex-box-ce li" v-if="item.name.indexOf(search_words2) >= 0">
+          <li v-for="(item, index) in allData" :key="index" class="flex-box-ce li"
+            v-if="item.name.indexOf(search_words2) >= 0">
             <el-radio v-model="cycleId" :label="item.id" class="flex-box-ce flex-1" style="padding: 15px 0;">
               <div class="flex-box-ce">
                 <div class="flex-1">{{ item.name }}</div>
@@ -80,9 +93,11 @@
 
     <BrawerBox drawerTitle="无考核模板人员" :showDrawer.sync="isNoUser">
       <template slot="main">
-        <div class="flex-box-ce"><el-input prefix-icon="el-icon-search" placeholder="人员搜索" v-model="search_words3"></el-input></div>
+        <div class="flex-box-ce"><el-input prefix-icon="el-icon-search" placeholder="人员搜索"
+            v-model="search_words3"></el-input></div>
         <ul class="ul" v-if="isNoUserList.length > 0">
-          <li v-for="(item, index) in isNoUserList" :key="index" class="flex-box-ce li" style="padding: 15px 0;" v-if="item.name.indexOf(search_words3) >= 0">
+          <li v-for="(item, index) in isNoUserList" :key="index" class="flex-box-ce li" style="padding: 15px 0;"
+            v-if="item.name.indexOf(search_words3) >= 0">
             <userImage :user_name="item.name" fontSize="14" :img_url="item.img_url"></userImage>
             <div class="flex-box-v" style="margin: 0 10px;">
               <div>{{ item.name }}</div>
@@ -190,7 +205,7 @@ export default {
         .catch(() => {});
     },
     //编辑
-    compile(item,index) {
+    compile(item, index) {
       let http = this.$axiosUser('get', '/api/pro/per/evaluation/group_detail', { id: item.id });
       let http2 = this.$axiosUser('get', '/api/pro/per/evaluation/manager', { id: item.id });
       Promise.all([http, http2]).then(res => {
@@ -261,6 +276,26 @@ export default {
 };
 </script>
 <style scoped="scoped">
+.title {
+  font-weight: 600;
+  margin-bottom: 30px;
+  position: relative;
+  left: 0;
+  font-size: 20px;
+  color: #606266 !important;
+  padding: 0 10px;
+  &::after {
+    content: " ";
+    position: absolute;
+    width: 4px;
+    height: 18px;
+    background-color: #409EFF;
+    left: 0px;
+    top: 5px;
+  }
+}
+
+
 .el-dropdown-links {
   font-size: 20px;
   cursor: pointer;
@@ -270,10 +305,14 @@ export default {
 /deep/ .el-table tr:hover {
   cursor: pointer;
 }
-.is i {
-  font-size: 18px;
-  padding: 0 10px;
-  cursor: pointer;
+.is {
+  display: flex;
+  align-items: center;
+  i {
+    font-size: 18px;
+    padding: 0 10px;
+    cursor: pointer;
+  }
 }
 .all {
   padding: 20px;

+ 39 - 43
src/performance/views/assessManagement/sponsor/sponsorAssess.vue

@@ -9,7 +9,7 @@
             <div class="border flex-box-ce">
               <div class="fontColorC flex-1" v-if="selectedAG.length == 0">请选择考核模板</div>
               <div v-else class="flex-box">
-                <div style="width: 220px;margin-right: 10px;" class="font-flex-word">
+                <div style="width: 220px; margin-right: 10px;" class="font-flex-word">
                   <span v-for="(item, index) in selectedAG" :key="index">
                     <i v-if="index != 0">,</i>
                     {{ item.name }}
@@ -26,34 +26,25 @@
 
           <el-form-item label="时间周期" :required="true">
             <!-- 天 -->
-            <el-date-picker v-if="time_typeap == 1" v-model="export_from" type="date" value-format="yyyy年MM月dd日" class="inp-width" placeholder="请选择"></el-date-picker>
+            <el-date-picker v-if="time_typeap == 1" v-model="export_from" type="date" value-format="yyyy年MM月dd日"
+              class="inp-width" placeholder="请选择"></el-date-picker>
             <!-- 月 -->
-            <el-date-picker v-else-if="time_typeap == 2" v-model="export_from" class="inp-width" type="month" value-format="yyyy年MM月" placeholder="请选择"></el-date-picker>
+            <el-date-picker v-else-if="time_typeap == 2" v-model="export_from" class="inp-width" type="month"
+              value-format="yyyy年MM月" placeholder="请选择"></el-date-picker>
             <!-- 季度 -->
-            <season v-else-if="time_typeap == 3" ref="season" :isActive="true" class="inp-width" @confirm="export_quarter_confirm"></season>
+            <season v-else-if="time_typeap == 3" ref="season" :isActive="true" class="inp-width"
+              @confirm="export_quarter_confirm"></season>
             <!-- 半年度 -->
-            <season
-              v-else-if="time_typeap == 4"
-              ref="season"
-              :isActive="true"
-              :halfyear="time_typeap == 4 ? true : false"
-              class="inp-width"
-              @confirm="export_quarter_confirm"
-            ></season>
+            <season v-else-if="time_typeap == 4" ref="season" :isActive="true"
+              :halfyear="time_typeap == 4 ? true : false" class="inp-width" @confirm="export_quarter_confirm"></season>
             <!-- 年 -->
-            <el-date-picker v-else-if="time_typeap == 5" v-model="export_from" class="inp-width" type="year" value-format="yyyy年" placeholder="请选择"></el-date-picker>
+            <el-date-picker v-else-if="time_typeap == 5" v-model="export_from" class="inp-width" type="year"
+              value-format="yyyy年" placeholder="请选择"></el-date-picker>
 
             <!-- 自定义 -->
             <div v-else-if="time_typeap == 6">
-              <el-date-picker
-                v-model="export_from"
-                type="daterange"
-                value-format="yyyy年MM月dd日"
-                class="inp-width"
-                range-separator="至"
-                start-placeholder="开始日期"
-                end-placeholder="结束日期"
-              ></el-date-picker>
+              <el-date-picker v-model="export_from" type="daterange" value-format="yyyy年MM月dd日" class="inp-width"
+                range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
             </div>
           </el-form-item>
 
@@ -67,10 +58,10 @@
           <div class="title" style="margin-bottom: 20px;">考核设置</div>
           <el-form class="drawerForm" label-width="120px">
             <el-form-item label="沟通反馈">
-                <el-radio-group v-model="drawer_switch1">
-                  <el-radio :label="true">开启</el-radio>
-                  <el-radio :label="false">关闭</el-radio>
-                </el-radio-group>
+              <el-radio-group v-model="drawer_switch1">
+                <el-radio :label="true">开启</el-radio>
+                <el-radio :label="false">关闭</el-radio>
+              </el-radio-group>
             </el-form-item>
             <el-form-item label="评分分数">
               <el-switch v-model="dswScore_details1"></el-switch>
@@ -81,12 +72,12 @@
               </span>
               <span class="advancedConfig" @click="advancedConfig1 = !advancedConfig1">
                 高级配置
-                <i  :class="advancedConfig1 ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"></i>
+                <i :class="advancedConfig1 ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"></i>
               </span>
               <div v-if="advancedConfig1" class="scoreTab">
                 <div class="flex-box flex-d-center"><span>评分可见权限</span></div>
 
-                <el-table :data="advconTab1" style="width: 100%" >
+                <el-table :data="advconTab1" style="width: 100%">
                   <el-table-column prop="name"></el-table-column>
                   <el-table-column prop="name" label="本人评分">
                     <template slot-scope="scope">
@@ -102,7 +93,7 @@
               </div>
             </el-form-item>
             <el-form-item label="评分说明">
-              <el-switch v-model="dswScore_opinion1"></el-switch>
+              <el-switch v-model="dswScore_opinion1" size="small"></el-switch>
               <span>
                 对被考核人
                 <span v-if="!dswScore_opinion1">不</span>
@@ -110,11 +101,11 @@
               </span>
               <span class="advancedConfig" @click="advancedConfig2 = !advancedConfig2">
                 高级配置
-                  <i :class="advancedConfig2 ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"></i>
+                <i :class="advancedConfig2 ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"></i>
               </span>
               <div v-if="advancedConfig2" class="scoreTab">
                 <div class="flex-box flex-d-center"><span>评分人意见可见权限</span></div>
-                <el-table :data="advconTab2" style="width: 100%"  class="">
+                <el-table :data="advconTab2" style="width: 100%" class="">
                   <el-table-column prop="name"></el-table-column>
                   <el-table-column prop="name" label="本人说明">
                     <template slot-scope="scope">
@@ -135,19 +126,21 @@
               <div class="drawer_prompt">设置考核结果何时对被考核人可见</div>
             </el-form-item>
             <el-form-item>
-               <div class="flex-box-end" style="margin-top:20px;"><el-button type="primary"   @click="initiateAssess(true)">发起考核</el-button></div>
+              <div class="flex-box-end" style="margin-top:20px;"><el-button type="primary"
+                  @click="initiateAssess(true)">发起考核</el-button></div>
             </el-form-item>
           </el-form>
         </div>
       </div>
     </footer>
     <SelectAG :visible.sync="visible" @confirm="confirmAG" :selectedAG="selectedAG" title="考核模板筛选"></SelectAG>
-    <el-dialog title="提示" class="dialog" :visible.sync="isShowFy" width="500px" >
+    <el-dialog title="提示" class="dialog" :visible.sync="isShowFy" width="500px">
       <div>
         <div style="text-align: center;font-size: 18px;font-weight: 700;">确认发起{{assessName}}?</div>
         <div v-if="isFy" style="margin-top: 30px;">
           <div class="fontColorC" style="margin-bottom: 5px;">复用往期绩效等级配置</div>
-          <el-cascader v-model="headValue" :options="options" :show-all-levels="false" :props="{ expandTrigger: 'hover', label: 'name', value: 'id', children: 'list' }"></el-cascader>
+          <el-cascader v-model="headValue" :options="options" :show-all-levels="false"
+            :props="{ expandTrigger: 'hover', label: 'name', value: 'id', children: 'list' }"></el-cascader>
         </div>
       </div>
       <span slot="footer" class="dialog-footer">
@@ -156,21 +149,23 @@
       </span>
     </el-dialog>
 
-    <el-dialog title="提交结果" :visible.sync="isResult"  width="500px" :close-on-click-modal="false" :close-on-press-escape="false" :show-close="false">
-    	<div>
-    		<el-progress :text-inside="true" :stroke-width="18" :percentage="percentage"></el-progress>
+    <el-dialog title="提交结果" :visible.sync="isResult" width="500px" :close-on-click-modal="false"
+      :close-on-press-escape="false" :show-close="false">
+      <div>
+        <el-progress :text-inside="true" :stroke-width="18" :percentage="percentage"></el-progress>
         <div v-if="percentage==100" style="font-size: 18px;margin: 20px 0;" class="flex-box-v flex-center-center">
           <i class="el-icon-success blue" style="font-size: 46px;margin-bottom: 10px;"></i>
           <div>全部发起成功</div>
         </div>
         <div v-if="not_reuse_employee_id.length>0">
-            检测到 <span class="orange" style="font-size: 18px;">{{not_reuse_employee_id.length}}</span> 人未成功复用往期绩效等级配置,<span class="blue" style=" cursor: pointer;" @click="openUrl(true)">去处理</span>
+          检测到 <span class="orange" style="font-size: 18px;">{{not_reuse_employee_id.length}}</span> 人未成功复用往期绩效等级配置,<span
+            class="blue" style=" cursor: pointer;" @click="openUrl(true)">去处理</span>
         </div>
-    		<div class="flex-box-end" style="margin-top: 20px;" v-if="percentage==100">
+        <div class="flex-box-end" style="margin-top: 20px;" v-if="percentage==100">
           <el-button plain @click="isResult = false">关 闭</el-button>
           <el-button type="primary" @click="openUrl()" size="small">去查看</el-button>
-    		</div>
-    	</div>
+        </div>
+      </div>
     </el-dialog>
   </div>
 </template>
@@ -565,12 +560,13 @@ export default {
       font-size: 16px;
       color: #525252;
       position: relative;
-      padding-left: 5px;
+      padding-left: 12px;
+      font-weight: 600;
     }
     .title::after{
       content: " ";
       position: absolute;
-      width: 2px;
+      width: 4px;
       height: 16px;
       background-color: #409EFF;
       left: 0;

+ 2619 - 0
src/performance/views/assessManagement/staffAssDet copy.vue

@@ -0,0 +1,2619 @@
+<template>
+  <div class="all boxMinHeight">
+    <template v-if="isDetails">
+      <PageHead phName="员工绩效详情"></PageHead>
+      <div class="flex-box-ce" style="position: absolute;right: 20px;top: 20px;z-index: 2;">
+        <el-select v-model="headvalue" style="width: 300px;" placeholder="请选择" v-if="!isDisabled">
+          <el-option v-for="item in headoptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
+        </el-select>
+        <div v-else class="fontColorB font-flex-word" style="width: 250px;">{{ packageName }}</div>
+      </div>
+      <header v-loading="staffLoad">
+        <div class="flex-box-ce head">
+          <div class="flex-box-ce head2User flex-1">
+            <userImage class="fl" :id="remployee.id" :user_name="remployee.name" :img_url="remployee.img_url"
+              width="50px" height="50px"></userImage>
+            <div class="headTname">
+              <div style="">{{ remployee.name }}</div>
+              <span v-for="(item, index) in remployee.employee_detail.dept_list" :key="index"
+                v-if="remployee.employee_detail.dept_list.length > 0">
+                <span>{{ item.dept_name }}</span>
+                <span v-if="remployee.employee_detail.dept_list.length - index > 1">,</span>
+              </span>
+            </div>
+            <img v-if="has_finish" src="static/images/guidang.png" class="guidang">
+          </div>
+          <template v-if="!gradeBegin">
+            <div class="button-width" v-if="!has_finish">
+              <el-button-group>
+                <!-- 撤销上一次操作 -->
+                <template v-if="revocationShow">
+                  <el-button @click="isShowCx = true" type="primary">撤销上一次操作</el-button>
+                </template>
+
+                <!-- 目标制定节点 -->
+                <template v-if="isShowTargetBtn">
+                  <el-button type="primary" icon="el-icon-s-flag" @click="openFormulate()">制定目标</el-button>
+                  <el-button type="primary" icon="el-icon-mouse" @click="submit()">提交</el-button>
+                </template>
+
+                <!-- 目标确认 -->
+                <template v-if="isShowConfirmBtn">
+                  <el-button type="primary" @click="gradeOk">同意</el-button>
+                  <el-button class="red" type="danger" plain @click="gradeTurn"
+                    style="margin-left: -2px;background-color: #fff;">驳回</el-button>
+                  <el-button v-if="isUpdateIndex" @click="openFormulate()">修改目标</el-button>
+                </template>
+
+                <!-- 录入结果值 -->
+                <el-button v-if="resultButShow" @click="openResult()" type="primary" icon="el-icon-edit-outline">{{
+                  resultStr
+                  }}</el-button>
+                <!-- 审批 -->
+                <template v-if="examineButShow">
+                  <el-button type="primary" icon="el-icon-check" @click="gradeOk">同意</el-button>
+                  <el-button type="danger" icon="el-icon-close" class="red" plain v-if="isAction" @click="gradeTurn"
+                    style="margin-left: -2px;background-color: #fff;">驳回</el-button>
+                </template>
+                <!-- 评分 -->
+                <el-button type="primary" icon="el-icon-finished">关联OKR</el-button>
+                <el-button type="primary" icon="el-icon-finished" v-if="gradeButShow" @click="gradeClick">评分</el-button>
+                <el-button type="primary" icon="el-icon-tickets" v-if="recordsManagement"
+                  @click="isTrack = true">管理记录</el-button>
+                <el-button type="primary" icon="el-icon-pie-chart" v-if="actionButShow"
+                  @click="isPlan = true">执行计划</el-button>
+                <el-button type="primary" icon="el-icon-chat-dot-round" v-if="feedbackBut"
+                  @click="communication = true">沟通反馈</el-button>
+              </el-button-group>
+              <!-- 主次管理员,被考核人上级 -->
+              <template v-if="$getRole(1) || isSj">
+                <el-dropdown style="margin-left:10px;" @command="handleCommand">
+                  <el-button>管理</el-button>
+                  <el-dropdown-menu slot="dropdown">
+                    <el-dropdown-item v-for="(item, index) in dropdownMenu" :key="index" :command="item.key"
+                      :divided="item.bordok" v-if="item.isShow">
+                      {{ item.name }}
+                    </el-dropdown-item>
+                  </el-dropdown-menu>
+                </el-dropdown>
+              </template>
+            </div>
+          </template>
+        </div>
+        <!-- 流程 -->
+        <div class="flex-box-ce flex-d-wrap">
+          <div v-for="(item, index) in flow" :key="index"
+            :class="[item.status == 1 ? 'flow-item-color' : '', index == 0 ? 'flow-item-start' : 'flow-item']"
+            class="flex-box-ce">
+            <el-tooltip effect="dark" :content="item.code == 'execution' ? execution : item.remarks" placement="top">
+              <span class="flow-box">
+                <span>{{ index + 1 }}.{{ item.remark }}</span>
+                <span v-if="item.code == 'execution'">
+                  <i class="el-icon-warning-outline"></i>
+                  :
+                </span>
+                <template v-if="item.target.length > 0">
+                  <span v-for="(item2, index2) in item.target" :key="index2">
+                    {{ item2.employee_name }}
+                    <span v-if="item.target.length - index2 > 1">,</span>
+                  </span>
+                </template>
+              </span>
+            </el-tooltip>
+            <i class="el-icon-success blue" v-if="item.status == 2" style="margin-right:10px;"></i>
+            <div @click.stop="processDet(item)" style="width: 20px;" class="dian"
+              v-if="item.target.length > 0 && !gradeBegin">
+              <i class="el-icon-more detailsPonit"></i>
+            </div>
+            <img src="static/images/jt.png" class="flow-img"
+              v-if="index != (flow.length - 1) || flow[flow.length - 1].status == 2">
+          </div>
+
+          <template v-if="flow.length > 0">
+            <div class="flow-item flex-box-ce flex-center-center" v-if="flow[flow.length - 1].status == 2">
+              <span class="flex-1">{{ flow.length + 1 }}.结束</span>
+              <i class="el-icon-success blue" style="margin-right:10px;"></i>
+            </div>
+          </template>
+        </div>
+        <!-- 考核结果 -->
+        <div class="flex-box-end flex-v-ce" style="margin-top: 20px;">
+          <template v-if="dimension.length > 0">
+            <div class="flex-box-ce result" v-if="dimension[0].final_point" style="margin-right: 20px;">
+              <span style="padding-right: 20px;">考核结果分数:{{ dimension[0].final_point }}分</span>
+              <span>等级:{{ dimension[0].final_level }}</span>
+            </div>
+          </template>
+          <el-tooltip placement="bottom">
+            <div class="popover-box" slot="content">
+              <div class="popover-title">开启显示更多可浏览全部考核内容</div>
+              <div class="popover-content">点击右边箭头和滑动下方滚动条都可以查看更多内容</div>
+            </div>
+            <el-switch v-model="isShowOneselfScore" active-text="显示更多">
+            </el-switch>
+          </el-tooltip>
+        </div>
+
+        <!-- 表格 -->
+        <div class="dimensionCla" v-loading="tableLoad">
+          <!-- 点击滚动 -->
+          <TableBox :tableData="dimension" :isShowYd="isShowOneselfScore"
+            :headerCellStyle="{ background: '#ECF5FF', textAlign: 'center' }" :objectSpanMethod="objectSpanMethod">
+            <el-table-column prop="theDimension" width="80" label="维度" align="center">
+              <template slot-scope="scope">
+                <span style="width: 13px;display: inline-block;">{{ scope.row.theDimension }}</span>
+                <template v-if="calc_dimension && (scope.row.type == 1 || scope.row.type == 2)">
+                  <div v-if="!scope.row.toScore">({{ scope.row.dimension_weight }}%)</div>
+                </template>
+              </template>
+            </el-table-column>
+            <el-table-column prop="name" label="指标名称" min-width="220">
+              <template slot-scope="scope">
+                <!--                   <template v-if="Number(scope.row.weight) > 0">
+                     <PreBox :value="scope.row.name+'(权重:'+scope.row.weight+'%)'"></PreBox>
+                   </template> -->
+                <PreBox :value="scope.row.name"></PreBox>
+              </template>
+            </el-table-column>
+            <el-table-column prop="name" label="权重" align="center" width="60">
+              <template slot-scope="scope">
+                <span v-if="Number(scope.row.weight) > 0">{{ scope.row.weight }}%</span>
+                <span v-else>--</span>
+              </template>
+            </el-table-column>
+            <template v-if="isShowOneselfScore">
+              <el-table-column prop="type" label="指标类型">
+                <template slot-scope="scope">
+                  <span v-if="scope.row.type == 1">量化指标</span>
+                  <span v-if="scope.row.type == 2">非量化指标</span>
+                  <span v-if="scope.row.type == 3">额外加分项</span>
+                  <span v-if="scope.row.type == 4">额外扣分项</span>
+                </template>
+              </el-table-column>
+            </template>
+
+            <el-table-column prop="target" label="目标值" align="left" min-width="150" v-if="getTableItem('target')">
+              <template slot-scope="scope">
+                <div v-if="scope.row.target != '-' && scope.row.target != undefined && scope.row.target != '0'">
+                  目标值:
+                  <span>{{ scope.row.target + '' + scope.row.unit }}</span>
+                </div>
+                <span v-else>-</span>
+                <div v-if="scope.row.result !== null && scope.row.result !== '' && scope.row.result !== undefined"
+                  class="orange">
+                  <template v-if="scope.row.type == 1">
+                    结果值: <span>{{ scope.row.result + '' + scope.row.unit }}</span><span
+                      v-if="scope.row.resultUserName">({{ scope.row.resultUserName }})</span>
+                  </template>
+                  <!-- <template v-if="scope.row.result_file">
+                    <div v-if="scope.row.result_file.images.length>0">
+                      <div style="margin-bottom: 3px;cursor: pointer;" class="blue" v-for="(item, index) in scope.row.result_file.images" :key="index" @click="onFilePreView(item)">{{ item.name }}</div>
+                    </div>
+                    <div v-if="scope.row.result_file.append.length>0">
+                      <div style="margin-bottom: 3px;cursor: pointer;" class="blue" v-for="(item, index) in scope.row.result_file.append" :key="index" @click="onFilePreView2(item)">{{ item.name }}</div>
+                    </div>
+                  </template> -->
+                </div>
+                <span v-else>-</span>
+              </template>
+            </el-table-column>
+
+            <el-table-column prop="target" label="附件" align="left" min-width="150" v-if="getTableItem('result_file')">
+              <template slot-scope="scope" v-if="scope.row.result_file">
+                <div v-if="scope.row.result_file.images.length > 0">
+                  <div style="margin-bottom: 3px;cursor: pointer;" class="blue"
+                    v-for="(item, index) in scope.row.result_file.images" :key="index" @click="onFilePreView(item)">{{
+                      item.name }}</div>
+                </div>
+                <div v-if="scope.row.result_file.append.length > 0">
+                  <div style="margin-bottom: 3px;cursor: pointer;" class="blue"
+                    v-for="(item, index) in scope.row.result_file.append" :key="index" @click="onFilePreView2(item)">{{
+                      item.name }}</div>
+                </div>
+              </template>
+            </el-table-column>
+
+            <template v-if="isShowOneselfScore">
+              <el-table-column prop="point_limit" label="加扣分上限" align="center" width="100"
+                v-if="getTableItem('point_limit')"></el-table-column>
+            </template>
+
+            <el-table-column prop="per_remark" label="考核标准" min-width="200" v-if="getTableItem('per_remark')">
+              <template slot-scope="scope">
+                <PreBox :value="scope.row.per_remark"></PreBox>
+              </template>
+            </el-table-column>
+
+            <el-table-column prop="remark" label="备注" min-width="200" v-if="isShowOneselfScore">
+              <template slot-scope="scope">
+                <PreBox :value="scope.row.remark"></PreBox>
+              </template>
+            </el-table-column>
+
+            <el-table-column prop="schedule" label="执行计划" align="center" min-width="200"
+              v-if="getTableItem('schedule')">
+              <template slot-scope="scope">
+                <div class="flex-box-ce" v-if="scope.row.schedule && scope.row.schedule.length > 0">
+                  <el-button type="text" class="flex-1" @click="openPlan(scope.row.planIndex)">({{
+                    scope.row.schedule.length }}) 条执行计划</el-button>
+                </div>
+                <span v-else>-</span>
+              </template>
+            </el-table-column>
+
+            <el-table-column prop="mamage_record" label="跟踪管理记录" align="center" min-width="200"
+              v-if="getTableItem('mamage_record')">
+              <template slot-scope="scope">
+                <div class="flex-box-ce" v-if="scope.row.mamage_record && scope.row.mamage_record.length > 0">
+                  <el-button type="text" class="flex-1" @click="openTrack(scope.row.planIndex)">({{
+                    scope.row.mamage_record.length }}) 条管理记录</el-button>
+                </div>
+                <span v-else>-</span>
+              </template>
+            </el-table-column>
+
+            <el-table-column v-for="(item, index) in lingScore_infos" :key="index" min-width="200"
+              v-if="(item.poiSco || item.poicom) && isShowOneself(item)">
+              <template slot="header" slot-scope="scope">
+                <el-tooltip effect="dark" :content="item.title" placement="top">
+                  <span>
+                    <div class="font-flex-word">{{ item.title }}</div>
+                  </span>
+                </el-tooltip>
+              </template>
+              <el-table-column prop="title" min-width="100" v-if="item.poiSco">
+                <template slot="header" slot-scope="scope">
+                  <span>评分</span>
+                </template>
+                <template slot-scope="scope">
+                  <div v-for="(arr, att) in scope.row.score_infos" :key="att">
+                    <div v-if="arr.newKey == item.newKey">
+                      <span v-if="arr.employee_id == item.employee_id">{{ initData(arr.point) }} <span
+                          class="blue">{{ arr.level }}</span></span>
+                      <span v-else>-</span>
+                    </div>
+                  </div>
+                  <span v-if="scope.row.score_infos ? scope.row.score_infos.length == 0 : ''">-</span>
+                  <!-- 总分分数 -->
+                  <span v-if="scope.row.toScore">{{ item.totalScore }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column prop="title" min-width="100" v-if="item.poicom">
+                <template slot="header" slot-scope="scope">
+                  <span>说明</span>
+                </template>
+                <template slot-scope="scope">
+                  <div v-for="(arr, att) in scope.row.score_infos" :key="att">
+                    <div v-if="arr.newKey == item.newKey">
+                      <span v-if="arr.employee_id == item.employee_id">
+                        <PreBox :value="initData(arr.remark)"></PreBox>
+                      </span>
+                      <span v-else>-</span>
+                    </div>
+                  </div>
+                  <span v-if="scope.row.score_infos ? scope.row.score_infos.length == 0 : ''">-</span>
+                  <span v-if="scope.row.toScore">
+                    <PreBox :value="item.comment"></PreBox>
+                  </span>
+                </template>
+              </el-table-column>
+            </el-table-column>
+
+            <!-- 输入框 -->
+            <template v-if="gradeBegin">
+              <!-- 评分输入 -->
+              <el-table-column min-width="250" fixed="right">
+                <template slot="header" slot-scope="scope">
+                  <div>{{ scoreTab.title }}</div>
+                </template>
+                <template slot-scope="scope">
+                  <el-popover placement="top" v-if="scope.row.auto_score === 0 || scope.row.auto_score" width="400"
+                    trigger="hover">
+                    <div style="padding: 10px;padding-top: 0;">
+                      <div class="flex-box-ce">
+                        <div class="flex-1">按以下公式和数据自动计算评分</div>
+                      </div>
+                      <div v-html="scope.row.expressionStr"
+                        style="background-color: #f1f1f1;padding: 10px;text-align: left;border-radius: 5px;cursor: pointer;">
+                      </div>
+                      <div class="flex-box-ce">
+                        <div class="orange" style="margin-right: 20px;">结果值:{{ scope.row.result }}</div>
+                        <div class="orange">目标值:{{ scope.row.target }}</div>
+                      </div>
+                    </div>
+                    <div slot="reference">系统评分<i class="el-icon-warning"></i>:<span
+                        class="blue">{{ scope.row.auto_score }}</span></div>
+                  </el-popover>
+                  <div v-if="thecurrentFlow == 'score_supervisor'">
+                    <!-- 评指标分 -->
+                    <el-input v-if="ruleScore == 1 && !scope.row.totalScore" :rows="1" @blur="sgradeBlur(scope.$index)"
+                      @input="[sgradeInp(scope.$index, scope.row), (scope.row.score_grade = scope.row.score_grade.match(/\d+(\.\d{0,2})?/) ? scope.row.score_grade.match(/\d+(\.\d{0,2})?/)[0] : '')]"
+                      v-model="scope.row.score_grade" placeholder="请输入"></el-input>
+                    <span v-else-if="ruleScore == 1 && scope.row.totalScore">{{ tabTotaScore }}</span>
+                    <!-- 评总分 -->
+                    <el-input v-else-if="ruleScore == 2 && scope.row.totalScore" :rows="1"
+                      @input="[sgradeInp(scope.$index, scope.row), (scope.row.score_grade = scope.row.score_grade.match(/\d+(\.\d{0,2})?/) ? scope.row.score_grade.match(/\d+(\.\d{0,2})?/)[0] : '')]"
+                      v-model="scope.row.score_grade" placeholder="请输入"></el-input>
+                    <span v-else>-</span>
+                  </div>
+
+                  <div v-else>
+                    <span v-if="scope.row.totalScore">{{ tabTotaScore }}</span>
+                    <el-input v-else :rows="1" @blur="sgradeBlur(scope.$index)"
+                      @input="[sgradeInp(scope.$index, scope.row), (scope.row.score_grade = scope.row.score_grade.match(/\d+(\.\d{0,2})?/) ? scope.row.score_grade.match(/\d+(\.\d{0,2})?/)[0] : '')]"
+                      v-model="scope.row.score_grade" placeholder="请输入"></el-input>
+                  </div>
+                </template>
+              </el-table-column>
+              <!-- 说明 -->
+              <el-table-column min-width="150" fixed="right">
+                <template slot="header" slot-scope="scope">
+                  <div>{{ scoreTab.explain }}</div>
+                </template>
+                <template slot-scope="scope">
+                  <div style="cursor: pointer;">
+                    <!-- 指标评分说明 -->
+                    <template v-if="ruleScore == 1 && !scope.row.totalScore">
+                      <div @click="showPf(scope.$index, 1)">
+                        <PreBox :value="scope.row.score_remark" v-if="scope.row.score_remark"></PreBox>
+                        <div v-else class="shuru">请输入</div>
+                      </div>
+                    </template>
+                    <!-- 总分说明 -->
+                    <template v-if="ruleScore == 2 && scope.row.totalScore">
+                      <div @click="showPf(scope.$index, 2)">
+                        <PreBox :value="scope.row.total_score_comment" v-if="scope.row.total_score_comment"></PreBox>
+                        <div v-else class="shuru">请输入</div>
+                      </div>
+                    </template>
+                  </div>
+                </template>
+              </el-table-column>
+            </template>
+
+          </TableBox>
+        </div>
+        <Record :record="record"></Record>
+      </header>
+      <footer class="footer flex-box-end" v-if="gradeBegin">
+        <el-button @click="cancel">取消</el-button>
+        <el-button class="primaryBtn" @click="save(0)">暂存</el-button>
+        <el-button type="primary" @click="save(1)">提交评分</el-button>
+      </footer>
+    </template>
+    <resultSetAll2 v-else :peIds="resultData.peIds" :packageName="resultData.packageName"></resultSetAll2>
+
+    <!-- 上一个 下一个 -->
+    <div class="upDown-box" v-if="isDisabled && !gradeBegin">
+      <div class="flex-box-ce flex-center-center fontColorB" style="height: 60px;">
+        <div class="flex-1 orange" v-if="!up.employeeID" style="text-align: center;border-right: 1px solid #f1f1f1;">
+          已无待办</div>
+        <div class="flex-1 flex-box-ce flex-center-center up-item" v-else style="border-right: 1px solid #f1f1f1;"
+          @click="qieh(1)">
+          <userImage :user_name="up.name" :img_url="up.img_url" width="40px" height="40px" fontSize="12"></userImage>
+          <div class="upName font-flex-word">{{ up.name }}</div>
+          <div>上一个</div>
+        </div>
+        <div class="flex-1 orange" v-if="!down.employeeID" style="text-align: center;">已无待办</div>
+        <div class="flex-1 flex-box-ce flex-center-center up-item" v-else @click="qieh(2)">
+          <div>下一个</div>
+          <div class="upName font-flex-word">{{ down.name }}</div>
+          <userImage :user_name="down.name" :img_url="down.img_url" width="40px" height="40px" fontSize="12">
+          </userImage>
+        </div>
+      </div>
+    </div>
+
+    <!-- 流程详情 -->
+    <BrawerBox :drawerTitle="processDel.remarkDel + proNum" :footNo="false" :showDrawer.sync="isChecks">
+      <template slot="main">
+        <div class="processSty">
+          <div v-for="(item, index) in processDel.target" :key="index" class="flex-box flex-d-center proListSty">
+            <div style="width:230px;" class="flex-box flex-d-center flex-h-ce">
+              <div>
+                <userImage class="fl" :id="item.employee_id" :user_name="item.employee_name" width="30px" height="30px"
+                  fontSize="12"></userImage>
+                <span class="proName">{{ item.employee_name }}</span>
+              </div>
+              <el-tag v-if="processDel.status == 0" size="mini" type="warning" color="#ffe7d3"
+                style="color:#ff8d00;">流程未到</el-tag>
+              <!-- 针对任一人处理了,其他人显示无需处理 -->
+              <template v-else-if="item.status == 1">
+                <template v-if="(processDel.multi_executor == 2) && getStrus()">
+                  <el-tag size="mini">无需处理</el-tag>
+                </template>
+                <template v-else>
+                  <el-tag size="mini">处理中</el-tag>
+                </template>
+              </template>
+              <el-tag v-else-if="item.status == 2" size="mini" type="success">已处理</el-tag>
+            </div>
+            <!-- 主子管理员 并且当前节点里包括登录者-->
+            <template v-if="$getRole(1) || item.employee_id == userInfo.id">
+              <template v-if="processDel.code == 'score_supervisor' || processDel.code == 'special_scorer'">
+                <!-- 指定评分人节点 -->
+                <template v-if="processDel.code == 'score_supervisor'">
+                  <el-button v-if="transferBut && item.status == 1 && (processDel.transfer || $getRole(1))" class="proButt"
+                    @click="careOf(item)">转交</el-button>
+                </template>
+                <!-- 特定指标指定评分人,因为默认是可以转交的,所有没有 transfer 字段 -->
+                <template v-else>
+                  <el-button v-if="transferBut && item.status == 1" class="proButt" @click="careOf(item)">转交</el-button>
+                </template>
+              </template>
+              <template v-else-if="processDel.code == 'review' || processDel.code == 'confirm'">
+                <el-button
+                  v-if="transferBut && item.status == 1 && ((processDel.action.indexOf('transfer') >= 0) || $getRole(1))"
+                  class="proButt" @click="careOf(item)">转交</el-button>
+              </template>
+              <template v-else>
+                <el-button v-if="transferBut && item.status == 1" class="proButt" @click="careOf(item)">转交</el-button>
+              </template>
+            </template>
+          </div>
+        </div>
+      </template>
+    </BrawerBox>
+    <!-- 审批同意 -->
+    <el-dialog title="意见说明" :visible.sync="examineConsent" width="500px" :close-on-click-modal="false">
+      <el-input type="textarea" v-model="tDownList.comment" rows="4" placeholder="请输入意见说明(选填)"></el-input>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="tDlose(1)">取 消</el-button>
+        <el-button type="primary" @click="tDownOk(1)">确 定</el-button>
+      </span>
+    </el-dialog>
+    <!--驳回评分 -->
+    <BrawerBox drawerTitle="驳回评分" :showDrawer.sync="turnDown">
+      <template slot="main">
+        <el-form label-position="top" label-width="80px" :rules="rFlowRules" :model="tDownList" ref="tDownList"
+          class="elFrom-margin">
+          <el-form-item label="重置到" prop="node_id">
+            <el-select v-model="tDownList.node_id" clearable placeholder="请选择阶段" style="width:100%;">
+              <el-option v-for="item in rFlowArrive" :key="item.value" :label="item.label"
+                :value="item.value"></el-option>
+            </el-select>
+            <el-select v-if="rUsers.length > 0" multiple v-model="tDownList.employee_id" clearable placeholder="请选择重置人员"
+              style="width:100%;margin-top: 10px;">
+              <el-option v-for="item in rUsers" :key="item.value" :label="item.label" :value="item.value"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="驳回说明" :required="true">
+            <el-input type="textarea" rows="7" placeholder="请输入驳回意见(必填)" v-model="tDownList.comment"></el-input>
+          </el-form-item>
+        </el-form>
+      </template>
+      <template slot="footer">
+        <el-button plain size="" @click="tDlose(0)">取消</el-button>
+        <el-button type="primary" @click="tDownOk(0, 'tDownList')">确认</el-button>
+      </template>
+    </BrawerBox>
+    <!-- 重置流程 -->
+    <BrawerBox drawerTitle="重置流程" :showDrawer.sync="resetFlow">
+      <template slot="main">
+        <el-form label-position="top" :rules="rFlowRules" :model="rFlowList" ref="rFlowList" label-width="80px"
+          class="elFrom-margin">
+          <el-form-item label="操作">
+            <el-radio-group v-model="rFlowList.type">
+              <el-radio :label="1">重置到指定节点</el-radio>
+              <el-radio :label="2">重新读取考核模板设置</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item label="指标处理" v-if="rFlowList.type == 2">
+            <el-radio-group v-model="rFlowList.overwrite_mode">
+              <el-radio :label="2">保留已制定指标</el-radio>
+              <el-radio :label="1">重置指标</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item label="重置到" prop="node_id" v-if="rFlowList.type == 1">
+            <el-select v-model="rFlowList.node_id" clearable placeholder="请选择阶段" style="width:100%;">
+              <el-option v-for="item in rFlowArrive" :key="item.value" :label="item.label"
+                :value="item.value"></el-option>
+            </el-select>
+            <el-select v-if="rUsers.length > 0" multiple v-model="rFlowList.employee_id" clearable placeholder="请选择重置人员"
+              style="width:100%;margin-top: 10px;">
+              <el-option v-for="item in rUsers" :key="item.value" :label="item.label" :value="item.value"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="重置说明" prop="comment">
+            <el-input type="textarea" rows="6" placeholder="请输入重置说明(必填)" v-model="rFlowList.comment" maxlength="200"
+              show-word-limit></el-input>
+          </el-form-item>
+        </el-form>
+      </template>
+      <template slot="footer">
+        <el-button plain @click="resetFlow = false">取消</el-button>
+        <el-button type="primary" @click="rFlowOk('rFlowList')">确认</el-button>
+      </template>
+    </BrawerBox>
+    <!-- 跟踪管理 -->
+    <TrackManagement :showDrawer.sync="isTrack" :isCz="!isCzData" :recordMemberIds="recordMemberIds" :id="employeeID"
+      :apList="apList" :assessId="employID" @confirm="employeeDet" :planIndex="planIndex"></TrackManagement>
+    <!-- 执行计划 -->
+    <ActionPlan :showDrawer.sync="isPlan" :isCz="!isCzData" :id="employeeID" :apList="apList" :assessId="employID"
+      @confirm="employeeDet" :planIndex="planIndex"></ActionPlan>
+    <!-- 沟通反馈 -->
+    <BrawerBox drawerTitle="沟通反馈" :showDrawer.sync="communication">
+      <template slot="main">
+        <el-input type="textarea" v-model="communicationVal" rows="10" placeholder="请输入反馈内容(必填)" maxlength="300"
+          show-word-limit></el-input>
+        <div class="aite" @click="selectUser = true">@</div>
+        <el-tag style="margin: 0 5px;" v-for="(tag, index) in tags" :key="tag.id" closable
+          @close="handleClose(tag, index)">{{ tag.name }}</el-tag>
+      </template>
+      <template slot="footer">
+        <span class="dialog-footer">
+          <el-button @click="communication = false">取 消</el-button>
+          <el-button type="primary" @click="saveCommunication()">确 定</el-button>
+        </span>
+      </template>
+    </BrawerBox>
+    <!-- 沟通反馈 -->
+    <EmployeeSelector title="选择@人员" :is_filtration_creator="false" :visible.sync="selectUser"
+      @confirm="confirmCreator" />
+    <!-- 转交 -->
+    <EmployeeSelector title="选择人员" :is_filtration_creator="false" :multi="false" :isChecKedAll="false"
+      :visible.sync="careOfSelector" @confirm="confirmcareOf" />
+    <!-- 评分说明 -->
+    <el-dialog title="评分说明" :visible.sync="isShowPf" width="500px" :close-on-click-modal="false">
+      <el-input type="textarea" v-model="pfText" rows="4" placeholder="请输入评分说明" maxlength="100"
+        show-word-limit></el-input>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="isShowPf = false">取 消</el-button>
+        <el-button type="primary" @click="updateText()">确 定</el-button>
+      </span>
+    </el-dialog>
+    <!-- 撤销操作 -->
+    <el-dialog title="撤销" :visible.sync="isShowCx" width="500px" :close-on-click-modal="false">
+      <el-input type="textarea" v-model="cxText" rows="4" placeholder="请输入撤销理由" maxlength="200"
+        show-word-limit></el-input>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="isShowCx = false">取 消</el-button>
+        <el-button type="primary" @click="revocation()">确 定</el-button>
+      </span>
+    </el-dialog>
+    <!-- 调整目标反馈 -->
+    <el-dialog title="调整目标" :visible.sync="isAdjustment" :close-on-click-modal="false" width="700px">
+      <div>
+        <el-radio-group v-model="radio">
+          <div class="flex-box-v">
+            <el-radio :label="1" style="margin-bottom: 30px;">仅修改指标内容,不重置考核流程
+              <br /> <span
+                style="font-size: 12px;color: #C0C4CF;padding-left: 25px;padding-top: 5px;">不影响进行中的考核流程,只对指标内容和信息进行修改</span>
+            </el-radio>
+            <el-radio :label="2">修改指标,并重置考核流程
+              <br /> <span
+                style="font-size: 12px;color: #C0C4CF;padding-left: 25px;">修改指标并按照新的流程来进行考核,已评分和已审批的记录也会被重置</span>
+            </el-radio>>
+          </div>
+        </el-radio-group>
+      </div>
+      <span slot="footer">
+        <el-button @click="isAdjustment = false">取消</el-button>
+        <el-button type="primary" @click="setDataAccess">确定</el-button>
+      </span>
+    </el-dialog>
+
+    <!-- 评分确认 -->
+    <el-dialog title="请确认您的评分" :visible.sync="isPoint" :close-on-click-modal="false" width="700px">
+      <div>
+        <el-table :data="pointList" :header-cell-style="{ background: '#ECF5FF' }" border>
+          <el-table-column prop="name" min-width="150" label="指标">
+            <template slot="header" slot-scope="scope">
+              <span>指标(<span style="color:#ff9600;">每项指标评分</span>)</span>
+            </template>
+          </el-table-column>
+          <!-- <el-table-column prop="score_remark" label="评分说明"></el-table-column> -->
+          <el-table-column prop="score" label="评分" align="left"></el-table-column>
+        </el-table>
+      </div>
+      <span slot="footer">
+        <el-button @click="isPoint = false">返回修改</el-button>
+        <el-button type="primary" @click="score">确定</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog title="图片查看" :visible.sync="isShowImg" width="50%">
+      <img :src="imgUrl" style="width: 100%;">
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="isShowImg = false">取 消</el-button>
+        <el-button type="primary" @click="isShowImg = false">确 定</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog title="" :visible.sync="dialogVisible" width="50%">
+      <div></div>
+      <div slot="footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import BrawerBox from '@/performance/components/public/BrawerBox';
+import PageHead from '@/components/PageHead'; //头部---返回
+import Record from '@/performance/components/public/Record';
+import ActionPlan from '@/performance/components/public/ActionPlan';
+import TableBox from '@/performance/components/public/TableBox';
+import TrackManagement from '@/performance/components/public/TrackManagement';
+import EmployeeSelector from '@/components/EmployeeSelector';
+import resultSetAll2 from '@/performance/views/myPerformance/resultSetAll2';
+import { getExpressionStr } from '@/performance/utils/auth'
+export default {
+  name: 'staffAssDet',
+  components: {
+    PageHead,
+    BrawerBox,
+    Record,
+    ActionPlan,
+    TableBox,
+    TrackManagement,
+    EmployeeSelector,
+    resultSetAll2
+  },
+  data() {
+    return {
+      dialogVisible: false,
+      radio: 1,
+      isAdjustment: false,
+      isDetails: true,//是否显示考核详情页面
+      resultData: {},
+      gradeList: [],
+      dropdownMenu: [{ key: 'a', name: '重置流程', isShow: true }, { key: 'b', name: '调整目标', isShow: true }],
+      lingScore_infos: [],
+      staffLoad: false, //loading
+      tableLoad: false, //loading
+      execution: '目标制定并确认完毕后,进入到【执行中】阶段,期间员工执行计划,上级跟踪过程。进入结果数据收集和评分阶段',
+      isChecks: false, //侧边弹窗
+      headvalue: '',
+      headoptions: [],
+      employeeID: 0, //考核记录ID
+      employID: 0, //当前角色ID
+      empDetList: {},
+      remployee: { employee_detail: {} }, //被考核人员信息
+      flow: [], //步骤
+      atPresentFlow: 0, //当前步骤ID
+      dimension: [], //维度表格信息
+      config: {}, //配置
+      tableData: [],
+      communication: false, //沟通
+      communicationVal: '',
+      tags: [], //沟通@人员
+      selectUser: false,
+      nowFLow: '', //当前的流程
+      turnDown: false, //驳回开关
+      tDownArrive: [], //驳回到--数据
+      tDownList: {
+        node_id: '', //重置到某个节点,
+        employee_id: [], //重置到节点的某个用户 0表示驳回到节点
+        comment: '' //审核意见
+      },
+      userInfo: this.$userInfo(),
+      processDel: {}, //流程侧边栏
+      proNum: '', //流程侧边栏头部
+      calc_dimension: 0, //是否参与权重
+      revocationNodeId: 1,//撤销节点ID
+      isShowCx: false,
+      cxText: '',
+      //按钮显示隐藏
+      revocationShow: false,//是否可以撤销
+      gradeButShow: false, //评分
+      actionButShow: true, //执行计划
+      recordsManagement: true, //管理记录
+      examineButShow: false, //审批
+      isAction: false,//驳回控制
+      resultButShow: false, //结果值录入
+      gradeBegin: false, //评分确定
+      scoreTab: {}, //评分表头
+      record: [], //考核记录
+      planIndex: [], //执行计划的下标,当点击表格查看时用到
+      apList: [], //执行计划数据
+      isPlan: false, //计划弹窗
+      // 重置流程
+      resetFlow: false,
+      rFlowArrive: [], //重置节点数据
+      rUsers: [], //重置用户数据
+      rFlowList: {
+        type: 1, //重置类型 1 流程内重置 2 重读维度流程 重置
+        node_id: '', //重置到某个节点, (type 1 必填)
+        employee_id: [], //重置到节点的某个用户 0表示驳回到节点 (type 1 必填)
+        overwrite_mode: 2, //1 从原来考核模板覆写,2 从个人考核包重置 (type 2 必填)
+        comment: '' //审核意见
+      },
+      rFlowRules: {
+        node_id: [{ required: true, message: '请选择重置节点' }],
+        comment: [{ required: true, message: '请填写重置说明' }]
+      },
+      feedbackBut: false, //沟通反馈按钮
+      isTrack: false, //跟踪管理
+      weight: '指标权重(0%)',
+      packageName: '', //考核包名称 结果值录入用到
+      ruleScore: 1, //1-指标均要评分 2-评分总结
+      thecurrentFlow: '', //当前节点
+      tabTotaScore: 0, //表格展示的总分
+      mandatoryScore: false, //指标说明是否必填
+      mandatoryNote: false, //总分说明是否必填(暂不做)
+      scoreInfo: [], //各个节点的人评的总分
+      examineConsent: false, //审批
+
+      transferBut: false, //转交按钮
+      careOfSelector: false, //转交选人
+      careOfPeopleId: 0, //转交的 -- 转出ID
+
+      isCs: false,//是否抄送人进入(抄送人能看到全部评分内容)
+
+      isShowTargetBtn: false, // 目标制定相关
+      isShowConfirmBtn: false,//目标确认按钮
+      isUpdateIndex: false,//确认人是否允许修改指标
+      has_finish: false,//是否归档
+      // 评分说明弹窗
+      isShowPf: false,
+      pfText: '',
+      indexText: {//定位评分说明
+        e: 0,
+        index: 0
+      },
+
+      isShowOneselfScore: false,//是否只看自己的评分内容
+
+      // 控制上下
+      isDisabled: false,
+      up: {},
+      down: {},
+      package_id: '',
+      recordMemberIds: [],
+      pendingList: '',
+      page: 1,
+      isJz: true,
+      activeName: '',//待办带进来的节点类型
+
+      // 评分确认列表
+      pointList: [],
+      pointData: {},
+      isPoint: false,
+
+      publicity: 0,
+
+      isShowImg: false,
+      imgUrl: '',
+      resultStr: '录入结果值',
+
+      isSj: false,//是否是被考核人上级
+    };
+  },
+  computed: {
+    isCzData() {
+      if (this.gradeBegin) {
+        return true
+      }
+      if (this.has_finish) {
+        return true
+      }
+      return false
+    },
+    isShowOneself() {
+      return function (value) {
+        if (!this.isShowOneselfScore) {
+          if (value.employee_id == this.userInfo.id) {
+            return true
+          } else {
+            return false
+          }
+        } else {
+          return true
+        }
+      }
+    }
+  },
+  watch: {
+    isAdjustment(val) {
+      if (!val) {
+        this.radio = 1
+      }
+    },
+    isShowOneselfScore() {
+      this.tableLoad = true;
+      setTimeout(() => {
+        this.tableLoad = false;
+      }, 500)
+    },
+    examineConsent(val) {
+      if (!val) {
+        this.tDownList = {
+          node_id: '', //重置到某个节点,
+          employee_id: [], //重置到节点的某个用户 0表示驳回到节点
+          comment: '' //审核意见
+        }
+      }
+    },
+    isChecks(val) {
+      if (!val) {
+        this.transferBut = false
+      }
+    },
+    headvalue(id) {
+      this.headoptions.some(item => {
+        if (item.id == id) {
+          this.packageName = item.name;
+          return true;
+        }
+      });
+      let data = {//缓存的数据用于录入结果后返回页面复原数据
+        employeeID: this.employeeID,
+        employID: this.employID,
+        assID: id,
+      }
+      this.$setCache("staffAssDet", data)
+      if (this.pendingList) {
+        this.employeeDet();
+      } else {
+        this.employeeDet(true);
+      }
+    },
+    resetFlow(val) {
+      if (!val) {
+        this.rFlowList = {
+          type: 1, //重置类型 1 流程内重置 2 重读维度流程 重置
+          node_id: '', //重置到某个节点, (type 1 必填)
+          employee_id: [], //重置到节点的某个用户 0表示驳回到节点 (type 1 必填)
+          overwrite_mode: 1, //1 从原来考核模板覆写,2 从个人考核包重置 (type 2 必填)
+          comment: '' //审核意见
+        };
+        this.$nextTick(() => {
+          this.$refs.rFlowList.resetFields();
+        });
+      }
+    },
+    'rFlowList.node_id'(val) {
+      if (!val) {
+        this.rUsers = [];
+        return false;
+      }
+      this.rFlowArrive.some(item => {
+        if (val == item.id) {
+          let users = [];
+          item.target.map(item2 => {
+            if (item2.status == 2) {
+              users.push({ value: item2.employee_id, label: item2.employee_name })
+            }
+          });
+          this.rUsers = users;
+          return true;
+        }
+      });
+    },
+    'tDownList.node_id'(val) {
+      if (!val) {
+        this.rUsers = [];
+        return false;
+      }
+      this.rFlowArrive.some(item => {
+        if (val == item.id) {
+          let users = [];
+          item.target.map(item2 => {
+            if (item2.status == 2) {
+              users.push({ value: item2.employee_id, label: item2.employee_name })
+            }
+          });
+          this.rUsers = users;
+          return true;
+        }
+      });
+    },
+    flow(val) {
+      //重置要用到
+      let executionIndex = 0; //执行中下标
+      let targetIndex = 0; //目标下标(处理中的)
+      let isNoe = true;//是否完成了整个流程
+      val.forEach((item, index) => {
+        item.index = index + 1;
+        if (item.status == 1) {
+          targetIndex = index;
+          isNoe = false
+        }
+      });
+      if (targetIndex == 0 && isNoe) {//当流程执行完会是0
+        targetIndex = val.length;
+      }
+      let rFlowArrive = val.slice(executionIndex, targetIndex);
+      // 过滤掉 抄送与执行中节点,还有节点人员为空的节点
+      var arrs = [];
+      rFlowArrive.forEach((item, index) => {
+        item.value = item.id;
+        item.label = item.index + '.' + item.remarks;
+        if (item.code == 'cc' || item.code == 'execution' || item.target.length == 0) {
+          return
+        }
+        arrs.push(item);
+      });
+
+      this.rFlowArrive = arrs;
+    },
+    communication(val) {
+      if (!val) {
+        this.tags = [];
+        this.communicationVal = '';
+      }
+    },
+    isFlow(val) {
+      if (!val) {
+        this.target = [];
+      }
+    },
+    isShowPf(val) {
+      if (!val) {
+        this.pfText = '';
+        this.indexText = { e: 0, index: 0 }
+      }
+    },
+    'remployee.id'(val) {
+      if (val) {
+        this.getSuperior();
+      }
+    },
+
+  },
+  created() {
+    let staffAssDet = this.$getCache('staffAssDet');//缓存的数据
+    if (staffAssDet) {
+      this.employeeID = staffAssDet.employeeID; //个人记录ID
+      this.employID = staffAssDet.employID; //被考核人ID
+      this.assList(staffAssDet.assID);
+    } else {
+      if (this.$route.query.pe_ids) {//结果值点击进来
+        this.isDetails = false;
+        this.resultData = {
+          peIds: this.$route.query.pe_ids,
+          packageName: this.$route.query.name
+        }
+        let pendingList = JSON.parse(this.$route.query.pendingList);
+        this.up = {};
+        this.down = {};
+        pendingList.some((item, index) => {
+          if (item.package_id) {
+            if (this.$route.query.package_id == item.package_id) {
+              if (pendingList[index - 1]) {
+                this.up = pendingList[index - 1];
+              }
+              if (pendingList[index + 1]) {
+                this.down = pendingList[index + 1]
+              }
+              if (index == (pendingList.length - 2) && pendingList.length >= 10) {//如果当点击到待办人员的倒数第二个,加载剩余的
+                this.getAgency();
+              }
+              return true
+            }
+          }
+        })
+      } else {
+        this.employeeID = Number(this.$route.query.employeeID); //个人记录ID
+        this.employID = Number(this.$route.query.employeeIDs); //被考核人ID
+        this.assList(this.$route.query.assID);
+      }
+    }
+    // 是否显示上下人
+    if (this.$route.query.pendingList) {
+      this.pendingList = JSON.parse(this.$route.query.pendingList);
+      this.activeName = this.$route.query.activeName;
+      this.page = this.$route.query.page || 1;
+      this.isDisabled = true;
+    } else {
+      this.isDisabled = false;
+      this.activeName = '';
+    }
+  },
+  methods: {
+    onFilePreView(file) {
+      if (file.url) {
+        this.imgUrl = file.url;
+        this.isShowImg = true;
+      }
+    },
+    onFilePreView2(file) {
+      window.open(file.url, '_blank');
+    },
+    // 获取待办数据
+    getAgency() {
+      if (!this.isJz) { return false }
+      this.page = this.page + 1;
+      this.$axiosUser('get', '/api/pro/per/package/msg/agency', { node_type: this.activeName, status: 0, page: this.page, page_size: 10 }, 'v2')
+        .then(res => {
+          let list = res.data.data.list;
+          let pendingList = [];
+          list.forEach(item => {
+            if (item.node_type == 4) {
+              let userInfo = this.$getEmployeeMapItem(item.first_employee_id);
+              item.userInfo = userInfo;
+              let name = item.content.split(',')[0]
+              pendingList.push({ name: userInfo.name, img_url: userInfo.img_url, package_name: name, pe_ids: item.pe_ids, employeeID: '结果', package_id: item.package_id });
+              return false
+            }
+            if (item.remark.employee_id) {
+              //被考核人
+              let userInfo = this.$getEmployeeMapItem(item.remark.employee_id);
+              item.userInfo = userInfo;
+              pendingList.push({ name: userInfo.name, img_url: userInfo.img_url, employeeID: item.remark.packageEmployee_id, package_name: item.remark.package_name });
+            }
+          });
+          if (list.length < 10) {
+            this.isJz = false;
+          }
+          this.pendingList.push(...pendingList);
+        })
+    },
+    //撤销
+    revocation() {
+      let params = {
+        id: this.employeeID,
+        node_id: this.revocationNodeId,
+        comment: this.cxText
+      }
+      this.$axiosUser('post', '/api/pro/per/package/revoke', params).then(res => {
+        if (res.data.code == 1) {
+          this.$message.success('撤销成功');
+          this.employeeDet();
+        }
+      }).finally(() => {
+        this.isShowCx = false;
+        this.cxText = "";
+      });
+    },
+    // 判断是否能点击列表打开管理记录
+    isShowGl() {
+      if ((this.$getRole(2) || this.$getRole(3)) && this.recordMemberIds.indexOf(this.$userInfo().id) >= 0) {
+        return false
+      } else {
+        return true
+      }
+    },
+    setUpD() {
+      let pendingList = this.pendingList;
+      this.up = {};
+      this.down = {};
+      pendingList.some((item, index) => {
+        if (this.employeeID == item.employeeID) {
+          this.packageName = item.package_name;
+          if (pendingList[index - 1]) {
+            this.up = pendingList[index - 1];
+          }
+          if (pendingList[index + 1]) {
+            this.down = pendingList[index + 1]
+          }
+          if (index == (pendingList.length - 2) && pendingList.length >= 10) {//如果当点击到待办人员的倒数第二个,加载剩余的
+            this.getAgency();
+          }
+          return true
+        }
+      })
+    },
+    qieh(index) {
+      let employeeID = index == 1 ? this.up.employeeID : this.down.employeeID;
+      if (employeeID === '结果') {//结果值录入
+        this.isDetails = false;
+        let data = index == 1 ? this.up : this.down;
+        this.resultData = {
+          peIds: JSON.stringify(data.pe_ids),
+          packageName: data.package_name
+        }
+        let pendingList = this.pendingList;
+        this.up = {};
+        this.down = {};
+        pendingList.some((item, index) => {
+          if (item.package_id) {
+            if (data.package_id == item.package_id) {
+              if (pendingList[index - 1]) {
+                this.up = pendingList[index - 1];
+              }
+              if (pendingList[index + 1]) {
+                this.down = pendingList[index + 1]
+              }
+              if (index == (pendingList.length - 2) && pendingList.length >= 10) {//如果当点击到待办人员的倒数第二个,加载剩余的
+                this.getAgency();
+              }
+              return true
+            }
+          }
+        })
+      } else {
+        this.isDetails = true;
+        this.employeeID = employeeID
+        this.employeeDet('', () => {
+          let data = {//缓存的数据用于录入结果后返回页面复原数据
+            employeeID: this.employeeID,
+            employID: this.remployee.id,
+            assID: this.package_id,
+          }
+          this.$setCache("staffAssDet", data)
+        });
+      }
+    },
+    updateText() {
+      let list = this.dimension[this.indexText.e];
+      this.indexText.index == 1 ? list.score_remark = this.pfText : list.total_score_comment = this.pfText
+      this.$set(this.dimension, this.indexText.e, list);
+      this.isShowPf = false;
+    },
+    // 填写评分说明
+    showPf(e, index) {
+      let list = this.dimension[e];
+      let text = index == 1 ? list.score_remark : list.total_score_comment;//判断是指标说明,还是总分说明
+      this.indexText = { e: e, index: index }
+      this.pfText = text;
+      this.isShowPf = true;
+    },
+    // 目标确认-提交
+    submit() {
+      this.$confirm('请确认提交制定的指标,提交后不能再自行修改!', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消'
+      }).then(() => {
+        let data = {
+          id: this.employeeID,
+          node_id: this.atPresentFlow,
+          submit: 1,
+          dimension: JSON.stringify(this.apList)
+        }
+        this.$axiosUser('post', '/api/pro/per/package/target_set', data).then(res => {
+          if (res.data.code == 1) {
+            this.$message.success('提交成功');
+            this.employeeDet();
+          }
+        });
+      }).catch(() => {
+        console.log('取消');
+      });
+    },
+    //获取指定人员上级列表
+    getSuperiors(employee_id) {
+      return this.$axiosUser('get', 'api/pro/employee/superior', { employee_id: employee_id, platform: '3' }).then(res => {
+        return res.data.data.list
+      })
+    },
+    // 判断是否当前被考核人的上级
+    async getSuperior() {
+      this.isSj = false;
+      if (!this.remployee.id) { return is }
+      let superior_list = await this.getSuperiors(this.remployee.id);
+      superior_list.some(item => {
+        if (item.id == this.userInfo.id) {
+          this.isSj = true;
+          return true
+        }
+      })
+    },
+    //判断当有一个人完成,其他显示无需操作
+    getStrus() {
+      let is = false;
+      if (this.processDel.multi_executor == 2) {
+        this.processDel.target.some(item => {
+          if (item.status == 2) {
+            is = true
+            return true
+          }
+        })
+        return is;
+      } else {
+        return false
+      };
+    },
+    //转交
+    careOf(data) {
+      this.careOfPeopleId = data.employee_id;
+      this.careOfSelector = true;
+    },
+    //转交选人
+    confirmcareOf(list) {
+      let data = {
+        id: this.employeeID, //个人考核记录ID
+        node_id: this.processDel.id, //节点ID
+        to_employee_id: list.employee[0].id, //接收用户ID
+        from_employee_id: this.careOfPeopleId //转出用户ID
+      };
+      this.$axiosUser('post', '/api/pro/per/package/transfer', data).then(res => {
+        if (res.data.code == 1) {
+          this.$message.success('转交成功');
+          this.isChecks = false;
+          this.employeeDet();
+        }
+      });
+    },
+    // 打开结果值录入
+    openResult() {
+
+      this.$router.push({
+
+        name: 'resultSet',
+        query: { id: this.employeeID, packageName: this.packageName, resultStr: this.resultStr },
+
+      });
+
+    },
+    // 打开目标制定
+    openFormulate() {
+      this.$router.push({
+        name: 'formulate',
+        query: { id: this.employeeID, packageName: this.packageName, nodeId: this.atPresentFlow }
+      });
+    },
+    //打开管理记录
+    openTrack(index) {
+      this.planIndex = index;
+      this.isTrack = true;
+    },
+    //打开执行计划
+    openPlan(index) {
+      this.planIndex = index;
+      this.isPlan = true;
+    },
+    //评分--取消
+    cancel() {
+      this.$confirm('是否暂存当前页面内容?', '提示', {
+        confirmButtonText: '暂存',
+        cancelButtonText: '不暂存'
+      })
+        .then(() => {
+          this.save(0);
+        })
+        .catch(() => {
+          this.employeeDet();
+          this.gradeBegin = false;
+        });
+    },
+    //评分提交
+    save(num) {
+      let data = {
+        id: this.employeeID, //个人考核包ID
+        is_submit: num, //是否提交 0否(暂存) 1 是
+        node_id: this.atPresentFlow //当前节点
+      };
+      let point_info = [];//各项评分数据
+      let sumData = {//总分数据
+        total_score: '',
+        total_score_comment: '',
+      }
+      this.dimension.forEach(item => {
+        let resultInfo = {};
+        if (this.ruleScore == 1 && !item.totalScore) {//各项评分
+          resultInfo = {//评分信息--只评总分不需要
+            score: item.score_grade ? item.score_grade : '', //单项目结果值
+            score_remark: item.score_remark,
+            dimension_key: item.dimension_key, //维度索引
+            index_key: item.index_key, //指标索引
+            index_id: item.id,//指标ID
+            name: item.name,
+
+            // 用于计算分数
+            d_weight: item.dimension_weight, //维度权重
+            weight: item.weight, //指标权重
+            type: item.type //所属指标种类 1-量化指标 2-行为价值观指标 3-额外加分项 4-额外扣分项
+          };
+          point_info.push(resultInfo);
+        } else {//等于2:只评总分
+          if (item.totalScore) {
+            sumData = {
+              total_score: item.score_grade ? item.score_grade : '',
+              total_score_comment: item.total_score_comment,
+            }
+          }
+        }
+      });
+      let isMust = true, isExplain = true;//isMust验证评分,isExplain验证说明
+      if (num == 1) {//提交验证必填
+        if (this.ruleScore == 1) {//各项评分
+          point_info.forEach(item => {
+            if (this.mandatoryScore) {//评分说明必填
+              if (!item.score_remark) {
+                isExplain = false
+              }
+            }
+            if (!item.score) {
+              isMust = false
+            }
+          })
+          if (!isMust) {
+            this.$message.warning('请输入所有评分');
+            return false;
+          }
+          if (!isExplain) {
+            this.$message.warning('请输入所有评分说明');
+            return false;
+          }
+        } else {//总分
+          if (!sumData.total_score) {
+            this.$message.warning('请输入评分总分');
+            return false;
+          }
+          if (this.mandatoryScore) {
+            if (!sumData.total_score_comment) {
+              this.$message.warning('请输入总分说明');
+              return false;
+            }
+          }
+        }
+      }
+
+      if (this.ruleScore == 1) {
+        data.total_score = this.fomatFloat(this.totalPointsCount(point_info), 2); //计算的个人评出的总分(保留小数后两位)
+      } else {
+        data.total_score = this.fomatFloat(sumData.total_score, 2); //计算的个人评出的总分(保留小数后两位)
+        data.total_score_comment = sumData.total_score_comment;
+      }
+      data.point_info = JSON.stringify(point_info); // 评分信息 --  填所有评分时必须的字段(传入某指标的分数、说明、维度索引、制表索引、指标ID)
+      let pointList = JSON.parse(JSON.stringify(point_info));
+      pointList.push({
+        name: '总分',
+        score: data.total_score,
+        score_remark: data.total_score_comment
+      })
+      this.pointList = pointList;
+      this.pointData = data;
+
+      if (this.ruleScore == 1) {//只评总分不需要弹窗
+        this.isPoint = true;
+      } else {
+        this.score()
+      }
+    },
+    score() {
+      this.$axiosUser('post', '/api/pro/per/package/submit_score', this.pointData).then(res => {
+        this.$message.success('评分成功');
+        this.gradeBegin = false;
+        this.isPoint = false;
+        this.employeeDet();
+      });
+    },
+    fomatFloat(src, pos) {
+      return Math.round(src * Math.pow(10, pos)) / Math.pow(10, pos);
+    },
+    //计算总分
+    totalPointsCount(data) {
+      let ct = this.empDetList.calc_type; //1-加和计算 2-加权计算
+      let cd = this.empDetList.calc_dimension; //是否维度权重参与计算 1-是 0-否
+      let num = 0;
+      data.forEach(item => {
+        if (item.score) {
+          if (item.type == 3) {
+            //3-额外加分项
+            num += Number(item.score);
+          } else if (item.type == 4) {//4-额外扣分项    不计算
+            num -= Number(item.score);
+          } else {
+            if (ct == 1 && cd == 0) {
+              //加和
+              num += Number(item.score);
+            } else if (ct == 1 && cd == 1) {
+              //加和--维度权重参与计算
+              num += Number(item.score) * Number(item.d_weight / 100);
+            } else if (ct == 2 && cd == 0) {
+              //加权
+              num += Number(item.score) * Number(item.weight / 100);
+            } else if (ct == 2 && cd == 1) {
+              //加权--维度权重参与计算
+              num += Number(item.score) * Number(item.d_weight / 100) * Number(item.weight / 100);
+            }
+          }
+        }
+      });
+
+      return num;
+    },
+
+    sgradeBlur(e) {
+      let list = this.dimension[e];
+      let tPoints = [];
+      this.dimension.forEach(item => {
+        if (item.score_grade) {
+          tPoints.push({
+            score: item.score_grade, //分值
+            d_weight: item.dimension_weight, //维度权重
+            weight: item.weight, //指标权重
+            type: item.type //所属指标种类 1-量化指标 2-行为价值观指标 3-额外加分项 4-额外扣分项
+          });
+        }
+      });
+      this.tabTotaScore = this.fomatFloat(this.totalPointsCount(tPoints), 2);
+    },
+    sgradeInp(e, item) {
+      //e当前行 ,item用于判断当前输入是否超过评分上限
+      let list = this.dimension[e];
+      if (item) {
+        if (item.type == 3 || item.type == 4) {
+          if (item.point_limit != '-') {
+            if (item.score_grade > Number(item.point_limit)) {
+              this.$message.error("评分超过上限")
+              list.score_grade = '';
+              this.$set(this.dimension, e, list);
+              return false
+            }
+          }
+        }
+      }
+      this.$set(this.dimension, e, list);
+    },
+    //绩效包列表
+    assList(assID) {
+      let params = {
+        page: 0, //当期页
+        employee_id: this.employID
+      };
+      this.staffLoad = true;
+      this.$axiosUser('get', '/api/pro/per/package/list', params).then(res => {
+        if (res.data.code == 1) {
+          this.headoptions = res.data.data.list;
+          this.headvalue = Number(assID);
+        }
+      });
+    },
+    deepCopyAndMakeReactive(original, vm) {
+      if (Array.isArray(original)) {
+        return original.map(item => this.deepCopyAndMakeReactive(item, vm));
+      } else if (typeof original === 'object' && original !== null) {
+        const copy = {};
+        Object.keys(original).forEach(key => {
+          this.$set(copy, key, this.deepCopyAndMakeReactive(original[key], vm));
+        });
+        return copy;
+      }
+      return original;
+    },
+    // 绩效考核详情
+    employeeDet(is, func = function () { }) {
+      let params = {};
+      // 重置按钮状态
+      this.revocationShow = false,
+        this.gradeButShow = false;
+      this.examineButShow = false;
+      this.isAction = false
+      this.resultButShow = false;
+      this.isShowTargetBtn = false;
+      this.isShowConfirmBtn = false;
+      this.isUpdateIndex = false;
+      this.atPresentFlow = 0;
+      this.nowFLow = "";
+      if (is) {
+        params.package_id = this.headvalue;
+        params.employee_id = this.employID; //用户ID
+      } else {
+        params.id = this.employeeID; //个人考核记录ID
+      }
+      this.staffLoad = true;
+      this.$axiosUser('get', '/api/pro/per/package/employee/info', params).then(res => {
+        if (res.data.code == 1) {
+          let data = res.data.data;
+          this.has_finish = data.has_finish;
+          this.recordMemberIds = data.record_member_ids;
+          this.empDetList = data;
+          this.employeeID = data.id; //考核记录id
+          this.package_id = data.package_id
+          this.publicity = data.publicity;
+          if (this.pendingList) {
+            this.setUpD();
+          }
+          this.remployee = this.$getEmployeeMapItem(data.employee_id); //被考核人员信息
+          this.flow = data.flow; //流程
+          this.config = data.config;
+          this.calc_dimension = data.calc_dimension; //是否参与权重
+          this.apList = JSON.parse(JSON.stringify(data.dimension));
+          this.scoreInfo = data.score_info; //各个节点的人评的总分
+          // 沟通反馈是否启用
+          this.feedbackBut = data.config.assessment.feedback == '1' ? true : false;
+          let point_scope = data.config.assessment.point_scope; //评分可见权限
+          let point_comment = data.config.assessment.point_comment; //说明可见权限
+          let executor = {}; //与当前登录账号相同的执行人
+          let review = {}; //与当前登录账号相同的审批人
+          let isReview = false;//判断账号是否审批人中一位
+
+          let targetUserList = [];//结果值录入人 ,用来显示结果值录入人
+          data.flow.forEach((item, index) => {
+            if (item.code == 'execution') {//查找 已开始或已结束的执行节点中有无当前账号
+              if (item.status != 0) {
+                item.target.forEach(tar => {
+                  if (tar.employee_id == this.userInfo.id) {
+                    executor = tar; //存入与当前登录账号相同的执行人
+                    executor.newCode = 'employee'; //保存执行人节点code
+                  }
+                });
+              }
+            }
+            if (item.code == 'review') {//查找 已开始或已结束的审批节点中有无当前账号
+              if (item.status != 0) {
+                item.target.forEach(tar => {
+                  if (tar.employee_id == this.userInfo.id) {
+                    isReview = true;
+                    review = tar; //存入与当前登录账号相同的审批人
+                    review.newCode = 'reviewer'; //保存审批人节点code
+                  }
+                });
+              }
+            }
+            if (item.code == 'result_value') {//获取结果值录入人集合
+              targetUserList = item.target
+            }
+            //当前步骤
+            if (item.status == 1) {
+              // 判断是否显示撤销按钮
+              if (item.code != 'cc') {
+                this.isRevocation(item, data.flow[index - 1]);
+              }
+              this.nowFLow = item.code;
+              this.atPresentFlow = item.id;
+              this.setBtn(item)//其他按钮控制
+              if (item.code == 'target' || item.code == 'confirm') {//当是目标制定,目标确认时,隐藏调整目标按钮
+                this.dropdownMenu[1].isShow = false
+              } else {
+                this.dropdownMenu[1].isShow = true
+              }
+              //审批按钮
+              if (item.code == 'review') {
+                let reviewif = false;
+                item.target.forEach(tar => {
+                  if (tar.employee_id == this.userInfo.id && tar.status == 1) {
+                    reviewif = true;
+                  }
+                });
+                this.examineButShow = reviewif ? true : false;
+                this.isAction = item.action.indexOf('refuse') >= 0 ? true : false;
+              }
+              //结果值录入按钮
+              if (item.code == 'result_value' || item.code == 'score_supervisor' || item.code == 'special_scorer') {
+                this.isresultBtn(item)
+              }
+            }
+            let remName = item.remark;
+            item.target.forEach((add, att) => {
+              remName += add.employee_name;
+              remName += item.target.length - att > 1 ? ',' : '';
+            });
+            item.remarks = remName;
+            item.remarkDel = item.remark.split(':')[0];
+          });
+
+          if (this.atPresentFlow == 0) {//如果当前节点id为0,代表此考核详情已完毕,把最后一个节点作为当前节点
+            this.atPresentFlow = data.flow[data.flow.length - 1].id
+            // 判断抄送节点里是否包含当前登录者
+            let cs = data.flow[data.flow.length - 1];
+            if (cs.code == 'cc') {  //判断最后一个节点是否抄送节点
+              cs.target.some(item => {
+                if (item.employee_id == this.userInfo.id) {
+                  this.isCs = true;
+                  return true;
+                }
+              });
+            }
+          }
+          //整合表格格式
+          let dimension = data.dimension;
+          let dimeTab = [];
+          let gradeTab = [];
+          let weight = 0; //权重统计
+          dimension.forEach((item, keys) => {
+            item.index.forEach((arr, index) => {
+              weight += Number(arr.weight);
+              arr.wdLeg = 0; //其他这个指标集合的指标给值为0
+              item.index[0].wdLeg = item.index.length; //找出这个指标集合的第一个并给与他的长度
+              arr.theDimension = item.name;
+              arr.dimension_weight = item.dimension_weight; //维度权重
+              arr.score_infos = [];
+              arr.planIndex = [keys, index]; //当打开执行计划时的下标
+              arr.per_remark = this.initData(arr.per_remark);
+              arr.remark = this.initData(arr.remark);
+              arr.target = this.initData(arr.target);
+              arr.result = arr.result; //结果值
+              arr.point_limit = this.initData(arr.point_limit);
+              if (item.index_type == 3 || item.index_type == 4) {
+                arr.weight = this.initData(Number(arr.weight));
+              }
+              // 写入每个指标的结果值录入人
+              targetUserList.forEach(target => {
+                target.list.forEach(target2 => {
+                  if (target2.index_id == arr.id) {
+                    arr.resultUserName = target.employee_name; //结果值
+                  }
+                })
+              })
+
+              // 权限区分
+              arr.score_info.forEach((list, auto) => {
+                if (list.id <= this.atPresentFlow) {//atPresentFlow为当前节点id。。数据-id <= 当前节点id .   :筛选出当前节点及之前的评分节点的数据
+                  list.employees.forEach(emplo => {
+                    //获取code
+                    data.flow.forEach(codes => {
+                      if (codes.id == list.id) {
+                        emplo.code = codes.code;
+                        codes.target.some(tar => {//找到每个评分人获取评分状态
+                          if (tar.employee_id == emplo.employee_id) {
+                            emplo.status = tar.status;
+                            return true
+                          }
+                        });
+                      }
+                    });
+                    emplo.id = list.id;
+                    emplo.newKey = Number(emplo.id + '' + emplo.employee_id); //给一个唯一key,目的:找到不同节点的相同的人    去重
+                    arr.score_infos.push(emplo);
+                    gradeTab.push(emplo);
+                  });
+                }
+              });
+              dimeTab.push(arr);
+            });
+          });
+          this.weight = '指标权重(' + weight + '%)';
+          let poiSco = data.config.assessment.point_scope; //评分可见权限
+          let poicom = data.config.assessment.point_comment; //说明可见权限
+          let duplicat = this.duplicateRemoval(gradeTab, 'newKey');
+          duplicat.forEach(item => {
+            if (item.code == 'review') {//审批
+              item.newCode = 'reviewer';
+            } else if (item.code == 'execution') {//执行中
+              item.newCode = 'employee';
+            } else if (item.code == 'score_supervisor') {//指定上级
+              item.newCode = 'manager';
+            } else if (item.code == 'special_scorer') {//特定上级
+              item.newCode = 'special';
+            }
+            //item为评分数据,数据内只有两个节点:指定(score_supervisor,权限名:manager)  特定上级(special_scorer,权限名:special)
+            //poiSco    评分权限
+            //poicom    说明权限
+            //executor  执行人中的当前登陆账号
+            //review    审批人中的当前登陆账号
+            if (executor.employee_id) {//若有数据,那么当前登录账号必定在执行人中并且执行节点正在执行或已结束(哪怕正在执行也无所谓,前方已经过滤评分数据,会得到[])
+              if (poiSco[executor.newCode] == '2') {//已有数据并且为2 ‘查看所有的’ ,那就可以将所有的评分权限都改为 ‘2’
+                for (let i in poiSco) {
+                  poiSco[i] = '2'
+                }
+              }
+              if (poicom[executor.newCode] == '2') {//说明同上
+                for (let i in poicom) {
+                  poicom[i] = '2'
+                }
+              }
+            }
+            if (review.employee_id) {//审批节点--同上  (审批节点默认为2,可以直接全部变成2)
+              if (poiSco[review.newCode] == '2') {
+                for (let i in poiSco) {
+                  poiSco[i] = '2'
+                }
+              }
+              if (poicom[review.newCode] == '2') {//说明同上
+                for (let i in poicom) {
+                  poicom[i] = '2'
+                }
+              }
+            }
+            if (item.employee_id == executor.employee_id) {//判断当前评分数据是否 与 执行节点的当前帐号一致
+              if (poiSco[executor.newCode] == '2') {//如果一致并且执行节点为‘2’即查看所有,那么就修改当前 评分数据 的权限也为‘2’
+                poiSco[item.newCode] = '2';
+              }
+              if (poicom[executor.newCode] == '2') {//执行中的 -- 说明权限-同上
+                poicom[item.newCode] = '2';
+              }
+            }
+            if (item.employee_id == review.employee_id) {//判断当前评分数据是否 与 审批节点的当前帐号一致
+              if (poiSco[review.newCode] == '2') {
+                poiSco[item.newCode] = '2';
+              }
+              if (poicom[review.newCode] == '2') {//审批的 -- 说明权限-同上
+                poicom[item.newCode] = '2';
+              }
+            }
+          });
+          let poiSOk = false//评分--为true时所有评分可看
+          let poiCOk = false//说明--为true时所有说明可看
+          duplicat.forEach(item => {
+            if (poiSco[item.newCode] == '1' && item.employee_id == this.userInfo.id) {
+              item.poiSco = true;
+            } else if (poiSco[item.newCode] == '2') {//当前 评分 数据权限等于2时并且 (当前数据id为登陆账号  或  执行中权限等于2(代表当前登陆账号为执行中的一员 或 审批权限等于2(代表当前登陆账号为审批中的一员)) 时,所有评分都可见
+              if (item.employee_id == this.userInfo.id || poiSco[executor.newCode] == '2' || poiSco[review.newCode] == '2') {
+                poiSOk = true
+              }
+            }
+            //说明可见权限。
+            if (poicom[item.newCode] == '1' && item.employee_id == this.userInfo.id) {//说明--同上
+              item.poicom = true;
+            } else if (poicom[item.newCode] == '2') {
+              if (item.employee_id == this.userInfo.id || poicom[executor.newCode] == '2' || poicom[review.newCode] == '2') {
+                poiCOk = true
+              }
+            }
+          });
+          duplicat.forEach(item => {
+            if (poiSOk || this.$getRole(1) || this.isCs) {
+              item.poiSco = true;
+            }
+            if (poiCOk || this.$getRole(1) || this.isCs) {
+              item.poicom = true;
+            }
+          })
+          //遍历列表总分
+          let scoreListInfo = [];
+          let totSco = false;
+          let points = [];//最终显示评分
+          this.scoreInfo.forEach(item => {
+            item.employees.forEach(arr => {
+              arr.newKey = Number(item.id + '' + arr.employee_id);
+              arr.codeId = item.id;
+              scoreListInfo.push(arr);
+            });
+          });
+          duplicat.forEach((item, index) => {
+            scoreListInfo.forEach(arr => {
+              if (item.newKey == arr.newKey) {
+                item.totalScore = arr.point;
+                item.comment = arr.comment;
+                if (arr.point) {
+                  totSco = true;
+                }
+              }
+            });
+            if (item.status != 2 && item.id != this.atPresentFlow) {
+              // delete duplicat[index]
+            } else {
+              points.push(item)
+            }
+          });
+          points.sort(this.rule("id"))//跟距ID排序
+          console.log(points)
+          this.lingScore_infos = points;
+          this.isShowOneselfScore = !this.isShowOneselfScore
+          setTimeout(() => {
+            this.isShowOneselfScore = !this.isShowOneselfScore
+          })
+          // this.lingScore_infos = this.deepCopyAndMakeReactive(points,this)
+          // console.log(this.lingScore_infos)
+          // this.lingScore_infos = []
+          // points.map((item,index) => {
+          //   this.lingScore_infos.push(item)
+          // })
+          // this.$set(this.lingScore_infos,points.map(item => ({ ...item })))
+
+          let toScore = {
+            theDimension: '总分',
+            wdLeg: 0,
+            toScore: true
+          };
+          if (totSco) {
+            let poiScoDimeTab = false;
+            duplicat.forEach(item => {
+              if (item.poiSco) {
+                poiScoDimeTab = true;
+              }
+            });
+            if (poiScoDimeTab) {
+              dimeTab.push(toScore);
+              this.$nextTick(() => {
+                //刷新总分--行
+                dimeTab.forEach((item, index) => {
+                  if (item.toScore) {
+                    this.sgradeInp(index);
+                  }
+                });
+              });
+            }
+          }
+          //流程结束后的判断
+          this.pdLc()
+          if (!this.nowFLow || this.nowFLow == 'review') {//是审批节点或者流程结束,(流程结束nowFLow为空)
+            if (data.publicity == 1 || this.$getRole(1) || isReview) { //结果是否公示,是否主次管理员,是否是审批人
+              dimeTab[0].final_point = data.final_point; //考核结果--总分
+              dimeTab[0].final_level = data.final_level; //考核结果--等级
+              dimeTab[0].doing_id = 11;
+              dimeTab[0].zfLeg = dimeTab.length;
+            }
+          }
+          this.dimension = dimeTab.map(item => ({ ...item })); //表格数据
+          //记录
+          let record = res.data.data.record;
+          record.forEach(item => {
+            item.userData = this.$getEmployeeMapItem(item.employee_id);
+          });
+          this.record = record;
+          func();
+        }
+      })
+        .finally(() => {
+          this.staffLoad = false;
+        });
+    },
+    // 判断是否显示撤销按钮
+    isRevocation(dqItem, upItem) {
+      // 当前只需要评分节点需要撤回
+      //当前节点包含自己并且其他任意一人未完成的显示按钮
+      if (dqItem.code == 'score_supervisor' || dqItem.code == 'special_scorer') {
+        dqItem.target.some((item, index) => {
+          if (item.employee_id == this.userInfo.id && item.status == 2) {
+            dqItem.target.some((item2, index2) => {
+              if (item2.status == 1) {
+                this.revocationNodeId = dqItem.id
+                this.revocationShow = true;
+                return true;
+              }
+            })
+          }
+        })
+      }
+      let is = true;//判断当前节点人员是否有完成的
+      //上一节点中包含登录者并且是完成的状态显示按钮
+      if (upItem) {
+        dqItem.target.some((item, index) => {
+          if (item.status == 2) {
+            is = false;
+          }
+        })
+        if ((upItem.code == 'score_supervisor' || upItem.code == 'special_scorer')) {
+          upItem.target.some((item, index) => {
+            if (item.employee_id == this.userInfo.id && item.status == 2 && is) {
+              this.revocationNodeId = upItem.id
+              this.revocationShow = true;
+              return true;
+            }
+          })
+        }
+      }
+    },
+    //判断是否显示结果值
+    isresultBtn(item) {
+      //结果值录入按钮
+      let flow = this.flow;
+      if (item.code == 'result_value') {
+        item.target.forEach(tar => {
+          if (tar.employee_id == this.userInfo.id) {
+            this.resultButShow = true;
+            this.resultStr = tar.status == 2 ? '调整结果值' : '录入结果值'
+          }
+        });
+        return true;
+      } else {
+        let is = false
+        flow.some(obj => {
+          if (obj.code == 'result_value') {
+            obj.target.forEach(tar => {
+              if (tar.employee_id == this.userInfo.id) {
+                is = true;
+              }
+            });
+          }
+          if (obj.code == 'score_supervisor' || obj.code == 'special_scorer') {
+            let isUpdate = true;
+            if (obj.target.length > 0) {
+              obj.target.forEach(e => {
+                if (e.status == 2) {
+                  isUpdate = false
+                }
+              })
+              if (isUpdate && is) {
+                this.resultButShow = true;
+                this.resultStr = '调整结果值';
+              }
+            }
+            return true
+          }
+        })
+      }
+    },
+    pdLc() {
+      let flow = JSON.parse(JSON.stringify(this.flow)).reverse();//反转流程,找第一个评分节点
+      //流程结束,但是最后一个“评分”节点里有自己显示撤销
+      if (this.publicity == 1) {
+        flow.some(item => {
+          if (item.code == 'review' || item.code == 'cc') {
+            return true
+          }
+          if (item.code == 'score_supervisor' || item.code == 'special_scorer') {
+            item.target.some(e => {
+              if (e.employee_id == this.userInfo.id && e.status == 2) {
+                this.revocationNodeId = item.id
+                this.revocationShow = true;
+                return true
+              }
+            })
+            return true
+          }
+        })
+      }
+    },
+    // 各按钮控制
+    setBtn(item) {
+      // 目标制定
+      if (item.code == 'target') {
+        item.target.forEach(tar => {
+          if (tar.employee_id == this.userInfo.id && tar.status == 1) {
+            this.isShowTargetBtn = true;
+          }
+        });
+        return
+      }
+      // 目标确认
+      if (item.code == 'confirm') {
+        item.target.forEach(tar => {
+          if (tar.employee_id == this.userInfo.id && tar.status == 1) {
+            this.isShowConfirmBtn = true;
+          }
+        });
+        this.isUpdateIndex = item.action.indexOf('index') >= 0 ? true : false
+        return
+      }
+      //评分按钮
+      if (item.code == 'score_self' || item.code == 'score_mutual' || item.code == 'score_supervisor' || item.code == 'special_scorer') {
+        item.target.forEach(tar => {
+          if (tar.employee_id == this.userInfo.id && tar.status == 1) {
+            this.gradeButShow = true;
+          }
+        });
+        return
+      }
+    },
+    //去重
+    duplicateRemoval(data, name) {
+      let bbt = {};
+      let abbts = data.reduce((cur, next) => {
+        bbt[next[name]] ? '' : (bbt[next[name]] = true && cur.push(next));
+        return cur;
+      }, []);
+      return abbts;
+    },
+    //跟距ID排序
+    rule(key) {
+      return function (a, b) { // sort 默认接受a,b两个参数表示数组中的值
+        var value1 = a[key]
+        var value2 = b[key]
+        return value1 - value2
+      }
+    },
+    groupBy(data, params) {
+      const groups = {};
+      data.forEach(v => {
+        const group = JSON.stringify(v[params]);
+        groups[group] = groups[group] || [];
+        groups[group].push(v);
+      });
+      return Object.values(groups);
+    },
+    //数据初始化,没有值或者空数组的显示-
+    initData(str) {
+      if (str == null) {
+        return str ? str : '-';
+      }
+      if (typeof str == 'object') {
+        return str.length > 0 ? str : '-';
+      } else {
+        return str ? str : '-';
+      }
+    },
+    // 根据数据结构显示table,
+    getTableItem(str) {
+      let dimension = this.dimension;
+      let is = false;
+      dimension.some(item => {
+        for (var key in item) {
+          if (str == key) {
+            if (typeof item[key] == 'object') {
+              if (key == 'result_file') {
+                // 附件
+                if (item[key].append.length > 0 || item[key].images.length > 0) {
+                  is = true;
+                  return true;
+                }
+              } else {
+                //是数组并且长度大于0
+                if (item[key].length > 0) {
+                  is = true;
+                  return true;
+                }
+              }
+            } else {
+              if (key == 'target') {
+                if (item[key] != '0' && item[key] != '-') {
+                  //是有数据并且!= -
+                  is = true;
+                  return true;
+                }
+              } else {
+                if (item[key] != '-') {
+                  //是有数据并且!= -
+                  is = true;
+                  return true;
+                }
+              }
+            }
+          }
+        }
+      });
+      return is;
+    },
+    //流程点击
+    processDet(data) {
+      this.processDel = data;
+      this.isChecks = true;
+      if (data.target.length == 0) {
+        this.proNum = '';
+      } else {
+        let arr = 0;
+        data.target.forEach((item, index) => {
+          if (item.status == 2) {
+            arr++;
+          }
+        });
+        this.proNum = '(' + arr + '/' + data.target.length + ')';
+      }
+      let code = this.processDel.code;
+      if (this.processDel.status == 1) {//当是目标制定,目标确认 结果值录入,上级评分,指定人评分,审批时显示转交按钮
+        if (code == 'target' || code == 'confirm' || code == 'score_supervisor' || code == 'special_scorer' || code == 'result_value' || code == 'review') {
+          this.transferBut = true;
+        }//当上级评分,指定人评分,判断是否具有转交权限
+      }
+    },
+    handleCommand(val) {
+      //管理选项
+      if (val == 'a') {
+        //重置流程
+        this.resetFlow = true;
+      } else if (val == 'b') {
+        this.isAdjustment = true;
+      }
+    },
+    //
+    setDataAccess() {
+      this.isAdjustment = false;
+      if (this.radio == 2) {
+        //调整目标
+        this.$router.push({
+          name: 'adjustment',
+          query: { id: this.employeeID }
+        });
+      } else {
+        //调整目标
+        this.$router.push({
+          name: 'adjustment2',
+          query: { id: this.employeeID }
+        });
+      }
+    },
+    // 沟通反馈
+    saveCommunication() {
+      if (!this.communicationVal) {
+        this.$message.error('请输入沟通内容');
+        return false;
+      }
+      let target_id = this.tags.map(item => {
+        return item.id;
+      });
+      this.$axiosUser('post', '/api/pro/per/package/negotiation', {
+        id: this.employeeID,
+        content: this.communicationVal,
+        target_id: JSON.stringify(target_id)
+      }).then(res => {
+        this.$message.success('已沟通');
+        this.employeeDet();
+        this.communication = false;
+      });
+    },
+    confirmCreator(e) {
+      this.tags = e.employee;
+    },
+    handleClose(tag, index) {
+      this.tags.splice(index, 1);
+    },
+    //评分按钮
+    gradeClick() {
+      this.gradeBegin = true;
+      let dnsion = [];
+      this.dimension.forEach(item => {
+        if (!item.toScore) {
+          item.score_infos.forEach(arr => {
+            if (arr.employee_id == this.userInfo.id && arr.id == this.atPresentFlow) {
+              item.score_grade = arr.point; //某指标的分数
+              item.score_remark = arr.remark; //评分说明
+              if (item.type == 1) {
+                item.expressionStr = getExpressionStr(item.expression)
+              } else {
+                item.expressionStr = ''
+              }
+              dnsion.push(item);
+            }
+          });
+        }
+      });
+      let data = {};
+      dnsion.forEach(item => {
+        item.wdLeg = 0;
+      });
+      let totalScore = {
+        theDimension: '总分',
+        wdLeg: 0,
+        totalScore: true
+      };
+      this.flow.forEach(item => {
+        if (item.code == 'score_supervisor' && item.status == 1) {
+          this.ruleScore = item.rule == 2 ? 2 : 1; //1-指标均要评分 2-评分总结
+          this.thecurrentFlow = 'score_supervisor';
+          totalScore.codeId = item.id;
+        } else if (item.code == 'special_scorer' && item.status == 1) {
+          this.ruleScore = 1;
+        }
+        if ((item.code == 'score_supervisor' && item.status == 1) || (item.code == 'special_scorer' && item.status == 1)) {
+          //上级评分,特定评分     评分人必填项
+          item.action.forEach(arr => {
+            this.mandatoryScore = arr == 'comment' ? true : false; //指标说明是否必填
+          });
+        }
+      });
+      this.scoreInfo.forEach(item => {
+        item.employees.forEach(arr => {
+          if (arr.employee_id == this.userInfo.id) {
+            this.tabTotaScore = arr.point ? arr.point : 0;
+            if (item.id == totalScore.codeId && this.ruleScore == 2) {
+              totalScore.score_grade = arr.point;
+              totalScore.total_score_comment = arr.comment ? arr.comment : '';
+            }
+          }
+        });
+      });
+      let dimenList = [];
+      let users = [];//当前节点的自己的信息
+      this.flow.forEach(item => {//根据流程当前节点,找节点的人员中的登陆者
+        if (item.status == 1) {
+          item.target.some(arr => {
+            if (arr.employee_id == this.userInfo.id) {
+              arr.flowStatusId = item.id;//当前节点的ID
+              users = arr
+              return true
+            }
+          });
+        }
+      });
+      users.list.forEach(att => {//获取当前节点审批人员中的登陆者
+        dnsion.forEach((add, index) => {
+          if (att.index_id == add.id && att.dimension_key == add.planIndex[0] && att.index_key == add.planIndex[1]) {//因为不同维度下可能存在相同的指标,所以也要判断他的维度是否一致
+            add.dimension_key = att.dimension_key; //维度索引
+            add.index_key = att.index_key; //指标索引
+            add.score_infos.forEach(user => { //显示的文案,找到当前登录人
+              if (user.id == users.flowStatusId) {
+                if (user.employee_id == this.userInfo.id) {
+                  this.scoreTab.title = user.title;
+                  this.scoreTab.explain = user.title.split(':')[0] + '说明';
+                }
+              }
+            })
+            dimenList.push(add);
+          }
+        });
+      });
+      dimenList.push(totalScore);
+      this.$nextTick(() => {
+        //  this.dimension = dimenList;
+        this.dimension = dimenList.map(item => ({ ...item }));
+      })
+    },
+    gradeTurn() {
+      //评分驳回按钮
+      this.turnDown = true;
+    },
+    gradeOk() {
+      //评分驳回按钮
+      this.examineConsent = true;
+    },
+    tDownOk(num, formName) {
+      let tDownList = this.tDownList;
+      if (num == 1) {
+        let data = {
+          id: this.employeeID, //个人考核包ID
+          agree: 1, //同意1    驳回0
+          c_node_id: this.atPresentFlow,//当前节点ID
+          comment: tDownList.comment //审核意见
+        };
+        this.tDownHttpJx(1, data);
+      } else if (num == 0) {
+        //驳回
+        this.$refs[formName].validate(valid => {
+          if (valid) {
+            if (tDownList.employee_id.length == 0) {
+              this.$message.error('至少选择一名重置人员');
+              return false;
+            }
+            if (!tDownList.comment) {
+              this.$message.error('请输入驳回说明');
+              return false;
+            }
+            this.$confirm('流程将驳回到选中节点,已完成的节点需要重新进行处理,确认重置流程?', '提示', {
+              confirmButtonText: '确定',
+              cancelButtonText: '取消',
+              type: 'warning'
+            })
+              .then(() => {
+                let data = {
+                  id: this.employeeID, //个人考核包ID
+                  agree: 0, //同意1    驳回0
+                  node_id: tDownList.node_id, //重置到某个节点, (type 1 必填)
+                  c_node_id: this.atPresentFlow,//当前节点ID
+                  employee_id: JSON.stringify(tDownList.employee_id), //重置到节点的某个用户 string(JSOn)
+                  comment: tDownList.comment //审核意见
+                };
+                this.tDownHttpJx(0, data);
+              })
+              .catch(() => { });
+          } else {
+            return false;
+          }
+        });
+      }
+    },
+    tDownHttpJx(num, data) {
+      this.$axiosUser('post', '/api/pro/per/package/review', data).then(res => {
+        this.$message.success('提交成功');
+        this.tDlose(num);
+        this.employeeDet();
+      });
+    },
+    tDlose(num) {
+      //驳回侧边栏关闭
+      if (num == 0) {
+        this.turnDown = false;
+      } else if (num == 1) {
+        this.examineConsent = false;
+      }
+    },
+    //重置确定
+    rFlowOk(formName) {
+      this.$refs[formName].validate(valid => {
+        if (valid) {
+          let rFlowList = this.rFlowList;
+          if (rFlowList.type == 1) {
+            if (rFlowList.employee_id.length == 0) {
+              this.$message.error('至少选择一名重置人员');
+              return false;
+            }
+          }
+          this.$confirm('流程将重置,已完成的节点需要重新进行处理,确认重置流程?', '提示', {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning'
+          })
+            .then(() => {
+              let data;
+              if (rFlowList.type == 1) {
+                data = {
+                  id: this.employeeID, //个人考核包ID
+                  type: rFlowList.type, //重置类型 1 流程内重置 2 重读维度流程 重置
+                  node_id: rFlowList.node_id, //重置到某个节点, (type 1 必填)
+                  employee_id: JSON.stringify(rFlowList.employee_id), //重置到节点的某个用户 string(JSOn)
+                  comment: rFlowList.comment //审核意见
+                };
+              } else {
+                data = {
+                  id: this.employeeID, //个人考核包ID
+                  type: rFlowList.type, //重置类型 1 流程内重置 2 重读维度流程 重置
+                  overwrite_mode: rFlowList.overwrite_mode, //1 从原来考核模板覆写,2 从个人考核包重置 (type 2 必填)
+                  comment: rFlowList.comment //审核意见
+                };
+              }
+              this.$axiosUser('post', 'api/pro/per/package/reset_flow', data).then(res => {
+                this.$message.success('提交成功');
+                this.resetFlow = false;
+                this.employeeDet();
+              });
+            })
+            .catch(() => { });
+        } else {
+          return false;
+        }
+      });
+    },
+    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
+      if (!this.gradeBegin && !row.toScore) {
+        if (columnIndex === 0) {
+          return {
+            rowspan: row.wdLeg,
+            colspan: 1
+          };
+        }
+      }
+      if (row.zfLeg) {
+        //考核结果、绩效等级
+        if (column.label == '考核结果' || column.label == '绩效等级') {
+          if (rowIndex != 1) {
+            return {
+              rowspan: row.zfLeg,
+              colspan: 1
+            };
+          } else {
+            return {
+              rowspan: 0,
+              colspan: 0
+            };
+          }
+        }
+      }
+    }
+  },
+  beforeRouteLeave(to, from, next) {
+    if (to.name != 'formulate' && to.name != 'resultSet') {
+      localStorage.removeItem("staffAssDet")
+    }
+    next();
+  }
+};
+</script>
+<style scoped lang="scss">
+.guidang {
+  margin-left: 20px;
+  width: 70px;
+  animation: example 1s;
+}
+
+@keyframes example {
+  from {
+    transform: scale(1.4);
+  }
+
+  to {
+    transform: scale(1);
+  }
+}
+
+.popover-box {
+  opacity: 1;
+  border-radius: 4px;
+  width: 250px;
+}
+
+.popover-title {
+  font-size: 14px;
+  font-family: PingFang SC;
+  font-weight: 400;
+  text-align: center;
+  color: #FFCB00;
+  margin-bottom: 10px;
+}
+
+.popover-content {
+  font-size: 14px;
+  font-family: PingFang SC;
+  font-weight: 400;
+  opacity: 1;
+  color: #fff;
+}
+
+.result {
+  border: 2px solid #ff9600;
+  padding: 5px 10px;
+  color: #ff9600;
+  text-align: center;
+}
+
+.flow-img {
+  width: 20px;
+  position: absolute;
+  right: -30px;
+}
+
+.all {
+  position: relative;
+  font-size: 14px;
+  background-color: #fff;
+  padding: 20px;
+
+  header {
+    margin-bottom: 60px;
+
+    .head {
+      border-top: 1px solid #e6e6e6;
+      border-bottom: 1px solid #e6e6e6;
+      padding: 20px 0;
+      margin-top: 10px;
+    }
+
+    .head2User {
+      .headTname {
+        padding: 7px 0 0 15px;
+
+        div {
+          padding: 0 0 3px 0;
+          font-size: 15px;
+        }
+
+        span {
+          font-size: 13px;
+          color: #969696;
+        }
+      }
+    }
+  }
+}
+
+.upDown-box {
+  position: fixed;
+  bottom: 10px;
+  left: 50%;
+  background-color: #fff;
+  z-index: 100;
+  width: 370px;
+  height: 60px;
+  border-radius: 100px;
+  margin-left: -185px;
+  box-shadow: 0 0 5px #999999;
+}
+
+.upName {
+  width: 80px;
+  text-align: center;
+  padding: 0 5px;
+  font-weight: 600;
+}
+
+.up-item {
+  cursor: pointer;
+}
+
+.up-item:hover {
+  cursor: pointer;
+  color: #409EFF;
+}
+
+.shuru {
+  border-bottom: 1px solid #DCDFE6;
+  cursor: pointer;
+  color: #C0C4CC;
+  line-height: 36px;
+  height: 36px;
+}
+
+.aite {
+  padding: 10px;
+  font-size: 16px;
+  cursor: pointer;
+  width: 40px;
+}
+
+.aite:hover {
+  color: #409EFF;
+}
+
+.flow-item-start,
+.flow-item {
+  background-color: #ECF5FF;
+  height: 60px;
+  min-width: 270px;
+  position: relative;
+  margin-right: 40px;
+  margin-top: 20px;
+  padding: 0 10px;
+  border-radius: 5px;
+}
+
+.flow-box {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  width: 230px;
+  display: inline-block;
+}
+
+// .flow-item-start::after {
+//   position: absolute;
+//   content: '';
+//   width: 0;
+//   height: 0;
+//   border-top: 18px solid transparent;
+//   border-left: 20px solid #f4f6f9;
+//   border-bottom: 18px solid transparent;
+//   border-radius: 2px;
+//   top: 0;
+//   right: -20px;
+// }
+// .flow-item::before {
+//   content: '';
+//   position: absolute;
+//   width: 0;
+//   height: 0;
+//   border-top: 18px solid transparent;
+//   border-left: 20px solid #fff;
+//   border-bottom: 18px solid transparent;
+//   border-radius: 2px;
+//   top: 0;
+//   left: 0px;
+// }
+// .flow-item::after {
+//   content: '';
+//   position: absolute;
+//   width: 0;
+//   height: 0;
+//   border-top: 18px solid transparent;
+//   border-left: 20px solid #f4f6f9;
+//   border-bottom: 18px solid transparent;
+//   border-radius: 2px;
+//   top: 0;
+//   right: -20px;
+// }
+.el-icon-warning-outline {
+  color: #848484;
+  position: relative;
+  top: 1px;
+}
+
+.flow-item-color {
+  background-color: #409EFF;
+  color: #fff;
+
+  .detailsPonit {
+    color: #ffffff;
+  }
+
+  .el-icon-warning-outline {
+    color: #ffffff;
+  }
+}
+
+.detailsPonit {
+  margin-left: 10px;
+  font-size: 14px;
+  color: #848484;
+  cursor: pointer;
+}
+
+.flow-item-color::after {
+  border-left: 20px solid #409EFF;
+}
+
+.feedDoalog {
+  /deep/ .el-dialog__body {
+    padding: 0 20px 30px;
+  }
+}
+
+.mentSty {
+  max-width: 300px;
+  height: 23px;
+  display: inline-block;
+}
+
+// .button-width {
+//   button {
+//     width: 80px;
+//   }
+// }
+.elFrom-margin {
+  /deep/ .el-form-item__label {
+    padding: 0;
+  }
+
+  padding: 0 20px 0 0;
+}
+
+.processSty {
+  margin-top: -20px;
+
+  .proListSty {
+    border-bottom: 1px solid #e2e2e2;
+    padding: 17px 0;
+
+    .proButt {
+      color: #4799ff;
+      border: 1px solid #78a1ff;
+      font-size: 14px;
+      padding: 0px 10px;
+      height: 30px;
+    }
+
+    .proName {
+      font-size: 15px;
+      line-height: 30px;
+      padding-left: 8px;
+    }
+  }
+}
+
+.footer {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  background-color: #fff;
+  border-top: 1px solid #e8e8e8;
+  padding: 12px 30px;
+  z-index: 100;
+}
+
+.dian {
+  position: absolute;
+  right: 10px;
+}
+</style>

+ 330 - 225
src/performance/views/assessManagement/staffAssDet.vue

@@ -2,64 +2,82 @@
   <div class="all boxMinHeight">
     <template v-if="isDetails">
       <PageHead phName="员工绩效详情"></PageHead>
-      <div class="flex-box-ce" style="position: absolute;right: 20px;top: 20px;z-index: 2;">
-        <el-select v-model="headvalue" style="width: 250px;" placeholder="请选择"  v-if="!isDisabled">
+      <div class="flex-box-ce" style="position: absolute; right: 20px;top: 20px;z-index: 2;">
+        <el-select v-model="headvalue" style="width: 300px;" placeholder="请选择" v-if="!isDisabled">
           <el-option v-for="item in headoptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
         </el-select>
-        <div v-else class="fontColorB font-flex-word" style="width: 250px;">{{packageName}}</div>
+        <div v-else class="fontColorB font-flex-word" style="width: 250px; font-size: 16px; font-weight: 600;">
+          {{packageName}}</div>
       </div>
       <header v-loading="staffLoad">
-        <div class="flex-box-ce head">
-          <div class="flex-box-ce head2User flex-1">
-            <userImage class="fl" :id="remployee.id" :user_name="remployee.name" :img_url="remployee.img_url" width="50px" height="50px"></userImage>
+        <div class="head">
+          <div class="head2User">
+            <userImage class="fl" :id="remployee.id" :user_name="remployee.name" :img_url="remployee.img_url"
+              width="50px" height="50px"></userImage>
             <div class="headTname">
               <div style="">{{ remployee.name }}</div>
-              <span v-for="(item, index) in remployee.employee_detail.dept_list" :key="index" v-if="remployee.employee_detail.dept_list.length>0">
-                <span>{{ item.dept_name }}</span>
-                <span v-if="remployee.employee_detail.dept_list.length - index > 1">,</span>
-              </span>
+              <div v-if="remployee.employee_detail.dept_list && remployee.employee_detail.dept_list.length > 0">
+                <span v-for="(item, index) in remployee.employee_detail.dept_list" :key="index"
+                  v-if="remployee.employee_detail.dept_list.length > 0">
+                  <span>{{ item.dept_name }}</span>
+                  <span v-if="remployee.employee_detail.dept_list.length - index > 1">,</span>
+                </span>
+              </div>
+              <div v-else style="color: #C0C4CF;">暂无部门数据</div>
             </div>
             <img v-if="has_finish" src="static/images/guidang.png" class="guidang">
           </div>
           <template v-if="!gradeBegin">
             <div class="button-width" v-if="!has_finish">
-              <!-- 撤销上一次操作 -->
-              <template v-if="revocationShow">
-                <el-button  @click="isShowCx=true" type="primary">撤销上一次操作</el-button>
-              </template>
+              <el-button-group>
+                <!-- 撤销上一次操作 -->
+                <template v-if="revocationShow">
+                  <el-button @click="isShowCx = true" type="primary" icon="el-icon-document-delete">撤销上一次操作</el-button>
+                </template>
 
-              <!-- 目标制定节点 -->
-              <template v-if="isShowTargetBtn">
-                <el-button  @click="openFormulate()"  type="primary">制定目标</el-button>
-                <el-button  @click="submit()"  type="primary">提交</el-button>
-              </template>
+                <!-- 目标制定节点 -->
+                <template v-if="isShowTargetBtn">
+                  <el-button type="primary" icon="el-icon-s-flag" @click="openFormulate()">制定目标</el-button>
+                  <el-button type="primary" icon="el-icon-mouse" @click="submit()">提交</el-button>
+                </template>
 
-              <!-- 目标确认 -->
-              <template v-if="isShowConfirmBtn">
-                <el-button  type="primary" @click="gradeOk">同意</el-button>
-                <el-button class="red" type="danger" plain  @click="gradeTurn" style="margin-left: -2px;background-color: #fff;">驳回</el-button>
-                <el-button v-if="isUpdateIndex" @click="openFormulate()" >修改目标</el-button>
-              </template>
+                <!-- 目标确认 -->
+                <template v-if="isShowConfirmBtn">
+                  <el-button type="primary" icon="el-icon-check" @click="gradeOk">同意</el-button>
+                  <el-button type="primary" icon="el-icon-close" @click="gradeTurn">驳回</el-button>
+                  <el-button v-if="isUpdateIndex" type="primary" icon="el-icon-edit-outline"
+                    @click="openFormulate()">修改目标</el-button>
+                </template>
 
-              <!-- 录入结果值 -->
-              <el-button v-if="resultButShow" @click="openResult()"  type="primary">{{resultStr}}</el-button>
-              <!-- 审批 -->
-              <template v-if="examineButShow">
-                <el-button  type="primary" @click="gradeOk">同意</el-button>
-                <el-button class="red"  type="danger" plain v-if="isAction" @click="gradeTurn"style="margin-left: -2px;background-color: #fff;">驳回</el-button>
-              </template>
-              <!-- 评分 -->
-              <el-button v-if="gradeButShow"  type="primary" @click="gradeClick">评分</el-button>
-              <el-button v-if="recordsManagement"  @click="isTrack = true">管理记录</el-button>
-              <el-button v-if="actionButShow"  @click="isPlan = true">执行计划</el-button>
-              <el-button  v-if="feedbackBut" @click="communication = true">沟通反馈</el-button>
+                <!-- 录入结果值 -->
+                <el-button v-if="resultButShow" @click="openResult()" type="primary" icon="el-icon-edit-outline">{{
+                  resultStr }}</el-button>
+                <!-- 审批 -->
+                <template v-if="examineButShow">
+                  <el-button type="primary" icon="el-icon-check" @click="gradeOk">同意</el-button>
+                  <el-button type="primary" icon="el-icon-close" v-if="isAction" @click="gradeTurn">驳回</el-button>
+                </template>
+                <!-- 评分 -->
+                <el-button type="primary" v-if="okrs && okrs.length > 0" icon="el-icon-s-opportunity"
+                  @click="open1()">查看已关联OKR</el-button>
+                <el-button v-if="$getRole(1) || isSj || this.employID == userInfo.id" type="primary"
+                  icon="el-icon-s-opportunity" @click="open2()">关联OKR</el-button>
+                <el-button type="primary" icon="el-icon-finished" v-if="gradeButShow" @click="gradeClick">评分</el-button>
+                <el-button type="primary" icon="el-icon-tickets" v-if="recordsManagement"
+                  @click="isTrack = true">管理记录</el-button>
+                <el-button type="primary" icon="el-icon-pie-chart" v-if="actionButShow"
+                  @click="isPlan = true">执行计划</el-button>
+                <el-button type="primary" icon="el-icon-chat-dot-round" v-if="feedbackBut"
+                  @click="communication = true">沟通反馈</el-button>
+              </el-button-group>
               <!-- 主次管理员,被考核人上级 -->
-              <template v-if="$getRole(1)||isSj">
+              <template v-if="$getRole(1) || isSj">
                 <el-dropdown style="margin-left:10px;" @command="handleCommand">
-                  <el-button>管理</el-button>
+                  <el-button>管理 <i class="el-icon-arrow-down"></i></el-button>
                   <el-dropdown-menu slot="dropdown">
-                    <el-dropdown-item v-for="(item, index) in dropdownMenu" :key="index" :command="item.key" :divided="item.bordok" v-if="item.isShow">
-                        {{ item.name }}
+                    <el-dropdown-item v-for="(item, index) in dropdownMenu" :key="index" :command="item.key"
+                      :divided="item.bordok" v-if="item.isShow">
+                      {{ item.name }}
                     </el-dropdown-item>
                   </el-dropdown-menu>
                 </el-dropdown>
@@ -71,8 +89,7 @@
         <div class="flex-box-ce flex-d-wrap">
           <div v-for="(item, index) in flow" :key="index"
             :class="[item.status == 1 ? 'flow-item-color' : '', index == 0 ? 'flow-item-start' : 'flow-item']"
-            class="flex-box-ce"
-          >
+            class="flex-box-ce">
             <el-tooltip effect="dark" :content="item.code == 'execution' ? execution : item.remarks" placement="top">
               <span class="flow-box">
                 <span>{{ index + 1 }}.{{ item.remark }}</span>
@@ -88,17 +105,19 @@
                 </template>
               </span>
             </el-tooltip>
-            <i class="el-icon-success blue" v-if="item.status == 2" style="margin-right:10px;"></i>
-            <div @click.stop="processDet(item)" style="width: 20px;" class="dian" v-if="item.target.length > 0&& !gradeBegin">
-                <i class="el-icon-more detailsPonit"></i>
+            <i class="el-icon-success blue" v-if="item.status == 2" style="margin-right: 10px;"></i>
+            <div @click.stop="processDet(item)" style="width: 20px;" class="dian"
+              v-if="item.target.length > 0&& !gradeBegin">
+              <i class="el-icon-more detailsPonit"></i>
             </div>
-            <img src="static/images/jt.png" class="flow-img" v-if="index!=(flow.length-1)||flow[flow.length - 1].status == 2">
+            <img src="static/images/jt.png" class="flow-img"
+              v-if="index!=(flow.length-1) || flow[flow.length - 1].status == 2">
           </div>
 
           <template v-if="flow.length > 0">
             <div class="flow-item flex-box-ce flex-center-center" v-if="flow[flow.length - 1].status == 2">
-               <span class="flex-1">{{ flow.length + 1 }}.结束</span>
-               <i class="el-icon-success blue" style="margin-right:10px;"></i>
+              <span class="flex-1">{{ flow.length + 1 }}.结束</span>
+              <i class="el-icon-success blue" style="margin-right:10px;"></i>
             </div>
           </template>
         </div>
@@ -111,42 +130,43 @@
             </div>
           </template>
           <el-tooltip placement="bottom">
-             <div class="popover-box" slot="content">
-               <div class="popover-title">开启显示更多可浏览全部考核内容</div>
-               <div class="popover-content">点击右边箭头和滑动下方滚动条都可以查看更多内容</div>
-             </div>
-             <el-switch
-               v-model="isShowOneselfScore"
-               active-text="显示更多">
-             </el-switch>
-           </el-tooltip>
+            <div class="popover-box" slot="content">
+              <div class="popover-title">开启显示更多可浏览全部考核内容</div>
+              <div class="popover-content">点击右边箭头和滑动下方滚动条都可以查看更多内容</div>
+            </div>
+            <el-switch v-model="isShowOneselfScore" active-text="显示更多">
+            </el-switch>
+          </el-tooltip>
         </div>
 
         <!-- 表格 -->
         <div class="dimensionCla" v-loading="tableLoad">
           <!-- 点击滚动 -->
-          <TableBox :tableData="dimension" :isShowYd="isShowOneselfScore" :headerCellStyle="{ background: '#ECF5FF', textAlign: 'center' }" :objectSpanMethod="objectSpanMethod">
-            <el-table-column prop="theDimension" width="80" label="维度" align="center">
+          <TableBox :tableData="dimension" :isShowYd="isShowOneselfScore"
+            :headerCellStyle="{ background: '#ECF5FF', textAlign: 'center' }" :objectSpanMethod="objectSpanMethod">
+            <el-table-column prop="theDimension" width="80" label="分类" align="center">
               <template slot-scope="scope">
                 <span style="width: 13px;display: inline-block;">{{ scope.row.theDimension }}</span>
-                <template v-if="calc_dimension&&(scope.row.type == 1||scope.row.type == 2)">
+                <template v-if="calc_dimension && (scope.row.type == 1||scope.row.type == 2)">
                   <div v-if="!scope.row.toScore">({{ scope.row.dimension_weight }}%)</div>
                 </template>
               </template>
             </el-table-column>
             <el-table-column prop="name" label="指标名称" min-width="220">
               <template slot-scope="scope">
-<!--                   <template v-if="Number(scope.row.weight) > 0">
-                     <PreBox :value="scope.row.name+'(权重:'+scope.row.weight+'%)'"></PreBox>
-                   </template> -->
-                   <PreBox  :value="scope.row.name"></PreBox>
-               </template>
+                <!-- 
+                  <template v-if="Number(scope.row.weight) > 0">
+                    <PreBox :value="scope.row.name+'(权重:'+scope.row.weight+'%)'"></PreBox>
+                  </template> 
+                  -->
+                <PreBox :value="scope.row.name"></PreBox>
+              </template>
             </el-table-column>
             <el-table-column prop="name" label="权重" align="center" width="60">
               <template slot-scope="scope">
-                  <span v-if="Number(scope.row.weight) > 0">{{scope.row.weight}}%</span>
-                  <span v-else>--</span>
-               </template>
+                <span v-if="Number(scope.row.weight) > 0">{{scope.row.weight}}%</span>
+                <span v-else>--</span>
+              </template>
             </el-table-column>
             <template v-if="isShowOneselfScore">
               <el-table-column prop="type" label="指标类型">
@@ -163,14 +183,16 @@
               <template slot-scope="scope">
                 <div v-if="scope.row.target != '-' && scope.row.target != undefined&&scope.row.target!='0'">
                   目标值:
-                 <span>{{ scope.row.target + '' + scope.row.unit }}</span>
+                  <span>{{ scope.row.target + '' + scope.row.unit }}</span>
                 </div>
                 <span v-else>-</span>
-                <div v-if="scope.row.result !== null&&scope.row.result !== ''&&scope.row.result !== undefined" class="orange">
+                <div v-if="scope.row.result !== null&&scope.row.result !== ''&&scope.row.result !== undefined"
+                  class="orange">
                   <template v-if="scope.row.type==1">
-                      结果值: <span>{{ scope.row.result + '' + scope.row.unit }}</span><span v-if="scope.row.resultUserName">({{scope.row.resultUserName}})</span>
+                    结果值: <span>{{ scope.row.result + '' + scope.row.unit }}</span><span
+                      v-if="scope.row.resultUserName">({{scope.row.resultUserName}})</span>
                   </template>
-<!--                  <template v-if="scope.row.result_file">
+                  <!-- <template v-if="scope.row.result_file">
                     <div v-if="scope.row.result_file.images.length>0">
                       <div style="margin-bottom: 3px;cursor: pointer;" class="blue" v-for="(item, index) in scope.row.result_file.images" :key="index" @click="onFilePreView(item)">{{ item.name }}</div>
                     </div>
@@ -186,49 +208,59 @@
             <el-table-column prop="target" label="附件" align="left" min-width="150" v-if="getTableItem('result_file')">
               <template slot-scope="scope" v-if="scope.row.result_file">
                 <div v-if="scope.row.result_file.images.length>0">
-                  <div style="margin-bottom: 3px;cursor: pointer;" class="blue" v-for="(item, index) in scope.row.result_file.images" :key="index" @click="onFilePreView(item)">{{ item.name }}</div>
+                  <div style="margin-bottom: 3px;cursor: pointer;" class="blue"
+                    v-for="(item, index) in scope.row.result_file.images" :key="index" @click="onFilePreView(item)">{{
+                    item.name }}</div>
                 </div>
                 <div v-if="scope.row.result_file.append.length>0">
-                  <div style="margin-bottom: 3px;cursor: pointer;" class="blue" v-for="(item, index) in scope.row.result_file.append" :key="index" @click="onFilePreView2(item)">{{ item.name }}</div>
+                  <div style="margin-bottom: 3px;cursor: pointer;" class="blue"
+                    v-for="(item, index) in scope.row.result_file.append" :key="index" @click="onFilePreView2(item)">{{
+                    item.name }}</div>
                 </div>
               </template>
             </el-table-column>
 
             <template v-if="isShowOneselfScore">
-              <el-table-column prop="point_limit" label="加扣分上限" align="center" width="100" v-if="getTableItem('point_limit')"></el-table-column>
+              <el-table-column prop="point_limit" label="加扣分上限" align="center" width="100"
+                v-if="getTableItem('point_limit')"></el-table-column>
             </template>
 
             <el-table-column prop="per_remark" label="考核标准" min-width="200" v-if="getTableItem('per_remark')">
               <template slot-scope="scope">
-                  <PreBox :value="scope.row.per_remark"></PreBox>
+                <PreBox :value="scope.row.per_remark"></PreBox>
               </template>
             </el-table-column>
 
             <el-table-column prop="remark" label="备注" min-width="200" v-if="isShowOneselfScore">
               <template slot-scope="scope">
-                  <PreBox :value="scope.row.remark"></PreBox>
+                <PreBox :value="scope.row.remark"></PreBox>
               </template>
             </el-table-column>
 
-            <el-table-column prop="schedule" label="执行计划" align="center" min-width="200" v-if="getTableItem('schedule')">
+            <el-table-column prop="schedule" label="执行计划" align="center" min-width="200"
+              v-if="getTableItem('schedule')">
               <template slot-scope="scope">
                 <div class="flex-box-ce" v-if="scope.row.schedule && scope.row.schedule.length > 0">
-                  <el-button type="text" class="flex-1"  @click="openPlan(scope.row.planIndex)">({{ scope.row.schedule.length }}) 条执行计划</el-button>
+                  <el-button type="text" class="flex-1" @click="openPlan(scope.row.planIndex)">({{
+                    scope.row.schedule.length }}) 条执行计划</el-button>
                 </div>
                 <span v-else>-</span>
               </template>
             </el-table-column>
 
-            <el-table-column prop="mamage_record" label="跟踪管理记录" align="center" min-width="200" v-if="getTableItem('mamage_record')">
+            <el-table-column prop="mamage_record" label="跟踪管理记录" align="center" min-width="200"
+              v-if="getTableItem('mamage_record')">
               <template slot-scope="scope">
                 <div class="flex-box-ce" v-if="scope.row.mamage_record && scope.row.mamage_record.length > 0">
-                   <el-button type="text" class="flex-1"  @click="openTrack(scope.row.planIndex)">({{ scope.row.mamage_record.length }}) 条管理记录</el-button>
+                  <el-button type="text" class="flex-1" @click="openTrack(scope.row.planIndex)">({{
+                    scope.row.mamage_record.length }}) 条管理记录</el-button>
                 </div>
                 <span v-else>-</span>
               </template>
             </el-table-column>
 
-            <el-table-column v-for="(item, index) in lingScore_infos" :key="index" min-width="200" v-if="(item.poiSco || item.poicom)&&isShowOneself(item)">
+            <el-table-column v-for="(item, index) in lingScore_infos" :key="index" min-width="200"
+              v-if="(item.poiSco || item.poicom)&&isShowOneself(item)">
               <template slot="header" slot-scope="scope">
                 <el-tooltip effect="dark" :content="item.title" placement="top">
                   <span>
@@ -243,7 +275,8 @@
                 <template slot-scope="scope">
                   <div v-for="(arr, att) in scope.row.score_infos" :key="att">
                     <div v-if="arr.newKey == item.newKey">
-                      <span v-if="arr.employee_id == item.employee_id">{{ initData(arr.point) }} <span class="blue">{{arr.level}}</span></span>
+                      <span v-if="arr.employee_id == item.employee_id">{{ initData(arr.point) }} <span
+                          class="blue">{{arr.level}}</span></span>
                       <span v-else>-</span>
                     </div>
                   </div>
@@ -260,7 +293,7 @@
                   <div v-for="(arr, att) in scope.row.score_infos" :key="att">
                     <div v-if="arr.newKey == item.newKey">
                       <span v-if="arr.employee_id == item.employee_id">
-                         <PreBox :value="initData(arr.remark)"></PreBox>
+                        <PreBox :value="initData(arr.remark)"></PreBox>
                       </span>
                       <span v-else>-</span>
                     </div>
@@ -273,46 +306,41 @@
               </el-table-column>
             </el-table-column>
 
-             <!-- 输入框 -->
+            <!-- 输入框 -->
             <template v-if="gradeBegin">
-             <!-- 评分输入 -->
-             <el-table-column  min-width="250" fixed="right">
+              <!-- 评分输入 -->
+              <el-table-column min-width="250" fixed="right">
                 <template slot="header" slot-scope="scope">
                   <div>{{ scoreTab.title }}</div>
                 </template>
                 <template slot-scope="scope">
-                  <el-popover placement="top" v-if="scope.row.auto_score===0||scope.row.auto_score" width="400" trigger="hover">
-                      <div style="padding: 10px;padding-top: 0;">
-                         <div class="flex-box-ce">
-                           <div class="flex-1">按以下公式和数据自动计算评分</div>
-                         </div>
-                         <div v-html="scope.row.expressionStr" style="background-color: #f1f1f1;padding: 10px;text-align: left;border-radius: 5px;cursor: pointer;"></div>
-                        <div class="flex-box-ce">
-                          <div class="orange" style="margin-right: 20px;">结果值:{{scope.row.result}}</div>
-                          <div class="orange">目标值:{{scope.row.target}}</div>
-                        </div>
-                       </div>
-                      <div slot="reference">系统评分<i class="el-icon-warning"></i>:<span class="blue">{{scope.row.auto_score}}</span></div>
+                  <el-popover placement="top" v-if="scope.row.auto_score===0||scope.row.auto_score" width="400"
+                    trigger="hover">
+                    <div style="padding: 10px;padding-top: 0;">
+                      <div class="flex-box-ce">
+                        <div class="flex-1">按以下公式和数据自动计算评分</div>
+                      </div>
+                      <div v-html="scope.row.expressionStr"
+                        style="background-color: #f1f1f1;padding: 10px;text-align: left;border-radius: 5px;cursor: pointer;">
+                      </div>
+                      <div class="flex-box-ce">
+                        <div class="orange" style="margin-right: 20px;">结果值:{{scope.row.result}}</div>
+                        <div class="orange">目标值:{{scope.row.target}}</div>
+                      </div>
+                    </div>
+                    <div slot="reference">系统评分<i class="el-icon-warning"></i>:<span
+                        class="blue">{{scope.row.auto_score}}</span></div>
                   </el-popover>
                   <div v-if="thecurrentFlow == 'score_supervisor'">
                     <!-- 评指标分 -->
-                    <el-input
-                      v-if="ruleScore == 1 && !scope.row.totalScore"
-                      :rows="1"
-                      @blur="sgradeBlur(scope.$index)"
+                    <el-input v-if="ruleScore == 1 && !scope.row.totalScore" :rows="1" @blur="sgradeBlur(scope.$index)"
                       @input="[sgradeInp(scope.$index,scope.row), (scope.row.score_grade = scope.row.score_grade.match(/\d+(\.\d{0,2})?/) ? scope.row.score_grade.match(/\d+(\.\d{0,2})?/)[0] : '')]"
-                      v-model="scope.row.score_grade"
-                      placeholder="请输入"
-                    ></el-input>
+                      v-model="scope.row.score_grade" placeholder="请输入"></el-input>
                     <span v-else-if="ruleScore == 1 && scope.row.totalScore">{{ tabTotaScore }}</span>
                     <!-- 评总分 -->
-                    <el-input
-                      v-else-if="ruleScore == 2 && scope.row.totalScore"
-                      :rows="1"
+                    <el-input v-else-if="ruleScore == 2 && scope.row.totalScore" :rows="1"
                       @input="[sgradeInp(scope.$index,scope.row), (scope.row.score_grade = scope.row.score_grade.match(/\d+(\.\d{0,2})?/) ? scope.row.score_grade.match(/\d+(\.\d{0,2})?/)[0] : '')]"
-                      v-model="scope.row.score_grade"
-                      placeholder="请输入"
-                    ></el-input>
+                      v-model="scope.row.score_grade" placeholder="请输入"></el-input>
                     <span v-else>-</span>
                   </div>
 
@@ -320,13 +348,12 @@
                     <span v-if="scope.row.totalScore">{{ tabTotaScore }}</span>
                     <el-input v-else :rows="1" @blur="sgradeBlur(scope.$index)"
                       @input="[sgradeInp(scope.$index,scope.row), (scope.row.score_grade = scope.row.score_grade.match(/\d+(\.\d{0,2})?/) ? scope.row.score_grade.match(/\d+(\.\d{0,2})?/)[0] : '')]"
-                      v-model="scope.row.score_grade" placeholder="请输入"
-                    ></el-input>
+                      v-model="scope.row.score_grade" placeholder="请输入"></el-input>
                   </div>
                 </template>
-             </el-table-column>
-             <!-- 说明 -->
-             <el-table-column  min-width="150" fixed="right">
+              </el-table-column>
+              <!-- 说明 -->
+              <el-table-column min-width="150" fixed="right">
                 <template slot="header" slot-scope="scope">
                   <div>{{ scoreTab.explain }}</div>
                 </template>
@@ -341,14 +368,14 @@
                     </template>
                     <!-- 总分说明 -->
                     <template v-if="ruleScore == 2 && scope.row.totalScore">
-                      <div  @click="showPf(scope.$index,2)">
+                      <div @click="showPf(scope.$index,2)">
                         <PreBox :value="scope.row.total_score_comment" v-if="scope.row.total_score_comment"></PreBox>
                         <div v-else class="shuru">请输入</div>
                       </div>
                     </template>
                   </div>
                 </template>
-             </el-table-column>
+              </el-table-column>
             </template>
 
           </TableBox>
@@ -356,29 +383,32 @@
         <Record :record="record"></Record>
       </header>
       <footer class="footer flex-box-end" v-if="gradeBegin">
-        <el-button  @click="cancel">取消</el-button>
-        <el-button  class="primaryBtn"  @click="save(0)">暂存</el-button>
-        <el-button  type="primary" @click="save(1)">提交评分</el-button>
+        <el-button @click="cancel">取消</el-button>
+        <el-button class="primaryBtn" @click="save(0)">暂存</el-button>
+        <el-button type="primary" @click="save(1)">提交评分</el-button>
       </footer>
     </template>
-    <resultSetAll2 v-else  :peIds="resultData.peIds"  :packageName="resultData.packageName"></resultSetAll2>
+    <resultSetAll2 v-else :peIds="resultData.peIds" :packageName="resultData.packageName"></resultSetAll2>
 
     <!-- 上一个 下一个 -->
     <div class="upDown-box" v-if="isDisabled&& !gradeBegin">
-        <div class="flex-box-ce flex-center-center fontColorB" style="height: 60px;">
-          <div class="flex-1 orange" v-if="!up.employeeID" style="text-align: center;border-right: 1px solid #f1f1f1;">已无待办</div>
-          <div class="flex-1 flex-box-ce flex-center-center up-item" v-else style="border-right: 1px solid #f1f1f1;" @click="qieh(1)">
-              <userImage :user_name="up.name" :img_url="up.img_url" width="40px" height="40px" fontSize="12"></userImage>
-              <div class="upName font-flex-word">{{up.name}}</div>
-              <div>上一个</div>
-          </div>
-          <div class="flex-1 orange" v-if="!down.employeeID" style="text-align: center;">已无待办</div>
-          <div class="flex-1 flex-box-ce flex-center-center up-item" v-else @click="qieh(2)">
-              <div>下一个</div>
-              <div class="upName font-flex-word">{{down.name}}</div>
-              <userImage :user_name="down.name" :img_url="down.img_url" width="40px" height="40px" fontSize="12"></userImage>
-          </div>
+      <div class="flex-box-ce flex-center-center fontColorB" style="height: 60px;">
+        <div class="flex-1 orange" v-if="!up.employeeID" style="text-align: center;border-right: 1px solid #f1f1f1;">
+          已无待办</div>
+        <div class="flex-1 flex-box-ce flex-center-center up-item" v-else style="border-right: 1px solid #f1f1f1;"
+          @click="qieh(1)">
+          <userImage :user_name="up.name" :img_url="up.img_url" width="40px" height="40px" fontSize="12"></userImage>
+          <div class="upName font-flex-word">{{up.name}}</div>
+          <div>上一个</div>
+        </div>
+        <div class="flex-1 orange" v-if="!down.employeeID" style="text-align: center;">已无待办</div>
+        <div class="flex-1 flex-box-ce flex-center-center up-item" v-else @click="qieh(2)">
+          <div>下一个</div>
+          <div class="upName font-flex-word">{{down.name}}</div>
+          <userImage :user_name="down.name" :img_url="down.img_url" width="40px" height="40px" fontSize="12">
+          </userImage>
         </div>
+      </div>
     </div>
 
     <!-- 流程详情 -->
@@ -388,39 +418,44 @@
           <div v-for="(item, index) in processDel.target" :key="index" class="flex-box flex-d-center proListSty">
             <div style="width:230px;" class="flex-box flex-d-center flex-h-ce">
               <div>
-                <userImage class="fl" :id="item.employee_id" :user_name="item.employee_name" width="30px" height="30px" fontSize="12"></userImage>
+                <userImage class="fl" :id="item.employee_id" :user_name="item.employee_name" width="30px" height="30px"
+                  fontSize="12"></userImage>
                 <span class="proName">{{ item.employee_name }}</span>
               </div>
-              <el-tag v-if="processDel.status == 0" size="mini" type="warning" color="#ffe7d3" style="color:#ff8d00;">流程未到</el-tag>
+              <el-tag v-if="processDel.status == 0" size="mini" type="warning" color="#ffe7d3"
+                style="color:#ff8d00;">流程未到</el-tag>
               <!-- 针对任一人处理了,其他人显示无需处理 -->
               <template v-else-if="item.status == 1">
                 <template v-if="(processDel.multi_executor==2)&&getStrus()">
-                    <el-tag size="mini">无需处理</el-tag>
+                  <el-tag size="mini">无需处理</el-tag>
                 </template>
                 <template v-else>
-                    <el-tag size="mini">处理中</el-tag>
+                  <el-tag size="mini">处理中</el-tag>
                 </template>
               </template>
               <el-tag v-else-if="item.status == 2" size="mini" type="success">已处理</el-tag>
             </div>
             <!-- 主子管理员 并且当前节点里包括登录者-->
-            <template v-if="$getRole(1)||item.employee_id==userInfo.id">
-               <template v-if="processDel.code=='score_supervisor'||processDel.code=='special_scorer'">
-                   <!-- 指定评分人节点 -->
-                  <template v-if="processDel.code=='score_supervisor'">
-                     <el-button v-if="transferBut && item.status == 1&& (processDel.transfer||$getRole(1))" class="proButt" @click="careOf(item)">转交</el-button>
-                  </template>
-                  <!-- 特定指标指定评分人,因为默认是可以转交的,所有没有 transfer 字段 -->
-                  <template v-else>
-                     <el-button v-if="transferBut && item.status == 1" class="proButt" @click="careOf(item)">转交</el-button>
-                  </template>
-               </template>
-               <template v-else-if="processDel.code=='review'||processDel.code=='confirm'">
-                  <el-button v-if="transferBut && item.status == 1&& ((processDel.action.indexOf('transfer')>=0)||$getRole(1))" class="proButt" @click="careOf(item)">转交</el-button>
-               </template>
-               <template v-else>
-                 <el-button v-if="transferBut && item.status == 1" class="proButt" @click="careOf(item)">转交</el-button>
-               </template>
+            <template v-if="$getRole(1) || item.employee_id == userInfo.id">
+              <template v-if="processDel.code=='score_supervisor'||processDel.code=='special_scorer'">
+                <!-- 指定评分人节点 -->
+                <template v-if="processDel.code=='score_supervisor'">
+                  <el-button v-if="transferBut && item.status == 1&& (processDel.transfer||$getRole(1))" class="proButt"
+                    @click="careOf(item)">转交</el-button>
+                </template>
+                <!-- 特定指标指定评分人,因为默认是可以转交的,所有没有 transfer 字段 -->
+                <template v-else>
+                  <el-button v-if="transferBut && item.status == 1" class="proButt" @click="careOf(item)">转交</el-button>
+                </template>
+              </template>
+              <template v-else-if="processDel.code=='review'||processDel.code=='confirm'">
+                <el-button
+                  v-if="transferBut && item.status == 1&& ((processDel.action.indexOf('transfer')>=0)||$getRole(1))"
+                  class="proButt" @click="careOf(item)">转交</el-button>
+              </template>
+              <template v-else>
+                <el-button v-if="transferBut && item.status == 1" class="proButt" @click="careOf(item)">转交</el-button>
+              </template>
             </template>
           </div>
         </div>
@@ -437,12 +472,15 @@
     <!--驳回评分 -->
     <BrawerBox drawerTitle="驳回评分" :showDrawer.sync="turnDown">
       <template slot="main">
-        <el-form label-position="top" label-width="80px" :rules="rFlowRules" :model="tDownList" ref="tDownList" class="elFrom-margin">
+        <el-form label-position="top" label-width="80px" :rules="rFlowRules" :model="tDownList" ref="tDownList"
+          class="elFrom-margin">
           <el-form-item label="重置到" prop="node_id">
             <el-select v-model="tDownList.node_id" clearable placeholder="请选择阶段" style="width:100%;">
-              <el-option v-for="item in rFlowArrive" :key="item.value" :label="item.label" :value="item.value"></el-option>
+              <el-option v-for="item in rFlowArrive" :key="item.value" :label="item.label"
+                :value="item.value"></el-option>
             </el-select>
-            <el-select v-if="rUsers.length > 0" multiple v-model="tDownList.employee_id" clearable placeholder="请选择重置人员" style="width:100%;margin-top: 10px;">
+            <el-select v-if="rUsers.length > 0" multiple v-model="tDownList.employee_id" clearable placeholder="请选择重置人员"
+              style="width:100%;margin-top: 10px;">
               <el-option v-for="item in rUsers" :key="item.value" :label="item.label" :value="item.value"></el-option>
             </el-select>
           </el-form-item>
@@ -459,7 +497,8 @@
     <!-- 重置流程 -->
     <BrawerBox drawerTitle="重置流程" :showDrawer.sync="resetFlow">
       <template slot="main">
-        <el-form label-position="top" :rules="rFlowRules" :model="rFlowList" ref="rFlowList" label-width="80px" class="elFrom-margin">
+        <el-form label-position="top" :rules="rFlowRules" :model="rFlowList" ref="rFlowList" label-width="80px"
+          class="elFrom-margin">
           <el-form-item label="操作">
             <el-radio-group v-model="rFlowList.type">
               <el-radio :label="1">重置到指定节点</el-radio>
@@ -474,14 +513,17 @@
           </el-form-item>
           <el-form-item label="重置到" prop="node_id" v-if="rFlowList.type == 1">
             <el-select v-model="rFlowList.node_id" clearable placeholder="请选择阶段" style="width:100%;">
-              <el-option v-for="item in rFlowArrive" :key="item.value" :label="item.label" :value="item.value"></el-option>
+              <el-option v-for="item in rFlowArrive" :key="item.value" :label="item.label"
+                :value="item.value"></el-option>
             </el-select>
-            <el-select v-if="rUsers.length > 0" multiple v-model="rFlowList.employee_id" clearable placeholder="请选择重置人员" style="width:100%;margin-top: 10px;">
+            <el-select v-if="rUsers.length > 0" multiple v-model="rFlowList.employee_id" clearable placeholder="请选择重置人员"
+              style="width:100%;margin-top: 10px;">
               <el-option v-for="item in rUsers" :key="item.value" :label="item.label" :value="item.value"></el-option>
             </el-select>
           </el-form-item>
           <el-form-item label="重置说明" prop="comment">
-            <el-input type="textarea" rows="6" placeholder="请输入重置说明(必填)" v-model="rFlowList.comment" maxlength="200" show-word-limit></el-input>
+            <el-input type="textarea" rows="6" placeholder="请输入重置说明(必填)" v-model="rFlowList.comment" maxlength="200"
+              show-word-limit></el-input>
           </el-form-item>
         </el-form>
       </template>
@@ -491,15 +533,19 @@
       </template>
     </BrawerBox>
     <!-- 跟踪管理 -->
-    <TrackManagement :showDrawer.sync="isTrack"  :isCz="!isCzData"  :recordMemberIds="recordMemberIds"  :id="employeeID" :apList="apList" :assessId="employID" @confirm="employeeDet" :planIndex="planIndex"></TrackManagement>
+    <TrackManagement :showDrawer.sync="isTrack" :isCz="!isCzData" :recordMemberIds="recordMemberIds" :id="employeeID"
+      :apList="apList" :assessId="employID" @confirm="employeeDet" :planIndex="planIndex"></TrackManagement>
     <!-- 执行计划 -->
-    <ActionPlan :showDrawer.sync="isPlan" :isCz="!isCzData" :id="employeeID" :apList="apList" :assessId="employID" @confirm="employeeDet" :planIndex="planIndex"></ActionPlan>
+    <ActionPlan :showDrawer.sync="isPlan" :isCz="!isCzData" :id="employeeID" :apList="apList" :assessId="employID"
+      @confirm="employeeDet" :planIndex="planIndex"></ActionPlan>
     <!-- 沟通反馈 -->
     <BrawerBox drawerTitle="沟通反馈" :showDrawer.sync="communication">
       <template slot="main">
-        <el-input type="textarea" v-model="communicationVal" rows="10" placeholder="请输入反馈内容(必填)" maxlength="300" show-word-limit></el-input>
+        <el-input type="textarea" v-model="communicationVal" rows="10" placeholder="请输入反馈内容(必填)" maxlength="300"
+          show-word-limit></el-input>
         <div class="aite" @click="selectUser = true">@</div>
-        <el-tag style="margin: 0 5px;" v-for="(tag, index) in tags" :key="tag.id" closable @close="handleClose(tag, index)">{{ tag.name }}</el-tag>
+        <el-tag style="margin: 0 5px;" v-for="(tag, index) in tags" :key="tag.id" closable
+          @close="handleClose(tag, index)">{{ tag.name }}</el-tag>
       </template>
       <template slot="footer">
         <span class="dialog-footer">
@@ -509,12 +555,15 @@
       </template>
     </BrawerBox>
     <!-- 沟通反馈 -->
-    <EmployeeSelector title="选择@人员" :is_filtration_creator="false" :visible.sync="selectUser" @confirm="confirmCreator" />
+    <EmployeeSelector title="选择@人员" :is_filtration_creator="false" :visible.sync="selectUser"
+      @confirm="confirmCreator" />
     <!-- 转交 -->
-    <EmployeeSelector title="选择人员" :is_filtration_creator="false" :multi="false" :isChecKedAll="false" :visible.sync="careOfSelector" @confirm="confirmcareOf" />
+    <EmployeeSelector title="选择人员" :is_filtration_creator="false" :multi="false" :isChecKedAll="false"
+      :visible.sync="careOfSelector" @confirm="confirmcareOf" />
     <!-- 评分说明 -->
     <el-dialog title="评分说明" :visible.sync="isShowPf" width="500px" :close-on-click-modal="false">
-      <el-input type="textarea" v-model="pfText" rows="4" placeholder="请输入评分说明" maxlength="100" show-word-limit></el-input>
+      <el-input type="textarea" v-model="pfText" rows="4" placeholder="请输入评分说明" maxlength="100"
+        show-word-limit></el-input>
       <span slot="footer" class="dialog-footer">
         <el-button @click="isShowPf=false">取 消</el-button>
         <el-button type="primary" @click="updateText()">确 定</el-button>
@@ -522,7 +571,8 @@
     </el-dialog>
     <!-- 撤销操作 -->
     <el-dialog title="撤销" :visible.sync="isShowCx" width="500px" :close-on-click-modal="false">
-      <el-input type="textarea" v-model="cxText" rows="4" placeholder="请输入撤销理由" maxlength="200" show-word-limit></el-input>
+      <el-input type="textarea" v-model="cxText" rows="4" placeholder="请输入撤销理由" maxlength="200"
+        show-word-limit></el-input>
       <span slot="footer" class="dialog-footer">
         <el-button @click="isShowCx=false">取 消</el-button>
         <el-button type="primary" @click="revocation()">确 定</el-button>
@@ -531,48 +581,56 @@
     <!-- 调整目标反馈 -->
     <el-dialog title="调整目标" :visible.sync="isAdjustment" :close-on-click-modal="false" width="700px">
       <div>
-          <el-radio-group v-model="radio">
-            <div class="flex-box-v">
-              <el-radio :label="1" style="margin-bottom: 30px;">仅修改指标内容,不重置考核流程
-              <br/> <span style="font-size: 12px;color: #C0C4CF;padding-left: 25px;padding-top: 5px;">不影响进行中的考核流程,只对指标内容和信息进行修改</span>
-              </el-radio>
-              <el-radio :label="2">修改指标,并重置考核流程
-              <br/> <span style="font-size: 12px;color: #C0C4CF;padding-left: 25px;">修改指标并按照新的流程来进行考核,已评分和已审批的记录也会被重置</span>
-              </el-radio>>
-            </div>
-          </el-radio-group>
+        <el-radio-group v-model="radio">
+          <div class="flex-box-v">
+            <el-radio :label="1" style="margin-bottom: 30px;">仅修改指标内容,不重置考核流程
+              <br /> <span
+                style="font-size: 12px;color: #C0C4CF;padding-left: 25px;padding-top: 5px;">不影响进行中的考核流程,只对指标内容和信息进行修改</span>
+            </el-radio>
+            <el-radio :label="2">修改指标,并重置考核流程
+              <br /> <span
+                style="font-size: 12px;color: #C0C4CF;padding-left: 25px;">修改指标并按照新的流程来进行考核,已评分和已审批的记录也会被重置</span>
+            </el-radio>>
+          </div>
+        </el-radio-group>
       </div>
       <span slot="footer">
-        <el-button  @click="isAdjustment = false">取消</el-button>
-        <el-button  type="primary" @click="setDataAccess">确定</el-button>
+        <el-button @click="isAdjustment = false">取消</el-button>
+        <el-button type="primary" @click="setDataAccess">确定</el-button>
       </span>
     </el-dialog>
 
     <!-- 评分确认 -->
     <el-dialog title="请确认您的评分" :visible.sync="isPoint" :close-on-click-modal="false" width="700px">
       <div>
-          <el-table :data="pointList" :header-cell-style="{ background: '#ECF5FF' }" border>
-            <el-table-column prop="name" min-width="150" label="指标">
-              <template slot="header" slot-scope="scope">
-                <span>指标(<span style="color:#ff9600;">每项指标评分</span>)</span>
-              </template>
-            </el-table-column>
-            <!-- <el-table-column prop="score_remark" label="评分说明"></el-table-column> -->
-            <el-table-column prop="score" label="评分" align="left"></el-table-column>
-          </el-table>
+        <el-table :data="pointList" :header-cell-style="{ background: '#ECF5FF' }" border>
+          <el-table-column prop="name" min-width="150" label="指标">
+            <template slot="header" slot-scope="scope">
+              <span>指标(<span style="color:#ff9600;">每项指标评分</span>)</span>
+            </template>
+          </el-table-column>
+          <!-- <el-table-column prop="score_remark" label="评分说明"></el-table-column> -->
+          <el-table-column prop="score" label="评分" align="left"></el-table-column>
+        </el-table>
       </div>
       <span slot="footer">
         <el-button @click="isPoint = false">返回修改</el-button>
         <el-button type="primary" @click="score">确定</el-button>
       </span>
     </el-dialog>
-    <el-dialog title="图片查看" :visible.sync="isShowImg" width="50%" >
+    <el-dialog title="图片查看" :visible.sync="isShowImg" width="50%">
       <img :src="imgUrl" style="width: 100%;">
       <span slot="footer" class="dialog-footer">
-        <el-button @click="isShowImg = false">取 消</el-button>
-        <el-button type="primary" @click="isShowImg = false">确 定</el-button>
+        <el-button @click="closePreview()">取 消</el-button>
+        <el-button type="primary" @click="closePreview()">确 定</el-button>
       </span>
     </el-dialog>
+
+
+    <TargetListComp v-if="dialogVisible" :dialogVisible="dialogVisible" :ids="okrs" @close="closeTargetList">
+    </TargetListComp>
+    <!-- 对齐目标 -->
+    <TargetSearch :visible.sync="isShowProject" @confirm="confirmProject"></TargetSearch>
   </div>
 </template>
 <script>
@@ -584,7 +642,9 @@ import TableBox from '@/performance/components/public/TableBox';
 import TrackManagement from '@/performance/components/public/TrackManagement';
 import EmployeeSelector from '@/components/EmployeeSelector';
 import resultSetAll2 from '@/performance/views/myPerformance/resultSetAll2';
-import {getExpressionStr} from '@/performance/utils/auth'
+import { getExpressionStr } from '@/performance/utils/auth'
+import TargetListComp from './TargetListComp.vue';
+import TargetSearch from './TargetSearch'; //对齐目标
 export default {
   name: 'staffAssDet',
   components: {
@@ -595,16 +655,20 @@ export default {
     TableBox,
     TrackManagement,
     EmployeeSelector,
-    resultSetAll2
+    resultSetAll2,
+    TargetListComp,
+    TargetSearch
   },
   data() {
     return {
+      dialogVisible: false,
+      isShowProject: false,
       radio: 1,
       isAdjustment:false,
       isDetails:true,//是否显示考核详情页面
       resultData:{},
       gradeList: [],
-      dropdownMenu: [{ key: 'a', name: '重置流程',isShow:true }, { key: 'b', name: '调整目标',isShow:true }],
+      dropdownMenu: [{ key: 'a', name: '重置流程',isShow:true }, { key: 'b', name: '调整目标', isShow:true }],
       lingScore_infos: [],
       staffLoad: false, //loading
       tableLoad: false, //loading
@@ -615,7 +679,7 @@ export default {
       employeeID: 0, //考核记录ID
       employID: 0, //当前角色ID
       empDetList: {},
-      remployee: {employee_detail:{}}, //被考核人员信息
+      remployee: {employee_detail: {}}, //被考核人员信息
       flow: [], //步骤
       atPresentFlow: 0, //当前步骤ID
       dimension: [], //维度表格信息
@@ -680,13 +744,10 @@ export default {
       mandatoryNote: false, //总分说明是否必填(暂不做)
       scoreInfo: [], //各个节点的人评的总分
       examineConsent: false, //审批
-
       transferBut: false, //转交按钮
       careOfSelector: false, //转交选人
       careOfPeopleId: 0, //转交的 -- 转出ID
-
       isCs:false,//是否抄送人进入(抄送人能看到全部评分内容)
-
       isShowTargetBtn:false, // 目标制定相关
       isShowConfirmBtn:false,//目标确认按钮
       isUpdateIndex:false,//确认人是否允许修改指标
@@ -698,9 +759,7 @@ export default {
         e:0,
         index:0
       },
-
       isShowOneselfScore:false,//是否只看自己的评分内容
-
       // 控制上下
       isDisabled:false,
       up:{},
@@ -711,22 +770,20 @@ export default {
       page:1,
       isJz:true,
       activeName:'',//待办带进来的节点类型
-
       // 评分确认列表
       pointList:[],
       pointData:{},
       isPoint:false,
-
       publicity:0,
-
       isShowImg:false,
       imgUrl:'',
       resultStr:'录入结果值',
-
+      okrs: [],
       isSj:false,//是否是被考核人上级
     };
   },
-  computed:{
+  computed: {
+    
     isCzData(){
       if(this.gradeBegin){
         return true
@@ -785,7 +842,7 @@ export default {
       });
       let data={//缓存的数据用于录入结果后返回页面复原数据
         employeeID:this.employeeID,
-        employID:this.employID,
+        employID: this.employID,
         assID:id,
       }
       this.$setCache("staffAssDet",data)
@@ -899,7 +956,7 @@ export default {
 
   },
   created() {
-    let staffAssDet=this.$getCache('staffAssDet');//缓存的数据
+    let staffAssDet = this.$getCache('staffAssDet');//缓存的数据
     if(staffAssDet){
       this.employeeID =staffAssDet.employeeID; //个人记录ID
       this.employID =staffAssDet.employID; //被考核人ID
@@ -911,7 +968,7 @@ export default {
           peIds:this.$route.query.pe_ids,
           packageName:this.$route.query.name
         }
-        let pendingList=JSON.parse(this.$route.query.pendingList);
+        let pendingList = JSON.parse(this.$route.query.pendingList);
         this.up={};
         this.down={};
         pendingList.some((item,index)=>{
@@ -946,12 +1003,37 @@ export default {
       this.isDisabled=false;
       this.activeName='';
     }
+    
   },
   methods: {
+    closePreview() {
+      this.imgUrl = '';
+      this.isShowImg = false;
+    },
+    // 关联项目
+    confirmProject(data) {
+      // 绑定OKRID
+      this.$axiosUser('post', '/api/pro/per/package/okrs/bind', { pe_id: this.employeeID, okrs: data.toString() }).then(res => {
+        if (res.data.code == 1) {
+          this.$message.success("操作成功");
+          this.employeeDet();
+        } 
+      });
+    },
+    closeTargetList() {
+      this.dialogVisible = false
+    },
+    open1() {
+      this.dialogVisible = true;
+    },
+    open2() {
+      this.isShowProject = true;
+    },
+    
     onFilePreView(file) {
       if(file.url){
-        this.imgUrl=file.url;
-        this.isShowImg=true;
+        this.imgUrl = file.url;
+        this.isShowImg = true;
       }
     },
     onFilePreView2(file) {
@@ -1005,7 +1087,7 @@ export default {
     },
     // 判断是否能点击列表打开管理记录
     isShowGl(){
-      if((this.$getRole(2)||this.$getRole(3))&&this.recordMemberIds.indexOf(this.$userInfo().id)>=0){
+      if((this.$getRole(2) || this.$getRole(3)) && this.recordMemberIds.indexOf(this.$userInfo().id)>=0){
         return false
       }else{
         return true
@@ -1164,14 +1246,10 @@ export default {
     },
     // 打开结果值录入
     openResult() {
-
       this.$router.push({
-
         name: 'resultSet',
         query: { id: this.employeeID, packageName: this.packageName,resultStr:this.resultStr },
-
       });
-
     },
     // 打开目标制定
     openFormulate() {
@@ -1430,7 +1508,8 @@ export default {
             this.empDetList = data;
             this.employeeID = data.id; //考核记录id
             this.package_id=data.package_id
-            this.publicity=data.publicity;
+            this.publicity = data.publicity;
+            this.okrs = data.okrs;
             if(this.pendingList){
                this.setUpD();
             }
@@ -1764,7 +1843,7 @@ export default {
     isRevocation(dqItem,upItem){
       // 当前只需要评分节点需要撤回
       //当前节点包含自己并且其他任意一人未完成的显示按钮
-      if(dqItem.code=='score_supervisor'||dqItem.code=='special_scorer'){
+      if(dqItem.code=='score_supervisor' || dqItem.code=='special_scorer'){
         dqItem.target.some((item,index)=>{
           if(item.employee_id==this.userInfo.id&&item.status==2){
             dqItem.target.some((item2,index2)=>{
@@ -1848,7 +1927,7 @@ export default {
              item.target.some(e=>{
                if(e.employee_id==this.userInfo.id&&e.status==2){
                  this.revocationNodeId=item.id
-                 this.revocationShow=true;
+                 this.revocationShow = true;
                  return true
                }
              })
@@ -2280,6 +2359,7 @@ export default {
 };
 </script>
 <style scoped lang="scss">
+
 .guidang{
   margin-left: 20px;
   width: 70px;
@@ -2332,10 +2412,15 @@ export default {
       border-bottom: 1px solid #e6e6e6;
       padding: 20px 0;
       margin-top: 10px;
+      display: flex;
+      align-items: center;
+      justify-content: center;
     }
     .head2User {
+      flex: 1;
       .headTname {
         padding: 7px 0 0 15px;
+        margin-left: 40px;
         div {
           padding: 0 0 3px 0;
           font-size: 15px;
@@ -2393,7 +2478,7 @@ export default {
 .flow-item {
   background-color: #ECF5FF;
   height: 60px;
-  min-width: 280px;
+  min-width: 270px;
   position: relative;
   margin-right: 40px;
   margin-top: 20px;
@@ -2525,4 +2610,24 @@ export default {
   position: absolute;
   right: 10px;
 }
+
+
+/* 当视口宽度小于或等于1670px时 */
+@media screen and (max-width: 1670px) {
+  .head {
+    display: flex;
+    flex-wrap: wrap;
+    align-items: center;
+    justify-content: center;
+    .head2User {
+      width: 100%;
+      margin-bottom: 20px;
+    }
+    .button-width {
+      width: 100%;
+    }
+  }
+
+    
+}
 </style>

+ 2 - 2
src/performance/views/assessManagement/updateTarget.vue

@@ -13,7 +13,7 @@
                 <el-input prefix-icon="el-icon-search" placeholder="指标名称搜索"  v-model="params.search_str" style="width: 250px;" clearable></el-input>
               </div>
             </el-popover>
-            <el-select style="width: 340px;margin: 0 10px;" v-model="params.group_ids" :disabled="params.search_str ? false : true" multiple filterable clearable placeholder="选择考核模板">
+            <el-select style="width: 340px;margin: 0 10px;" v-model="params.group_ids" :disabled="params.search_str ? false : true" multiple filterable clearable placeholder="选择考核">
               <el-option v-for="item in groupOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
             </el-select>
             <el-select style="width: 300px;" v-model="params.employee_ids" :disabled="params.search_str ? false : true" multiple filterable clearable placeholder="姓名搜索">
@@ -369,9 +369,9 @@ export default {
   position: relative;
   background-color: #fff;
   padding: 20px;
+  box-sizing: border-box;
 }
 .main {
-  margin-top: 20px;
 }
 .box::-webkit-scrollbar {
   width: 3px;

+ 33 - 31
src/performance/views/evaluate/evaluate.vue

@@ -2,28 +2,37 @@
   <div class="box boxMinHeight">
     <header class="header">
       <div class="header-content flex-box-ce">
+        <!-- 返回按钮 -->
         <div class="flex-box-ce header-left" @click="$router.go(-1)">
           <i class="el-icon-arrow-left fontColorC"></i>
           <el-tooltip class="item" effect="dark" :content="title" placement="bottom">
             <div class="text fontColorB font-flex-word">{{ title }}</div>
           </el-tooltip>
         </div>
+
+        <!-- 步骤条 -->
         <div class="flex-1 flex-box-ce flex-center-center">
-          <div :class="[activeIndex == 1 ? 'active-step2' : '']" class="flex-box-ce flex-center-center step-item2 barder-a" @click="activeStep(1)">
+          <div :class="[activeIndex == 1 ? 'active-step2' : '']"
+            class="flex-box-ce flex-center-center step-item2 barder-a" @click="activeStep(1)">
             <span>1</span>
-            <div>分组信息</div><strong></strong>
+            <div>基本信息</div>
           </div>
-          <el-popover popper-class="popover" placement="bottom" width="250" trigger="manual" content="可通过点击对应数字来切换节点" v-model="visible">
-            <div slot="reference" :class="[activeIndex == 2 ? 'active-step2' : '']" class="flex-box flex-center-center step-item2 barder-a" @click="activeStep(2)">
-                <span>2</span>
-                <div>考核模板</div>
+          <el-popover popper-class="popover" placement="bottom" width="250" trigger="manual" content="可通过点击对应数字来切换节点"
+            v-model="visible">
+            <div slot="reference" :class="[activeIndex == 2 ? 'active-step2' : '']"
+              class="flex-box flex-center-center step-item2 barder-a" @click="activeStep(2)">
+              <span>2</span>
+              <div>考核指标</div>
             </div>
           </el-popover>
-          <div :class="[activeIndex == 3 ? 'active-step2' : '']" class="flex-box flex-center-center step-item2" @click="activeStep(3)">
+          <div :class="[activeIndex == 3 ? 'active-step2' : '']" class="flex-box flex-center-center step-item2"
+            @click="activeStep(3)">
             <span>3</span>
-            <div>具体流程</div>
+            <div>流程设置</div>
           </div>
         </div>
+        <!-- 步骤条 -->
+         <!-- 按钮组 -->
         <div class="flex-box-end header-right">
           <template v-if="isShowBtn">
             <el-button style="margin-right: 10px;" @click="preview()">预览</el-button>
@@ -35,33 +44,21 @@
     <div style="height: 1px; background-color: #DCDFE6;margin-top: 5px;"></div>
     <div class="main">
       <!-- 基本信息 -->
-      <BasicMessage v-show="activeIndex == 1" ref="BasicMessage" :isShowBtn.sync="isShowBtn" :data="basicMessage"></BasicMessage>
+      <BasicMessage v-show="activeIndex == 1" ref="BasicMessage" :isShowBtn.sync="isShowBtn" :data="basicMessage">
+      </BasicMessage>
       <!-- 模板设计 -->
       <Template v-show="activeIndex == 2" ref="Template" :data="template"></Template>
       <!-- 流程设计 -->
       <Flow v-show="activeIndex == 3" ref="Flow" :isShowScore="isShowScore" :data="flow"></Flow>
     </div>
     <!-- 选择被考核人员 -->
-    <EmployeeSelector
-      :isRequired="true"
-      title="选择预览人员"
-      :isChecKedAll="false"
-      :employee_list="employee_list"
-      :visible.sync="setAdministrator"
-      :multi="false"
-      :user_employee_list="true"
-      :is_filtration_creator="false"
-      @confirm="confirmAdministrator"
-    />
+    <EmployeeSelector :isRequired="true" title="选择预览人员" :isChecKedAll="false" :employee_list="employee_list"
+      :visible.sync="setAdministrator" :multi="false" :user_employee_list="true" :is_filtration_creator="false"
+      @confirm="confirmAdministrator" />
     <!-- 预览 -->
     <el-drawer title="预览" :visible.sync="showDrawerTow" direction="btt" class="all-derawer">
-      <Preview
-        v-if="showDrawerTow"
-        :parameter="previewData.parameter"
-        :groupId="previewData.group_id"
-        :employeeId="previewData.employee_id"
-        :employeeList="previewData.employee_list"
-      ></Preview>
+      <Preview v-if="showDrawerTow" :parameter="previewData.parameter" :groupId="previewData.group_id"
+        :employeeId="previewData.employee_id" :employeeList="previewData.employee_list"></Preview>
     </el-drawer>
   </div>
 </template>
@@ -72,11 +69,12 @@ import BasicMessage from '@/performance/components/evaluate/BasicMessage';
 import Template from '@/performance/components/evaluate/Template';
 import Flow from '@/performance/components/evaluate/Flow';
 import Preview from '@/performance/components/public/Preview';
+
 export default {
   components: { BasicMessage, Template, Flow, EmployeeSelector, Preview },
   data() {
     return {
-      title: '新建考核模板',
+      title: '新建考核',
       activeIndex: '1',
       dialogVisible: false,
       isShowScore: false, //是否在流程里显示指定评分人模块
@@ -98,7 +96,7 @@ export default {
       },
       visible:false,
       isTs:false,//离开是否要提示
-      isShowBtn:false,//控制提交按钮是否显示
+      isShowBtn: false,//控制提交按钮是否显示
     };
   },
   watch: {
@@ -126,6 +124,7 @@ export default {
     })
   },
   methods: {
+    
     confirmAdministrator(val) {
       this.isPreview = true;
       if (val.employee.length == 0) {
@@ -751,7 +750,9 @@ export default {
   padding-top: 5px;
 }
 .main {
-  background-color: #fff;
+  background-color: #f7f7f7;
+  margin-top: 20px;
+  box-sizing: border-box;
 }
 .box::-webkit-scrollbar {
   width: 3px;
@@ -792,7 +793,8 @@ export default {
   font-size: 22px;
 }
 .text {
-  font-size: 18px;
+  font-size: 16px;
+  font-weight: 600;
   padding-left: 30px;
 }
 .text::before {

+ 6 - 6
src/performance/views/job/job.vue

@@ -9,7 +9,7 @@
             <span>{{ item.name }}</span>
           </div>
         </div>
-        <div v-else><div style="text-align: center;margin: 020px;" class="fontColorC">暂无相关权限</div></div>
+        <div v-else><div style="text-align: center; margin: 0 20px;" class="fontColorC">暂无相关权限</div></div>
       </div>
       <!-- 待办 -->
       <div class="flex-box">
@@ -680,17 +680,17 @@ export default {
     setMenu() {
       let entranceList = [];
       if (this.$isAuthoritys_jx([this.$7, this.$8, this.$9, this.$10, this.$11])) {
-        entranceList.push({ name: '考核管理', image: 'static/images/1.png', url: '/assessManagement' });
+        entranceList.push({ name: '考核明细', image: 'static/images/1.png', url: '/assessManagement' });
       }
       if (this.$isAuthoritys_jx([this.$13, this.$14])) {
-        entranceList.push({ name: '考核模板', image: 'static/images/2.png', url: '/evaluateSet' });
+        entranceList.push({ name: '考核', image: 'static/images/2.png', url: '/evaluateSet' });
       }
       if (this.$isAuthoritys_jx(this.$7)) {
         entranceList.push({ name: '发起考核', image: 'static/images/3.png', url: '/sponsorAssess' });
       }
-      if (this.$isAuthoritys_jx(this.$12)) {
-        entranceList.push({ name: '指标库', image: 'static/images/4.png', url: '/IndexSet' });
-      }
+      // if (this.$isAuthoritys_jx(this.$12)) {
+      //   entranceList.push({ name: '指标库', image: 'static/images/4.png', url: '/IndexSet' });
+      // }
       this.entranceList = entranceList;
     }
   }

+ 262 - 103
src/performance/views/myPerformance/adjustment.vue

@@ -4,10 +4,12 @@
     <div class="main">
       <div class="flex-box-ce" style="border-bottom: 1px solid #f1f1f1;padding-bottom: 10px;margin-bottom: 20px;">
         <div class="flex-box-ce flex-1">
-          <userImage :user_name="relevance_employee.name" :img_url="relevance_employee.img_url" fontSize="14" width="50px" height="50px"></userImage>
+          <userImage :user_name="relevance_employee.name" :img_url="relevance_employee.img_url" fontSize="14"
+            width="50px" height="50px"></userImage>
           <div>
             <div class="name" style="margin: 0 10px;">{{ relevance_employee.name }}</div>
-            <div class="name fontColorC" style="margin: 0 10px;" v-if="relevance_employee.employee_detail.dept_list.length > 0">
+            <div class="name fontColorC" style="margin: 0 10px;"
+              v-if="relevance_employee.employee_detail.dept_list.length > 0">
               {{ relevance_employee.employee_detail.dept_list[0].dept_name }}
             </div>
           </div>
@@ -16,8 +18,7 @@
       <div style="margin-top: 20px;">
         <el-tabs v-model="wdIndex">
           <el-tab-pane :label="getName(item)" :name="index.toString()" v-for="(item, index) in dimension" :key="index">
-            <el-table :data="item.index" v-loading="loading" :header-cell-style="{ background: '#ECF5FF' }">
-              <el-table-column prop="name" label="指标名称"></el-table-column>
+            <el-table :data="item.index" v-loading="loading" border :header-cell-style="{ background: '#ECF5FF' }">
               <el-table-column prop="type" label="指标类型">
                 <template slot-scope="scope">
                   <span v-if="scope.row.type == 1">量化指标</span>
@@ -26,29 +27,85 @@
                   <span v-if="scope.row.type == 4">额外扣分项</span>
                 </template>
               </el-table-column>
-              <el-table-column
-                prop="per_remark"
-                min-width="150"
+              <el-table-column prop="name" label="指标名称" align="center" min-width="200">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.name" placeholder="请输入指标名称" clearable maxlength="30"
+                    show-word-limit></el-input>
+                </template>
+              </el-table-column>
+
+              <el-table-column prop="per_remark" align="center"
                 :label="item.index_type == 3 || item.index_type == 4 ? (item.index_type == 3 ? '加分标准' : '扣分标准') : '考核标准'"
-              ></el-table-column>
-              <el-table-column prop="point_limit" :label="item.index_type == 3 ? '加分上限' : '扣分上限'" v-if="item.index_type == 3 || item.index_type == 4"></el-table-column>
-              <el-table-column prop="target" label="目标值" v-if="item.index_type == 1">
+                min-width="200">
+                <template slot-scope="scope">
+                  <el-input type="textarea" v-model="scope.row.per_remark" :max-length="100"
+                    :autosize="{ minRows: 1, maxRows: 2 }" clearable=""></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column v-if="item.index_type == 3 || item.index_type == 4" prop="point_limit" align="center"
+                :label="item.index_type == 3 ? '加分上限' : '扣分上限'" min-width="200">
+                <template slot-scope="scope">
+                  <el-input type="textarea" :max-length="100" v-model="scope.row.point_limit" clearable
+                    :autosize="{ minRows: 1, maxRows: 2 }"></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column v-if="item.index_type == 1" prop="target" align="center" label="目标值" min-width="200">
                 <template slot-scope="scope">
-                  <span v-if="scope.row.target">{{ scope.row.target }}{{ scope.row.unit }}</span>
+                  <el-input v-model="scope.row.target" clearable></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column v-if="item.index_type == 1" prop="unit" label="量化指标单位" align="center" min-width="120">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.unit" clearable></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column v-if="item.index_type == 1 || item.index_type == 2" prop="weight" label="权重(%)"
+                align="center" min-width="120">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.weight" clearable>
+                    <template slot="append">%</template>
+                  </el-input>
+                </template>
+              </el-table-column>
+              <el-table-column prop="result_type" label="结果值录入" align="center" min-width="120">
+                <template slot-scope="scope">
+                  <div v-if="scope.row.result_employee_id && !scope.row.isEditResult" class="flex-box-ce"
+                    style="text-align: center;">
+                    <div class="flex-box-ce" style="margin: 0 auto;">
+                      <userImage :id="scope.row.result_employee_id" :user_name="scope.row.result_employee_name"
+                        :img_url="scope.row.result_employee_img_url" width="35px" height="35px" fontSize="12px">
+                      </userImage>
+                      <span style="margin: 0 10px; line-height: 50px;">{{ scope.row.result_employee_name }}</span>
+                      <span class="el-icon-edit" @click="changeIsEdit(scope, index)"></span>
+                    </div>
+                  </div>
+                  <el-select v-else :value="scope.row.result_type">
+                    <el-option value="none" label="不开启"
+                      @click.native="changeResultType('none', scope, index)"></el-option>
+                    <el-option value="self" label="被考核人"
+                      @click.native="changeResultType('self', scope, index)"></el-option>
+                    <el-option value="special" label="指定员工"
+                      @click.native="changeResultType('special', scope, index)"></el-option>
+                    <el-option value="supervisor" label="直接管理员"
+                      @click.native="changeResultType('supervisor', scope, index)"></el-option>
+                  </el-select>
                 </template>
               </el-table-column>
-              <el-table-column prop="unit" label="量化指标单位" v-if="item.index_type == 1"></el-table-column>
-              <el-table-column prop="weight" label="权重(%)" v-if="item.index_type == 1 || item.index_type == 2"></el-table-column>
-              <!-- <el-table-column prop="remark" label="备注"></el-table-column> -->
-              <el-table-column label="结果值录入人">
+              <el-table-column prop="reviewer_name" label="指定评分人" min-width="120" align="center">
                 <template slot-scope="scope">
-                  <span v-if="scope.row.result_type == 'none'">不开启</span>
-                  <span v-if="scope.row.result_type == 'self'">被考核人</span>
-                  <span v-if="scope.row.result_type == 'special'">指定员工 ({{$getEmployeeMapItem(scope.row.result_employee_id).name}}) </span>
-                  <span v-if="scope.row.result_type == 'supervisor'">指定管理员</span>
+                  <div v-if="!scope.row.reviewer_id">
+                    <el-button type="text" @click="openEmployeeSelector(scope, index)">请选择</el-button>
+                  </div>
+                  <div v-else class="flex-box-ce" style="text-align: center;">
+                    <div class="flex-box-ce" style="margin: 0 auto;">
+                      <userImage :id="scope.row.reviewer_id" :user_name="scope.row.reviewer_name"
+                        :img_url="scope.row.reviewer_img_url" width="35px" height="35px" fontSize="12px"></userImage>
+                      <span style="margin: 0 10px; line-height: 50px;">{{ scope.row.reviewer_name }}</span>
+                      <span class="el-icon-edit" @click="openEmployeeSelector(scope, index)"></span>
+                    </div>
+                  </div>
                 </template>
               </el-table-column>
-              <el-table-column prop="reviewer_name" label="指定评分人"></el-table-column>
               <el-table-column label="操作">
                 <template slot-scope="scope">
                   <el-button @click="compileIndex(scope, index)" type="text">编辑</el-button>
@@ -56,24 +113,24 @@
                 </template>
               </el-table-column>
             </el-table>
-            <div class="fontColorB" style="margin: 20px 0;" v-if="item.index_type == 1 || item.index_type == 2">
-              <div style="margin-bottom: 5px;">指标权重: {{ getWeight()[0] }}%</div>
-              <div>
-                所有指标总权重:
-                <span class="orange">{{ getWeight()[1] }}%</span>
-              </div>
-            </div>
+
+
             <div class="wd-footer">
               <div class="flex-box">
-                <el-button class="primaryBtn" @click="selectIndex(item, index)">
+                <!-- <el-button class="primaryBtn" @click="selectIndex(item, index)">
                   <i class="el-icon-s-operation blue"></i>
                   选择指标项
-                </el-button>
+                </el-button> -->
                 <el-button class="primaryBtn" @click="addIndex(item, index)">
                   <i class="el-icon-plus blue"></i>
                   增加指标项
                 </el-button>
               </div>
+              <div class="flex-box-ce result" style="margin: 20px 0;"
+                v-if="item.index_type == 1 || item.index_type == 2">
+                <span style="padding-right: 20px;">指标权重: {{ getWeight()[0] }}%</span>
+                <span>所有指标总权重: {{ getWeight()[1] }}%</span>
+              </div>
             </div>
           </el-tab-pane>
         </el-tabs>
@@ -89,14 +146,17 @@
       <template slot="main">
         <div class="flex-box-ce">
           <el-select v-model="cate_id" filterable placeholder="请选择或搜索分类" class="flex-2">
-            <el-option v-for="item in indexTypeList" :key="item.value" :label="item.label" :value="item.value"></el-option>
+            <el-option v-for="item in indexTypeList" :key="item.value" :label="item.label"
+              :value="item.value"></el-option>
           </el-select>
-          <el-select v-model="tabIds" multiple placeholder="标签搜索" class="flex-1" style="margin-left: 10px;" v-if="tabs.length > 0">
+          <el-select v-model="tabIds" multiple placeholder="标签搜索" class="flex-1" style="margin-left: 10px;"
+            v-if="tabs.length > 0">
             <el-option v-for="item in tabs" :key="item.id" :label="item.name" :value="item.id"></el-option>
           </el-select>
         </div>
         <template v-if="indexList.length > 0">
-          <div class="flex-box-ce li" style="margin-top: 20px;"><el-checkbox class="flex-box-ce" v-model="isAllSelectIndex" label="全选"></el-checkbox></div>
+          <div class="flex-box-ce li" style="margin-top: 20px;"><el-checkbox class="flex-box-ce"
+              v-model="isAllSelectIndex" label="全选"></el-checkbox></div>
           <div class="infinite-list-wrapper scroll-bar">
             <ul class="ul" v-loading="indexLoading" v-infinite-scroll="load" infinite-scroll-disabled="disabled">
               <li v-for="(item, index) in indexList" :key="index" class="flex-box-ce li">
@@ -120,9 +180,10 @@
     </BrawerBox>
 
     <!-- 新增指标 -->
-    <BrawerBox drawerTitle="指标设置" :showDrawer.sync="isAddIndex" :closeModal="false">
-      <template slot="main">
-        <el-form ref="saveAddIndex" :model="addIndexForm" :rules="addIndexFormRule" @submit.native.prevent label-width="120px">
+    <el-dialog drawerTitle="指标设置" :visible.sync="isAddIndex" width="600px">
+      <div class="flex-box-ce" style="margin: 20px auto 0 auto; width: 90%;">
+        <el-form ref="saveAddIndex" :model="addIndexForm" :rules="addIndexFormRule" @submit.native.prevent
+          label-width="120px" label-position="left">
           <el-form-item label="指标类型:" prop="type">
             <el-select v-model="addIndexForm.type" disabled placeholder="请选择指标类型" class="width-250">
               <el-option label="量化指标" :value="1"></el-option>
@@ -132,16 +193,20 @@
             </el-select>
           </el-form-item>
           <el-form-item label="指标名称" prop="name">
-            <el-input placeholder="请输入指标名称" v-model="addIndexForm.name" clearable show-word-limit maxlength="30"></el-input>
+            <el-input placeholder="请输入指标名称" v-model="addIndexForm.name" clearable show-word-limit
+              maxlength="30"></el-input>
           </el-form-item>
           <el-form-item :label="fromName" prop="per_remark">
-            <el-input placeholder="请输入" type="textarea" v-model="addIndexForm.per_remark" clearable autosize show-word-limit maxlength="500"></el-input>
+            <el-input placeholder="请输入" type="textarea" v-model="addIndexForm.per_remark" clearable autosize
+              show-word-limit maxlength="500"></el-input>
           </el-form-item>
           <el-form-item label="加分上限" prop="point_limit" v-if="addIndexForm.type == 3">
-            <el-input placeholder="请输入加分上限" v-model="addIndexForm.point_limit" clearable oninput="value=value.replace(/[^\d]/g,'')"></el-input>
+            <el-input placeholder="请输入加分上限" v-model="addIndexForm.point_limit" clearable
+              oninput="value=value.replace(/[^\d]/g,'')"></el-input>
           </el-form-item>
           <el-form-item label="扣分上限" prop="point_limit" v-if="addIndexForm.type == 4">
-            <el-input placeholder="请输入扣分上限" v-model="addIndexForm.point_limit" clearable oninput="value=value.replace(/[^\d]/g,'')"></el-input>
+            <el-input placeholder="请输入扣分上限" v-model="addIndexForm.point_limit" clearable
+              oninput="value=value.replace(/[^\d]/g,'')"></el-input>
           </el-form-item>
           <el-form-item label="目标值" prop="target" v-if="addIndexForm.type == 1">
             <el-input placeholder="请输入目标值" v-model="addIndexForm.target" clearable></el-input>
@@ -153,13 +218,13 @@
             <template slot="label">
               <span>结果值录入:</span>
               <el-tooltip effect="dark" placement="top">
-                  <template slot="content">
-                    结果值用来记录考核周期内指标的实际完成情况<br/>
-                    开启后,评分前需要先录入结果值,否则不能评分<br/>
-                    量化指标必须填写结果值<br/>
-                    其他类型指标必须提供结果附件作为凭据
-                    <!-- 开启后,当前指标评分前需要先录入结果值。结果值用来记录考核周期内指标的实际完成情况。 -->
-                  </template>
+                <template slot="content">
+                  结果值用来记录考核周期内指标的实际完成情况<br />
+                  开启后,评分前需要先录入结果值,否则不能评分<br />
+                  量化指标必须填写结果值<br />
+                  其他类型指标必须提供结果附件作为凭据
+                  <!-- 开启后,当前指标评分前需要先录入结果值。结果值用来记录考核周期内指标的实际完成情况。 -->
+                </template>
                 <i class="el-icon-warning"></i>
               </el-tooltip>
             </template>
@@ -169,13 +234,15 @@
               <el-option label="指定员工" value="special"></el-option>
               <el-option label="直接管理员" value="supervisor"></el-option>
             </el-select>
-            <div style="position: relative;margin-top: 10px;" v-if="addIndexForm.result_type == 'special'" class="width-250">
+            <div style="position: relative;margin-top: 10px;" v-if="addIndexForm.result_type == 'special'"
+              class="width-250">
               <el-input v-model="assignUser.name" placeholder="请选择指定员工"></el-input>
               <div @click="addUser(1)" class="inputDc"></div>
             </div>
           </el-form-item>
           <el-form-item label="权重:" prop="weight" v-if="addIndexForm.type == 2 || addIndexForm.type == 1">
-            <el-input placeholder="请输入权重(1~100)" id="input2" @input="checkCountry('input2')" v-model.number="addIndexForm.weight">
+            <el-input placeholder="请输入权重(1~100)" id="input2" @input="checkCountry('input2')"
+              v-model.number="addIndexForm.weight">
               <template slot="append">
                 %
               </template>
@@ -183,34 +250,39 @@
           </el-form-item>
 
           <el-form-item label="备注" prop="remark">
-            <el-input placeholder="请输入" type="textarea" v-model="addIndexForm.remark" clearable :rows="4" show-word-limit maxlength="500"></el-input>
+            <el-input placeholder="请输入" type="textarea" v-model="addIndexForm.remark" clearable :rows="4"
+              show-word-limit maxlength="500"></el-input>
           </el-form-item>
           <el-form-item label="自动算分" v-if="addIndexForm.type == 1">
-              <template slot="label">
-                <span>自动算分:</span>
-                <el-tooltip effect="dark" placement="top">
-                  <template slot="content">
-                    <div>需开启结果值录入</div>
-                  </template>
-                  <i class="el-icon-warning"></i>
-                </el-tooltip>
-              </template>
-              <el-switch v-model="addIndexForm.expression.auto_calculation"  :disabled="addIndexForm.result_type=='none'" :active-value="1" :inactive-value="0"></el-switch>
-              <div v-if="addIndexForm.expression.auto_calculation==1" class="pointBox">
-                 <div v-if="addIndexForm.expression.expression" style="padding: 10px;padding-top: 0;">
-                    <div class="flex-box-ce">
-                      <div class="flex-1">评分公式</div>
-                      <div class="blue" style="cursor: pointer;" @click="isShowTestCalculate=true">测试计算公式</div>
-                    </div>
-                    <div @click="isE=true" v-html="expressionStr" style="background-color: #f1f1f1;padding: 10px;text-align: left;border-radius: 5px;cursor: pointer;"></div>
-                  </div>
-                  <div  v-else class="blue" style="text-align: center;padding-top: 30px;cursor: pointer;" @click="isE=true">设置评分计算方式</div>
+            <template slot="label">
+              <span>自动算分:</span>
+              <el-tooltip effect="dark" placement="top">
+                <template slot="content">
+                  <div>需开启结果值录入</div>
+                </template>
+                <i class="el-icon-warning"></i>
+              </el-tooltip>
+            </template>
+            <el-switch v-model="addIndexForm.expression.auto_calculation" :disabled="addIndexForm.result_type=='none'"
+              :active-value="1" :inactive-value="0"></el-switch>
+            <div v-if="addIndexForm.expression.auto_calculation==1" class="pointBox">
+              <div v-if="addIndexForm.expression.expression" style="padding: 10px;padding-top: 0;">
+                <div class="flex-box-ce">
+                  <div class="flex-1">评分公式</div>
+                  <div class="blue" style="cursor: pointer;" @click="isShowTestCalculate=true">测试计算公式</div>
+                </div>
+                <div @click="isE=true" v-html="expressionStr"
+                  style="background-color: #f1f1f1;padding: 10px;text-align: left;border-radius: 5px;cursor: pointer;">
+                </div>
               </div>
-			  <div class="fontColorC" style="line-height: 24px;">开启后,系统将根据评分公式自动计算指标得分,供评分人参考实现快速评分</div>
+              <div v-else class="blue" style="text-align: center;padding-top: 30px;cursor: pointer;" @click="isE=true">
+                设置评分计算方式</div>
+            </div>
+            <div class="fontColorC" style="line-height: 24px;">开启后,系统将根据评分公式自动计算指标得分,供评分人参考实现快速评分</div>
           </el-form-item>
-          <el-form-item label="指定评分人" prop="isReviewer" >
+          <el-form-item label="指定评分人" prop="isReviewer">
             <el-switch v-model="addIndexForm.isReviewer"></el-switch>
-            <div>
+            <div class="width-250">
               <div style="position: relative;" v-if="addIndexForm.isReviewer">
                 <el-input v-model="assignScoreUser.name" placeholder="请选择指定员工"></el-input>
                 <div @click="addUser(2)" class="inputDc"></div>
@@ -232,28 +304,26 @@
               <div @click="isShowRecordFun()" class="inputDc"></div>
             </div>
           </el-form-item>
+          <div class="flex-box-ce">
+            <span style="font-weight: 600;font-size: 14px;color: #606266;">按分数展示对应的评级:</span>
+            <el-select v-model="addIndexForm.index_level_id" @change="levelReadOnly" filterable clearable
+              placeholder="请选择" style="width: 250px !important;">
+              <el-option v-for="item in levelOptions" :key="item.id" :label="item.name" :value="item.id"
+                style="width: 250px !important; "></el-option>
+            </el-select>
+          </div>
+          <ClassSet v-if="addIndexForm.index_level_id != 0 && getIs" ref="ClassSet" :readOnly="true" :inputs="inputs"
+            style="padding-top: 20px;" :inputsStyle="{ paddingLeft: '0px', width: '450px' }"></ClassSet>
         </el-form>
-        <div>
-          <span style="font-weight: 600;font-size: 14px;color: #606266;">按分数展示对应的评级:</span>
-          <el-select v-model="addIndexForm.index_level_id" @change="levelReadOnly" filterable clearable placeholder="请选择">
-            <el-option v-for="item in levelOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
-          </el-select>
-        </div>
-        <ClassSet
-          v-if="addIndexForm.index_level_id != 0 && getIs"
-          ref="ClassSet"
-          :readOnly="true"
-          :inputs="inputs"
-          style="padding-top: 20px;"
-          :inputsStyle="{ paddingLeft: '0px', width: '450px' }"
-        ></ClassSet>
-      </template>
+
+      </div>
+
       <template slot="footer">
         <el-button plain @click="closeAddIndexForm('saveAddIndex')">取消</el-button>
         <el-button type="primary" @click="saveAddIndex('saveAddIndex', 1)" v-if="isSave">提交</el-button>
         <el-button type="primary" @click="saveAddIndex('saveAddIndex', 2)" v-else>保存</el-button>
       </template>
-    </BrawerBox>
+    </el-dialog>
     <!-- 调整说明 -->
     <el-dialog title="调整说明" :visible.sync="isAdjustment" width="500px" :close-on-click-modal="false">
       <el-input type="textarea" v-model="adjustmentText" rows="4" placeholder="请输入内容(选填)"></el-input>
@@ -263,15 +333,18 @@
       </span>
     </el-dialog>
     <!-- 评分人 -->
-    <EmployeeSelector :multi="false" :is_filtration_creator="false" :selected="selected" :isChecKedAll="false" :visible.sync="setAdministrator" @confirm="confirmAdministrator" />
+    <EmployeeSelector :multi="false" :is_filtration_creator="false" :selected="selected" :isChecKedAll="false"
+      :visible.sync="setAdministrator" @confirm="confirmAdministrator" />
     <!-- 管理记录人 -->
-    <EmployeeSelector :is_filtration_creator="false" :selected="selected2" :visible.sync="isShowRecord" @confirm="confirmAdministrator2" />
+    <EmployeeSelector :is_filtration_creator="false" :selected="selected2" :visible.sync="isShowRecord"
+      @confirm="confirmAdministrator2" />
 
     <!-- 编辑公式 -->
     <Equation :visible.sync="isE" :expression.sync="expression"></Equation>
 
     <!-- 测试计算 -->
-    <TestCalculate :visible.sync="isShowTestCalculate" :str="expressionStr" :expression="expression.expression"></TestCalculate>
+    <TestCalculate :visible.sync="isShowTestCalculate" :str="expressionStr" :expression="expression.expression">
+    </TestCalculate>
   </div>
 </template>
 
@@ -296,7 +369,6 @@ export default {
       page_size: 10,
       loading: false,
       indexTypeList: [],
-
       isSelectIndex: false, //选择指标弹窗控制
       isAllSelectIndex: false, //是否全选指标
       cate_id: 0,
@@ -305,7 +377,6 @@ export default {
       indexLoading: false,
       indexPage: 1,
       isAfterLoading: false, //是否加载完
-
       // 添加指标
       isAddIndex: false,
       selected2: { employee: [], dept: [] }, //已经选择人员
@@ -356,9 +427,10 @@ export default {
       isSave: true, //判断指标是提交还是编辑
       ids: [], //需要过滤的指标ID
       fromName: '考核标准',
-
       dimension: [], //列表
       dimensionalityList: [], //提交的数据
+      selectItemIndex: 0, //选择的维度下标,
+      selectItemIndex_index: 0, //选择的指标下标,
       calc_dimension: '', //是否维度权重参与计算 1-是 0-否
       calc_type: '', //指标评分计算方式 1-加和计算 2-加权计算
       relevance_employee: {
@@ -373,7 +445,6 @@ export default {
       adjustmentText: '',
       special_scorer: false, //判断是否能设置指定评分人
       process: {},
-
       // 标签相关
       tabs: [],
       tabIds: [],
@@ -482,6 +553,37 @@ export default {
     }
   },
   methods: {
+    // 选择指定评分人
+    openEmployeeSelector(e, index) {
+      this.selectItemIndex = index;
+      this.selectItemIndex_index = e.$index;
+      this.assignScoreUser = {
+        name: e.row.reviewer_name,
+        id: e.row.reviewer_id
+      }
+      this.addUser(2);
+    },
+    changeIsEdit(e, index) {
+      this.selectItemIndex = index;
+      this.selectItemIndex_index = e.$index;
+      let obj = { ...this.dimension[this.selectItemIndex].index[this.selectItemIndex_index] }
+      obj.isEditResult = true;
+      this.dimension[this.selectItemIndex].index.splice(this.selectItemIndex_index, 1, obj); //替换元素
+    },
+    // 结果值录入
+    changeResultType(value, e, index) {
+      e.row.result_type = value;
+      // 指定员工
+      if (value == 'special') {
+        this.selectItemIndex = index;
+        this.selectItemIndex_index = e.$index;
+        this.assignUser = {
+          name: e.row.result_employee_name,
+          id: e.row.result_employee_id
+        }
+        this.addUser(1);
+      }
+    },
     isShowRecordFun() {
       this.selected2.employee = this.record_ids;
       this.isShowRecord = true;
@@ -581,12 +683,28 @@ export default {
       this.dimension[this.selectItemIndex].index.push(...arr);
       this.isSelectIndex = false;
     },
-    //保存人员
+    //选择人员弹框 -- 保存人员
     confirmAdministrator(e) {
+      // 结果值录入指定人员
       if (this.isUserIndex == 1) {
-        this.assignUser = e.employee.length > 0 ? e.employee[0] : [];
+        if (e.employee && e.employee.length > 0) {
+          this.assignUser = e.employee.length > 0 ? e.employee[0] : [];
+          let obj = { ...this.dimension[this.selectItemIndex].index[this.selectItemIndex_index] }
+          obj.result_type = 'special';
+          obj.result_employee_id = this.assignUser.id;
+          obj.result_employee_name = this.assignUser.name;
+          obj.result_employee_img_url = this.assignUser.img_url;
+          obj.isEditResult = false;
+          this.dimension[this.selectItemIndex].index.splice(this.selectItemIndex_index, 1, obj); //替换元素
+        }
+
       } else {
         this.assignScoreUser = e.employee.length > 0 ? e.employee[0] : [];
+        let obj = { ...this.dimension[this.selectItemIndex].index[this.selectItemIndex_index] }
+        obj.reviewer_id = this.assignScoreUser.id;
+        obj.reviewer_name = this.assignScoreUser.name;
+        obj.reviewer_img_url = this.assignScoreUser.img_url;
+        this.dimension[this.selectItemIndex].index.splice(this.selectItemIndex_index, 1, obj); //替换元素
       }
       this.setAdministrator = false;
     },
@@ -671,6 +789,7 @@ export default {
           dimension.forEach(item => {
             if (item.index.length > 0) {
               item.index.forEach(item2 => {
+                item2.isEditResult = false;
                 item2.result_employee_name = employeeMap[item2.result_employee_id] ? employeeMap[item2.result_employee_id].name : '';
                 item2.reviewer_name = employeeMap[item2.reviewer_id] ? employeeMap[item2.reviewer_id].name : '';
               });
@@ -698,10 +817,10 @@ export default {
             }
           }
           if (this.addIndexForm.type == 1 || this.addIndexForm.type == 2) {
-            if (this.addIndexForm.weight == 0) {
-              this.$message.error('权重不能为0');
-              return;
-            }
+            // if (this.addIndexForm.weight == 0) {
+            //   this.$message.error('权重不能为0');
+            //   return;
+            // }
             if (this.addIndexForm.weight > 100) {
               this.$message.error('权重不能大于100');
               return;
@@ -936,8 +1055,37 @@ export default {
     //添加指标
     addIndex(e, index) {
       this.selectItemIndex = index;
-      this.addIndexForm.type = e.index_type;
-      this.isAddIndex = true;
+      let obj = {
+        id: 0,
+        custom: 1,
+        name: "",
+        per_remark: "",
+        type: e.index_type,
+        unit: "",
+        target: "",
+        result_type: "none",
+        result_employee_id: "",
+        weight: 0,
+        reviewer_id: "",
+        point_limit: "",
+        index_level_id: "",
+        reviewer_id: "",
+        record_ids: [],
+        expression: {
+          type: 1,                //1用户模式 2 开发者模式
+          logic_type: 1,        //1连续区间  2  列举  3  百分比加减   4 无条件
+          compare: 1,            //1  结果值  2 结果值/目标值 3结果值=目标值
+          reference: 1,            // 1手动输入   2选择系统字段
+          logic_section: [],            //连续区间的算分逻辑数组
+          logic_enum: [],            //列举的算分逻辑数组
+          logic_percent: [],            //百分比加减的算分逻辑数组
+          logic_eq: [],            //无条件的算分逻辑数组
+          expression: "",        //最终表达式
+          auto_calculation: 0,   //是否开启表达式算分  0 否   1 是
+          scorer_change: 1,        ////评分人是否允许修改  1 允许   2 不允许
+        }
+      }
+      this.dimension[index].index.push(obj);
     },
     //选择指标
     selectIndex(e, index) {
@@ -1009,6 +1157,14 @@ export default {
 </script>
 
 <style scoped="scoped">
+.result {
+  width: 300px;
+  border: 2px solid #ff9600;
+  padding: 5px 10px;
+  color: #ff9600;
+  text-align: center;
+  font-weight: 600;
+}
 .border {
   -webkit-appearance: none;
   background-color: #fff;
@@ -1053,7 +1209,10 @@ export default {
   padding: 12px 30px;
 }
 .wd-footer {
-  padding: 12px 20px;
+  padding: 12px 0;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
 }
 .btn {
   color: #409EFF;

+ 205 - 107
src/performance/views/myPerformance/adjustment2.vue

@@ -4,10 +4,12 @@
     <div class="main">
       <div class="flex-box-ce" style="border-bottom: 1px solid #f1f1f1;padding-bottom: 10px;margin-bottom: 20px;">
         <div class="flex-box-ce flex-1">
-          <userImage :user_name="relevance_employee.name" :img_url="relevance_employee.img_url" fontSize="14" width="50px" height="50px"></userImage>
+          <userImage :user_name="relevance_employee.name" :img_url="relevance_employee.img_url" fontSize="14"
+            width="50px" height="50px"></userImage>
           <div>
             <div class="name" style="margin: 0 10px;">{{ relevance_employee.name }}</div>
-            <div class="name fontColorC" style="margin: 0 10px;" v-if="relevance_employee.employee_detail.dept_list.length > 0">
+            <div class="name fontColorC" style="margin: 0 10px;"
+              v-if="relevance_employee.employee_detail.dept_list.length > 0">
               {{ relevance_employee.employee_detail.dept_list[0].dept_name }}
             </div>
           </div>
@@ -16,9 +18,8 @@
       <div style="margin-top: 20px;">
         <el-tabs v-model="wdIndex">
           <el-tab-pane :label="getName(item)" :name="index.toString()" v-for="(item, index) in dimension" :key="index">
-            <el-table :data="item.index" v-loading="loading" :header-cell-style="{ background: '#ECF5FF' }">
-              <el-table-column prop="name" label="指标名称"></el-table-column>
-              <el-table-column prop="type" label="指标类型">
+            <el-table :data="item.index" v-loading="loading" :header-cell-style="{ background: '#ECF5FF' }" border>
+              <el-table-column prop="type" label="指标类型" min-width="100" align="center">
                 <template slot-scope="scope">
                   <span v-if="scope.row.type == 1">量化指标</span>
                   <span v-if="scope.row.type == 2">非量化指标</span>
@@ -26,55 +27,88 @@
                   <span v-if="scope.row.type == 4">额外扣分项</span>
                 </template>
               </el-table-column>
-              <el-table-column
-                prop="per_remark"
-                min-width="150"
-                :label="item.index_type == 3 || item.index_type == 4 ? (item.index_type == 3 ? '加分标准' : '扣分标准') : '考核标准'"
-              ></el-table-column>
-              <el-table-column prop="point_limit" :label="item.index_type == 3 ? '加分上限' : '扣分上限'" v-if="item.index_type == 3 || item.index_type == 4"></el-table-column>
-              <el-table-column prop="target" label="目标值" v-if="item.index_type == 1">
+
+              <el-table-column prop="name" label="指标名称" min-width="200" align="center">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.name" placeholder="请输入指标名称" clearable maxlength="30"
+                    show-word-limit></el-input>
+                </template>
+              </el-table-column>
+
+              <el-table-column prop="per_remark" min-width="150" align="center"
+                :label="item.index_type == 3 || item.index_type == 4 ? (item.index_type == 3 ? '加分标准' : '扣分标准') : '考核标准'">
+                <template slot-scope="scope">
+                  <el-input type="textarea" v-model="scope.row.per_remark" :max-length="100"
+                    :autosize="{ minRows: 1, maxRows: 2 }" clearable=""></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column v-if="item.index_type == 3 || item.index_type == 4" prop="point_limit" align="center"
+                :label="item.index_type == 3 ? '加分上限' : '扣分上限'" min-width="150">
+                <template slot-scope="scope">
+                  <el-input type="textarea" :max-length="100" v-model="scope.row.point_limit" clearable
+                    :autosize="{ minRows: 1, maxRows: 2 }"></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column v-if="item.index_type == 1" prop="target" align="center" label="目标值" min-width="150">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.target" clearable></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column v-if="item.index_type == 1" prop="unit" label="量化指标单位" align="center" min-width="120">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.unit" clearable></el-input>
+                </template>
+              </el-table-column>
+              <el-table-column v-if="item.index_type == 1 || item.index_type == 2" prop="weight" label="权重(%)"
+                align="center" min-width="120">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.weight" clearable>
+                    <template slot="append">%</template>
+                  </el-input>
+                </template>
+              </el-table-column>
+              <el-table-column prop="result_type" label="结果值录入" align="center" min-width="120">
                 <template slot-scope="scope">
-                  <span v-if="scope.row.target">{{ scope.row.target }}{{ scope.row.unit }}</span>
+                  <div v-if="scope.row.result_employee_id" class="flex-box-ce" style="text-align: center;">
+                    <div class="flex-box-ce" style="margin: 0 auto;">
+                      <userImage :id="scope.row.result_employee_id" :user_name="scope.row.result_employee_name"
+                        :img_url="scope.row.result_employee_img_url" width="35px" height="35px" fontSize="12px">
+                      </userImage>
+                      <span style="margin: 0 10px; line-height: 50px;">{{ scope.row.result_employee_name }}</span>
+                    </div>
+                  </div>
+                  <el-select v-else :value="scope.row.result_type" disabled>
+                    <el-option value="none" label="不开启"></el-option>
+                    <el-option value="self" label="被考核人"></el-option>
+                    <el-option value="special" label="指定员工"></el-option>
+                    <el-option value="supervisor" label="直接管理员"></el-option>
+                  </el-select>
                 </template>
               </el-table-column>
-              <el-table-column prop="unit" label="量化指标单位" v-if="item.index_type == 1"></el-table-column>
-              <el-table-column prop="weight" label="权重(%)" v-if="item.index_type == 1 || item.index_type == 2"></el-table-column>
-              <!-- <el-table-column prop="remark" label="备注"></el-table-column> -->
-              <el-table-column label="结果值录入人">
+              <el-table-column prop="reviewer_name" label="指定评分人" min-width="120" align="center">
                 <template slot-scope="scope">
-                  <span v-if="scope.row.result_type == 'none'">不开启</span>
-                  <span v-if="scope.row.result_type == 'self'">被考核人</span>
-                  <span v-if="scope.row.result_type == 'special'">指定员工 ({{$getEmployeeMapItem(scope.row.result_employee_id).name}}) </span>
-                  <span v-if="scope.row.result_type == 'supervisor'">指定管理员</span>
+                  <div v-if="!scope.row.reviewer_id" style="color: #bbb;">
+                    {{ '暂无数据' }}
+                  </div>
+                  <div v-else class="flex-box-ce" style="text-align: center;">
+                    <div class="flex-box-ce" style="margin: 0 auto;">
+                      <userImage :id="scope.row.reviewer_id" :user_name="scope.row.reviewer_name"
+                        :img_url="scope.row.reviewer_img_url" width="35px" height="35px" fontSize="12px"></userImage>
+                      <span style="margin: 0 10px; line-height: 50px;">{{ scope.row.reviewer_name }}</span>
+                    </div>
+                  </div>
                 </template>
               </el-table-column>
-              <el-table-column prop="reviewer_name" label="指定评分人"></el-table-column>
-              <el-table-column label="操作">
+              <el-table-column label="操作" align="center">
                 <template slot-scope="scope">
                   <el-button @click="compileIndex(scope, index)" type="text">编辑</el-button>
-                  <!-- <el-button @click="deleteIndex(scope, index)" type="text">删除</el-button> -->
                 </template>
               </el-table-column>
             </el-table>
-            <div class="fontColorB" style="margin: 20px 0;" v-if="item.index_type == 1 || item.index_type == 2">
-              <div style="margin-bottom: 5px;">指标权重: {{ getWeight()[0] }}%</div>
-              <div>
-                所有指标总权重:
-                <span class="orange">{{ getWeight()[1] }}%</span>
-              </div>
+            <div class="flex-box-ce result" style="margin: 20px 0;" v-if="item.index_type == 1 || item.index_type == 2">
+              <span style="padding-right: 20px;">指标权重: {{ getWeight()[0] }}%</span>
+              <span>所有指标总权重: {{ getWeight()[1] }}%</span>
             </div>
-<!--            <div class="wd-footer">
-              <div class="flex-box">
-                <el-button class="primaryBtn" @click="selectIndex(item, index)">
-                  <i class="el-icon-s-operation blue"></i>
-                  选择指标项
-                </el-button>
-                <el-button class="primaryBtn" @click="addIndex(item, index)">
-                  <i class="el-icon-plus blue"></i>
-                  增加指标项
-                </el-button>
-              </div>
-            </div> -->
           </el-tab-pane>
         </el-tabs>
       </div>
@@ -89,14 +123,17 @@
       <template slot="main">
         <div class="flex-box-ce">
           <el-select v-model="cate_id" filterable placeholder="请选择或搜索分类" class="flex-2">
-            <el-option v-for="item in indexTypeList" :key="item.value" :label="item.label" :value="item.value"></el-option>
+            <el-option v-for="item in indexTypeList" :key="item.value" :label="item.label"
+              :value="item.value"></el-option>
           </el-select>
-          <el-select v-model="tabIds" multiple placeholder="标签搜索" class="flex-1" style="margin-left: 10px;" v-if="tabs.length > 0">
+          <el-select v-model="tabIds" multiple placeholder="标签搜索" class="flex-1" style="margin-left: 10px;"
+            v-if="tabs.length > 0">
             <el-option v-for="item in tabs" :key="item.id" :label="item.name" :value="item.id"></el-option>
           </el-select>
         </div>
         <template v-if="indexList.length > 0">
-          <div class="flex-box-ce li" style="margin-top: 20px;"><el-checkbox class="flex-box-ce" v-model="isAllSelectIndex" label="全选"></el-checkbox></div>
+          <div class="flex-box-ce li" style="margin-top: 20px;"><el-checkbox class="flex-box-ce"
+              v-model="isAllSelectIndex" label="全选"></el-checkbox></div>
           <div class="infinite-list-wrapper scroll-bar">
             <ul class="ul" v-loading="indexLoading" v-infinite-scroll="load" infinite-scroll-disabled="disabled">
               <li v-for="(item, index) in indexList" :key="index" class="flex-box-ce li">
@@ -120,9 +157,10 @@
     </BrawerBox>
 
     <!-- 新增指标 -->
-    <BrawerBox drawerTitle="指标设置" :showDrawer.sync="isAddIndex" :closeModal="false">
-      <template slot="main">
-        <el-form ref="saveAddIndex" :model="addIndexForm" :rules="addIndexFormRule" @submit.native.prevent label-width="120px">
+    <el-dialog title="指标设置" :visible.sync="isAddIndex" width="600px">
+      <div class="flex-box-ce" style="margin: 20px auto 0 auto; width: 90%;">
+        <el-form ref="saveAddIndex" :model="addIndexForm" :rules="addIndexFormRule" @submit.native.prevent
+          label-width="120px" label-position="left">
           <el-form-item label="指标类型:" prop="type">
             <el-select v-model="addIndexForm.type" disabled placeholder="请选择指标类型" class="width-250">
               <el-option label="量化指标" :value="1"></el-option>
@@ -132,16 +170,20 @@
             </el-select>
           </el-form-item>
           <el-form-item label="指标名称" prop="name">
-            <el-input placeholder="请输入指标名称" v-model="addIndexForm.name" clearable show-word-limit maxlength="30"></el-input>
+            <el-input placeholder="请输入指标名称" v-model="addIndexForm.name" clearable show-word-limit
+              maxlength="30"></el-input>
           </el-form-item>
           <el-form-item :label="fromName" prop="per_remark">
-            <el-input placeholder="请输入" type="textarea" v-model="addIndexForm.per_remark" clearable autosize show-word-limit maxlength="500"></el-input>
+            <el-input placeholder="请输入" type="textarea" v-model="addIndexForm.per_remark" clearable autosize
+              show-word-limit maxlength="500"></el-input>
           </el-form-item>
           <el-form-item label="加分上限" prop="point_limit" v-if="addIndexForm.type == 3">
-            <el-input placeholder="请输入加分上限" v-model="addIndexForm.point_limit" clearable oninput="value=value.replace(/[^\d]/g,'')"></el-input>
+            <el-input placeholder="请输入加分上限" v-model="addIndexForm.point_limit" clearable
+              oninput="value=value.replace(/[^\d]/g,'')"></el-input>
           </el-form-item>
           <el-form-item label="扣分上限" prop="point_limit" v-if="addIndexForm.type == 4">
-            <el-input placeholder="请输入扣分上限" v-model="addIndexForm.point_limit" clearable oninput="value=value.replace(/[^\d]/g,'')"></el-input>
+            <el-input placeholder="请输入扣分上限" v-model="addIndexForm.point_limit" clearable
+              oninput="value=value.replace(/[^\d]/g,'')"></el-input>
           </el-form-item>
           <el-form-item label="目标值" prop="target" v-if="addIndexForm.type == 1">
             <el-input placeholder="请输入目标值" v-model="addIndexForm.target" clearable></el-input>
@@ -153,13 +195,13 @@
             <template slot="label">
               <span>结果值录入:</span>
               <el-tooltip effect="dark" placement="top">
-                  <template slot="content">
-                    结果值用来记录考核周期内指标的实际完成情况<br/>
-                    开启后,评分前需要先录入结果值,否则不能评分<br/>
-                    量化指标必须填写结果值<br/>
-                    其他类型指标必须提供结果附件作为凭据
-                    <!-- 开启后,当前指标评分前需要先录入结果值。结果值用来记录考核周期内指标的实际完成情况。 -->
-                  </template>
+                <template slot="content">
+                  结果值用来记录考核周期内指标的实际完成情况<br />
+                  开启后,评分前需要先录入结果值,否则不能评分<br />
+                  量化指标必须填写结果值<br />
+                  其他类型指标必须提供结果附件作为凭据
+                  <!-- 开启后,当前指标评分前需要先录入结果值。结果值用来记录考核周期内指标的实际完成情况。 -->
+                </template>
                 <i class="el-icon-warning"></i>
               </el-tooltip>
             </template>
@@ -169,43 +211,50 @@
               <el-option label="指定员工" value="special"></el-option>
               <el-option label="直接管理员" value="supervisor"></el-option>
             </el-select>
-            <div style="position: relative;margin-top: 10px;" v-if="addIndexForm.result_type == 'special'" class="width-250">
+            <div style="position: relative;margin-top: 10px;" v-if="addIndexForm.result_type == 'special'"
+              class="width-250">
               <el-input disabled v-model="assignUser.name" placeholder="请选择指定员工"></el-input>
               <!-- <div @click="addUser(1)" class="inputDc"></div> -->
             </div>
           </el-form-item>
           <el-form-item label="权重:" prop="weight" v-if="addIndexForm.type == 2 || addIndexForm.type == 1">
-            <el-input disabled placeholder="请输入权重(1~100)" id="input2" @input="checkCountry('input2')" v-model.number="addIndexForm.weight">
+            <el-input disabled placeholder="请输入权重(1~100)" id="input2" @input="checkCountry('input2')"
+              v-model.number="addIndexForm.weight">
               <template slot="append">
                 %
               </template>
             </el-input>
           </el-form-item>
           <el-form-item label="备注" prop="remark">
-            <el-input placeholder="请输入" type="textarea" v-model="addIndexForm.remark" clearable :rows="4" show-word-limit maxlength="500"></el-input>
+            <el-input placeholder="请输入" type="textarea" v-model="addIndexForm.remark" clearable :rows="4"
+              show-word-limit maxlength="500"></el-input>
           </el-form-item>
           <el-form-item label="自动算分" v-if="addIndexForm.type == 1">
-              <template slot="label">
-                <span>自动算分:</span>
-                <el-tooltip effect="dark" placement="top">
-                  <template slot="content">
-                    <div>需开启结果值录入</div>
-                  </template>
-                  <i class="el-icon-warning"></i>
-                </el-tooltip>
-              </template>
-              <el-switch v-model="addIndexForm.expression.auto_calculation"  :disabled="addIndexForm.result_type=='none'" :active-value="1" :inactive-value="0"></el-switch>
-              <div v-if="addIndexForm.expression.auto_calculation==1" class="pointBox">
-                 <div v-if="addIndexForm.expression.expression" style="padding: 10px;padding-top: 0;">
-                    <div class="flex-box-ce">
-                      <div class="flex-1">评分公式</div>
-                      <div class="blue" style="cursor: pointer;" @click="isShowTestCalculate=true">测试计算公式</div>
-                    </div>
-                    <div @click="isE=true" v-html="expressionStr" style="background-color: #f1f1f1;padding: 10px;text-align: left;border-radius: 5px;cursor: pointer;"></div>
-                  </div>
-                  <div v-else class="blue" style="text-align: center;padding-top: 30px;cursor: pointer;" @click="isE=true">设置评分计算方式</div>
+            <template slot="label">
+              <span>自动算分:</span>
+              <el-tooltip effect="dark" placement="top">
+                <template slot="content">
+                  <div>需开启结果值录入</div>
+                </template>
+                <i class="el-icon-warning"></i>
+              </el-tooltip>
+            </template>
+            <el-switch v-model="addIndexForm.expression.auto_calculation" :disabled="addIndexForm.result_type=='none'"
+              :active-value="1" :inactive-value="0"></el-switch>
+            <div v-if="addIndexForm.expression.auto_calculation==1" class="pointBox">
+              <div v-if="addIndexForm.expression.expression" style="padding: 10px;padding-top: 0;">
+                <div class="flex-box-ce">
+                  <div class="flex-1">评分公式</div>
+                  <div class="blue" style="cursor: pointer;" @click="isShowTestCalculate=true">测试计算公式</div>
+                </div>
+                <div @click="isE=true" v-html="expressionStr"
+                  style="background-color: #f1f1f1;padding: 10px;text-align: left;border-radius: 5px;cursor: pointer;">
+                </div>
               </div>
-			  <div class="fontColorC" style="line-height: 24px;">开启后,系统将根据评分公式自动计算指标得分,供评分人参考实现快速评分</div>
+              <div v-else class="blue" style="text-align: center;padding-top: 30px;cursor: pointer;" @click="isE=true">
+                设置评分计算方式</div>
+            </div>
+            <div class="fontColorC" style="line-height: 24px;">开启后,系统将根据评分公式自动计算指标得分,供评分人参考实现快速评分</div>
           </el-form-item>
           <el-form-item label="指定评分人" prop="isReviewer" v-if="special_scorer">
             <el-switch v-model="addIndexForm.isReviewer" disabled></el-switch>
@@ -232,27 +281,23 @@
             </div>
           </el-form-item>
         </el-form>
-        <div>
-          <span style="font-weight: 600;font-size: 14px;color: #606266;">按分数展示对应的评级:</span>
-          <el-select v-model="addIndexForm.index_level_id" @change="levelReadOnly" filterable clearable placeholder="请选择" disabled>
-            <el-option v-for="item in levelOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
-          </el-select>
-        </div>
-        <ClassSet
-          v-if="addIndexForm.index_level_id != 0 && getIs"
-          ref="ClassSet"
-          :readOnly="true"
-          :inputs="inputs"
-          style="padding-top: 20px;"
-          :inputsStyle="{ paddingLeft: '0px', width: '450px' }"
-        ></ClassSet>
-      </template>
+      </div>
+      <div class="flex-box-ce">
+        <span style="font-weight: 600;font-size: 14px;color: #606266;">按分数展示对应的评级:</span>
+        <el-select v-model="addIndexForm.index_level_id" @change="levelReadOnly" filterable clearable placeholder="请选择"
+          disabled>
+          <el-option v-for="item in levelOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
+        </el-select>
+      </div>
+      <ClassSet v-if="addIndexForm.index_level_id != 0 && getIs" ref="ClassSet" :readOnly="true" :inputs="inputs"
+        style="padding-top: 20px;" :inputsStyle="{ paddingLeft: '0px', width: '450px' }"></ClassSet>
       <template slot="footer">
         <el-button plain @click="closeAddIndexForm('saveAddIndex')">取消</el-button>
         <el-button type="primary" @click="saveAddIndex('saveAddIndex', 1)" v-if="isSave">提交</el-button>
         <el-button type="primary" @click="saveAddIndex('saveAddIndex', 2)" v-else>保存</el-button>
       </template>
-    </BrawerBox>
+    </el-dialog>
+
     <!-- 调整说明 -->
     <el-dialog title="调整说明" :visible.sync="isAdjustment" width="500px" :close-on-click-modal="false">
       <el-input type="textarea" v-model="adjustmentText" rows="4" placeholder="请输入内容(选填)"></el-input>
@@ -262,15 +307,18 @@
       </span>
     </el-dialog>
     <!-- 评分人 -->
-    <EmployeeSelector :multi="false" :is_filtration_creator="false" :selected="selected" :isChecKedAll="false" :visible.sync="setAdministrator" @confirm="confirmAdministrator" />
+    <EmployeeSelector :multi="false" :is_filtration_creator="false" :selected="selected" :isChecKedAll="false"
+      :visible.sync="setAdministrator" @confirm="confirmAdministrator" />
     <!-- 管理记录人 -->
-    <EmployeeSelector :is_filtration_creator="false" :selected="selected2" :visible.sync="isShowRecord" @confirm="confirmAdministrator2" />
+    <EmployeeSelector :is_filtration_creator="false" :selected="selected2" :visible.sync="isShowRecord"
+      @confirm="confirmAdministrator2" />
 
     <!-- 编辑公式 -->
     <Equation :visible.sync="isE" :expression.sync="expression"></Equation>
 
     <!-- 测试计算 -->
-    <TestCalculate :visible.sync="isShowTestCalculate" :str="expressionStr" :expression="expression.expression"></TestCalculate>
+    <TestCalculate :visible.sync="isShowTestCalculate" :str="expressionStr" :expression="expression.expression">
+    </TestCalculate>
   </div>
 </template>
 
@@ -295,7 +343,6 @@ export default {
       page_size: 10,
       loading: false,
       indexTypeList: [],
-
       isSelectIndex: false, //选择指标弹窗控制
       isAllSelectIndex: false, //是否全选指标
       cate_id: 0,
@@ -304,7 +351,6 @@ export default {
       indexLoading: false,
       indexPage: 1,
       isAfterLoading: false, //是否加载完
-
       // 添加指标
       isAddIndex: false,
       selected2: { employee: [], dept: [] }, //已经选择人员
@@ -480,6 +526,37 @@ export default {
     }
   },
   methods: {
+    // 选择指定评分人
+    openEmployeeSelector(e, index) {
+      this.selectItemIndex = index;
+      this.selectItemIndex_index = e.$index;
+      this.assignScoreUser = {
+        name: e.row.reviewer_name,
+        id: e.row.reviewer_id
+      }
+      this.addUser(2);
+    },
+    changeIsEdit(e, index) {
+      this.selectItemIndex = index;
+      this.selectItemIndex_index = e.$index;
+      let obj = { ...this.dimensionalityList[this.selectItemIndex].index[this.selectItemIndex_index] }
+      obj.isEditResult = true;
+      this.dimensionalityList[this.selectItemIndex].index.splice(this.selectItemIndex_index, 1, obj); //替换元素
+    },
+    // 结果值录入
+    changeResultType(value, e, index) {
+      e.row.result_type = value;
+      // 指定员工
+      if (value == 'special') {
+        this.selectItemIndex = index;
+        this.selectItemIndex_index = e.$index;
+        this.assignUser = {
+          name: e.row.result_employee_name,
+          id: e.row.result_employee_id
+        }
+        this.addUser(1);
+      }
+    },
     isShowRecordFun() {
       this.selected2.employee = this.record_ids;
       this.isShowRecord = true;
@@ -583,8 +660,20 @@ export default {
     confirmAdministrator(e) {
       if (this.isUserIndex == 1) {
         this.assignUser = e.employee.length > 0 ? e.employee[0] : [];
+        let obj = { ...this.dimensionalityList[this.selectItemIndex].index[this.selectItemIndex_index] }
+        obj.result_type = 'special';
+        obj.result_employee_id = this.assignUser.id;
+        obj.result_employee_name = this.assignUser.name;
+        obj.result_employee_img_url = this.assignUser.img_url;
+        obj.isEditResult = false;
+        this.dimensionalityList[this.selectItemIndex].index.splice(this.selectItemIndex_index, 1, obj); //替换元素
       } else {
         this.assignScoreUser = e.employee.length > 0 ? e.employee[0] : [];
+        let obj = { ...this.dimensionalityList[this.selectItemIndex].index[this.selectItemIndex_index] }
+        obj.reviewer_id = this.assignScoreUser.id;
+        obj.reviewer_name = this.assignScoreUser.name;
+        obj.reviewer_img_url = this.assignScoreUser.img_url;
+        this.dimensionalityList[this.selectItemIndex].index.splice(this.selectItemIndex_index, 1, obj); //替换元素
       }
       this.setAdministrator = false;
     },
@@ -672,6 +761,7 @@ export default {
         dimension.forEach(item => {
           if (item.index.length > 0) {
             item.index.forEach(item2 => {
+              item2.isEditResult = false;
               item2.result_employee_name = employeeMap[item2.result_employee_id] ? employeeMap[item2.result_employee_id].name : '';
               item2.reviewer_name = employeeMap[item2.reviewer_id] ? employeeMap[item2.reviewer_id].name : '';
             });
@@ -699,10 +789,10 @@ export default {
             }
           }
           if (this.addIndexForm.type == 1 || this.addIndexForm.type == 2) {
-            if (this.addIndexForm.weight == 0) {
-              this.$message.error('权重不能为0');
-              return;
-            }
+            // if (this.addIndexForm.weight == 0) {
+            //   this.$message.error('权重不能为0');
+            //   return;
+            // }
             if (this.addIndexForm.weight > 100) {
               this.$message.error('权重不能大于100');
               return;
@@ -1015,6 +1105,14 @@ export default {
 </script>
 
 <style scoped="scoped">
+.result {
+  width: 300px;
+  border: 2px solid #ff9600;
+  padding: 5px 10px;
+  color: #ff9600;
+  text-align: center;
+  font-weight: 600;
+}
 .border {
   -webkit-appearance: none;
   background-color: #fff;

+ 237 - 88
src/performance/views/myPerformance/formulate.vue

@@ -4,13 +4,13 @@
     <div class="main" v-loading="indexLoading">
       <template v-if="calc_type == 1">
         <div class="orange" style="text-align: right;">
-          <span v-if="calc_dimension">总分=评分 X 维度权重,再累加</span>
+          <span v-if="calc_dimension">总分=评分 X 分类权重,再累加</span>
           <span v-else>总分=评分直接累加</span>
         </div>
       </template>
       <template v-if="calc_type == 2">
         <div class="orange" style="text-align: right;">
-          <span v-if="calc_dimension">总分=评分 X 维度权重 X 指标权重,再累加</span>
+          <span v-if="calc_dimension">总分=评分 X 分类权重 X 指标权重,再累加</span>
           <span v-else>总分=评分 X 指标权重,再累加</span>
         </div>
       </template>
@@ -23,35 +23,90 @@
               <div v-if="item.index_type == 2">非量化指标</div>
               <div v-if="item.index_type == 3">额外加分项</div>
               <div v-if="item.index_type == 4">额外扣分项</div>
-              <div v-if="item.index_type != 3 && item.index_type != 4 && calc_dimension == 1">维度权重{{ item.dimension_weight }}%</div>
+              <div v-if="item.index_type != 3 && item.index_type != 4 && calc_dimension == 1">分类权重{{
+                item.dimension_weight }}%</div>
             </div>
           </div>
         </div>
-        <el-table :data="item.index" style="width: 100%;margin-top: 14px;">
-          <el-table-column prop="name" label="指标名称"></el-table-column>
-          <el-table-column prop="per_remark" min-width="200" :label="item.index_type == 3 || item.index_type == 4 ? (item.index_type == 3 ? '加分标准' : '扣分标准') : '考核标准'">
+        <el-table :data="item.index" style="width: 100%;" border>
+          <el-table-column prop="name" label="指标名称" align="center" min-width="200">
             <template slot-scope="scope">
-              <PreBox :value="scope.row.per_remark"></PreBox>
+              <el-input v-model="scope.row.name" placeholder="请输入指标名称" clearable maxlength="30"
+                show-word-limit></el-input>
             </template>
           </el-table-column>
-          <el-table-column prop="point_limit" :label="item.index_type == 3 ? '加分上限' : '扣分上限'" v-if="item.index_type == 3 || item.index_type == 4"></el-table-column>
-          <el-table-column prop="target" label="目标值" v-if="item.index_type == 1">
+
+          <el-table-column prop="per_remark" align="center"
+            :label="item.index_type == 3 || item.index_type == 4 ? (item.index_type == 3 ? '加分标准' : '扣分标准') : '考核标准'"
+            min-width="200">
+            <template slot-scope="scope">
+              <el-input type="textarea" v-model="scope.row.per_remark" :max-length="100"
+                :autosize="{ minRows: 1, maxRows: 2 }" clearable=""></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="item.index_type == 3 || item.index_type == 4" prop="point_limit" align="center"
+            :label="item.index_type == 3 ? '加分上限' : '扣分上限'" min-width="200">
+            <template slot-scope="scope">
+              <el-input type="textarea" :max-length="100" v-model="scope.row.point_limit" clearable
+                :autosize="{ minRows: 1, maxRows: 2 }"></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="item.index_type == 1" prop="target" align="center" label="目标值" min-width="200">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.target" clearable></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="item.index_type == 1" prop="unit" label="量化指标单位" align="center" min-width="120">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.unit" clearable></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="item.index_type == 1 || item.index_type == 2" prop="weight" label="权重(%)"
+            align="center" min-width="120">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.weight" clearable>
+                <template slot="append">%</template>
+              </el-input>
+            </template>
+          </el-table-column>
+          <el-table-column prop="result_type" label="结果值录入" align="center" min-width="120">
             <template slot-scope="scope">
-              <PreBox v-if="scope.row.target" :value="scope.row.target + '' + scope.row.unit"></PreBox>
+              <div v-if="scope.row.result_employee_id && !scope.row.isEditResult" class="flex-box-ce"
+                style="text-align: center;">
+                <div class="flex-box-ce" style="margin: 0 auto;">
+                  <userImage :id="scope.row.result_employee_id" :user_name="scope.row.result_employee_name"
+                    :img_url="scope.row.result_employee_img_url" width="35px" height="35px" fontSize="12px"></userImage>
+                  <span style="margin: 0 10px; line-height: 50px;">{{ scope.row.result_employee_name }}</span>
+                  <span class="el-icon-edit" @click="changeIsEdit(scope, index)"></span>
+                </div>
+              </div>
+              <el-select v-else :value="scope.row.result_type">
+                <el-option value="none" label="不开启" @click.native="changeResultType('none', scope, index)"></el-option>
+                <el-option value="self" label="被考核人" @click.native="changeResultType('self', scope, index)"></el-option>
+                <el-option value="special" label="指定员工"
+                  @click.native="changeResultType('special', scope, index)"></el-option>
+                <el-option value="supervisor" label="直接管理员"
+                  @click.native="changeResultType('supervisor', scope, index)"></el-option>
+              </el-select>
             </template>
           </el-table-column>
-          <el-table-column prop="unit" label="量化指标单位" v-if="item.index_type == 1"></el-table-column>
-          <el-table-column prop="weight" label="权重(%)" v-if="item.index_type == 1 || item.index_type == 2"></el-table-column>
-          <el-table-column label="结果值录入人">
+          <el-table-column prop="reviewer_name" label="指定评分人" min-width="120" align="center">
             <template slot-scope="scope">
-              <span v-if="scope.row.result_type == 'none'">不开启</span>
-              <span v-if="scope.row.result_type == 'self'">被考核人</span>
-              <span v-if="scope.row.result_type == 'special'">指定员工</span>
-              <span v-if="scope.row.result_type == 'supervisor'">直接管理员</span>
+              <div v-if="!scope.row.reviewer_id">
+                <el-button type="text" @click="openEmployeeSelector(scope, index)">请选择</el-button>
+              </div>
+              <div v-else class="flex-box-ce" style="text-align: center;">
+                <div class="flex-box-ce" style="margin: 0 auto;">
+                  <userImage :id="scope.row.reviewer_id" :user_name="scope.row.reviewer_name"
+                    :img_url="scope.row.reviewer_img_url" width="35px" height="35px" fontSize="12px"></userImage>
+                  <span style="margin: 0 10px; line-height: 50px;">{{ scope.row.reviewer_name }}</span>
+                  <span class="el-icon-edit" @click="openEmployeeSelector(scope, index)"></span>
+                </div>
+              </div>
             </template>
           </el-table-column>
-          <el-table-column prop="reviewer_name" label="指定评分人"></el-table-column>
-          <el-table-column label="操作">
+
+          <el-table-column label="操作" align="center">
             <template slot-scope="scope">
               <el-button @click="compileIndex(scope, index)" type="text">编辑</el-button>
               <el-button @click="deleteIndex(scope, index)" type="text">删除</el-button>
@@ -60,10 +115,10 @@
         </el-table>
         <div class="wd-footer flex-box-ce">
           <div class="flex-box flex-1">
-            <el-button class="primaryBtn" @click="selectIndex(item, index)">
+            <!-- <el-button class="primaryBtn" @click="selectIndex(item, index)">
               <i class="el-icon-s-operation blue"></i>
               选择指标项
-            </el-button>
+            </el-button> -->
             <el-button class="primaryBtn" @click="addIndex(item, index)">
               <i class="el-icon-plus blue"></i>
               增加指标项
@@ -96,28 +151,34 @@
     </footer>
 
     <!-- 新增指标 -->
-    <BrawerBox drawerTitle="指标设置" :showDrawer.sync="isAddIndex" :closeModal="false">
-      <template slot="main">
-        <el-form ref="saveAddIndex" :model="addIndexForm" :rules="addIndexFormRule" @submit.native.prevent label-width="120px">
-          <el-form-item label="指标类型:" prop="type">
+    <el-dialog title="指标设置" :visible.sync="isAddIndex" width="600px">
+      <div class="flex-box-ce" style="margin: 20px auto 0 auto; width: 90%;">
+        <el-form ref="saveAddIndex" :model="addIndexForm" :rules="addIndexFormRule" @submit.native.prevent
+          label-width="120px" label-position="left">
+          <el-form-item label="指标类型:" prop="type" class="width-250">
             <el-select v-model="addIndexForm.type" disabled placeholder="请选择指标类型" class="width-250">
-              <el-option label="量化指标" :value="1"></el-option>
-              <el-option label="非量化指标" :value="2"></el-option>
-              <el-option label="额外加分项" :value="3"></el-option>
-              <el-option label="额外扣分项" :value="4"></el-option>
+              <el-option label="量化指标" :value="1" class="width-250"></el-option>
+              <el-option label="非量化指标" :value="2" class="width-250"></el-option>
+              <el-option label="额外加分项" :value="3" class="width-250"></el-option>
+              <el-option label="额外扣分项" :value="4" class="width-250"></el-option>
             </el-select>
           </el-form-item>
-          <el-form-item label="指标名称:" prop="name"><el-input v-model="addIndexForm.name" placeholder="请输入指标名称" maxlength="30" show-word-limit></el-input></el-form-item>
+          <el-form-item label="指标名称:" prop="name"><el-input v-model="addIndexForm.name" placeholder="请输入指标名称"
+              maxlength="30" show-word-limit></el-input></el-form-item>
           <el-form-item :label="fromName" prop="per_remark">
-            <el-input type="textarea" placeholder="请输入" v-model="addIndexForm.per_remark" clearable autosize show-word-limit maxlength="500"></el-input>
+            <el-input type="textarea" placeholder="请输入" v-model="addIndexForm.per_remark" clearable autosize
+              show-word-limit maxlength="500"></el-input>
           </el-form-item>
           <el-form-item label="加分上限" prop="point_limit" v-if="addIndexForm.type == 3">
-            <el-input placeholder="请输入加分上限" v-model="addIndexForm.point_limit" id="input3" @input="checkCountry2('input3')"></el-input>
+            <el-input placeholder="请输入加分上限" v-model="addIndexForm.point_limit" id="input3"
+              @input="checkCountry2('input3')"></el-input>
           </el-form-item>
           <el-form-item label="扣分上限" prop="point_limit" v-if="addIndexForm.type == 4">
-            <el-input placeholder="请输入扣分上限" v-model="addIndexForm.point_limit" id="input4" @input="checkCountry2('input4')"></el-input>
+            <el-input placeholder="请输入扣分上限" v-model="addIndexForm.point_limit" id="input4"
+              @input="checkCountry2('input4')"></el-input>
           </el-form-item>
-          <el-form-item label="目标值:" prop="target" v-if="addIndexForm.type == 1"><el-input v-model="addIndexForm.target" placeholder="请输入目标值"></el-input></el-form-item>
+          <el-form-item label="目标值:" prop="target" v-if="addIndexForm.type == 1"><el-input v-model="addIndexForm.target"
+              placeholder="请输入目标值"></el-input></el-form-item>
           <el-form-item label="量化指标单位:" prop="unit" v-if="addIndexForm.type == 1">
             <el-input v-model="addIndexForm.unit" placeholder="请输入量化指标单位"></el-input>
           </el-form-item>
@@ -139,48 +200,54 @@
               </el-tooltip>
             </template>
             <el-select v-model="addIndexForm.result_type" placeholder="请选择指标类型" class="width-250">
-              <el-option label="不开启" value="none"></el-option>
-              <el-option label="被考核人" value="self"></el-option>
-              <el-option label="指定员工" value="special"></el-option>
-              <el-option label="直接管理员" value="supervisor"></el-option>
+              <el-option label="不开启" value="none" class="width-250"></el-option>
+              <el-option label="被考核人" value="self" class="width-250"></el-option>
+              <el-option label="指定员工" value="special" class="width-250"></el-option>
+              <el-option label="直接管理员" value="supervisor" class="width-250"></el-option>
             </el-select>
-            <div style="position: relative;margin-top: 10px;" v-if="addIndexForm.result_type == 'special'" class="width-250">
+            <div style="position: relative;margin-top: 10px;" v-if="addIndexForm.result_type == 'special'">
               <el-input v-model="assignUser.name" placeholder="请选择指定员工"></el-input>
               <div @click="addUser(1)" class="inputDc"></div>
             </div>
           </el-form-item>
           <el-form-item label="权重:" prop="weight" v-if="addIndexForm.type == 2 || addIndexForm.type == 1">
-            <el-input placeholder="请输入权重(1~100)" id="input2" @input="checkCountry('input2')" v-model.number="addIndexForm.weight">
+            <el-input placeholder="请输入权重(1~100)" id="input2" @input="checkCountry('input2')"
+              v-model.number="addIndexForm.weight">
               <template slot="append">
                 %
               </template>
             </el-input>
           </el-form-item>
           <el-form-item label="备注:" prop="remark">
-            <el-input type="textarea" placeholder="请输入" v-model="addIndexForm.remark" :rows="4" show-word-limit maxlength="500"></el-input>
+            <el-input type="textarea" placeholder="请输入" v-model="addIndexForm.remark" :rows="4" show-word-limit
+              maxlength="500"></el-input>
           </el-form-item>
           <el-form-item label="自动算分" v-if="addIndexForm.type == 1">
-              <template slot="label">
-                <span>自动算分:</span>
-                <el-tooltip effect="dark" placement="top">
-                  <template slot="content">
-                    <div>需开启结果值录入</div>
-                  </template>
-                  <i class="el-icon-warning"></i>
-                </el-tooltip>
-              </template>
-              <el-switch v-model="addIndexForm.expression.auto_calculation"  :disabled="addIndexForm.result_type=='none'" :active-value="1" :inactive-value="0"></el-switch>
-              <div v-if="addIndexForm.expression.auto_calculation==1" class="pointBox">
-                 <div v-if="addIndexForm.expression.expression" style="padding: 10px;padding-top: 0;">
-                    <div class="flex-box-ce">
-                      <div class="flex-1">评分公式</div>
-                      <div class="blue" style="cursor: pointer;" @click="isShowTestCalculate=true">测试计算公式</div>
-                    </div>
-                    <div @click="isE=true" v-html="expressionStr" style="background-color: #f1f1f1;padding: 10px;text-align: left;border-radius: 5px;cursor: pointer;"></div>
-                  </div>
-                  <div v-else class="blue" style="text-align: center;padding-top: 30px;cursor: pointer;" @click="isE=true">设置评分计算方式</div>
+            <template slot="label">
+              <span>自动算分:</span>
+              <el-tooltip effect="dark" placement="top">
+                <template slot="content">
+                  <div>需开启结果值录入</div>
+                </template>
+                <i class="el-icon-warning"></i>
+              </el-tooltip>
+            </template>
+            <el-switch v-model="addIndexForm.expression.auto_calculation" :disabled="addIndexForm.result_type=='none'"
+              :active-value="1" :inactive-value="0"></el-switch>
+            <div v-if="addIndexForm.expression.auto_calculation==1" class="pointBox">
+              <div v-if="addIndexForm.expression.expression" style="padding: 10px;padding-top: 0;">
+                <div class="flex-box-ce">
+                  <div class="flex-1">评分公式</div>
+                  <div class="blue" style="cursor: pointer;" @click="isShowTestCalculate=true">测试计算公式</div>
+                </div>
+                <div @click="isE=true" v-html="expressionStr"
+                  style="background-color: #f1f1f1;padding: 10px;text-align: left;border-radius: 5px;cursor: pointer;">
+                </div>
               </div>
-			  <div class="fontColorC" style="line-height: 24px;">开启后,系统将根据评分公式自动计算指标得分,供评分人参考实现快速评分</div>
+              <div v-else class="blue" style="text-align: center;padding-top: 30px;cursor: pointer;" @click="isE=true">
+                设置评分计算方式</div>
+            </div>
+            <div class="fontColorC" style="line-height: 24px;">开启后,系统将根据评分公式自动计算指标得分,供评分人参考实现快速评分</div>
           </el-form-item>
           <el-form-item label="开启指定评分人:" prop="isReviewer">
             <el-switch v-model="addIndexForm.isReviewer"></el-switch>
@@ -205,40 +272,39 @@
           </el-form-item>
           <div>
             <span style="font-weight: 600;font-size: 14px;color: #606266;">按分数展示对应的评级:</span>
-            <el-select v-model="addIndexForm.index_level_id" @change="levelReadOnly" filterable clearable placeholder="请选择">
-              <el-option v-for="item in levelOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
+            <el-select v-model="addIndexForm.index_level_id" @change="levelReadOnly" filterable clearable
+              placeholder="请选择" class="width-250">
+              <el-option v-for="item in levelOptions" :key="item.id" :label="item.name" :value="item.id"
+                class="width-250"></el-option>
             </el-select>
           </div>
-          <ClassSet
-            v-if="addIndexForm.index_level_id != 0 && getIs"
-            ref="ClassSet"
-            :readOnly="true"
-            :inputs="inputs"
-            style="padding-top: 20px;"
-            :inputsStyle="{ paddingLeft: '0px', width: '450px' }"
-          ></ClassSet>
+          <ClassSet v-if="addIndexForm.index_level_id != 0 && getIs" ref="ClassSet" :readOnly="true" :inputs="inputs"
+            style="padding-top: 20px;" :inputsStyle="{ paddingLeft: '0px', width: '450px' }"></ClassSet>
         </el-form>
-      </template>
+      </div>
       <template slot="footer">
         <el-button plain @click="closeAddIndexForm('saveAddIndex')">取消</el-button>
         <el-button type="primary" @click="saveAddIndex('saveAddIndex', 1)" v-if="isSave">提交</el-button>
         <el-button type="primary" @click="saveAddIndex('saveAddIndex', 2)" v-else>保存</el-button>
       </template>
-    </BrawerBox>
+    </el-dialog>
 
     <!-- 选择指标项 -->
     <BrawerBox drawerTitle="选择指标项" :showDrawer.sync="isSelectIndex">
       <template slot="main">
         <div class="flex-box-ce">
           <el-select v-model="cate_id" filterable placeholder="请选择或搜索分类" class="flex-2">
-            <el-option v-for="item in indexTypeList" :key="item.value" :label="item.label" :value="item.value"></el-option>
+            <el-option v-for="item in indexTypeList" :key="item.value" :label="item.label"
+              :value="item.value"></el-option>
           </el-select>
-          <el-select v-model="tabIds" multiple placeholder="标签搜索" class="flex-1" style="margin-left: 10px;" v-if="tabs.length > 0">
+          <el-select v-model="tabIds" multiple placeholder="标签搜索" class="flex-1" style="margin-left: 10px;"
+            v-if="tabs.length > 0">
             <el-option v-for="item in tabs" :key="item.id" :label="item.name" :value="item.id"></el-option>
           </el-select>
         </div>
         <template v-if="indexList.length > 0">
-          <div class="flex-box-ce li" style="margin-top: 20px;"><el-checkbox class="flex-box-ce" v-model="isAllSelectIndex" label="全选"></el-checkbox></div>
+          <div class="flex-box-ce li" style="margin-top: 20px;"><el-checkbox class="flex-box-ce"
+              v-model="isAllSelectIndex" label="全选"></el-checkbox></div>
           <div class="infinite-list-wrapper scroll-bar">
             <ul class="ul" v-loading="indexLoading2" v-infinite-scroll="load" infinite-scroll-disabled="disabled">
               <li v-for="(item, index) in indexList" :key="index" class="flex-box-ce li">
@@ -273,12 +339,14 @@
           </el-select>
         </div>
         <div style="margin-top: 10px;">
-          <el-select v-model="wdIndex" placeholder="请选择维度" style="width: 100%;">
-            <el-option v-for="(item, index) in wdList" :key="index + 1" :label="item.name" :value="index + 1"></el-option>
+          <el-select v-model="wdIndex" placeholder="请选择分类" style="width: 100%;">
+            <el-option v-for="(item, index) in wdList" :key="index + 1" :label="item.name"
+              :value="index + 1"></el-option>
           </el-select>
         </div>
         <template v-if="fzIndexList.length > 0" v-loading="loading">
-          <div class="flex-box-ce li" style="margin-top: 20px;"><el-checkbox class="flex-box-ce" v-model="isAllSelectIndex" label="全选"></el-checkbox></div>
+          <div class="flex-box-ce li" style="margin-top: 20px;"><el-checkbox class="flex-box-ce"
+              v-model="isAllSelectIndex" label="全选"></el-checkbox></div>
           <ul class="ul">
             <li v-for="(item, index) in fzIndexList" :key="index" class="flex-box-ce li">
               <el-checkbox class="flex-box-ce" v-model="item.check" :label="item.name"></el-checkbox>
@@ -295,16 +363,19 @@
     </BrawerBox>
 
     <!-- 评分人 -->
-    <EmployeeSelector :multi="false" :is_filtration_creator="false" :selected="selected" :isChecKedAll="false" :visible.sync="setAdministrator" @confirm="confirmAdministrator" />
+    <EmployeeSelector :multi="false" :is_filtration_creator="false" :selected="selected" :isChecKedAll="false"
+      :visible.sync="setAdministrator" @confirm="confirmAdministrator" />
 
     <!-- 管理记录人 -->
-    <EmployeeSelector :is_filtration_creator="false" :selected="selected2" :visible.sync="isShowRecord" @confirm="confirmAdministrator2" />
+    <EmployeeSelector :is_filtration_creator="false" :selected="selected2" :visible.sync="isShowRecord"
+      @confirm="confirmAdministrator2" />
 
     <!-- 编辑公式 -->
     <Equation :visible.sync="isE" :expression.sync="expression"></Equation>
 
     <!-- 测试计算 -->
-    <TestCalculate :visible.sync="isShowTestCalculate" :str="expressionStr" :expression="expression.expression"></TestCalculate>
+    <TestCalculate :visible.sync="isShowTestCalculate" :str="expressionStr" :expression="expression.expression">
+    </TestCalculate>
   </div>
 </template>
 <script>
@@ -570,6 +641,37 @@ export default {
     this.gradeSetList();
   },
   methods: {
+    // 选择指定评分人
+    openEmployeeSelector(e, index) {
+      this.selectItemIndex = index;
+      this.selectItemIndex_index = e.$index;
+      this.assignScoreUser = {
+        name: e.row.reviewer_name,
+        id: e.row.reviewer_id
+      }
+      this.addUser(2);
+    },
+    changeIsEdit(e, index) {
+      this.selectItemIndex = index;
+      this.selectItemIndex_index = e.$index;
+      let obj = { ...this.dimensionalityList[this.selectItemIndex].index[this.selectItemIndex_index] }
+      obj.isEditResult = true;
+      this.dimensionalityList[this.selectItemIndex].index.splice(this.selectItemIndex_index, 1, obj); //替换元素
+    },
+    // 结果值录入
+    changeResultType(value, e, index) {
+      e.row.result_type = value;
+      // 指定员工
+      if (value == 'special') {
+        this.selectItemIndex = index;
+        this.selectItemIndex_index = e.$index;
+        this.assignUser = {
+          name: e.row.result_employee_name,
+          id: e.row.result_employee_id
+        }
+        this.addUser(1);
+      }
+    },
     isShowRecordFun() {
       this.selected2.employee = this.record_ids;
       this.isShowRecord = true;
@@ -863,8 +965,37 @@ export default {
     //添加指标
     addIndex(e, index) {
       this.selectItemIndex = index;
-      this.addIndexForm.type = e.index_type;
-      this.isAddIndex = true;
+      let obj = {
+        id: 0,
+        custom: 1,
+        name: "",
+        per_remark: "",
+        type: e.index_type,
+        unit: "",
+        target: "",
+        result_type: "none",
+        result_employee_id: "",
+        weight: 0,
+        reviewer_id: "",
+        point_limit: "",
+        index_level_id: "",
+        reviewer_id: "",
+        record_ids: [],
+        expression: {
+          type: 1,                //1用户模式 2 开发者模式
+          logic_type: 1,        //1连续区间  2  列举  3  百分比加减   4 无条件
+          compare: 1,            //1  结果值  2 结果值/目标值 3结果值=目标值
+          reference: 1,            // 1手动输入   2选择系统字段
+          logic_section: [],            //连续区间的算分逻辑数组
+          logic_enum: [],            //列举的算分逻辑数组
+          logic_percent: [],            //百分比加减的算分逻辑数组
+          logic_eq: [],            //无条件的算分逻辑数组
+          expression: "",        //最终表达式
+          auto_calculation: 0,   //是否开启表达式算分  0 否   1 是
+          scorer_change: 1,        ////评分人是否允许修改  1 允许   2 不允许
+        }
+      }
+      this.dimensionalityList[index].index.push(obj);
     },
     //选择指标
     selectIndex(e, index) {
@@ -948,11 +1079,28 @@ export default {
       this.isAddIndex = true;
     },
     //保存人员
+    //选择人员弹框 -- 保存人员
     confirmAdministrator(e) {
+      // 结果值录入指定人员
       if (this.isUserIndex == 1) {
-        this.assignUser = e.employee.length > 0 ? e.employee[0] : [];
+        if (e.employee && e.employee.length > 0) {
+          this.assignUser = e.employee.length > 0 ? e.employee[0] : [];
+          let obj = { ...this.dimensionalityList[this.selectItemIndex].index[this.selectItemIndex_index] }
+          obj.result_type = 'special';
+          obj.result_employee_id = this.assignUser.id;
+          obj.result_employee_name = this.assignUser.name;
+          obj.result_employee_img_url = this.assignUser.img_url;
+          obj.isEditResult = false;
+          this.dimensionalityList[this.selectItemIndex].index.splice(this.selectItemIndex_index, 1, obj); //替换元素
+        }
+
       } else {
         this.assignScoreUser = e.employee.length > 0 ? e.employee[0] : [];
+        let obj = { ...this.dimensionalityList[this.selectItemIndex].index[this.selectItemIndex_index] }
+        obj.reviewer_id = this.assignScoreUser.id;
+        obj.reviewer_name = this.assignScoreUser.name;
+        obj.reviewer_img_url = this.assignScoreUser.img_url;
+        this.dimensionalityList[this.selectItemIndex].index.splice(this.selectItemIndex_index, 1, obj); //替换元素
       }
       this.setAdministrator = false;
     },
@@ -1062,7 +1210,7 @@ export default {
         }
       });
       if (!dimensionalityIndex) {
-        this.showMessage('维度中指标至少有一条');
+        this.showMessage('分类中指标至少有一条');
         return false;
       }
 
@@ -1077,7 +1225,7 @@ export default {
           }
         });
         if (indexSum != 100 && is) {
-          this.showMessage('所有维度的权重相加要等于100%');
+          this.showMessage('所有分类的权重相加要等于100%');
           return false;
         }
       }
@@ -1097,7 +1245,7 @@ export default {
           }
         });
         if (indexSum != 100 && is) {
-          this.showMessage('各维度中的所有指标权重相加要等于100%');
+          this.showMessage('各分类中的所有指标权重相加要等于100%');
           return false;
         }
       }
@@ -1164,6 +1312,7 @@ export default {
         data.dimension.forEach(item => {
           if (item.index.length > 0) {
             item.index.forEach(item2 => {
+              item2.isEditResult = false;
               item2.result_employee_name = employeeMap[item2.result_employee_id] ? employeeMap[item2.result_employee_id].name : '';
               item2.reviewer_name = employeeMap[item2.reviewer_id] ? employeeMap[item2.reviewer_id].name : '';
             });

+ 4 - 6
src/performance/views/myPerformance/myPerformance.vue

@@ -121,7 +121,7 @@
         <div class="dimensionCla" v-loading="tableLoad">
           <!-- 点击滚动 -->
           <TableBox :tableData="dimension" :isShowYd="isShowOneselfScore" :headerCellStyle="{ background: '#ECF5FF', textAlign: 'center' }" :objectSpanMethod="objectSpanMethod">
-            <el-table-column prop="theDimension" width="80" label="维度" align="center">
+            <el-table-column prop="theDimension" width="80" label="分类" align="center">
               <template slot-scope="scope">
                 <span style="width: 13px;display: inline-block;">{{ scope.row.theDimension }}</span>
                 <template v-if="calc_dimension && (scope.row.type == 1 || scope.row.type == 2)">
@@ -131,9 +131,6 @@
             </el-table-column>
             <el-table-column prop="name" label="指标名称" min-width="220">
               <template slot-scope="scope">
-<!--                   <template v-if="Number(scope.row.weight) > 0">
-                     <PreBox :value="scope.row.name+'(权重:'+scope.row.weight+'%)'"></PreBox>
-                   </template> -->
                    <PreBox  :value="scope.row.name"></PreBox>
                </template>
             </el-table-column>
@@ -1265,8 +1262,9 @@ export default {
             this.empDetList = data;
             this.employeeID = data.id; //考核记录id
             this.remployee =this.$getEmployeeMapItem(data.employee_id); //被考核人员信息
-            console.log(this.remployee)
             this.flow = data.flow; //流程
+            console.log("----------------------流程节点----------------------")
+            console.log(this.flow)
             this.config = data.config;
             this.publicity=data.publicity;
             this.calc_dimension = data.calc_dimension; //是否参与权重
@@ -2329,7 +2327,7 @@ export default {
 .flow-item {
   background-color: #ecf5ff;
   height: 60px;
-  min-width: 280px;
+  min-width: 260px;
   position: relative;
   margin-right: 40px;
   margin-top: 20px;

+ 404 - 299
src/performance/views/myPerformance/resultSet.vue

@@ -2,248 +2,354 @@
   <div class="box-all boxMinHeight">
     <PageHead :phName="packageName"></PageHead>
     <div class="main">
-     <div class="flex-box-ce" style="padding: 10px 0;border-bottom: 1px solid #f1f1f1;margin-bottom: 20px;" v-if="$route.query.resultStr=='录入结果值'">
-         <span :class="{ active: activeName=='noEntering' }" style="width: 80px;" @click="activeName='noEntering'">未录入({{ noStatusListTotal }})</span>
-         <span :class="{ active: activeName=='entering' }" style="width: 80px;" @click="activeName='entering'">已录入({{ statusListTotal }})</span>
+      <div class="flex-box-ce" style="padding: 10px 0;border-bottom: 1px solid #f1f1f1; margin-bottom: 20px;"
+        v-if="$route.query.resultStr == '录入结果值'">
+        <span :class="{ active: activeName == 'noEntering' }" style="width: 80px;" @click="activeName = 'noEntering'">未录入({{
+          noStatusListTotal }})</span>
+        <span :class="{ active: activeName == 'entering' }" style="width: 80px;" @click="activeName = 'entering'">已录入({{
+          statusListTotal }})</span>
       </div>
-     <div v-show="activeName=='noEntering'">
-       <template v-if="noStatusList.length>0">
-        <div v-for="(item,index) in noStatusList" :key="index">
-          <div class="wd-title">{{item.wdName}}</div>
-          <el-table :data="item.list"  border :header-cell-style="{ background: '#ECF5FF' }">
-            <el-table-column prop="userName" label="姓名"></el-table-column>
-            <el-table-column prop="name" label="指标名称"></el-table-column>
-            <el-table-column prop="per_remark" label="考核标准"  min-width="200">
+      <div v-show="activeName == 'noEntering'">
+        <template v-if="noStatusList.length > 0">
+          <el-table :data="noStatusList" border :header-cell-style="{ background: '#ECF5FF' }"
+            @selection-change="handleSelectionChange" :span-method="objectSpanMethod1">
+            <el-table-column type="selection" min-width="55" align="center">
+            </el-table-column>
+            <el-table-column prop="wdName" label="分类" align="center"></el-table-column>
+            <el-table-column prop="userName" label="姓名" align="center"></el-table-column>
+            <el-table-column prop="name" label="指标名称" align="center"></el-table-column>
+            <el-table-column prop="per_remark" label="考核标准" min-width="200" align="center">
               <template slot-scope="scope">
-                  <PreBox :value="scope.row.per_remark"></PreBox>
+                <PreBox :value="scope.row.per_remark"></PreBox>
               </template>
             </el-table-column>
-            <el-table-column prop="target" label="目标值">
+            <el-table-column prop="target" label="目标值" align="center">
               <template slot-scope="scope">
-                  <span>{{scope.row.target}}{{scope.row.unit}}</span>
+                <span>{{ scope.row.target }}{{ scope.row.unit }}</span>
               </template>
             </el-table-column>
-            <el-table-column prop="weight" label="权重%"></el-table-column>
-            <el-table-column prop="remark" label="备注" min-width="200"></el-table-column>
-            <el-table-column label="结果值附件" min-width="200">
-                <template slot-scope="scope">
-                  <div style="margin-bottom: 20px;" @click="openActive(scope.row)">
-                    <uploadOss
-                      :key="scope.row.id"
-                      :headers="$xtoken"
-                      class="avatar-uploader"
-                      :action="$action"
-                      :show-file-list="true"
-                      :file-list="scope.row.result_file.images"
-                      :on-preview="onFilePreView"
-                      :before-upload="beforeUpload"
-                      :on-remove="onFileRemove"
-                      :data-item ="scope.row"
-                      :limit="3"
-                      :on-success="handleSuccessImg"
-                      :accept="$acceptImg"
-                      :multiple="true"
-                    >
-                      <el-button class="primaryBtn" icon="el-icon-picture-outline" plain size="mini">图片</el-button>
-                      <!-- (最多选择3张) -->
-                    </uploadOss>
-                  </div>
-                  <div @click="openActive(scope.row)">
-                    <uploadOss
-                      :key="scope.row.id"
-                      class="avatar-uploader"
-                      :headers="$xtoken"
-                      :show-file-list="true"
-                      :multiple="true"
-                      :limit="5"
-                      :accept="$acceptFile"
-                      :file-list="scope.row.result_file.append"
-                      :action="$action"
-                      :on-preview="onFilePreView2"
-                      :on-success="handleSuccess"
-                      :on-remove="handleRemove"
-                      :before-upload="beforeFilesUpload"
-                    >
-                      <el-button class="primaryBtn" icon="el-icon-paperclip" plain size="mini">附件</el-button>
-                      <!-- (仅支持上传xlsx,xls,doc,docx,pdf,txt,最多一份附件) -->
-                    </uploadOss>
-                  </div>
-                </template>
+            <el-table-column prop="weight" label="权重%" align="center"></el-table-column>
+            <el-table-column prop="remark" label="备注" min-width="200" align="center"></el-table-column>
+            <el-table-column label="结果值附件" min-width="200" :render-header="(h, obj) => renderHeader(h, obj, 'upload')">
+              <template slot-scope="scope">
+                <div style="margin-bottom: 20px;" @click="openActive(scope.row)">
+                  <uploadOss :key="scope.row.id" :headers="$xtoken" class="avatar-uploader" :action="$action"
+                    :show-file-list="true" :file-list="scope.row.result_file.images" :on-preview="onFilePreView"
+                    :before-upload="beforeUpload" :on-remove="onFileRemove" :data-item="scope.row" :limit="3"
+                    :on-success="handleSuccessImg" :accept="$acceptImg" :multiple="true">
+                    <el-button class="primaryBtn" icon="el-icon-picture-outline" plain size="mini">图片</el-button>
+                    <!-- (最多选择3张) -->
+                  </uploadOss>
+                </div>
+                <div @click="openActive(scope.row)">
+                  <uploadOss :key="scope.row.id" class="avatar-uploader" :headers="$xtoken" :show-file-list="true"
+                    :multiple="true" :limit="5" :accept="$acceptFile" :file-list="scope.row.result_file.append"
+                    :action="$action" :on-preview="onFilePreView2" :on-success="handleSuccess" :on-remove="handleRemove"
+                    :before-upload="beforeFilesUpload">
+                    <el-button class="primaryBtn" icon="el-icon-paperclip" plain size="mini">附件</el-button>
+                    <!-- (仅支持上传xlsx,xls,doc,docx,pdf,txt,最多一份附件) -->
+                  </uploadOss>
+                </div>
+              </template>
             </el-table-column>
-            <el-table-column label="实际完成结果值" min-width="150">
-                <template slot-scope="scope">
-                  <div class="flex-box-ce" v-if="scope.row.type==1">
-                    <el-input type="textarea" @input="[(scope.row.result = isFloor(scope.row.result))]" style="min-width: 130px;" :rows="1" v-model="scope.row.result" placeholder="请输入"></el-input>
-                    <span style="width: 40px;padding-left: 5px;" class="font-flex-word">{{scope.row.unit}}</span>
-                  </div>
-                  <div v-else>--</div>
-                </template>
+            <el-table-column label="实际完成结果值" min-width="150"
+              :render-header="(h, obj) => renderHeader(h, obj, 'result_cache')">
+              <template slot-scope="scope">
+                <div class="flex-box-ce" v-if="scope.row.type == 1">
+                  <el-input type="textarea" @input="[(scope.row.result = isFloor(scope.row.result))]"
+                    style="min-width: 130px;" :rows="1" v-model="scope.row.result" placeholder="请输入"></el-input>
+                  <span style="width: 40px;padding-left: 5px;" class="font-flex-word">{{ scope.row.unit }}</span>
+                </div>
+                <div v-else>--</div>
+              </template>
             </el-table-column>
           </el-table>
-        </div>
-       </template>
-       <noData v-else></noData>
+        </template>
+        <noData v-else></noData>
       </div>
-     <div v-show="activeName=='entering'">
-       <template v-if="statusList.length>0">
-       <div v-for="(item,index) in statusList" :key="index">
-        <div class="wd-title">{{item.wdName}}</div>
-        <el-table :data="item.list" border :header-cell-style="{ background: '#ECF5FF' }">
-          <el-table-column prop="userName" label="姓名"></el-table-column>
-          <el-table-column prop="name" label="指标名称"></el-table-column>
-          <el-table-column prop="per_remark" label="考核标准"  min-width="200">
-            <template slot-scope="scope">
+      <div v-show="activeName == 'entering'">
+        <template v-if="statusList.length > 0">
+          <el-table :data="statusList" border :header-cell-style="{ background: '#ECF5FF' }"
+            @selection-change="handleSelectionChange" :span-method="objectSpanMethod2">
+            <el-table-column type="selection" min-width="55" align="center">
+            </el-table-column>
+            <el-table-column prop="wdName" label="分类" align="center"></el-table-column>
+            <el-table-column prop="userName" label="姓名" align="center"></el-table-column>
+            <el-table-column prop="name" label="指标名称" align="center"></el-table-column>
+            <el-table-column prop="per_remark" label="考核标准" min-width="200" align="center">
+              <template slot-scope="scope">
                 <PreBox :value="scope.row.per_remark"></PreBox>
-            </template>
-          </el-table-column>
-          <el-table-column prop="target" label="目标值"></el-table-column>
-          <el-table-column prop="weight" label="权重%"></el-table-column>
-          <el-table-column prop="remark" label="备注" min-width="200"></el-table-column>
-          <el-table-column label="结果值附件" min-width="200">
+              </template>
+            </el-table-column>
+            <el-table-column prop="target" label="目标值" align="center"></el-table-column>
+            <el-table-column prop="weight" label="权重%" align="center"></el-table-column>
+            <el-table-column prop="remark" label="备注" min-width="200" align="center"></el-table-column>
+            <el-table-column label="结果值附件" min-width="200" :render-header="(h, obj) => renderHeader(h, obj, 'upload')">
               <template slot-scope="scope">
                 <div style="margin-bottom: 20px;" @click="openActive(scope.row)">
-                  <uploadOss
-                    :key="scope.row.id"
-                    :headers="$xtoken"
-                    class="avatar-uploader"
-                    :action="$action"
-                    :show-file-list="true"
-                    :file-list="scope.row.result_file.images"
-                    :on-preview="onFilePreView"
-                    :before-upload="beforeUpload"
-                    :on-remove="onFileRemove"
-                    :data-item ="scope.row"
-                    :limit="3"
-                    :on-success="handleSuccessImg"
-                    :accept="$acceptImg"
-                    :multiple="true"
-                  >
+                  <uploadOss :key="scope.row.id" :headers="$xtoken" class="avatar-uploader" :action="$action"
+                    :show-file-list="true" :file-list="scope.row.result_file.images" :on-preview="onFilePreView"
+                    :before-upload="beforeUpload" :on-remove="onFileRemove" :data-item="scope.row" :limit="3"
+                    :on-success="handleSuccessImg" :accept="$acceptImg" :multiple="true">
                     <el-button class="primaryBtn" icon="el-icon-picture-outline" plain size="mini">图片</el-button>
                     <!-- (最多选择3张) -->
                   </uploadOss>
                 </div>
                 <div @click="openActive(scope.row)">
-                  <uploadOss
-                    :key="scope.row.id"
-                    class="avatar-uploader"
-                    :headers="$xtoken"
-                    :show-file-list="true"
-                    :multiple="true"
-                    :limit="5"
-                    :accept="$acceptFile"
-                    :file-list="scope.row.result_file.append"
-                    :action="$action"
-                    :on-preview="onFilePreView2"
-                    :on-success="handleSuccess"
-                    :on-remove="handleRemove"
-                    :before-upload="beforeFilesUpload"
-                  >
+                  <uploadOss :key="scope.row.id" class="avatar-uploader" :headers="$xtoken" :show-file-list="true"
+                    :multiple="true" :limit="5" :accept="$acceptFile" :file-list="scope.row.result_file.append"
+                    :action="$action" :on-preview="onFilePreView2" :on-success="handleSuccess" :on-remove="handleRemove"
+                    :before-upload="beforeFilesUpload">
                     <el-button class="primaryBtn" icon="el-icon-paperclip" plain size="mini">附件</el-button>
                     <!-- (仅支持上传xlsx,xls,doc,docx,pdf,txt,最多一份附件) -->
                   </uploadOss>
                 </div>
               </template>
-          </el-table-column>
-          <el-table-column label="实际完成结果值" min-width="150">
+            </el-table-column>
+            <el-table-column label="实际完成结果值" min-width="150" align="center"
+              :render-header="(h, obj) => renderHeader(h, obj, 'result_cache')">
               <template slot-scope="scope">
-                <div class="flex-box-ce" v-if="scope.row.type==1">
-                  <el-input type="textarea" @input="[(scope.row.result = isFloor(scope.row.result))]" style="min-width: 130px;" :rows="1" v-model="scope.row.result" placeholder="请输入"></el-input>
-                  <span style="width: 40px;padding-left: 5px;" class="font-flex-word">{{scope.row.unit}}</span>
+                <div class="flex-box-ce" v-if="scope.row.type == 1">
+                  <el-input type="textarea" @input="[(scope.row.result = isFloor(scope.row.result))]"
+                    style="min-width: 130px;" :rows="1" v-model="scope.row.result" placeholder="请输入"></el-input>
+                  <span style="width: 40px;padding-left: 5px;" class="font-flex-word">{{ scope.row.unit }}</span>
                 </div>
                 <div v-else>--</div>
               </template>
-          </el-table-column>
-
-<!--          <el-table-column label="结果值附件" min-width="200">
-              <template slot-scope="scope">
-                <div v-if="scope.row.result_file.images.length>0">
-                  <div>图片</div>
-                  <div style="margin-bottom: 3px;cursor: pointer;" class="blue" v-for="(item, index) in scope.row.result_file.images" :key="index" @click="onFilePreView(item)">{{ item.name }}</div>
-                </div>
-                <div v-if="scope.row.result_file.append.length>0">
-                  <div>文件</div>
-                  <div style="margin-bottom: 3px;cursor: pointer;" class="green" v-for="(item, index) in scope.row.result_file.append" :key="index" @click="onFilePreView2(item)">{{ item.name }}</div>
-                </div>
-              </template>
-          </el-table-column>
-          <el-table-column label="实际完成结果值" min-width="150" prop="result">
-            <template slot-scope="scope">
-              <span v-if="scope.row.type==1">
-                <span class="font-flex-word">{{scope.row.result}}</span>
-                <span style="width: 40px;padding-left: 5px;" class="font-flex-word">{{scope.row.unit}}</span>
-              </span>
-              <div v-else>--</div>
-            </template>
-          </el-table-column> -->
-
-
-        </el-table>
-       </div>
+            </el-table-column>
+          </el-table>
         </template>
         <noData v-else></noData>
       </div>
     </div>
-    <footer class="footer flex-box-end" v-if="activeName == 'noEntering'">
-      <el-button  class="primaryBtn" @click="save(1)" v-if="$route.query.resultStr=='录入结果值'">暂存</el-button>
-      <el-button  type="primary" @click="save(0)">提交结果值</el-button>
+    <footer class="footer flex-box-end"
+      v-if="activeName == 'noEntering' && multipleSelection && multipleSelection.length > 0">
+      <el-button class="primaryBtn" @click="save(1)" v-if="$route.query.resultStr == '录入结果值'">暂存</el-button>
+      <el-button type="primary" @click="save(0)">提交结果值</el-button>
     </footer>
-    <footer class="footer flex-box-end" v-if="activeName == 'entering'">
-      <!-- <el-button  class="primaryBtn" @click="save(1)" v-if="$route.query.resultStr=='录入结果值'">暂存</el-button> -->
-      <el-button  type="primary" @click="save(3)">提交结果值</el-button>
+    <footer class="footer flex-box-end"
+      v-if="activeName == 'entering' && multipleSelection && multipleSelection.length > 0">
+      <el-button type="primary" @click="save(3)">提交结果值</el-button>
     </footer>
-    <el-dialog title="图片查看" :visible.sync="isShowImg" width="50%" >
+    <el-dialog title="图片查看" :visible.sync="isShowImg" width="50%">
       <img :src="imgUrl" style="width: 100%;">
       <span slot="footer" class="dialog-footer">
-        <el-button @click="isShowImg = false">取 消</el-button>
-        <el-button type="primary" @click="isShowImg = false">确 定</el-button>
+        <el-button @click="closePreview">关闭</el-button>
       </span>
     </el-dialog>
+
+    <BatchUpload :isUploadShow="isUploadShow" :isUploadImg="isUploadImg" :isUploadFile="isUploadFile"
+      :isResultCache="isResultCache" @close="closeBatchUpload" @confirm="getImgs"></BatchUpload>
   </div>
 </template>
 <script>
 import PageHead from '@/components/PageHead'; //头部---返回
 import uploadOss from '@/components/upload';
 import { _debounce } from '@/utils/auth';
+import BatchUpload from "./resultSetComp/BatchUpload.vue"
+
 export default {
-  components: { PageHead,uploadOss },
+  components: { PageHead, uploadOss, BatchUpload },
   name: 'resultSet',
   data() {
     return {
       title: '2024年的绩效考核',
       activeName: 'noEntering',
       noStatusList: [],
-      noStatusListTotal:0,
+      noStatusListTotal: 0,
       statusList: [],
-      statusListTotal:0,
-      id:'',//员工考核记录id
-      packageName:'',//考核包名称 结果值录入用到
-
+      statusListTotal: 0,
+      id: '',//员工考核记录id
+      packageName: '',//考核包名称 结果值录入用到
       // 上传图标与附件
       img_fileList: [], // 图片附件
       file_fileList: [], //文件附件
       imgs: [],
       doc: '',
-      isShowImg:false,
-      imgUrl:'',
-      selectItem:{},
+      isShowImg: false,
+      imgUrl: '',
+      selectItem: {},
+      isUploadShow: false,
+      multipleSelection: [],
+      isUploadImg: false,
+      isUploadFile: false,
+      isResultCache: false,
+      spanArr1: [], // 用于存储合并信息的数组
+      spanArr2: [], // 用于存储合并信息的数组
     };
   },
   watch: {},
+
+
   created() {
     if (this.$route.query.id) {
       this.id = this.$route.query.id;
-      this.packageName=this.$route.query.packageName;
-
+      this.packageName = this.$route.query.packageName;
       this.getPackageDtail();
     }
-    if(this.$route.query.resultStr=='调整结果值'){
-        this.activeName='entering';
+    if (this.$route.query.resultStr == '调整结果值') {
+      this.activeName = 'entering';
     }
   },
-  mounted() {
-
-  },
+  
   methods: {
+    objectSpanMethod2({ row, column, rowIndex, columnIndex }) {
+      if (columnIndex === 1) {
+        // this.tableData  修改
+        const _row = this.flitterData(this.statusList).one[rowIndex]
+        const _col = _row > 0 ? 1 : 0
+        return {
+          rowspan: _row,
+          colspan: _col,
+        }
+      }
+    },
+
+    objectSpanMethod1({ row, column, rowIndex, columnIndex }) {
+      if (columnIndex === 1) {
+        // this.tableData  修改
+        const _row = this.flitterData(this.noStatusList).one[rowIndex]
+        const _col = _row > 0 ? 1 : 0
+        return {
+          rowspan: _row,
+          colspan: _col,
+        }
+      }
+    },
+
+    //进行表格合并
+    flitterData(arr) {
+      let spanOneArr = []
+      let concatOne = 0
+      arr.forEach((item, index) => {
+        if (index === 0) {
+          spanOneArr.push(1)
+        } else {
+          //name 修改
+          if (item.wdName === arr[index - 1].wdName) {
+            //第一列需合并相同内容的判断条件
+            spanOneArr[concatOne] += 1
+            spanOneArr.push(0)
+          } else {
+            spanOneArr.push(1)
+            concatOne = index
+          }
+        }
+      })
+      return {
+        one: spanOneArr,
+      }
+    },
+    
+    // 自定义表头
+    renderHeader(h, scope, type) {
+      let { column, $index } = scope
+      let that = this;
+      if (that.multipleSelection && that.multipleSelection.length > 0) {
+        if (type == 'upload') return h(
+          'div', {
+          style: { display: "flex", alignItems: "center", justifyContent: "center" }
+        }, [
+
+          h('el-button', {
+            props: {
+              icon: 'el-icon-edit'
+            },
+            style: 'margin-left: 5px;',
+            on: {
+              click: function () {
+                that.clickButton('img');
+              }
+            }
+          }, '图片'),
+          // 按钮
+          h('el-button', {
+            props: {
+              icon: 'el-icon-edit'
+            },
+            style: 'margin-left: 5px;',
+            on: {
+              click: function () {
+                that.clickButton('file');
+              }
+            }
+          }, '附件')
+        ],
+        )
+        else return h(
+          'div', {
+          style: { display: "flex", alignItems: "center", justifyContent: "center" }
+        }, [
+
+          h('el-button', {
+            props: {
+              icon: 'el-icon-edit'
+            },
+            style: 'margin-left: 5px;',
+            on: {
+              click: function () {
+                that.clickButton('result_cache');
+              }
+            }
+          }, '实际完成结果值')
+        ],
+        )
+      } else {
+        return h(
+          'div', {
+          style: { display: "flex", alignItems: "center", justifyContent: "center" }
+        }, [
+          // 列名称
+          h('span', column.label),
+        ],
+        )
+      }
+
+    },
+
+    // 按钮点击事件
+    clickButton(type) {
+      if (type == 'img') {
+        this.isUploadImg = true;
+        this.isUploadFile = false;
+        this.isResultCache = false;
+      }
+      if (type == 'file') {
+        this.isUploadImg = false;
+        this.isUploadFile = true;
+        this.isResultCache = false;
+      }
+      if (type == 'result_cache') {
+        this.isUploadImg = false;
+        this.isUploadFile = false;
+        this.isResultCache = true;
+      }
+      this.openBatchUpload();
+    },
+    closePreview() {
+      this.imgUrl = "";
+      this.isShowImg = false;
+    },
+    openBatchUpload() {
+      this.isUploadShow = true;
+    },
+    handleSelectionChange(val) {
+      this.multipleSelection = val;
+    },
+    closeBatchUpload() {
+      this.isUploadShow = false;
+    },
+    getImgs(data) {
+      let { imgs, files, result_cache } = data
+      this.multipleSelection && this.multipleSelection.forEach(item => {
+        if (imgs && imgs.length > 0) item.result_file.images = imgs.filter(img => { return img.url })
+        if (files && files.length > 0) item.result_file.append = files.filter(file => { return file.url })
+        if (item.type == 1) {
+          if (result_cache) item.result = result_cache;
+        }
+      })
+      this.isUploadShow = false;
+    },
     isFloor(el) {
       var obj = event.target;
       var t = el.charAt(0);
@@ -259,15 +365,15 @@ export default {
       }
       return el || null;
     },
-    openActive(item){
-       this.selectItem=item
+    openActive(item) {
+      this.selectItem = item
     },
-    handleSuccessImg:_debounce(function(response, file, fileList){
-      let result_file=JSON.parse(JSON.stringify(this.selectItem)).result_file;
-      result_file.images=fileList.filter(item=>{
+    handleSuccessImg: _debounce(function (response, file, fileList) {
+      let result_file = JSON.parse(JSON.stringify(this.selectItem)).result_file;
+      result_file.images = fileList.filter(item => {
         return item.url
       })
-      this.selectItem.result_file=result_file;
+      this.selectItem.result_file = result_file;
     }),
     // 图片上传
     beforeUpload(file) {
@@ -283,33 +389,33 @@ export default {
       return isJPG && isLt2M;
     },
     onFilePreView(file) {
-      if(file.url){
-        this.imgUrl=file.url;
-        this.isShowImg=true;
+      if (file.url) {
+        this.imgUrl = file.url;
+        this.isShowImg = true;
       }
     },
     onFileRemove(file, fileList) {
-      setTimeout(()=>{
-        this.selectItem.result_file.images=fileList
-      },500)
+      setTimeout(() => {
+        this.selectItem.result_file.images = fileList
+      }, 500)
     },
-    handleSuccess:_debounce(function(response, file, fileList){
-      let result_file=JSON.parse(JSON.stringify(this.selectItem)).result_file;
-      result_file.append=fileList.filter(item=>{
+    handleSuccess: _debounce(function (response, file, fileList) {
+      let result_file = JSON.parse(JSON.stringify(this.selectItem)).result_file;
+      result_file.append = fileList.filter(item => {
         return item.url
       })
-      this.selectItem.result_file=result_file;
+      this.selectItem.result_file = result_file;
     }),
     onFilePreView2(file) {
       window.open(file.url, '_blank');
     },
     handleRemove(file, fileList) {
-      setTimeout(()=>{
-        this.selectItem.result_file.append=fileList
-      },500)
+      setTimeout(() => {
+        this.selectItem.result_file.append = fileList
+      }, 500)
     },
     beforeFilesUpload(file) {
-      const $ext_list = ['xlsx', 'xls', 'doc', 'docx', 'pdf','XLSX','XLS','DOC','DOCX','PDF'];
+      const $ext_list = ['xlsx', 'xls', 'doc', 'docx', 'pdf', 'XLSX', 'XLS', 'DOC', 'DOCX', 'PDF'];
       const isLt2M = file.size / 1024 / 1024 < 5;
       let len = file.name.split('.').length - 1;
       const $ext_name = file.name.split('.')[len];
@@ -327,108 +433,105 @@ export default {
       let isLr = false;
       let data = {
         id: this.id, //个人考核包ID
-        cache: num==1? 1:0, //是否暂存 1 是 0 否(提交)
+        cache: num == 1 ? 1 : 0, //是否暂存 1 是 0 否(提交)
         result_info: '', //结果值信息
-        sub:num==3? 0:1
+        sub: num == 3 ? 0 : 1
       };
       let result_info = [];
-      let isPost=true;
-      let str='';
-      let arr=num==3? this.statusList:this.noStatusList
-
-      arr.some(item => {
-        item.list.forEach(e=>{
-          if(num==3){
-            if (e.type == 1) {
-                if(!e.result){
-                  isPost=false;
-                  str=e.name+': 请输入结果值'
-                  return true
-                }
-                result_info.push({
-                  result: e.result, //单项目结果值
-                  dimension_key: e.message.dimension_key, //维度索引
-                  index_key: e.message.index_key, //指标索引
-                  index_id: e.id, //指标ID
-                  result_file: e.result_file
-                });
-            } else {
-               if (e.result_file.append.length == 0 && e.result_file.images.length == 0) {
-                  isPost=false;
-                 str=e.name+': 至少添加一份附件'
-                  return true
-               }
-                result_info.push({
-                  // result: e.result, //单项目结果值
-                  dimension_key: e.message.dimension_key, //维度索引
-                  index_key: e.message.index_key, //指标索引
-                  index_id: e.id, //指标ID
-                  result_file: e.result_file
-                });
+      let isPost = true;
+      let str = '';
+      let arr = this.multipleSelection;
+      arr.forEach(e => {
+        if (num == 3) {
+          if (e.type == 1) {
+            if (!e.result) {
+              isPost = false;
+              str = e.name + ': 请输入结果值'
+              return true
             }
-          }else{
-            if(e.type==1){
-              if(e.result){
-                result_info.push({
-                  result: e.result, //单项目结果值
-                  dimension_key: e.message.dimension_key, //维度索引
-                  index_key: e.message.index_key, //指标索引
-                  index_id: e.id ,//指标ID
-                  result_file:e.result_file
-                });
-              }
-            }else{
-              if(e.result_file.append.length > 0 || e.result_file.images.length > 0){
-                result_info.push({
-                  // result: e.result, //单项目结果值
-                  dimension_key: e.message.dimension_key, //维度索引
-                  index_key: e.message.index_key, //指标索引
-                  index_id: e.id ,//指标ID
-                  result_file:e.result_file
-                });
-              }
+            result_info.push({
+              result: e.result, //单项目结果值
+              dimension_key: e.message.dimension_key, //维度索引
+              index_key: e.message.index_key, //指标索引
+              index_id: e.id, //指标ID
+              result_file: e.result_file
+            });
+          } else {
+            if (e.result_file.append.length == 0 && e.result_file.images.length == 0) {
+              isPost = false;
+              str = e.name + ': 至少添加一份附件'
+              return true
             }
+            result_info.push({
+              // result: e.result, //单项目结果值
+              dimension_key: e.message.dimension_key, //维度索引
+              index_key: e.message.index_key, //指标索引
+              index_id: e.id, //指标ID
+              result_file: e.result_file
+            });
           }
+        } else {
+          if (e.type == 1) {
+            if (e.result) {
+              result_info.push({
+                result: e.result, //单项目结果值
+                dimension_key: e.message.dimension_key, //维度索引
+                index_key: e.message.index_key, //指标索引
+                index_id: e.id,//指标ID
+                result_file: e.result_file
+              });
+            }
+          } else {
+            if (e.result_file.append.length > 0 || e.result_file.images.length > 0) {
+              result_info.push({
+                // result: e.result, //单项目结果值
+                dimension_key: e.message.dimension_key, //维度索引
+                index_key: e.message.index_key, //指标索引
+                index_id: e.id,//指标ID
+                result_file: e.result_file
+              });
+            }
+          }
+        }
+      })
 
-        })
-      });
-
-      if(num==3){
-        if(!isPost){
+      if (num == 3) {
+        if (!isPost) {
           this.$message({ type: 'error', message: str, duration: 3000, center: true });
           return false;
         }
-      }else{
-        if (result_info.length==0) {
+      } else {
+        if (result_info.length == 0) {
           this.$message({ type: 'error', message: '至少输入一项结果值或非量化指标添加一份附件', duration: 3000, center: true });
           return false;
         }
       }
-      data.result_info=JSON.stringify(result_info);
-      if(num==0){
+      data.result_info = JSON.stringify(result_info);
+      if (num == 0) {
         this.$confirm('请仔细检查结果值数据是否填写准确,以免数据错误造成不便!', '提示', {
           confirmButtonText: '确认提交',
           cancelButtonText: '返回检查',
           type: 'warning'
         }).then(() => {
           this.recordResult(data)
-        }).catch(() => {});
-      }else{
+        }).catch(() => { });
+      } else {
         this.recordResult(data)
       }
     },
 
-    recordResult(data){
-      this.$axiosUser('post', '/api/pro/per/package/record_result',data).then(res => {
-           this.$message.success("设置成功")
-           this.getPackageDtail();
+    recordResult(data) {
+      this.$axiosUser('post', '/api/pro/per/package/record_result', data).then(res => {
+        this.$message.success("设置成功");
+        this.multipleSelection = [];
+        this.getPackageDtail();
       })
     },
     getPackageDtail() {
-      this.$axiosUser('get', '/api/pro/per/package/employee/info', {id: this.id}).then(res => {
+      this.$axiosUser('get', '/api/pro/per/package/employee/info', { id: this.id }).then(res => {
         let data = res.data.data;
         let dimension = data.dimension;
-        let relevance_employee=data.relevance_employee
+        let relevance_employee = data.relevance_employee
         dimension.forEach((item, index) => {
           if (item.index.length > 0) {
             item.index.forEach((item2, index2) => {
@@ -459,58 +562,59 @@ export default {
           }
           if (item.status == 1) {
             dimension[item.dimension_key].index[item.index_key].message = item;
-            if(item.result_cache){//是否有暂存的数据有就显示出来
-              dimension[item.dimension_key].index[item.index_key].result=item.result_cache
+            if (item.result_cache) {//是否有暂存的数据有就显示出来
+              dimension[item.dimension_key].index[item.index_key].result = item.result_cache
             }
-            if(item.result_file){
-               dimension[item.dimension_key].index[item.index_key].result_file=item.result_file
+            if (item.result_file) {
+              dimension[item.dimension_key].index[item.index_key].result_file = item.result_file
             }
             noStatusList.push(dimension[item.dimension_key].index[item.index_key]);
           }
         });
-        this.statusListTotal=statusList.length;
-        this.noStatusListTotal=noStatusList.length;
-        this.statusList =  this.conformityData(statusList);
-        this.noStatusList = this.conformityData(noStatusList);
-
-        // noStatusList.push(...statusList)
-        // this.noStatusList = this.conformityData(noStatusList);
+        this.statusListTotal = statusList.length;
+        this.noStatusListTotal = noStatusList.length;
+        this.statusList = statusList;
+        this.noStatusList = noStatusList;
+        
       });
     },
-    conformityData(arr){
-        let returnArr=[];
-        let strs= new Set(arr.map(item=>{
-            return item.wdName
-        }))
-        strs.forEach(item=>{
-            let obj={
-              wdName:item,
-              list:arr.filter(e=>{
-                return e.wdName==item
-              })
-            }
-            returnArr.push(obj)
-        })
-        return returnArr;
+    conformityData(arr) {
+      let returnArr = [];
+      let strs = new Set(arr.map(item => {
+        return item.wdName
+      }))
+      strs.forEach(item => {
+        let obj = {
+          wdName: item,
+          list: arr.filter(e => {
+            return e.wdName == item
+          })
+        }
+        returnArr.push(obj)
+      })
+      return returnArr;
     },
   }
 };
 </script>
 <style scoped lang="scss">
-.wd-title{
-    margin: 20px 0;
-    padding-left: 10px;
-    border-left: 3px solid #409EFF;
+.wd-title {
+  margin: 20px 0;
+  padding-left: 10px;
+  border-left: 3px solid #409EFF;
 }
+
 .box-all {
   position: relative;
   background-color: #fff;
   font-size: 14px;
   padding: 20px;
 }
+
 .main {
-   margin-bottom: 60px;
+  margin-bottom: 60px;
 }
+
 .footer {
   position: fixed;
   bottom: 0;
@@ -521,7 +625,8 @@ export default {
   padding: 12px 30px;
   z-index: 2;
 }
-.active{
+
+.active {
   color: #409EFF;
 }
 </style>

+ 473 - 269
src/performance/views/myPerformance/resultSetAll.vue

@@ -1,202 +1,108 @@
 <template>
-  <div class="box-all boxMinHeight">
+  <div class="box-all">
     <PageHead :phName="packageName"></PageHead>
     <div class="main">
-      <div class="flex-box-end">
-        <el-select v-model="employee_ids" multiple  filterable clearable placeholder="请输入或选择人员" style="width: 250px;margin-right: 10px;">
-          <el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
-        </el-select>
-      </div>
+
       <div class="flex-box-ce" style="padding: 10px 0;border-bottom: 1px solid #f1f1f1;margin-bottom: 20px;">
-        <span :class="{ active: activeName == 'noEntering' }" style="width: 80px;" @click="activeName = 'noEntering'">未录入({{ noStatusListTotal }})</span>
-        <span :class="{ active: activeName == 'entering' }" style="width: 80px;" @click="activeName = 'entering'">已录入({{ statusListTotal }})</span>
+        <span :class="{ active: activeName == 'noEntering' }" style="width: 80px;"
+          @click="activeName = 'noEntering'">未录入({{ noStatusListTotal }})</span>
+        <span :class="{ active: activeName == 'entering' }" style="width: 80px;" @click="activeName = 'entering'">已录入({{
+          statusListTotal }})</span>
       </div>
-      <div v-show="activeName == 'noEntering'">
-        <el-table :data="noStatusList" border :header-cell-style="{ background: '#ECF5FF' }">
-          <el-table-column prop="employee_name" label="姓名"></el-table-column>
-          <el-table-column prop="index_name" label="指标名称"></el-table-column>
-          <el-table-column prop="index_standard" label="考核标准" min-width="200">
-            <template slot-scope="scope">
-              <PreBox :value="scope.row.index_standard"></PreBox>
-            </template>
-          </el-table-column>
-          <el-table-column prop="target" label="目标值">
-            <template slot-scope="scope">
-                <span>{{scope.row.target}}{{scope.row.unit}}</span>
-            </template>
-          </el-table-column>
-          <el-table-column prop="index_weight" label="权重%"></el-table-column>
-          <el-table-column prop="index_remark" label="备注" min-width="200"></el-table-column>
-          <el-table-column label="结果值附件" min-width="200">
-            <template slot-scope="scope">
-              <div style="margin-bottom: 20px;" @click="openActive(scope.row)">
-                <uploadOss
-                  :key="scope.row.id"
-                  :headers="$xtoken"
-                  class="avatar-uploader"
-                  :action="$action"
-                  :show-file-list="true"
-                  :file-list="scope.row.result_file.images"
-                  :on-preview="onFilePreView"
-                  :before-upload="beforeUpload"
-                  :on-remove="onFileRemove"
-                  :data-item="scope.row"
-                  :limit="3"
-                  :on-success="handleSuccessImg"
-                  :accept="$acceptImg"
-                  :multiple="true"
-                >
-                  <el-button class="primaryBtn" icon="el-icon-picture-outline" plain size="mini">图片</el-button>
-                  <!-- (最多选择3张) -->
-                </uploadOss>
-              </div>
-              <div @click="openActive(scope.row)">
-                <uploadOss
-                  :key="scope.row.id"
-                  class="avatar-uploader"
-                  :headers="$xtoken"
-                  :show-file-list="true"
-                  :multiple="true"
-                  :limit="5"
-                  :accept="$acceptFile"
-                  :file-list="scope.row.result_file.append"
-                  :action="$action"
-                  :on-preview="onFilePreView2"
-                  :on-success="handleSuccess"
-                  :on-remove="handleRemove"
-                  :before-upload="beforeFilesUpload"
-                >
-                  <el-button class="primaryBtn" icon="el-icon-paperclip" plain size="mini">附件</el-button>
-                  <!-- (仅支持上传xlsx,xls,doc,docx,pdf,txt,最多一份附件) -->
-                </uploadOss>
-              </div>
-            </template>
-          </el-table-column>
-          <el-table-column label="实际完成结果值" min-width="150">
-            <template slot-scope="scope">
-              <div class="flex-box-ce" v-if="scope.row.index_type==1">
-                <el-input type="textarea" @input="[(scope.row.result_cache = isFloor(scope.row.result_cache))]" style="min-width: 130px;" :rows="1" v-model="scope.row.result_cache" placeholder="请输入"></el-input>
-                <span style="width: 40px;padding-left: 5px;" class="font-flex-word">{{ scope.row.unit }}</span>
-              </div>
-              <div v-else>--</div>
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-      <div v-show="activeName == 'entering'">
-        <el-table :data="statusList" border :header-cell-style="{ background: '#ECF5FF' }">
-          <el-table-column prop="employee_name" label="姓名"></el-table-column>
-          <el-table-column prop="index_name" label="指标名称"></el-table-column>
-          <el-table-column prop="index_standard" label="考核标准" min-width="200">
-            <template slot-scope="scope">
-              <PreBox :value="scope.row.index_standard"></PreBox>
-            </template>
-          </el-table-column>
-          <el-table-column prop="target" label="目标值"></el-table-column>
-          <el-table-column prop="index_weight" label="权重%"></el-table-column>
-          <el-table-column prop="index_remark" label="备注" min-width="200"></el-table-column>
-
-          <el-table-column label="结果值附件" min-width="200">
-              <template slot-scope="scope">
-                <template v-if="scope.row.isUpdate">
-                  <div style="margin-bottom: 20px;" @click="openActive(scope.row)">
-                    <uploadOss
-                      :key="scope.row.id"
-                      :headers="$xtoken"
-                      class="avatar-uploader"
-                      :action="$action"
-                      :show-file-list="true"
-                      :file-list="scope.row.result_file.images"
-                      :on-preview="onFilePreView"
-                      :before-upload="beforeUpload"
-                      :on-remove="onFileRemove"
-                      :data-item ="scope.row"
-                      :limit="3"
-                      :on-success="handleSuccessImg"
-                      :accept="$acceptImg"
-                      :multiple="true"
-                    >
-                      <el-button class="primaryBtn" icon="el-icon-picture-outline" plain size="mini">图片</el-button>
-                      <!-- (最多选择3张) -->
-                    </uploadOss>
-                  </div>
-                  <div @click="openActive(scope.row)">
-                    <uploadOss
-                      :key="scope.row.id"
-                      class="avatar-uploader"
-                      :headers="$xtoken"
-                      :show-file-list="true"
-                      :multiple="true"
-                      :limit="5"
-                      :accept="$acceptFile"
-                      :file-list="scope.row.result_file.append"
-                      :action="$action"
-                      :on-preview="onFilePreView2"
-                      :on-success="handleSuccess"
-                      :on-remove="handleRemove"
-                      :before-upload="beforeFilesUpload"
-                    >
-                      <el-button class="primaryBtn" icon="el-icon-paperclip" plain size="mini">附件</el-button>
-                      <!-- (仅支持上传xlsx,xls,doc,docx,pdf,txt,最多一份附件) -->
-                    </uploadOss>
-                  </div>
-                </template>
-                <template v-else>
-                  <div class="orange" style="margin-bottom: 5px;font-size: 12px;">该考核指标已评分,不可调整结果值</div>
-                  <div v-if="scope.row.result_file.images.length > 0">
-                    <div>图片</div>
-                    <div style="margin-bottom: 3px;cursor: pointer;" class="blue" v-for="(item, index) in scope.row.result_file.images" :key="index" @click="onFilePreView(item)">
-                      {{ item.name }}
-                    </div>
-                  </div>
-                  <div v-if="scope.row.result_file.append.length > 0">
-                    <div>文件</div>
-                    <div style="margin-bottom: 3px;cursor: pointer;" class="green" v-for="(item, index) in scope.row.result_file.append" :key="index" @click="onFilePreView2(item)">
-                      {{ item.name }}
-                    </div>
-                  </div>
-                </template>
-              </template>
-          </el-table-column>
-          <el-table-column label="实际完成结果值" min-width="150">
-              <template slot-scope="scope">
-                <template v-if="scope.row.isUpdate">
-                  <div class="flex-box-ce" v-if="scope.row.index_type==1">
-                    <el-input type="textarea" @input="[(scope.row.result_cache = isFloor(scope.row.result_cache))]" style="min-width: 130px;" :rows="1" v-model="scope.row.result_cache" placeholder="请输入"></el-input>
-                    <span style="width: 40px;padding-left: 5px;" class="font-flex-word">{{scope.row.unit}}</span>
-                  </div>
-                  <div v-else>--</div>
-                </template>
-                <template v-else>
-                  <div class="orange" style="margin-bottom: 5px;font-size: 12px;">该考核指标已评分,不可调整结果值</div>
-                  <span v-if="scope.row.index_type==1">
-                    <span class="font-flex-word">{{ scope.row.result_cache }}</span>
-                    <span style="width: 40px;padding-left: 5px;" class="font-flex-word">{{ scope.row.unit }}</span>
-                  </span>
-                  <div v-else>--</div>
-                </template>
-              </template>
-          </el-table-column>
-        </el-table>
+
+      <div>
+        <el-select v-model="employee_ids" multiple filterable clearable placeholder="请输入或选择人员"
+          style="width: 250px;margin-right: 10px;">
+          <el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
+        </el-select>
+        <el-button type="default" style="margin: 0 15px 15px 0;" @click="clearFilter">清除所有过滤器</el-button>
+
       </div>
+      <el-alert type="warning" title="可以根据指标名称,标准值,权重,目标值进行分类,便于对多人且同个指标的结果值录入" style="margin: 0 0 15px 0;"
+        :closable="false"></el-alert>
+
+      <el-table :data="tempData" ref="filterTable" border :header-cell-style="{ background: '#ECF5FF' }"
+        :header-cell-class-name="handleHeaderClass" @header-click="handleHeaderClick" @sort-change="handleTableSort"
+        @selection-change="handleSelectionChange">
+        <el-table-column type="selection" min-width="55" align="center">
+        </el-table-column>
+        <el-table-column prop="employee_name" label="姓名" align="center" min-width="120">
+        </el-table-column>
+        <el-table-column prop="index_name" label="指标名称" min-width="200" sortable="custom" :filters="index_name_list"
+          :filter-method="filterMethods" align="center"></el-table-column>
+        <el-table-column prop="index_standard" label="考核标准" min-width="200" sortable="custom" align="center"
+          :filters="index_standard_list" :filter-method="filterMethods">
+        </el-table-column>
+        <el-table-column prop="target" label="目标值" sortable="custom" align="center" :filters="target_list"
+          :filter-method="filterMethods">
+          <template slot-scope="scope">
+            <span>{{ scope.row.target }}{{ scope.row.unit }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="index_weight" label="权重%" sortable="custom" align="center" :filters="index_weight_list"
+          :filter-method="filterMethods"></el-table-column>
+        <el-table-column prop="index_remark" label="备注" min-width="200" align="center"></el-table-column>
+        <el-table-column label="结果值附件" min-width="200" :render-header="(h, obj) => renderHeader(h, obj, 'upload')">
+          <template slot-scope="scope">
+            <div style="margin-bottom: 20px;" @click="openActive(scope.row)">
+              <uploadOss :key="scope.row.id" :headers="$xtoken" class="avatar-uploader" :action="$action"
+                :show-file-list="true" :file-list="scope.row.result_file.images" :on-preview="onFilePreView"
+                :before-upload="beforeUpload" :on-remove="onFileRemove" :data-item="scope.row" :limit="3"
+                :on-success="handleSuccessImg" :accept="$acceptImg" :multiple="true">
+                <el-button class="primaryBtn" icon="el-icon-picture-outline" plain size="mini">图片</el-button>
+                <!-- (最多选择3张) -->
+              </uploadOss>
+            </div>
+            <div @click="openActive(scope.row)">
+              <uploadOss :key="scope.row.id" class="avatar-uploader" :headers="$xtoken" :show-file-list="true"
+                :multiple="true" :limit="5" :accept="$acceptFile" :file-list="scope.row.result_file.append"
+                :action="$action" :on-preview="onFilePreView2" :on-success="handleSuccess" :on-remove="handleRemove"
+                :before-upload="beforeFilesUpload">
+                <el-button class="primaryBtn" icon="el-icon-paperclip" plain size="mini">附件</el-button>
+                <!-- (仅支持上传xlsx,xls,doc,docx,pdf,txt,最多一份附件) -->
+              </uploadOss>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column label="实际完成结果值" min-width="150" :render-header="(h, obj) => renderHeader(h, obj, 'result_cache')">
+          <template slot-scope="scope">
+            <div class="flex-box-ce" v-if="scope.row.index_type == 1">
+              <el-input type="textarea" @input="[(scope.row.result_cache = isFloor(scope.row.result_cache))]"
+                style="min-width: 130px;" :rows="1" v-model="scope.row.result_cache" placeholder="请输入"></el-input>
+              <span style="width: 40px;padding-left: 5px;" class="font-flex-word">{{ scope.row.unit }}</span>
+            </div>
+            <div v-else>--</div>
+          </template>
+        </el-table-column>
+      </el-table>
     </div>
 
-    <footer class="footer flex-box-end" v-if="activeName == 'noEntering'">
+    <footer class="footer flex-box-end"
+      v-if="activeName == 'noEntering' && multipleSelection && multipleSelection.length > 0">
       <el-button class="primaryBtn" @click="save(1)">暂存</el-button>
       <el-button type="primary" @click="save(0)">提交结果值</el-button>
     </footer>
-    <footer class="footer flex-box-end" v-if="activeName == 'entering'&&returnIsShow">
-      <el-button  type="primary" @click="save(3)">提交结果值</el-button>
+    <footer class="footer flex-box-end"
+      v-if="activeName == 'entering' && returnIsShow && multipleSelection && multipleSelection.length > 0">
+      <el-button type="primary" @click="save(3)">提交结果值</el-button>
     </footer>
 
+
+    <BatchUpload :isUploadShow="isUploadShow" :isUploadImg="isUploadImg" :isUploadFile="isUploadFile"
+      :isResultCache="isResultCache" @close="closeBatchUpload" @confirm="getImgs"></BatchUpload>
+
+    <!-- 图片查看 -->
     <el-dialog title="图片查看" :visible.sync="isShowImg" width="50%">
       <img :src="imgUrl" style="width: 100%;" />
       <span slot="footer" class="dialog-footer">
-        <el-button @click="isShowImg = false">取 消</el-button>
-        <el-button type="primary" @click="isShowImg = false">确 定</el-button>
+        <el-button @click="closePreview">关闭</el-button>
       </span>
     </el-dialog>
-    <el-dialog title="提交结果" :visible.sync="isResult" width="800" :close-on-click-modal="false" :close-on-press-escape="false" :show-close="false">
+    <!-- 图片查看 -->
+
+    <!-- 提交结果 -->
+    <el-dialog title="提交结果" :visible.sync="isResult" width="800" :close-on-click-modal="false"
+      :close-on-press-escape="false" :show-close="false">
       <div>
         <el-progress :text-inside="true" :stroke-width="24" :percentage="percentage"></el-progress>
         <div style="margin-top: 20px;border: 1px solid #f1f1f1;max-height: 500px;overflow-y: auto;" class="scroll-bar">
@@ -210,37 +116,43 @@
             <div style="border-right: 1px solid #f1f1f1;width: 50px;">{{ results.length - index }}</div>
             <div class="flex-1" style="border-right: 1px solid #f1f1f1;">{{ item.info.employee_name }}</div>
             <div class="flex-2" style="border-right: 1px solid #f1f1f1;">{{ item.info.index_name }}</div>
-            <div class="flex-2 red" v-if="item.msg">{{item.msg}}</div>
+            <div class="flex-2 red" v-if="item.msg">{{ item.msg }}</div>
             <div class="flex-2 green" v-else>提交成功</div>
           </div>
         </div>
         <span slot="footer">
-          <div class="flex-box-end" style="margin-top: 20px;" >
+          <div class="flex-box-end" style="margin-top: 20px;">
             <el-button type="primary" @click="isResult = false" size="small">确 定</el-button>
           </div>
         </span>
       </div>
     </el-dialog>
+    <!-- 提交结果 -->
+
   </div>
 </template>
 <script>
 import PageHead from '@/components/PageHead'; //头部---返回
 import uploadOss from '@/components/upload';
 import { _debounce } from '@/utils/auth';
+import BatchUpload from "./resultSetComp/BatchUpload.vue"
+
 export default {
-  components: { PageHead, uploadOss },
+  components: { PageHead, uploadOss, BatchUpload },
   name: 'resultSet',
   data() {
     return {
-      title: '2024年的绩效考核',
+      tableData: [],
+      pe_ids: [],
+      pe_flows: [],
       activeName: 'noEntering',
+      noStatusListAll: [],
       noStatusList: [],
+      noStatusListDx: [],
       noStatusListTotal: 0,
       statusList: [],
       statusListTotal: 0,
       id: '', //员工考核记录id
-      packageName: '', //考核包名称 结果值录入用到
-
       // 上传图标与附件
       img_fileList: [], // 图片附件
       file_fileList: [], //文件附件
@@ -249,19 +161,46 @@ export default {
       isShowImg: false,
       imgUrl: '',
       selectItem: {},
-
       // 长连接结果
       results: [], //提交的返回结果集合
       isResult: false,
       percentage: 0,
       resultList: [], //要发送数据的集合
       resultIndex: 0,
-
-      employee_ids:[],
+      employee_ids: [],
       employee_map: this.$getEmployeeMap(),
+      tempData: [], // 表格数据
+      sortList: [], // 用于表格数据排序
+      index_name_list: [], // 指标名称过滤数据
+      index_standard_list: [], // 指标标准过滤数据
+      target_list: [], // 目标过滤数据
+      index_weight_list: [], // 权重过滤
+      multipleSelection: [], // 选择的数据
+      isUploadShow: false,
+      upLoadImages: [],
+      isUploadImg: false,
+      isUploadFile: false,
+      isResultCache: false,
     };
   },
+  computed: {
+    returnIsShow() {
+      let is = false
+      this.tempData.forEach(item => {
+        if (item.isUpdate) {
+          is = true;
+        }
+      })
+      return is
+    },
+  },
   watch: {
+    activeName(val) {
+      this.multipleSelection = [];
+      this.clearFilter();
+      this.initTableData();
+    },
+
     isResult(val) {
       if (!val) {
         this.results = []; //提交的返回结果集合
@@ -272,32 +211,277 @@ export default {
         this.getPackageDtail();
       }
     },
-    employee_ids(){
+    employee_ids() {
       this.getPackageDtail();
-    }
+    },
+    peIds() {
+      this.getPackageDtail();
+    },
   },
   created() {
     if (this.$route.query.pe_ids) {
       this.pe_ids = this.$route.query.pe_ids;
       this.packageName = this.$route.query.name;
-      if(this.$route.query.is){
-        this.activeName='entering';
+      if (this.$route.query.is) {
+        this.activeName = 'entering';
       }
       this.getPackageDtail();
     }
   },
-  computed:{
-    returnIsShow(){
-      let is=false
-      this.statusList.forEach(item=>{
-        if(item.isUpdate){
-          is=true;
+
+  methods: {
+    closeBatchUpload() {
+      this.isUploadShow = false;
+    },
+    getImgs(data) {
+      let { imgs, files, result_cache } = data
+      this.multipleSelection && this.multipleSelection.forEach(item => {
+        if (imgs && imgs.length > 0) item.result_file.images = imgs.filter(img => { return img.url })
+        if (files && files.length > 0) item.result_file.append = files.filter(file => { return file.url })
+        if (item.index_type == 1) {
+          if (result_cache) item.result_cache = result_cache;
         }
       })
-      return is
+      this.isUploadShow = false;
     },
-  },
-  methods: {
+
+
+    // 初始化表格数据
+    initTableData() {
+      let statusList = []; //已录入指标
+      let noStatusList = []; //未录入指标
+      this.tableData && this.tableData.forEach(item => {
+        // 已录入指标
+        if (item.index_result_status == 1) {
+          noStatusList.push(item);
+        }
+        // 未录入指标
+        if (item.index_result_status == 2) {
+          item.isUpdate = true;
+          this.pe_flows.forEach(e => {
+            if (e.pe_id == item.pe_id) {
+              item.isUpdate = this.returnIs(e.flow);
+            }
+          })
+          statusList.push(item);
+        }
+      });
+      this.noStatusList = noStatusList;
+      this.statusList = statusList;
+      this.statusListTotal = statusList.length;
+      this.noStatusListTotal = noStatusList.length;
+      if (this.activeName == 'noEntering') {
+        this.tempData = noStatusList; // 默认展示未录入的数据
+      } else {
+        this.tempData = statusList; // 默认展示未录入的数据
+      }
+
+
+      // 初始化指标名称过滤数组 
+      this.index_name_list = this.tempData.map(item => {
+        return {
+          text: item.index_name,
+          value: item.index_name,
+        }
+      })
+      // 初始化指标标准过滤数组 
+      this.index_standard_list = this.tempData.map(item => {
+        return {
+          text: item.index_standard,
+          value: item.index_standard,
+        }
+      })
+      // 初始化目标过滤数组 
+      this.target_list = this.tempData.map(item => {
+        return {
+          text: item.target,
+          value: item.target,
+        }
+      })
+      // 初始化权重过滤数组 
+      this.index_weight_list = this.tempData.map(item => {
+        return {
+          text: item.index_weight,
+          value: item.index_weight,
+        }
+      })
+
+      // 数组去重
+      this.index_name_list = Array.from(new Set(this.index_name_list.map(JSON.stringify))).map(JSON.parse);
+
+      // 数组去重
+      this.index_standard_list = Array.from(new Set(this.index_standard_list.map(JSON.stringify))).map(JSON.parse);
+
+      // 数组去重
+      this.target_list = Array.from(new Set(this.target_list.map(JSON.stringify))).map(JSON.parse);
+      // 数组去重
+      this.index_weight_list = Array.from(new Set(this.index_weight_list.map(JSON.stringify))).map(JSON.parse);
+    },
+
+    handleSelectionChange(val) {
+      this.multipleSelection = val;
+    },
+    filterMethods(value, row, column) {
+      this.multipleSelection = [];
+      this.$refs.filterTable.clearSelection();
+      const property = column["property"];
+      return row[property] === value
+    },
+
+    // -----------------------------------------自定义函数-----------------------------------------------
+    updateSortOrder(column) {
+      // column.order 默认只能有一个不为 null,也就是说其它列的 order 改变时,原有的 order 会被置为 null
+      // 所以用另一个字段 multiOrder 保存 order 状态
+      column.multiOrder = column.order
+      // 更新 sortList
+      const index = this.sortList.findIndex(item => item.prop === column.property)
+      if (index !== -1) {
+        this.sortList.splice(index, 1)
+      }
+      if (column.order !== null) {
+        this.sortList.push({ prop: column.property, order: column.order })
+      }
+      // sort
+      this.sortTableData()
+    },
+    // 根据某一项比较
+    compareData(prop, a, b, order) {
+      const orderFactor = order === 'ascending' ? 1 : -1
+      if (a[prop] < b[prop]) {
+        return -1 * orderFactor
+      }
+      if (a[prop] > b[prop]) {
+        return 1 * orderFactor
+      }
+      return 0
+    },
+    // 根据 sortList 对 data 进行排序
+    sortTableData() {
+      this.tempData = Object.assign([], this.tempData)
+      this.tempData.sort((a, b) => {
+        for (const item of this.sortList) {
+          const tempResult = this.compareData(item.prop, a, b, item.order)
+          if (tempResult) {
+            return tempResult
+          }
+        }
+        return 0
+      })
+    },
+    // -----------------------------------------el-table 事件-----------------------------------------------
+    // 点击表头
+    // bug: 监听不到点击箭头
+    handleHeaderClick(column) {
+      // this.updateSortOrder(column)
+    },
+    // 点击箭头
+    handleTableSort({ column }) {
+      this.updateSortOrder(column)
+    },
+    // 把 multiOrder 同步给 order
+    handleHeaderClass({ column }) {
+      column.order = column.multiOrder
+    },
+    clearFilter() {
+      this.employee_ids = [];
+      this.$refs.filterTable.clearFilter();
+      this.filterData = [];
+      this.multipleSelection = [];
+    },
+    // 自定义表头
+    renderHeader(h, { column, $index }, type) {
+      let that = this;
+      if (that.multipleSelection && that.multipleSelection.length > 0) {
+        if (type == 'upload') return h(
+          'div', {
+          style: { display: "flex", alignItems: "center", justifyContent: "center" }
+        }, [
+
+          h('el-button', {
+            props: {
+              icon: 'el-icon-edit'
+            },
+            style: 'margin-left: 5px;',
+            on: {
+              click: function () {
+                that.clickButton('img');
+              }
+            }
+          }, '图片'),
+          // 按钮
+          h('el-button', {
+            props: {
+              icon: 'el-icon-edit'
+            },
+            style: 'margin-left: 5px;',
+            on: {
+              click: function () {
+                that.clickButton('file');
+              }
+            }
+          }, '附件')
+        ],
+        )
+        else return h(
+          'div', {
+          style: { display: "flex", alignItems: "center", justifyContent: "center" }
+        }, [
+
+          h('el-button', {
+            props: {
+              icon: 'el-icon-edit'
+            },
+            style: 'margin-left: 5px;',
+            on: {
+              click: function () {
+                that.clickButton('result_cache');
+              }
+            }
+          }, '实际完成结果值')
+        ],
+        )
+      } else {
+        return h(
+          'div', {
+          style: { display: "flex", alignItems: "center", justifyContent: "center" }
+        }, [
+          // 列名称
+          h('span', column.label),
+        ],
+        )
+      }
+
+    },
+
+    // 按钮点击事件
+    clickButton(type) {
+      if (type == 'img') {
+        this.isUploadImg = true;
+        this.isUploadFile = false;
+        this.isResultCache = false;
+      }
+      if (type == 'file') {
+        this.isUploadImg = false;
+        this.isUploadFile = true;
+        this.isResultCache = false;
+      }
+      if (type == 'result_cache') {
+        this.isUploadImg = false;
+        this.isUploadFile = false;
+        this.isResultCache = true;
+      }
+      this.openBatchUpload();
+    },
+
+    openBatchUpload() {
+      this.isUploadShow = true;
+    },
+
+    closePreview() {
+      this.imgUrl = "";
+      this.isShowImg = false;
+    },
+
     isFloor(el) {
       var obj = event.target;
       var t = el.charAt(0);
@@ -316,7 +500,7 @@ export default {
     openActive(item) {
       this.selectItem = item;
     },
-    handleSuccessImg: _debounce(function(response, file, fileList) {
+    handleSuccessImg: _debounce(function (response, file, fileList) {
       let result_file = JSON.parse(JSON.stringify(this.selectItem)).result_file;
       result_file.images = fileList.filter(item => {
         return item.url;
@@ -347,7 +531,7 @@ export default {
         this.selectItem.result_file.images = fileList;
       }, 500);
     },
-    handleSuccess: _debounce(function(response, file, fileList) {
+    handleSuccess: _debounce(function (response, file, fileList) {
       let result_file = JSON.parse(JSON.stringify(this.selectItem)).result_file;
       result_file.append = fileList.filter(item => {
         return item.url;
@@ -381,67 +565,66 @@ export default {
       let isLr = false;
       let parameterArr = [];
       let err = '';
-      let isPost=true;
-      let str='';
-      let arr=num==3? this.statusList:this.noStatusList
+      let isPost = true;
+      let str = '';
+      let arr = this.multipleSelection;
+
       arr.forEach(item => {
         let result_info = [];
         result_info.push({
-          // result: item.result_cache, //单项目结果值
           dimension_key: item.dimension_id, //维度索引
           index_key: item.index_key, //指标索引
           index_id: item.index_id, //指标ID
           result_file: item.result_file
         });
 
-        if(item.index_type == 1){
-          result_info[0].result=item.result_cache
+        if (item.index_type == 1) {
+          result_info[0].result = item.result_cache
         }
         let data = {
           id: item.pe_id, //个人考核包ID
-          cache: num==1? 1:0, //是否暂存 1 是 0 否(提交)
+          cache: num == 1 ? 1 : 0, //是否暂存 1 是 0 否(提交)
           info: item,
           result_info: JSON.stringify(result_info),
-          sub: num==3? 0:1
+          sub: num == 3 ? 0 : 1
         };
-        if(num==3){  //编辑
-          if(item.isUpdate){
+        if (num == 3) {  //编辑
+          if (item.isUpdate) {
             if (item.index_type == 1) {
-              if(!item.result_cache){
-                isPost=false;
-                str=item.index_name+': 请输入结果值'
+              if (!item.result_cache) {
+                isPost = false;
+                str = item.index_name + ': 请输入结果值'
                 return true
               }
-              parameterArr.push(data);
-            }else{
+            } else {
               if (item.result_file.append.length == 0 && item.result_file.images.length == 0) {
-                isPost=false;
-                str=item.index_name+': 至少添加一份附件'
+                isPost = false;
+                str = item.index_name + ': 至少添加一份附件'
                 return true
               }
-              parameterArr.push(data);
             }
           }
-        }else{
-          if (item.index_type == 1 && item.result_cache!==null && item.result_cache!=='') {
-            parameterArr.push(data);
+        } else{
+          if (item.index_type == 1) {
+            if (item.result_cache !== null && item.result_cache !== '') parameterArr.push(data);
           }
-          if (item.index_type != 1 && (item.result_file.append.length > 0 || item.result_file.images.length > 0)) {
-            parameterArr.push(data);
+          if (item.index_type != 1) {
+            if (item.result_file.append.length > 0 || item.result_file.images.length > 0) parameterArr.push(data);
           }
         }
       });
-      if(num==3){
-        if(!isPost){
+      if (num == 3) {
+        if (!isPost) {
           this.$message({ type: 'error', message: str, duration: 3000, center: true });
           return false;
         }
-      }else{
+      } else {
         if (parameterArr.length == 0) {
           this.$message({ type: 'error', message: '至少输入一项结果值或非量化指标添加一份附件', duration: 3000, center: true });
           return false;
         }
       }
+      // return
       this.webSocket(parameterArr);
     },
 
@@ -457,18 +640,18 @@ export default {
       let wsData = this.resultList;
       if (wsData[this.resultIndex]) {
         this.$axiosUser('post', '/api/pro/per/package/record_result', wsData[this.resultIndex]).then(res => {
-          this.onmessageWS(wsData[this.resultIndex],true);
-        }).catch(e=>{
-          let data=wsData[this.resultIndex];
-          data.msg=e.data.msg;
-          this.onmessageWS(data,false);
+          this.onmessageWS(wsData[this.resultIndex], true);
+        }).catch(e => {
+          let data = wsData[this.resultIndex];
+          data.msg = e.data.msg;
+          this.onmessageWS(data, false);
         });
       }
     },
-    onmessageWS(data,isJx) {
+    onmessageWS(data, isJx) {
       this.results.unshift(data);
       this.resultIndex++;
-      if(!isJx){
+      if (!isJx) {
         return false
       }
       this.opneWebSocket();
@@ -478,49 +661,37 @@ export default {
       if (lng == this.results.length) {
         this.percentage = 100;
       }
+      this.multipleSelection = [];
+      this.clearFilter();
     },
 
     getPackageDtail() {
-      this.$axiosUser('get', '/api/pro/per/package/result_job_list', { pe_ids: this.pe_ids, page: 1, page_size: 2000,employee_ids:JSON.stringify(this.employee_ids) }).then(res => {
-        let list = res.data.data.list;
-        let pe_flows=res.data.data.pe_flows;
-        let statusList = []; //已录入指标
-        let noStatusList = []; //未录入指标
-        list.forEach(item => {
-          if (item.index_result_status == 1) {
-            noStatusList.push(item);
-          }
-          if (item.index_result_status == 2) {
-            item.isUpdate=true;
-            pe_flows.forEach(e=>{
-              if(e.pe_id==item.pe_id){
-                item.isUpdate=this.returnIs(e.flow);
-              }
-            })
-            statusList.push(item);
-          }
+      this.$axiosUser('get', '/api/pro/per/package/result_job_list',
+        {
+          pe_ids: this.pe_ids,
+          page: 1,
+          page_size: 2000,
+          employee_ids: JSON.stringify(this.employee_ids)
+        }).then(res => {
+          this.tableData = res.data.data.list;
+          this.pe_flows = res.data.data.pe_flows;
+          this.initTableData();
         });
-        this.statusListTotal = statusList.length;
-        this.noStatusListTotal = noStatusList.length;
-        this.statusList = statusList;
-        this.noStatusList = noStatusList;
-      });
     },
     //判断评分节点是否有人评了分
-    returnIs(list){
-      let is=true;
-      list.forEach(item=>{
-        if(item.code=='score_supervisor'||item.code=='special_scorer'){
-          item.target.forEach(e=>{
-            if(e.status==2){
-              is=false;
+    returnIs(list) {
+      let is = true;
+      list.forEach(item => {
+        if (item.code == 'score_supervisor' || item.code == 'special_scorer') {
+          item.target.forEach(e => {
+            if (e.status == 2) {
+              is = false;
             }
           })
         }
       })
       return is
     },
-
     conformityData(arr) {
       let returnArr = [];
       let strs = new Set(
@@ -548,15 +719,19 @@ export default {
   padding-left: 10px;
   border-left: 3px solid #409EFF;
 }
+
 .box-all {
   position: relative;
   background-color: #fff;
   font-size: 14px;
   padding: 20px;
+  box-sizing: border-box
 }
+
 .main {
   margin-bottom: 60px;
 }
+
 .footer {
   position: fixed;
   bottom: 0;
@@ -567,14 +742,43 @@ export default {
   padding: 12px 30px;
   z-index: 2;
 }
+
 .active {
   color: #409EFF;
 }
+
 .results {
   border-bottom: 1px solid #f1f1f1;
   text-align: center;
 }
+
 .results div {
   padding: 10px;
+  box-sizing: border-box;
+}
+
+/* 设置滚动条的宽度和背景色 */
+::v-deep .el-table__body-wrapper::-webkit-scrollbar {
+  width: 10px;
+  height: 10px;
+  background-color: #f9f9f9;
+}
+
+/* 设置滚动条滑块的样式 */
+::v-deep .el-table__body-wrapper::-webkit-scrollbar-thumb {
+  border-radius: 6px;
+  background-color: #c1c1c1;
+}
+
+/* 设置滚动条滑块hover样式 */
+::v-deep .el-table__body-wrapper::-webkit-scrollbar-thumb:hover {
+  background-color: #a8a8a8;
+}
+
+/* 设置滚动条轨道的样式 */
+::v-deep .el-table__body-wrapper::-webkit-scrollbar-track {
+  box-shadow: inset 0 0 5px rgba(87, 175, 187, 0.1);
+  border-radius: 6px;
+  background: #ededed;
 }
 </style>

+ 436 - 269
src/performance/views/myPerformance/resultSetAll2.vue

@@ -2,209 +2,107 @@
   <div class="">
     <PageHead :phName="packageName"></PageHead>
     <div class="main">
-      <div class="flex-box-end">
-        <el-select v-model="employee_ids" multiple  filterable clearable placeholder="请输入或选择人员" style="width: 250px;margin-right: 10px;">
-          <el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
-        </el-select>
-      </div>
+
       <div class="flex-box-ce" style="padding: 10px 0;border-bottom: 1px solid #f1f1f1;margin-bottom: 20px;">
-        <span :class="{ active: activeName == 'noEntering' }" style="width: 80px;" @click="activeName = 'noEntering'">未录入({{ noStatusListTotal }})</span>
-        <span :class="{ active: activeName == 'entering' }" style="width: 80px;" @click="activeName = 'entering'">已录入({{ statusListTotal }})</span>
+        <span :class="{ active: activeName == 'noEntering' }" style="width: 80px;"
+          @click="activeName = 'noEntering'">未录入({{ noStatusListTotal }})</span>
+        <span :class="{ active: activeName == 'entering' }" style="width: 80px;" @click="activeName = 'entering'">已录入({{
+          statusListTotal }})</span>
       </div>
-      <div v-show="activeName == 'noEntering'">
-        <div style="margin-bottom: 20px;" class="flex-box-ce">
-          <el-checkbox v-model="paiXu" label="1">按指标名称排序 </el-checkbox>
-          <el-tooltip effect="dark" placement="top">
-            <template slot="content">
-              <div>指标名称排在一起,便于对多人且同个指标的结果值录入(注意:中途修改排序需重新填写结果值)</div>
-            </template>
-             <i class="el-icon-question fontColorC cursor"></i>
-          </el-tooltip>
-        </div>
-        <el-table :data="noStatusList" border :header-cell-style="{ background: '#ECF5FF' }">
-          <el-table-column prop="employee_name" label="姓名"></el-table-column>
-          <el-table-column prop="index_name" label="指标名称"></el-table-column>
-          <el-table-column prop="index_standard" label="考核标准" min-width="200">
-            <template slot-scope="scope">
-              <PreBox :value="scope.row.index_standard"></PreBox>
-            </template>
-          </el-table-column>
-          <el-table-column prop="target" label="目标值">
-            <template slot-scope="scope">
-                <span>{{scope.row.target}}{{scope.row.unit}}</span>
-            </template>
-          </el-table-column>
-          <el-table-column prop="index_weight" label="权重%"></el-table-column>
-          <el-table-column prop="index_remark" label="备注" min-width="200"></el-table-column>
-          <el-table-column label="结果值附件" min-width="200">
-            <template slot-scope="scope">
-              <div style="margin-bottom: 20px;" @click="openActive(scope.row)">
-                <uploadOss
-                  :key="scope.row.id"
-                  :headers="$xtoken"
-                  class="avatar-uploader"
-                  :action="$action"
-                  :show-file-list="true"
-                  :file-list="scope.row.result_file.images"
-                  :on-preview="onFilePreView"
-                  :before-upload="beforeUpload"
-                  :on-remove="onFileRemove"
-                  :data-item="scope.row"
-                  :limit="3"
-                  :on-success="handleSuccessImg"
-                  :accept="$acceptImg"
-                  :multiple="true"
-                >
-                  <el-button class="primaryBtn" icon="el-icon-picture-outline" plain size="mini">图片</el-button>
-                  <!-- (最多选择3张) -->
-                </uploadOss>
-              </div>
-              <div @click="openActive(scope.row)">
-                <uploadOss
-                  :key="scope.row.id"
-                  class="avatar-uploader"
-                  :headers="$xtoken"
-                  :show-file-list="true"
-                  :multiple="true"
-                  :limit="5"
-                  :accept="$acceptFile"
-                  :file-list="scope.row.result_file.append"
-                  :action="$action"
-                  :on-preview="onFilePreView2"
-                  :on-success="handleSuccess"
-                  :on-remove="handleRemove"
-                  :before-upload="beforeFilesUpload"
-                >
-                  <el-button class="primaryBtn" icon="el-icon-paperclip" plain size="mini">附件</el-button>
-                  <!-- (仅支持上传xlsx,xls,doc,docx,pdf,txt,最多一份附件) -->
-                </uploadOss>
-              </div>
-            </template>
-          </el-table-column>
-          <el-table-column label="实际完成结果值" min-width="150">
-            <template slot-scope="scope">
-              <div class="flex-box-ce" v-if="scope.row.index_type==1">
-                <el-input type="textarea" @input="[(scope.row.result_cache = isFloor(scope.row.result_cache))]" style="min-width: 130px;" :rows="1" v-model="scope.row.result_cache" placeholder="请输入"></el-input>
-                <span style="width: 40px;padding-left: 5px;" class="font-flex-word">{{ scope.row.unit }}</span>
-              </div>
-              <div v-else>--</div>
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-      <div v-show="activeName == 'entering'">
-        <el-table :data="statusList" border :header-cell-style="{ background: '#ECF5FF' }">
-          <el-table-column prop="employee_name" label="姓名"></el-table-column>
-          <el-table-column prop="index_name" label="指标名称"></el-table-column>
-          <el-table-column prop="index_standard" label="考核标准" min-width="200">
-            <template slot-scope="scope">
-              <PreBox :value="scope.row.index_standard"></PreBox>
-            </template>
-          </el-table-column>
-          <el-table-column prop="target" label="目标值"></el-table-column>
-          <el-table-column prop="index_weight" label="权重%"></el-table-column>
-          <el-table-column prop="index_remark" label="备注" min-width="200"></el-table-column>
-          <el-table-column label="结果值附件" min-width="200">
-              <template slot-scope="scope">
-                <template v-if="scope.row.isUpdate">
-                  <div style="margin-bottom: 20px;" @click="openActive(scope.row)">
-                    <uploadOss
-                      :key="scope.row.id"
-                      :headers="$xtoken"
-                      class="avatar-uploader"
-                      :action="$action"
-                      :show-file-list="true"
-                      :file-list="scope.row.result_file.images"
-                      :on-preview="onFilePreView"
-                      :before-upload="beforeUpload"
-                      :on-remove="onFileRemove"
-                      :data-item ="scope.row"
-                      :limit="3"
-                      :on-success="handleSuccessImg"
-                      :accept="$acceptImg"
-                      :multiple="true"
-                    >
-                      <el-button class="primaryBtn" icon="el-icon-picture-outline" plain size="mini">图片</el-button>
-                      <!-- (最多选择3张) -->
-                    </uploadOss>
-                  </div>
-                  <div @click="openActive(scope.row)">
-                    <uploadOss
-                      :key="scope.row.id"
-                      class="avatar-uploader"
-                      :headers="$xtoken"
-                      :show-file-list="true"
-                      :multiple="true"
-                      :limit="5"
-                      :accept="$acceptFile"
-                      :file-list="scope.row.result_file.append"
-                      :action="$action"
-                      :on-preview="onFilePreView2"
-                      :on-success="handleSuccess"
-                      :on-remove="handleRemove"
-                      :before-upload="beforeFilesUpload"
-                    >
-                    <el-button class="primaryBtn" icon="el-icon-paperclip" plain size="mini">附件</el-button>
-                    <!-- (仅支持上传xlsx,xls,doc,docx,pdf,txt,最多一份附件) -->
-                    </uploadOss>
-                  </div>
-                </template>
-                <template v-else>
-                  <div class="orange" style="margin-bottom: 5px;font-size: 12px;">该考核指标已评分,不可调整结果值</div>
-                  <div v-if="scope.row.result_file.images.length > 0">
-                    <div>图片</div>
-                    <div style="margin-bottom: 3px;cursor: pointer;" class="blue" v-for="(item, index) in scope.row.result_file.images" :key="index" @click="onFilePreView(item)">
-                      {{ item.name }}
-                    </div>
-                  </div>
-                  <div v-if="scope.row.result_file.append.length > 0">
-                    <div>文件</div>
-                    <div style="margin-bottom: 3px;cursor: pointer;" class="green" v-for="(item, index) in scope.row.result_file.append" :key="index" @click="onFilePreView2(item)">
-                      {{ item.name }}
-                    </div>
-                  </div>
-                </template>
-              </template>
-          </el-table-column>
-          <el-table-column label="实际完成结果值" min-width="150">
-              <template slot-scope="scope">
-                <template v-if="scope.row.isUpdate">
-                  <div class="flex-box-ce" v-if="scope.row.index_type==1">
-                    <el-input type="textarea" @input="[(scope.row.result_cache = isFloor(scope.row.result_cache))]" style="min-width: 130px;" :rows="1" v-model="scope.row.result_cache" placeholder="请输入"></el-input>
-                    <span style="width: 40px;padding-left: 5px;" class="font-flex-word">{{scope.row.unit}}</span>
-                  </div>
-                  <div v-else>--</div>
-                </template>
-                <template v-else>
-                  <div class="orange" style="margin-bottom: 5px;font-size: 12px;">该考核指标已评分,不可调整结果值</div>
-                  <span v-if="scope.row.index_type==1">
-                    <span class="font-flex-word">{{ scope.row.result_cache }}</span>
-                    <span style="width: 40px;padding-left: 5px;" class="font-flex-word">{{ scope.row.unit }}</span>
-                  </span>
-                  <div v-else>--</div>
-                </template>
-              </template>
-          </el-table-column>
-        </el-table>
+
+      <div>
+        <el-select v-model="employee_ids" multiple filterable clearable placeholder="请输入或选择人员"
+          style="width: 250px;margin-right: 10px;">
+          <el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
+        </el-select>
+        <el-button type="default" style="margin: 0 15px 15px 0;" @click="clearFilter">清除所有过滤器</el-button>
+
       </div>
+      <el-alert type="warning" title="可以根据指标名称,标准值,权重,目标值进行分类,便于对多人且同个指标的结果值录入" style="margin: 0 0 15px 0;"
+        :closable="false"></el-alert>
+
+      <el-table :data="tempData" ref="filterTable" border :header-cell-style="{ background: '#ECF5FF' }"
+        :header-cell-class-name="handleHeaderClass" @header-click="handleHeaderClick" @sort-change="handleTableSort"
+        @selection-change="handleSelectionChange"  @filter-change="_filterChange">
+        <el-table-column type="selection" min-width="55" align="center">
+        </el-table-column>
+        <el-table-column prop="employee_name" label="姓名" align="center" min-width="120">
+        </el-table-column>
+        <el-table-column prop="index_name" label="指标名称" min-width="200" sortable="custom" :filters="index_name_list"
+          :filter-method="filterMethods" align="center"></el-table-column>
+        <el-table-column prop="index_standard" label="考核标准" min-width="200" sortable="custom" align="center"
+          :filters="index_standard_list" :filter-method="filterMethods">
+        </el-table-column>
+        <el-table-column prop="target" label="目标值" sortable="custom" align="center" :filters="target_list"
+          :filter-method="filterMethods">
+          <template slot-scope="scope">
+            <span>{{ scope.row.target }}{{ scope.row.unit }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="index_weight" label="权重%" sortable="custom" align="center" :filters="index_weight_list"
+          :filter-method="filterMethods"></el-table-column>
+        <el-table-column prop="index_remark" label="备注" min-width="200" align="center"></el-table-column>
+        <el-table-column label="结果值附件" min-width="200" :render-header="(h, obj) => renderHeader(h, obj, 'upload')">
+
+          <template slot-scope="scope">
+            <div style="margin-bottom: 20px;" @click="openActive(scope.row)">
+              <uploadOss :key="scope.row.id" :headers="$xtoken" class="avatar-uploader" :action="$action"
+                :show-file-list="true" :file-list="scope.row.result_file.images" :on-preview="onFilePreView"
+                :before-upload="beforeUpload" :on-remove="onFileRemove" :data-item="scope.row" :limit="3"
+                :on-success="handleSuccessImg" :accept="$acceptImg" :multiple="true">
+                <el-button class="primaryBtn" icon="el-icon-picture-outline" plain size="mini">图片</el-button>
+                <!-- (最多选择3张) -->
+              </uploadOss>
+            </div>
+            <div @click="openActive(scope.row)">
+              <uploadOss :key="scope.row.id" class="avatar-uploader" :headers="$xtoken" :show-file-list="true"
+                :multiple="true" :limit="5" :accept="$acceptFile" :file-list="scope.row.result_file.append"
+                :action="$action" :on-preview="onFilePreView2" :on-success="handleSuccess" :on-remove="handleRemove"
+                :before-upload="beforeFilesUpload">
+                <el-button class="primaryBtn" icon="el-icon-paperclip" plain size="mini">附件</el-button>
+                <!-- (仅支持上传xlsx,xls,doc,docx,pdf,txt,最多一份附件) -->
+              </uploadOss>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column label="实际完成结果值" min-width="150" :render-header="(h, obj) => renderHeader(h, obj, 'result_cache')">
+          <template slot-scope="scope">
+            <div class="flex-box-ce" v-if="scope.row.index_type==1">
+              <el-input type="textarea" @input="[(scope.row.result_cache = isFloor(scope.row.result_cache))]"
+                style="min-width: 130px;" :rows="1" v-model="scope.row.result_cache" placeholder="请输入"></el-input>
+              <span style="width: 40px;padding-left: 5px;" class="font-flex-word">{{ scope.row.unit }}</span>
+            </div>
+            <div v-else>--</div>
+          </template>
+        </el-table-column>
+      </el-table>
     </div>
 
-    <footer class="footer flex-box-end" v-if="activeName == 'noEntering'">
+    <footer class="footer flex-box-end" v-if="activeName == 'noEntering' && multipleSelection && multipleSelection.length > 0">
       <el-button class="primaryBtn" @click="save(1)">暂存</el-button>
       <el-button type="primary" @click="save(0)">提交结果值</el-button>
     </footer>
-    <footer class="footer flex-box-end" v-if="activeName == 'entering'&&returnIsShow">
-      <el-button  type="primary" @click="save(3)">提交结果值</el-button>
+    <footer class="footer flex-box-end" v-if="activeName == 'entering' && returnIsShow && multipleSelection && multipleSelection.length > 0">
+      <el-button type="primary" @click="save(3)">提交结果值</el-button>
     </footer>
 
+
+
+    <BatchUpload :isUploadShow="isUploadShow" :isUploadImg="isUploadImg" :isUploadFile="isUploadFile"
+      :isResultCache="isResultCache" @close="closeBatchUpload" @confirm="getImgs"></BatchUpload>
+
+    <!-- 图片查看 -->
     <el-dialog title="图片查看" :visible.sync="isShowImg" width="50%">
       <img :src="imgUrl" style="width: 100%;" />
       <span slot="footer" class="dialog-footer">
-        <el-button @click="isShowImg = false">取 消</el-button>
-        <el-button type="primary" @click="isShowImg = false">确 定</el-button>
+        <el-button @click="closePreview">关闭</el-button>
       </span>
     </el-dialog>
-    <el-dialog title="提交结果" :visible.sync="isResult" width="800" :close-on-click-modal="false" :close-on-press-escape="false" :show-close="false">
+    <!-- 图片查看 -->
+
+    <!-- 提交结果 -->
+    <el-dialog title="提交结果" :visible.sync="isResult" width="800" :close-on-click-modal="false"
+      :close-on-press-escape="false" :show-close="false">
       <div>
         <el-progress :text-inside="true" :stroke-width="24" :percentage="percentage"></el-progress>
         <div style="margin-top: 20px;border: 1px solid #f1f1f1;max-height: 500px;overflow-y: auto;" class="scroll-bar">
@@ -223,20 +121,24 @@
           </div>
         </div>
         <span slot="footer">
-          <div class="flex-box-end" style="margin-top: 20px;" >
+          <div class="flex-box-end" style="margin-top: 20px;">
             <el-button type="primary" @click="isResult = false" size="small">确 定</el-button>
           </div>
         </span>
       </div>
     </el-dialog>
+    <!-- 提交结果 -->
+
   </div>
 </template>
 <script>
 import PageHead from '@/components/PageHead'; //头部---返回
 import uploadOss from '@/components/upload';
 import { _debounce } from '@/utils/auth';
+import BatchUpload from "./resultSetComp/BatchUpload.vue"
+
 export default {
-  components: { PageHead, uploadOss },
+  components: { PageHead, uploadOss, BatchUpload },
   name: 'resultSet',
   props: {
     peIds: {
@@ -250,6 +152,8 @@ export default {
   },
   data() {
     return {
+      tableData: [],
+      pe_flows: [],
       activeName: 'noEntering',
       noStatusListAll:[],
       noStatusList: [],
@@ -258,7 +162,6 @@ export default {
       statusList: [],
       statusListTotal: 0,
       id: '', //员工考核记录id
-
       // 上传图标与附件
       img_fileList: [], // 图片附件
       file_fileList: [], //文件附件
@@ -267,23 +170,33 @@ export default {
       isShowImg: false,
       imgUrl: '',
       selectItem: {},
-
       // 长连接结果
       results: [], //提交的返回结果集合
       isResult: false,
       percentage: 0,
       resultList: [], //要发送数据的集合
       resultIndex: 0,
-
       employee_ids:[],
       employee_map: this.$getEmployeeMap(),
-      paiXu:false,
+      tempData: [], // 表格数据
+      sortList: [], // 用于表格数据排序
+      index_name_list: [], // 指标名称过滤数据
+      index_standard_list: [], // 指标标准过滤数据
+      target_list: [], // 目标过滤数据
+      index_weight_list: [], // 权重过滤
+      multipleSelection: [], // 选择的数据
+      isUploadShow: false,
+      upLoadImages: [],
+      filterData: [], // 表格过滤后的数据
+      isUploadImg: false,
+      isUploadFile: false,
+      isResultCache: false,
     };
   },
   computed:{
     returnIsShow(){
-      let is=false
-      this.statusList.forEach(item=>{
+      let is = false
+      this.tempData.forEach(item=>{
         if(item.isUpdate){
           is=true;
         }
@@ -292,13 +205,12 @@ export default {
     },
   },
   watch: {
-    paiXu(val){
-      if(val){
-        this.noStatusList=JSON.parse(JSON.stringify(this.noStatusListDx));
-      }else{
-        this.noStatusList=JSON.parse(JSON.stringify(this.noStatusListAll));
-      }
+    activeName(val) {
+      this.multipleSelection = [];
+      this.clearFilter();
+      this.initTableData();
     },
+    
     isResult(val) {
       if (!val) {
         this.results = []; //提交的返回结果集合
@@ -317,12 +229,269 @@ export default {
     },
   },
   created() {
-      if(this.peIds){
-          this.getPackageDtail();
-      }
+    if (this.peIds) {
+      this.getPackageDtail();
+    }
   },
 
   methods: {
+    
+    // 初始化表格数据
+    initTableData() {
+      let statusList = []; //已录入指标
+      let noStatusList = []; //未录入指标
+      this.tableData && this.tableData.forEach(item => {
+        // 已录入指标
+        if (item.index_result_status == 1) {
+          noStatusList.push(item);
+        }
+        // 未录入指标
+        if (item.index_result_status == 2) {
+          item.isUpdate = true;
+          this.pe_flows.forEach(e => {
+            if (e.pe_id == item.pe_id) {
+              item.isUpdate = this.returnIs(e.flow);
+            }
+          })
+          statusList.push(item);
+        }
+      });
+      this.noStatusList = noStatusList;
+      this.statusList = statusList;
+      this.statusListTotal = statusList.length;
+      this.noStatusListTotal = noStatusList.length;
+      if (this.activeName == 'noEntering') {
+        this.tempData = noStatusList; // 默认展示未录入的数据
+      } else {
+        this.tempData = statusList; // 默认展示未录入的数据
+      }
+
+      
+      // 初始化指标名称过滤数组 
+      this.index_name_list = this.tempData.map(item => {
+        return {
+          text: item.index_name,
+          value: item.index_name,
+        }
+      })
+      // 初始化指标标准过滤数组 
+      this.index_standard_list = this.tempData.map(item => {
+        return {
+          text: item.index_standard,
+          value: item.index_standard,
+        }
+      })
+      // 初始化目标过滤数组 
+      this.target_list = this.tempData.map(item => {
+        return {
+          text: item.target,
+          value: item.target,
+        }
+      })
+      // 初始化权重过滤数组 
+      this.index_weight_list = this.tempData.map(item => {
+        return {
+          text: item.index_weight,
+          value: item.index_weight,
+        }
+      })
+
+      // 数组去重
+      this.index_name_list = Array.from(new Set(this.index_name_list.map(JSON.stringify))).map(JSON.parse);
+
+      // 数组去重
+      this.index_standard_list = Array.from(new Set(this.index_standard_list.map(JSON.stringify))).map(JSON.parse);
+
+      // 数组去重
+      this.target_list = Array.from(new Set(this.target_list.map(JSON.stringify))).map(JSON.parse);
+      // 数组去重
+      this.index_weight_list = Array.from(new Set(this.index_weight_list.map(JSON.stringify))).map(JSON.parse);
+    },
+
+    handleSelectionChange(val) {
+      this.multipleSelection = val;
+    },
+    filterMethods(value, row, column) {
+      this.multipleSelection = [];
+      this.$refs.filterTable.clearSelection();
+      const property = column["property"];
+      return row[property] === value
+    },
+
+    // -----------------------------------------自定义函数-----------------------------------------------
+    updateSortOrder(column) {
+      // column.order 默认只能有一个不为 null,也就是说其它列的 order 改变时,原有的 order 会被置为 null
+      // 所以用另一个字段 multiOrder 保存 order 状态
+      column.multiOrder = column.order
+      // 更新 sortList
+      const index = this.sortList.findIndex(item => item.prop === column.property)
+      if (index !== -1) {
+        this.sortList.splice(index, 1)
+      }
+      if (column.order !== null) {
+        this.sortList.push({ prop: column.property, order: column.order })
+      }
+      // sort
+      this.sortTableData()
+    },
+    // 根据某一项比较
+    compareData(prop, a, b, order) {
+      const orderFactor = order === 'ascending' ? 1 : -1
+      if (a[prop] < b[prop]) {
+        return -1 * orderFactor
+      }
+      if (a[prop] > b[prop]) {
+        return 1 * orderFactor
+      }
+      return 0
+    },
+    // 根据 sortList 对 data 进行排序
+    sortTableData() {
+      this.tempData = Object.assign([], this.tempData)
+      this.tempData.sort((a, b) => {
+        for (const item of this.sortList) {
+          const tempResult = this.compareData(item.prop, a, b, item.order)
+          if (tempResult) {
+            return tempResult
+          }
+        }
+        return 0
+      })
+    },
+    // -----------------------------------------el-table 事件-----------------------------------------------
+    // 点击表头
+    // bug: 监听不到点击箭头
+    handleHeaderClick(column) {
+      // this.updateSortOrder(column)
+    },
+    // 点击箭头
+    handleTableSort({ column }) {
+      this.updateSortOrder(column)
+    },
+    // 把 multiOrder 同步给 order
+    handleHeaderClass({ column }) {
+      column.order = column.multiOrder
+    },
+    clearFilter() {
+      this.employee_ids = [];
+      this.$refs.filterTable.clearFilter();
+      this.filterData = [];
+      this.multipleSelection = [];
+    },
+
+    _filterChange() {
+      // this.$refs.filterTable.clearFilter();
+      // this.multipleSelection = []
+    },
+    // 自定义表头
+    renderHeader(h, { column, $index }, type) {
+      let that = this;
+      if (that.multipleSelection && that.multipleSelection.length > 0) {
+        if(type == 'upload') return h(
+          'div', {
+            style: { display: "flex", alignItems: "center", justifyContent: "center" }
+          }, [
+            
+            h('el-button', {
+              props: {
+                icon: 'el-icon-edit'
+              },
+              style: 'margin-left: 5px;',
+              on: {
+                click: function () {
+                  that.clickButton('img');
+                }
+              }
+            }, '图片'),
+            // 按钮
+            h('el-button', {
+              props: {
+                icon: 'el-icon-edit'
+              },
+              style: 'margin-left: 5px;',
+              on: {
+                click: function () {
+                  that.clickButton('file');
+                }
+              }
+            }, '附件')
+          ],
+        )
+        else return h(
+            'div', {
+            style: { display: "flex", alignItems: "center", justifyContent: "center" }
+          }, [
+
+            h('el-button', {
+              props: {
+                icon: 'el-icon-edit'
+              },
+              style: 'margin-left: 5px;',
+              on: {
+                click: function () {
+                  that.clickButton('result_cache');
+                }
+              }
+            }, '实际完成结果值')
+          ],
+        )
+      } else {
+        return h(
+          'div', {
+          style: { display: "flex", alignItems: "center", justifyContent: "center" }
+        }, [
+          // 列名称
+          h('span', column.label),
+        ],
+        )
+      }
+      
+    },
+
+    // 按钮点击事件
+    clickButton(type) {
+      if (type == 'img') {
+        this.isUploadImg = true;
+        this.isUploadFile = false;
+        this.isResultCache = false;
+      } 
+      if (type == 'file') {
+        this.isUploadImg = false;
+        this.isUploadFile = true;
+        this.isResultCache = false;
+      } 
+      if (type == 'result_cache') {
+        this.isUploadImg = false;
+        this.isUploadFile = false;
+        this.isResultCache = true;
+      } 
+      this.openBatchUpload();
+    },
+
+
+    openBatchUpload() {
+      this.isUploadShow = true;
+    },
+
+    closePreview() {
+      this.imgUrl = "";
+      this.isShowImg = false;
+    },
+    closeBatchUpload() {
+      this.isUploadShow = false;
+    },
+    getImgs(data) {
+      let { imgs, files, result_cache } = data
+      this.multipleSelection && this.multipleSelection.forEach(item => {
+        if (imgs && imgs.length > 0) item.result_file.images = imgs.filter(img => { return img.url })
+        if (files && files.length > 0) item.result_file.append = files.filter(file => { return file.url })
+        if (item.index_type == 1) {
+          if (result_cache)  item.result_cache = result_cache;
+        }
+      })
+      this.isUploadShow = false;
+    },
+
     isFloor(el) {
       var obj = event.target;
       var t = el.charAt(0);
@@ -406,9 +575,10 @@ export default {
       let isLr = false;
       let parameterArr = [];
       let err = '';
-      let isPost=true;
-      let str='';
-      let arr=num==3? this.statusList:this.noStatusList
+      let isPost = true;
+      let str = '';
+      let arr = [];
+      arr = this.multipleSelection;
       arr.forEach(item => {
         let result_info = [];
         result_info.push({
@@ -418,36 +588,36 @@ export default {
           result_file: item.result_file
         });
 
-        if(item.index_type == 1){
-          result_info[0].result=item.result_cache
+        if (item.index_type == 1) {
+          result_info[0].result = item.result_cache
         }
         let data = {
           id: item.pe_id, //个人考核包ID
-          cache:num==1? 1:0, //是否暂存 1 是 0 否(提交)
+          cache: num == 1 ? 1 : 0, //是否暂存 1 是 0 否(提交)
           info: item,
           result_info: JSON.stringify(result_info),
-          sub: num==3? 0:1
+          sub: num == 3 ? 0 : 1
         };
-        if(num==3){  //编辑
-          if(item.isUpdate){
+        if (num == 3) {  //编辑
+          if (item.isUpdate) {
             if (item.index_type == 1) {
-              if(!item.result_cache){
-                isPost=false;
-                str=item.index_name+': 请输入结果值'
+              if (!item.result_cache) {
+                isPost = false;
+                str = item.index_name + ': 请输入结果值'
                 return true
               }
               parameterArr.push(data);
-            }else{
+            } else {
               if (item.result_file.append.length == 0 && item.result_file.images.length == 0) {
-                isPost=false;
-                str=item.index_name+': 至少添加一份附件'
+                isPost = false;
+                str = item.index_name + ': 至少添加一份附件'
                 return true
               }
               parameterArr.push(data);
             }
           }
-        }else{
-          if (item.index_type == 1 && item.result_cache!==null && item.result_cache!=='') {
+        } else {
+          if (item.index_type == 1 && item.result_cache !== null && item.result_cache !== '') {
             parameterArr.push(data);
           }
           if (item.index_type != 1 && (item.result_file.append.length > 0 || item.result_file.images.length > 0)) {
@@ -455,12 +625,12 @@ export default {
           }
         }
       });
-      if(num==3){
-        if(!isPost){
+      if (num == 3) {
+        if (!isPost) {
           this.$message({ type: 'error', message: str, duration: 3000, center: true });
           return false;
         }
-      }else{
+      } else {
         if (parameterArr.length == 0) {
           this.$message({ type: 'error', message: '至少输入一项结果值或非量化指标添加一份附件', duration: 3000, center: true });
           return false;
@@ -483,8 +653,8 @@ export default {
         this.$axiosUser('post', '/api/pro/per/package/record_result', wsData[this.resultIndex]).then(res => {
           this.onmessageWS(wsData[this.resultIndex],true);
         }).catch(e=>{
-          let data=wsData[this.resultIndex];
-          data.msg=e.data.msg;
+          let data = wsData[this.resultIndex];
+          data.msg = e.data.msg;
           this.onmessageWS(data,false);
         });
       }
@@ -502,50 +672,21 @@ export default {
       if (lng == this.results.length) {
         this.percentage = 100;
       }
+      this.multipleSelection = [];
+      this.clearFilter();
     },
 
     getPackageDtail() {
-      this.$axiosUser('get', '/api/pro/per/package/result_job_list', { pe_ids: this.peIds, page: 1, page_size: 2000,employee_ids:JSON.stringify(this.employee_ids) }).then(res => {
-        let list = res.data.data.list;
-        let pe_flows=res.data.data.pe_flows;
-        let statusList = []; //已录入指标
-        let noStatusList = []; //未录入指标
-        list.forEach(item => {
-          if (item.index_result_status == 1) {
-            noStatusList.push(item);
-          }
-          if (item.index_result_status == 2) {
-            item.isUpdate=true;
-            pe_flows.forEach(e=>{
-              if(e.pe_id==item.pe_id){
-                item.isUpdate=this.returnIs(e.flow);
-              }
-            })
-            statusList.push(item);
-          }
-        });
-        this.statusListTotal = statusList.length;
-        this.noStatusListTotal = noStatusList.length;
-        this.statusList = statusList;
-        this.noStatusList = JSON.parse(JSON.stringify(noStatusList));
-        this.noStatusListAll =JSON.parse(JSON.stringify(noStatusList));
-        let obj={},arr=[];
-        noStatusList.forEach(item=>{
-          if(obj[item.index_name]){
-            obj[item.index_name].push(item)
-          }else{
-            obj[item.index_name]=[item]
-          }
-        })
-        for (let key in obj) {
-          arr.push(obj[key]);
-        }
-        arr.sort(function(a, b){return b.length - a.length});
-        let noStatusListDx=[]
-        arr.forEach(item=>{
-          noStatusListDx.push(...item);
-        })
-        this.noStatusListDx=noStatusListDx
+      this.$axiosUser('get', '/api/pro/per/package/result_job_list',
+        {
+          pe_ids: this.peIds,
+          page: 1,
+          page_size: 2000,
+          employee_ids: JSON.stringify(this.employee_ids)
+        }).then(res => {
+          this.tableData = res.data.data.list;
+          this.pe_flows = res.data.data.pe_flows;
+          this.initTableData()
 
       });
     },
@@ -553,7 +694,7 @@ export default {
     returnIs(list){
       let is=true;
       list.forEach(item=>{
-        if(item.code=='score_supervisor'||item.code=='special_scorer'){
+        if(item.code=='score_supervisor' || item.code=='special_scorer'){
           item.target.forEach(e=>{
             if(e.status==2){
               is=false;
@@ -618,5 +759,31 @@ export default {
 }
 .results div {
   padding: 10px;
+  box-sizing: border-box;
+}
+
+/* 设置滚动条的宽度和背景色 */
+::v-deep .el-table__body-wrapper::-webkit-scrollbar {
+  width: 10px;
+  height: 10px;
+  background-color: #f9f9f9;
+}
+
+/* 设置滚动条滑块的样式 */
+::v-deep .el-table__body-wrapper::-webkit-scrollbar-thumb {
+  border-radius: 6px;
+  background-color: #c1c1c1;
+}
+
+/* 设置滚动条滑块hover样式 */
+::v-deep .el-table__body-wrapper::-webkit-scrollbar-thumb:hover {
+  background-color: #a8a8a8;
+}
+
+/* 设置滚动条轨道的样式 */
+::v-deep .el-table__body-wrapper::-webkit-scrollbar-track {
+  box-shadow: inset 0 0 5px rgba(87, 175, 187, 0.1);
+  border-radius: 6px;
+  background: #ededed;
 }
 </style>

+ 189 - 0
src/performance/views/myPerformance/resultSetComp/BatchUpload.vue

@@ -0,0 +1,189 @@
+<template>
+    <div>
+        <el-dialog title="批量录入结果值" :visible.sync="isUploadShow" width="40%" @close="close">
+            <el-alert type="warning" :title="title" :closable="false"></el-alert>
+
+            <div style="width: 80%; margin: 20px auto; border: 1px solid #ccc; border-radius: 8px; padding: 20px; box-sizing: border-box;">
+                <div class="title" style="margin-bottom: 20px;" v-if="isUploadImg || isUploadFile">结果值附件</div>
+                <div style="margin: 0 0 20px 50px;" v-if="isUploadImg">
+                    <uploadOss :key="123" :headers="$xtoken" :action="$action" :show-file-list="true"
+                        :file-list="uploadImgs" :on-preview="(file) => onFilePreView(file, 'img')"
+                        :before-upload="(file) => beforeUpload(file, 'img')"
+                        :on-remove="(file, fileList) => onFileRemove(file, fileList, 'img')" :limit="3"
+                        :on-success="handleSuccess" :accept="$acceptImg" :multiple="true">
+                        <el-button class="primaryBtn" icon="el-icon-picture-outline" plain size="mini">图片</el-button>
+                        <!-- (最多选择3张) -->
+                    </uploadOss>
+                </div>
+                <div style="margin: 0 0 20px 50px;" v-if="isUploadFile">
+                    <uploadOss :key="456" :headers="$xtoken" :show-file-list="true" :multiple="true" :limit="5"
+                        :accept="$acceptFile" :file-list="uploadFiles" :action="$action"
+                        :on-preview="(file) => onFilePreView(file, 'file')" :on-success="handleSuccess"
+                        :on-remove="(file, fileList) => onFileRemove(file, fileList, 'file')"
+                        :before-upload="(file) => beforeUpload(file, 'file')">
+                        <el-button class="primaryBtn" icon="el-icon-paperclip" plain size="mini">附件</el-button>
+                        <!-- (仅支持上传xlsx,xls,doc,docx,pdf,txt,最多一份附件) -->
+                    </uploadOss>
+                </div>
+                <div v-if="isResultCache" class="title" style="margin-bottom: 20px;">实际完成结果值</div>
+
+                <el-input v-if="isResultCache" type="textarea" @input="[(result_cache = isFloor(result_cache))]"
+                    style="width: 80%; margin: 0 0 20px 50px;" :rows="1" v-model="result_cache"
+                    placeholder="请输入"></el-input>
+            </div>
+
+
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="close">取 消</el-button>
+                <el-button type="primary" @click="confirm">确 定</el-button>
+            </span>
+
+
+        </el-dialog>
+
+        <el-dialog title="图片查看" :visible.sync="isShowImg" width="50%">
+            <img :src="imgUrl" style="width: 100%;" />
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="closePreview()">关 闭</el-button>
+            </span>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import { _debounce } from '@/utils/auth';
+import uploadOss from '@/components/upload';
+
+export default {
+    components: {
+        uploadOss
+    },
+    props: {
+        isUploadShow: {
+            type: Boolean,
+            default: false
+        },
+        isUploadImg: {
+            type: Boolean,
+            default: false
+        },
+        isUploadFile: {
+            type: Boolean,
+            default: false
+        },
+        isResultCache: {
+            type: Boolean,
+            default: true
+        }
+    },
+    data() {
+        return {
+            title: "选中的数据将会录入同一个结果值附件,实际完成结果值",
+            uploadImgs: [],
+            uploadFiles: [],
+            isShowImg: false,
+            imgUrl: "",
+            result_cache: ""
+        }
+    },
+    created() {
+        if (this.isResultCache) this.title = "选中的数据将会录入同一个实际完成结果值"
+        else this.title = "选中的数据将会录入同一个结果值附件"
+    },
+    methods: {
+        onFilePreView(file, type) {
+            if (type == 'img') {
+                if (file.url) {
+                    this.imgUrl = file.url;
+                    this.isShowImg = true;
+                }
+            } else {
+                if (file.url) {
+                    window.open(file.url, '_blank');
+                }
+            }
+        },
+        closePreview() {
+            this.imgUrl = "";
+            this.isShowImg = false;
+        },
+        handleSuccess: _debounce(function (response, file, fileList) {
+            // let result_file = JSON.parse(JSON.stringify(this.selectItem)).result_file;
+            // result_file.images = fileList.filter(item => {
+            //     return item.url;
+            // });
+            // this.selectItem.result_file = result_file;
+        }),
+        // 图片上传
+        beforeUpload(file, type) {
+            if (type == "img") {
+                const isJPG = /^image\/(jpeg|png|jpg)$/.test(file.type);
+                const isLt2M = file.size / 1024 / 1024 < 5;
+                if (!isJPG) {
+                    this.$message.error('上传图片只能是 jpeg|png|jpg 格式!');
+                    // this.filData(1);
+                }
+                if (!isLt2M) {
+                    this.$message.error('上传图片大小不能超过 5MB!');
+                }
+                return isJPG && isLt2M;
+            } else {
+                const $ext_list = ['xlsx', 'xls', 'doc', 'docx', 'pdf', 'XLSX', 'XLS', 'DOC', 'DOCX', 'PDF'];
+                const isLt2M = file.size / 1024 / 1024 < 5;
+                let len = file.name.split('.').length - 1;
+                const $ext_name = file.name.split('.')[len];
+                let isFile = $ext_list.indexOf($ext_name) != -1;
+                if (!isLt2M) {
+                    this.$message.error('文件大小不能超过 5MB!');
+                }
+                if (!isFile) {
+                    this.$message.warning('文件格式上传错误,仅支持上传xlsx,xls,doc,docx,pdf)');
+                }
+                return isFile && isLt2M;
+            }
+            
+        },
+        onFileRemove(file, fileList, type) {
+            setTimeout(() => {
+                if(type == 'img') this.uploadImgs = fileList;
+                else this.uploadFiles = fileList
+            }, 500);
+        },
+        isFloor(el) {
+            var obj = event.target;
+            var t = el.charAt(0);
+            el = el
+                .replace('.', '$#$') //把第一个字符'.'替换成'$#$'
+                .replace(/\./g, '') //把其余的字符'.'替换为空
+                .replace('$#$', '.') //把字符'$#$'替换回原来的'.'
+                .replace(/[^\d.]/g, '') //只能输入数字和'.'
+                .replace(/^\./g, '') //不能以'.'开头
+                .replace(/([0-9]+\.[0-9]{2})[0-9]*/, '$1'); //只保留2位小数
+            if (t == '-') {
+                el = '-' + el;
+            }
+            return el || null;
+        },
+        close() {
+            this.uploadImgs = [];
+            this.uploadFiles = [];
+            this.result_cache = ""
+            this.$emit("close")
+        },
+        confirm() {
+            this.$emit("confirm", {
+                imgs: this.uploadImgs,
+                files: this.uploadFiles,
+                result_cache: this.result_cache
+            })
+            this.uploadImgs = [];
+            this.uploadFiles = [];
+            this.result_cache = ""
+        }
+    }
+}
+
+</script>
+
+
+<style></style>

+ 3 - 3
src/performance/views/performanceIndex.vue

@@ -7,7 +7,7 @@
           <el-menu :default-active="activeIndex" class="el-menu-vertical-demo" ref="elMenu" :router="true" @select="activeRouter" :unique-opened="true">
             <template v-for="(item, index) in routers">
               <div v-if="item.children.length != 0" :key="index">
-                <el-menu-item :index="returnIndex(index, 0)" :route="item.children[0].path" :ref="item.children[0].path"  v-if="item.label=='工作台'||item.label=='我的绩效'">
+                <el-menu-item :index="returnIndex(index, 0)" :route="item.children[0].path" :ref="item.children[0].path"  v-if="item.label=='工作台' || item.label=='我的绩效'">
                   <div class="flex-box-ce">
                     <svg-icon :icon-class="item.icon" class="svgIcon"></svg-icon>
                     <span slot="title" style="margin-left: 5px;">{{ item.children[0].label }}</span>
@@ -24,8 +24,8 @@
                     <el-menu-item :index="returnIndex(index, index2)" :ref="item2.path" :route="item2.path" :key="index2" class="font-flex-word">
                       <span slot="title" style="margin-left: 10px;width:120px">
                         {{ item2.label }}
-                        <span :class="item2.label=='考核列表'? 'tio2':'tio'" v-if="getRole&&(item2.label=='考核列表'||item2.label=='考核模板')">
-                          {{item2.label=='考核列表'? '再发起':'先配置'}}
+                        <span :class="item2.label=='考核明细'? 'tio2':'tio'" v-if="getRole && (item2.label=='考核明细' || item2.label=='考核表设置')">
+                          {{item2.label=='考核明细' ? '再发起' : '先配置'}}
                         </span>
                       </span>
                     </el-menu-item>

+ 1 - 1
src/performance/views/set/basicsSet.vue

@@ -88,7 +88,7 @@ export default {
             let levels=data.level_scope.levels;
             this.level_enable=data.level_enable;
             var inputs=[];
-            var max=0;//最大值
+            var max = 0;//最大值
             if(levels){
               levels.forEach((item,index)=>{
                 var obj;

+ 7 - 7
src/performance/views/set/jurisdictionSet.vue

@@ -41,7 +41,7 @@
             <span>{{ filtrationStr(scope.row.menu) }}</span>
           </template>
         </el-table-column>
-        <el-table-column prop="group" label="管理考核模板">
+        <el-table-column prop="group" label="管理考核">
           <template slot-scope="scope">
             <span>{{ filtrationStr(scope.row.group) }}</span>
           </template>
@@ -105,13 +105,13 @@
               </div>
             </div>
           </el-form-item>
-          <el-form-item label="考核模板权限:" v-show="isReviewShow">
+          <el-form-item label="考核权限:" v-show="isReviewShow">
             <el-radio-group v-model="review">
-              <el-radio :label="14">全部考核模板</el-radio>
-              <el-radio :label="13">特定考核模板</el-radio>
+              <el-radio :label="14">全部考核</el-radio>
+              <el-radio :label="13">特定考核</el-radio>
             </el-radio-group>
           </el-form-item>
-          <el-form-item label="特定考核模板:" v-show="isReviewShow2 && isReviewShow">
+          <el-form-item label="特定考核:" v-show="isReviewShow2 && isReviewShow">
             <el-button @click="openKp()" plain class="primaryBtn" >请选择</el-button>
             <div v-for="(item, index) in selectGroup">
               <el-tag type="success">{{ item.name }}</el-tag>
@@ -195,10 +195,10 @@ export default {
             { label: '导出报表', id: '11', check: true }
           ]
         },
-        { label: '考核指标库', id: '12', check: true },
+        // { label: '考核指标库', id: '12', check: true },
         { label: '绩效等级配置', id: '15', check: true },
         { label: '绩效报表', id: '16', check: true },
-        { label: '考核模板', id: 'kp', check: true }
+        { label: '考核', id: 'kp', check: true }
       ],
       selected: { employee: [], dept: [] },
       // 考核模板

+ 62 - 37
src/performance/views/statement/analyse.vue

@@ -1,15 +1,10 @@
 <template>
   <div v-loading="tableDataLoad" class="all">
-    <template  v-if="headValue.length > 0">
+    <template v-if="headValue.length > 0">
       <header class="flex-box flex-d-center">
         <div class="flex-box">
-          <el-cascader
-            v-model="headValue"
-            :options="options"
-            :props="props"
-            :show-all-levels="false"
-          ></el-cascader>
-<!--          :props="{
+          <el-cascader v-model="headValue" :options="options" :props="props" :show-all-levels="false"></el-cascader>
+          <!-- :props="{
             expandTrigger: 'hover',
             label: 'name',
             value: 'id',
@@ -17,18 +12,24 @@
           }" -->
         </div>
         <div>
-          <el-dropdown @command="handleCommand">
-            <el-button type="primary">
-              导出报表
-              <i class="el-icon-arrow-down el-icon--right"></i>
-            </el-button>
+          <el-button-group v-if="this.$isAuthoritys_jx(this.$11)">
+            <el-button type="primary" icon="el-icon-document" @click="handleCommand('C')">导出明细报表</el-button>
+            <el-button type="primary" icon="el-icon-document" @click="handleCommand('A')">导出结果报表</el-button>
+          </el-button-group>
+
+          <!-- <el-button type="primary">
+            导出报表
+          </el-button> -->
+          <!-- 
+          <el-dropdown>
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item command="A">考核结果报表</el-dropdown-item>
-              <!--             <el-dropdown-item command="B">多次考核结果对比表</el-dropdown-item>
+              <el-dropdown-item command="B">多次考核结果对比表</el-dropdown-item>
               <el-dropdown-item command="C">单次考核对比表</el-dropdown-item>
-              <el-dropdown-item command="D">自定义导出</el-dropdown-item> -->
+              <el-dropdown-item command="D">自定义导出</el-dropdown-item> 
             </el-dropdown-menu>
-          </el-dropdown>
+            </el-dropdown>
+          -->
         </div>
       </header>
       <div class="main">
@@ -83,16 +84,16 @@
             </el-tooltip>
           </div>
           <div class="flex-box">
-            <div class="flex-4">
+            <div class="flex-3" style="border-right: 1px solid #ebebeb;">
               <div class="main-title2">等级分布</div>
               <template v-if="headValue.length > 0">
                 <div ref="echarts2" class="echarts"></div>
               </template>
               <NoData v-else></NoData>
             </div>
-            <div class="flex-3" style="padding-right: 20px;padding-top: 70px;overflow-x:hidden;">
+            <div class="flex-3" style="overflow-x:hidden; padding-left: 20px;">
               <el-table :data="tableData" :header-cell-style="{ background: '#ECF5FF' }">
-                <el-table-column prop="name" label="绩效等级">
+                <el-table-column prop="name" label="绩效等级" align="center">
                   <template slot="header" slot-scope="scope">
                     <el-tooltip effect="dark" placement="top-start">
                       <div slot="content">
@@ -111,7 +112,7 @@
                   </template>
                 </el-table-column>
 
-                <el-table-column prop="value" label="实际分布"></el-table-column>
+                <el-table-column prop="value" label="实际分布" align="center"></el-table-column>
               </el-table>
             </div>
           </div>
@@ -122,21 +123,23 @@
             <div class="flex-box-ce">
               <div class="label">部门</div>
               <el-select v-model="deptName" clearable multiple placeholder="请选择部门" style="width: 300px;">
-                <el-option v-for="(item, index) in deptList" :key="index" :label="item.label" :value="item.value"></el-option>
+                <el-option v-for="(item, index) in deptList" :key="index" :label="item.label"
+                  :value="item.value"></el-option>
               </el-select>
             </div>
             <div class="flex-box-ce">
               <div class="label">等级</div>
               <el-select v-model="rank" clearable placeholder="请选择等级">
-                <el-option v-for="(item, index) in tableData" :key="index" :label="item.name" :value="item.name"></el-option>
+                <el-option v-for="(item, index) in tableData" :key="index" :label="item.name"
+                  :value="item.name"></el-option>
               </el-select>
             </div>
           </div>
           <div class="table-box" style="padding: 20px;">
             <el-table :data="getEmployees()" :header-cell-style="{ background: '#ECF5FF' }">
-              <el-table-column type="index"></el-table-column>
-              <el-table-column prop="name" label="姓名"></el-table-column>
-              <el-table-column prop="dept_name" label="部门">
+              <el-table-column type="index" label="序号" align="center"></el-table-column>
+              <el-table-column prop="name" label="姓名" align="center"></el-table-column>
+              <el-table-column prop="dept_name" label="部门" align="center">
                 <template slot-scope="scope">
                   <span v-if="scope.row.departments&&scope.row.departments.length>0">
                     <span v-for="(item,key) in scope.row.departments">{{item.dept_name}},</span>
@@ -144,8 +147,8 @@
                   <span v-else>{{scope.row.dept_name}}</span>
                 </template>
               </el-table-column>
-              <el-table-column prop="final_point" label="考核结果"></el-table-column>
-              <el-table-column prop="final_level" label="绩效等级">
+              <el-table-column prop="final_point" label="考核结果" align="center"></el-table-column>
+              <el-table-column prop="final_level" label="绩效等级" align="center">
                 <template slot="header" slot-scope="scope">
                   <el-tooltip effect="dark" placement="top-start">
                     <div slot="content">
@@ -163,8 +166,8 @@
                   </el-tooltip>
                 </template>
               </el-table-column>
-              <el-table-column prop="rank" label="绩效排名"></el-table-column>
-              <el-table-column label="操作" width="100">
+              <el-table-column prop="rank" label="绩效排名" align="center"></el-table-column>
+              <el-table-column label="操作" width="100" align="center">
                 <template slot-scope="scope">
                   <el-button type="text" @click="openDetail(scope.row)">查看详情</el-button>
                 </template>
@@ -174,7 +177,8 @@
         </div>
       </div>
     </template>
-   <div class="flex-box-v flex-center-center" v-else style="padding: 26px 35px;background-color: #fff;border: 1px solid #e8e8e8;border-radius: 4px;height: 400px;">
+    <div class="flex-box-v flex-center-center" v-else
+      style="padding: 26px 35px;background-color: #fff;border: 1px solid #e8e8e8;border-radius: 4px;height: 400px;">
       <img src="static/images/invite_new_company.png" style="width: 200px;height: 200px;margin-bottom: 10px;" />
       <div class="fontColorB">您没有参与任何考核</div>
     </div>
@@ -238,9 +242,9 @@ export default {
       // this.getEmployees();
     },
     headValue(val) {
-      this.tableData=[];
-      this.deptList=[];
-      this.cycle_type=val[0];
+      this.tableData = [];
+      this.deptList = [];
+      this.cycle_type = val[0];
       this.package_id = val[val.length - 1];
       this.getData();
     }
@@ -537,6 +541,14 @@ export default {
             });
           });
           break;
+        case 'C': //导出明细
+          this.$axiosUser('get', '/api/pro/per/package/export/detail', { package_id: this.package_id }).then(res => {
+            this.$alert('系统正在处理中,处理完将在工作台以“消息”形式通知您,请留意消息通知', '提示', {
+              confirmButtonText: '我知道了',
+              callback: action => { }
+            });
+          });
+          break;
         case 'g': //管理
           this.isManagement = true;
           break;
@@ -606,8 +618,8 @@ header {
 }
 .main-herader {
   margin: 10px 0;
-  // box-shadow: 0 0 3px #ccc;
-  box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.05);
+  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+  // box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.05);
 }
 .item {
   text-align: center;
@@ -636,11 +648,24 @@ header {
 }
 .main-title {
   font-weight: 600;
-  padding: 20px 0px;
-  font-size: 15px;
+  // padding: 20px 0px;
+  font-size: 16px;
+  position: relative;
+  margin: 20px 0 20px 20px;
+  &::after {
+    content: "";
+    position: absolute;
+    width: 4px;
+    height: 18px;
+    background-color: #409EFF;
+    left: -10px;
+    top: 2px;
+  }
 }
 .main-title2 {
   padding-left: 40px;
+  font-size: 14px;
+  font-weight: 600;
 }
 .departments {
   width: 46%;

+ 90 - 34
src/performance/views/statement/statistics.vue

@@ -1,11 +1,14 @@
 <template>
   <div class="all">
-    <header class="flex-box flex-d-center">
+    <header class="flex-box flex-d-center" style="min-width: 1400px;">
       <div class="flex-box">
+
         <div class="flex-box-ce">
           <div class="title">年份</div>
-          <el-date-picker v-model="param.year" :clearable="false" value-format="yyyy" type="year" placeholder="选择年"></el-date-picker>
+          <el-date-picker v-model="param.year" :clearable="false" value-format="yyyy" type="year"
+            placeholder="选择年"></el-date-picker>
         </div>
+
         <div class="title">部门</div>
         <div class="dept_wdiv">
           <div class="dept_inp" @click="show_dept_selector = true">
@@ -14,36 +17,70 @@
           </div>
           <i class="el-icon-arrow-down"></i>
         </div>
-        <div class="flex-box-ce">
+        <div class="flex-box-ce" style="margin-left: 20px;">
           <div class="title">考核模板</div>
-          <el-cascader
-            v-model="headValue"
-            :options="options"
-            :show-all-levels="false"
-            clearable
-            :props="{ expandTrigger: 'hover', label: 'name', value: 'id', children: 'list' }"
-          ></el-cascader>
+          <el-cascader v-model="headValue" :options="options" :show-all-levels="false" clearable
+            :props="{ expandTrigger: 'hover', label: 'name', value: 'id', children: 'list' }"></el-cascader>
+        </div>
+
+        <div class="flex-box-ce" style="margin-left: 20px;">
+          <div class="title">员工姓名</div>
+          <el-select style="position: relative;top: 2px;" v-model="employee_ids" filterable clearable class=""
+            placeholder="姓名搜索">
+            <el-option v-for="item in employees" :key="item.id" :label="item.name" :value="item.id"></el-option>
+          </el-select>
         </div>
-        <el-select style="position: relative;top: 2px;padding-left: 10px;" v-model="employee_ids" filterable clearable class="margin-l" placeholder="姓名搜索">
-          <el-option v-for="item in employees" :key="item.id" :label="item.name" :value="item.id"></el-option>
-        </el-select>
       </div>
     </header>
-    <div class="flex-box-ce">
+    <!-- <el-row :gutter="10">
+      <el-col :span="6">
+        <div class="flex-box-ce">
+          <div class="title">年份</div>
+          <el-date-picker v-model="param.year" :clearable="false" value-format="yyyy" type="year"
+            placeholder="选择年"></el-date-picker>
+        </div>
+      </el-col>
+      <el-col :span="6">
+        <div class="title">部门</div>
+        <div class="flex-box-ce">
+
+          <div class="dept_wdiv">
+            <div class="dept_inp" @click="show_dept_selector = true">
+              <span v-if="deptVisibleName != ''">{{ deptVisibleName }}</span>
+              <span v-else style="color: #b9b9b9;">选择部门</span>
+            </div>
+            <i class="el-icon-arrow-down"></i>
+          </div>
+        </div>
+      </el-col>
+      <el-col :span="6">
+        <div class="title">考核表</div>
+        <el-cascader v-model="headValue" :options="options" :show-all-levels="false" clearable
+          :props="{ expandTrigger: 'hover', label: 'name', value: 'id', children: 'list' }"></el-cascader>
+      </el-col>
+      <el-col :span="6">
+        <div class="title">员工姓名</div>
+        <el-select style="position: relative;top: 2px;" v-model="employee_ids" filterable clearable class=""
+          placeholder="姓名搜索">
+          <el-option v-for="item in employees" :key="item.id" :label="item.name" :value="item.id"></el-option>
+        </el-select>
+      </el-col>
+    </el-row> -->
+    <div class="flex-box-ce" style="margin: 20px 0;">
       <el-button icon="el-icon-s-promotion" type="primary" @click="downloadTemplate">导出报表</el-button>
       <div class="orange" style="margin-left: 20px;">仅支持月度考核的对比</div>
     </div>
     <aside v-loading="tableDataLoad">
-      <el-table :data="tableData" style="width: 100%">
-        <el-table-column prop="employee_name" label="姓名">
-          <template slot-scope="scope">
+      <el-table :data="tableData" style="width: 100%; " border stripe>
+        <el-table-column prop="employee_name" label="姓名" align="center">
+          <!-- <template slot-scope="scope">
             <div class="flex-box-ce">
-              <!-- <userImage :id="scope.row.employee_id" :user_name="scope.row.employee_name" width="35px" height="35px" fontSize="12px"></userImage> -->
-              <span style="margin-left: 10px; line-height: 50px;">{{ scope.row.employee_name }}</span>
+              <userImage :id="scope.row.employee_id" :user_name="scope.row.employee_name" width="35px" height="35px" fontSize="12px"></userImage>
+              <span style="line-height: 50px;">{{ scope.row.employee_name }}</span>
             </div>
-          </template>
+          </template> -->
         </el-table-column>
-        <el-table-column prop="dept" label="部门">
+        <el-table-column prop="dept" label="部门" align="center">
           <template slot-scope="scope">
             <div v-if="scope.row.dept.length > 0">
               <span v-for="(item, index) in scope.row.dept" :key="index">
@@ -54,7 +91,8 @@
             <span v-else>--</span>
           </template>
         </el-table-column>
-        <el-table-column :prop="item.code" :label="item.label" v-for="(item, index) in monthList" :key="item.code">
+        <el-table-column :prop="item.code" :label="item.label" v-for="(item, index) in monthList" :key="item.code"
+          align="center">
           <template slot-scope="scope">
             <span>{{ scope.row[item.code].final_point }}</span>
             <br />
@@ -62,18 +100,11 @@
           </template>
         </el-table-column>
       </el-table>
-      <Pagination :page="param.page" :page_size="param.page_size" :total="total" @handleSizeChange="handleSizeChange" @handleCurrentChange="handleCurrentChange"></Pagination>
+      <Pagination :page="param.page" :page_size="param.page_size" :total="total" @handleSizeChange="handleSizeChange"
+        @handleCurrentChange="handleCurrentChange"></Pagination>
     </aside>
-    <EmployeeSelector
-      :title="'选择部门'"
-      :isChecKedAll="false"
-      :can_select_employee="false"
-      :can_select_dept="true"
-      :dept_children="false"
-      :selected="dept_selected"
-      :visible.sync="show_dept_selector"
-      @confirm="dept_confirm"
-    />
+    <EmployeeSelector :title="'选择部门'" :isChecKedAll="false" :can_select_employee="false" :can_select_dept="true"
+      :dept_children="false" :selected="dept_selected" :visible.sync="show_dept_selector" @confirm="dept_confirm" />
   </div>
 </template>
 
@@ -253,7 +284,7 @@ header {
   margin-bottom: 20px;
 }
 .dept_wdiv {
-  width: 200px;
+  width: 240px;
   position: relative;
   .dept_inp {
     position: absolute;
@@ -286,4 +317,29 @@ header {
 .color_blue {
   color: #1299f9;
 }
+
+/* 设置滚动条的宽度和背景色 */
+::v-deep .el-table__body-wrapper::-webkit-scrollbar {
+  width: 10px;
+  height: 10px;
+  background-color: #f9f9f9;
+}
+
+/* 设置滚动条滑块的样式 */
+::v-deep .el-table__body-wrapper::-webkit-scrollbar-thumb {
+  border-radius: 6px;
+  background-color: #c1c1c1;
+}
+
+/* 设置滚动条滑块hover样式 */
+::v-deep .el-table__body-wrapper::-webkit-scrollbar-thumb:hover {
+  background-color: #a8a8a8;
+}
+
+/* 设置滚动条轨道的样式 */
+::v-deep .el-table__body-wrapper::-webkit-scrollbar-track {
+  box-shadow: inset 0 0 5px rgba(87, 175, 187, 0.1);
+  border-radius: 6px;
+  background: #ededed;
+}
 </style>

+ 3 - 4
src/permission.js

@@ -14,7 +14,7 @@ function filterWhite(path) {
 }
 // 免登名单
 const whiteList1 = ['/login', '/loginbytoken', '/reg', '/forgetPwd', '/resetPwd', '/android', '/bindingPhone', '/demo', '/swiperShow', '/weixin', '/screen', '/screenSan', '/tySelect']
-const whiteList2 = ['/course', '/course/statistics','/freeCourseEdit', '/courseLogin', '/course/adminSetting', '/course/courseManage','/course/courseCreate', '/course/dealerManage']
+const whiteList2 = ['/course', '/course/statistics', '/freeCourseEdit', '/courseLogin', '/course/adminSetting', '/course/courseManage', '/course/courseCreate', '/course/dealerManage']
 const whiteList = whiteList1.concat(whiteList2)
 router.beforeEach((to, from, next) => {
   if (Vue.$axiosUserRequestList.length > 0) { // 强行中断时才向下执行
@@ -41,15 +41,14 @@ router.beforeEach((to, from, next) => {
       }
     }
   } else if (whiteList2.indexOf(to.path) !== -1 || filterWhite(to.path)) {
-    if (localStorage.getItem('Course-Token')||localStorage.getItem('Course-Id')|| to.path == '/courseLogin') {
+    if (localStorage.getItem('Course-Token') || localStorage.getItem('Course-Id') || to.path == '/courseLogin') {
       next()
     } else {
       Message({
         message: '未登录!',
-        type:'warning',
+        type: 'warning',
         duration: 2000
       })
-      console.log(13)
       next('/courseLogin')
     }
   } else {

+ 9 - 3
src/point/views/setting/jfRule.vue

@@ -1,7 +1,7 @@
 <template>
-  <div style="background-color: #fff;padding: 20px;position: relative;" class="boxMinHeight">
+  <div style="background-color: #fff;padding: 20px; box-sizing: border-box; position: relative;" >
     <!-- <span class="blue cursor" style="position: absolute;top: 30px;right: 20px;z-index: 2000;" @click="$openUrl(16)"><i class="el-icon-question" style="padding-right: 5px;font-size: 16px;position: relative;top: 1px;"></i>积分规则是什么?如何制定?</span> -->
-    <el-tabs v-model="activeName" @tab-click="handleClick">
+    <el-tabs v-model="activeName" @tab-click="handleClick" class="boxMinHeight">
       <el-tab-pane label="常规积分" name="1">
         <ruleManage></ruleManage>
       </el-tab-pane>
@@ -43,5 +43,11 @@ export default {
 </script>
 
 <style>
-
+/* .fixed-tabs {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  z-index: 1024;
+} */
 </style>

+ 215 - 82
src/point/views/setting/pk.vue

@@ -1,8 +1,8 @@
 <template>
-  <div>
+  <div class="container" >
     <!--规则提示-->
-    <div class="diy_tip_bg" >
-      <el-alert class="diy-tip" type="success" :closable="false">
+    <!-- <div class="diy_tip_bg">
+      <el-alert class="diy-tip" type="success" :closable="true">
         <p><b>团队PK通过自定义PK配置、团队参与人员等。在相同积分规则内对团队进行积分对比</b></p>
         <p><b>团队配置流程</b></p>
         <li class="headLi">指定PK在哪些积分规则分类或者积分规则内有效,只针对B分</li>
@@ -11,65 +11,100 @@
         <li class="headLi">团队参与者在团队配置中积分规则内的积分总和</li>
         <li class="headLi">单独向团队录入的积分</li>
       </el-alert>
-    </div>
-    <div style="background-color: #fff;padding: 20px;position: relative;" class="flex-box boxMinHeight">
-      <div class="left box-sizing-w scroll-bar" v-loading="menuLoading">
-        <div style="text-align: center; padding: 10px 0;">
-          <el-button type="primary" @click="addDoc" v-if="!manageAble">创建PK配置</el-button>
-        </div>
-        <el-menu v-if="docList.length > 0" :default-active="menuActive"  @select="activeRouter" class="el-menu-vertical-demo" >
+    </div> -->
+    <!--规则提示-->
+    <!-- 左边,配置列表 -->
+    <div class="left" v-loading="menuLoading" style="">
+      <div class="left-btn-box">
+        <el-button type="primary" @click="addDoc" v-if="!manageAble">创建PK配置</el-button>
+      </div>
+      <el-scrollbar class="scroll-bar" style="width: 100%; height: calc(100% - 80px);">
+        <el-menu v-if="docList.length > 0" :default-active="menuActive"  @select="activeRouter"  style="width: 100%; height: 100%;">
           <el-menu-item v-for="(item, index) in docList" :key="index" :index="index.toString()" @click="refreshContent(item)">
             <span slot="title">{{item.name}}</span>
           </el-menu-item>
         </el-menu>
         <div v-if="docList.length == 0"><NoData></NoData></div>
-      </div>
-      <div style="overflow-x: auto" class="flex-1 scroll-bar">
-        <el-row style="margin-left: 20px;margin-bottom: 20px;" v-if="currentDoc">
-          <el-col :span="10" style="display: block;font-size: 20px; color: rgb(48,49,51); vertical-align: middle" ><h4>{{currentDoc.name}}</h4></el-col>
-        </el-row>
-        <div style="margin-bottom: 20px;margin-left: 20px;" >
-          <el-button v-if="currentDoc" type="primary" size="small" @click="editDoc">PK配置</el-button>
-          <el-button v-if="currentDoc" type="primary" size="small" @click="addTeam">新增团队</el-button>
+      </el-scrollbar>
+    </div>
+    <!-- 左边,配置列表 -->
+
+    <!-- 右边配置详情 -->
+    <div class="right">
+      
+        <div style="width: 100%; height: 80px; ">
+          <el-row style="margin-left: 20px; " v-if="currentDoc">
+            <el-col :span="10" style="display: block; font-size: 20px; line-height: 40px; color: rgb(48,49,51); vertical-align: middle" >
+              <h4>{{currentDoc.name}}</h4>
+            </el-col>
+          </el-row>
+          <div style="margin-bottom: 20px; margin-left: 20px;" >
+            <el-button v-if="currentDoc" type="primary" size="small" @click="editDoc">PK配置</el-button>
+            <el-button v-if="currentDoc" type="primary" size="small" @click="addTeam">新增团队</el-button>
+          </div>
         </div>
-        <el-tabs v-if=" currentDoc && currentDoc.teams.length > 0 " v-model="activeTeam"  type="border-card" closable @tab-remove="removeTeam" v-loading="contentLoading">
+        <!-- <div style="width: 100%; height: calc(100% - 80px); background-color: palevioletred;">
+          <el-scrollbar class="scroll-bar" style="width: 100%; height: 100%;">
+            <div class="tabs" v-if=" currentDoc && currentDoc.teams.length > 0 ">
+              <div class="tab-item" v-for="(team,index) in currentDoc.teams" :key="index">
+                <div class="team-name">{{ team.name }}</div>
+                <div class="team-emply">
+                  <div v-for="(item, index) in team.employees" :key="index">
+                    {{ item.name }}
+                    <userImage class="fl" :id="item.id" :user_name="item.name" :img_url="item.img_url" width="50px" height="50px"></userImage>
+                    <span style="line-height: 50px; padding-left: 10px;">{{item.name }}</span>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </el-scrollbar>
+        </div> -->
+        <el-tabs style="width: 100%; height: calc(100% - 100px); " v-if=" currentDoc && currentDoc.teams.length > 0 " v-model="activeTeam"  type="border-card" closable @tab-remove="removeTeam" v-loading="contentLoading">
           <el-tab-pane v-for="(team,index) in currentDoc.teams" :key="index" :name="index.toString()" :label="team.name" >
-            <el-table :data="team.employees" v-if="activeTeam === index.toString()"> <!--v-if="activeTeam == index.toString()"防止标签切换抖动-->
-              <el-table-column label="员工" align="left" width="200">
-                <template slot-scope="scope">
-                  <userImage class="fl" :id="scope.row.id" :user_name="scope.row.name" :img_url="scope.row.img_url" width="50px" height="50px"></userImage>
-                  <span style="line-height: 50px; padding-left: 10px;">{{ scope.row.name }}</span>
-                </template>
-              </el-table-column>
-              <el-table-column label="部门" prop="dept_list" align="center"></el-table-column>
-              <el-table-column label="操作" align="center">
-                <template slot="header" slot-scope="scope" >
-                  <el-tooltip effect="light" placement="top" content="团队配置">
-                    <el-button type="primary" size="mini" circle icon="el-icon-setting" @click="editTeam"></el-button>
-                  </el-tooltip>
-                  <el-tooltip effect="light" placement="top" content="添加团队积分">
-                    <el-button type="success" size="mini" circle icon="el-icon-folder-add" @click="addTeamPoint"></el-button>
-                  </el-tooltip>
-                  <el-tooltip effect="light" placement="top" content="团队积分列表">
-                    <el-button type="info" size="mini" circle icon="el-icon-document" @click="clickShowPoint" ></el-button>
-                  </el-tooltip>
-<!--                  <el-button type="primary" size="mini" round @click="editTeam">团队配置</el-button>-->
-<!--                  <el-button type="primary" size="mini" round>添加积分</el-button>-->
-<!--                  <el-button type="primary" size="mini" round>团队积分</el-button>-->
-                </template>
-                <template slot-scope="scope">
-                  <el-button @click="dropEmployee(team.id,scope.row.id,scope.row.name)" size="medium" type="danger" >移除出团队</el-button>
-                </template>
-              </el-table-column>
-            </el-table>
+            
+              <el-card v-if="currentDoc.teams" style="width: 100%; height: 60px; display: flex; align-items: center; justify-content: flex-start; margin-bottom: 20px;">
+                <el-tooltip effect="light" placement="top" content="团队配置">
+                  <el-button type="primary" size="small"  icon="el-icon-setting" @click="editTeam">团队配置</el-button>
+                </el-tooltip>
+                <el-tooltip effect="light" placement="top" content="添加团队积分">
+                  <el-button type="success" size="small"  icon="el-icon-folder-add" @click="addTeamPoint">添加团队积分</el-button>
+                </el-tooltip>
+                <el-tooltip effect="light" placement="top" content="团队积分列表">
+                  <el-button type="info" size="small"  icon="el-icon-document" @click="clickShowPoint" >团队积分列表</el-button>
+                </el-tooltip>
+              </el-card>
+
+              <div v-if="activeTeam === index.toString()" style="display: flex; height: calc(100% - 60px);  flex-wrap: wrap; " >
+
+                <div style="width: 200px; height: 80px; margin: 0 20px 20px 0;"  v-for="(item, index) in team.employees" :key="index">
+                  <div class="bsItem flex-box-ce" style="width: 100%; height: 100%;">
+                    <userImage class="fl" :id="item.id" :user_name="item.name" :img_url="item.img_url" width="50px" height="50px"></userImage>
+                    <div style="margin-left: 10px;">
+                      <b style="color:#303133;font-size:16px;"><span>{{ item.name }}</span></b>
+                      <br />
+                      <el-tooltip effect="light" placement="top" :content="item.dept_list">
+                        <span style="color:#606266;font-size:12px;display: inline-block; margin-top:8px;">
+                          {{ item.dept_list | handleDeptList }}
+                        </span>
+                      </el-tooltip>
+                      
+                    </div>
+                    <i class="el-icon-close" @click="dropEmployee(team.id, item.id, item.name)"></i>
+                  </div>
+                </div>
+
+              </div>
+              <div v-if="!currentDoc || currentDoc.teams.length === 0">
+                <NoData></NoData>
+              </div>
           </el-tab-pane>
         </el-tabs>
-        <div v-if="!currentDoc || currentDoc.teams.length === 0"><NoData></NoData></div>
-      </div>
+        
+      
     </div>
 
 <!--  创建/编辑档案  -->
-    <el-dialog :title="isUpdateDoc ? 'PK配置': '创建PK配置' " width="700px" top="10vh" :visible.sync="showDoc" :close-on-click-modal="false" >
+    <el-dialog :title="isUpdateDoc ? 'PK配置': '创建PK配置' " width="700px" center :visible.sync="showDoc" :close-on-click-modal="false" >
       <el-form ref="docForm" :model="docForm" :rules="docFormValidateRules" label-width="100px" @submit.native.prevent style="margin: 0 auto;">
         <el-form-item label="PK名" prop="name" :required="true">
           <el-input v-model="docForm.name" maxlength="10" auto-complete="off" show-word-limit placeholder="请输入PK名" ></el-input>
@@ -114,14 +149,14 @@
     </el-dialog>
 
 <!--  创建编辑团队  -->
-    <el-dialog :title="isUpdateTeam ? '团队配置' : '添加团队'" width="700px" top="10vh" :visible.sync="showTeam" :close-on-click-modal="false" >
+    <el-dialog :title="isUpdateTeam ? '团队配置' : '添加团队'" width="700px" center  :visible.sync="showTeam" :close-on-click-modal="false" >
       <el-form ref="teamForm" :model="teamForm" :rules="teamFormValidateRules" label-width="100px" @submit.native.prevent style="margin: 0 auto;" >
         <el-form-item label="团队名" prop="name" :required="true">
           <el-input v-model="teamForm.name" maxlength="10" auto-complete="off" show-word-limit placeholder="请输入团队名" ></el-input>
         </el-form-item>
         <el-form-item label="参与人员" >
           <div class="cursor" style="border-radius: 4px;border: 1px solid #dcdfe6;line-height: 34px;width: 400px;padding: 0 15px;" @click="showEmployeeSelect">
-            <div class="flex-box-ce fontColorB font-flex-word" v-if="employees_selected.employee.length>0">
+            <div class="flex-box-ce fontColorB font-flex-word" v-if="employees_selected.employee.length > 0">
               <span v-for="item in employees_selected.employee" :key="item.id"> {{item.name}},</span>
             </div>
             <div v-else style="color: #C0C4CF;">请选择参与人员</div>
@@ -136,7 +171,7 @@
     </el-dialog>
 
 <!--  添加团队积分  -->
-    <el-dialog title="添加团队积分" width="700px" top="10vh" :visible.sync="showAddPoint" :close-on-click-modal="false" >
+    <el-dialog title="添加团队积分" width="700px" center  :visible.sync="showAddPoint" :close-on-click-modal="false" >
       <el-form ref="pointForm" :model="pointForm" :rules="pointFormValidateRules" label-width="100px" @submit.native.prevent style="margin: 0 auto;">
         <el-form-item label="积分" prop="point" :required="true">
           <el-input-number v-model="pointForm.point" :min="-999999" :max="999999" ></el-input-number>
@@ -165,7 +200,7 @@
       </el-form>
     </el-dialog>
 
-    <el-dialog title="团队积分列表" width="700px" top="10vh" :visible.sync="showPoint" :close-on-click-modal="false" >
+    <el-dialog title="团队积分列表" width="700px" center :visible.sync="showPoint" :close-on-click-modal="false" >
       <el-form :inline="true" @submit.native.prevent >
         <el-date-picker
           v-model="pointSearchDateScope"
@@ -235,7 +270,7 @@ export default {
       showEmployeeSelector: false,
       docForm:{
         docId:0,
-        name:'',
+        name:'',  
         ptId:3,
         ruleType:1,
         rules:[],
@@ -305,6 +340,17 @@ export default {
       }
     }
   },
+  filters: {
+    handleDeptList(v) {
+      if(v) {
+        let arr = v.split(" ");
+        if(arr.length == 1) return arr[0]
+        else return arr[0] + ",共 " + (arr.length - 1) + " 个部门"
+      }else {
+        return "暂无部门"
+      }
+    }
+  },
   methods: {
     initDocForm(){
       this.docForm.docId = 0;
@@ -399,14 +445,14 @@ export default {
     },
     //获取分类规则
     get_rule_trees() {
-      let params = {pt_id:3,cycle_type:1};
+      let params = {pt_id:3, cycle_type: 1};
       this.$axiosUser('get', '/api/pro/integral/rule/trees', params).then(res => {
         this.rule_list = this.getTreeData(res.data.data.rule_tree);
         this.rule_tree = this.flatten(res.data.data.rule_tree);
       })
     },
     // 递归判断列表,把最后的child设为undefined
-    getTreeData(data) {
+    getTreeData(data) { 
       for (var i = 0; i < data.length; i++) {
         if (data[i].child.length < 1) {
           // child若为空数组,则将child设为undefined
@@ -434,6 +480,7 @@ export default {
     activeRouter(index, indexPath){
       this.menuActive = index.toString();
     },
+
     //加载右边内容页
     refreshContent(doc){
       if (!doc || !doc.id) return;
@@ -711,11 +758,11 @@ export default {
           })
       })
     },
+    //初始化积分列表时间区间
     initPointSearchDateRange(){
-      //初始化积分列表时间区间
-      const pkStartData = new Date();
-      const pkEndData = new Date();
-      pkStartData.setTime(pkStartData.getTime() - 3600 * 1000 * 24 * 30);
+      const pkStartData = new Date(); // 开始时间
+      const pkEndData = new Date(); // 结束时间
+      pkStartData.setTime(pkStartData.getTime() - 3600 * 1000 * 24 * 30); // 格式转换
       this.pointSearchDateScope[0] = this.$moment(pkStartData).format('YYYY-MM-DD');
       this.pointSearchDateScope[1] = this.$moment(pkEndData).format('YYYY-MM-DD');
       this.pointSearchForm.timeScope = this.pointSearchDateScope;
@@ -791,36 +838,122 @@ export default {
 </script>
 
 <style scoped lang="scss">
-.diy_tip_bg {
-  background: #f5f6f9;
-  overflow: hidden;
-  .diy-tip {
-    margin-bottom: 10px;
-    border: 1px solid #67c23a;
+.container {
+  width: 100%;
+  height: 100%; 
+  position: relative; 
+  display: flex; 
+  background-color: white;
+  /* 提示框 */ 
+  .diy_tip_bg {
+    width: 500px;
+    height: 200px;
+    position: absolute;
+    top: 0;
+    right: 0;
+    z-index: 99;
     padding: 20px 16px;
-    p {
-      color: #67c23a !important;
-      font-size: 15px;
-      margin: 0 !important;
-      padding-bottom: 4px;
+    box-sizing: border-box;
+    .diy-tip {
+      border: 1px solid #67c23a;
+      p {
+        color: #67c23a !important;
+        font-size: 15px;
+        margin: 0 !important;
+        padding-bottom: 4px;
+      }
+      .headLi {
+        padding: 4px;
+        list-style: disc;
+        font-size: 14px;
+      }
     }
   }
+
+  /* 左边配置列表 */ 
+  .left{
+    width: 15%; 
+    height: 100%; 
+    position: relative;
+    .left-btn-box {
+      width: 100%; 
+      height: 80px; 
+      display: flex; 
+      align-items: center; 
+      justify-content: center;
+      border-right: 1px solid #ccc;
+    }
+  }
+  /* 右边配置详情 */ 
+  .right {
+    width: 85%; 
+    height: 100%; 
+    background-color: white;
+    .tabs {
+      width: 100%;
+      height: 100%;
+      .tab-item {
+        width: 100%;
+        height: 100%;
+        background-color: #67c23a;
+      }
+    }
+    
+  }
 }
-.headLi {
-  padding: 4px;
-  list-style: disc;
-  font-size: 14px;
+
+.bsItem {
+  width: 100%;
+  height: 80px;
+  background-color: #ecf5ff;
+  border-radius: 5px;
+  cursor: pointer;
+  padding:  12px;
+  margin-bottom: 20px;
+  box-sizing: border-box;
+  position: relative;
+  .el-icon-close {
+    color: #409eff;
+    position: absolute;
+    top: 10px;
+    right: 10px;
+  }
 }
 
-.left{
-  padding:10px;
-  overflow: auto;
-  max-height: 800px;
+
+
+
+
+/deep/ .el-tabs__content {
+  width: 100%;
+  height: calc(100% - 40px);
+  overflow: hidden;
+  overflow-y: scroll;
 }
 
-.boxMinHeight{
-  background-color: #fff;
+/deep/ .el-tabs__content::-webkit-scrollbar{
+	// 直接修改样式就可以了
+	width:1px;
 }
+// 	滚动条
+::-webkit-scrollbar {
+  width: 40px;
+  background-color: red;
+}
+// 滚动条轨道
+::-webkit-scrollbar-track {
+  width: 40px;
+  border-radius: 40px;
+  background-color: blue;
+}
+// 滚动条滑块
+::-webkit-scrollbar-thumb {
+  border: 5px solid #000;
+  border-radius: 40px;
+  background-color: rgb(53, 53, 26);
+}
+
+
 
 .inputBox {
   height: 36px;

+ 917 - 0
src/point/views/setting/pk222.vue

@@ -0,0 +1,917 @@
+<template>
+  <div class="container" >
+    <!--规则提示-->
+    <div class="diy_tip_bg">
+      <el-alert class="diy-tip" type="success" :closable="true">
+        <p><b>团队PK通过自定义PK配置、团队参与人员等。在相同积分规则内对团队进行积分对比</b></p>
+        <p><b>团队配置流程</b></p>
+        <li class="headLi">指定PK在哪些积分规则分类或者积分规则内有效,只针对B分</li>
+        <li class="headLi">创建团队,指定参与者</li>
+        <p><b>团队积分构成</b></p>
+        <li class="headLi">团队参与者在团队配置中积分规则内的积分总和</li>
+        <li class="headLi">单独向团队录入的积分</li>
+      </el-alert>
+    </div>
+    <!--规则提示-->
+    <!-- 左边,配置列表 -->
+    <div class="left" v-loading="menuLoading" style="">
+      <div class="left-btn-box">
+        <el-button type="primary" @click="addDoc" v-if="!manageAble">创建PK配置</el-button>
+      </div>
+      <el-scrollbar class="scroll-bar" style="width: 100%; height: calc(100% - 80px);">
+        <el-menu v-if="docList.length > 0" :default-active="menuActive"  @select="activeRouter"  style="width: 100%; height: 100%;">
+          <el-menu-item v-for="(item, index) in docList" :key="index" :index="index.toString()" @click="refreshContent(item)">
+            <span slot="title">{{item.name}}</span>
+          </el-menu-item>
+        </el-menu>
+        <div v-if="docList.length == 0"><NoData></NoData></div>
+      </el-scrollbar>
+    </div>
+    <!-- 左边,配置列表 -->
+
+    <!-- 右边配置详情 -->
+    <div class="right">
+      
+        <div style="width: 100%; height: 80px; ">
+          <el-row style="margin-left: 20px; " v-if="currentDoc">
+            <el-col :span="10" style="display: block; font-size: 20px; line-height: 40px; color: rgb(48,49,51); vertical-align: middle" >
+              <h4>{{currentDoc.name}}</h4>
+            </el-col>
+          </el-row>
+          <div style="margin-bottom: 20px; margin-left: 20px;" >
+            <el-button v-if="currentDoc" type="primary" size="small" @click="editDoc">PK配置</el-button>
+            <el-button v-if="currentDoc" type="primary" size="small" @click="addTeam">新增团队</el-button>
+          </div>
+        </div>
+        <div style="width: 100%; height: calc(100% - 80px); background-color: palevioletred;">
+          <el-scrollbar class="scroll-bar" style="width: 100%; height: 100%;">
+            <div class="tabs" v-if=" currentDoc && currentDoc.teams.length > 0 ">
+              <div class="tab-item" v-for="(team,index) in currentDoc.teams" :key="index">
+                <div class="team-name">{{ team.name }}</div>
+                <div class="team-emply">
+                  <div v-for="(item, index) in team.employees" :key="index">
+                    {{ item.name }}
+                    <userImage class="fl" :id="item.id" :user_name="item.name" :img_url="item.img_url" width="50px" height="50px"></userImage>
+                    <span style="line-height: 50px; padding-left: 10px;">{{item.name }}</span>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </el-scrollbar>
+        </div>
+        <!-- <el-tabs class="scroll-bar" style="width: 100%; height: calc(100% - 100px); " v-if=" currentDoc && currentDoc.teams.length > 0 " v-model="activeTeam"  type="border-card" closable @tab-remove="removeTeam" v-loading="contentLoading">
+          <el-tab-pane style="width: 100%; height: 100%; background: pink;" v-for="(team,index) in currentDoc.teams" :key="index" :name="index.toString()" :label="team.name" >
+            <el-table :data="team.employees" v-if="activeTeam === index.toString()"> 
+              <el-table-column label="员工" align="left" width="200">
+                <template slot-scope="scope">
+                  <userImage class="fl" :id="scope.row.id" :user_name="scope.row.name" :img_url="scope.row.img_url" width="50px" height="50px"></userImage>
+                  <span style="line-height: 50px; padding-left: 10px;">{{ scope.row.name }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="部门" prop="dept_list" align="center"></el-table-column>
+              <el-table-column label="操作" align="center">
+                <template slot="header" slot-scope="scope" >
+                  <el-tooltip effect="light" placement="top" content="团队配置">
+                    <el-button type="primary" size="mini" circle icon="el-icon-setting" @click="editTeam"></el-button>
+                  </el-tooltip>
+                  <el-tooltip effect="light" placement="top" content="添加团队积分">
+                    <el-button type="success" size="mini" circle icon="el-icon-folder-add" @click="addTeamPoint"></el-button>
+                  </el-tooltip>
+                  <el-tooltip effect="light" placement="top" content="团队积分列表">
+                    <el-button type="info" size="mini" circle icon="el-icon-document" @click="clickShowPoint" ></el-button>
+                  </el-tooltip>
+                </template>
+                <template slot-scope="scope">
+                  <el-button @click="dropEmployee(team.id,scope.row.id,scope.row.name)" size="medium" type="danger" >移除出团队</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-tab-pane>
+        </el-tabs> -->
+        <div v-if="!currentDoc || currentDoc.teams.length === 0"><NoData></NoData></div>
+      
+    </div>
+
+<!--  创建/编辑档案  -->
+    <el-dialog :title="isUpdateDoc ? 'PK配置': '创建PK配置' " width="700px" top="10vh" :visible.sync="showDoc" :close-on-click-modal="false" >
+      <el-form ref="docForm" :model="docForm" :rules="docFormValidateRules" label-width="100px" @submit.native.prevent style="margin: 0 auto;">
+        <el-form-item label="PK名" prop="name" :required="true">
+          <el-input v-model="docForm.name" maxlength="10" auto-complete="off" show-word-limit placeholder="请输入PK名" ></el-input>
+        </el-form-item>
+        <el-form-item label="积分规则" :required="true" >
+          <el-select v-model="docForm.ruleType" style="margin-bottom: 6px;width: 400px;" >
+            <el-option label="全部" :value="1"></el-option>
+            <el-option label="指定规则分类" :value="2"></el-option>
+            <el-option label="指定规则" :value="3"></el-option>
+          </el-select>
+
+          <el-cascader
+            style="width: 400px;"
+            v-if="docForm.ruleType == 2"
+            v-model="rule_list_value"
+            ref="ruleCascader"
+            :show-all-levels="false"
+            filterable
+            :options="rule_list"
+            :props="{children:'child',label: 'name',value: 'id', checkStrictly: true,multiple: true}"
+          ></el-cascader>
+
+          <div v-if="docForm.ruleType == 3" style="position: relative;"  >
+            <div class="inputBox" @click="showItem = true">
+              <span v-if="selectItem.length > 0">已选择了{{selectItem.length}}条</span>
+              <span v-else style="color: #909399;">请选择</span>
+            </div>
+          </div>
+          <div>
+            <span v-if="docForm.ruleType==1">统计全部积分事件,不包含基础分和工龄分</span>
+            <span v-if="docForm.ruleType==2">包含指定规则分类的积分,不包含基础分和工龄分</span>
+            <span v-if="docForm.ruleType==3">按已指定的积分规则进行积分统计并排名,不包含基础分和工龄分</span>
+          </div>
+        </el-form-item>
+      </el-form>
+      <div class="flex-box-ce">
+        <el-button type="danger" v-if="isUpdateDoc" :loading="commitLoading" @click="deleteDoc">删 除</el-button>
+        <div class="flex-1"></div>
+        <el-button type="primary"  :loading="commitLoading" @click="commitDocForm('docForm')" >提 交</el-button>
+      </div>
+
+    </el-dialog>
+
+<!--  创建编辑团队  -->
+    <el-dialog :title="isUpdateTeam ? '团队配置' : '添加团队'" width="700px" top="10vh" :visible.sync="showTeam" :close-on-click-modal="false" >
+      <el-form ref="teamForm" :model="teamForm" :rules="teamFormValidateRules" label-width="100px" @submit.native.prevent style="margin: 0 auto;" >
+        <el-form-item label="团队名" prop="name" :required="true">
+          <el-input v-model="teamForm.name" maxlength="10" auto-complete="off" show-word-limit placeholder="请输入团队名" ></el-input>
+        </el-form-item>
+        <el-form-item label="参与人员" >
+          <div class="cursor" style="border-radius: 4px;border: 1px solid #dcdfe6;line-height: 34px;width: 400px;padding: 0 15px;" @click="showEmployeeSelect">
+            <div class="flex-box-ce fontColorB font-flex-word" v-if="employees_selected.employee.length>0">
+              <span v-for="item in employees_selected.employee" :key="item.id"> {{item.name}},</span>
+            </div>
+            <div v-else style="color: #C0C4CF;">请选择参与人员</div>
+          </div>
+        </el-form-item>
+      </el-form>
+      <div class="flex-box-ce">
+        <el-button type="danger" v-if="isUpdateTeam" :loading="commitLoading" @click="deleteTeam">删 除</el-button>
+        <div class="flex-1"></div>
+        <el-button type="primary"  :loading="commitLoading" @click="commitTeamForm('teamForm')" >提 交</el-button>
+      </div>
+    </el-dialog>
+
+<!--  添加团队积分  -->
+    <el-dialog title="添加团队积分" width="700px" top="10vh" :visible.sync="showAddPoint" :close-on-click-modal="false" >
+      <el-form ref="pointForm" :model="pointForm" :rules="pointFormValidateRules" label-width="100px" @submit.native.prevent style="margin: 0 auto;">
+        <el-form-item label="积分" prop="point" :required="true">
+          <el-input-number v-model="pointForm.point" :min="-999999" :max="999999" ></el-input-number>
+        </el-form-item>
+        <el-form-item label="日期" prop="date" :required="true">
+          <el-date-picker
+            v-model="pointForm.date"
+            type="date"
+            value-format="yyyy-MM-dd"
+          ></el-date-picker>
+        </el-form-item>
+        <el-form-item label="说明" prop="remark" >
+          <el-input
+            placeholder="积分说明"
+            type="textarea"
+            v-model="pointForm.remark"
+            maxlength="100"
+            rows="4"
+            show-word-limit
+            clearable></el-input>
+        </el-form-item>
+        <div class="flex-box-ce">
+          <div class="flex-1"></div>
+          <el-button type="primary"  :loading="commitLoading" @click="commitPointForm('pointForm')" >提 交</el-button>
+        </div>
+      </el-form>
+    </el-dialog>
+
+    <el-dialog title="团队积分列表" width="700px" top="10vh" :visible.sync="showPoint" :close-on-click-modal="false" >
+      <el-form :inline="true" @submit.native.prevent >
+        <el-date-picker
+          v-model="pointSearchDateScope"
+          type="daterange"
+          align="right"
+          unlink-panels
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          value-format="yyyy-MM-dd"
+          editable
+          :clearable="false"
+        ></el-date-picker>
+      </el-form>
+      <el-table :data="pointListData.list" style="width: 100%" v-loading="pointListLoading" >
+        <el-table-column label="积分" align="center" prop="point"></el-table-column>
+        <el-table-column label="日期" align="center" prop="date"></el-table-column>
+        <el-table-column label="说明" align="center" prop="remark"></el-table-column>
+        <template slot="empty">
+          <NoData></NoData>
+        </template>
+      </el-table>
+      <el-pagination
+        @current-change="handlePointPageChange"
+        :current-page="pointSearchForm.page"
+        :page-size="pointSearchForm.pageSize"
+        :total="pointListData.total"
+      ></el-pagination>
+    </el-dialog>
+
+    <EmployeeSelector
+      title="选择成员"
+      :selected="employees_selected"
+      :close_clear_data="false"
+      :visible.sync="showEmployeeSelector"
+      @confirm="move_employee_confirm"
+      :isChecKedAll="true"
+      :max="0"
+    />
+
+    <SelectRule :isAll="true" :visible.sync="showItem" @confirm="ruleConfirm" :ptId="docForm.ptId" :selectItems="selectItem"></SelectRule>
+  </div>
+
+</template>
+
+
+<script>
+import SelectRule from "@/components/SelectRule.vue";
+import EmployeeSelector from "@/components/EmployeeSelector.vue";
+import Template from "../../../examine/components/Template.vue";
+export default {
+  components: {Template, SelectRule,EmployeeSelector},
+  data(){
+    return {
+      manageAble: this.$supremeAuthority('dept_manager') || this.$supremeAuthority('employee'),
+      menuActive: '0',
+      menuLoading: false,
+      contentLoading: false,
+      currentDoc: null,
+      currentTeam: null,
+      activeTeam: "0",
+      docList: [],
+      isUpdateDoc: false,
+      isUpdateTeam: false,
+      showDoc: false,
+      showTeam: false,
+      showEmployeeSelector: false,
+      docForm:{
+        docId:0,
+        name:'',
+        ptId:3,
+        ruleType:1,
+        rules:[],
+        items:[],
+      },
+      docFormValidateRules:{
+        name: [
+          {required: true,message:'请输入PK名'},
+          { min: 3, max: 10, message: '长度在 3 到 10 个字符'}
+        ]
+      },
+      teamFormValidateRules:{
+        name: [
+          {required: true,message:'请输入团队名'},
+          { min: 3, max: 10, message: '长度在 3 到 10 个字符'}
+        ]
+      },
+      // 规则分类
+      rule_list: [],
+      rule_tree:[],
+      rule_list_value:[],
+      showItem:false,
+      selectItem:[],
+      commitLoading:false,
+      teamForm:{
+        docId:0,
+        teamId:0,
+        name:"",
+        employees:[]
+      },
+      employees_selected: { employee: [], dept: [] },
+      showAddPoint:false,
+      showPoint:false,
+      pointForm:{
+        teamId:0,
+        teamName:'',
+        point:0,
+        date:"",
+        remark:""
+      },
+      pointFormValidateRules:{
+        point:[
+          {type:'integer'},
+          {required:true,message:"必须填写积分"},
+        ],
+        remark:[
+          {type:'string'},
+          {min:0,max:100,message:"最多100个字符"}
+        ],
+        date:[
+          {type:'string'},
+          {required:true,message:'积分日期必须填写'}
+        ]
+      },
+      pointSearchDateScope:[],
+      pointSearchForm:{
+        timeScope:[],
+        teamId:0,
+        docId:0,
+        page:1,
+        pageSize:10
+      },
+      pointListLoading:false,
+      pointListData:{
+        list:[],
+        total:0
+      }
+    }
+  },
+  methods: {
+    initDocForm(){
+      this.docForm.docId = 0;
+      this.docForm.name = '';
+      this.docForm.ruletype = 1;
+      this.docForm.rules = [];
+      this.docForm.items = [];
+      this.selectItem = [];
+      this.rule_list_value = [];
+    },
+    initTeamForm(){
+      this.teamForm.docId = this.currentDoc.id;
+      this.teamForm.teamId = 0;
+      this.teamForm.name = '';
+      this.teamForm.employees = [];
+      this.employees_selected = { employee: [], dept: [] };
+    },
+    initPointForm(){
+      this.pointForm.teamName = '';
+      this.pointForm.point = 0;
+      this.pointForm.teamId = 0;
+      this.pointForm.remark = '';
+      this.pointForm.date = '';
+    },
+    initPointListData(){
+      this.pointListData = {
+        list:[],
+        total:0
+      }
+    },
+    addDoc(){
+      //封装表单数据
+      this.initDocForm()
+
+      //打开表单弹窗
+      this.isUpdateDoc = false;
+      this.showDoc = true;
+    },
+    editDoc(){
+      //封装表单数据
+      this.docForm.docId = this.currentDoc.id;
+      this.docForm.name = this.currentDoc.name;
+      if (this.currentDoc.items.length > 0){
+        this.docForm.ruleType = 3;
+        this.docForm.rules = [];
+        this.docForm.items = this.currentDoc.items.map(e => e.id)
+        this.selectItem = this.currentDoc.items.map(e => {
+          return {
+            id:e.id,
+            remark:e.name
+          }
+        })
+      }else if (this.currentDoc.rules.length > 0){
+        this.docForm.ruleType = 2;
+        this.docForm.items = [];
+        this.docForm.rules = this.currentDoc.rules.map(e => e.id)
+        let rule_list_value = [];
+        if(this.currentDoc.rules.length > 0){
+          this.docForm.rules.forEach(id => {
+            let arr = [];
+            this.returnRuleVal(id,arr);
+            rule_list_value.push(arr);
+            this.rule_list_value = rule_list_value;
+          })
+        }
+      }else {
+        this.docForm.ruleType = 1;
+        this.docForm.rules = [];
+        this.docForm.rules = [];
+        this.selectItem = [];
+        this.rule_list_value = [];
+      }
+      //打开表单弹窗
+      this.isUpdateDoc = true;
+      this.showDoc = true;
+    },
+    deleteDoc(){
+      this.$confirm('确认删除当前配置吗?','删除PK配置',{confirmButtonText:'确定',cancelButtonText:'取消',type:"warning"}).then(() => {
+          this.commitDeleteDoc();
+      })
+    },
+    getDocList(){
+      this.menuLoading = true;
+      this.$axiosUser('get','/api/pro/pk/doc/list').then(res => {
+         this.docList = res.data.data.list;
+         if(this.docList.length > 0 && !this.currentDoc){
+           this.refreshContent(this.docList[this.menuActive]);
+         }
+      }).finally(()=>{
+        this.menuLoading = false;
+      })
+    },
+    //获取分类规则
+    get_rule_trees() {
+      let params = {pt_id:3, cycle_type: 1};
+      this.$axiosUser('get', '/api/pro/integral/rule/trees', params).then(res => {
+        this.rule_list = this.getTreeData(res.data.data.rule_tree);
+        this.rule_tree = this.flatten(res.data.data.rule_tree);
+      })
+    },
+    // 递归判断列表,把最后的child设为undefined
+    getTreeData(data) { 
+      for (var i = 0; i < data.length; i++) {
+        if (data[i].child.length < 1) {
+          // child若为空数组,则将child设为undefined
+          data[i].child = undefined;
+        } else {
+          // child若不为空数组,则继续 递归调用 本方法
+          this.getTreeData(data[i].child);
+        }
+      }
+      return data;
+    },
+    flatten(arr) {
+      return arr.reduce((result, item) => {
+        return result.concat(item, Array.isArray(item.child) ? this.flatten(item.child) : []);
+      }, []);
+    },
+    returnRuleVal(rule_id,arr){
+      arr.unshift(rule_id)
+      let list = this.rule_tree.filter(x => x.id == rule_id)
+      if(list[0]&&list[0].pid != 0){
+        this.returnRuleVal(list[0].pid,arr)
+      }
+      return arr;
+    },
+    activeRouter(index, indexPath){
+      this.menuActive = index.toString();
+    },
+
+    //加载右边内容页
+    refreshContent(doc){
+      if (!doc || !doc.id) return;
+      this.currentTeam = null;
+      this.currentDoc = null;
+      this.contentLoading = true;
+      this.$axiosUser('get','/api/pro/pk/doc/info',{doc_id:doc.id})
+        .then(res => {
+          this.currentDoc = res.data.data;
+          this.activeTeam = "0";    //只能在这里设置不能在开头初始化
+          if (this.currentDoc.teams.length > 0) this.currentTeam = this.currentDoc.teams[0];
+        })
+        .finally(() => {
+          this.contentLoading = false;
+        })
+    },
+    addTeam(){
+      //封装表单数据
+      this.initTeamForm();
+      //打开表单弹窗
+      this.isUpdateTeam = false;
+      this.showTeam = true;
+    },
+    editTeam(){
+      //封装表单数据
+      this.teamForm.docId = this.currentDoc.id;
+      this.teamForm.teamId = this.currentTeam.id;
+      this.teamForm.name = this.currentTeam.name;
+      this.teamForm.employees = this.currentTeam.employees.map(e => e.id);
+      this.employees_selected.employee = this.currentTeam.employees;
+
+      //打开表单弹窗
+      this.isUpdateTeam = true;
+      this.showTeam = true;
+    },
+    deleteTeam(){
+      this.$confirm('确认删除当前团队吗?','删除团队',{
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.commitDeleteTeam(this.teamForm.teamId);
+      })
+    },
+    removeTeam(i){
+      if (this.currentDoc.teams.length < i) return;
+      let team = this.currentDoc.teams[i];
+      let message = '确认删除团队<<' + team.name + '>>吗?';
+      this.$confirm(message,'删除团队',{
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.commitDeleteTeam(team.id)
+      })
+    },
+    commitDeleteTeam(teamId){
+      this.commitLoading = true;
+      this.$axiosUser('POST','/api/pro/pk/team/d',{team_id:teamId})
+        .then(res => {
+          this.$message.success(res.data.msg);
+          this.isUpdateTeam = false;
+          this.showTeam = false;
+          this.initTeamForm();
+          this.refreshContent(this.currentDoc);
+        })
+        .finally(() => {
+          this.commitLoading = false;
+        })
+    },
+    dropEmployee(teamId,employeeId,employeeName){
+      let message = "确认将<<" + employeeName + ">>移出团队吗?"
+      this.$confirm(message,"移出团队",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"})
+        .then(() => {
+          this.commitDeleteEmployee(teamId,employeeId);
+        })
+    },
+    //选择规则
+    ruleConfirm(rules) {
+      if (rules.length > 0) {
+        this.docForm.items = rules.map(e=> e.id);
+      } else {
+        this.docForm.items = [];
+      }
+      this.selectItem = rules;
+    },
+    commitDocForm(formName) {
+      this.$refs[formName].validate(valid => {
+        if (!valid) return;
+        if (this.isUpdateDoc){
+          this.commitUpdateDoc();
+        }else{
+          this.commitCreateDoc();
+        }
+      })
+    },
+    commitCreateDoc(){
+      let params = {
+        name:this.docForm.name,
+        rules:[],
+        items:[]
+      };
+      if (this.docForm.docId > 0){
+        this.$message.error("表单状态异常");
+        return;
+      }
+      if(this.docForm.ruleType === 2) {
+        if (this.docForm.rules.length === 0){
+          this.$message.error("选择规则分类");
+          return;
+        }
+        params.rules = this.docForm.rules;
+      }else if(this.docForm.ruleType === 3){
+        if (this.docForm.items.length === 0){
+          this.$message.error("请选择规则");
+          return;
+        }
+        params.items = this.docForm.items;
+      }
+
+      this.commitLoading = true
+      this.$axiosUser('POST','/api/pro/pk/doc/c',params).then(res => {
+          this.$message.success(res.data.msg);
+          this.showDoc = false;
+          this.initDocForm();
+          this.getDocList();
+      })
+        .finally(() => {
+          this.commitLoading = false
+        });
+    },
+    commitUpdateDoc(){
+      let params = {
+        doc_id:this.docForm.docId,
+        name:this.docForm.name,
+        rules:[],
+        items:[]
+      }
+      if (this.docForm.docId <= 0){
+        this.$message.error("表单状态异常");
+        return;
+      }
+      if(this.docForm.ruleType === 2) {
+        if (this.docForm.rules.length === 0){
+          this.$message.error("选择规则分类");
+          return;
+        }
+        params.rules = this.docForm.rules;
+      }else if(this.docForm.ruleType === 3){
+        if (this.docForm.items.length === 0){
+          this.$message.error("请选择规则");
+          return;
+        }
+        params.items = this.docForm.items;
+      }
+      this.commitLoading = true
+      this.$axiosUser('POST','/api/pro/pk/doc/e',params).then(res => {
+        this.$message.success(res.data.msg);
+        this.showDoc = false;
+        this.currentDoc = null; //触发当前文档数据刷新,更新右边界面
+        this.initDocForm();
+        this.getDocList();
+      })
+        .finally(() => {
+          this.commitLoading = false
+        });
+
+    },
+    // 选人组件提交
+    move_employee_confirm(data) {
+      this.teamForm.employees = data.employee.map(element => {
+        return element.id
+      });
+      this.employees_selected.employee = data.employee;
+    },
+    showEmployeeSelect(){
+      this.showEmployeeSelector = true;
+    },
+    commitTeamForm(formName){
+      this.$refs[formName].validate(valid => {
+        if (!valid) return;
+        if (this.isUpdateTeam){
+          this.commitUpdateTeam();
+        }else {
+          this.commitCreateTeam();
+        }
+      })
+    },
+    commitUpdateTeam(){
+      let params = {
+        team_id:this.teamForm.teamId,
+        name:this.teamForm.name,
+        employees:this.teamForm.employees
+      }
+
+      this.commitLoading = true;
+      this.$axiosUser('POST','/api/pro/pk/team/e',params).then(res => {
+        this.$message.success(res.data.msg);
+        this.showTeam = false;
+        this.initTeamForm();
+        this.refreshContent(this.currentDoc)
+      })
+        .finally(() => {
+          this.commitLoading = false
+        });
+    },
+    commitCreateTeam(){
+      let params = {
+        doc_id: this.teamForm.docId,
+        name: this.teamForm.name,
+        employees:this.teamForm.employees
+      }
+
+      this.$axiosUser('POST','/api/pro/pk/team/c',params).then(res => {
+        this.$message.success(res.data.msg);
+        this.showTeam = false;
+        this.initTeamForm();
+        this.refreshContent(this.currentDoc)
+      })
+        .finally(() =>{
+          this.commitLoading = false
+        });
+    },
+    commitDeleteEmployee(teamId,employeeId){
+      this.commitLoading = true;
+      this.$axiosUser('POST','/api/pro/pk/team/employee/d',{team_id:teamId,employee_id:employeeId})
+        .then(res => {
+          this.$message.success(res.data.msg);
+          this.refreshContent(this.currentDoc);
+        })
+        .finally(()=>{
+          this.commitLoading = false
+        })
+    },
+    commitDeleteDoc(){
+      this.commitLoading = true;
+      this.$axiosUser('POST','/api/pro/pk/doc/d',{doc_id:this.currentDoc.id})
+        .then(res => {
+          this.$message.success(res.data.msg);
+          this.showDoc = false;
+          this.currentDoc = null;
+          this.currentTeam = null;
+          this.initDocForm();
+          this.getDocList();
+        })
+        .finally(() => {
+          this.commitLoading = false;
+        })
+    },
+    addTeamPoint(){
+      this.pointForm.teamId = this.currentTeam.id;
+      this.pointForm.teamName = this.currentTeam.name;
+      this.showAddPoint = true;
+      this.pointForm.date = this.$moment(new Date()).format('YYYY-MM-DD');
+    },
+    commitPointForm(formName){
+      this.$refs[formName].validate(valid => {
+        if (!valid) return;
+        this.commitLoading = true;
+        let params = {
+          team_id: this.pointForm.teamId,
+          point: this.pointForm.point,
+          date: this.pointForm.date,
+          remark: this.pointForm.remark
+        }
+
+        this.$axiosUser('POST','/api/pro/pk/team/point',params)
+          .then(res => {
+            this.$message.success(res.data.msg);
+            this.showAddPoint = false;
+            this.initPointForm();
+          })
+          .finally(()=>{
+            this.commitLoading = false;
+          })
+      })
+    },
+    //初始化积分列表时间区间
+    initPointSearchDateRange(){
+      const pkStartData = new Date(); // 开始时间
+      const pkEndData = new Date(); // 结束时间
+      pkStartData.setTime(pkStartData.getTime() - 3600 * 1000 * 24 * 30); // 格式转换
+      this.pointSearchDateScope[0] = this.$moment(pkStartData).format('YYYY-MM-DD');
+      this.pointSearchDateScope[1] = this.$moment(pkEndData).format('YYYY-MM-DD');
+      this.pointSearchForm.timeScope = this.pointSearchDateScope;
+    },
+    initPointSearchForm(){
+      this.initPointSearchDateRange();
+      this.pointSearchForm.teamId = this.currentTeam.id;
+      this.pointSearchForm.docId = this.currentDoc.id;
+      this.pointSearchForm.page = 1;
+      this.pointSearchForm.pageSize = 10;
+    },
+    handlePointPageChange(page){
+      this.pointSearchForm.page = page;
+      this.getPointList();
+    },
+    getPointList(){
+      if (this.pointSearchForm.teamId === 0 || this.pointSearchForm.docId === 0 || !this.pointSearchForm.timeScope || this.pointSearchForm.timeScope.length !== 2) {
+        this.initPointListData();
+        return;
+      }
+      this.pointListLoading = true;
+      let params = {
+        doc_id: this.pointSearchForm.docId,
+        team_id: this.pointSearchForm.teamId,
+        page: this.pointSearchForm.page,
+        page_size: this.pointSearchForm.pageSize,
+        start_date: this.pointSearchForm.timeScope[0],
+        end_date: this.pointSearchForm.timeScope[1]
+      }
+      this.$axiosUser('get','/api/pro/pk/team/point/list',params)
+        .then(res => {
+          this.pointListData = res.data.data;
+        })
+        .finally(()=>{
+          this.pointListLoading = false;
+        })
+    },
+    clickShowPoint(){
+      //初始化积分搜索数据
+      this.initPointSearchForm();
+      this.getPointList();
+      this.showPoint = true;
+    }
+
+
+  },
+  created() {
+    this.get_rule_trees();
+
+  },
+  watch:{
+    activeTeam(value){
+      this.currentTeam = this.currentDoc.teams.length > value ? this.currentDoc.teams[value] : null;
+    },
+    rule_list_value(val){
+      if(val.length > 0){
+        this.docForm.rules = val.map(e => e[e.length - 1]);
+      }else {
+        this.docForm.rules = [];
+      }
+    },
+    pointSearchDateScope(val){
+      this.pointSearchForm.timeScope = val ? val : [];
+      this.getPointList();
+    }
+  },
+  mounted() {
+    this.getDocList();
+  }
+
+}
+
+</script>
+
+<style scoped lang="scss">
+.container {
+  width: 100%;
+  height: 100%; 
+  position: relative; 
+  display: flex; 
+  background-color: white;
+  /* 提示框 */ 
+  .diy_tip_bg {
+    width: 500px;
+    height: 200px;
+    position: absolute;
+    top: 0;
+    right: 0;
+    z-index: 99;
+    padding: 20px 16px;
+    box-sizing: border-box;
+    .diy-tip {
+      border: 1px solid #67c23a;
+      p {
+        color: #67c23a !important;
+        font-size: 15px;
+        margin: 0 !important;
+        padding-bottom: 4px;
+      }
+      .headLi {
+        padding: 4px;
+        list-style: disc;
+        font-size: 14px;
+      }
+    }
+  }
+
+  /* 左边配置列表 */ 
+  .left{
+    width: 15%; 
+    height: 100%; 
+    position: relative;
+    .left-btn-box {
+      width: 100%; 
+      height: 80px; 
+      display: flex; 
+      align-items: center; 
+      justify-content: center;
+      border-right: 1px solid #ccc;
+    }
+  }
+  /* 右边配置详情 */ 
+  .right {
+    width: 85%; 
+    height: 100%; 
+    background-color: white;
+    .tabs {
+      width: 100%;
+      height: 100%;
+      .tab-item {
+        width: 100%;
+        height: 60px;
+        background-color: #67c23a;
+      }
+    }
+    
+  }
+}
+
+.bsItem{
+  background-color: #ecf5ff;
+  border-radius: 5px;
+  margin: 0px 5px;
+  cursor: pointer;
+  padding: 12px;
+}
+
+
+
+
+
+.inputBox {
+  height: 36px;
+  line-height: 36px;
+  padding-right: 30px;
+  -webkit-appearance: none;
+  background-color: #fff;
+  background-image: none;
+  border-radius: 4px;
+  border: 1px solid #dcdfe6;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+  color: #606266;
+  display: inline-block;
+  font-size: inherit;
+  width: 400px;
+  outline: 0;
+  padding: 0 15px;
+  cursor: pointer;
+  -webkit-transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
+  transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+
+</style>

+ 14 - 14
src/router/performanceRouter.js

@@ -57,7 +57,7 @@ const routes = [
           role: ['masterAdministrator', 'childAdministrator'],
           jurisdiction: [13,14]
         },
-        label: '考核模板'
+        label: '考核表设置'
       },
       {
         path: '/assessManagement',
@@ -69,20 +69,20 @@ const routes = [
           role: ['masterAdministrator', 'childAdministrator', 'deptManager'],
           jurisdiction: [7, 8, 9, 10, 11]
         },
-        label: '考核列表'
-      },
-      {
-        path: '/IndexSet',
-        name: 'IndexSet',
-        icon: '#icon-tongxunlu_tianjiabumen',
-        component: () => import('@/performance/views/assessManagement/IndexSet'),
-        meta: {
-          groupCode: 'assessManagement',
-          role: ['masterAdministrator', 'childAdministrator'],
-          jurisdiction: [12]
-        },
-        label: '考核指标库'
+        label: '考核明细'
       },
+      // {
+      //   path: '/IndexSet',
+      //   name: 'IndexSet',
+      //   icon: '#icon-tongxunlu_tianjiabumen',
+      //   component: () => import('@/performance/views/assessManagement/IndexSet'),
+      //   meta: {
+      //     groupCode: 'assessManagement',
+      //     role: ['masterAdministrator', 'childAdministrator'],
+      //     jurisdiction: [12]
+      //   },
+      //   label: '考核指标库'
+      // },
       // 绩效报表
       {
         path: '/analyse',

+ 9 - 9
src/utils/axiosKc.js

@@ -5,7 +5,7 @@ import {
 } from 'element-ui'
 import store from '@/store'
 import Router from '@/router'
-import {  getCourseId } from '@/utils/auth'
+import { getCourseId } from '@/utils/auth'
 import {
   getLocal,
   removeAllToken
@@ -14,10 +14,10 @@ import qs from 'qs'
 import Vue from 'vue'
 const service = axios.create({
   // baseURL: process.env.BASE_API,
-  baseURL:'https://oa.g107.com',
+  baseURL: 'https://oa.g107.com',
   // baseURL:'https://3g954g5149.picp.vip',
   // baseURL:'http://192.168.0.66:8081',
-  
+
   timeout: 20000,
   headers: {
     'Content-Type': 'application/x-www-form-urlencoded',
@@ -106,14 +106,14 @@ service.interceptors.response.use(
     } else {
       console.log('不执行')
     }
-     return Promise.reject(error)
+    return Promise.reject(error)
   }
 )
 // 接口再次封装
 var CancelToken = axios.CancelToken // 中断请求
 Vue.$axiosUserRequestList = []
-export default (type, url, data, versions, Content_Type, transform,isToken) => {
-  if(!getCourseId()){
+export default (type, url, data, versions, Content_Type, transform, isToken) => {
+  if (!getCourseId()) {
     console.log('同浏览器下公道云8.0PC退出登录导致课程营销系统报错:系统异常')
     // return false
   }
@@ -147,8 +147,8 @@ export default (type, url, data, versions, Content_Type, transform,isToken) => {
   if (getLocal('Course-Token')) {
     Token = getLocal('Course-Token');
   }
-  if(isToken){
-    Token=isToken
+  if (isToken) {
+    Token = isToken
   }
   return new Promise((resolve, reject) => { // 封装ajax
     var aa = {
@@ -157,7 +157,7 @@ export default (type, url, data, versions, Content_Type, transform,isToken) => {
       headers: {
         'Accept': Accept,
         'Content-Type': ContentType,
-        'A-TOKEN':Token
+        'A-TOKEN': Token
       },
       cancelToken: new CancelToken(c => { // 强行中断请求要用到的
         Vue.$axiosUserRequestList.push(c)

+ 4 - 4
src/utils/axiosKq.js

@@ -3,17 +3,17 @@ import store from '@/store'
 import Router from '@/router'
 import qs from 'qs'
 import Vue from 'vue'
-import {getToken,removeAllToken} from '@/utils/auth'
-import {Message,MessageBox} from 'element-ui'
+import { getToken, removeAllToken } from '@/utils/auth'
+import { Message, MessageBox } from 'element-ui'
 const setJoken = axios.create({
   baseURL: process.env.SERVE_AD,
   timeout: 20000,
   headers: {
     'Content-Type': 'application/x-www-form-urlencoded',
     "Cache-Control": 'no-cache',
-    'pl':'b'
+    'pl': 'b'
   },
-  transformRequest: [function(data) {
+  transformRequest: [function (data) {
     return qs.stringify(data)
   }]
 })

+ 3 - 3
src/utils/axiosUpload.js

@@ -19,9 +19,9 @@ const service = axios.create({
   headers: {
     'Content-Type': 'application/x-www-form-urlencoded',
     // "Cache-Control": 'no-cache',
-    'pl':'b'
+    'pl': 'b'
   },
-  transformRequest: [function(data) {
+  transformRequest: [function (data) {
     return qs.stringify(data)
   }]
 })
@@ -71,7 +71,7 @@ service.interceptors.response.use(
         setTimeout(() => {
           bool = true
         }, 5000)
-      } else {}
+      } else { }
       return Promise.reject(response)
     } else if (res.code === 2001) {
       Message({

+ 3 - 3
src/utils/axiosUser.js

@@ -19,9 +19,9 @@ const service = axios.create({
   headers: {
     'Content-Type': 'application/x-www-form-urlencoded',
     "Cache-Control": 'no-cache',
-    'pl':'b'
+    'pl': 'b'
   },
-  transformRequest: [function(data) {
+  transformRequest: [function (data) {
     return qs.stringify(data)
   }]
 })
@@ -71,7 +71,7 @@ service.interceptors.response.use(
         setTimeout(() => {
           bool = true
         }, 5000)
-      } else {}
+      } else { }
       return Promise.reject(response)
     } else if (res.code === 2001) {
       Message({

+ 23 - 17
src/views/deptRankSwiper.vue

@@ -14,28 +14,21 @@
           </div>
           <div class="title" v-if="types == 2" :style="'color:' + color2">
             <div>{{ companyName }}</div>
-            <span>{{ deptName }} &nbsp;{{ month }}&nbsp;{{ formData.position == 'all' ? '' : formData.position == 'manager' ? '管理者' : formData.position == 'employee' ? '员工' : ''}}积分排名
+            <span>{{ deptName }} &nbsp;{{ month }}&nbsp;{{ formData.position == 'all' ? '' : formData.position ==
+              'manager' ? '管理者' : formData.position == 'employee' ? '员工' : ''}}积分排名
             </span>
             <p>最后更新时间:{{ lastTime }}</p>
           </div>
           <div class="title" v-if="types == 3" :style="'color:' + color2">
             <div>{{ companyName }}</div>
             <span>
-              {{ deptName }} &nbsp;{{ formData.position == 'all' ? '' : formData.position == 'manager' ? '管理者' : formData.position == 'employee' ? '员工' : '' }}累计B分排名
+              {{ deptName }} &nbsp;{{ formData.position == 'all' ? '' : formData.position == 'manager' ? '管理者' :
+                formData.position == 'employee' ? '员工' : '' }}累计B分排名
             </span>
             <p>最后更新时间:{{ lastTime }}</p>
           </div>
-          <marquee
-            style="height: calc(100vh - 106px);"
-            scrollamount="2"
-            scrolldelay="60"
-            loop="-1"
-            truespeed
-            align="middle"
-            behavior="scroll"
-            direction="up"
-            onbounce="MaqueeBounceFun"
-          >
+          <marquee style="height: calc(100vh - 106px);" scrollamount="2" scrolldelay="60" loop="-1" truespeed
+            align="middle" behavior="scroll" direction="up" onbounce="MaqueeBounceFun">
             <div v-show="types == 2">
               <el-row v-for="(item, index) in list" :key="index" class="row" :style="'color:' + color2">
                 <el-col class="list_name" :span="4">{{ item.rank }}</el-col>
@@ -48,7 +41,8 @@
               <el-row v-for="(item, index) in list" :key="index" class="row">
                 <el-col :span="4">
                   <center>
-                    <userImage :id="item.employee_id" :user_name="item.employee_name" :img_url="item.employee_img_url" fontSize="26" width="80px" height="80px"></userImage>
+                    <userImage :id="item.employee_id" :user_name="item.employee_name" :img_url="item.employee_img_url"
+                      fontSize="26" width="80px" height="80px"></userImage>
                   </center>
                 </el-col>
                 <el-col :span="20">
@@ -56,7 +50,8 @@
                     <el-row>
                       <el-col :span="8" :style="'color:' + color2">{{ item.employee_name }}</el-col>
                       <el-col :span="16">
-                        <span style="margin-left: 30px;" :class="item.point > 0 ? 'color_red' : 'color_green'">{{ item.point > 0 ? '+' + item.point : item.point }}分</span>
+                        <span style="margin-left: 30px;" :class="item.point > 0 ? 'color_red' : 'color_green'">{{
+                          item.point > 0 ? '+' + item.point : item.point }}分</span>
                       </el-col>
                     </el-row>
                   </p>
@@ -171,13 +166,13 @@ export default {
     this.types = this.$route.query.types;
     this.$route.query.month ? (this.month = moment(this.$route.query.month).format('YYYY年MM月')) : '';
     this.$route.query.dept_id ? this.getDeptName(this.$route.query.dept_id) : '';
-    this.companyName=this.$route.query.companyName? this.$route.query.companyName:this.$getCache('site_info').name
+    this.companyName = this.$route.query.companyName ? this.$route.query.companyName : this.$getCache('site_info').name
     this.getData();
     setInterval(() => {
       this.getData();
     }, parseInt(Math.random() * (1800000 - 1200000 + 1) + 1200000, 10));
   },
-  created() {}
+  created() { }
 };
 </script>
 
@@ -186,30 +181,38 @@ export default {
   color: #fff;
   height: 100vh;
   font-size: 3rem;
+
   .title {
     font-size: 40px;
     text-align: center;
     margin: 20px 0;
+
     p {
       font-size: 16px;
     }
+
     span {
       font-size: 30px;
     }
   }
+
   .row {
     margin-bottom: 0.6em;
+
     .el-col-10 {
       overflow: hidden;
       white-space: nowrap;
       text-overflow: ellipsis;
     }
+
     .list_name {
       text-align: center;
     }
+
     .point {
       text-align: center;
     }
+
     .integralDetails {
       font-size: 0.6em;
       margin: 0;
@@ -219,6 +222,7 @@ export default {
       -webkit-line-clamp: 2;
       -webkit-box-orient: vertical;
     }
+
     .integralPersonnel {
       font-size: 0.8em;
       margin: 0;
@@ -226,9 +230,11 @@ export default {
     }
   }
 }
+
 .color_red {
   color: red;
 }
+
 .color_green {
   color: green;
 }

BIN
static/images/gs1.jpg


BIN
static/images/gs1.png


BIN
static/images/gs2.jpg


BIN
static/images/gs2.png


BIN
static/images/gs3.jpg


BIN
static/images/gs3.png


BIN
static/images/gs4.jpg


Некоторые файлы не были показаны из-за большого количества измененных файлов