Przeglądaj źródła

Merge branch 'personnelPerformance'

# Conflicts:
#	src/api/system/user.js
huoyi 4 tygodni temu
rodzic
commit
62a271ad5b

+ 28 - 0
src/api/examManage/monthlyAssessPerformance.js

@@ -0,0 +1,28 @@
1
+import request from '@/utils/request'
2
+
3
+// 查询月考成绩列表
4
+export function listMonthlyScore(query) {
5
+  return request({
6
+    url: '/exam/monthlyScore/list',
7
+    method: 'get',
8
+    params: query
9
+  })
10
+}
11
+
12
+// 下载导入模板
13
+export function downloadTemplate() {
14
+  return request({
15
+    url: '/exam/monthlyScore/importTemplate',
16
+    method: 'post',
17
+    responseType: 'blob'
18
+  })
19
+}
20
+
21
+// 导入月考成绩数据
22
+export function importData(data) {
23
+  return request({
24
+    url: '/exam/monthlyScore/importData',
25
+    method: 'post',
26
+    data: data
27
+  })
28
+}

+ 74 - 0
src/api/performance/monthlyAssess.js

@@ -0,0 +1,74 @@
1
+import request from '@/utils/request'
2
+
3
+// 查询干部月度考核列表
4
+export function listCadreAssessment(query) {
5
+  return request({
6
+    url: '/personnel/cadre-assessment/list',
7
+    method: 'get',
8
+    params: query
9
+  })
10
+}
11
+
12
+// 生成本月考核数据
13
+export function generateCadreAssessment(data) {
14
+  return request({
15
+    url: '/personnel/cadre-assessment/generate',
16
+    method: 'post',
17
+    data: data
18
+  })
19
+}
20
+
21
+//查询非干部月度考核列表
22
+export function listNonCadreAssessment(query) {
23
+  return request({
24
+    url: '/personnel/assessment/list',
25
+    method: 'get',
26
+    params: query
27
+  })
28
+}
29
+//新增非干部月度考核
30
+export function addNonCadreAssessment(data) {
31
+  return request({
32
+    url: '/personnel/assessment',
33
+    method: 'post',
34
+    data: data
35
+  })
36
+}
37
+//修改非干部月度考核
38
+export function updateNonCadreAssessment(data) {
39
+  return request({
40
+    url: '/personnel/assessment',
41
+    method: 'put',
42
+    data: data
43
+  })
44
+}
45
+//删除非干部月度考核
46
+export function deleteNonCadreAssessment(ids) {
47
+  return request({
48
+    url: `/personnel/assessment/${ids}`,
49
+    method: 'delete',
50
+  })
51
+}
52
+//导出非干部月度考核列表
53
+export function exportNonCadreAssessment(data) {
54
+  return request({
55
+    url: '/personnel/assessment/export',
56
+    method: 'post',
57
+    data: data
58
+  })
59
+}
60
+//获取非干部月度考核详细信息
61
+export function getNonCadreAssessment(id) {
62
+  return request({
63
+    url: `/personnel/assessment/${id}`,
64
+    method: 'get'
65
+  })
66
+}
67
+
68
+//自动生成指定月份非干部月度考核数据
69
+export function generateNonCadreAssessment(query) {
70
+  return request({
71
+    url: `/personnel/assessment/autoGenerate/${query.month}`,
72
+    method: 'get',
73
+  })
74
+}

+ 113 - 0
src/api/performance/monthlyAssessSum.js

@@ -0,0 +1,113 @@
1
+import request from '@/utils/request'
2
+
3
+export function getScoreDistribution(query) {
4
+  return request({
5
+    url: '/personnel/non-cadre-assessment/score-summary/score-distribution',
6
+    method: 'get',
7
+    params: query
8
+  })
9
+}
10
+
11
+export function getDeptParticipation(query) {
12
+  return request({
13
+    url: '/personnel/non-cadre-assessment/score-summary/dept-participation',
14
+    method: 'get',
15
+    params: query
16
+  })
17
+}
18
+
19
+export function getDeptScoreDistribution(query) {
20
+  return request({
21
+    url: '/personnel/non-cadre-assessment/score-summary/dept-score-distribution',
22
+    method: 'get',
23
+    params: query
24
+  })
25
+}
26
+
27
+export function getAssessmentSummary(query) {
28
+  return request({
29
+    url: '/personnel/non-cadre-assessment/score-summary/assessment-summary',
30
+    method: 'get',
31
+    params: query
32
+  })
33
+}
34
+
35
+export function getActualImprovementDistribution(query) {
36
+  return request({
37
+    url: '/personnel/non-cadre-assessment/score-summary/actual-improvement-distribution',
38
+    method: 'get',
39
+    params: query
40
+  })
41
+}
42
+
43
+export function getActualIncompetentDistribution(query) {
44
+  return request({
45
+    url: '/personnel/non-cadre-assessment/score-summary/actual-incompetent-distribution',
46
+    method: 'get',
47
+    params: query
48
+  })
49
+}
50
+
51
+export function getAssessmentTeamImprovementDistribution(query) {
52
+  return request({
53
+    url: '/personnel/non-cadre-assessment/score-summary/assessment-team-improvement-distribution',
54
+    method: 'get',
55
+    params: query
56
+  })
57
+}
58
+
59
+export function getAssessmentTeamIncompetentDistribution(query) {
60
+  return request({
61
+    url: '/personnel/non-cadre-assessment/score-summary/assessment-team-incompetent-distribution',
62
+    method: 'get',
63
+    params: query
64
+  })
65
+}
66
+
67
+export function getDeptAssessmentTeamStatistics(query) {
68
+  return request({
69
+    url: '/personnel/non-cadre-assessment/score-summary/dept-assessment-team-statistics',
70
+    method: 'get',
71
+    params: query
72
+  })
73
+}
74
+
75
+export function getBrigadeImprovementDistribution(query) {
76
+  return request({
77
+    url: '/personnel/non-cadre-assessment/score-summary/brigade-improvement-distribution',
78
+    method: 'get',
79
+    params: query
80
+  })
81
+}
82
+
83
+export function getBrigadeIncompetentDistribution(query) {
84
+  return request({
85
+    url: '/personnel/non-cadre-assessment/score-summary/brigade-incompetent-distribution',
86
+    method: 'get',
87
+    params: query
88
+  })
89
+}
90
+
91
+export function getFunctionalDeptSummary(query) {
92
+  return request({
93
+    url: '/personnel/non-cadre-assessment/score-summary/functional-dept-summary',
94
+    method: 'get',
95
+    params: query
96
+  })
97
+}
98
+
99
+export function getFunctionalDeptPersonnelDistribution(query) {
100
+  return request({
101
+    url: '/personnel/non-cadre-assessment/score-summary/functional-dept-personnel-distribution',
102
+    method: 'get',
103
+    params: query
104
+  })
105
+}
106
+
107
+export function getFunctionalDeptDistributionPie(query) {
108
+  return request({
109
+    url: '/personnel/non-cadre-assessment/score-summary/functional-dept-distribution-pie',
110
+    method: 'get',
111
+    params: query
112
+  })
113
+}

