Переглянути джерело

优化一键更新描述词

黎海 2 місяців тому
батько
коміт
3611fadf7e
1 змінених файлів з 75 додано та 20 видалено
  1. 75 20
      src/pages/projectDetail/projectDetail.js

+ 75 - 20
src/pages/projectDetail/projectDetail.js

@@ -481,6 +481,15 @@ const ProjectDetail = () => {
481 481
               description: description
482 482
             });
483 483
 
484
+            // 直接更新状态而不是重新加载
485
+            setSegments(prevSegments =>
486
+              prevSegments.map(seg =>
487
+                seg.id === segment.id
488
+                  ? { ...seg, description: description }
489
+                  : seg
490
+              )
491
+            );
492
+
484 493
             console.log(`分镜ID ${segment.id} 的描述词生成成功: ${description.slice(0, 30)}...`);
485 494
             successCount++;
486 495
           } catch (error) {
@@ -505,6 +514,15 @@ const ProjectDetail = () => {
505 514
                 await bookInfoService.updateBookInfo(segment.id, {
506 515
                   description: `[生成失败] ${errorMsg}`
507 516
                 });
517
+
518
+                // 直接更新状态而不是重新加载
519
+                setSegments(prevSegments =>
520
+                  prevSegments.map(seg =>
521
+                    seg.id === segment.id
522
+                      ? { ...seg, description: `[生成失败] ${errorMsg}` }
523
+                      : seg
524
+                  )
525
+                );
508 526
               }
509 527
             } catch (saveError) {
510 528
               console.error('保存错误信息失败:', saveError);
@@ -513,9 +531,6 @@ const ProjectDetail = () => {
513 531
         }
514 532
       }
515 533
 
516
-      // 刷新数据
517
-      await loadProjectDetail();
518
-
519 534
       // 显示结果统计
