莳松-行政管理系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
ss-oa-manage-web/src/views/Kpi/Score/index.vue

213 lines
6.4 KiB

<template>
<div>
<!-- 搜索工作栏 -->
<el-form :model="searchForm" inline label-width="0">
<el-form-item>
<el-date-picker
v-model="searchForm.period"
type="month"
format="YYYY-MM"
value-format="YYYY-MM"
:clearable="false"
style="width: 100%"
/>
</el-form-item>
<el-form-item>
<el-button @click="getList" v-hasPermi="['kpi:score:search']"> 搜索</el-button>
</el-form-item>
</el-form>
<el-tabs v-model="employeeId" @tab-click="getList">
<el-tab-pane
v-for="item in employeeOptions"
:key="item.examinedUser"
:name="item.examinedUser"
>
<template #label>
<span>{{ item.examinedUserName }}</span>
<el-badge :is-dot="item.notExaminedCount > 0" type="danger" />
</template>
<div class="mb-10px">
<el-tag v-if="periodSaved == 1" type="danger">
当前周期已封存,不可修改当月绩效考核
</el-tag>
<el-tag v-else type="warning">
当前周期未封存,可选择修改当月绩效考核,两秒内不操作将自动保存考核结果
</el-tag>
</div>
<el-table
v-loading="loading"
:data="list"
border
show-summary
:summary-method="getSummaries"
>
<el-table-column prop="examineTarget" label="考核指标" width="180" />
<el-table-column prop="typeName" label="分值模式" width="90" />
<el-table-column prop="weight" label="权重%" width="90" />
<el-table-column label="考核内容">
<template #default="{ row }">
<div v-dompurify-html="row.examineContent"></div>
</template>
</el-table-column>
<el-table-column label="考核规则" prop="examineRule">
<template #default="{ row }">
<div v-dompurify-html="row.examineRule"></div>
</template>
</el-table-column>
<el-table-column label="评分上限" prop="examineScore" width="90" />
<el-table-column label="考核评分" width="120">
<template #default="{ row }">
<div v-if="periodSaved == 1">{{ row.score }}</div>
<el-input-number
v-else
v-model="row.score"
:min="0"
:max="row.examineScore"
:step="1"
:controls="false"
size="small"
style="width: 100%"
@input="handleSave(row)"
/>
</template>
</el-table-column>
<el-table-column label="评分备注" width="200">
<template #default="{ row }">
<div v-if="periodSaved == 1">{{ row.remark }}</div>
<el-input
v-else
v-model="row.remark"
type="textarea"
:rows="3"
size="small"
style="width: 100%"
@input="handleSave(row)"
/>
</template>
</el-table-column>
<el-table-column label="加权得分" prop="weightSocre" width="90" />
<el-table-column label="操作" fixed="right" width="100">
<template #default="{ row }">
<el-button style="padding: 0" type="danger" text @click="handleDelete(row)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script setup name="KpiScore">
import { formatDate } from '@/utils/formatTime'
import * as KpiApi from '@/api/kpi/score.js'
const { t } = useI18n() // 国际化
const message = useMessage() // 消息弹窗
const loading = ref(false) // 列表的加载中
const list = ref([]) // 列表的数据
const searchForm = ref({
period: undefined
})
const periodSaved = ref(0)
const employeeOptions = ref([])
const employeeId = ref('')
onMounted(() => {
// 默认取上个月
const today = new Date()
searchForm.value.period = formatDate(
new Date(today.getFullYear(), today.getMonth() - 1),
'YYYY-MM'
)
getList()
})
async function getList() {
try {
KpiApi.getKpiPeriodStatus({ period: searchForm.value.period }).then((data) => {
periodSaved.value = data.status
})
// 获取当前要考核的人员
const arr = await KpiApi.getKpiEmployees(searchForm.value)
employeeOptions.value = arr || []
if (employeeOptions.value.length > 0) {
if (!employeeId.value) {
employeeId.value = employeeOptions.value[0].examinedUser
}
} else {
message.error('当月无待考核员工!!!')
return
}
list.value =
employeeOptions.value.find((it) => it.examinedUser == employeeId.value)
?.examineScoreRespVOList || []
} finally {
loading.value = false
}
}
let timer = ref(null)
const lastId = ref('')
function handleSave(row) {
try {
lastId.value == row.id && clearTimeout(timer.value)
timer.value = setTimeout(async () => {
lastId.value = row.id
// message.success('正在保存数据,请稍后')
await KpiApi.saveKpiScore({
id: row.id,
score: row.score,
remark: row.remark
})
message.success('修改成功!')
getList()
}, 2000)
} catch (err) {
console.log(err)
}
}
async function handleDelete(row) {
try {
// 删除的二次确认
await message.delConfirm(
`删除后,该员工于${searchForm.value.period}将不再考核此项,是否确认删除?`
)
// 发起删除
await KpiApi.deleteKpiItem({ id: row.id })
message.success(t('common.delSuccess'))
// 刷新列表
await getList()
} catch {}
}
function getSummaries({ columns, data }) {
let sums = []
columns.forEach((column, index) => {
if (index == 0) {
sums[index] = '考核总分'
return
}
const values = data.map((item) => Number(item[column.property]))
if (!values.every((value) => Number.isNaN(value))) {
if (column.property == 'weightSocre') {
const employee = employeeOptions.value.find((it) => it.examinedUser == employeeId.value)
sums[index] = employee.scoreTotal
} else {
sums[index] = ''
}
} else {
sums[index] = ''
}
})
return sums
}
</script>
<style lang="scss" scoped></style>