feat: 编辑提交记录支持修改所属项目
- 编辑弹窗中所属项目改为可选下拉 - 后端 SubmissionUpdate 新增 project_id 字段 - 切换到内部事务项目时自动调整阶段和内容类型 - 修复编辑时产出时长校验变量名 bug Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
a5d3739eef
commit
4629525d2a
@ -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="请填写产出时长")
|
||||||
|
|
||||||
# 保存新数据
|
# 保存新数据
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user