feat:遗留问题修改

dev_1.0.0
xiangcongshuai 9 months ago
parent 7dcd713568
commit d5eed44c30

@ -152,3 +152,11 @@ export function saveCaseAtomicResult(data) {
data
})
}
/** 查询案件得分详情 */
export function caseScoreDetail(data) {
return request({
url: `/model/caseScoreDetail`,
method: 'get',
params: data
})
}

@ -39,3 +39,19 @@ export function delPrompt(data) {
data
})
}
/** 提示测试 */
export function testPrompt(data) {
return request({
url: `/prompt/test`,
method: 'post',
data
})
}
export function queryResult(data) {
return request({
url: `/prompt/queryResult`,
method: 'get',
params: data
})
}

@ -5,7 +5,7 @@ const network = {
// 默认的接口地址 如果是开发环境和生产环境走vab-mock-server当然你也可以选择自己配置成需要的接口地址
baseURL:
process.env.NODE_ENV === 'development'
? 'http://192.168.10.25:8097/fu-hsi-server'
? 'http://192.168.10.27:8097/fu-hsi-server'
: '/fuHsiApi',
// 配后端数据的接收方式application/json;charset=UTF-8或者application/x-www-form-urlencoded;charset=UTF-8
contentType: 'application/json;charset=UTF-8',

@ -44,10 +44,12 @@ export const asyncRoutes = [
redirect: '/index',
authKey: 'back_home',
meta: { title: '首页' },
permission: 'p_home',
children: [
{
path: '/index',
name: 'Index',
permission: 'p_home',
component: () => import('@/views/index/index.vue'),
meta: { title: '首页', affix: false }
}
@ -57,11 +59,13 @@ export const asyncRoutes = [
path: '/case',
name: 'Case',
component: Layout,
permission: 'p_case',
meta: { title: '案件管理' },
children: [
{
path: '/case-management',
name: 'CaseManagement',
permission: 'p_caseManagement',
component: () => import('@/views/caseManagement/index.vue'),
meta: { title: '案件管理', affix: false }
}
@ -70,24 +74,28 @@ export const asyncRoutes = [
{
path: '/rule',
name: 'Rule',
permission: 'p_rule',
component: Layout,
meta: { title: '规则配置' },
children: [
{
path: '/index-rule',
name: 'IndexRule',
permission: 'p_indexRule',
component: () => import('@/views/ruleEngine/indexRule/index.vue'),
meta: { title: '指标规则', affix: false, subtitle: '大模型分析提取案件信息的指标项' }
},
{
path: '/model-rule',
name: 'ModelRule',
permission: 'p_modelRule',
component: () => import('@/views/ruleEngine/modelRule/index.vue'),
meta: { title: '模型规则', affix: false, subtitle: '平台大模型已具备的分析多类型案件能力' }
},
{
path: '/atomic-rule',
name: 'AtomicRule',
permission: 'p_atomicRule',
component: () => import('@/views/ruleEngine/atomicIndex/index.vue'),
meta: { title: '原子指标', affix: false, subtitle: '提取案件信息的指标项无法在拆分的指标' }
}
@ -96,18 +104,21 @@ export const asyncRoutes = [
{
path: '/system',
name: 'System',
permission: 'p_system',
component: Layout,
meta: { title: '系统设置' },
children: [
{
path: '/account-management',
name: 'AccountManagement',
permission: 'p_accountManagement',
component: () => import('@/views/system/accountManagement/index.vue'),
meta: { title: '账号管理', affix: false }
},
{
path: '/config-management',
name: 'ConfigManagement',
permission: 'p_configManagement',
component: () => import('@/views/system/configManagement/index.vue'),
meta: { title: '配置管理', affix: false }
}
@ -119,6 +130,7 @@ export const asyncRoutes = [
component: Layout,
meta: { title: '案件' },
hidden: true,
permission: 'p_case2',
children: [
{
path: '/case-details/:id/:caseName/',
@ -131,14 +143,23 @@ export const asyncRoutes = [
{
path: '/prompt',
name: 'Prompt',
permission: 'p_prompt',
component: Layout,
meta: { title: '提示词模板' },
meta: { title: '提示工程' },
children: [
{
path: '/prompt-management',
name: 'PromptManagement',
permission: 'p_promptManagement',
component: () => import('@/views/promptManagement/index.vue'),
meta: { title: '提示词模板', affix: false }
},
{
path: '/prompt-test',
name: 'PromptTest',
permission: 'p_promptTest',
component: () => import('@/views/promptManagement/PromptTest.vue'),
meta: { title: '提示词调试', affix: false }
}
]
},

@ -406,4 +406,8 @@ input::-webkit-inner-spin-button{
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.vxe-table--tooltip-wrapper {
z-index: 9999999 !important; /* 设定一个较高的 z-index 值 */
}

@ -61,7 +61,7 @@ export function convertPermission(asyncRoutes, that) {
*/
function hasPermission(permissions, route) {
if (route.meta && route.meta.permissions) {
return permissions.some((role) => route.meta.permissions.includes(role))
return permissions.some((role) => route.permissions.includes(role))
} else {
return true
}

@ -0,0 +1,155 @@
<template>
<cs-dialog
:dialog="dialogOptions"
>
<template slot="content">
<div class="CaseAnalysis">
<div class="header">
<div class="title">{{ caseInfo.caseName}}</div>
<div class="time">{{ caseInfo.evaluationTime }}</div>
<div class="desc">
<span>按照伏羲智能分析模型赋分规则该案综合得分为{<span :class="['score', caseInfo.totalScore >= 70 ? 'success' : 'warning']">{{ caseInfo.commonScore }}</span>+<span :class="['score', caseInfo.totalScore >= 70 ? 'success' : 'warning']">{{ caseInfo.specificCrimeScore }}</span>=<span :class="['score', caseInfo.totalScore >= 70 ? 'success' : 'warning']">{{ caseInfo.totalScore }}</span>}认定<span :class="['score', caseInfo.totalScore >= 70 ? 'success' : 'warning']">{{ caseInfo.scoreDesc }}</span></span>
</div>
</div>
<div class="card">
<div class="card_header">{{ `(一)${caseInfo.commonIndexCount}个共性证据指标占${caseInfo.commonIndexHitCount}` }}</div>
<div class="tip">包括(对应指标展示</div>
<div class="tip_list">
<span v-for="(item,index) in caseInfo.commonIndexDescList" :key="index">{{ `${index + 1}. ${item}` }}</span>
</div>
</div>
<div class="card">
<div class="card_header">{{ `(一)${caseInfo.specificCrimeIndexCount}个共性证据指标占${caseInfo.specificCrimeIndexHitCount}` }}</div>
<div class="tip">包括(对应指标展示</div>
<div class="tip_list">
<span v-for="(item,index) in caseInfo.specificCrimeIndexDescList" :key="index">{{ `${index + 1}. ${item}` }}</span>
</div>
</div>
</div>
</template>
</cs-dialog>
</template>
<script>
import mixin from '@/views/mixin'
import { caseScoreDetail } from '@/api/caseDetails/index'
export default {
name: 'CaseAnalysis',
mixins: [mixin],
data() {
return {
dialogOptions: {
show: false,
title: {
title: '案件得分详情'
},
top: '50px',
hiddenFooter: true,
appendToBody: true
},
caseInfo: {
caseName: '',
evaluationTime:"",
commonScore: '',
specificCrimeScore: '',
totalScore: '',
scoreDesc: '',
judicialCharacterization: '',
commonIndexCount: '',
commonIndexHitCount: '',
commonIndexDescList: [],
crimeOrOut: '',
specificCrimeIndexCount: '',
specificCrimeIndexHitCount: '',
specificCrimeIndexDescList: [],
missAtomicIndexCount: '',
commonIndexDesc: '',
specificCrimeIndexDesc: ''
}
}
},
mounted() {
},
methods: {
//
show() {
this.dialogOptions.show = true
this.fetchData()
},
//
async fetchData() {
const res = await caseScoreDetail({ caseId: this.$route.params['id'] })
this.caseInfo = res.data
}
}
}
</script>
<style scoped lang="scss">
.CaseAnalysis{
overflow: auto;
height: 800px;
.header {
background: #FFFFFF;
border-radius: 8px 8px 8px 8px;
padding: 24px;
.title {
font-weight: bold;
font-size: 22px;
color: #333333;
margin-bottom: 16px;
}
.time {
font-weight: 400;
font-size: 16px;
color: #666666;
margin-bottom: 16px;
}
.desc {
border-top: 1px solid #EAEAEA;
padding-top: 16px;
color: #666666;
font-size: 16px;
}
.score {
font-weight: 500;
// font-size: 22px;
}
.success {
color: #00975E;
}
.warning {
color: #FF9311;
}
}
.card {
background: #FFFFFF;
border-radius: 8px 8px 8px 8px;
margin-top: 16px;
padding: 24px;
.card_header {
font-weight: 400;
font-size: 22px;
color: #000000;
margin-bottom: 18px;
}
.tip {
font-size: 16px;
color: #333333;
margin-bottom: 12px;
}
.tip_list {
display: flex;
flex-direction: column;
span {
margin-bottom: 12px;
font-size: 16px;
color: #666666;
}
}
}
}
</style>

@ -14,7 +14,8 @@
<el-button type="text" icon="el-icon-close" @click="handleDel(row)" />
</template>
<template #result="{row}">
<el-tag :type="row.indexResult === 'true' ? 'success' : 'error'">{{ row.indexResult === 'true' ? '符合' : '不符合' }}</el-tag>
<el-tag :type="row.indexResult === 'true' ? 'success' : 'error'">{{ row.indexResult?row.indexResult=== 'true' ? '符合' : '不符合': '未评估' }}</el-tag>
</template>
</vxe-grid>
<div style="text-align: center">

@ -14,7 +14,7 @@
<el-button type="text" icon="el-icon-close" @click="handleDel(row)" />
</template>
<template #result="{row}">
<el-tag :type="row.indexResult === 'true' ? 'success' : 'error'">{{ row.indexResult === 'true' ? '符合' : '不符合' }}</el-tag>
<el-tag :type="row.indexResult === 'true' ? 'success' : 'error'">{{ row.indexResult?row.indexResult=== 'true' ? '符合' : '不符合': '未评估' }}</el-tag>
</template>
</vxe-grid>
<div style="text-align: center">

@ -11,7 +11,39 @@
:dialog="dialogOptions"
>
<template slot="content">
<vxe-grid ref="xTable" v-bind="gridOptions" />
<div class="main-constent">
<div class="left">
<div class="search">
<el-input v-model="name" clearable placeholder="搜索名称" />
<el-button type="primary" style="margin-left: 16px;" @click="handleSearch"></el-button>
</div>
<vxe-grid
ref="xTable"
:checkbox-config="{ labelField: '', highlight: true, trigger: 'row', reserve: true , range: true}"
row-id="id"
v-bind="gridOptions"
@checkbox-change="selectChangeEvent"
/>
</div>
<div class="right">
<div class="title">{{ `已选择实体(${selectionRows.length * 2}` }}</div>
<div class="right_list">
<div v-for="(item,index) in selectionRows" :key="index" class="right_list_item">
<span>{{ item.startNodeType }}</span>
<span>{{ item.endNodeType }}</span>
</div>
</div>
<div class="title" style="margin-top: 24px;">{{ `已选择实体(${selectionRows.length}` }}</div>
<div class="right_list">
<span v-for="(item,index) in selectionRows" :key="index" class="right-list-item">
{{ `${item.startNodeType}- ${item.relation}-${item.endNodeType}` }}
</span>
</div>
</div>
</div>
<div style="text-align: center;margin-top: 10px">
<el-button type="primary" plain style="width: 80px" @click="() => { dialogOptions.show = false }">取消</el-button>
<el-button type="primary" style="width: 80px" @click="handleSubmit"></el-button>
@ -42,18 +74,23 @@ export default {
loading: false,
columns: [
{ type: 'checkbox', width: '80px' },
{ title: '实体', field: 'startNode' },
{ title: '属性', field: 'relation' },
{ title: '属性值', field: 'endNode' }
{ title: '头节点', field: 'startNode' },
{ title: '头节点类型', field: 'startNodeType' },
{ title: '关系', field: 'relation' },
{ title: '尾节点', field: 'endNode' },
{ title: '尾节点类型', field: 'endNodeType' }
],
data: [{ startNode: '裴金禄', relation: '就读院校', endNode: '中国政法大学' },{ startNode: '裴金禄', relation: '毕业时间', endNode: ''}]
data: []
},
//
lastPageData: {}
lastPageData: {},
name: '',
tableData: [],
selectionRows: []
}
},
mounted() {
// this.tableHeight(330)
this.tableHeight(650)
},
methods: {
//
@ -61,6 +98,8 @@ export default {
this.dialogOptions.show = true
this.lastPageData = data
this.gridOptions.data = []
this.selectedRowKeys = []
this.name = ''
this.fetchData()
},
//
@ -73,11 +112,61 @@ export default {
}
queryTripletInfo(params).then(res => {
this.gridOptions.loading = false
this.gridOptions.data = res.data
this.tableData = JSON.parse(JSON.stringify(res.data))
this.gridOptions.data = JSON.parse(JSON.stringify(res.data))
}).catch(() => {
this.gridOptions.loading = false
})
},
// ()
selectChangeEvent({ checked, records, reserves, row }) {
//
if (checked) {
//
if (reserves.length == 0) {
this.selectedRowKeys = records.map(v => v.id)
this.selectionRows = records
} else {
// id,
this.selectedRowKeys = [...reserves.map(v => v.id), ...records.map(v => v.id)]
// ,
this.selectionRows = [...reserves, ...records]
}
} else {
//
const idIndex = this.selectedRowKeys.indexOf(row.id)
if (idIndex > -1) {
// id
this.$delete(this.selectedRowKeys, idIndex)
}
let dataIndex = null
for (let i = 0; i < this.selectionRows.length; i++) {
if (this.selectionRows[i].id === row.id) {
dataIndex = i
break
}
}
//
this.$delete(this.selectionRows, dataIndex)
}
},
handleSearch() {
const filterVal = String(this.name).trim().toLowerCase()
if (filterVal) {
const searchProps = ['startNode', 'startNodeType', 'relation', 'endNode', 'endNodeType']
const rest = this.tableData.filter(item => searchProps.some(key => String(item[key]).toLowerCase().indexOf(filterVal) > -1))
this.gridOptions.data = rest.map(row => {
const item = Object.assign({}, row)
searchProps.forEach(key => {
item[key] = String(item[key])
})
return item
})
} else {
this.gridOptions.data = this.tableData
}
},
//
handleSubmit() {
if (this.gridOptions.loading) {
@ -101,5 +190,62 @@ export default {
</script>
<style scoped lang="scss">
.main-constent {
display: flex;
background: #FFFFFF;
height: 750px;
.left {
width: 750px;
border-right: 1px solid #EAEAEA;
padding-right: 30px;
.search {
display: flex;
margin: 32px 32px 16px 32px;
}
}
.right {
padding: 30px;
flex: 1;
.title {
font-weight: 400;
font-size: 16px;
color: #333333;
}
.right_list {
width: 90%;
display: flex;
flex-wrap: wrap;
margin-top: 16px;
border-radius: 6px 6px 6px 6px;
border: 1px solid #EAEAEA;
padding: 16px;
height: 250px;
overflow: auto;
.right_list_item {
margin-right: 12px;
display: flex;
flex-direction: column;
span {
background: #F5F5F5;
border-radius: 4px 4px 4px 4px;
padding: 2px 8px;
font-size: 14px;
color: #333333;
margin-bottom: 14px;
}
}
.right-list-item {
margin-right: 12px;
height: 22px;
line-height: 22px;
background: #F5F5F5;
border-radius: 4px 4px 4px 4px;
padding: 2px 8px;
font-size: 14px;
color: #333333;
margin-bottom: 14px;
}
}
}
}
</style>

@ -129,7 +129,7 @@
<script>
import AddCaseUser from './AddCaseUser.vue'
import { addOrUpdRecords, queryUserList } from '@/api/caseDetails'
import { deleteFile, commonDownloadFile } from '@/api/config/uploadApi'
import { commonDownloadFile } from '@/api/config/uploadApi'
import FileViewer from '@/components/FileViewer/index.vue'
import { baseURL } from '@/config'
export default {
@ -208,7 +208,8 @@ export default {
data.fileList.forEach(e => {
list.push(e.fileId)
this.fileList.push({
name: e.fileName
name: e.fileName,
id: e.fileId
})
})
this.recordForm.fileIdList = list
@ -247,7 +248,18 @@ export default {
this.recordForm.fileIdList = list
},
handlePreview(file) {
console.log(file)
for (const item of this.fileList) {
if (item.name === file.name) {
if (!item.id) return
this.downloadFile(`${baseURL}${commonDownloadFile}${item.id}`, item.name)
}
}
},
downloadFile(url, fileName) {
const link = document.createElement('a')
link.href = url
link.download = fileName
link.click()
},
handleExceed(files, fileList) {
this.$message.warning(`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`)
@ -277,7 +289,7 @@ export default {
// } else {
// formData.append('caseId', this.caseId)
// }
// delete params['file']
// delete params['confessionTime']
// this.$baseLodash.keys(params).forEach(key => {

@ -40,6 +40,7 @@
<div>
<el-button type="info" plain icon="el-icon-download" @click="handleDownload"></el-button>
<el-button v-if="isEdit" type="primary" plain icon="el-icon-edit" @click="handleEdit"></el-button>
<el-button v-if="caseData['totalScore'] && caseData['totalScore'] > 0" type="primary" plain @click="openDeatil"></el-button>
<!-- <el-button v-if="isEdit" type="primary" :icon="caseData.isAnalysing ? 'el-icon-loading' : 'el-icon-refresh'" @click="handleAnalysis"></el-button> -->
<el-button type="text" icon="el-icon-arrow-up" style="color: #666666" @click="expand = false">收起</el-button>
</div>
@ -65,12 +66,12 @@
<div v-else class="flex-row pick-up-info">
<div class="flex-row left-title" style="align-items: center">
<span>综合得分</span>
<span :style="commonStyle">{{ caseData.score }}</span>
<span :style="commonStyle">{{ caseData.totalScore }}</span>
</div>
<div class="base-info flex-row" style="align-items: center; justify-content: space-between">
<div class="flex-row">
<span>案件编号</span>
<span>{{ caseData.caseNum }}</span>
<span>{{ caseData.caseNo }}</span>
<span style="margin-left: 30px">案件名称</span>
<span>{{ caseData.caseName }}</span>
<span style="margin-left: 30px">案件状态</span>
@ -100,6 +101,8 @@
<edit-case-info ref="edit" />
<!--模型分析-->
<model-analysis ref="analysis" @confirm="handleConfirmAnalysis" />
<!--案件分析详情-->
<case-analysis ref="caseAnalysis" />
</div>
</template>
@ -114,6 +117,7 @@ import InnocentIndex from './components/InnocentIndex.vue'
import IncriminateIndex from './components/IncriminateIndex.vue'
import CaseAtlas from './components/CaseAtlas.vue'
import ModelAnalysis from '@/views/caseManagement/components/ModelAnalysis.vue'
import CaseAnalysis from './components/CaseAnalysis.vue'
import { executeModelAnalyse, queryCaseList } from '@/api/caseManagement'
export default {
name: 'Index',
@ -126,7 +130,8 @@ export default {
CommonIndex,
InnocentIndex,
IncriminateIndex,
CaseAtlas
CaseAtlas,
CaseAnalysis
},
data() {
return {
@ -215,6 +220,9 @@ export default {
//
handleDownload() {
},
openDeatil() {
this.$refs.caseAnalysis.show()
},
//
handleEdit() {

@ -8,6 +8,7 @@
<template>
<cs-dialog
append-to-body
:dialog="dialogOption"
>
<div slot="content">
@ -163,7 +164,3 @@ export default {
}
}
</script>
<style scoped lang="scss">
</style>

@ -44,7 +44,7 @@
<el-col :span="8">
<span class="item-body-top etc">{{ `行为人:${item['lawActorName'] ? item['lawActorName'] : '-'}` }}</span>
</el-col>
<el-col :span="8">
<el-col :span="16">
<span class="item-body-top etc">{{ `案件编号:${item.caseNo}` }}</span>
</el-col>
<!-- <el-col :span="8">-->
@ -118,7 +118,7 @@ export default {
{ label: '案件编号', model: 'caseNo', type: 'input' },
{ label: '案件名称', model: 'caseName', type: 'input' },
{ label: '认定结果', model: 'identifyResult', type: 'select', option: JSON.parse(sessionStorage.getItem('identify_result')) },
{ label: '行为人', model: 'lawActorName', type: 'input' },
{ label: '行为人', model: 'lawActor', type: 'input' },
{ label: '当事人', model: 'lawParty', type: 'input' },
{ label: '最新时间', model: 'updateTime', type: 'datetimerange' }
],

@ -0,0 +1,266 @@
<template>
<div class="PromptTest">
<el-form ref="form" class="test-form" :inline="true" :model="testForm" :rules="rules" label-width="120px">
<div class="left">
<el-row>
<el-form-item label="选择模型">
<el-select v-model="testForm['model']">
<el-option v-for="item in modelOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="项目名称">
<el-input v-model="testForm['name']" style="width: 300px;" readonly />
</el-form-item>
<el-form-item label="被问询人" prop="personName">
<el-input v-model="testForm['personName']" :disabled="status === 1" style="width: 300px;" />
</el-form-item>
</el-row>
<el-row>
<el-form-item label="上传材料" prop="fileId">
<el-upload
class="upload-demo"
:disabled="status === 1"
:action="uploadOption.action"
:accept="uploadOption.accept"
:on-success="handleSuccess"
:on-remove="handleRemove"
:file-list="fileList"
>
<el-button size="small" type="primary" icon="el-icon-upload2">文档笔录</el-button>
<div slot="tip" class="el-upload__tip">支持扩展名docxdoc</div>
</el-upload>
</el-form-item>
</el-row>
<el-row> <el-form-item label="占位符" prop="paramList">
<div v-for="(item,index) in testForm['paramList']" :key="index" class="param-item">
<el-input v-model="item['key']" :disabled="status === 1" placeholder="请输入" style="width: 200px" />
<el-input v-model="item['value']" :disabled="status === 1" placeholder="请输入" style="width: 200px;margin-left: 16px;" />
<i v-if="index === 0" :disabled="status === 1" class="el-icon-circle-plus" style="margin-left: 12px;cursor: pointer;" @click="addItem" />
<i v-if="index !== 0" :disabled="status === 1" class="el-icon-circle-close" style="margin-left: 12px;cursor: pointer;" @click="delItem(index)" />
<!-- <el-icon "><CirclePlus /></el-icon> -->
</div>
</el-form-item></el-row>
<el-row> <el-form-item label="三元组提示词" prop="prompt">
<el-input
v-model="testForm.prompt"
:disabled="status === 1"
style="width: 500px;"
type="textarea"
:rows="15"
placeholder="请输入三元组提示词"
/>
</el-form-item></el-row>
<el-button v-if="status !==1" type="primary" style="margin-left: 120px;" @click="submit"></el-button>
<el-button v-if="status ===1" type="primary" style="margin-left: 120px;" @click="stopSubmit"></el-button>
<div class="desc">点击执行数据提取时间较长请勿关闭当前页面</div>
</div>
<div class="right">
<el-form-item label="提取结果:">
<div v-for="(item,index) in resultList" :key="index" class="result_item">
<span>{{ `Q:${item.question}` }}</span>
<span>{{ `A:${item.answer}` }}</span>
<span>{{ item.result }}</span>
<span class="btn" @click="openDetail(item.submitPrompt)"></span>
</div>
</el-form-item>
</div>
</el-form>
<PromptDetail ref="PromptDetail" />
</div>
</template>
<script>
import mixin from '@/views/mixin'
import { baseURL } from '@/config'
import { testPrompt, queryResult } from '@/api/promptManagement'
import PromptDetail from './components/PromptDetail.vue'
export default {
name: 'PromptTest',
components: {
PromptDetail
},
mixins: [mixin],
data() {
return {
testForm: {
model: '1',
personName: '',
name: '经侦大模型',
fileId: '',
paramList: [
{
key: '',
value: ''
}
]
},
rules: {
personName: [{ required: true, message: '被问询人不能为空!', trigger: 'blur' }],
prompt: [{ required: true, message: '三元组提示词不能为空!', trigger: 'blur' }],
paramList: [{ required: true, message: '占位符不能为空!', trigger: 'change' }],
fileId: [{ required: true, message: '请上传文件!', trigger: 'change' }]
},
modelOptions: [
{
label: 'LLaMA8B',
value: '1'
}
],
//
fileList: [],
resultList: [],
status: 0,
interval: undefined,
//
uploadOption: {
action: `${baseURL}/minio/uploadFile`,
accept: '.docx,.doc'
}
}
},
mounted() {
this.uuid = this.generateUUID()
},
beforeDestroy() {
clearInterval(this.interval) //
},
methods: {
handleSuccess(response) {
if (response.code === 200) {
this.$set(this.testForm, 'fileId', response.data)
}
},
addItem() {
this.testForm.paramList.push({
key: '',
value: ''
})
},
handleRemove(file, uploadFiles) {
this.testForm.fileId = ''
},
delItem(index) {
this.testForm.paramList.splice(index, 1)
},
generateUUID() {
const array = new Uint8Array(16)
window.crypto.getRandomValues(array)
//
array[6] = (array[6] & 0x0f) | 0x40 // version 4
array[8] = (array[8] & 0x3f) | 0x80 // variant 10
// UUID
const uuid = Array.from(array)
.map(byte => byte.toString(16).padStart(2, '0'))
.join('')
return uuid
},
async stopSubmit() {
//
const params = {
taskType: 2,
uid: this.uuid
}
const res = await testPrompt(params)
if (res.code === 200) {
this.status = 0
this.uuid = this.generateUUID()
}
},
async fetchData() {
const res = await queryResult({
uid: this.uuid
})
if (res.code === 200) {
this.status = res.data.status
const list = res.data.dataList
for (const item of list) {
// const str = JSON.stringify(JSON.parse(item))
// console.log(str)
// if (str !== '{"result":[]}') {
// this.resultList.push(str)
// }
this.resultList.push({
answer: item.answer,
question: item.question,
submitPrompt: item.submitPrompt,
result: JSON.stringify(JSON.parse(item.result))
})
}
}
if (res.data.status === 2) {
clearInterval(this.interval)
this.uuid = this.generateUUID()
this.status = 0
}
},
openDetail(val) {
this.$refs.PromptDetail.show(val)
},
submit() {
this.$refs.form.validate(async valid => {
if (valid) {
this.resultList = []
//
const params = {
...this.testForm,
taskType: 1,
uid: this.uuid
}
const res = await testPrompt(params)
if (res.code === 200) {
this.status = 1
this.$baseMessage.success('执行成功!')
this.fetchData()
this.interval = setInterval(this.fetchData, 5000) // 30
}
}
})
}
}
}
</script>
<style scoped lang="scss">
.PromptTest {
height: 100%;
background: #FFFFFF;
padding: 32px;
.left {
width: 50%;
}
.right {
height: calc(100vh - 300px);
overflow-y: auto;
flex: 1;
.result_item {
margin-bottom: 16px;
display: flex;
flex-direction: column;
.btn {
color: #409eff;
cursor: pointer;
}
}
}
.desc {
font-size: 12px;
color: #606266;
margin-left: 120px;
margin-top: 12px;
margin-bottom: 16px;
}
.test-form {
// width: 500px;
display: flex;
width: 100%;
}
.param-item {
margin-bottom: 16px;
}
}
</style>

@ -0,0 +1,51 @@
<template>
<cs-dialog
:dialog="dialogOption"
>
<template slot="content">
<div class="main-content" v-html="formattedText" />
</template>
</cs-dialog>
</template>
<script>
export default {
name: 'PromptDetail',
data() {
return {
//
dialogOption: {
show: false,
title: {
title: '提示词详情'
},
hiddenFooter: true,
appendToBody: true
},
text: ''
}
},
computed: {
formattedText() {
return this.text.replace(/\n/g, '<br>');
}
},
methods: {
//
show(val) {
this.dialogOption.show = true
this.text = val
}
}
}
</script>
<style scoped lang="scss">
.main-content {
height: 500px;
}
</style>

@ -26,6 +26,7 @@
<el-col :span="24">
<div class="base-card" style="background: #FFFFFF;padding: 10px;box-sizing: border-box">
<el-button type="primary" @click="handleAdd"></el-button>
<!-- <el-button type="primary" @click="promptTest"></el-button> -->
<vxe-grid
ref="xTable0"
v-bind="promptGridOptions"

@ -58,12 +58,19 @@
<el-col :span="24">
<el-form-item label="原子指标" prop="atomicIndexList">
<el-button type="primary" @click="handleSelectAtomic"></el-button>
<span
<!-- <span
v-if="ruleForm['atomicIndexList'] && ruleForm['atomicIndexList'].length > 0"
style="margin-left: 10px; font-size: 12px; color: #0A4DF0"
>
{{ `已选中${ruleForm['atomicIndexList'].length}项原子指标` }}
</span>
</span> -->
<div v-if="ruleForm['atomicIndexList'] && ruleForm['atomicIndexList'].length > 0" class="select_list">
<div v-for="(item,index) in ruleForm['atomicIndexList']" :key="index" class="select_list_item">
<span>{{ item.name }}</span>
<i class="el-icon-circle-close closed" style="margin-left: 12px;" @click="delItem(index)" />
</div>
</div>
</el-form-item>
</el-col>
<el-col :span="24">
@ -190,6 +197,9 @@ export default {
}
})
},
delItem(index) {
this.ruleForm['atomicIndexList'].splice(index, 1)
},
//
handleChange(val) {
this.indexTypeName = this.indexTypeOptions.find(item => item.value === val).label
@ -245,4 +255,15 @@ export default {
width: 100%;
}
}
.select_list {
display: flex;
flex-direction: column;
.select_list_item {
display: flex;
align-items: center;
.closed {
cursor: pointer;
}
}
}
</style>

@ -42,7 +42,7 @@
v-bind="gridOptions"
style="margin-top: 10px"
:checkbox-config="{ labelField: '', highlight: true, trigger: 'row', reserve: true , range: true}"
@checkbox-change="selectChangeEvent"
/>
<!-- <div style="text-align: center">
@ -75,8 +75,8 @@ export default {
},
//
searchForm: {
name:"",
indexSource:''
name: '',
indexSource: ''
},
//
indexAlgorithmOptions: JSON.parse(sessionStorage.getItem('index_source')),
@ -101,12 +101,11 @@ export default {
show(data) {
this.dialogOption.show = true
this.selectionRows = data
this.searchForm['name'] = ""
this.searchForm['name'] = ''
this.fetchData()
},
//
fetchData() {
queryAtomicIndex(this.searchForm, 1, 99999).then(res => {
this.gridOptions.data = res.data.result
this.queryForm.total = res.data.total
@ -118,7 +117,6 @@ export default {
_this.gridOptions.data.map(column => {
_this.selectionRows.map(item => {
if (item.id === column.id) {
console.log('4444444444444444444')
_this.$refs.xTable.toggleCheckboxRow(column, true)
}
})

@ -58,36 +58,21 @@ export default {
menuList: [
{ label: '首页', id: '0' },
{ label: '案件信息', id: '1', children: [
{ label: '案件列表', id: '1-0', children: [
{ label: '查询', id: '1-0-0' },
{ label: '新增', id: '1-0-1' },
{ label: '编辑', id: '1-0-2' },
{ label: '模型分析', id: '1-0-3' },
{ label: '删除', id: '1-0-4' }
] },
{ label: '案件详情', id: '1-1', children: [
{ label: '编辑基本信息', id: '1-1-0' },
{ label: '添加/编辑/删除笔录', id: '1-1-1' },
{ label: '添加/编辑/删除笔录', id: '1-1-2' },
{ label: '指标评估', id: '1-1-3' }
] }
{ label: '案件列表', id: '1-0' },
{ label: '案件详情', id: '1-1' }
] },
{ label: '规则引擎', id: '2', children: [
{ label: '指标规则', id: '2-0', children: [
{ label: '新增', id: '2-0-0' },
{ label: '编辑', id: '2-0-1' },
{ label: '变更', id: '2-0-2' },
{ label: '删除', id: '2-0-3' }
] },
{ label: '模型规则', id: '2-1', children: [
{ label: '查看', id: '2-1-0' },
{ label: '关闭/启动', id: '2-1-1' },
{ label: '编辑', id: '2-1-2' }
] }
{ label: '指标规则', id: '2-0' },
{ label: '模型规则', id: '2-1' },
{ label: '原子指标', id: '2-1' }
] },
{ label: '系统管理', id: '3', children: [
{ label: '账号管理', id: '3-0', children: [] },
{ label: '配置管理', id: '3-1', children: [] }
] },
{ label: '提示工程', id: '3', children: [
{ label: '提示词模版', id: '3-0', children: [] },
{ label: '提示词调试', id: '3-1', children: [] }
] }
]
}

Loading…
Cancel
Save