202 lines
5.9 KiB
Vue
202 lines
5.9 KiB
Vue
<template>
|
|
<el-dialog
|
|
v-model="dialogVisible"
|
|
title="调监操作"
|
|
width="500px"
|
|
:close-on-click-modal="false"
|
|
>
|
|
<el-form ref="formRef" :model="formData" :rules="rules" label-width="100px" v-loading="loading">
|
|
<!-- 罪犯信息展示 -->
|
|
<el-form-item label="罪犯信息">
|
|
<el-descriptions :column="1" border size="small">
|
|
<el-descriptions-item label="罪犯编号">{{ prisoner.prisonerNo }}</el-descriptions-item>
|
|
<el-descriptions-item label="姓名">{{ prisoner.name }}</el-descriptions-item>
|
|
<el-descriptions-item label="当前监区">{{ prisoner.areaName }}</el-descriptions-item>
|
|
<el-descriptions-item label="当前监室">{{ prisoner.cellName }}</el-descriptions-item>
|
|
</el-descriptions>
|
|
</el-form-item>
|
|
|
|
<el-form-item label="目标监区" prop="targetAreaId">
|
|
<el-select
|
|
v-model="formData.targetAreaId"
|
|
placeholder="请选择目标监区"
|
|
clearable
|
|
style="width: 100%"
|
|
@change="handleTargetAreaChange"
|
|
>
|
|
<el-option
|
|
v-for="area in areaList"
|
|
:key="area.id"
|
|
:label="area.name"
|
|
:value="area.id"
|
|
/>
|
|
</el-select>
|
|
</el-form-item>
|
|
|
|
<el-form-item label="目标分监区" prop="targetSubAreaId">
|
|
<el-select
|
|
v-model="formData.targetSubAreaId"
|
|
placeholder="请选择目标分监区"
|
|
clearable
|
|
style="width: 100%"
|
|
@change="handleTargetSubAreaChange"
|
|
>
|
|
<el-option
|
|
v-for="subArea in subAreaList"
|
|
:key="subArea.id"
|
|
:label="subArea.name"
|
|
:value="subArea.id"
|
|
/>
|
|
</el-select>
|
|
</el-form-item>
|
|
|
|
<el-form-item label="目标监室" prop="targetCellId">
|
|
<el-select
|
|
v-model="formData.targetCellId"
|
|
placeholder="请选择目标监室"
|
|
clearable
|
|
style="width: 100%"
|
|
>
|
|
<el-option
|
|
v-for="cell in cellList"
|
|
:key="cell.id"
|
|
:label="`${cell.name} (${cell.currentCount}/${cell.capacity})`"
|
|
:value="cell.id"
|
|
:disabled="cell.currentCount >= cell.capacity"
|
|
/>
|
|
</el-select>
|
|
</el-form-item>
|
|
|
|
<el-form-item label="调监原因" prop="reason">
|
|
<el-input v-model="formData.reason" type="textarea" :rows="3" placeholder="请输入调监原因" />
|
|
</el-form-item>
|
|
</el-form>
|
|
<template #footer>
|
|
<el-button @click="dialogVisible = false">取消</el-button>
|
|
<el-button type="primary" @click="handleSubmit" :loading="loading">确定</el-button>
|
|
</template>
|
|
</el-dialog>
|
|
</template>
|
|
|
|
<script lang="ts" setup>
|
|
import { ElMessage } from 'element-plus'
|
|
import * as PrisonerApi from '@/api/prison/prisoner'
|
|
import { AreaApi } from '@/api/prison/area'
|
|
import { CellApi } from '@/api/prison/cell'
|
|
|
|
defineOptions({ name: 'PrisonTransferForm' })
|
|
|
|
const emit = defineEmits(['success'])
|
|
|
|
const dialogVisible = ref(false)
|
|
const loading = ref(false)
|
|
const formRef = ref()
|
|
const prisoner = ref<any>({})
|
|
const areaList = ref([])
|
|
const subAreaList = ref([])
|
|
const cellList = ref([])
|
|
|
|
const formData = reactive({
|
|
prisonerId: undefined as number | undefined,
|
|
targetAreaId: undefined as number | undefined,
|
|
targetSubAreaId: undefined as number | undefined,
|
|
targetCellId: undefined as number | undefined,
|
|
reason: ''
|
|
})
|
|
|
|
const rules = {
|
|
targetAreaId: [{ required: true, message: '请选择目标监区', trigger: 'change' }],
|
|
targetSubAreaId: [{ required: true, message: '请选择目标分监区', trigger: 'change' }],
|
|
targetCellId: [{ required: true, message: '请选择目标监室', trigger: 'change' }]
|
|
}
|
|
|
|
/** 打开弹窗 */
|
|
const open = async (prisonerId: number) => {
|
|
dialogVisible.value = true
|
|
loading.value = true
|
|
resetForm()
|
|
try {
|
|
// 获取罪犯信息
|
|
prisoner.value = await PrisonerApi.getPrisoner(prisonerId)
|
|
formData.prisonerId = prisonerId
|
|
// 加载监区列表
|
|
const treeData = await AreaApi.getAreaTree()
|
|
areaList.value = treeData.filter((item: any) => item.level === 1 || item.parentId === 0)
|
|
} finally {
|
|
loading.value = false
|
|
}
|
|
}
|
|
|
|
/** 目标监区变化 */
|
|
const handleTargetAreaChange = async (areaId: number) => {
|
|
formData.targetSubAreaId = undefined
|
|
formData.targetCellId = undefined
|
|
subAreaList.value = []
|
|
cellList.value = []
|
|
if (areaId) {
|
|
const treeData = await AreaApi.getAreaTree()
|
|
const area = findArea(treeData, areaId)
|
|
if (area && area.children) {
|
|
subAreaList.value = area.children
|
|
}
|
|
}
|
|
}
|
|
|
|
/** 目标分监区变化 */
|
|
const handleTargetSubAreaChange = async (subAreaId: number) => {
|
|
formData.targetCellId = undefined
|
|
cellList.value = []
|
|
if (subAreaId) {
|
|
cellList.value = await CellApi.getCellPage({ areaId: subAreaId, pageNo: 1, pageSize: 200 }).then((res: any) => res.list || [])
|
|
}
|
|
}
|
|
|
|
/** 递归查找监区 */
|
|
const findArea = (areas: any[], id: number): any => {
|
|
for (const area of areas) {
|
|
if (area.id === id) return area
|
|
if (area.children) {
|
|
const found = findArea(area.children, id)
|
|
if (found) return found
|
|
}
|
|
}
|
|
return null
|
|
}
|
|
|
|
/** 重置表单 */
|
|
const resetForm = () => {
|
|
formData.prisonerId = undefined
|
|
formData.targetAreaId = undefined
|
|
formData.targetSubAreaId = undefined
|
|
formData.targetCellId = undefined
|
|
formData.reason = ''
|
|
prisoner.value = {}
|
|
subAreaList.value = []
|
|
cellList.value = []
|
|
formRef.value?.resetFields()
|
|
}
|
|
|
|
/** 提交 */
|
|
const handleSubmit = async () => {
|
|
const valid = await formRef.value?.validate()
|
|
if (!valid) return
|
|
|
|
loading.value = true
|
|
try {
|
|
await PrisonerApi.doTransfer({
|
|
prisonerId: formData.prisonerId!,
|
|
targetCellId: formData.targetCellId!,
|
|
reason: formData.reason
|
|
})
|
|
ElMessage.success('调监成功')
|
|
dialogVisible.value = false
|
|
emit('success')
|
|
} catch {
|
|
} finally {
|
|
loading.value = false
|
|
}
|
|
}
|
|
|
|
defineExpose({ open })
|
|
</script>
|