feat: 自动化加分基本修复完毕 现在是全新的自动化qwqqq!

This commit is contained in:
NanGua-QWQ
2026-04-06 14:41:27 +08:00
parent 448df1a40b
commit ed4891210d
11 changed files with 1259 additions and 394 deletions
+46 -3
View File
@@ -27,6 +27,7 @@ import {
createEmptyTriggerTree,
createTriggerQueryConfig,
hasUnsupportedTriggerLogic,
normalizeTriggerTree,
normalizeActionDrafts,
queryTreeToTriggers,
triggersToQueryTree,
@@ -54,6 +55,8 @@ interface AutoScoreManagerProps {
canEdit: boolean
}
const getRuleFileRelativePath = (ruleId: number) => `auto-score/rule-${ruleId}.json`
function AutoScoreManager({ canEdit }: AutoScoreManagerProps): React.JSX.Element {
const { t, i18n } = useTranslation()
const [form] = Form.useForm<RuleFormValues>()
@@ -92,6 +95,10 @@ function AutoScoreManager({ canEdit }: AutoScoreManagerProps): React.JSX.Element
}
}, [currentPage, pageSize, rules.length])
useEffect(() => {
setTriggerTree((prevTree) => normalizeTriggerTree(prevTree, triggerConfig))
}, [triggerConfig])
const resetEditor = () => {
setEditingRuleId(null)
form.setFieldsValue({ name: "", studentNames: [] })
@@ -262,6 +269,7 @@ function AutoScoreManager({ canEdit }: AutoScoreManagerProps): React.JSX.Element
const res = await api.autoScoreDeleteRule(ruleId)
if (res.success) {
await api.fsDeleteFile(getRuleFileRelativePath(ruleId), "automatic").catch(() => void 0)
messageApi.success(t("autoScore.deleteSuccess"))
if (editingRuleId === ruleId) {
resetEditor()
@@ -295,6 +303,38 @@ function AutoScoreManager({ canEdit }: AutoScoreManagerProps): React.JSX.Element
}
}
const handleOpenRuleFile = async (rule: AutoScoreRule) => {
const api = (window as any).api
if (!api) return
try {
const relativePath = getRuleFileRelativePath(rule.id)
const fileContent = {
id: rule.id,
name: rule.name,
enabled: rule.enabled,
studentNames: rule.studentNames,
triggers: rule.triggers,
actions: rule.actions,
lastExecuted: rule.lastExecuted ?? null,
exportedAt: new Date().toISOString(),
}
const writeRes = await api.fsWriteJson(relativePath, fileContent, "automatic")
if (!writeRes?.success) {
throw new Error("prepare rule file failed")
}
const openRes = await api.fsOpenPath(relativePath, "automatic")
if (!openRes?.success) {
throw new Error(openRes?.message || "open rule file failed")
}
} catch {
messageApi.error(t("autoScore.openFileFailed"))
}
}
const formatLastExecuted = (value?: string | null) => {
if (!value) return t("autoScore.notExecuted")
const date = new Date(value)
@@ -358,12 +398,15 @@ function AutoScoreManager({ canEdit }: AutoScoreManagerProps): React.JSX.Element
{
title: t("common.operation"),
key: "operation",
width: 140,
width: 220,
render: (_, row) => (
<Space size={4}>
<Button type="link" disabled={!canEdit} onClick={() => handleEdit(row)}>
{t("common.edit")}
</Button>
<Button type="link" onClick={() => handleOpenRuleFile(row).catch(() => void 0)}>
{t("autoScore.openFile")}
</Button>
<Popconfirm
title={t("autoScore.deleteConfirm")}
onConfirm={() => {
@@ -391,7 +434,7 @@ function AutoScoreManager({ canEdit }: AutoScoreManagerProps): React.JSX.Element
type="warning"
showIcon
style={{ marginBottom: "16px" }}
message={t("autoScore.adminRequired")}
title={t("autoScore.adminRequired")}
/>
)}
@@ -403,7 +446,7 @@ function AutoScoreManager({ canEdit }: AutoScoreManagerProps): React.JSX.Element
name="name"
rules={[{ required: true, message: t("autoScore.nameRequired") }]}
>
<Input placeholder={t("autoScore.namePlaceholder")} disabled={!canEdit} />
<Input placeholder={t("autoScore.namePlaceholder")} disabled={!canEdit} autoComplete="off"/>
</Form.Item>
<Form.Item label={t("autoScore.applicableStudents")} name="studentNames">
<Select