tangweijie d4cb996085 fix(performance): 批量更新接口优化问卷系统性能
- 添加batchUpdate API调用
- 修复savePartitions循环调用API问题 (50题只需1次请求)
- 修复onPartitionDragEnd拖拽排序性能问题
- 修复onQuestionDragEnd问题拖拽排序性能问题
- 添加自动填充来源字典支持 PRISON_QUESTION_AUTO_FILL_SOURCE
- 问题表单优化: 折叠面板、分区选择、快速粘贴等
2026-01-13 16:25:02 +08:00

278 lines
8.3 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="80px"
>
<el-form-item label="罪犯编号" prop="prisonerNo">
<el-input
v-model="queryParams.prisonerNo"
placeholder="请输入罪犯编号"
clearable
@keyup.enter="handleQuery"
class="!w-140px"
/>
</el-form-item>
<el-form-item label="评估类型" prop="assessmentType">
<el-select
v-model="queryParams.assessmentType"
placeholder="请选择"
clearable
class="!w-120px"
>
<el-option
v-for="dict in assessmentTypeOptions"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="风险等级" prop="riskLevel">
<el-select
v-model="queryParams.riskLevel"
placeholder="请选择"
clearable
class="!w-100px"
>
<el-option
v-for="dict in riskLevelOptions"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select
v-model="queryParams.status"
placeholder="请选择"
clearable
class="!w-90px"
>
<el-option
v-for="dict in statusOptions"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['prison:risk-assessment:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['prison:risk-assessment:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
<el-button
type="danger"
plain
:disabled="checkedIds.length === 0"
@click="handleDeleteBatch"
v-hasPermi="['prison:risk-assessment:delete']"
>
<Icon icon="ep:delete" class="mr-5px" /> 批量删除
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table
v-loading="loading"
:data="list"
@selection-change="handleRowCheckboxChange"
>
<el-table-column type="selection" width="55" />
<el-table-column label="评估ID" align="center" prop="id" width="80" />
<el-table-column label="罪犯编号" align="center" prop="prisonerNo" width="120" />
<el-table-column label="评估类型" align="center" prop="assessmentType" width="100">
<template #default="scope">
<dict-tag :type="DICT_TYPE.PRISON_ASSESSMENT_TYPE" :value="scope.row.assessmentType" />
</template>
</el-table-column>
<el-table-column label="评估日期" align="center" prop="assessmentDate" width="120" />
<el-table-column label="暴力得分" align="center" prop="violenceScore" width="90" />
<el-table-column label="脱逃得分" align="center" prop="escapeScore" width="90" />
<el-table-column label="自杀得分" align="center" prop="suicideScore" width="90" />
<el-table-column label="综合得分" align="center" prop="totalScore" width="90" />
<el-table-column label="风险等级" align="center" prop="riskLevel" width="100">
<template #default="scope">
<dict-tag :type="DICT_TYPE.PRISON_RISK_LEVEL" :value="scope.row.riskLevel" />
</template>
</el-table-column>
<el-table-column label="风险因素" align="center" prop="riskFactors" width="150" />
<el-table-column label="评估人" align="center" prop="assessorName" width="100" />
<el-table-column label="状态" align="center" prop="status" width="90">
<template #default="scope">
<dict-tag :type="DICT_TYPE.PRISON_SCORE_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
{{ formatDate(scope.row.createTime) }}
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="120">
<template #default="scope">
<el-button
type="primary"
link
@click="openForm('update', scope.row.id)"
v-hasPermi="['prison:risk-assessment:update']"
>
修改
</el-button>
<el-button
type="danger"
link
@click="handleDelete(scope.row.id)"
v-hasPermi="['prison:risk-assessment:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<RiskAssessmentForm ref="formRef" @success="getList" />
</template>
<script lang="ts" setup>
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import download from '@/utils/download'
import { RiskAssessmentApi, RiskAssessment } from '@/api/prison/riskassessment'
import RiskAssessmentForm from './RiskAssessmentForm.vue'
defineOptions({ name: 'RiskAssessment' })
const message = useMessage()
const { t } = useI18n()
const loading = ref(true)
const list = ref<RiskAssessment[]>([])
const total = ref(0)
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
prisonerNo: undefined,
assessmentType: undefined,
riskLevel: undefined,
status: undefined
})
const queryFormRef = ref()
const exportLoading = ref(false)
// 使用字典获取选项
const assessmentTypeOptions = getIntDictOptions(DICT_TYPE.PRISON_ASSESSMENT_TYPE)
const riskLevelOptions = getIntDictOptions(DICT_TYPE.PRISON_RISK_LEVEL)
const statusOptions = getIntDictOptions(DICT_TYPE.PRISON_SCORE_STATUS)
/** 日期格式化 */
const formatDate = (date: string | Date | undefined) => {
if (!date) return '-'
return new Date(date).toLocaleString('zh-CN')
}
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await RiskAssessmentApi.getRiskAssessmentPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
await message.delConfirm()
await RiskAssessmentApi.deleteRiskAssessment(id)
message.success(t('common.delSuccess'))
await getList()
} catch {}
}
/** 批量删除按钮操作 */
const checkedIds = ref<number[]>([])
const handleRowCheckboxChange = (rows: RiskAssessment[]) => {
checkedIds.value = rows.map((row) => row.id!)
}
const handleDeleteBatch = async () => {
try {
await message.delConfirm()
await RiskAssessmentApi.deleteRiskAssessmentList(checkedIds.value)
checkedIds.value = []
message.success(t('common.delSuccess'))
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
await message.exportConfirm()
exportLoading.value = true
const data = await RiskAssessmentApi.exportRiskAssessment(queryParams)
download.excel(data, '危险评估.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 */
onMounted(() => {
getList()
})
</script>