228 lines
8.2 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>
<Dialog :title="dialogTitle" v-model="dialogVisible" width="700px">
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px" v-loading="formLoading">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="维度名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入维度名称,如:消费行为分析" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="维度编码" prop="code">
<el-input v-model="formData.code" placeholder="请输入维度编码" :disabled="formType === 'update'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="维度类型" prop="dimensionType">
<el-select v-model="formData.dimensionType" placeholder="请选择维度类型" class="!w-100%">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.PRISON_EVALUATION_DIMENSION_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="评估方式" prop="evaluationMethod">
<el-select v-model="formData.evaluationMethod" placeholder="请选择评估方式" class="!w-100%">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.PRISON_EVALUATION_METHOD)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="输出格式" prop="outputFormat">
<el-select v-model="formData.outputFormat" placeholder="请选择输出格式" class="!w-100%">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.PRISON_EVALUATION_OUTPUT_FORMAT)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="编辑器类型" prop="editorType">
<el-select v-model="formData.editorType" placeholder="请选择编辑器类型" class="!w-100%">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.PRISON_EVALUATION_EDITOR_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="排序" prop="sort">
<el-input-number v-model="formData.sort" :min="0" controls-position="right" class="!w-100%" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="状态" prop="status">
<el-radio-group v-model="formData.status">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.PRISON_COMMON_STATUS)"
:key="dict.value"
:value="dict.value"
>{{ dict.label }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否AI生成" prop="aiEnabled">
<el-switch v-model="formData.aiEnabled" :active-value="1" :inactive-value="0" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否必填" prop="isRequired">
<el-switch v-model="formData.isRequired" :active-value="1" :inactive-value="0" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="数据源绑定" prop="dataSources">
<el-select v-model="formData.dataSources" multiple placeholder="请选择数据源" class="!w-100%">
<el-option label="罪犯档案" value="prisoner" />
<el-option label="消费记录" value="consumption" />
<el-option label="计分考核" value="score" />
<el-option label="问卷测评" value="questionnaire" />
<el-option label="风险评估" value="risk" />
<el-option label="违规记录" value="violation" />
<el-option label="奖励记录" value="reward" />
<el-option label="会见记录" value="visit" />
<el-option label="劳动数据" value="labor" />
<el-option label="家庭帮教" value="family" />
<el-option label="心理测评" value="psychology" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="维度描述" prop="description">
<el-input v-model="formData.description" type="textarea" :rows="2" placeholder="请输入维度描述" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="AI提示词" prop="aiPrompt">
<el-input v-model="formData.aiPrompt" type="textarea" :rows="4" placeholder="请输入AI提示词用于指导AI生成该维度的内容" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { DimensionApi, DimensionVO } from '@/api/prison/evaluation-report'
defineOptions({ name: 'EvaluationDimensionForm' })
const { t } = useI18n()
const message = useMessage()
const dialogVisible = ref(false)
const dialogTitle = ref('')
const formLoading = ref(false)
const formType = ref('')
const formData = ref<DimensionVO>({
id: undefined,
templateId: 0,
name: '',
code: '',
description: '',
dimensionType: undefined,
aiPrompt: '',
dataSources: [], // 改为空数组
questions: [], // 问题列表也改为空数组
outputFormat: 1,
aiEnabled: 0,
editorType: 1,
sort: 0,
isRequired: 1,
status: 1
})
const formRules = reactive({
name: [{ required: true, message: '维度名称不能为空', trigger: 'blur' }],
dimensionType: [{ required: true, message: '维度类型不能为空', trigger: 'change' }],
status: [{ required: true, message: '状态不能为空', trigger: 'change' }]
})
const formRef = ref()
const open = async (type: string, templateId: number, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
formData.value.templateId = templateId
if (id) {
formLoading.value = true
try {
const existingDimension = await DimensionApi.getDimension(id)
formData.value = { ...existingDimension, templateId }
} finally {
formLoading.value = false
}
}
}
defineExpose({ open })
const emit = defineEmits(['success'])
const submitForm = async () => {
await formRef.value.validate()
formLoading.value = true
try {
// 创建提交数据的副本,确保数组字段被正确传递
const submitData = {
...formData.value,
dataSources: formData.value.dataSources || [],
questions: formData.value.questions || []
}
if (formType.value === 'create') {
await DimensionApi.createDimension(submitData)
message.success(t('common.createSuccess'))
} else {
await DimensionApi.updateDimension(submitData)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
emit('success')
} finally {
formLoading.value = false
}
}
const resetForm = () => {
formData.value = {
id: undefined,
templateId: formData.value.templateId,
name: '',
code: '',
description: '',
dimensionType: undefined,
aiPrompt: '',
dataSources: [], // 改为空数组
questions: [], // 问题列表也改为空数组
outputFormat: 1,
aiEnabled: 0,
editorType: 1,
sort: 0,
isRequired: 1,
status: 1
}
formRef.value?.resetFields()
}
</script>