feat: 编辑提交记录支持修改所属项目
All checks were successful
Build and Deploy Backend / build-and-deploy (push) Successful in 1m24s
Build and Deploy Web / build-and-deploy (push) Successful in 54s

- 编辑弹窗中所属项目改为可选下拉
- 后端 SubmissionUpdate 新增 project_id 字段
- 切换到内部事务项目时自动调整阶段和内容类型
- 修复编辑时产出时长校验变量名 bug

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
seaislee1209 2026-03-10 11:17:34 +08:00
parent a5d3739eef
commit 4629525d2a
3 changed files with 25 additions and 4 deletions

View File

@ -194,6 +194,11 @@ def update_submission(
} }
# 更新字段 # 更新字段
if req.project_id is not None:
project = db.query(Project).filter(Project.id == req.project_id).first()
if not project:
raise HTTPException(status_code=404, detail="项目不存在")
sub.project_id = req.project_id
if req.project_phase is not None: if req.project_phase is not None:
sub.project_phase = PhaseGroup(req.project_phase) sub.project_phase = PhaseGroup(req.project_phase)
if req.work_type is not None: if req.work_type is not None:
@ -221,7 +226,7 @@ def update_submission(
# 产出时长校验:前期内容不需要,中期/后期内容必须 > 0 # 产出时长校验:前期内容不需要,中期/后期内容必须 > 0
NO_DURATION_TYPES = {'策划案', '大纲/梗概', '概念设计图', '测试片', '剧本', '分镜', '人设图', '场景图', '道具图', '培训', '招聘面试', '内部其他'} NO_DURATION_TYPES = {'策划案', '大纲/梗概', '概念设计图', '测试片', '剧本', '分镜', '人设图', '场景图', '道具图', '培训', '招聘面试', '内部其他'}
content_val = sub.content_type.value if hasattr(sub.content_type, 'value') else sub.content_type content_val = sub.content_type.value if hasattr(sub.content_type, 'value') else sub.content_type
if content_val not in PRE_PHASE_TYPES and sub.total_seconds <= 0: if content_val not in NO_DURATION_TYPES and sub.total_seconds <= 0:
raise HTTPException(status_code=422, detail="请填写产出时长") raise HTTPException(status_code=422, detail="请填写产出时长")
# 保存新数据 # 保存新数据

View File

@ -174,6 +174,7 @@ class SubmissionCreate(BaseModel):
class SubmissionUpdate(BaseModel): class SubmissionUpdate(BaseModel):
project_id: Optional[int] = None
project_phase: Optional[str] = None project_phase: Optional[str] = None
work_type: Optional[str] = None work_type: Optional[str] = None
content_type: Optional[str] = None content_type: Optional[str] = None

View File

@ -156,8 +156,10 @@
<!-- 编辑提交对话框 --> <!-- 编辑提交对话框 -->
<el-dialog v-model="showEdit" title="编辑提交记录" width="580px" destroy-on-close> <el-dialog v-model="showEdit" title="编辑提交记录" width="580px" destroy-on-close>
<el-form :model="editForm" label-width="110px" label-position="left"> <el-form :model="editForm" label-width="110px" label-position="left">
<el-form-item label="所属项目"> <el-form-item label="所属项目" required>
<el-input :model-value="editForm._project_name" disabled /> <el-select v-model="editForm._project_id" style="width:100%" @change="onEditProjectChange">
<el-option v-for="p in activeProjects" :key="p.id" :label="p.name" :value="p.id" />
</el-select>
</el-form-item> </el-form-item>
<template v-if="!isEditInternalProject"> <template v-if="!isEditInternalProject">
<el-row :gutter="16"> <el-row :gutter="16">
@ -323,9 +325,21 @@ const isInternalProject = computed(() => {
return proj?.name === INTERNAL_PROJECT_NAME return proj?.name === INTERNAL_PROJECT_NAME
}) })
const isEditInternalProject = computed(() => { const isEditInternalProject = computed(() => {
return editForm._project_name === INTERNAL_PROJECT_NAME const proj = activeProjects.value.find(p => p.id === editForm._project_id)
return proj?.name === INTERNAL_PROJECT_NAME
}) })
//
function onEditProjectChange(projectId) {
const proj = activeProjects.value.find(p => p.id === projectId)
editForm._project_name = proj?.name || ''
if (proj?.name === INTERNAL_PROJECT_NAME) {
editForm.project_phase = '内部事务'
editForm.work_type = '制作'
editForm.content_type = PHASE_CONTENT_TYPES['内部事务'][0]
}
}
// //
const filteredContentTypes = computed(() => { const filteredContentTypes = computed(() => {
if (isInternalProject.value) return PHASE_CONTENT_TYPES['内部事务'] if (isInternalProject.value) return PHASE_CONTENT_TYPES['内部事务']
@ -532,6 +546,7 @@ async function handleUpdate() {
editing.value = true editing.value = true
try { try {
const { _id, _project_name, _project_id, ...payload } = editForm const { _id, _project_name, _project_id, ...payload } = editForm
payload.project_id = _project_id
await submissionApi.update(_id, payload) await submissionApi.update(_id, payload)
ElMessage.success('修改成功') ElMessage.success('修改成功')
showEdit.value = false showEdit.value = false