+ 88 - 0
src/api/system/classificationAssess.js

@@ -0,0 +1,88 @@
1
+import request from '@/utils/request'
2
+
3
+// 查询考核指标列表
4
+// @param query 查询参数
5
+// @returns {*}
6
+export function listIndicator(query) {
7
+  return request({
8
+    url: '/system/indicator/list',
9
+    method: 'get',
10
+    params: query
11
+  })
12
+}
13
+
14
+// 导出考核指标列表
15
+// @param query 查询参数
16
+// @returns {*}
17
+export function exportIndicator(query) {
18
+  return request({
19
+    url: '/system/indicator/export',
20
+    method: 'post',
21
+    // data: query,
22
+    responseType: 'blob'
23
+  })
24
+}
25
+
26
+// 获取考核指标详细信息
27
+// @param id 考核指标ID
28
+// @returns {*}
29
+export function getIndicator(id) {
30
+  return request({
31
+    url: `/system/indicator/${id}`,
32
+    method: 'get'
33
+  })
34
+}
35
+
36
+// 新增考核指标
37
+// @param data 考核指标数据
38
+// @returns {*}
39
+export function addIndicator(data) {
40
+  return request({
41
+    url: '/system/indicator',
42
+    method: 'post',
43
+    data: data
44
+  })
45
+}
46
+
47
+// 修改考核指标
48
+// @param data 考核指标数据
49
+// @returns {*}
50
+export function updateIndicator(data) {
51
+  return request({
52
+    url: '/system/indicator',
53
+    method: 'put',
54
+    data: data
55
+  })
56
+}
57
+
58
+// 删除考核指标
59
+// @param ids 考核指标ID,多个用逗号分隔
60
+// @returns {*}
61
+export function delIndicator(ids) {
62
+  return request({
63
+    url: `/system/indicator/${ids}`,
64
+    method: 'delete'
65
+  })
66
+}
67
+
68
+// 导入考核指标数据
69
+// @param data 导入数据
70
+// @returns {*}
71
+export function importIndicator(data) {
72
+  return request({
73
+    url: '/system/indicator/importData',
74
+    method: 'post',
75
+    data: data,
76
+    
77
+  })
78
+}
79
+
80
+// 获取导入模板
81
+// @returns {*}
82
+export function getImportTemplate() {
83
+  return request({
84
+    url: '/system/indicator/importTemplate',
85
+    method: 'get',
86
+    responseType: 'blob'
87
+  })
88
+}

+ 56 - 0
src/api/system/classificationAssessIndicator.js

@@ -0,0 +1,56 @@
1
+import request from '@/utils/request'
2
+//查询考核指标分类列表
3
+export function queryAssessCategoryList(query) {
4
+    return request({
5
+        url: '/system/performanceIndicatorCategory/list',
6
+        method: 'get',
7
+        params: query
8
+    })
9
+}
10
+//获取考核指标分类详细信息
11
+export function queryAssessCategoryDetail(categoryId) {
12
+    return request({
13
+        url: `/system/performanceIndicatorCategory/${categoryId}`,
14
+        method: 'get',
15
+
16
+    })
17
+}
18
+//新增考核指标分类
19
+export function addAssessCategory(data) {
20
+    return request({
21
+        url: '/system/performanceIndicatorCategory',
22
+        method: 'post',
23
+        data
24
+    })
25
+}
26
+//修改考核指标分类
27
+export function updateAssessCategory(data) {
28
+    return request({
29
+        url: '/system/performanceIndicatorCategory',
30
+        method: 'put',
31
+        data
32
+    })
33
+}
34
+//删除考核指标分类
35
+export function deleteAssessCategory(ids) {
36
+    return request({
37
+        url: `/system/performanceIndicatorCategory/${ids}`,
38
+        method: 'delete',
39
+    })
40
+}
41
+//查询考核指标分类列表树形结构
42
+export function queryAssessCategoryTree(query) {
43
+    return request({
44
+        url: '/system/performanceIndicatorCategory/listTree',
45
+        method: 'get',
46
+        params: query
47
+    })
48
+}
49
+//获取分类树及关联指标(支持模糊查询)
50
+export function queryAssessCategoryTreeAndIndicator(data) {
51
+    return request({
52
+        url: '/system/performanceIndicatorCategory/getCategoryTreeWithIndicatorList',
53
+        method: 'post',
54
+        data
55
+    })
56
+}

+ 9 - 0
src/api/system/user.js

@@ -159,4 +159,13 @@ export function selectUserLeaderListByCondition(data) {
159 159
     method: 'post',
160 160
     data: data
161 161
   })
162
+}
163
+
164
+//查询人事绩效用户列表
165
+export function listUserPerformance(data) {
166
+  return request({
167
+    url: '/system/user/selectPersonnelUserList',
168
+    method: 'post',
169
+    data: data
170
+  })
162 171
 }

