zouyu
2 天以前 119ead459f17a1a1c2fd5e0f4d08febc681d6d86
绩效管理:人员能力功能模块
已添加4个文件
已修改3个文件
620 ■■■■■ 文件已修改
src/api/performance/staffCompetencyInspectItemConfig.js 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/performance/staffCompetencyLevelEvaluateRecord.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/request.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/performance/attendance/components/staffClockInRecord.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/performance/attendance/index.vue 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/performance/competency/components/config.vue 269 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/performance/competency/index.vue 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/performance/staffCompetencyInspectItemConfig.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
import request from '@/utils/request'
// æŸ¥è¯¢éƒ¨é—¨åˆ—表
export function listConfig(query) {
  return request({
    url: '/staffCompetencyInspectItemConfig/list',
    method: 'get',
    params: query
  })
}
// æŸ¥è¯¢éƒ¨é—¨åˆ—表(排除节点)
export function listConfigExcludeChild(configId) {
  return request({
    url: '/staffCompetencyInspectItemConfig/list/exclude/' + configId,
    method: 'get'
  })
}
// æŸ¥è¯¢éƒ¨é—¨è¯¦ç»†
export function getConfig(configId) {
  return request({
    url: '/staffCompetencyInspectItemConfig/' + configId,
    method: 'get'
  })
}
// æ–°å¢žéƒ¨é—¨
export function addConfig(data) {
  return request({
    url: '/staffCompetencyInspectItemConfig',
    method: 'post',
    data: data
  })
}
// ä¿®æ”¹éƒ¨é—¨
export function updateConfig(data) {
  return request({
    url: '/staffCompetencyInspectItemConfig',
    method: 'put',
    data: data
  })
}
// åˆ é™¤éƒ¨é—¨
export function delConfig(configId) {
  return request({
    url: '/staffCompetencyInspectItemConfig/' + configId,
    method: 'delete'
  })
}
src/api/performance/staffCompetencyLevelEvaluateRecord.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
import request from '@/utils/request'
// èŽ·å–ç”¨æˆ·ç­‰çº§è¯„å®šåˆ—è¡¨
export function getPageList(query) {
  return request({
    url: '/StaffCompetencyLevelEvaluateRecord/getPageList',
    method: 'get',
    params: query
  })
}
// ä¿®æ”¹ç”¨æˆ·ç­‰çº§
export function changeLevel(data) {
  return request({
    url: '/StaffCompetencyLevelEvaluateRecord/changeLevel',
    method: 'post',
    data: data
  })
}
// å¯¼å‡ºäººå‘˜èƒ½åŠ›åˆ—è¡¨
export function exportRecords(data) {
  return request({
    url: '/StaffCompetencyLevelEvaluateRecord/exportRecords',
    method: 'get',
    params: data,
    responseType: 'blob'
  })
}
src/utils/request.js
@@ -100,7 +100,7 @@
    // æœªè®¾ç½®çŠ¶æ€ç åˆ™é»˜è®¤æˆåŠŸçŠ¶æ€
    const code = res.data.code || 200;
    // èŽ·å–é”™è¯¯ä¿¡æ¯
    const msg = errorCode[code] || res.data.msg || errorCode["default"];
    const msg = res.data.message || res.data.msg || errorCode[code] || errorCode["default"];
    // äºŒè¿›åˆ¶æ•°æ®åˆ™ç›´æŽ¥è¿”回
    if (
      res.request.responseType === "blob" ||
src/views/performance/attendance/components/staffClockInRecord.vue
@@ -297,7 +297,7 @@
      changeEnableReport(data).then(res=>{
        if(res.code===200){
          this.$message.success("操作成功")
          this.refreshTable()
          this.$emit("changeEnable")
        }
      })
    },
