Merge remote-tracking branch 'origin/feature/v1.2灵机空间-内容上传审核_rxd' into test

This commit is contained in:
rd
2025-08-13 10:43:13 +08:00
6 changed files with 223 additions and 158 deletions

View File

@ -44,6 +44,10 @@ export default {
type: Boolean, type: Boolean,
default: false, default: false,
}, },
getDataLoading: {
type: Boolean,
default: false,
},
}, },
emits: ['update:modelValue', 'filesChange', 'selectImage', 'againCheck', 'startCheck'], emits: ['update:modelValue', 'filesChange', 'selectImage', 'againCheck', 'startCheck'],
setup(props, { emit, expose }) { setup(props, { emit, expose }) {
@ -58,7 +62,7 @@ export default {
const isDisabled = computed(() => props.checkLoading || aiReplaceLoading.value); const isDisabled = computed(() => props.checkLoading || aiReplaceLoading.value);
const onAiReplace = () => { const onAiReplace = () => {
if (aiReplaceLoading.value) return; if (aiReplaceLoading.value) return;
aiReplaceLoading.value = true; aiReplaceLoading.value = true;
setTimeout(() => { setTimeout(() => {
@ -324,49 +328,10 @@ export default {
); );
} }
}; };
const renderCheckSuccessBox = () => {
const renderRightBox = () => { if (!aiReview.value?.violation_items?.length) {
if (props.checkLoading) {
return ( return (
<div class="right-box flex-1 h-210px rounded-8px border-1px border-#E6E6E8 border-solid p-16px flex flex-col overflow-y-auto"> <div>
<p class="cts bold !text-16px !lh-24px !color-#211F24 mb-16px">审核结果</p>
<Spin loading={true} tip={`${isTextTab.value ? '文本' : '图片'}检测中`} size={72} class="" />
</div>
);
} else {
if (!aiReview.value?.violation_items?.length) {
return (
<div class="right-box flex-1 h-372px rounded-8px border-1px border-#E6E6E8 border-solid p-16px flex flex-col overflow-y-auto">
<p class="cts bold !text-16px !lh-24px !color-#211F24 mb-16px">审核结果</p>
<div class="flex items-center mb-16px">
{RESULT_LIST.map((item, index) => (
<div class="flex flex-col justify-center items-center flex-1 result-item" key={index}>
<span class="s1" style={{ color: item.color }}>{`${aiReview.value?.[item.value] ?? '-'}${
item.suffix || ''
}`}</span>
<span class="cts mt-4px !lh-20px !text-12px !color-#737478">{item.label}</span>
</div>
))}
</div>
<div class="mb-16px suggestion-box p-12px rounded-8px bg-#F7F8FA flex flex-col">
<div class="mb-24px relative w-fit">
<span class="ai-text">AI 审核建议</span>
<img src={icon2} class="w-80px h-10.8px absolute bottom-1px left-1px" />
</div>
<div class="flex flex-col items-center h-138px justify-center">
<img src={icon3} width={72} height={72} class="mb-12px" />
<span class="cts !color-#25C883">
{isTextTab.value ? '恭喜,您的文案中没有检测出违禁词' : '恭喜,您的图片中没有检测出违禁内容'}
</span>
</div>
</div>
</div>
);
}
return (
<div class="right-box flex-1 rounded-8px border-1px border-#E6E6E8 border-solid p-16px flex flex-col overflow-y-auto">
<p class="cts bold !text-16px !lh-24px !color-#211F24 mb-16px">审核结果</p>
<div class="flex items-center mb-16px"> <div class="flex items-center mb-16px">
{RESULT_LIST.map((item, index) => ( {RESULT_LIST.map((item, index) => (
<div class="flex flex-col justify-center items-center flex-1 result-item" key={index}> <div class="flex flex-col justify-center items-center flex-1 result-item" key={index}>
@ -378,35 +343,88 @@ export default {
))} ))}
</div> </div>
<div class="mb-16px suggestion-box p-12px rounded-8px bg-#F7F8FA flex flex-col"> <div class="mb-16px suggestion-box p-12px rounded-8px bg-#F7F8FA flex flex-col">
<div class=" mb-8px relative w-fit"> <div class="mb-24px relative w-fit">
<span class="ai-text">AI 审核建议</span> <span class="ai-text">AI 审核建议</span>
<img src={icon2} class="w-80px h-10.8px absolute bottom-1px left-1px" /> <img src={icon2} class="w-80px h-10.8px absolute bottom-1px left-1px" />
</div> </div>
{aiReview.value?.suggestion?.map((item, index) => ( <div class="flex flex-col items-center h-138px justify-center">
<p class="cts !color-#55585F !text-12px !lh-20px" key={index}>{`${index + 1}. ${item}`}</p> <img src={icon3} width={72} height={72} class="mb-12px" />
<span class="cts !color-#25C883">
{isTextTab.value ? '恭喜,您的文案中没有检测出违禁词' : '恭喜,您的图片中没有检测出违禁内容'}
</span>
</div>
</div>
</div>
);
}
return (
<>
<div class="flex items-center mb-16px">
{RESULT_LIST.map((item, index) => (
<div class="flex flex-col justify-center items-center flex-1 result-item" key={index}>
<span class="s1" style={{ color: item.color }}>{`${aiReview.value?.[item.value] ?? '-'}${
item.suffix || ''
}`}</span>
<span class="cts mt-4px !lh-20px !text-12px !color-#737478">{item.label}</span>
</div>
))}
</div>
<div class="mb-16px suggestion-box p-12px rounded-8px bg-#F7F8FA flex flex-col">
<div class=" mb-8px relative w-fit">
<span class="ai-text">AI 审核建议</span>
<img src={icon2} class="w-80px h-10.8px absolute bottom-1px left-1px" />
</div>
{aiReview.value?.suggestion?.map((item, index) => (
<p class="cts !color-#55585F !text-12px !lh-20px" key={index}>{`${index + 1}. ${item}`}</p>
))}
</div>
<div class="forbid-word-box flex-1 flex">
<div class="left mr-32px w-56px">
<p class="mb-12px cts !text-12px">违禁词</p>
{aiReview.value?.violation_items?.map((item, index) => (
<TextOverTips
context={item.word}
class="mb-12px cts"
style={{ color: LEVEL_MAP.get(item.risk_level)?.color }}
key={index}
/>
))} ))}
</div> </div>
<div class="right flex-1 overflow-hidden">
<div class="forbid-word-box flex-1 flex"> <p class="mb-12px cts !text-12px">解释</p>
<div class="left mr-32px w-56px"> {aiReview.value?.violation_items?.map((item, index) => (
<p class="mb-12px cts !text-12px">违禁词</p> <TextOverTips context={item.reason} class="mb-12px" key={index} />
{aiReview.value?.violation_items?.map((item, index) => ( ))}
<TextOverTips
context={item.word}
class="mb-12px cts"
style={{ color: LEVEL_MAP.get(item.risk_level)?.color }}
key={index}
/>
))}
</div>
<div class="right flex-1 overflow-hidden">
<p class="mb-12px cts !text-12px">解释</p>
{aiReview.value?.violation_items?.map((item, index) => (
<TextOverTips context={item.reason} class="mb-12px" key={index} />
))}
</div>
</div> </div>
</div> </div>
</>
);
};
const renderRightBox = () => {
if (props.checkLoading) {
return (
<div class="right-box h-210px">
<p class="cts bold !text-16px !lh-24px !color-#211F24 mb-16px">审核结果</p>
<Spin
loading={true}
tip={`${isTextTab.value ? '文本' : '图片'}检测中`}
size={72}
class="h-298px !flex flex-col justify-center items-center"
/>
</div>
);
} else {
return (
<div class="right-box">
<p class="cts bold !text-16px !lh-24px !color-#211F24 mb-16px">审核结果</p>
{props.getDataLoading ? (
<Spin loading={true} size={72} class="h-298px !flex justify-center items-center" />
) : (
renderCheckSuccessBox()
)}
</div>
); );
} }
}; };

View File

@ -130,6 +130,13 @@
} }
} }
.right-box { .right-box {
border: 1px solid #E6E6E8;
flex: 1;
border-radius: 8px; padding: 16px; display: flex;
flex-direction: column;
overflow-y: auto;
height: fit-content;
max-height: 100%;
.s1 { .s1 {
font-family: $font-family-manrope-regular; font-family: $font-family-manrope-regular;
font-size: 24px; font-size: 24px;

View File

@ -30,6 +30,7 @@ export default {
const submitLoading = ref(false); const submitLoading = ref(false);
const contentCardRef = ref(null); const contentCardRef = ref(null);
const checkListDrawerRef = ref(null); const checkListDrawerRef = ref(null);
const getDataLoading = ref(false);
const selectCardInfo = ref({}); const selectCardInfo = ref({});
const selectedImageInfo = ref(null); const selectedImageInfo = ref(null);
@ -53,6 +54,7 @@ export default {
contentCardRef.value.reset(); contentCardRef.value.reset();
isSaved.value = false; isSaved.value = false;
submitLoading.value = false; submitLoading.value = false;
getDataLoading.value = false;
checkLoading.value = false; checkLoading.value = false;
ticket.value = ''; ticket.value = '';
@ -80,25 +82,30 @@ export default {
}; };
const getWorkAudits = async () => { const getWorkAudits = async () => {
const { code, data } = await getWorkAuditsBatchDetailWriter(writerCode.value, { ids: workIds.value }); try {
if (code === 200) { getDataLoading.value = true;
const _data = (data ?? []).map((item) => ({ const { code, data } = await getWorkAuditsBatchDetailWriter(writerCode.value, { ids: workIds.value });
...item, if (code === 200) {
platform: item.platform === 0 ? 1 : item.platform, const _data = (data ?? []).map((item) => ({
})); ...item,
platform: item.platform === 0 ? 1 : item.platform,
}));
dataSource.value = _data; dataSource.value = _data;
remoteDataSource.value = cloneDeep(_data); remoteDataSource.value = cloneDeep(_data);
const _firstCard = _data?.[0] ?? {}; const _firstCard = _data?.[0] ?? {};
const { id, ai_review } = _firstCard; const { id, ai_review } = _firstCard;
selectCardInfo.value = cloneDeep(_firstCard); selectCardInfo.value = cloneDeep(_firstCard);
selectedImageInfo.value = cloneDeep(_firstCard.files?.[0] ?? {}); selectedImageInfo.value = cloneDeep(_firstCard.files?.[0] ?? {});
if (isEmpty(ai_review)) { if (isEmpty(ai_review)) {
handleStartCheck(); handleStartCheck();
}
} }
} finally {
getDataLoading.value = false;
} }
}; };
@ -224,6 +231,7 @@ export default {
selectedImageInfo={selectedImageInfo.value} selectedImageInfo={selectedImageInfo.value}
onSelectImage={onSelectImage} onSelectImage={onSelectImage}
checkLoading={checkLoading.value} checkLoading={checkLoading.value}
getDataLoading={getDataLoading.value}
onAgainCheck={onAgainCheck} onAgainCheck={onAgainCheck}
onStartCheck={handleStartCheck} onStartCheck={handleStartCheck}
/> />

View File

@ -45,6 +45,10 @@ export default {
type: Boolean, type: Boolean,
default: false, default: false,
}, },
getDataLoading: {
type: Boolean,
default: false,
},
}, },
emits: ['update:modelValue', 'filesChange', 'selectImage', 'againCheck', 'startCheck'], emits: ['update:modelValue', 'filesChange', 'selectImage', 'againCheck', 'startCheck'],
setup(props, { emit, expose }) { setup(props, { emit, expose }) {
@ -325,48 +329,10 @@ export default {
} }
}; };
const renderRightBox = () => { const renderCheckSuccessBox = () => {
if (props.checkLoading) { if (!aiReview.value?.violation_items?.length) {
return ( return (
<div class="right-box flex-1 h-210px rounded-8px border-1px border-#E6E6E8 border-solid p-16px flex flex-col overflow-y-auto"> <div>
<p class="cts bold !text-16px !lh-24px !color-#211F24 mb-16px">审核结果</p>
<Spin loading={true} tip={`${isTextTab.value ? '文本' : '图片'}检测中`} size={72} class="" />
</div>
);
} else {
if (!aiReview.value?.violation_items?.length) {
return (
<div class="right-box flex-1 h-372px rounded-8px border-1px border-#E6E6E8 border-solid p-16px flex flex-col overflow-y-auto">
<p class="cts bold !text-16px !lh-24px !color-#211F24 mb-16px">审核结果</p>
<div class="flex items-center mb-16px">
{RESULT_LIST.map((item, index) => (
<div class="flex flex-col justify-center items-center flex-1 result-item" key={index}>
<span class="s1" style={{ color: item.color }}>{`${aiReview.value?.[item.value] ?? '-'}${
item.suffix || ''
}`}</span>
<span class="cts mt-4px !lh-20px !text-12px !color-#737478">{item.label}</span>
</div>
))}
</div>
<div class="mb-16px suggestion-box p-12px rounded-8px bg-#F7F8FA flex flex-col">
<div class="mb-24px relative w-fit">
<span class="ai-text">AI 审核建议</span>
<img src={icon2} class="w-80px h-10.8px absolute bottom-1px left-1px" />
</div>
<div class="flex flex-col items-center h-138px justify-center">
<img src={icon3} width={72} height={72} class="mb-12px" />
<span class="cts !color-#25C883">
{isTextTab.value ? '恭喜,您的文案中没有检测出违禁词' : '恭喜,您的图片中没有检测出违禁内容'}
</span>
</div>
</div>
</div>
);
}
return (
<div class="right-box flex-1 rounded-8px border-1px border-#E6E6E8 border-solid p-16px flex flex-col overflow-y-auto">
<p class="cts bold !text-16px !lh-24px !color-#211F24 mb-16px">审核结果</p>
<div class="flex items-center mb-16px"> <div class="flex items-center mb-16px">
{RESULT_LIST.map((item, index) => ( {RESULT_LIST.map((item, index) => (
<div class="flex flex-col justify-center items-center flex-1 result-item" key={index}> <div class="flex flex-col justify-center items-center flex-1 result-item" key={index}>
@ -378,35 +344,88 @@ export default {
))} ))}
</div> </div>
<div class="mb-16px suggestion-box p-12px rounded-8px bg-#F7F8FA flex flex-col"> <div class="mb-16px suggestion-box p-12px rounded-8px bg-#F7F8FA flex flex-col">
<div class=" mb-8px relative w-fit"> <div class="mb-24px relative w-fit">
<span class="ai-text">AI 审核建议</span> <span class="ai-text">AI 审核建议</span>
<img src={icon2} class="w-80px h-10.8px absolute bottom-1px left-1px" /> <img src={icon2} class="w-80px h-10.8px absolute bottom-1px left-1px" />
</div> </div>
{aiReview.value?.suggestion?.map((item, index) => ( <div class="flex flex-col items-center h-138px justify-center">
<p class="cts !color-#55585F !text-12px !lh-20px" key={index}>{`${index + 1}. ${item}`}</p> <img src={icon3} width={72} height={72} class="mb-12px" />
<span class="cts !color-#25C883">
{isTextTab.value ? '恭喜,您的文案中没有检测出违禁词' : '恭喜,您的图片中没有检测出违禁内容'}
</span>
</div>
</div>
</div>
);
}
return (
<>
<div class="flex items-center mb-16px">
{RESULT_LIST.map((item, index) => (
<div class="flex flex-col justify-center items-center flex-1 result-item" key={index}>
<span class="s1" style={{ color: item.color }}>{`${aiReview.value?.[item.value] ?? '-'}${
item.suffix || ''
}`}</span>
<span class="cts mt-4px !lh-20px !text-12px !color-#737478">{item.label}</span>
</div>
))}
</div>
<div class="mb-16px suggestion-box p-12px rounded-8px bg-#F7F8FA flex flex-col">
<div class=" mb-8px relative w-fit">
<span class="ai-text">AI 审核建议</span>
<img src={icon2} class="w-80px h-10.8px absolute bottom-1px left-1px" />
</div>
{aiReview.value?.suggestion?.map((item, index) => (
<p class="cts !color-#55585F !text-12px !lh-20px" key={index}>{`${index + 1}. ${item}`}</p>
))}
</div>
<div class="forbid-word-box flex-1 flex">
<div class="left mr-32px w-56px">
<p class="mb-12px cts !text-12px">违禁词</p>
{aiReview.value?.violation_items?.map((item, index) => (
<TextOverTips
context={item.word}
class="mb-12px cts"
style={{ color: LEVEL_MAP.get(item.risk_level)?.color }}
key={index}
/>
))} ))}
</div> </div>
<div class="right flex-1 overflow-hidden">
<div class="forbid-word-box flex-1 flex"> <p class="mb-12px cts !text-12px">解释</p>
<div class="left mr-32px w-56px"> {aiReview.value?.violation_items?.map((item, index) => (
<p class="mb-12px cts !text-12px">违禁词</p> <TextOverTips context={item.reason} class="mb-12px" key={index} />
{aiReview.value?.violation_items?.map((item, index) => ( ))}
<TextOverTips
context={item.word}
class="mb-12px cts"
style={{ color: LEVEL_MAP.get(item.risk_level)?.color }}
key={index}
/>
))}
</div>
<div class="right flex-1 overflow-hidden">
<p class="mb-12px cts !text-12px">解释</p>
{aiReview.value?.violation_items?.map((item, index) => (
<TextOverTips context={item.reason} class="mb-12px" key={index} />
))}
</div>
</div> </div>
</div> </div>
</>
);
};
const renderRightBox = () => {
if (props.checkLoading) {
return (
<div class="right-box">
<p class="cts bold !text-16px !lh-24px !color-#211F24 mb-16px">审核结果</p>
<Spin
loading={true}
tip={`${isTextTab.value ? '文本' : '图片'}检测中`}
size={72}
class="h-298px !flex flex-col justify-center items-center"
/>
</div>
);
} else {
return (
<div class="right-box">
<p class="cts bold !text-16px !lh-24px !color-#211F24 mb-16px">审核结果</p>
{props.getDataLoading ? (
<Spin loading={true} size={72} class="h-298px !flex justify-center items-center" />
) : (
renderCheckSuccessBox()
)}
</div>
); );
} }
}; };

View File

@ -130,6 +130,13 @@
} }
} }
.right-box { .right-box {
border: 1px solid #E6E6E8;
flex: 1;
border-radius: 8px; padding: 16px; display: flex;
flex-direction: column;
overflow-y: auto;
height: fit-content;
max-height: 100%;
.s1 { .s1 {
font-family: $font-family-manrope-regular; font-family: $font-family-manrope-regular;
font-size: 24px; font-size: 24px;

View File

@ -19,7 +19,6 @@ import {
getWorkAuditsAiReviewResult, getWorkAuditsAiReviewResult,
} from '@/api/all/generationWorkshop.ts'; } from '@/api/all/generationWorkshop.ts';
export default { export default {
setup(props, { emit, expose }) { setup(props, { emit, expose }) {
const router = useRouter(); const router = useRouter();
@ -34,6 +33,7 @@ export default {
const submitLoading = ref(false); const submitLoading = ref(false);
const contentCardRef = ref(null); const contentCardRef = ref(null);
const checkListDrawerRef = ref(null); const checkListDrawerRef = ref(null);
const getDataLoading = ref(false);
const selectCardInfo = ref({}); const selectCardInfo = ref({});
const selectedImageInfo = ref(null); const selectedImageInfo = ref(null);
@ -55,6 +55,7 @@ export default {
contentCardRef.value.reset(); contentCardRef.value.reset();
isSaved.value = false; isSaved.value = false;
submitLoading.value = false; submitLoading.value = false;
getDataLoading.value = false;
checkLoading.value = false; checkLoading.value = false;
ticket.value = ''; ticket.value = '';
@ -62,7 +63,6 @@ export default {
selectCardInfo.value = cloneDeep(item); selectCardInfo.value = cloneDeep(item);
selectedImageInfo.value = cloneDeep(files?.[0] ?? {}); selectedImageInfo.value = cloneDeep(files?.[0] ?? {});
console.log({ ai_review });
if (isEmpty(ai_review)) { if (isEmpty(ai_review)) {
handleStartCheck(); handleStartCheck();
} }
@ -82,25 +82,30 @@ export default {
}; };
const getWorkAudits = async () => { const getWorkAudits = async () => {
const { code, data } = await getWorkAuditsBatchDetail({ ids: workIds.value }); try {
if (code === 200) { getDataLoading.value = true;
const _data = (data ?? []).map((item) => ({ const { code, data } = await getWorkAuditsBatchDetail({ ids: workIds.value });
...item, if (code === 200) {
platform: item.platform === 0 ? 1 : item.platform, const _data = (data ?? []).map((item) => ({
})); ...item,
platform: item.platform === 0 ? 1 : item.platform,
}));
dataSource.value = _data; dataSource.value = _data;
remoteDataSource.value = cloneDeep(_data); remoteDataSource.value = cloneDeep(_data);
const _firstCard = _data?.[0] ?? {}; const _firstCard = _data?.[0] ?? {};
const { id, ai_review } = _firstCard; const { id, ai_review } = _firstCard;
selectCardInfo.value = cloneDeep(_firstCard); selectCardInfo.value = cloneDeep(_firstCard);
selectedImageInfo.value = cloneDeep(_firstCard.files?.[0] ?? {}); selectedImageInfo.value = cloneDeep(_firstCard.files?.[0] ?? {});
if (isEmpty(ai_review)) { if (isEmpty(ai_review)) {
handleStartCheck(); handleStartCheck();
}
} }
} finally {
getDataLoading.value = false;
} }
}; };
@ -226,6 +231,7 @@ export default {
selectedImageInfo={selectedImageInfo.value} selectedImageInfo={selectedImageInfo.value}
onSelectImage={onSelectImage} onSelectImage={onSelectImage}
checkLoading={checkLoading.value} checkLoading={checkLoading.value}
getDataLoading={getDataLoading.value}
onAgainCheck={onAgainCheck} onAgainCheck={onAgainCheck}
onStartCheck={handleStartCheck} onStartCheck={handleStartCheck}
/> />