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

chore: 评分修改为多人评分,总分取平均分

上级 a546e977
......@@ -23,7 +23,7 @@ ${JSON.stringify(data.commodity_types)}
速食面品类下:
●至少2个二级品类
●必须包含:“复合式速煮面”、“高端速食拌面/干面”
●必须包含:“复合式冲泡面”、“高端速食拌面/干面”
●状态为"有效"
鲜切面品类下:
......@@ -147,21 +147,21 @@ ${JSON.stringify(data.commodities)}
一级品类:"襄阳牛肉面2桶装(有牛肉)"应关联到"速食面品类"
二级品类:应关联到"速食面品类"下的"复合式速煮面"
二级品类:应关联到"速食面品类"下的"复合式冲泡面"
计分规则
| 情况 | 得分 | 判定依据 |
| ------------------------------ | ----- | ----------------------------------------------------- |
| 一级品类 ✅ 且 二级品类 ✅ | 1分 | 在商品详情配置页中明确显示"速食面品类 > 复合式速煮面" |
| 一级品类 ✅ 且 二级品类 ✅ | 1分 | 在商品详情配置页中明确显示"速食面品类 > 复合式冲泡面" |
| 仅一级品类 ✅ 或 仅二级品类 ✅ | 0.5分 | 仅显示其中一项正确 |
| 两者都错误或缺失 | 0分 | 未找到类目信息,或类目错误 |
评分示例
✅ 得1分:配置页显示"类目:速食面品类 > 复合式速煮面"
✅ 得1分:配置页显示"类目:速食面品类 > 复合式冲泡面"
⚠️ 得0.5分:配置页显示"类目:速食面品类"(缺少二级分类)
......@@ -1097,7 +1097,7 @@ ________________________________________
- 一级品类:已配置:配置页显示"速食面品类"
- 二级品类:已配置:配置页显示"复合式速煮面"
- 二级品类:已配置:配置页显示"复合式冲泡面"
......
......@@ -6,6 +6,8 @@ import { useChat } from '@ezijing/ai-vue'
import { generatePrompt } from '../prompt'
import { generatePrompt as generatePrompt2 } from '../prompt2'
import { useIntervalFn } from '@vueuse/core'
import { useUserStore } from '@/stores/user'
const userStore = useUserStore()
const route = useRoute()
const appList = ref(null)
......@@ -43,7 +45,19 @@ const listOptions = computed(() => {
// { label: '班级', prop: 'class_name' },
{ label: '成绩', prop: 'score_display' },
{ label: '状态', prop: 'check_status_name' },
{ label: '评分人', prop: 'checker_name' },
{
label: '评分人',
prop: 'checker_name',
computed: ({ row }) => {
const scores = JSON.parse(row.score_details)
return Array.isArray(scores)
? scores
.filter((item) => !item.is_ai)
.map((item) => `${item.checker_name}(${item.total_score})`)
.join(',')
: ''
},
},
{ label: '提交时间', prop: 'commit_time' },
{ label: '批改时间', prop: 'commit_time' },
{ label: '操作', slots: 'table-x', width: 120 },
......@@ -65,21 +79,37 @@ const handleAIScore = async () => {
list.forEach(async (item) => {
const detailRes = await getScoreDetail({ id: item.id })
const detail = detailRes.data.detail
const parsed = JSON.parse(detail.score_details)
let scores = Array.isArray(parsed) ? parsed : []
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)
const scoreDetails = JSON.parse(result.content)
const totalScore = Object.values(scoreDetails).reduce((acc, curr) => acc + (curr.score || 0), 0)
console.log(scoreDetails)
const myScore = {
is_ai: true,
checker_id: userStore.user.id,
checker_name: userStore.user.name,
scores: scoreDetails,
total_score: totalScore,
updated_at: new Date().toLocaleString(),
}
scores = [...scores.filter((item) => item.checker_id != userStore.user.id), myScore]
// 总平均分,过滤掉AI评分
const validScores = scores.filter((item) => !item.is_ai)
const totalAverageScore = validScores.reduce((acc, curr) => acc + (curr.total_score || 0), 0) / validScores.length
updateScore({
id: item.id,
check_status: 3,
total_score: totalScore.value,
score_details: JSON.stringify(parsed),
total_score: totalAverageScore,
score_details: JSON.stringify(scores),
}).then(() => {
console.log('AI评分完成')
})
......
......@@ -4,6 +4,8 @@ import { ElMessageBox, ElMessage } from 'element-plus'
import { useChat } from '@ezijing/ai-vue'
import { generatePrompt } from '../prompt'
import { generatePrompt as generatePrompt2 } from '../prompt2'
import { useUserStore } from '@/stores/user'
const userStore = useUserStore()
const CompetitionLive = defineAsyncComponent(() => import('../components/CompetitionLive.vue'))
const CompetitionLiveProd = defineAsyncComponent(() => import('../components/CompetitionLiveProd.vue'))
......@@ -21,10 +23,22 @@ const totalScore = computed(() => {
return Object.values(scoreDetails).reduce((acc, curr) => acc + (curr.score || 0), 0)
})
// 所有评分人的评分列表
let scores = []
const fetchDetail = async () => {
const res = await getScoreDetail({ id })
detail.value = res.data.detail
Object.assign(scoreDetails, res.data.detail.score_details ? JSON.parse(res.data.detail.score_details) : {})
const resDetail = res.data.detail
detail.value = resDetail
try {
const parsed = JSON.parse(resDetail.score_details)
scores = Array.isArray(parsed) ? parsed : []
} catch (error) {
console.log('评分列表解析失败', error)
scores = []
}
const myScore = scores.find((item) => item.checker_id == userStore.user.id)?.scores
const firstScore = scores[0]?.scores
Object.assign(scoreDetails, myScore || firstScore || {})
}
onMounted(() => {
......@@ -41,7 +55,7 @@ const handleAIScore = async () => {
try {
const parsed = JSON.parse(result.content)
Object.assign(scoreDetails, parsed)
commitScore().then(() => {
commitScore(1, true).then(() => {
ElMessage.success('保存成功')
})
} catch (error) {
......@@ -57,15 +71,30 @@ const handleSave = () => {
})
}
const commitScore = (status = 1) => {
const commitScore = (status = 1, isAI = false) => {
const myScore = {
is_ai: isAI,
checker_id: userStore.user.id,
checker_name: userStore.user.name,
scores: scoreDetails,
total_score: totalScore.value,
updated_at: new Date().toLocaleString(),
}
// 去掉当前评分人的评分,并添加当前评分人的评分
scores = [...scores.filter((item) => item.checker_id != userStore.user.id), myScore]
// 总平均分,过滤掉AI评分
const validScores = scores.filter((item) => !item.is_ai)
const totalAverageScore = validScores.reduce((acc, curr) => acc + (curr.total_score || 0), 0) / validScores.length
return updateScore({
id: route.query.id,
check_status: status,
total_score: totalScore.value,
score_details: JSON.stringify(scoreDetails),
total_score: totalAverageScore,
score_details: JSON.stringify(scores),
})
}
const handlePublishScore = () => {
ElMessageBox.confirm('确定要发布成绩吗?', '提示', {
confirmButtonText: '确定',
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论