src/views/performance/attendance/index.vue
@@ -64,14 +64,14 @@
          </el-table-column>
          <el-table-column prop="swingDate" label="考勤时间" min-width="150" width="150"></el-table-column>
          <el-table-column label="签入/签出情况">
            <el-table-column prop="workDateTime" label="上班时间" min-width="160" width="160">
            <el-table-column prop="workDateTime" label="上班时间" min-width="160" >
              <template slot-scope="scope">
                <el-tag type="success" v-if="scope.row.workDateTime && scope.row.workClockInState===1">{{ scope.row.workDateTime }}</el-tag>
                <el-tag type="danger" v-else-if="scope.row.workDateTime && scope.row.workClockInState===0">{{ scope.row.workDateTime }}</el-tag>
                <span v-else>{{ scope.row.workDateTime }}</span>
              </template>
            </el-table-column>
            <el-table-column prop="offWorkDateTime" label="下班时间" min-width="160" width="160">
            <el-table-column prop="offWorkDateTime" label="下班时间" min-width="160" >
              <template slot-scope="scope">
                <el-tag type="success" v-if="scope.row.offWorkDateTime && scope.row.offClockInState===1">{{ scope.row.offWorkDateTime }}</el-tag>
                <el-tag type="danger" v-else-if="scope.row.offWorkDateTime && scope.row.offClockInState===0">{{ scope.row.offWorkDateTime }}</el-tag>
@@ -80,19 +80,19 @@
            </el-table-column>
          </el-table-column>
          <el-table-column label="考勤时长(h)">
            <el-table-column prop="plannedWorkHours" label="应勤时长" min-width="80" width="80"></el-table-column>
            <el-table-column prop="actualWorkHours" label="实际时长" min-width="80" width="80"></el-table-column>
            <el-table-column prop="absenceWorkHours" label="缺勤时长" min-width="80" width="80"></el-table-column>
            <el-table-column prop="plannedWorkHours" label="应勤时长" min-width="100" ></el-table-column>
            <el-table-column prop="actualWorkHours" label="实际时长" min-width="100"></el-table-column>
            <el-table-column prop="absenceWorkHours" label="缺勤时长" min-width="100" ></el-table-column>
          </el-table-column>
          <el-table-column prop="isSync" label="数据来源" min-width="120">
          <el-table-column prop="isSync" label="数据来源" min-width="120" width="120">
            <template slot-scope="scope">
              <el-tag v-if="scope.row.isSync===0" type="success">ICC同步</el-tag>
              <el-tag v-else-if="scope.row.isSync===1" type="info">手动新增</el-tag>
            </template>
          </el-table-column>
          <el-table-column prop="createUser" label="创建人" min-width="150" width="150" :formatter="(row)=>formatterUserName(row.createUser)"></el-table-column>
          <el-table-column prop="createUser" label="创建人" min-width="120" width="120" :formatter="(row)=>formatterUserName(row.createUser)"></el-table-column>
          <el-table-column prop="createTime" label="创建时间" min-width="180" width="180"></el-table-column>
          <el-table-column prop="updateUser" label="更新人" min-width="150" width="150" :formatter="(row)=>formatterUserName(row.updateUser)"></el-table-column>
          <el-table-column prop="updateUser" label="更新人" min-width="120" width="120" :formatter="(row)=>formatterUserName(row.updateUser)"></el-table-column>
          <el-table-column prop="updateTime" label="更新时间" min-width="180" width="180"></el-table-column>
          <el-table-column fixed="right" width="180" label="操作">
            <template slot-scope="scope">
@@ -114,7 +114,7 @@
      title="进出记录"
      :visible.sync="dialogVisible"
      width="60%">
      <staff-clock-in-record :key="Math.random()" :query-params="clockInQueryParams" ></staff-clock-in-record>
      <staff-clock-in-record :query-params="clockInQueryParams" @changeEnable="refreshTable()"></staff-clock-in-record>
    </el-dialog>
    <el-dialog
      :title="attendanceForm.id?'编辑考勤记录':'新增考勤记录'"