+ 191 - 0
src/views/examManage/monthlyAssessPerformance/index.vue

@@ -0,0 +1,191 @@
1
+<template>
2
+  <div class="app-container">
3
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
4
+      <el-form-item label="年月" prop="yearMonth">
5
+        <el-date-picker v-model="queryParams.yearMonth" type="month" placeholder="请选择年月" value-format="YYYY-MM" style="width: 200px" />
6
+      </el-form-item>
7
+      <el-form-item label="姓名" prop="studentName">
8
+        <el-input v-model="queryParams.studentName" placeholder="请输入姓名" clearable style="width: 200px" />
9
+      </el-form-item>
10
+      <el-form-item label="科队" prop="team">
11
+        <el-select v-model="queryParams.team" placeholder="请选择科队" clearable style="width: 200px">
12
+          <el-option v-for="dict in exam_team" :key="dict.value" :label="dict.label" :value="dict.value" />
13
+        </el-select>
14
+      </el-form-item>
15
+      <el-form-item label="岗位" prop="jobPosition">
16
+        <el-input v-model="queryParams.jobPosition" placeholder="请输入岗位" clearable style="width: 200px" />
17
+      </el-form-item>
18
+      <el-form-item>
19
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
20
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
21
+      </el-form-item>
22
+    </el-form>
23
+
24
+    <el-row :gutter="10" class="mb8">
25
+      <el-col :span="1.5">
26
+        <el-button type="info" plain icon="Upload" @click="handleImport">导入</el-button>
27
+      </el-col>
28
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
29
+    </el-row>
30
+
31
+    <el-table v-loading="loading" :data="trainingPerformanceList" >
32
+      <el-table-column label="年月" align="center" prop="yearMonth" />
33
+      <el-table-column label="学生" align="center" prop="studentName" />
34
+      <el-table-column label="科队" align="center" prop="team">
35
+        <template #default="scope">
36
+          <dict-tag :options="exam_team" :value="scope.row.team" />
37
+        </template>
38
+      </el-table-column>
39
+      <el-table-column label="岗位" align="center" prop="jobPosition">
40
+       
41
+      </el-table-column>
42
+      <el-table-column label="综合成绩" align="center" prop="comprehensiveScore" />
43
+      <el-table-column label="综合用时" align="center" prop="comprehensiveTime" />
44
+      <el-table-column label="专项成绩" align="center" prop="specialScore" />
45
+      <el-table-column label="专项用时" align="center" prop="specialTime" />
46
+    </el-table>
47
+
48
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
49
+      v-model:limit="queryParams.pageSize" @pagination="getList" />
50
+
51
+    <!-- 导入对话框 -->
52
+    <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
53
+      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
54
+        :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
55
+        :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
56
+        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
57
+        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
58
+        <template #tip>
59
+          <div class="el-upload__tip text-center">
60
+              <span>仅允许导入xls、xlsx格式文件。</span>
61
+              <el-link type="primary" :underline="false" style="font-size:16px;vertical-align: baseline;" @click="handleDownloadTemplate">下载模板</el-link>
62
+            </div>
63
+        </template>
64
+      </el-upload>
65
+      <template #footer>
66
+        <div class="dialog-footer">
67
+          <el-button type="primary" @click="submitFileForm">确 定</el-button>
68
+          <el-button @click="upload.open = false">取 消</el-button>
69
+        </div>
70
+      </template>
71
+    </el-dialog>
72
+  </div>
73
+</template>
74
+
75
+<script setup name="TrainingPerformance">
76
+import { listMonthlyScore, downloadTemplate, importData } from "@/api/examManage/monthlyAssessPerformance"
77
+import request from '@/utils/request'
78
+import { getToken } from "@/utils/auth"
79
+import { addDateRange, parseTime } from "@/utils/ruoyi"
80
+import { UploadFilled } from '@element-plus/icons-vue'
81
+
82
+const { proxy } = getCurrentInstance()
83
+const { exam_team, post } = proxy.useDict('exam_team', 'post')
84
+
85
+const trainingPerformanceList = ref([])
86
+const loading = ref(true)
87
+const showSearch = ref(true)
88
+const ids = ref([])
89
+const single = ref(true)
90
+const multiple = ref(true)
91
+const total = ref(0)
92
+const dateRange = ref([])
93
+
94
+// 导入参数
95
+const upload = reactive({
96
+  // 是否显示弹出层
97
+  open: false,
98
+  // 弹出层标题
99
+  title: "",
100
+  // 是否禁用上传
101
+  isUploading: false,
102
+  // 是否更新已经存在的用户数据
103
+  updateSupport: 0,
104
+  // 设置上传的请求头部
105
+  headers: { Authorization: "Bearer " + getToken() },
106
+  // 上传的地址
107
+  url: import.meta.env.VITE_APP_BASE_API + "/exam/monthlyScore/importData"
108
+})
109
+
110
+const data = reactive({
111
+  queryParams: {
112
+    pageNum: 1,
113
+    pageSize: 10,
114
+    yearMonth: undefined,
115
+    studentName: undefined,
116
+    team: undefined,
117
+    position: undefined
118
+  }
119
+})
120
+
121
+const { queryParams } = toRefs(data)
122
+
123
+/** 查询月考成绩列表 */
124
+function getList() {
125
+  loading.value = true;
126
+  let params = {
127
+    ...queryParams.value,
128
+  }
129
+  listMonthlyScore(params).then(response => {
130
+    trainingPerformanceList.value = response.rows
131
+    total.value = response.total
132
+    loading.value = false
133
+  })
134
+}
135
+
136
+/** 搜索按钮操作 */
137
+function handleQuery() {
138
+  queryParams.value.pageNum = 1
139
+  getList()
140
+}
141
+
142
+/** 重置按钮操作 */
143
+function resetQuery() {
144
+  dateRange.value = []
145
+  proxy.resetForm("queryRef")
146
+  handleQuery()
147
+}
148
+
149
+/** 多选框选中数据 */
150
+function handleSelectionChange(selection) {
151
+  ids.value = selection.map(item => item.id)
152
+  single.value = selection.length != 1
153
+  multiple.value = !selection.length
154
+}
155
+
156
+/** 导入按钮操作 */
157
+function handleImport() {
158
+  upload.title = "导入"
159
+  upload.open = true
160
+}
161
+
162
+/** 下载模板操作 */
163
+function handleDownloadTemplate() {
164
+  proxy.download("/exam/monthlyScore/importTemplate", {}, `monthly_score_template_${new Date().getTime()}.xlsx`, 'post')
165
+}
166
+
167
+/**文件上传中处理 */
168
+const handleFileUploadProgress = (event, file, fileList) => {
169
+  upload.isUploading = true
170
+}
171
+
172
+/** 文件上传成功处理 */
173
+const handleFileSuccess = (response, file, fileList) => {
174
+  upload.open = false
175
+  upload.isUploading = false
176
+  proxy.$refs["uploadRef"].handleRemove(file)
177
+  if (response.code === 200) {
178
+    proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true })
179
+    getList()
180
+  } else {
181
+    proxy.$modal.msgError(response.msg)
182
+  }
183
+}
184
+
185
+/** 提交上传文件 */
186
+function submitFileForm() {
187
+  proxy.$refs["uploadRef"].submit()
188
+}
189
+
190
+getList()
191
+</script>

