提交 cdf9c380 authored 作者: 王鹏飞's avatar 王鹏飞

chore: update

上级 eb0b4cc7
......@@ -51,7 +51,7 @@ const handleCopy = () => {
</div>
</div>
</el-form-item>
<el-form-item label="主图视频">
<el-form-item label="主图视频" v-if="false">
<div class="form-tips">有机会在搜索、推荐等场景展示,提升转化</div>
<Upload v-model="form.video_url" accept="video/*" tips="主图视频" isVideo></Upload>
<div class="upload-tips" style="margin-left: 20px">
......
......@@ -11,10 +11,17 @@ const userStore = useUserStore()
const designVisible = ref(false)
const data = reactive({
list: [],
count: 0,
list: [
{ designId: 1, thumbUrl: 'https://webapp-pub.ezijing.com/upload/saas-dml-pro/design/1.JPG' },
{ designId: 2, thumbUrl: 'https://webapp-pub.ezijing.com/upload/saas-dml-pro/design/2.JPG' },
{ designId: 3, thumbUrl: 'https://webapp-pub.ezijing.com/upload/saas-dml-pro/design/3.JPG' },
{ designId: 4, thumbUrl: 'https://webapp-pub.ezijing.com/upload/saas-dml-pro/design/4.JPG' },
{ designId: 5, thumbUrl: 'https://webapp-pub.ezijing.com/upload/saas-dml-pro/design/5.JPG' },
{ designId: 6, thumbUrl: 'https://webapp-pub.ezijing.com/upload/saas-dml-pro/design/6.JPG' },
],
})
async function fetchList() {
return false
const res = await getChuanKitDesignList({
user_flag: userStore.user.id,
kind_id: 29,
......@@ -46,7 +53,7 @@ async function handleSubmit() {
<template>
<el-dialog title="图库选择" :close-on-click-modal="false" @closed="$emit('update:modelValue', false)" width="860px">
<div class="image-design">
<el-button type="primary" @click="designVisible = true">打开编辑器</el-button>
<el-button type="primary" @click="designVisible = true" v-if="false">打开编辑器</el-button>
<ul>
<li
v-for="item in data.list"
......@@ -73,7 +80,6 @@ async function handleSubmit() {
margin: 30px auto;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 30px;
}
li {
......@@ -88,6 +94,8 @@ async function handleSubmit() {
}
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
</style>
差异被折叠。
import httpRequest from '@/utils/axios'
// 获取直播成绩详情
export function getScoreDetail(params?: { id: string }) {
return httpRequest.get('/api/lab/v1/experiment/live-student-record/detail', { params })
}
// 获取直播成绩列表
export function getScoreList(params?: { name?: string }) {
return httpRequest.get('/api/lab/v1/experiment/live-student-record/list', { params })
}
// 导出成绩
export function exportScore(params?: { name?: string }) {
return httpRequest.get('/api/lab/v1/experiment/live-student-record/export', { params })
}
// 更新成绩
export function updateScore(data: { id: string; check_status: number; total_score: number; score_details: string }) {
return httpRequest.post('/api/lab/v1/experiment/live-student-record/score', data)
}
// 一键发布成绩
export function publishAll() {
return httpRequest.post('/api/lab/v1/experiment/live-student-record/publish-all')
}
......@@ -55,7 +55,7 @@ const firstLivePractice = computed(() => {
})
const firstLivePracticeRecord = computed(() => {
return props.detail.live_data.practice_records.find((item) => item.live_practice_id === firstLivePractice.value?.id)
return firstLivePractice.value?.records[0]
})
const secondLivePractice = computed(() => {
......@@ -63,7 +63,7 @@ const secondLivePractice = computed(() => {
})
const secondLivePracticeRecord = computed(() => {
return props.detail.live_data.practice_records.find((item) => item.live_practice_id === secondLivePractice.value?.id)
return secondLivePractice.value?.records[0]
})
// 商品类别
......@@ -205,7 +205,7 @@ const handleNext = () => {
<el-tab-pane label="商品品类管理" :name="1">
<ScoreCard
:maxScore="5"
:hasSaveButton="detail.status != '2'"
:hasSaveButton="detail.check_status != '2'"
v-model:score="scoreDetails.commodity_type.score"
v-model:comment="scoreDetails.commodity_type.comment"
@save="$emit('save')"
......@@ -220,7 +220,7 @@ const handleNext = () => {
<el-tab-pane label="商品属性管理" :name="2" lazy>
<ScoreCard
:maxScore="5"
:hasSaveButton="detail.status != '2'"
:hasSaveButton="detail.check_status != '2'"
v-model:score="scoreDetails.commodity_attr.score"
v-model:comment="scoreDetails.commodity_attr.comment"
@save="$emit('save')"
......@@ -231,7 +231,7 @@ const handleNext = () => {
<el-tab-pane label="商品管理" :name="3" lazy>
<ScoreCard
:maxScore="15"
:hasSaveButton="detail.status != '2'"
:hasSaveButton="detail.check_status != '2'"
v-model:score="scoreDetails.commodity.score"
v-model:comment="scoreDetails.commodity.comment"
@save="$emit('save')"
......@@ -288,7 +288,7 @@ const handleNext = () => {
<el-tab-pane label="直播话术管理" :name="4" lazy>
<ScoreCard
:maxScore="15"
:hasSaveButton="detail.status != '2'"
:hasSaveButton="detail.check_status != '2'"
v-model:score="scoreDetails.speech.score"
v-model:comment="scoreDetails.speech.comment"
@save="$emit('save')"
......@@ -315,7 +315,7 @@ const handleNext = () => {
<el-tab-pane label="首次直播演练" :name="5" lazy>
<ScoreCard
:maxScore="20"
:hasSaveButton="detail.status != '2'"
:hasSaveButton="detail.check_status != '2'"
v-model:score="scoreDetails.practice_record1.score"
v-model:comment="scoreDetails.practice_record1.comment"
@save="$emit('save')"
......@@ -330,7 +330,7 @@ const handleNext = () => {
<el-tab-pane label="直播复盘分析" :name="6" lazy>
<ScoreCard
:maxScore="10"
:hasSaveButton="detail.status != '2'"
:hasSaveButton="detail.check_status != '2'"
v-model:score="scoreDetails.improvement_plan.score"
v-model:comment="scoreDetails.improvement_plan.comment"
@save="$emit('save')"
......@@ -346,7 +346,7 @@ const handleNext = () => {
<el-tab-pane label="二次直播演练" :name="7" lazy>
<ScoreCard
:maxScore="15"
:hasSaveButton="detail.status != '2'"
:hasSaveButton="detail.check_status != '2'"
v-model:score="scoreDetails.practice_record2.score"
v-model:comment="scoreDetails.practice_record2.comment"
@save="$emit('save')"
......@@ -361,7 +361,7 @@ const handleNext = () => {
<el-tab-pane label="直播总结汇报" :name="8" lazy>
<ScoreCard
:maxScore="15"
:hasSaveButton="detail.status != '2'"
:hasSaveButton="detail.check_status != '2'"
:hasNextButton="false"
v-model:score="scoreDetails.report.score"
v-model:comment="scoreDetails.report.comment"
......
......@@ -56,7 +56,7 @@ const firstLivePractice = computed(() => {
})
const firstLivePracticeRecord = computed(() => {
return props.detail.live_data.practice_records.find((item) => item.live_practice_id === firstLivePractice.value?.id)
return firstLivePractice.value?.records[0]
})
const secondLivePractice = computed(() => {
......@@ -64,7 +64,7 @@ const secondLivePractice = computed(() => {
})
const secondLivePracticeRecord = computed(() => {
return props.detail.live_data.practice_records.find((item) => item.live_practice_id === secondLivePractice.value?.id)
return secondLivePractice.value?.records[0]
})
// 商品类别
......@@ -206,7 +206,7 @@ const handleNext = () => {
<el-tab-pane label="商品品类管理" :name="1">
<ScoreCard
:maxScore="3"
:hasSaveButton="detail.status != '2'"
:hasSaveButton="detail.check_status != '2'"
v-model:score="scoreDetails.commodity_type.score"
v-model:comment="scoreDetails.commodity_type.comment"
@save="$emit('save')"
......@@ -221,7 +221,7 @@ const handleNext = () => {
<el-tab-pane label="商品属性管理" :name="2" lazy>
<ScoreCard
:maxScore="2"
:hasSaveButton="detail.status != '2'"
:hasSaveButton="detail.check_status != '2'"
v-model:score="scoreDetails.commodity_attr.score"
v-model:comment="scoreDetails.commodity_attr.comment"
@save="$emit('save')"
......@@ -232,7 +232,7 @@ const handleNext = () => {
<el-tab-pane label="商品管理" :name="3" lazy>
<ScoreCard
:maxScore="10"
:hasSaveButton="detail.status != '2'"
:hasSaveButton="detail.check_status != '2'"
v-model:score="scoreDetails.commodity.score"
v-model:comment="scoreDetails.commodity.comment"
@save="$emit('save')"
......@@ -289,7 +289,7 @@ const handleNext = () => {
<el-tab-pane label="直播话术管理" :name="4" lazy>
<ScoreCard
:maxScore="15"
:hasSaveButton="detail.status != '2'"
:hasSaveButton="detail.check_status != '2'"
v-model:score="scoreDetails.speech.score"
v-model:comment="scoreDetails.speech.comment"
@save="$emit('save')"
......@@ -316,7 +316,7 @@ const handleNext = () => {
<el-tab-pane label="首次直播演练" :name="5" lazy>
<ScoreCard
:maxScore="15"
:hasSaveButton="detail.status != '2'"
:hasSaveButton="detail.check_status != '2'"
v-model:score="scoreDetails.practice_record1.score"
v-model:comment="scoreDetails.practice_record1.comment"
@save="$emit('save')"
......@@ -331,7 +331,7 @@ const handleNext = () => {
<el-tab-pane label="直播复盘分析" :name="6" lazy>
<ScoreCard
:maxScore="10"
:hasSaveButton="detail.status != '2'"
:hasSaveButton="detail.check_status != '2'"
v-model:score="scoreDetails.improvement_plan.score"
v-model:comment="scoreDetails.improvement_plan.comment"
@save="$emit('save')"
......@@ -347,7 +347,7 @@ const handleNext = () => {
<el-tab-pane label="二次直播演练" :name="7" lazy>
<ScoreCard
:maxScore="30"
:hasSaveButton="detail.status != '2'"
:hasSaveButton="detail.check_status != '2'"
v-model:score="scoreDetails.practice_record2.score"
v-model:comment="scoreDetails.practice_record2.comment"
@save="$emit('save')"
......@@ -362,7 +362,7 @@ const handleNext = () => {
<el-tab-pane label="直播总结汇报" :name="8" lazy>
<ScoreCard
:maxScore="10"
:hasSaveButton="detail.status != '2'"
:hasSaveButton="detail.check_status != '2'"
:hasNextButton="false"
v-model:score="scoreDetails.report.score"
v-model:comment="scoreDetails.report.comment"
......
......@@ -61,7 +61,7 @@ const handleNext = () => {
<template>
<el-tabs stretch v-model="activeTab" class="score-tabs">
<el-tab-pane label="创意策划方案" :name="1">
<ModuleCard :maxScore="20" :hasSaveButton="detail.status != '2'" @next="handleNext" @save="$emit('save')">
<ModuleCard :maxScore="20" :hasSaveButton="detail.check_status != '2'" @next="handleNext" @save="$emit('save')">
<ScoreCardSub
title="全媒体运营的主题(方向)描述(3分)"
:maxScore="3"
......@@ -93,7 +93,7 @@ const handleNext = () => {
</ModuleCard>
</el-tab-pane>
<el-tab-pane label="视听运营" :name="2">
<ModuleCard :maxScore="55" :hasSaveButton="detail.status != '2'" @next="handleNext" @save="$emit('save')">
<ModuleCard :maxScore="55" :hasSaveButton="detail.check_status != '2'" @next="handleNext" @save="$emit('save')">
<ScoreCardSub
title="综合稿件标题(5分)"
:maxScore="5"
......@@ -140,7 +140,7 @@ const handleNext = () => {
</ModuleCard>
</el-tab-pane>
<el-tab-pane label="流量运营" :name="3">
<ModuleCard :maxScore="20" :hasSaveButton="detail.status != '2'" @next="handleNext" @save="$emit('save')">
<ModuleCard :maxScore="20" :hasSaveButton="detail.check_status != '2'" @next="handleNext" @save="$emit('save')">
<ScoreCardSub
title="作品(或产品)发布的运营计划,上述全媒体综合文稿拟分发的媒体平台,并逐一说明理由(10分)"
:maxScore="10"
......
<script setup>
import Demo from '../../test/components/Demo.vue'
import RecordView from '../../test/components/RecordView.vue'
import Demo from '@/modules/live/test/components/Demo.vue'
import RecordView from '@/modules/live/test/components/RecordView.vue'
defineProps({ livePracticeId: { type: String }, recordId: { type: String } })
</script>
......
......@@ -10,6 +10,14 @@ const routes: RouteRecordRaw[] = [
{ path: 'view', component: () => import('./views/View.vue') },
],
},
{
path: '/operations/score',
component: Layout,
children: [
{ path: '', component: () => import('./views/Index.vue'), props: { hasAI: false } },
{ path: 'view', component: () => import('./views/View.vue') },
],
},
]
export { routes }
......@@ -500,9 +500,7 @@ ${JSON.stringify(data.speeches)}
export const generatePracticeRecordPrompt = (data: any) => {
const firstLivePractice = data.practices[0]
const firstLivePracticeRecord = data.practice_records.find(
(item: any) => item.live_practice_id === firstLivePractice?.id
)
const firstLivePracticeRecord = firstLivePractice?.records[0]
return `请根据选手提交的内容进行评分(满分20分)
选手提交内容:
${JSON.stringify(firstLivePracticeRecord)}
......@@ -511,9 +509,7 @@ export const generatePracticeRecordPrompt = (data: any) => {
export const generateImprovementPlanPrompt = (data: any) => {
const firstLivePractice = data.practices[0]
const firstLivePracticeRecord = data.practice_records.find(
(item: any) => item.live_practice_id === firstLivePractice?.id
)
const firstLivePracticeRecord = firstLivePractice?.records[0]
return `请根据选手提交的改进方案进行评分(满分10分):
选手提交的改进方案:
${JSON.stringify(firstLivePracticeRecord?.improvement_plan)}
......@@ -527,9 +523,7 @@ export const generateImprovementPlanPrompt = (data: any) => {
export const generatePracticeRecord2Prompt = (data: any) => {
const secondLivePractice = data.practices[1]
const secondLivePracticeRecord = data.practice_records.find(
(item: any) => item.live_practice_id === secondLivePractice?.id
)
const secondLivePracticeRecord = secondLivePractice?.records[0]
return `
请根据选手提交的二次直播演练内容进行评分(满分15分)
选手提交内容:
......
......@@ -263,9 +263,7 @@ ${JSON.stringify(data.speeches)}
export const generatePracticeRecordPrompt = (data: any) => {
const firstLivePractice = data.practices[0]
const firstLivePracticeRecord = data.practice_records.find(
(item: any) => item.live_practice_id === firstLivePractice?.id
)
const firstLivePracticeRecord = firstLivePractice?.records[0]
return `请根据选手提交的内容进行评分(满分15分)
选手提交内容:
${JSON.stringify(firstLivePracticeRecord)}
......@@ -412,9 +410,7 @@ export const generatePracticeRecordPrompt = (data: any) => {
export const generateImprovementPlanPrompt = (data: any) => {
const firstLivePractice = data.practices[0]
const firstLivePracticeRecord = data.practice_records.find(
(item: any) => item.live_practice_id === firstLivePractice?.id
)
const firstLivePracticeRecord = firstLivePractice?.records[0]
return `请根据选手提交的改进方案进行评分(满分10分):
选手提交的改进方案:
${JSON.stringify(firstLivePracticeRecord?.improvement_plan)}
......@@ -436,9 +432,7 @@ export const generateImprovementPlanPrompt = (data: any) => {
export const generatePracticeRecord2Prompt = (data: any) => {
const secondLivePractice = data.practices[1]
const secondLivePracticeRecord = data.practice_records.find(
(item: any) => item.live_practice_id === secondLivePractice?.id
)
const secondLivePracticeRecord = secondLivePractice?.records[0]
return `
请根据选手提交的二次直播演练内容进行评分(满分30分)
选手提交内容:
......
<script setup>
import LiveProductCategory from '@/components/LiveProductCategory.vue'
import { getScoreList } from '../api'
import { getScoreList, getScoreDetail, publishAll, updateScore } from '../api'
import { ElMessage } from 'element-plus'
import { useChat } from '@ezijing/ai-vue'
import { generatePrompt } from '../prompt'
import { generatePrompt as generatePrompt2 } from '../prompt2'
import { useIntervalFn } from '@vueuse/core'
const route = useRoute()
const appList = ref(null)
defineProps({ hasAI: { type: Boolean, default: true } })
// 刷新
const handleRefresh = () => {
appList.value?.refetch()
......@@ -24,6 +31,7 @@ const listOptions = computed(() => {
{ label: '暂未评分', value: '0' },
{ label: '评分中', value: '1' },
{ label: '已评分', value: '2' },
{ label: 'AI评分完成', value: '3' },
],
},
],
......@@ -43,30 +51,74 @@ const listOptions = computed(() => {
}
})
// const handleSubmit = () => {
// studentSubmit().then(() => {
// handleRefresh()
// })
// }
const handleExport = () => {
window.open(`/api/lab/v1/experiment/live-student-record/export?experiment_id=${route.query.experiment_id}`)
}
const { isLoading, generateText } = useChat({ provider: 'siliconflow' })
const handleAIScore = async () => {
console.log('AI一键评分')
const res = await getScoreList({ 'per-page': 200, check_status: 0 })
const list = res.data.list
list.forEach(async (item) => {
const detailRes = await getScoreDetail({ id: item.id })
const detail = detailRes.data.detail
const prompt =
detail.competition_rule?.questions == 1 ? generatePrompt(detail.live_data) : generatePrompt2(detail.live_data)
// 修改为评分中
updateScore({ id: item.id, check_status: 1 })
const result = await generateText({ prompt, response_format: { type: 'json_object' } })
console.log(result)
try {
const parsed = JSON.parse(result.content)
console.log(parsed)
const totalScore = Object.values(parsed).reduce((acc, curr) => acc + (curr.score || 0), 0)
updateScore({
id: item.id,
check_status: 3,
total_score: totalScore.value,
score_details: JSON.stringify(parsed),
}).then(() => {
console.log('AI评分完成')
})
} catch (error) {
console.log('评分失败', error)
}
})
}
const handlePublishScore = () => {
publishAll().then(() => {
ElMessage.success('发布成绩成功')
handleRefresh()
})
}
useIntervalFn(() => {
handleRefresh()
}, 5000)
</script>
<template>
<AppCard title="成绩管理">
<AppList v-bind="listOptions" ref="appList">
<template #header-buttons>
<!-- <el-button type="primary" @click="handleSubmit">提交成绩</el-button> -->
<el-button type="primary" @click="handleExport">导出成绩</el-button>
<el-row justify="space-between">
<el-button type="primary" @click="handleExport">导出成绩</el-button>
<div>
<el-button type="primary" @click="handleAIScore" :loading="isLoading" v-if="hasAI">AI一键评分</el-button>
<el-button type="primary" @click="handlePublishScore" v-if="false">一键发布成绩</el-button>
</div>
</el-row>
</template>
<template #filter-category>
<LiveProductCategory v-model="listParams.live_commodity_type_id" @change="handleRefresh"></LiveProductCategory>
</template>
<template #table-x="{ row }">
<el-button text type="primary">
<el-button text type="primary" v-if="row.check_status != '2'">
<router-link :to="{ path: '/live/score/view', query: { ...$route.query, id: row.id } }">评分</router-link>
</el-button>
</template>
......
......@@ -11,7 +11,7 @@ const CompetitionOperations = defineAsyncComponent(() => import('../components/C
const route = useRoute()
const id = route.query.id
const { isLoading, generateText } = useChat({ provider: 'volcano' })
const { isLoading, generateText } = useChat({ provider: 'siliconflow' })
const detail = ref(null)
......@@ -41,7 +41,7 @@ const handleAIScore = async () => {
try {
const parsed = JSON.parse(result.content)
Object.assign(scoreDetails, parsed)
commitScore().then(() => {
commitScore(1).then(() => {
ElMessage.success('保存成功')
})
} catch (error) {
......@@ -96,7 +96,9 @@ const handlePublishScore = () => {
v-if="detail.competition_rule?.competition == 1"
>AI一键评分</el-button
>
<el-button type="primary" :disabled="detail.check_status == '2'" @click="handlePublishScore">发布成绩</el-button>
<el-button type="primary" :disabled="detail.check_status == '2'" @click="handlePublishScore"
>发布成绩</el-button
>
</el-form-item>
</el-form>
<div class="score-box">
......
......@@ -418,7 +418,7 @@ const adminMenus: IMenuItem[] = [
{ id: 401, name: '创意策划方案', path: '/operations/plan', icon: markRaw(RiLightbulbLine) },
{ id: 402, name: '视听运营', path: '/operations/audiovisual', icon: markRaw(RiSoundModuleLine) },
{ id: 403, name: '流量运营', path: '/operations/flow', icon: markRaw(RiLineChartLine) },
{ id: 404, name: '成绩管理', path: '/live/score', icon: markRaw(RiFileChartLine), role: [5, 6] },
{ id: 404, name: '成绩管理', path: '/operations/score', icon: markRaw(RiFileChartLine), role: [5, 6] },
],
},
]
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论