@@ -158,18 +158,11 @@
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="12">
<!--              <el-form-item label="考勤结果" prop="result">-->
<!--                <el-select size="small" style="width:100%" clearable v-model="attendanceForm.result" placeholder="请选择考勤结果">-->
<!--                  <el-option v-for="(item,index) in resultList" :key="index" :label="item.label" :value="item.value"/>-->
<!--                </el-select>-->
<!--              </el-form-item>-->
            </el-col>
          </el-row>
          <el-divider content-position="left">签入/签出情况</el-divider>
          <el-row>
            <el-col :span="12">
              <el-form-item label="上班时间" prop="workTime">
              <el-form-item label="上班时间" prop="workDateTime">
                <el-time-picker
                  style="width:100%"
                  value-format="HH:mm"
@@ -180,7 +173,7 @@
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="下班时间" prop="offWorkTime">
              <el-form-item label="下班时间" prop="offWorkDateTime">
                <el-time-picker
                  style="width:100%"
                  value-format="HH:mm"
@@ -492,11 +485,12 @@
    openAddAttendanceDialog(row){
      if(row){
        //处理上/下班时间格式
        let workTime = row.workDateTime&&row.workDateTime.length>8?row.workDateTime.substring(11,16):row.workDateTime
        let offWorkTime = row.offWorkDateTime&&row.offWorkDateTime.length>8?row.offWorkDateTime.substring(11,16):row.offWorkDateTime
        row.workDateTime = workTime
        row.offWorkDateTime = offWorkTime
        this.attendanceForm = {...row}
        let formData = {...row}
        let workTime = formData.workDateTime&&formData.workDateTime.length>8?formData.workDateTime.substring(11,16):formData.workDateTime
        let offWorkTime = formData.offWorkDateTime&&formData.offWorkDateTime.length>8?formData.offWorkDateTime.substring(11,16):formData.offWorkDateTime
        formData.workDateTime = workTime
        formData.offWorkDateTime = offWorkTime
        this.attendanceForm = formData
      }
      this.addAttendanceVisible = true
    },