Plik diff jest za duży
+ 1672 - 0
src/views/performanceManage/monthlyAssess/index.vue


+ 0 - 0
src/views/performanceManage/monthlyAssess/月度考核


Plik diff jest za duży
+ 1462 - 0
src/views/performanceManage/monthlyAssessSum/index.vue


+ 0 - 0
src/views/performanceManage/monthlyAssessSum/月度汇总


+ 453 - 0
src/views/system/classificationAssess/index.vue

@@ -0,0 +1,453 @@
1
+<template>
2
+  <div class="app-container">
3
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="100px">
4
+      <el-form-item label="编码" prop="code">
5
+        <el-input v-model="queryParams.code" placeholder="请输入编码" clearable @keyup.enter="handleQuery" />
6
+      </el-form-item>
7
+      <el-form-item label="考核指标名称" prop="name">
8
+        <el-input v-model="queryParams.name" placeholder="请输入考核指标名称" clearable @keyup.enter="handleQuery" />
9
+      </el-form-item>
10
+
11
+      <!-- <el-form-item label="重要程度" prop="categoryName"> -->
12
+      <!-- <el-select v-model="queryParams.importance" placeholder="请选择重要程度" clearable style="width: 180px;">
13
+          <el-option v-for="dict in base_check_importance" :key="dict.value" :label="dict.label" :value="dict.value" />
14
+        </el-select> -->
15
+      <!-- <el-input v-model="queryParams.categoryName" placeholder="请输入所属分类名称" clearable @keyup.enter="handleQuery" />
16
+      </el-form-item> -->
17
+      <el-form-item>
18
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
19
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
20
+      </el-form-item>
21
+    </el-form>
22
+
23
+    <el-row :gutter="10" class="mb8">
24
+      <el-col :span="1.5">
25
+        <el-button type="primary" plain icon="Plus" @click="handleAdd"
26
+          v-hasPermi="['system:indicator:add']">新增</el-button>
27
+      </el-col>
28
+      <!-- <el-col :span="1.5">
29
+        <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
30
+          v-hasPermi="['system:project:edit']">修改</el-button>
31
+      </el-col> -->
32
+      <el-col :span="1.5">
33
+        <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
34
+          v-hasPermi="['system:indicator:remove']">删除</el-button>
35
+      </el-col>
36
+      <el-col :span="1.5">
37
+        <el-button type="warning" plain icon="Download" @click="handleExport"
38
+          v-hasPermi="['system:indicator:export']">导出</el-button>
39
+      </el-col>
40
+      <el-col :span="1.5">
41
+        <el-button type="info" plain icon="Upload" @click="handleImport"
42
+          v-hasPermi="['system:indicator:import']">导入</el-button>
43
+      </el-col>
44
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
45
+    </el-row>
46
+
47
+    <el-table v-loading="loading" :data="indicatorList" @selection-change="handleSelectionChange">
48
+      <el-table-column type="selection" width="55" align="center" />
49
+      <el-table-column label="编码" align="center" prop="code" />
50
+      <el-table-column label="考核指标名称" align="center" prop="name" />
51
+      <el-table-column label="一级分类" align="center" prop="categoryNameOne" />
52
+      <el-table-column label="二级分类" align="center" prop="categoryName" />
53
+      <el-table-column label="分值" align="center" prop="score" />
54
+      <el-table-column label="单位" align="center" prop="unit" />
55
+      <el-table-column label="事病假" align="center" prop="leaveType">
56
+        <template #default="scope">
57
+          <dict-tag :options="base_performance_indicator_leave_type" :value="scope.row.leaveType" />
58
+        </template>
59
+      </el-table-column>
60
+      <!-- <el-table-column label="检查标准" align="center" prop="checkStandard" />
61
+      <el-table-column label="检查方法" align="center" prop="checkMethod" /> -->
62
+      <!-- <el-table-column label="重要程度" align="center" prop="importance">
63
+        <template #default="scope">
64
+          <dict-tag :options="base_check_importance" :value="scope.row.importance" />
65
+        </template>
66
+</el-table-column> -->
67
+      <!-- <el-table-column label="状态" align="center" prop="status" >
68
+        <template #default="scope">
69
+          <dict-tag :options="base_check_status" :value="scope.row.status"/>
70
+        </template>
71
+      </el-table-column> -->
72
+      <!-- <el-table-column label="备注" align="center" prop="remark" /> -->
73
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
74
+        <template #default="scope">
75
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
76
+            v-hasPermi="['system:indicator:edit']">修改</el-button>
77
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
78
+            v-hasPermi="['system:indicator:remove']">删除</el-button>
79
+        </template>
80
+      </el-table-column>
81
+    </el-table>
82
+
83
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
84
+      v-model:limit="queryParams.pageSize" @pagination="getList" />
85
+
86
+    <!-- 添加或修改考核指标对话框 -->
87
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
88
+      <el-form ref="projectRef" :model="form" :rules="rules" label-width="120px">
89
+        <!-- <el-form-item label="编码" prop="code">
90
+          <el-input v-model="form.code" placeholder="请输入编码"  />
91
+        </el-form-item> -->
92
+        <el-form-item label="考核指标名称" prop="name">
93
+          <el-input v-model="form.name" placeholder="请输入考核指标名称" />
94
+        </el-form-item>
95
+        <el-form-item label="二级分类" prop="categoryCode">
96
+          <el-tree-select v-model="form.categoryCode" :data="enableCategoryOptions"
97
+            :props="{ value: 'code', label: 'name', children: 'children' }" value-key="id" placeholder="请选择二级分类"
98
+            @node-click="handleNodeClick" />
99
+        </el-form-item>
100
+        <el-form-item label="分值" prop="score">
101
+          <el-input-number v-model="form.score"  :precision="2" placeholder="请输入分值" style="width: 100%" />
102
+        </el-form-item>
103
+
104
+
105
+
106
+
107
+        <el-form-item label="单位" prop="unit">
108
+          <el-input v-model="form.unit" placeholder="请输入单位" />
109
+        </el-form-item>
110
+
111
+        <el-form-item label="事病假" prop="leaveType">
112
+          <el-select v-model="form.leaveType" placeholder="请选择事病假" style="width: 100%">
113
+            <el-option v-for="dict in base_performance_indicator_leave_type" :key="dict.value" :label="dict.label" :value="dict.value" />
114
+          </el-select>
115
+        </el-form-item>
116
+        <!-- <el-form-item label="重要程度" prop="importance">
117
+          <el-select v-model="form.importance" placeholder="请选择重要程度">
118
+            <el-option v-for="dict in base_check_importance" :key="dict.value" :label="dict.label"
119
+              :value="dict.value"></el-option>
120
+          </el-select>
121
+        </el-form-item> -->
122
+
123
+        <el-form-item label="备注" prop="remark">
124
+          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
125
+        </el-form-item>
126
+      </el-form>
127
+      <template #footer>
128
+        <div class="dialog-footer">
129
+          <el-button type="primary" @click="submitForm">确 定</el-button>
130
+          <el-button @click="cancel">取 消</el-button>
131
+        </div>
132
+      </template>
133
+    </el-dialog>
134
+
135
+    <!-- 导入对话框 -->
136
+    <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
137
+      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
138
+        :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
139
+        :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
140
+        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
141
+        <div class="el-upload__text">
142
+          将文件拖到此处,或<em>点击上传</em>
143
+        </div>
144
+        <template #tip>
145
+          <div class="el-upload__tip">
146
+            <!-- <el-checkbox v-model="upload.updateSupport" /> -->
147
+            <!-- 是否更新已经存在的考核指标数据 -->
148
+             <span>仅允许导入xls、xlsx格式文件。</span>
149
+            <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;"
150
+              @click="importTemplate">下载模板</el-link>
151
+          </div>
152
+        </template>
153
+      </el-upload>
154
+      <template #footer>
155
+        <div class="dialog-footer">
156
+          <el-button type="primary" @click="submitFileForm">确 定</el-button>
157
+          <el-button @click="upload.open = false">取 消</el-button>
158
+        </div>
159
+      </template>
160
+    </el-dialog>
161
+  </div>
162
+</template>
163
+
164
+<script setup name="Project">
165
+import { listIndicator, getIndicator, delIndicator, addIndicator, updateIndicator, exportIndicator, importIndicator, getImportTemplate } from "@/api/system/classificationAssess"
166
+import { queryAssessCategoryTree } from "@/api/system/classificationAssessIndicator"
167
+import { getToken } from '@/utils/auth'
168
+const { proxy } = getCurrentInstance()
169
+const { base_check_importance, check_level, check_checked_level, base_performance_indicator_leave_type } = proxy.useDict('base_check_importance', 'check_level', 'check_checked_level', 'base_performance_indicator_leave_type')
170
+
171
+const indicatorList = ref([])
172
+const open = ref(false)
173
+const loading = ref(true)
174
+const showSearch = ref(true)
175
+const ids = ref([])
176
+const single = ref(true)
177
+const multiple = ref(true)
178
+const total = ref(0)
179
+const title = ref("")
180
+const base_check_status = ref([{ "value": "0", "label": "启用" }, { "value": "1", "label": "停用" }])
181
+const enableCategoryOptions = ref(undefined)
182
+
183
+// 导入参数
184
+const upload = reactive({
185
+  // 是否显示弹出层
186
+  open: false,
187
+  // 弹出层标题
188
+  title: "",
189
+  // 是否禁用上传
190
+  isUploading: false,
191
+  // 是否更新已经存在的考核指标数据
192
+  updateSupport: 0,
193
+  // 设置上传的请求头部
194
+  headers: { Authorization: "Bearer " + getToken() },
195
+  // 上传的地址
196
+  url: import.meta.env.VITE_APP_BASE_API + "/system/indicator/importData"
197
+})
198
+
199
+const uploadRef = ref()
200
+
201
+const data = reactive({
202
+  form: {},
203
+  queryParams: {
204
+    pageNum: 1,
205
+    pageSize: 10,
206
+    name: null,
207
+    code: null,
208
+  },
209
+  rules: {
210
+    name: [
211
+      { required: true, message: "考核指标名称不能为空", trigger: "blur" }
212
+    ],
213
+    categoryCode: [
214
+      { required: true, message: "分类编码不能为空", trigger: "blur" }
215
+    ],
216
+    // importance: [
217
+    //   { required: true, message: "重要程度不能为空", trigger: "change" }
218
+    // ],
219
+    status: [
220
+      { required: true, message: "状态不能为空", trigger: "change" }
221
+    ],
222
+    categoryName: [
223
+      { required: true, message: "分类名称不能为空", trigger: "blur" }
224
+    ],
225
+    code: [
226
+      { required: true, message: "编码不能为空", trigger: "blur" }
227
+    ],
228
+    // importanceDesc: [
229
+    //   { required: true, message: "重要程度名称不能为空", trigger: "blur" }
230
+    // ]
231
+  }
232
+})
233
+
234
+const { queryParams, form, rules } = toRefs(data)
235
+
236
+/** 查询考核指标列表 */
237
+function getList() {
238
+  loading.value = true
239
+  listIndicator(queryParams.value).then(response => {
240
+    indicatorList.value = response.rows
241
+    total.value = response.total
242
+    loading.value = false
243
+  })
244
+}
245
+
246
+// 取消按钮
247
+function cancel() {
248
+  open.value = false
249
+  reset()
250
+}
251
+
252
+// 表单重置
253
+function reset() {
254
+  form.value = {
255
+    tenantId: null,
256
+    revision: null,
257
+    createBy: null,
258
+    createTime: null,
259
+    updateBy: null,
260
+    updateTime: null,
261
+    id: null,
262
+    name: null,
263
+    categoryCode: null,
264
+    categoryCodeOne: null,
265
+    checkStandard: null,
266
+    checkMethod: null,
267
+    importance: null,
268
+    status: null,
269
+    categoryName: null,
270
+    categoryNameOne: null,
271
+    remark: null,
272
+    code: null,
273
+    importanceDesc: null
274
+  }
275
+  proxy.resetForm("projectRef")
276
+}
277
+
278
+/** 搜索按钮操作 */
279
+function handleQuery() {
280
+  queryParams.value.pageNum = 1
281
+  getList()
282
+}
283
+
284
+/** 重置按钮操作 */
285
+function resetQuery() {
286
+  proxy.resetForm("queryRef")
287
+  handleQuery()
288
+}
289
+
290
+// 多选框选中数据
291
+function handleSelectionChange(selection) {
292
+  ids.value = selection.map(item => item.id)
293
+  single.value = selection.length != 1
294
+  multiple.value = !selection.length
295
+}
296
+
297
+/** 新增按钮操作 */
298
+function handleAdd() {
299
+  reset()
300
+  open.value = true
301
+  title.value = "添加考核指标"
302
+}
303
+
304
+/** 修改按钮操作 */
305
+function handleUpdate(row) {
306
+  reset()
307
+  const _id = row.id || ids.value
308
+  getIndicator(_id).then(response => {
309
+    form.value = {
310
+      ...response.data,
311
+      checkLevel: response.data?.checkLevel?.split(","),
312
+    }
313
+    open.value = true
314
+    title.value = "修改考核指标"
315
+  })
316
+}
317
+
318
+/** 提交按钮 */
319
+function submitForm() {
320
+  proxy.$refs["projectRef"].validate(valid => {
321
+    if (valid) {
322
+      // 根据categoryCode获取categoryName和一级分类信息
323
+      if (form.value.categoryCode) {
324
+        const categoryInfo = getCategoryInfoByCode(form.value.categoryCode)
325
+        form.value.categoryName = categoryInfo.categoryName
326
+        form.value.categoryCodeOne = categoryInfo.categoryCodeOne
327
+        form.value.categoryNameOne = categoryInfo.categoryNameOne
328
+      }
329
+      
330
+      // 名称转换
331
+      if (form.value.importance) {
332
+        form.value.importanceDesc = base_check_importance.value.find(item => item.value === form.value.importance).label;
333
+      }
334
+      // form.value.checkLevelDesc = check_level.value.find(item => item.value === form.value.checkLevel).label;
335
+      let res = {
336
+        ...form.value,
337
+        checkLevel: form.value.checkLevel && form.value.checkLevel.join(","),
338
+      }
339
+      if (form.value.id != null) {
340
+        updateIndicator(res).then(response => {
341
+          proxy.$modal.msgSuccess("修改成功")
342
+          open.value = false
343
+          getList()
344
+        })
345
+      } else {
346
+        addIndicator(res).then(response => {
347
+          proxy.$modal.msgSuccess("新增成功")
348
+          open.value = false
349
+          getList()
350
+        })
351
+      }
352
+    }
353
+  })
354
+}
355
+
356
+/** 删除按钮操作 */
357
+function handleDelete(row) {
358
+  const _ids = row.id || ids.value
359
+  proxy.$modal.confirm('是否确认删除数据项?').then(function () {
360
+    return delIndicator(_ids)
361
+  }).then(() => {
362
+    getList()
363
+    proxy.$modal.msgSuccess("删除成功")
364
+  }).catch(() => { })
365
+}
366
+
367
+/** 导出按钮操作 */
368
+function handleExport() {
369
+  // 过滤掉值为null的参数,但保留分页参数
370
+  const filteredParams = Object.fromEntries(
371
+    Object.entries(queryParams.value).filter(([key, value]) => {
372
+      // 保留分页参数
373
+      if (key === 'pageNum' || key === 'pageSize') return true
374
+      // 过滤掉其他为null的参数
375
+      return value !== null
376
+    })
377
+  )
378
+ 
379
+  proxy.download('/system/indicator/export', filteredParams, `indicator_${new Date().getTime()}.xlsx`)
380
+}
381
+/** 查询分类下拉树结构 */
382
+function getCategoryTree() {
383
+  queryAssessCategoryTree().then(response => {
384
+    enableCategoryOptions.value = response.data
385
+  })
386
+}
387
+
388
+function handleNodeClick(data) {
389
+  form.value.categoryName = data.name;
390
+  // 根据选中的二级分类获取一级分类信息
391
+  const categoryInfo = getCategoryInfoByCode(data.code)
392
+  form.value.categoryCodeOne = categoryInfo.categoryCodeOne
393
+  form.value.categoryNameOne = categoryInfo.categoryNameOne
394
+}
395
+
396
+/** 根据categoryCode获取categoryName和categoryCodeOne, categoryNameOne */
397
+function getCategoryInfoByCode(categoryCode) {
398
+  if (!categoryCode || !enableCategoryOptions.value) return { categoryName: '', categoryCodeOne: '', categoryNameOne: '' }
399
+  
400
+  const findCategory = (categories, parent = null) => {
401
+    for (const category of categories) {
402
+      if (category.code === categoryCode) {
403
+        return {
404
+          categoryName: category.name,
405
+          categoryCodeOne: parent ? parent.code : '',
406
+          categoryNameOne: parent ? parent.name : ''
407
+        }
408
+      }
409
+      if (category.children && category.children.length > 0) {
410
+        const result = findCategory(category.children, category)
411
+        if (result) return result
412
+      }
413
+    }
414
+    return { categoryName: '', categoryCodeOne: '', categoryNameOne: '' }
415
+  }
416
+  
417
+  return findCategory(enableCategoryOptions.value)
418
+}
419
+
420
+/** 导入按钮操作 */
421
+function handleImport() {
422
+  upload.title = "考核指标导入"
423
+  upload.open = true
424
+}
425
+
426
+/** 下载模板操作 */
427
+function importTemplate() {
428
+  proxy.download('/system/indicator/importTemplate', {
429
+  }, `考核指标导入模板_${new Date().getTime()}.xlsx`)
430
+}
431
+
432
+/** 文件上传中处理 */
433
+const handleFileUploadProgress = (event, file, fileList) => {
434
+  upload.isUploading = true
435
+}
436
+
437
+/** 文件上传成功处理 */
438
+const handleFileSuccess = (response, file, fileList) => {
439
+  upload.open = false
440
+  upload.isUploading = false
441
+  uploadRef.value.handleRemove(file)
442
+  proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true })
443
+  getList()
444
+}
445
+
446
+/** 提交上传文件 */
447
+function submitFileForm() {
448
+  uploadRef.value.submit()
449
+}
450
+
451
+getCategoryTree()
452
+getList()
453
+</script>