520 535
       if (errorCount > 0 && successCount > 0) {
521 536
         toast.warning(`描述词生成完成,成功: ${successCount}个,失败: ${errorCount}个`);
@@ -878,6 +893,15 @@ const ProjectDetail = () => {
878 893
       for (let i = 0; i < segmentsToProcess.length; i++) {
879 894
         const segment = segmentsToProcess[i];
880 895
 
896
+        // 每次处理前检查分镜的当前状态
897
+        const currentSegment = await getSegmentById(segment.id);
898
+        
899
+        // 如果分镜状态不是排队状态(0),或者已经有图片,跳过处理
900
+        if (currentSegment.draw_status !== 0 || currentSegment.image_path) {
901
+          console.log(`分镜ID ${segment.id} 当前状态不是排队状态或已有图片,跳过处理`);
902
+          continue;
903
+        }
904
+
881 905
         // 每次处理前检查是否有分镜处于暂停状态(-1)
882 906
         // 获取最新的分镜状态
883 907
         const latestSegments = await bookInfoService.getBookInfoByBookId(parseInt(projectId));
@@ -906,6 +930,13 @@ const ProjectDetail = () => {
906 930
         progress.current = currentCompletedCount;
907 931
         setImageGenerationProgress({ ...progress });
908 932
 
933
+        // 再次检查分镜状态,确保没有被其他进程处理
934
+        const segmentBeforeUpdate = await getSegmentById(segment.id);
935
+        if (segmentBeforeUpdate.draw_status !== 0 || segmentBeforeUpdate.image_path) {
936
+          console.log(`分镜ID ${segment.id} 已被其他进程处理,跳过`);
937
+          continue;
938
+        }
939
+
909 940
         // 更新状态为绘画中(1)
910 941
         await bookInfoService.updateBookInfo(segment.id, {
911 942
           draw_status: 1 // 绘画中状态
@@ -920,8 +951,8 @@ const ProjectDetail = () => {
920 951
 
921 952
             // 再次检查当前分镜状态,确保没有被暂停
922 953
             const currentSegment = await getSegmentById(segment.id);
923
-            if (currentSegment.draw_status === -1) {
924
-              console.log('检测到当前分镜已被设置为暂停状态,跳过处理');
954
+            if (currentSegment.draw_status === -1 || currentSegment.image_path) {
955
+              console.log('检测到当前分镜已被设置为暂停状态或已有图片,跳过处理');
925 956
               return null;
926 957
             }
927 958
 
@@ -953,10 +984,10 @@ const ProjectDetail = () => {
953 984
             continue;
954 985
           }
955 986
 
956
-          // 检查分镜当前状态,如果已设置为暂停状态,则不保存结果
987
+          // 检查分镜当前状态,如果已设置为暂停状态或已有图片,则不保存结果
957 988
           const segmentAfterApiCall = await getSegmentById(segment.id);
958
-          if (segmentAfterApiCall.draw_status === -1) {
959
-            console.log('API请求完成后检测到分镜已被设置为暂停状态,不保存结果');
989
+          if (segmentAfterApiCall.draw_status === -1 || segmentAfterApiCall.image_path) {
990
+            console.log('API请求完成后检测到分镜已被设置为暂停状态或已有图片,不保存结果');
960 991
             setGeneratingImages(false);
961 992
             // 重置进度状态
962 993
             setImageGenerationProgress({ current: 0, total: 0 });
@@ -994,9 +1025,13 @@ const ProjectDetail = () => {
994 1025
             });
995 1026
 
996 1027
             console.log(`分镜ID ${segment.id} 的图片生成成功: ${imagePath}`);
1028
+            successCount++; // 增加成功计数
997 1029
 
998
-            // 更新进度为1/1,表示图片生成100%完成
999
-            setImageGenerationProgress({ current: 1, total: 1 });
1030
+            // 更新进度
1031
+            const currentCompletedCount = (await bookInfoService.getBookInfoByBookId(parseInt(projectId)))
1032
+              .filter(segment => segment.draw_status === 2 && segment.image_path).length;
1033
+            progress.current = currentCompletedCount;
1034
+            setImageGenerationProgress({ ...progress });
1000 1035
 
1001 1036
             // 实时更新图片显示
1002 1037
             setSegments(prevSegments =>
@@ -1130,6 +1165,15 @@ const ProjectDetail = () => {
1130 1165
       for (let i = 0; i < segmentsToProcess.length; i++) {
1131 1166
         const segment = segmentsToProcess[i];
1132 1167
 
1168
+        // 每次处理前检查分镜的当前状态
1169
+        const currentSegment = await getSegmentById(segment.id);
1170
+        
1171
+        // 如果分镜状态不是排队状态(0),或者已经有图片,跳过处理
1172
+        if (currentSegment.draw_status !== 0 || currentSegment.image_path) {
1173
+          console.log(`分镜ID ${segment.id} 当前状态不是排队状态或已有图片,跳过处理`);
1174
+          continue;
1175
+        }
1176
+
1133 1177
         // 每次处理前检查是否有分镜处于暂停状态(-1)
1134 1178
         // 获取最新的分镜状态
1135 1179
         const latestSegments = await bookInfoService.getBookInfoByBookId(parseInt(projectId));
@@ -1158,6 +1202,13 @@ const ProjectDetail = () => {
1158 1202
         progress.current = currentCompletedCount;
1159 1203
         setImageGenerationProgress({ ...progress });
1160 1204
 
1205
+        // 再次检查分镜状态,确保没有被其他进程处理
1206
+        const segmentBeforeUpdate = await getSegmentById(segment.id);
1207
+        if (segmentBeforeUpdate.draw_status !== 0 || segmentBeforeUpdate.image_path) {
1208
+          console.log(`分镜ID ${segment.id} 已被其他进程处理,跳过`);
1209
+          continue;
1210
+        }
1211
+
1161 1212
         // 更新状态为绘画中(1)
1162 1213
         await bookInfoService.updateBookInfo(segment.id, {
1163 1214
           draw_status: 1 // 绘画中状态
@@ -1172,8 +1223,8 @@ const ProjectDetail = () => {
1172 1223
 
1173 1224
             // 再次检查当前分镜状态,确保没有被暂停
1174 1225
             const currentSegment = await getSegmentById(segment.id);
1175
-            if (currentSegment.draw_status === -1) {
1176
-              console.log('检测到当前分镜已被设置为暂停状态,跳过处理');
1226
+            if (currentSegment.draw_status === -1 || currentSegment.image_path) {
1227
+              console.log('检测到当前分镜已被设置为暂停状态或已有图片,跳过处理');
1177 1228
               return null;
1178 1229
             }
1179 1230
 
@@ -1205,10 +1256,10 @@ const ProjectDetail = () => {
1205 1256
             continue;
1206 1257
           }
1207 1258
 
1208
-          // 检查分镜当前状态,如果已设置为暂停状态,则不保存结果
1259
+          // 检查分镜当前状态,如果已设置为暂停状态或已有图片,则不保存结果
1209 1260
           const segmentAfterApiCall = await getSegmentById(segment.id);
1210
-          if (segmentAfterApiCall.draw_status === -1) {
1211
-            console.log('API请求完成后检测到分镜已被设置为暂停状态,不保存结果');
1261
+          if (segmentAfterApiCall.draw_status === -1 || segmentAfterApiCall.image_path) {
1262
+            console.log('API请求完成后检测到分镜已被设置为暂停状态或已有图片,不保存结果');
1212 1263
             setGeneratingImages(false);
1213 1264
             // 重置进度状态
1214 1265
             setImageGenerationProgress({ current: 0, total: 0 });
@@ -1244,9 +1295,13 @@ const ProjectDetail = () => {
1244 1295
             });
1245 1296
 
1246 1297
             console.log(`分镜ID ${segment.id} 的图片生成成功: ${imagePath}`);
1298
+            successCount++; // 增加成功计数
1247 1299
 
1248
-            // 更新进度为1/1,表示图片生成100%完成
1249
-            setImageGenerationProgress({ current: 1, total: 1 });
1300
+            // 更新进度
1301
+            const currentCompletedCount = (await bookInfoService.getBookInfoByBookId(parseInt(projectId)))
1302
+              .filter(segment => segment.draw_status === 2 && segment.image_path).length;
1303
+            progress.current = currentCompletedCount;
1304
+            setImageGenerationProgress({ ...progress });
1250 1305
 
1251 1306
             // 实时更新图片显示
1252 1307
             setSegments(prevSegments =>
@@ -2306,7 +2361,7 @@ const ProjectDetail = () => {
2306 2361
                     className="me-3"
2307 2362
                   >
2308 2363
                     {generatingDescriptions
2309
-                      ? <span>生成中 <span className="generation-progress">{generationProgress.current}/{generationProgress.total}</span></span>
2364
+                      ? `生成中 ${generationProgress.current}/${generationProgress.total}`
2310 2365
                       : (hasDescriptions ? '一键更新描述词' : '一键生成描述词')}
2311 2366
                   </Button>
2312 2367
                   {isPaused ? (
@@ -2336,7 +2391,7 @@ const ProjectDetail = () => {
2336 2391
                             size="sm"
2337 2392
                             onClick={pauseImageGeneration}
2338 2393
                           >
2339
-                            暂停绘画 <span className="generation-progress">{imageGenerationProgress.current}/{imageGenerationProgress.total}</span>
2394
+                            暂停绘画 {imageGenerationProgress.current}/{imageGenerationProgress.total}
2340 2395
                           </Button>
2341 2396
                         </div>
2342 2397
                       ) : (
@@ -2353,7 +2408,7 @@ const ProjectDetail = () => {
2353 2408
                               onClick={() => generateAllImages(false)}
2354 2409
                               disabled={!selectedStyle}
2355 2410
                             >
2356
-                              继续绘画
2411
+                              开始绘画
2357 2412
                             </Dropdown.Item>
2358 2413
                             <Dropdown.Item
2359 2414
                               onClick={() => generateAllImages(true)}