src/views/performance/competency/components/config.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,269 @@
<template>
  <div class="app-container">
    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" >
      <el-form-item label="项点名称" prop="itemName">
        <el-input v-model="queryParams.itemName" placeholder="请输入项点名称" clearable @keyup.enter.native="handleQuery" />
      </el-form-item>
      <el-form-item>
        <el-button type="primary" size="mini" @click="handleQuery">查询</el-button>
        <el-button size="mini" @click="resetQuery">重置</el-button>
        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" >新增</el-button>
      </el-form-item>
    </el-form>
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button type="info" plain icon="el-icon-sort" size="mini" @click="toggleExpandAll">展开/折叠</el-button>
      </el-col>
    </el-row>
    <el-table :height="tableHeight" v-if="refreshTable" v-loading="loading" :data="configList" row-key="id"
              :header-cell-style="{ background: '#f8f8f9', color: '#515a6e' }" border
              :default-expand-all="isExpandAll" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
      <el-table-column prop="itemName" label="项点名称" width="260"></el-table-column>
      <el-table-column prop="isEnable" label="状态" width="100" align="center">
        <template slot-scope="scope">
          <el-tag v-if="scope.row.isEnable">启用</el-tag>
          <el-tag v-else type="info">禁用</el-tag>
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template slot-scope="scope">
          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)">修改</el-button>
          <el-button size="mini" type="text" icon="el-icon-plus" @click="handleAdd(scope.row)">新增</el-button>
          <el-button v-if="!scope.row.children" size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" >删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- æ·»åŠ æˆ–ä¿®æ”¹æ£€éªŒé¡¹ç‚¹å¯¹è¯æ¡† -->
    <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
        <el-row>
          <el-col :span="24" v-if="form.parentId > 0">
            <el-form-item label="上级项点" prop="parentId">
              <treeselect v-model="form.parentId" :options="configOptions" :normalizer="normalizer"
                          placeholder="选择上级项点" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="项点名称" prop="itemName">
              <el-input v-model="form.itemName" placeholder="请输入项点名称" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="显示排序" prop="sort">
              <el-input-number v-model="form.sort" controls-position="right" :min="0" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="是否启用" prop="isEnable">
              <el-switch v-model="form.isEnable"></el-switch>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">ç¡® å®š</el-button>
        <el-button @click="cancel">取 æ¶ˆ</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import { listConfig, getConfig, delConfig, addConfig, updateConfig, listConfigExcludeChild } from "@/api/performance/staffCompetencyInspectItemConfig";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
  name: "StaffCompetencyInspectItemConfig",
  components: { Treeselect },
  data() {
    return {
      //表格高度
      tableHeight:0,
      // é®ç½©å±‚
      loading: true,
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
      showSearch: true,
      // è¡¨æ ¼æ ‘数据
      configList: [],
      // éƒ¨é—¨æ ‘选项
      configOptions: [],
      // å¼¹å‡ºå±‚标题
      title: "",
      // æ˜¯å¦æ˜¾ç¤ºå¼¹å‡ºå±‚
      open: false,
      // æ˜¯å¦å±•开,默认全部展开
      isExpandAll: true,
      // é‡æ–°æ¸²æŸ“表格状态
      refreshTable: true,
      // æŸ¥è¯¢å‚æ•°
      queryParams: {
        itemName: undefined
      },
      // è¡¨å•参数
      form: {},
      // è¡¨å•校验
      rules: {
        itemName: [
          { required: true, message: "项点名称不能为空", trigger: "blur" }
        ],
        sort: [
          { required: true, message: "显示排序不能为空", trigger: "blur" }
        ]
      }
    };
  },
  created() {
    this.getList();
    this.calcTableHeight()
  },
  mounted() {
    window.addEventListener('resize', this.calcTableHeight);
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.calcTableHeight);
  },
  methods: {
    calcTableHeight(){
      const innerHeight = window.innerHeight
      const outerHeight = 36 + 51 + 97 + 20
      this.tableHeight = innerHeight - outerHeight
    },
    /** æŸ¥è¯¢æ£€éªŒé¡¹ç‚¹åˆ—表 */
    getList() {
      this.loading = true;
      listConfig(this.queryParams).then(response => {
        this.configList = this.handleTree(response.data, "id");
        this.loading = false;
      });
    },
    /** è½¬æ¢æ£€éªŒé¡¹ç‚¹æ•°æ®ç»“æž„ */
    normalizer(node) {
      if (node.children && !node.children.length) {
        delete node.children;
      }
      return {
        id: node.id,
        label: node.itemName,
        children: node.children
      };
    },
    // å–消按钮
    cancel() {
      this.open = false;
      this.reset();
    },
    // è¡¨å•重置
    reset() {
      this.form = {
        id: undefined,
        parentId: undefined,
        itemName: undefined,
        sort: undefined,
        isEnable: true
      };
      this.resetForm("form");
    },
    /** æœç´¢æŒ‰é’®æ“ä½œ */
    handleQuery() {
      this.getList();
    },
    /** é‡ç½®æŒ‰é’®æ“ä½œ */
    resetQuery() {
      this.resetForm("queryForm");
      this.handleQuery();
    },
    /** æ–°å¢žæŒ‰é’®æ“ä½œ */
    handleAdd(row) {
      this.reset();
      if (row != undefined) {
        this.form.parentId = row.id;
      }
      this.open = true;
      this.title = "添加检验项点";
      listConfig().then(response => {
        this.configOptions = this.handleTree(response.data, "id");
        this.configOptions = this.limitTreeDepth(this.configOptions, 2)
      });
    },
    /** å±•å¼€/折叠操作 */
    toggleExpandAll() {
      this.refreshTable = false;
      this.isExpandAll = !this.isExpandAll;
      this.$nextTick(() => {
        this.refreshTable = true;
      });
    },
    /** ä¿®æ”¹æŒ‰é’®æ“ä½œ */
    handleUpdate(row) {
      this.reset();
      getConfig(row.id).then(response => {
        this.form = response.data;
        this.open = true;
        this.title = "修改检验项点";
        listConfigExcludeChild(row.id).then(response => {
          this.configOptions = this.handleTree(response.data, "id");
          if (this.configOptions.length == 0) {
            const noResultsOptions = { id: this.form.parentId, itemName: this.form.parentName, children: [] };
            this.configOptions.push(noResultsOptions);
          }
          this.configOptions = this.limitTreeDepth(this.configOptions, 2)
        });
      });
    },
    /** æäº¤æŒ‰é’® */
    submitForm: function () {
      this.$refs["form"].validate(valid => {
        if (valid) {
          if (this.form.id != undefined) {
            updateConfig(this.form).then(response => {
              this.$modal.msgSuccess("修改成功");
              this.open = false;
              this.getList();
              this.$emit("refresh");
            });
          } else {
            addConfig(this.form).then(response => {
              this.$modal.msgSuccess("新增成功");
              this.open = false;
              this.getList();
              this.$emit("refresh");
            });
          }
        }
      });
    },
    /** åˆ é™¤æŒ‰é’®æ“ä½œ */
    handleDelete(row) {
      this.$modal.confirm('是否确认删除名称为"' + row.itemName + '"的数据项?').then(function () {
        return delConfig(row.id);
      }).then(() => {
        this.getList();
        this.$modal.msgSuccess("删除成功");
        this.$emit("refresh");
      }).catch(() => { });
    },
    // é€’归函数,用于限制树的深度
    limitTreeDepth(options, maxDepth, currentDepth = 1) {
      return options.map(option => {
        const newOption = { ...option };
        if (currentDepth < maxDepth && option.children) {
          // å¦‚果当前深度小于最大深度且存在子节点,则递归处理子节点
          newOption.children = this.limitTreeDepth(option.children, maxDepth, currentDepth + 1);
        } else {
          // å¦åˆ™ç§»é™¤å­èŠ‚ç‚¹
          delete newOption.children;
        }
        return newOption;
      });
    }
  }
};
</script>
src/views/performance/competency/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,226 @@
<template>
  <div class="app-container">
    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true">
      <el-form-item prop="keyword">
        <el-input
          v-model="queryParams.keyword"
          placeholder="工号或员工名称"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item prop="postName">
        <el-select v-model="queryParams.postName" clearable placeholder="请选择岗位" @change="handleQuery">
          <el-option
            v-for="(post, index) in postList"
            :key="index"
            :label="post.postName"
            :value="post.postName"
          >
            <span style="float: left">{{ post.postName }}</span>
            <span style="float: right; color: #8492a6; font-size: 13px">{{ post.postCode }}</span>
          </el-option>
        </el-select>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" size="mini" @click="handleQuery"
          >查询</el-button
        >
        <el-button plain size="mini" @click="resetQuery">重置</el-button>
        <el-button
          type="primary"
          plain
          icon="el-icon-setting"
          size="mini"
          @click="handleAdd"
          >检验项配置</el-button
        >
        <el-button
          type="success"
          icon="el-icon-download"
          size="mini"
          :loading="downloadLoading"
          @click="downloadRecords()"
          >导出</el-button
        >
      </el-form-item>
    </el-form>
    <el-table
      v-if="refreshTable"
      v-loading="loading"
      :data="recordList"
      :height="tableHeight"
      :cell-style="{ textAlign: 'center' }"
      :header-cell-style="{
        background: '#f8f8f9',
        color: '#515a6e',
        textAlign: 'center',
      }"
      border
    >
      <el-table-column type="index" label="序号" width="80"></el-table-column>
      <el-table-column
        prop="userName"
        label="人员名称"
        min-width="120"
        width="120"
      ></el-table-column>
      <el-table-column
        prop="postName"
        label="岗位"
        min-width="120"
        width="120"
      ></el-table-column>
      <!--动态列-->
      <el-table-column v-for="(item, i) in tableHeaderList" :key="i" :prop="item.id + ''" :label="item.itemName">
        <el-table-column min-width="130" v-if="item.children" v-for="(children,k) in item.children" :key="k"  :prop="children.id + ''" :label="children.itemName">
          <template slot-scope="scope">
            <el-select size="small" v-model="scope.row[children.id].level" clearable @change="changeSkillLevel(scope.row, children.id)">
              <el-option v-for="(dict,j) in levelDictList" :label="dict.dictLabel" :value="dict.dictValue" :key="j"></el-option>
            </el-select>
          </template>
        </el-table-column>
      </el-table-column>
    </el-table>
    <el-drawer title="检验项配置" :visible.sync="open">
      <ItemConfig @refresh="handleQuery()"></ItemConfig>
    </el-drawer>
  </div>