+ 0 - 0
src/views/system/classificationAssess/考核指标


+ 272 - 0
src/views/system/classificationAssessIndicator/index.vue

@@ -0,0 +1,272 @@
1
+<template>
2
+  <div class="app-container">
3
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
4
+      
5
+      <el-form-item label="指标名称" prop="name">
6
+        <el-input
7
+          v-model="queryParams.name"
8
+          placeholder="请输入指标名称"
9
+          clearable
10
+          @keyup.enter="handleQuery"
11
+        />
12
+      </el-form-item>
13
+      <el-form-item>
14
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
15
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
16
+      </el-form-item>
17
+    </el-form>
18
+
19
+    <el-row :gutter="10" class="mb8">
20
+      <el-col :span="1.5">
21
+        <el-button
22
+          type="primary"
23
+          plain
24
+          icon="Plus"
25
+          @click="handleAdd"
26
+          v-hasPermi="['system:performanceIndicatorCategory:add']"
27
+        >新增</el-button>
28
+      </el-col>
29
+      <el-col :span="1.5">
30
+        <el-button
31
+          type="info"
32
+          plain
33
+          icon="Sort"
34
+          @click="toggleExpandAll"
35
+        >展开/折叠</el-button>
36
+      </el-col>
37
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
38
+    </el-row>
39
+
40
+    <el-table
41
+      v-if="refreshTable"
42
+      v-loading="loading"
43
+      :data="assessCategoryList"
44
+      row-key="id"
45
+      :default-expand-all="isExpandAll"
46
+      :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
47
+    >
48
+      <el-table-column label="序号" align="center" prop="code" />
49
+      <el-table-column label="指标名称" align="center" prop="name" />
50
+      <el-table-column label="显示顺序" align="center" prop="orderNum" />
51
+      <!-- <el-table-column label="分值" align="center" prop="score" /> -->
52
+      <el-table-column label="备注" align="center" prop="remark" />
53
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
54
+        <template #default="scope">
55
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:performanceIndicatorCategory:edit']">修改</el-button>
56
+          <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['system:performanceIndicatorCategory:add']">新增</el-button>
57
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:performanceIndicatorCategory:remove']">删除</el-button>
58
+        </template>
59
+      </el-table-column>
60
+    </el-table>
61
+
62
+    <!-- 添加或修改指标对话框 -->
63
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
64
+      <el-form ref="checkCategoryRef" :model="form" :rules="rules" label-width="80px">
65
+        <!-- <el-form-item label="序号" prop="code">
66
+      
67
+          <el-input v-model="form.code" placeholder="请输入序号" />
68
+        </el-form-item> -->
69
+        <el-form-item label="指标名称" prop="name">
70
+         
71
+          <el-input v-model="form.name" placeholder="请输入指标名称" />
72
+        </el-form-item>
73
+        <el-form-item label="上级位置" prop="parentId">
74
+        
75
+          <el-tree-select
76
+            v-model="form.parentId"
77
+            :data="assessCategoryOptions"
78
+            :props="{ value: 'id', label: 'name', children: 'children' }"
79
+            value-key="id"
80
+            placeholder="顶级节点"
81
+            check-strictly
82
+          />
83
+        </el-form-item>
84
+        <!-- <el-form-item label="分值/单位" prop="scoreUnit">
85
+          <div style="display: flex; align-items: center; gap: 8px; width: 100%;">
86
+            <el-input v-model="form.score" placeholder="" style="flex: 1;" />
87
+            <span>/</span>
88
+            <el-input v-model="form.unit" placeholder="请输入单位" style="flex: 1;" />
89
+          </div>
90
+        </el-form-item> -->
91
+        <el-form-item label="备注" prop="remark">
92
+          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
93
+        </el-form-item>
94
+      </el-form>
95
+      <template #footer>
96
+        <div class="dialog-footer">
97
+          <el-button type="primary" @click="submitForm">确 定</el-button>
98
+          <el-button @click="cancel">取 消</el-button>
99
+        </div>
100
+      </template>
101
+    </el-dialog>
102
+  </div>
103
+</template>
104
+
105
+<script setup name="CheckCategory">
106
+import { queryAssessCategoryList, queryAssessCategoryDetail, addAssessCategory, updateAssessCategory, deleteAssessCategory } from "@/api/system/classificationAssessIndicator"
107
+
108
+const { proxy } = getCurrentInstance()
109
+
110
+const assessCategoryList = ref([])
111
+const assessCategoryOptions = ref([])
112
+const open = ref(false)
113
+const loading = ref(true)
114
+const showSearch = ref(true)
115
+const title = ref("")
116
+const isExpandAll = ref(true)
117
+const refreshTable = ref(true)
118
+
119
+const data = reactive({
120
+  form: {},
121
+  queryParams: {
122
+    name: null,
123
+    parentId: null,
124
+    code: null,
125
+    code: null,
126
+    score: null,
127
+    unit: null,
128
+  },
129
+  rules: {
130
+    name: [
131
+      { required: true, message: "指标名称不能为空", trigger: "blur" }
132
+    ],
133
+    parentId: [
134
+      { required: true, message: "上级位置不能为空", trigger: "blur" }
135
+    ],
136
+    code: [
137
+      { required: true, message: "序号不能为空", trigger: "blur" }
138
+    ],
139
+  }
140
+})
141
+
142
+const { queryParams, form, rules } = toRefs(data)
143
+
144
+/** 查询考核指标分类列表 */
145
+function getList() {
146
+  loading.value = true
147
+  queryAssessCategoryList(queryParams.value).then(response => {
148
+    assessCategoryList.value = proxy.handleTree(response.data, "id", "parentId")
149
+    loading.value = false
150
+  })
151
+}
152
+
153
+/** 查询考核指标分类下拉树结构 */
154
+function getTreeselect() {
155
+  queryAssessCategoryList().then(response => {
156
+    assessCategoryOptions.value = []
157
+    const data = { id: 0, name: '顶级节点', children: [] }
158
+    data.children = proxy.handleTree(response.data, "id", "parentId")
159
+    assessCategoryOptions.value.push(data)
160
+  })
161
+}
162
+	
163
+// 取消按钮
164
+function cancel() {
165
+  open.value = false
166
+  reset()
167
+}
168
+
169
+// 表单重置
170
+function reset() {
171
+  form.value = {
172
+    tenantId: null,
173
+    revision: null,
174
+    createBy: null,
175
+    createTime: null,
176
+    updateBy: null,
177
+    updateTime: null,
178
+    id: null,
179
+    name: null,
180
+    parentId: null,
181
+    ancestors: null,
182
+    level: null,
183
+    code: null,
184
+    code: null,
185
+    score: null,
186
+    unit: null,
187
+    remark: null
188
+  }
189
+  proxy.resetForm("checkCategoryRef")
190
+}
191
+
192
+/** 搜索按钮操作 */
193
+function handleQuery() {
194
+  getList()
195
+}
196
+
197
+/** 重置按钮操作 */
198
+function resetQuery() {
199
+  proxy.resetForm("queryRef")
200
+  handleQuery()
201
+}
202
+
203
+/** 新增按钮操作 */
204
+function handleAdd(row) {
205
+  reset()
206
+  getTreeselect()
207
+  
208
+  if (row != null && row.id) {
209
+    form.value.parentId = row.id
210
+  } else {
211
+    form.value.parentId = 0
212
+  }
213
+  open.value = true
214
+  title.value = "添加指标"
215
+}
216
+
217
+/** 展开/折叠操作 */
218
+function toggleExpandAll() {
219
+  refreshTable.value = false
220
+  isExpandAll.value = !isExpandAll.value
221
+  nextTick(() => {
222
+    refreshTable.value = true
223
+  })
224
+}
225
+
226
+/** 修改按钮操作 */
227
+async function handleUpdate(row) {
228
+  reset()
229
+  await getTreeselect()
230
+  if (row != null) {
231
+    form.value.parentId = row.parentId
232
+  }
233
+  queryAssessCategoryDetail(row.id).then(response => {
234
+    form.value = response.data
235
+    open.value = true
236
+    title.value = "修改指标"
237
+  })
238
+}
239
+
240
+/** 提交按钮 */
241
+function submitForm() {
242
+  proxy.$refs["checkCategoryRef"].validate(valid => {
243
+    if (valid) {
244
+      if (form.value.id != null) {
245
+        updateAssessCategory(form.value).then(response => {
246
+          proxy.$modal.msgSuccess("修改成功")
247
+          open.value = false
248
+          getList()
249
+        })
250
+      } else {
251
+        addAssessCategory(form.value).then(response => {
252
+          proxy.$modal.msgSuccess("新增成功")
253
+          open.value = false
254
+          getList()
255
+        })
256
+      }
257
+    }
258
+  })
259
+}
260
+
261
+/** 删除按钮操作 */
262
+function handleDelete(row) {
263
+  proxy.$modal.confirm('是否确认删除数据项?').then(function() {
264
+    return deleteAssessCategory(row.id)
265
+  }).then(() => {
266
+    getList()
267
+    proxy.$modal.msgSuccess("删除成功")
268
+  }).catch(() => {})
269
+}
270
+
271
+getList()
272
+</script>

+ 0 - 0
src/views/system/classificationAssessIndicator/考核指标分类


+ 8 - 0
src/views/system/dept/index.vue

@@ -137,6 +137,14 @@
137 137
                   </el-form-item>
138 138
                </el-col>
139 139
                <el-col :span="12">
140
+                  <el-form-item label="职能部门" prop="isFunctionalDept">
141
+                     <el-select v-model="form.isFunctionalDept" placeholder="请选择">
142
+                        <el-option :label="'是'" :value="'1'" />
143
+                        <el-option :label="'否'" :value="'0'" />
144
+                     </el-select>
145
+                  </el-form-item>
146
+               </el-col>
147
+               <el-col :span="12">
140 148
                   <el-form-item label="显示排序" prop="orderNum">
141 149
                      <el-input-number v-model="form.orderNum" controls-position="right" :min="0" />
142 150
                   </el-form-item>