<!-- * @description: 编辑原子指标 * @fileName: EditAtomic * @author: 17076 * @date: 2024/6/28-上午10:14 * @version: V1.0.0 --> <template> <cs-drawer :drawer-option="drawerOption" @onReset="handleReset" @onSubmit="handleSubmit" > <template slot="content"> <div class="add-atomic"> <el-form ref="form" :model="ruleForm" :rules="rules" label-width="120px"> <el-form-item label="案件类型" prop="caseType"> <el-select v-model="ruleForm.caseType" :disabled="isView" placeholder="请选择案件类型" style="width: 100%"> <el-option v-for="item in caseTypeOptions" :key="item.value" :label="item.label" :value="item.value" /> </el-select> </el-form-item> <el-form-item label="原子指标名称" prop="name"> <el-input v-model="ruleForm.name" :disabled="isView" placeholder="请输入原子指标名称" /> </el-form-item> <el-form-item label="指标算法" prop="indexSource"> <el-radio-group v-model="ruleForm['indexSource']" :disabled="isEdit|| isView" @change="changeType"> <!-- <el-radio v-for="item in sourceOptions" :key="item.value" :label="item.value" > {{ item.label }} </el-radio> --> <el-radio label="2">数据库查询</el-radio> <el-radio label="5">结构化查询</el-radio> <el-radio label="3">图谱生成</el-radio> <el-radio label="4">大模型推理</el-radio> <el-radio label="1">人工指定</el-radio> </el-radio-group> </el-form-item> <el-form-item v-if="['3','5'].includes(ruleForm['indexSource'])" label="查询语句" prop="promptId"> <div v-if="!isView" class="select-btn" @click="selectSql">请选择</div> <div v-if="selectInfo.promptName" class="sel-name">{{ `已选:${selectInfo.promptName}` }}</div> <!-- <div v-if="ruleForm['indexSource'] === '4'" class="sel-name">{{ `已选:指令名称(即证据模板名称)` }}</div> <span v-if="ruleForm['indexSource'] === '3'" class="sel-desc">{{ `头节点类型-关系-尾节点类型` }}</span> --> <div v-if="ruleForm['indexSource'] === '5' && selectInfo.extractAttributes.length > 0" class="select-model-list"> <div v-for="(item,index) in selectInfo.extractAttributes" :key="index" class="model-list-item"> <span>{{ item }}</span> </div> </div> </el-form-item> <el-form-item v-if="ruleForm.indexSource ==='2'" label="关联分类" prop="categoryIdPath"> <el-cascader v-model="ruleForm.categoryIdPath" :disabled="isView" style="width: 100%;" :props="defaultProps" :options="treeData" /> </el-form-item> <!-- <el-form-item v-if="ruleForm['indexSource'] === '4'" label="prompt标签" prop="recordType"> <el-select v-model="ruleForm['recordType']" :disabled="isView" placeholder="请选择prompt标签" style="width: 100%"> <el-option v-for="item in promptTagOptions" :key="item.value" :label="item.label" :value="item.value" /> </el-select> </el-form-item> <el-form-item v-if="ruleForm['indexSource'] === '4'" label="prompt内容" prop="prompt"> <el-input v-model="ruleForm.prompt" :disabled="isView" type="textarea" :rows="5" placeholder="请输入prompt内容" /> </el-form-item> --> <el-form-item v-if="['2'].includes(ruleForm['indexSource'])" label="查询语句" prop="queryLang"> <el-input v-model="ruleForm['queryLang']" :disabled="isView" type="textarea" :rows="5" placeholder="请输入查询语句" /> </el-form-item> <!-- <el-form-item label="判断结果" prop="judgeResult">--> <!-- <el-select v-model="ruleForm['judgeResult']" :disabled="isView" placeholder="请选择判断结果" style="width: 100%">--> <!-- <el-option--> <!-- v-for="item in resultOptions"--> <!-- :key="item.value"--> <!-- :label="item.label"--> <!-- :value="item.value"--> <!-- />--> <!-- </el-select>--> <!-- </el-form-item>--> <el-form-item label="原子指标说明" prop="remark"> <el-input v-model="ruleForm.remark" :disabled="isView" type="textarea" :rows="5" placeholder="请输入原子指标说明" /> </el-form-item> </el-form> </div> <SelectSql ref="SelectSqlRef" @submit="selectOk" /> </template> </cs-drawer> </template> <script> import { addOrUpdAtomicIndex } from '@/api/atomicIndex' import SelectSql from './SelectSql.vue' import { getCaseEvidenceTree } from '@/api/caseDetails/evidence' export default { name: 'EditAtomic', components: { SelectSql }, data() { return { drawerOption: { show: false, title: '指标配置', width: '40%' }, selectInfo: { promptName: '', promptId: '', extractAttributes: [] }, // 选中的提示词 // 案件类型数据 caseTypeOptions: JSON.parse(sessionStorage.getItem('case_type')), // prompt 标签数据 promptTagOptions: [], // 指标来源数据 sourceOptions: JSON.parse(sessionStorage.getItem('index_source')), // 判断结果数据 resultOptions: JSON.parse(sessionStorage.getItem('judge_result')), // 规则配置表单 ruleForm: { indexSource: '2', caseType: '', recordType: '', prompt: '', queryLang: '', name: '', remark: '' }, id: '', defaultProps: { children: 'child', label: 'categoryName', value: 'id', checkStrictly: true }, rules: { indexSource: [{ required: true, message: '指标算法不能为空!', trigger: 'blur' }], caseType: [{ required: true, message: '案件类型不能为空!', trigger: 'blur' }], recordType: [{ required: true, message: 'prompt标签不能为空!', trigger: 'blur' }], prompt: [{ required: true, message: 'prompt内容不能为空!', trigger: 'blur' }], queryLang: [{ required: true, message: '查询语句不能为空!', trigger: 'blur' }], name: [{ required: true, message: '原子指标名称不能为空!', trigger: 'blur' }], categoryIdPath: [{ required: true, message: '分类不能为空!', trigger: 'change' }], promptId: [{ required: true, message: '查询语句不能为空!', trigger: 'change' }] }, treeData: [], // 是否是编辑 isEdit: false, // 是否是查看 isView: false } }, methods: { // 显示弹窗 show(data, isEdit) { this.isEdit = isEdit this.drawerOption.show = true this.id = isEdit ? data.id : '' this.selectInfo = { promptName: '', promptId: '', extractAttributes: [] } this.getTreeList() this.$nextTick(() => { const _this = this const formData = data ? JSON.parse(JSON.stringify(data)) : { indexSource: '2' } _this.isView = data && !isEdit _this.ruleForm = data ? formData : (isEdit ? formData : { indexSource: '2' }) _this.drawerOption.hiddenFooter = _this.isView this.selectInfo.extractAttributes = data.properties ? data.properties.split(',') : [] this.selectInfo.promptName = data.promptName this.selectInfo.promptId = data.promptId }) }, // 重置 handleReset() { this.selectInfo = { promptName: '', promptId: '', extractAttributes: [] } this.$set(this.ruleForm, 'promptId', '') if (this.isEdit) { this.$set(this.ruleForm, 'name', '') this.$set(this.ruleForm, 'remark', '') } else { this.ruleForm = { indexSource: '2' } } // this.$refs.form.clearValidate() }, selectSql() { this.$refs.SelectSqlRef.show(this.ruleForm.indexSource, this.selectInfo) }, selectOk(data, list) { this.selectInfo = data this.$set(this.ruleForm, 'promptId', data.promptId) // this.ruleForm.promptId = data.promptId this.selectInfo.extractAttributes = list }, // 确定 handleSubmit() { this.$refs.form.validate(async valid => { if (valid) { if (this.isEdit) { this.ruleForm.id = this.id } if (this.ruleForm.indexSource === '2') { this.ruleForm.categoryId = this.ruleForm.categoryIdPath[this.ruleForm.categoryIdPath.length - 1 ] } else if (this.ruleForm.indexSource === '5') { this.ruleForm.properties = this.selectInfo.extractAttributes.join(',') } const { code, msg } = await addOrUpdAtomicIndex(this.ruleForm) code === 200 ? (this.isEdit ? this.$baseMessage.success(msg || '编辑成功!') : this.$baseMessage.success(msg || '新增成功!')) : (this.isEdit ? this.$baseMessage.error(msg || '新增失败!') : this.$baseMessage.error(msg || '新增失败!')) this.drawerOption.show = false this.$emit('reloadData') } }) }, // 查询目录 getTreeList() { getCaseEvidenceTree({ caseType: 1 }).then(res => { if (res.code === 200) { this.treeData = res.data } }) }, // 切换算法 changeType(val) { this.ruleForm = { indexSource: val, caseType: this.ruleForm.caseType, name: this.ruleForm.name } // this.ruleForm['indexSource'] = val } } } </script> <style scoped lang="scss"> .add-atomic { .select-btn { width: 96px; height: 36px; background: #FFFFFF; border-radius: 6px 6px 6px 6px; border: 1px solid #3763FF; line-height: 36px; text-align: center;font-size: 16px; color: #3763FF; cursor: pointer; margin-bottom: 8px; } .sel-name { font-size: 16px; color: #3763FF; } .sel-desc { margin-top: 8px;font-size: 16px; color: #333333 } .select-model-list { display: flex; margin-top: 16px; flex-wrap: wrap; .model-list-item { padding: 0 12px; height: 32px; margin:0 8px 8px 0; background: #F0F0F0; border-radius: 6px 6px 6px 6px;font-size: 14px; color: #333333; display: flex; align-items: center; cursor: pointer; span { // margin-right: 16px; } } } } </style>