</template>
<script>
import {transformExcel} from '@/utils/file'
import { listConfig } from "@/api/performance/staffCompetencyInspectItemConfig";
import {optionSelect} from '@/api/system/post'
import { getPageList,changeLevel,exportRecords } from "@/api/performance/staffCompetencyLevelEvaluateRecord";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import {getDicts} from "@/api/system/dict/data";
import ItemConfig from "./components/config.vue";
export default {
  name: "Competency",
  components: {
    ItemConfig,
  },
  data() {
    return {
      tableHeaderList: [],
      // é®ç½©å±‚
      loading: false,
      // è¡¨æ ¼æ ‘数据
      recordList: [],
      // å¼¹å‡ºå±‚标题
      title: "",
      // æ˜¯å¦æ˜¾ç¤ºå¼¹å‡ºå±‚
      open: false,
      // æ˜¯å¦å±•开,默认全部展开
      isExpandAll: true,
      // é‡æ–°æ¸²æŸ“表格状态
      refreshTable: true,
      // æŸ¥è¯¢å‚æ•°
      queryParams: {
        keyword: undefined,
        postName: undefined,
      },
      //能力等级字典
      levelDictList:[],
      tableHeight:0,
      downloadLoading:false,
      postList:[]
    };
  },
  created() {
    this.getLevelDict()
    this.getTableHeader();
    this.getList();
    this.getTableHeight()
    this.getPostList()
  },
  mounted() {
    window.addEventListener("resize", this.getTableHeight);
  },
  beforeDestroy() {
    window.removeEventListener("resize", this.getTableHeight);
  },
  methods: {
    getPostList(){
      optionSelect().then(res=>{
        if(res.code===200){
          this.postList = res.data
        }
      }).catch(error=>{
        console.log(error)
      })
    },
    downloadRecords(){
      this.downloadLoading = true
      exportRecords(this.queryParams).then(res=>{
        transformExcel(res, "中天耐丝质量部检验员能力矩阵图.xlsx")
        this.$message.success("导出成功")
        this.$nextTick(()=>{
          this.downloadLoading = false
        })
      }).catch(error=>{
        console.log(error)
      })
    },
    getTableHeight() {
      const innerHeight = window.innerHeight;
      const otherHeight = 50+46+40+51;
      this.tableHeight = innerHeight - otherHeight;
    },
    changeSkillLevel(row, itemId){
      const configObj = {...row[itemId]}
      let data = {
        id:configObj.id,
        level: configObj.level,
        userId : row.userId,
        itemConfigId : itemId
      }
     changeLevel(data).then(res=>{
       if(res.code===200){
         this.$message.success("修改成功")
       }
     }).catch(error=>{
       console.log(error)
     })
    },
    getLevelDict() {
      getDicts("staff_level_type").then((response) => {
        this.levelDictList = response.data;
      });
    },
    getTableHeader() {
      listConfig({ isEnable: true }).then((response) => {
        this.tableHeaderList = this.handleTree(response.data, "id");
      });
    },
    /** æŸ¥è¯¢åˆ—表 */
    getList() {
      this.loading = true
      this.getTableHeader();
      getPageList(this.queryParams).then(res=>{
        if(res.code===200){
          this.recordList = res.data
        }
      }).catch(error=>{
        console.log(error)
      }).finally(() => {
          this.loading = false;
        });
    },
    /** æœç´¢æŒ‰é’®æ“ä½œ */
    handleQuery() {
      this.getList();
    },
    /** é‡ç½®æŒ‰é’®æ“ä½œ */
    resetQuery() {
      this.resetForm("queryForm");
      this.handleQuery();
    },
    /** æ–°å¢žæŒ‰é’®æ“ä½œ */
    handleAdd(row) {
      this.open = true;
    },
  },
};
</script>