瀏覽代碼

Merge branch 'purchaseDev' of http://172.16.100.139/new-business/drp-web into purchaseDev

002390 1 年之前
父節點
當前提交
f5269aeda8

+ 19 - 0
src/api/business/ehr/pm/adjustlog.js

@@ -0,0 +1,19 @@
+import request from '@/utils/request'
+
+// 查询调整记录列表
+export function listAdjustlog(query) {
+  return request({
+    url: '/ehr/pm/adjustlog/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 新增阶段控制
+export function addAdjustlog(data) {
+  return request({
+    url: '/ehr/pm/adjustlog',
+    method: 'post',
+    data: data
+  })
+}

+ 3 - 12
src/api/business/ehr/pm/gradeadjust.js

@@ -26,19 +26,10 @@ export function getGradeAdjustConut() {
   })
 }
 
-// 保存绩效
-export function savePm(data) {
+// 调整完成
+export function adjustFinish(data) {
   return request({
-    url: '/ehr/pm/gradeAdjust/savePm',
-    method: 'post',
-    data: data
-  })
-}
-
-// 保存流程
-export function saveFlow(data) {
-  return request({
-    url: '/ehr/pm/gradeAdjust/saveFlow',
+    url: '/ehr/pm/gradeAdjust/adjustFinish',
     method: 'post',
     data: data
   })

+ 45 - 50
src/views/business/ehr/pm/adjustGrade/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
     <div slot="header" class="clearfix">
-      <span style="font-weight:bold">等级调整</span>
+      <span style="font-weight:bold">分数调整</span>
       <div style="float: right; padding: 3px 0" type="text">
         <el-button type="primary" size="mini" :loading="loading" @click="btnAdjustMark" v-if="flow.status == 0">调整完成</el-button>
         <el-button size="mini" plain @click="btnBack">返回</el-button>
@@ -16,23 +16,15 @@
         <el-table-column label="权重" align="center" prop="weight" />
         <el-table-column label="自评分" align="center" prop="saMark" />
         <el-table-column label="上级评分" align="center" prop="ldMark" />
-        <el-table-column label="调整分" align="center" prop="ajMark" />
-        <el-table-column label="调整分等级" align="center" prop="ajGrade" />
-        <el-table-column width="150" label="最终等级" align="center" prop="grade">
+        <el-table-column label="调整后分数" align="center" prop="ajaMark" />
+        <el-table-column width="100" label="调整分" align="center" prop="ajMark" v-if="flow.status == 0">
           <template slot-scope="scope">
-            <el-select v-model="scope.row.grade" size="mini">
-              <el-option
-                v-for="dict in ehr_pm_gradeconfig"
-                :key="dict.name"
-                :label="dict.name"
-                :value="dict.name"
-              ></el-option>
-            </el-select>
+            <el-input size="mini" type="number" v-model="scope.row.ajMark" v-only-number="{max:100,min:-100,precision:1}" @input="ajMarkChange(scope.row)"/>
           </template>
         </el-table-column>
-        <el-table-column width="300" label="调整原因" align="center" prop="cause">
+        <el-table-column width="200" label="调整原因" align="center" prop="ajCause" v-if="flow.status == 0">
           <template slot-scope="scope">
-            <el-input v-model="scope.row.cause" size="mini"></el-input>
+            <el-input size="mini" v-model="scope.row.ajCause"/>
           </template>
         </el-table-column>
       </el-table>
@@ -41,9 +33,8 @@
 </template>
 
 <script>
-import { listPerformance,savePm,saveFlow} from "@/api/business/ehr/pm/gradeadjust";
-import { getGradeconfig} from "@/api/business/ehr/pm/gradeconfig";
-import { getFlow} from "@/api/business/ehr/pm/flow";
+import { listPerformance,adjustFinish} from "@/api/business/ehr/pm/gradeadjust";
+import { getFlow} from "@/api/business/ehr/pm/flow"
 
 export default {
   name: "AdjustGrade",
@@ -65,17 +56,12 @@ export default {
         sourceId: null,
         staffName: null,
       },
-      //等级配置数据
-      ehr_pm_gradeconfig:[],
       //流程数据
       flow:{},
     };
   },
   created() {
     this.queryParams.sourceId = this.$route.query.id;
-    getGradeconfig(this.$route.query.gradeconfigId).then(response => {
-      this.ehr_pm_gradeconfig = response.data.gradeconfigItem;
-    });
     this.fetchFlow(this.$route.query.flowId);
     this.getList();
   },
@@ -84,6 +70,7 @@ export default {
     getList() {
       this.loading = true;
       listPerformance(this.queryParams).then(response => {
+        response.rows.forEach(function(element) { element.ajaMark = element.mark});
         this.listData = response.rows;
         this.total = response.total;
         this.loading = false;
@@ -91,34 +78,38 @@ export default {
     },
     //调整分数
     async btnAdjustMark(){
-      this.$confirm("确认提交吗?", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "info",
-        beforeClose: async (action, instance,done) => {
-          if (action === "confirm") {
-            instance.confirmButtonLoading = true;
-            instance.confirmButtonText = "执行中...";
-            try {
-              await savePm(this.listData);
-              const { msg, code } = await saveFlow(this.flow);
-              if (code === 200) {
-                this.$modal.msgSuccess("调整完成");
-                await this.fetchPerformance(this.id);
-              }
-            } catch (err) {
-              console.error(err);
-              instance.confirmButtonText = "确认";
-            } finally {
-              instance.confirmButtonLoading = false;
-              done();
-            }
-          }else{
-            done();
-          }
-        },
-      }).then(() => {})
-      .catch(() => {});
+      let arr = this.listData.filter(ele => ele.ajMark);
+      let v = false;
+      arr.forEach(function(element) {
+        if(element.ajMark && !element.ajCause){
+          v = true;
+        }
+      });
+      if(v){
+        this.$modal.msgWarning("调整分数后,必须填写调整原因!");
+        return;
+      }
+      arr.forEach(function(element) {
+        element.performanceId = element.id;
+        element.id = null;
+      });
+      let that = this;
+      this.$modal.confirm('确认提交吗?').then(async function() {
+        that.loading = true;
+        let data = {
+          adjustLog: arr,
+          flow: that.flow
+        }
+        return await adjustFinish(data);
+      }).then(() => {
+        that.fetchFlow(that.flow.id).then(response => {
+          this.$forceUpdate();
+        });
+        that.$modal.msgSuccess("调整完成");
+        that.loading = false;
+      }).catch(() => {
+        that.loading = false;
+      });
     },
     //查询流程
     async fetchFlow(id){
@@ -130,6 +121,10 @@ export default {
     btnBack(){
       this.$router.back();
     },
+    //调整分改变后
+    ajMarkChange(row){
+      row.ajaMark = Number(row.mark)+Number(row.ajMark || 0);
+    }
   }
 };
 </script>

+ 76 - 16
src/views/business/ehr/pm/adjustMark/index.vue

@@ -21,6 +21,19 @@
         </el-form-item>
       </el-form>
       <div style="float:right">
+        <el-button-group>
+          <el-dropdown @command="btnImport">
+            <el-button type="primary" size="mini">
+              导入<i class="el-icon-arrow-down el-icon--right"></i>
+            </el-button>
+            <el-dropdown-menu slot="dropdown">
+              <el-button size="mini" type="primary" @click="useImportTemplate">模板下载</el-button>
+              <el-upload ref="upload" action="" :http-request="onUpload">
+                <el-button size="mini" type="primary">数据导入</el-button>
+              </el-upload>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </el-button-group>
       </div>
       <el-table size="mini" height="500px" v-loading="loading" :data="listData">
         <el-table-column label="编号" align="center" prop="id" />
@@ -30,14 +43,13 @@
         <el-table-column label="权重" align="center" prop="weight" />
         <el-table-column label="自评分" align="center" prop="saMark" />
         <el-table-column label="上级评分" align="center" prop="ldMark" />
-        <el-table-column label="调整分" align="center" prop="ajMark" />
-        <el-table-column label="调整分等级" align="center" prop="ajGrade" />
+        <el-table-column label="调整后分数" align="center" prop="mark" />
         <el-table-column label="操作" fixed="right" align="center" class-name="small-padding fixed-width">
           <template slot-scope="scope">
             <el-button
               size="mini"
               type="text"
-              icon="el-icon-search"
+              icon="el-icon-edit"
               @click="btnAdjustMark(scope.row)"
             >调整</el-button>
           </template>
@@ -60,20 +72,14 @@
         <el-descriptions-item label="员工姓名">{{form.staffName}}</el-descriptions-item>
         <el-descriptions-item label="自评分">{{form.saMark}}</el-descriptions-item>
         <el-descriptions-item label="上级评分">{{form.ldMark}}</el-descriptions-item>
+        <el-descriptions-item label="调整后分数">{{ajaMark}}</el-descriptions-item>
       </el-descriptions>
-      <el-form size="mini" label-position="right" ref="form" :model="form" :rules="formRules" label-width="80px">
+      <el-form size="mini" label-position="right" ref="form" :model="adjustlogForm" :rules="formRules" label-width="80px">
         <el-form-item label="调整分" prop="ajMark">
-          <el-input 
-            v-model.number="form.ajMark"
-            onkeyup="value=value.replace(/[^\d||/.]/g,'')"
-            oninput="if(value){value=value.replace(/[^\d]/g,'')} if(value<=0){value=0} if(value>100){value=100}"
-            :maxlength="3"
-            :minlength="1"
-          >
-          </el-input>
+          <el-input size="mini" type="number" v-model="adjustlogForm.ajMark" v-only-number="{max:100,min:-100,precision:1}"/>
         </el-form-item>
         <el-form-item label="调整原因" prop="ajCause">
-          <el-input v-model="form.ajCause"></el-input>
+          <el-input v-model="adjustlogForm.ajCause"></el-input>
         </el-form-item>
       </el-form>
       <span slot="footer" class="dialog-footer">
@@ -85,7 +91,8 @@
 </template>
 
 <script>
-import { listMarkAdjust,getPerformance,updatePerformance} from "@/api/business/ehr/pm/markadjust";
+import { listMarkAdjust,getPerformance} from "@/api/business/ehr/pm/markadjust";
+import { addAdjustlog} from "@/api/business/ehr/pm/adjustlog";
 
 export default {
   name: "AdjustMark",
@@ -100,8 +107,10 @@ export default {
       total: 0,
       // 表格数据
       listData: [],
-      //表单数据
+      //绩效表单数据
       form:{},
+      //调整记录表单数据
+      adjustlogForm:{},
       //是否显示行明细弹出层
       formOpen:false,
       //当行明细校验规则
@@ -128,6 +137,15 @@ export default {
       rowId: '',
     };
   },
+  computed: {
+    //调整后分数
+    ajaMark: function () {
+      console.log('this.form.mark',this.form.mark);
+      console.log('this.adjustlogForm.ajMark',this.adjustlogForm.ajMark);
+      console.log(this.form.mark - this.adjustlogForm.ajMark);
+      return Number(this.form.mark)+Number(this.adjustlogForm.ajMark || 0);
+    },
+	},
   created() {
     this.queryParams.sourceId = this.$route.params.id;
     this.getList();
@@ -168,13 +186,16 @@ export default {
     },
     //取消
     btnClose(){
+      this.form = {};
+      this.adjustlogForm = {};
       this.formOpen = false;
     },
     //确定
     btnConfirm(){
       this.$refs["form"].validate(valid => {
         if (valid) {
-          updatePerformance(this.form).then(response => {
+          this.adjustlogForm.performanceId = this.form.id;
+          addAdjustlog(this.adjustlogForm).then(response => {
             this.$modal.msgSuccess("保存成功");
             this.formOpen = false;
             this.getList();
@@ -186,6 +207,45 @@ export default {
     btnBack(){
       this.$router.back();
     },
+    //导入按钮
+    btnImport(command){
+      if(command == 'useImportTemplate'){
+        this.useImportTemplate();
+      }
+      if(command == 'useImportData'){
+        this.useImportData();
+      }
+    },
+    //模板下载
+    useImportTemplate(){
+      this.download('pu/allot/importTemplate', {
+      }, `分数调整导入模板_${new Date().getTime()}.xlsx`)
+    },
+    //导入
+    useImportData(){
+      console.log("导入");
+    },
+    // 上传文件
+    onUpload (file) {
+      this.loading = true;
+      let formData = new FormData()
+      formData.append('file',file.file)
+      importData(formData).then((res) => {
+        console.log('res',res);
+        if(res.code == '200'){
+          this.$message.success(res.msg);
+        }else{
+          this.$message.success(res.msg);
+        }
+      }).catch((e) => {
+        console.log('e',e);
+        this.$message.error(e.message)
+      }).finally((e) => {
+        this.$refs['upload'].clearFiles();
+        this.resetList();
+        this.loading = false;
+      })
+    },
   }
 };
 </script>

+ 122 - 101
src/views/business/ehr/pm/mark/detail.vue

@@ -6,77 +6,85 @@
         <div style="float: right; padding: 3px 0" type="text">
           <el-button size="mini" plain @click="btnBack">返回</el-button>
           <el-button size="mini" plain @click="btnTurnDown(1)" v-if="flow.status == 0">驳回</el-button>
-          <el-button size="mini" type="primary" plain @click="btnverify(2)" v-if="flow.status == 0">提交</el-button>
+          <el-button size="mini" type="primary" plain @click="btnverify" v-if="flow.status == 0">提交</el-button>
         </div>
       </div>
       <div v-loading="loading">
-        <el-descriptions :column="6 ">
-          <el-descriptions-item label="员工编号">{{form.staff}}</el-descriptions-item>
-          <el-descriptions-item label="员工姓名">{{form.staffName}}</el-descriptions-item>
-          <el-descriptions-item label="入职日期">{{form.dateJoin}}</el-descriptions-item>
-          <el-descriptions-item label="转正日期">{{form.probationComplete}}</el-descriptions-item>
-          <el-descriptions-item label="部门">{{form.deptName}}</el-descriptions-item>
-          <el-descriptions-item label="职位">{{form.jobName}}</el-descriptions-item>
-          <el-descriptions-item label="评估周期">{{form.name}}</el-descriptions-item>
-          <el-descriptions-item label="评估人">{{form.evaluatorName}}</el-descriptions-item>
-          <el-descriptions-item label="所属分组">
-            <div v-for="dict in dict.type.ehr_pm_group" v-if="form.staffDivide == dict.value">
-              <div>{{ dict.label }}</div>
-            </div>
-          </el-descriptions-item>
-        </el-descriptions>
-        <el-descriptions v-if="form.status > 3">
-          <el-descriptions-item label="个人总结">{{form.summary}}</el-descriptions-item>
-        </el-descriptions>
-        <el-descriptions v-if="form.status > 4">
-          <el-descriptions-item label="评语">{{form.comment}}</el-descriptions-item>
-        </el-descriptions>
-        <div>
-          评语*<el-input type="textarea" v-model="form.comment"></el-input>
-        </div>
-        <!-- <div style="float:right">
-          <el-button size="mini" @click="btnUnfold">{{isUnfold == true ? "收起" : "展开"}}</el-button>
-        </div> -->
-        <el-table size="mini"  :data="form.performanceItem" show-summary :summary-method="getSummaries" border>
-          <el-table-column type="index" width="50" label="序号"/>
-          <el-table-column width="100" :show-overflow-tooltip="!isUnfold" label="评估方面" align="center" prop="aspect">
-            <template slot-scope="scope">
-              <dict-tag :options="dict.type.ehr_pm_aspect" :value="scope.row.aspect"/>
-            </template>
-          </el-table-column>
-          <el-table-column width="100" :show-overflow-tooltip="!isUnfold" label="评估指标" align="center" prop="target" />
-          <el-table-column width="80" label="权重" align="center" prop="weight"/>
-          <el-table-column :show-overflow-tooltip="!isUnfold" label="指标说明" align="center" prop="instructions">
-            <template slot-scope="scope">
-              <div style="white-space: pre-wrap;text-align: left">{{scope.row.instructions}}</div>
-            </template>
-          </el-table-column>
-          <!-- <el-table-column width="100" label="角色" align="center" prop="role">
-            <template slot-scope="scope">
-              <dict-tag :options="dict.type.ehr_pm_role" :value="scope.row.role"/>
-            </template>
-          </el-table-column> -->
-          <el-table-column :show-overflow-tooltip="!isUnfold" label="评分标准" align="center" prop="standard">
-            <template slot-scope="scope">
-              <div style="white-space: pre-wrap;text-align: left">{{scope.row.standard}}</div>
-            </template>
-          </el-table-column>
-          <el-table-column width="100" label="数据来源" align="center" prop="source" />
-          <el-table-column width="80" label="自评分" align="center" prop="selfScoring"/>
-          <el-table-column :show-overflow-tooltip="!isUnfold" label="自评语" align="center" prop="selfComment"/>
-          <el-table-column width="80" label="上级评分" align="center" prop="leaderScoring" v-if="flow.status != 0"/>
-          <el-table-column :show-overflow-tooltip="!isUnfold" label="上级评语" align="center" prop="leaderComment" v-if="flow.status != 0"/>
-          <el-table-column width="80" label="上级评分*" align="center" prop="leaderScoring" v-if="flow.status == 0">
-            <template slot-scope="scope">
-              <el-input  v-model="scope.row.leaderScoring" v-only-number="{max:saMarkMax,min:0,precision:1}" size="mini"/>
-            </template>
-          </el-table-column>
-          <el-table-column :show-overflow-tooltip="!isUnfold" label="上级评语*" align="center" prop="leaderComment" v-if="flow.status == 0">
-            <template slot-scope="scope">
-              <el-input size="mini" type="textarea" v-model="scope.row.leaderComment"></el-input>
-            </template>
-          </el-table-column>
-        </el-table>
+        <el-form size="mini" ref="dataForm" :model="form" :rules="rules">
+          <el-descriptions :column="6 ">
+            <el-descriptions-item label="员工编号">{{form.staff}}</el-descriptions-item>
+            <el-descriptions-item label="员工姓名">{{form.staffName}}</el-descriptions-item>
+            <el-descriptions-item label="入职日期">{{form.dateJoin}}</el-descriptions-item>
+            <el-descriptions-item label="转正日期">{{form.probationComplete}}</el-descriptions-item>
+            <el-descriptions-item label="部门">{{form.deptName}}</el-descriptions-item>
+            <el-descriptions-item label="职位">{{form.jobName}}</el-descriptions-item>
+            <el-descriptions-item label="评估周期">{{form.name}}</el-descriptions-item>
+            <el-descriptions-item label="评估人">{{form.evaluatorName}}</el-descriptions-item>
+            <el-descriptions-item label="所属分组">
+              <div v-for="dict in dict.type.ehr_pm_group" v-if="form.staffDivide == dict.value">
+                <div>{{ dict.label }}</div>
+              </div>
+            </el-descriptions-item>
+          </el-descriptions>
+          <el-descriptions v-if="form.status > 3">
+            <el-descriptions-item label="个人总结">{{form.summary}}</el-descriptions-item>
+          </el-descriptions>
+          <el-descriptions v-if="form.status > 4">
+            <el-descriptions-item label="评语">{{form.comment}}</el-descriptions-item>
+          </el-descriptions>
+          <div>
+            <el-form-item label="评语" prop="comment">
+              <el-input type="textarea" v-model="form.comment"></el-input>
+            </el-form-item>
+          </div>
+          <!-- <div style="float:right">
+            <el-button size="mini" @click="btnUnfold">{{isUnfold == true ? "收起" : "展开"}}</el-button>
+          </div> -->
+          <el-table size="mini"  :data="form.performanceItem" show-summary :summary-method="getSummaries" border>
+            <el-table-column type="index" width="50" label="序号"/>
+            <el-table-column width="100" :show-overflow-tooltip="!isUnfold" label="评估方面" align="center" prop="aspect">
+              <template slot-scope="scope">
+                <dict-tag :options="dict.type.ehr_pm_aspect" :value="scope.row.aspect"/>
+              </template>
+            </el-table-column>
+            <el-table-column width="100" :show-overflow-tooltip="!isUnfold" label="评估指标" align="center" prop="target" />
+            <el-table-column width="80" label="权重" align="center" prop="weight"/>
+            <el-table-column :show-overflow-tooltip="!isUnfold" label="指标说明" align="center" prop="instructions">
+              <template slot-scope="scope">
+                <div style="white-space: pre-wrap;text-align: left">{{scope.row.instructions}}</div>
+              </template>
+            </el-table-column>
+            <!-- <el-table-column width="100" label="角色" align="center" prop="role">
+              <template slot-scope="scope">
+                <dict-tag :options="dict.type.ehr_pm_role" :value="scope.row.role"/>
+              </template>
+            </el-table-column> -->
+            <el-table-column :show-overflow-tooltip="!isUnfold" label="评分标准" align="center" prop="standard">
+              <template slot-scope="scope">
+                <div style="white-space: pre-wrap;text-align: left">{{scope.row.standard}}</div>
+              </template>
+            </el-table-column>
+            <el-table-column width="100" label="数据来源" align="center" prop="source" />
+            <el-table-column width="80" label="自评分" align="center" prop="selfScoring"/>
+            <el-table-column :show-overflow-tooltip="!isUnfold" label="自评语" align="center" prop="selfComment"/>
+            <el-table-column width="80" label="上级评分" align="center" prop="leaderScoring" v-if="flow.status != 0"/>
+            <el-table-column :show-overflow-tooltip="!isUnfold" label="上级评语" align="center" prop="leaderComment" v-if="flow.status != 0"/>
+            <el-table-column width="85" label="上级评分" align="center" prop="leaderScoring" :render-header="addRedStar" v-if="flow.status == 0">
+              <template slot-scope="scope">
+                <el-form-item :prop="'performanceItem.'+scope.$index+'.leaderScoring'" :rules="{required: true,message: ' ',trigger: 'blur'}">
+                  <el-input  v-model="scope.row.leaderScoring" v-only-number="{max:saMarkMax,min:0,precision:1}" size="mini"/>
+                </el-form-item>
+              </template>
+            </el-table-column>
+            <el-table-column :show-overflow-tooltip="!isUnfold" label="上级评语" align="center" prop="leaderComment" :render-header="addRedStar" v-if="flow.status == 0">
+              <template slot-scope="scope">
+                <el-form-item :prop="'performanceItem.'+scope.$index+'.leaderComment'" :rules="{required: true,message: ' ',trigger: 'blur'}">
+                  <el-input size="mini" type="textarea" v-model="scope.row.leaderComment"/>
+                </el-form-item>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-form>
       </div>
     </el-card>
 
@@ -111,6 +119,12 @@ export default {
       form:{},
       //流程数据
       flow:{},
+      //提交规则
+      rules:{
+        comment: [
+          { required: true, message: " ", trigger: "blur" },
+        ],
+      },
       //流程数据规则
       flowRules:{
         result: [
@@ -175,51 +189,58 @@ export default {
       this.turnDownOpen = false;
     },
     //驳回确认
-    btnTurnDownConfirm(){
-      this.$refs["flow"].validate(valid => {
+    async btnTurnDownConfirm(){
+      this.$refs["flow"].validate(async valid => {
         if (valid) {
-          this.btnverify(1);
+          //保存绩效数据
+          savePerformance(this.form);
           this.turnDownOpen = false;
+          this.flow.status = 1;
+          //保存流程数据
+          await superiorevaluation(this.flow).then(res => {
+            if (res.code === 200) {
+              this.fetchPerformance(this.$route.query.performanceId);
+              this.fetchFlow(this.$route.query.flowId);
+              this.$modal.msgSuccess("已确认");
+            }
+          })
         }
       });
     },
     //评写完成
-    async btnverify(val){
-      if(val == 2){
-        let v = false;
-        this.form.performanceItem.forEach((item) => {
-          if((!item.leaderScoring && item.leaderScoring != 0) || !item.leaderComment){
-            v = true;
-          }
-        });
-        if(v){
-          this.$modal.msgWarning("请填写明细评分、评语后再提交!");
-          return;
-        }
-        if(!this.form.comment){
-          this.$modal.msgWarning("请填写评语后再提交!");
-          return;
-        }
-      }
-      //保存绩效数据
-      let r = await savePerformance(this.form);
-      this.flow.status = val;
-      if(this.flow.status == 2){
-        this.flow.result = "已评分";
-      }
-      await superiorevaluation(this.flow).then(res => {
-        if (res.code === 200) {
-          this.fetchPerformance(this.$route.query.performanceId);
-          this.fetchFlow(this.$route.query.flowId);
-          this.$modal.msgSuccess("已确认");
+    async btnverify(){
+      this.$refs["dataForm"].validate(async (valid, obj) => {
+        if (valid) {
+          //保存绩效数据
+          savePerformance(this.form);
+          this.flow.status = 2;
+          this.flow.result = "已评分";
+          //保存流程数据
+          await superiorevaluation(this.flow).then(res => {
+            if (res.code === 200) {
+              this.fetchPerformance(this.$route.query.performanceId);
+              this.fetchFlow(this.$route.query.flowId);
+              this.$modal.msgSuccess("已确认");
+            }
+            this.loading = false;
+          })
+        } else {
+          this.$modal.msgWarning("评分或评语不能为空!");
+          return false;
         }
-        this.loading = false;
-      })
+      });
     },
     //返回
     btnBack(){
       this.$router.back();
     },
+    //必选标识
+    addRedStar(h, { column }) {
+      return [
+        h('span', { style: 'color: #F56C6C' }, '*'),
+        h('span', ' ' + column.label)
+      ];
+    },
   }
 };
 </script>

+ 56 - 0
src/views/business/ehr/pm/performance/btnAjMarkLog.vue

@@ -0,0 +1,56 @@
+<template>
+  <div>
+    <el-button size="mini" @click="click">分数调整记录</el-button>
+    <el-dialog title="分数调整记录" :visible.sync="open" width="1000px" :close-on-click-modal="false">
+      <el-table size="mini" height="500px" v-loading="loading" :data="listData">
+        <el-table-column label="调整分" align="center" prop="ajMark" />
+        <el-table-column label="调整原因" align="center" prop="ajCause" />
+        <el-table-column label="调整时间" align="center" prop="createTime" />
+        <el-table-column label="调整人" align="center" prop="createBy" />
+      </el-table>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listAdjustlog} from "@/api/business/ehr/pm/adjustlog";
+export default {
+  name: "AdjustlogDialog",
+  props: ['pmId'],
+  data() {
+    return {
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 1000,
+        performanceId: null,
+      },
+      // 总条数
+      total: 0,
+      // 表格数据
+      listData: [],
+      // 遮罩层
+      loading: true,
+      // 是否显示弹出层
+      open: false,
+    };
+  },
+  watch: {},
+  methods: {
+    //点击了当前按钮
+    click() {
+      this.queryParams.performanceId = this.pmId;
+      this.open = true;
+      this.loading = true;
+      listAdjustlog(this.queryParams).then(response => {
+        this.listData = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+  },
+  created() {},
+  mounted() {},
+  destroyed() {},
+};
+</script>

+ 1 - 1
src/views/business/ehr/pm/performance/btnCopyItem.vue

@@ -2,7 +2,7 @@
   <div>
     <el-button size="mini" @click="click">复制指标</el-button>
     <el-dialog title="历史绩效" :visible.sync="open" width="1000px" :close-on-click-modal="false">
-      复制操作将覆盖当前绩效指标
+      复制操作将覆盖当前绩效明细
       <el-table size="mini" height="500px" v-loading="loading" :data="listData" @row-dblclick="btnCopy">
         <el-table-column label="员工" align="center" prop="staffName" />
         <el-table-column label="评估周期" align="center" prop="name" />

+ 126 - 105
src/views/business/ehr/pm/performance/detail.vue

@@ -8,93 +8,103 @@
           <el-button type="primary" size="mini" @click="btnSubmit" :loading="loading" v-if="this.$store.state.user.name == form.staff && (form.status == '0' || form.status == '3')">提交</el-button>
           <CopyItemDialog style="margin: 0 10px" @setItems="setItems" v-if="this.$store.state.user.name == form.staff && form.status == '0'" :id="rowId"></CopyItemDialog>
           <ApproveLogDialog style="margin: 0 10px" :pmId="form.id"></ApproveLogDialog>
+          <AdjustlogDialog style="margin: 0 10px" :pmId="form.id"></AdjustlogDialog>
           <el-button size="mini" plain @click="btnPreviou" v-if="ids">上一个</el-button>
           <el-button size="mini" plain @click="btnNext" v-if="ids">下一个</el-button>
         </div>
       </div>
       <div v-loading="loading">
-        <el-descriptions :column="6 ">
-          <el-descriptions-item label="员工编号">{{form.staff}}</el-descriptions-item>
-          <el-descriptions-item label="员工姓名">{{form.staffName}}</el-descriptions-item>
-          <el-descriptions-item label="入职日期">{{form.dateJoin}}</el-descriptions-item>
-          <el-descriptions-item label="转正日期">{{form.probationComplete}}</el-descriptions-item>
-          <el-descriptions-item label="部门">{{form.deptName}}</el-descriptions-item>
-          <el-descriptions-item label="职位">{{form.jobName}}</el-descriptions-item>
-          <el-descriptions-item label="评估周期">{{form.name}}</el-descriptions-item>
-          <el-descriptions-item label="评估人">{{form.evaluatorName}}</el-descriptions-item>
-          <el-descriptions-item label="所属分组">
-            <div v-for="dict in dict.type.ehr_pm_group" v-if="form.staffDivide == dict.value">
-              <div>{{ dict.label }}</div>
-            </div>
-          </el-descriptions-item>
-        </el-descriptions>
-        <el-descriptions :column="6 ">
-          <el-descriptions-item label="自评分" v-if="form.status > 3">{{form.saMark}}</el-descriptions-item>
-          <el-descriptions-item label="上级评分" v-if="form.status > 4">{{form.ldMark}}</el-descriptions-item>
-        </el-descriptions>
-        <el-descriptions v-if="form.status > 3">
-          <el-descriptions-item label="个人总结">{{form.summary}}</el-descriptions-item>
-        </el-descriptions>
-        <div v-if="this.$store.state.user.name == form.staff && form.status == '3'">
-          个人总结*<el-input type="textarea" placeholder="总结本月工作的亮点和暗点" v-model="form.summary"></el-input>
-        </div>
-        <el-descriptions v-if="form.status > 4">
-          <el-descriptions-item label="评语">{{form.comment}}</el-descriptions-item>
-        </el-descriptions>
-        <div style="float:right">
-          <el-button type="primary" size="mini" @click="btnAddRow" v-if="this.$store.state.user.name == form.staff && form.status == '0'">增加指标</el-button>
-          <!-- <el-button size="mini" @click="btnUnfold">{{isUnfold == true ? "收起" : "展开"}}</el-button> -->
-        </div>
-        <el-table size="mini"  :data="form.performanceItem" show-summary :summary-method="getSummaries" border>
-          <el-table-column type="index" width="50" label="序号"/>
-          <el-table-column width="100" :show-overflow-tooltip="!isUnfold" label="评估方面" align="center" prop="aspect">
-            <template slot-scope="scope">
-              <dict-tag :options="dict.type.ehr_pm_aspect" :value="scope.row.aspect"/>
-            </template>
-          </el-table-column>
-          <el-table-column width="100" :show-overflow-tooltip="!isUnfold" label="评估指标" align="center" prop="target" />
-          <el-table-column width="80" label="权重(%)" align="center" prop="weight"/>
-          <el-table-column :show-overflow-tooltip="!isUnfold" label="指标说明" align="center" prop="instructions">
-            <template slot-scope="scope">
-              <div style="white-space: pre-wrap;text-align: left">{{scope.row.instructions}}</div>
-            </template>
-          </el-table-column>
-          <!-- <el-table-column width="100" label="角色" align="center" prop="role">
-            <template slot-scope="scope">
-              <dict-tag :options="dict.type.ehr_pm_role" :value="scope.row.role"/>
-            </template>
-          </el-table-column> -->
-          <el-table-column :show-overflow-tooltip="!isUnfold" label="评分标准" align="center" prop="standard">
-            <template slot-scope="scope">
-              <div style="white-space: pre-wrap;text-align: left">{{scope.row.standard}}</div>
-            </template>
-          </el-table-column>
-          <el-table-column width="100" label="数据来源" align="center" prop="source" />
+        <el-form size="mini" ref="dataForm" :model="form" :rules="rules">
+          <el-descriptions :column="6 ">
+            <el-descriptions-item label="员工编号">{{form.staff}}</el-descriptions-item>
+            <el-descriptions-item label="员工姓名">{{form.staffName}}</el-descriptions-item>
+            <el-descriptions-item label="入职日期">{{form.dateJoin}}</el-descriptions-item>
+            <el-descriptions-item label="转正日期">{{form.probationComplete}}</el-descriptions-item>
+            <el-descriptions-item label="部门">{{form.deptName}}</el-descriptions-item>
+            <el-descriptions-item label="职位">{{form.jobName}}</el-descriptions-item>
+            <el-descriptions-item label="评估周期">{{form.name}}</el-descriptions-item>
+            <el-descriptions-item label="评估人">{{form.evaluatorName}}</el-descriptions-item>
+            <el-descriptions-item label="所属分组">
+              <div v-for="dict in dict.type.ehr_pm_group" v-if="form.staffDivide == dict.value">
+                <div>{{ dict.label }}</div>
+              </div>
+            </el-descriptions-item>
+          </el-descriptions>
+          <el-descriptions :column="6 ">
+            <el-descriptions-item label="自评分" v-if="form.status > 3">{{form.saMark}}</el-descriptions-item>
+            <el-descriptions-item label="上级评分" v-if="form.status > 4">{{form.ldMark}}</el-descriptions-item>
+          </el-descriptions>
+          <el-descriptions v-if="form.status > 3">
+            <el-descriptions-item label="个人总结">{{form.summary}}</el-descriptions-item>
+          </el-descriptions>
+          <div v-if="this.$store.state.user.name == form.staff && form.status == '3'">
+            <el-form-item label="个人总结" prop="summary">
+              <el-input type="textarea" placeholder="总结本月工作的亮点和暗点" v-model="form.summary"></el-input>
+            </el-form-item>
+          </div>
+          <el-descriptions v-if="form.status > 4">
+            <el-descriptions-item label="评语">{{form.comment}}</el-descriptions-item>
+          </el-descriptions>
+          <div style="float:right">
+            <el-button type="primary" size="mini" @click="btnAddRow" v-if="this.$store.state.user.name == form.staff && form.status == '0'">增加指标</el-button>
+            <!-- <el-button size="mini" @click="btnUnfold">{{isUnfold == true ? "收起" : "展开"}}</el-button> -->
+          </div>
+          <el-table size="mini"  :data="form.performanceItem" show-summary :summary-method="getSummaries" border>
+            <el-table-column type="index" width="50" label="序号"/>
+            <el-table-column width="100" :show-overflow-tooltip="!isUnfold" label="评估方面" align="center" prop="aspect">
+              <template slot-scope="scope">
+                <dict-tag :options="dict.type.ehr_pm_aspect" :value="scope.row.aspect"/>
+              </template>
+            </el-table-column>
+            <el-table-column width="100" :show-overflow-tooltip="!isUnfold" label="评估指标" align="center" prop="target" />
+            <el-table-column width="80" label="权重(%)" align="center" prop="weight"/>
+            <el-table-column :show-overflow-tooltip="!isUnfold" label="指标说明" align="center" prop="instructions">
+              <template slot-scope="scope">
+                <div style="white-space: pre-wrap;text-align: left">{{scope.row.instructions}}</div>
+              </template>
+            </el-table-column>
+            <!-- <el-table-column width="100" label="角色" align="center" prop="role">
+              <template slot-scope="scope">
+                <dict-tag :options="dict.type.ehr_pm_role" :value="scope.row.role"/>
+              </template>
+            </el-table-column> -->
+            <el-table-column :show-overflow-tooltip="!isUnfold" label="评分标准" align="center" prop="standard">
+              <template slot-scope="scope">
+                <div style="white-space: pre-wrap;text-align: left">{{scope.row.standard}}</div>
+              </template>
+            </el-table-column>
+            <el-table-column width="100" label="数据来源" align="center" prop="source" />
 
-          <el-table-column width="80" label="自评分" align="center" prop="selfScoring" v-if="form.status > 3"/>
-          <el-table-column :show-overflow-tooltip="!isUnfold" label="自评语" align="center" prop="selfComment" v-if="form.status > 3"/>
-          <el-table-column width="80" label="自评分*" align="center" prop="selfScoring" v-if="this.$store.state.user.name == form.staff && form.status == '3'">
-            <template slot-scope="scope">
-              <el-input  v-model="scope.row.selfScoring" v-only-number="{max:saMarkMax,min:0,precision:1}" size="mini"/>
-            </template>
-          </el-table-column>
-          <el-table-column :show-overflow-tooltip="!isUnfold" label="自评语*" align="center" prop="selfComment" v-if="this.$store.state.user.name == form.staff && form.status == '3'">
-            <template slot-scope="scope">
-              <el-input size="mini" type="textarea" :rows="3" v-model="scope.row.selfComment"></el-input>
-            </template>
-          </el-table-column>
+            <el-table-column width="80" label="自评分" align="center" prop="selfScoring" v-if="form.status > 3"/>
+            <el-table-column :show-overflow-tooltip="!isUnfold" label="自评语" align="center" prop="selfComment" v-if="form.status > 3"/>
+              
+            <el-table-column width="80" label="自评分" align="center" prop="selfScoring" :render-header="addRedStar" v-if="this.$store.state.user.name == form.staff && form.status == '3'">
+              <template slot-scope="scope">
+                <el-form-item :prop="'performanceItem.'+scope.$index+'.selfScoring'" :rules="{required: true,message: ' ',trigger: 'blur'}">
+                  <el-input  v-model="scope.row.selfScoring" v-only-number="{max:saMarkMax,min:0,precision:1}" size="mini"/>
+                </el-form-item>
+              </template>
+            </el-table-column>
+            <el-table-column :show-overflow-tooltip="!isUnfold" label="自评语" align="center" prop="selfComment" :render-header="addRedStar" v-if="this.$store.state.user.name == form.staff && form.status == '3'">
+              <template slot-scope="scope">
+                <el-form-item :prop="'performanceItem.'+scope.$index+'.selfComment'" :rules="{required: true,message: ' ',trigger: 'blur'}">
+                  <el-input size="mini" type="textarea" :rows="3" v-model="scope.row.selfComment"></el-input>
+                </el-form-item>
+              </template>
+            </el-table-column>
 
-          <el-table-column width="80" label="上级评分" align="center" prop="leaderScoring" v-if="form.status > 4"/>
-          <el-table-column :show-overflow-tooltip="!isUnfold" label="上级评语" align="center" prop="leaderComment" v-if="form.status > 4"/>
-          <el-table-column width="80" label="加权得分" align="center" prop="weightedScore" v-if="form.status > 4"/>
-        
-          <el-table-column label="操作" fixed="right" align="center" class-name="small-padding fixed-width" v-if="this.$store.state.user.name == form.staff && form.status == '0'">
-            <template slot-scope="scope">
-              <el-button size="mini" type="text" @click="btnEdit(scope.row)">修改</el-button>
-              <el-button size="mini" type="text" @click="btnDelete(scope.row)">删行</el-button>
-            </template>
-          </el-table-column>
-        </el-table>
+            <el-table-column width="80" label="上级评分" align="center" prop="leaderScoring" v-if="form.status > 4"/>
+            <el-table-column :show-overflow-tooltip="!isUnfold" label="上级评语" align="center" prop="leaderComment" v-if="form.status > 4"/>
+            <el-table-column width="80" label="加权得分" align="center" prop="weightedScore" v-if="form.status > 4"/>
+          
+            <el-table-column label="操作" fixed="right" align="center" class-name="small-padding fixed-width" v-if="this.$store.state.user.name == form.staff && form.status == '0'">
+              <template slot-scope="scope">
+                <el-button size="mini" type="text" @click="btnEdit(scope.row)">修改</el-button>
+                <el-button size="mini" type="text" @click="btnDelete(scope.row)">删行</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-form>
       </div>
     </el-card>
     
@@ -152,6 +162,7 @@
 
 <script>
 import ApproveLogDialog from './btnApproveLog.vue'
+import AdjustlogDialog from './btnAjMarkLog.vue'
 import CopyItemDialog from './btnCopyItem.vue'
 import { getPerformance,fillinFinish,selfestimate,copyItem} from "@/api/business/ehr/pm/performance";
 import { getPerformanceItem,addPerformanceItem,updatePerformanceItem,delPerformanceItem} from "@/api/business/ehr/pm/performanceitem";
@@ -164,13 +175,19 @@ export default {
     prop: 'isList',
     event: 'jugislist'
   },
-  components: {ApproveLogDialog,CopyItemDialog},
+  components: {ApproveLogDialog,AdjustlogDialog,CopyItemDialog},
   data() {
     return {
       //id
       id:null,
       //表单
       form:{},
+      //提交规则
+      rules:{
+        summary: [
+          { required: true, message: " ", trigger: "blur" },
+        ],
+      },
       //遮罩
       loading: false,
       //单行明细
@@ -212,7 +229,7 @@ export default {
     saMarkMax: function () {
       //业务组最高自评分为150;非业务组最高自评分为100;
       return this.form.staffDivide == 'C1' ? 150 : 100
-    }
+    },
 	},
   async created() {
     this.id = this.rowId;
@@ -273,6 +290,10 @@ export default {
     },
     //单行明细确认
     btnRowConfirm(){
+      if(this.form.staffDivide == 'C1' && this.rowData.aspect == 0 && this.rowData.weight < 80){
+        this.$modal.msgSuccess("业务组的业绩考核权重不能低于80!");
+        return;
+      }
       let sum = 100;
       if(this.rowData.id){
         let arr = this.form.performanceItem.filter(ele => ele.id != this.rowData.id);
@@ -356,31 +377,24 @@ export default {
         });
       }
       if(this.form.status == '3'){
-        let v = false;
-        this.form.performanceItem.forEach((item) => {
-          if((!item.selfScoring && item.selfScoring != 0) || !item.selfComment){
-            v = true;
+        this.$refs["dataForm"].validate(async valid => {
+          if (valid) {
+            let that = this;
+              this.$modal.confirm('确认提交吗?').then(async function() {
+                that.loading = true;
+                return await selfestimate(that.form);
+              }).then(() => {
+                that.fetchPerformance(that.id);
+                that.$modal.msgSuccess("提交成功");
+                that.loading = false;
+              }).catch(() => {
+                that.loading = false;
+              });
+          }else{
+            this.$modal.msgWarning("评分或评语不能为空!");
+            return false;
           }
         });
-        if(v){
-          this.$modal.msgWarning("请填写自评分、自评语后再提交!");
-          return;
-        }
-        if(!this.form.summary){
-          this.$modal.msgWarning("请填写个人总结再提交!");
-          return;
-        }
-        let that = this;
-        this.$modal.confirm('确认提交吗?').then(async function() {
-          that.loading = true;
-          return await selfestimate(that.form);
-        }).then(() => {
-          that.fetchPerformance(that.id);
-          that.$modal.msgSuccess("提交成功");
-          that.loading = false;
-        }).catch(() => {
-          that.loading = false;
-        });
       }
     },
     //设置明细
@@ -399,6 +413,13 @@ export default {
     handleCheckedChange(value){
       this.rowData.weight = 0;
     },
+    //必选标识
+    addRedStar(h, { column }) {
+      return [
+        h('span', { style: 'color: #F56C6C' }, '*'),
+        h('span', ' ' + column.label)
+      ];
+    },
   }
 }
 </script>

+ 4 - 5
src/views/business/ehr/pm/performance/index.vue

@@ -62,7 +62,7 @@
           <el-button type="primary" size="mini" @click="btnPmMark">待评分</el-button>
         </el-badge>
         <el-badge :value="adjustCount" class="item" style="margin: 0 10px"  v-if="adjustCount> 0">
-          <el-button type="primary" size="mini" @click="btnGradeAdjust">待等级调整</el-button>
+          <el-button type="primary" size="mini" @click="btnGradeAdjust">待分数调整</el-button>
         </el-badge>
         <el-button type="primary" size="mini" @click="btnCurrentMonth">本月绩效</el-button>
         <el-button type="primary" size="mini" @click="btnNextMonth">下月绩效</el-button>
@@ -74,8 +74,7 @@
         <el-table-column label="月度" align="center" prop="month" />
         <el-table-column label="自评分" align="center" prop="saMark" />
         <el-table-column label="上级评分" align="center" prop="ldMark" />
-        <el-table-column label="调整分" align="center" prop="ajMark" />
-        <el-table-column label="调整分等级" align="center" prop="ajGrade" />
+        <el-table-column label="分数" align="center" prop="mark" />
         <el-table-column label="等级" align="center" prop="grade" />
         <el-table-column label="绩效系数" align="center" prop="coefficient" />
         <el-table-column label="状态" align="center" prop="status" >
@@ -106,7 +105,7 @@
     </div>
     <detail v-model="isList" v-if="!isList" :pageStu="page" :rowId="rowId" :ids="ids" @refresh="refresh" />
 
-    <el-dialog title="等级调整" :visible.sync="stageListOpen" width="1000px" :close-on-click-modal="false">
+    <el-dialog title="分数调整" :visible.sync="stageListOpen" width="1000px" :close-on-click-modal="false">
       <el-table size="mini" height="500px" v-loading="stageListLoading" :data="stageList" @row-dblclick="btnDetails">
         <el-table-column label="名称" align="center" prop="name" />
         <el-table-column label="月份" align="center" prop="month" />
@@ -329,7 +328,7 @@ export default {
     },
     //进入调整
     btnEntryAdjust(row){
-      this.$router.push({ name: 'AdjustGrade', query: { id: row.id,gradeconfigId: row.gradeconfigId,flowId: row.flowId } });
+      this.$router.push({ name: 'AdjustGrade', query: { id: row.id,flowId: row.flowId } });
     },
     //待确认
     btnPmVerify(){

+ 1 - 1
src/views/business/ehr/pm/stagecontrol/detail.vue

@@ -77,7 +77,7 @@
           </el-tab-pane>
         </el-tabs>
         <div class="footer">
-          <el-button type="primary" size="mini" @click="btnEdit" v-if="pageState == 'see'">修改</el-button>
+          <el-button type="primary" size="mini" @click="btnEdit" v-if="pageState == 'see' && form.stage < 5">修改</el-button>
           <el-button size="mini" plain @click="btnCancel" v-if="pageState != 'see'">取消</el-button>
           <el-button type="primary" :loading="loading" size="mini" @click="btnSave" v-if="pageState != 'see'">保存</el-button>
         </div>

+ 3 - 2
src/views/business/ehr/pm/stagecontrol/pmList.vue

@@ -25,7 +25,8 @@
           </el-form-item>
         </el-col>
         <el-col :span="12" >
-          <CreatePmDialog :stageId="stage.id"></CreatePmDialog>
+          <!-- <el-button size="mini" icon="el-icon-upload2" @click="click">导入外部绩效数据</el-button> -->
+          <CreatePmDialog :stageId="stage.id" v-if="stage.stage < 5"></CreatePmDialog>
         </el-col>
       </el-row>
     </el-form>
@@ -39,7 +40,7 @@
           <dict-tag :options="dict.type.ehr_pm_status" :value="scope.row.status"/>
         </template>
       </el-table-column>
-      <el-table-column label="操作" fixed="right" align="center" class-name="small-padding fixed-width">
+      <el-table-column label="操作" fixed="right" align="center" class-name="small-padding fixed-width" v-if="stage.stage < 5">
         <template slot-scope="scope">
             <el-button
               size="mini"