diff --git a/src/component/home/design/editDesignType/index.vue b/src/component/home/design/editDesignType/index.vue index 2bf258c6..0dc72135 100644 --- a/src/component/home/design/editDesignType/index.vue +++ b/src/component/home/design/editDesignType/index.vue @@ -339,6 +339,7 @@ setup(props:any,{emit}) { projectId:productimg.selectObject.id, productImage:getMinioUrl(productimg.scaleImageList[productimg.scaleImageIndex].sourceUrl), modelName:speed.speedData.value, + mode:1, parentId:productimg.selectGenerate.parentId || productimg.selectGenerate.userLikeSortId, userLikeSortId:productimg.openType == 'add'?(productimg.selectGenerate.userLikeSortId || null):null, isDefaultLike:true,//表示是否生成就like diff --git a/src/component/home/tools/poseTransfer/index.vue b/src/component/home/tools/poseTransfer/index.vue index 8039e3f9..f6d4ffd1 100644 --- a/src/component/home/tools/poseTransfer/index.vue +++ b/src/component/home/tools/poseTransfer/index.vue @@ -33,7 +33,7 @@
@@ -231,12 +232,6 @@
- -
@@ -344,7 +339,7 @@ export default defineComponent({ token: getCookie('token'), upload: { projectId: computed(() => store.state.Workspace.probjects.id), - type: 'first' // first首帧 last尾帧 + type: null // first首帧 last尾帧 }, waitList: [], likeList: computed(() => { @@ -362,7 +357,6 @@ export default defineComponent({ } }), isGenerate: false, //判断是否正在进行generate - remGenerate: false, removeGenerate: false, generateTime: null as any, poseList: [], @@ -431,7 +425,7 @@ export default defineComponent({ } // 处理首帧选择 - data.fileList.forEach((listItem: any) => (listItem.isChecked = false)) + showFirstFrameList.value.forEach((listItem: any) => (listItem.isChecked = false)) data.currentList.forEach((listItem: any) => (listItem.isChecked = false)) item.isChecked = true data.selectImg = item @@ -516,7 +510,12 @@ export default defineComponent({ }, 200) } const getgenerate = async () => { - if (!data.selectImg.minioUrl) return message.info(t('ProductImg.jsContent2')) + if (videoType.value === 3 && !data.lastSelectImg.minioUrl) { + message.info(t('poseTransfer.NeedLastFrame')) + return + } + if (!data.selectImg.minioUrl) return message.info(t('poseTransfer.NeedFirstFrame')) + debugger if (data.isGenerate) return await new Promise((res, reject) => { Modal.confirm({ @@ -536,8 +535,6 @@ export default defineComponent({ }) data.isGenerate = true - // data.remGenerateTime = setTimeout(()=>{ - // },10000) let value = { poseId: data.selectPose, @@ -561,7 +558,6 @@ export default defineComponent({ } Https.axiosPost(Https.httpUrls.poseTransform, value) .then(rv => { - data.remGenerate = true data.noLikeList.unshift({ taskId: rv.taskId, parentId: data.selectImg.parentId @@ -570,8 +566,6 @@ export default defineComponent({ }) .catch((res: any) => { data.isGenerate = false - clearInterval(data.remGenerateTime) - data.remGenerate = false if (res.errCode === 2) { Modal.confirm({ title: res.errMsg, @@ -594,7 +588,7 @@ export default defineComponent({ data.waitList = list let state = true data.generateTime = setInterval(() => { - if (!data.isGenerate || !data.remGenerate) return + if (!data.isGenerate) return if (!state) return state = false Https.axiosPost(Https.httpUrls.poseTransformResult, list) @@ -612,8 +606,6 @@ export default defineComponent({ data.noLikeList[index] = element list = '' clearInterval(data.generateTime) - clearInterval(data.remGenerateTime) - data.remGenerate = false data.isGenerate = false // if(list?.filter)list = list?.filter((item:any) => item !== element.taskId); store.dispatch('getCredits') @@ -624,8 +616,6 @@ export default defineComponent({ message.info(t('ProductImg.jsContent3')) data.noLikeList.splice(index, 1) clearInterval(data.generateTime) - clearInterval(data.remGenerateTime) - data.remGenerate = false data.isGenerate = false store.dispatch('getCredits') } @@ -636,16 +626,13 @@ export default defineComponent({ let index = data.noLikeList.findIndex((obj: any) => obj.taskId === list) data.noLikeList.splice(index, 1) clearInterval(data.generateTime) - clearInterval(data.remGenerateTime) data.isGenerate = false - data.remGenerate = false }) }, 10000) } const setRemoveGenerate = () => { //取消操作 data.isGenerate = false - data.remGenerate = false clearInterval(data.generateTime) if (data.waitList) { // let str = data.waitList.map((obj:any) => obj.taskId).join(','); @@ -691,7 +678,7 @@ export default defineComponent({ if (!isLt2M) { message.info(useI18n().t('MoodboardUpload.jsContent4')) } - if (!data?.upload?.projectId && !isSelectObject) { + if (!route?.query?.id && !isSelectObject) { isSelectObject = true await createProbject() } @@ -705,26 +692,28 @@ export default defineComponent({ if (res.errCode == 0) { file.imgUrl = res.data.url file.id = res.data.id - file.frameType = 'first' data.currentList.forEach((listItem: any) => (listItem.isChecked = false)) - // data.fileList.forEach((listItem:any)=>{ - // if(listItem.id == file.id){ - // listItem.isChecked = true - // }else{ - // listItem.isChecked = false - // } - // }) file.type = 'ProductElement' - // if(props.productimgMenu.value == 'Relight'){ - // file.type = "ToProductImage" - // } - data.selectImg = res.data - // data.fileList.filter((v: any) => v.status === "done"); + if (videoType.value === 3) { + file.frameType = 'first' + } let storeData = { str: 'add', list: [file] } store.commit('setUploadElement', storeData) + // 上传成功后,设置选中状态 + file.isChecked = true + // 取消 showFirstFrameList 中其他项的选中状态 + showFirstFrameList.value.forEach((listItem: any) => { + if (listItem.id !== file.id) { + listItem.isChecked = false + } + }) + data.selectImg = res.data + if (res.data.url || res.data.imgUrl) { + data.selectImg.minioUrl = getMinioUrl(res.data.url || res.data.imgUrl) + } } else { bor = false } @@ -816,34 +805,62 @@ export default defineComponent({ .then(rv => { if (str == 'like') { item.newLike = true - let value = { + // 从 noLikeList 中查找索引并删除 + const noLikeIndex = store.state.HomeStoreModule.poseTransfer.list.findIndex( + (v: any) => v.id === item.id + ) + if (noLikeIndex !== -1) { + let deleteValue = { + list: [], + str: 'splice', + index: noLikeIndex + } + store.commit('setPoseTransfer', deleteValue) + } + // 添加到 likedList + let addValue = { likedList: [ { ...item, - sort: rv.sort, - parentId: rv.parentId + sort: rv?.sort ?? item.sort, + parentId: rv?.parentId ?? item.parentId } ], str: 'add', index: -1 } - store.commit('setPoseTransfer', value) - data.noLikeList.splice(index, 1) + store.commit('setPoseTransfer', addValue) } else { - let value = { - likedList: [ + item.newLike = false + // 从 likedList 中查找索引并删除 + const likedIndex = + store.state.HomeStoreModule.poseTransfer.likedList.findIndex( + (v: any) => v.id === item.id + ) + if (likedIndex !== -1) { + let deleteValue = { + likedList: [], + str: 'splice', + index: likedIndex + } + store.commit('setPoseTransfer', deleteValue) + } + // 添加到 noLikeList + let addValue = { + list: [ { ...item } ], - str: 'splice', - index: index + str: 'add', + index: -1 } - data.noLikeList.push(item) - store.commit('setPoseTransfer', value) + store.commit('setPoseTransfer', addValue) } }) - .catch(res => {}) + .catch(res => { + console.error('likeFile error:', res) + }) } const selectPose = (item: any) => { data.poseList.forEach((listItem: any) => (listItem.isChecked = false)) @@ -873,8 +890,16 @@ export default defineComponent({ { params: value } ).then(rv => { if (isLastFrame) { + // 如果删除的是当前选中的尾帧,清空选中状态 + if (data.lastSelectImg?.id === item.id) { + data.lastSelectImg = {} + } store.commit('setPoseTransferLastFrameList') - }else{ + } else { + // 如果删除的是当前选中的首帧,清空选中状态 + if (data.selectImg?.id === item.id) { + data.selectImg = {} + } let storeData = { str: 'delete', index @@ -883,28 +908,50 @@ export default defineComponent({ } }) } + + const videoType = ref(2) + const showMotion = computed(() => videoType.value === 1) + const options = ref([ + { vlaue: 2, label: t('poseTransfer.FirstFrame') }, + { value: 3, label: t('poseTransfer.FirstAndLastFrames') }, + { value: 1, label: t('poseTransfer.FirstFrameAndSkeleton') } + ]) + + const firstFrameList = ref([]) + const lastFrameList = ref([]) + const showFirstFrameList = computed(() => { + if(props.isDesignPage) return data.fileList + return videoType.value === 3 ? firstFrameList.value : data.fileList + }) watch( () => store.state.HomeStoreModule.uploadElement.length, (newVal, oldVal) => { - if (props.isDesignPage) return + if (props.isDesignPage || (!route.query?.id && !route.query?.history)) return data.fileList = store.state.HomeStoreModule.uploadElement.filter( + item => !item.frameType + ) + + firstFrameList.value = store.state.HomeStoreModule.uploadElement.filter( item => item.frameType === 'first' ) + lastFrameList.value = store.state.HomeStoreModule.uploadElement.filter( item => item.frameType === 'last' ) - - data.fileList.forEach((listItem: any) => { + // 更新 showFirstFrameList 中项的选中状态 + showFirstFrameList.value.forEach((listItem: any) => { if (listItem.id == data.selectImg.id) { listItem.isChecked = true } else { listItem.isChecked = false } }) + }, + { + immediate: true } ) - // 全局维护尾帧上传列表,保持与主上传一致 - const lastFrameList = ref([]) + watch( () => store.state.HomeStoreModule.lastFrameList, val => { @@ -917,6 +964,31 @@ export default defineComponent({ { immediate: true } ) + // 首帧图片的type 切换为首尾帧时type=first,其他情况type为null + watch( + () => videoType.value, + newVal => { + if (newVal === 3) { + data.upload.type = 'first' + } else { + delete data.upload.type + } + // 当 videoType 改变时,检查 selectImg 是否在当前 showFirstFrameList 中 + // 如果不在,清空选中状态或选择列表中的第一项 + const currentList = showFirstFrameList.value + if (data.selectImg?.id) { + const exists = currentList.some((item: any) => item.id === data.selectImg.id) + if (!exists) { + // 如果当前选中的项不在新列表中,清空选中状态 + data.selectImg = {} + // 取消所有项的选中状态 + currentList.forEach((item: any) => (item.isChecked = false)) + } + } + }, + { immediate: true } + ) + watch( () => data.noLikeList.length, (newVal, oldVal) => { @@ -925,7 +997,6 @@ export default defineComponent({ let taskIdList = list.filter((item: any) => !item.videoUrl)[0] if (taskIdList?.length > 0) { data.isGenerate = true - data.remGenerate = true setGenerate(taskIdList[0].taskId) } }) @@ -933,19 +1004,9 @@ export default defineComponent({ { immediate: true } ) - const videoType = ref(2) - const showMotion = computed(() => videoType.value === 1) - const options = ref([ - { vlaue: 2, label: t('poseTransfer.FirstFrame') }, - { value: 3, label: t('poseTransfer.FirstAndLastFrames') }, - { value: 1, label: t('poseTransfer.FirstFrameAndSkeleton') } - ]) - onBeforeUnmount(() => { clearInterval(data.generateTime) - clearInterval(data.remGenerateTime) data.isGenerate = false - data.remGenerate = false }) return { @@ -953,6 +1014,8 @@ export default defineComponent({ ...toRefs(dataDom), ...toRefs(data), lastFrameList, + firstFrameList, + showFirstFrameList, openSetData, selectImgItem, setSize, diff --git a/src/lang/cn.ts b/src/lang/cn.ts index f574f91f..d3d0c1d3 100644 --- a/src/lang/cn.ts +++ b/src/lang/cn.ts @@ -295,6 +295,8 @@ export default { GeneratedVideo: '生成的视频', hint: '将这张图像转化为一张逼真、达到工作室水准的照片。在生活中真实存在的人', jsContent1: '生成视频预计需要三分钟,请问是否继续', + NeedFirstFrame:'请选择首帧图片', + NeedLastFrame:'请选择尾帧图片', SingleGarment: '专业产品摄影:服装展示于隐形模特上,模特不可见。完整保留设计细节——所有图案、颜色、质地及细节特征。', // 单品样衣 SingleChildTryOn: diff --git a/src/lang/en.ts b/src/lang/en.ts index bda82e84..5a8fe478 100644 --- a/src/lang/en.ts +++ b/src/lang/en.ts @@ -305,6 +305,8 @@ export default { GeneratedVideo: 'Generated Video', hint: 'Transform this image into a realistic, studio-quality photograph. To the real photo real people', jsContent1: 'Video generation will take approximately 3 minutes. Continue?', + NeedFirstFrame: 'Please select the first frame image', + NeedLastFrame: 'Please select the last frame image', SingleGarment: 'Professional product photo: garment on invisible mannequin, no model visible. Preserve exact design - all patterns, colors, textures, details.', // 单品样衣 SingleChildTryOn: @@ -332,7 +334,8 @@ export default { firstAndLastFramePlaceholder1: '[Camera Movement]', firstAndLastFrameText2: 'to follow the motion, under', firstAndLastFramePlaceholder2: '[Light]', - firstAndLastFrameText3: ', maintaining full consistency of model identity, styling, and outfit across all frames.', + firstAndLastFrameText3: + ', maintaining full consistency of model identity, styling, and outfit across all frames.', firstFrameText1: 'Set the', firstFramePlaceholder1: '[Scene]', firstFrameText2: ', where the model', diff --git a/src/views/HomeMain.vue b/src/views/HomeMain.vue index 4f25e4e2..0cda79c7 100644 --- a/src/views/HomeMain.vue +++ b/src/views/HomeMain.vue @@ -523,7 +523,7 @@ export default defineComponent({ bathGenerationList: ['poseTransfer', 'SERIES_DESIGN', 'toProduct', 'relight'], showHistory: false, isNewProject: false, - cachedRoutes:computed(()=>store.state.Workspace.cachedRoutes),// + cachedRoutes: computed(() => store.state.Workspace.cachedRoutes) // }) let userDetail = computed(() => { return store.state.UserHabit.userDetail @@ -578,7 +578,7 @@ export default defineComponent({ nextTick(async () => { const key = Object.keys(query)?.[0] if (key) { - if (query.id) { + if (query.id && !query.tools) { homeMainData.openType = 'history' homeMainData.openTypeChild = query.id } else { @@ -1030,7 +1030,7 @@ export default defineComponent({ if (currentProjectActive.value) return if (currentProjectPath.value) { router.push(currentProjectPath.value) - // router.back() + // router.back() } } diff --git a/src/views/HomeView/history.vue b/src/views/HomeView/history.vue index 9cecb1af..b8a601e3 100644 --- a/src/views/HomeView/history.vue +++ b/src/views/HomeView/history.vue @@ -466,6 +466,8 @@ export default defineComponent({ // this.$router.push({ name: 'homePage', params: { id: record.id, type: 'History' } }) // this.store.commit('setChooseIsDesign', num) // router.push(`/home/tools?tools=toProduct&id=${childItem.id}`) + + this.store.state.Workspace.cachedRoutes = []; this.store.commit('setProjectPath','') if (record.process == 'SERIES_DESIGN' || record.process == 'SINGLE_DESIGN') { this.$router.push(`/home/history/${record?.id}`)