# TranslationMemoryService.java

    package com.yumu.noveltranslator.domain.service;

    import com.yumu.noveltranslator.port.out.EmbeddingPort;
    import com.yumu.noveltranslator.domain.model.TranslationMemory;
    import com.yumu.noveltranslator.port.out.GlossaryRepositoryPort;
    import lombok.RequiredArgsConstructor;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Service;

    import java.util.*;

    /**
     * 翻译记忆服务
     * 管理翻译记忆的存储和 MySQL 层查询
     */
    @Service
    @Slf4j
    @RequiredArgsConstructor
    public class TranslationMemoryService {

        private final GlossaryRepositoryPort glossaryPort;
        private final EmbeddingPort embeddingPort;

        /**
         * 存储翻译记忆（写入 MySQL），返回自增 ID
         */
        public Long storeTranslation(String sourceText, String targetText, String sourceLang, String targetLang,
                                      Long userId, Long projectId, String engine, String translationMode) {
            if (sourceText == null || sourceText.isBlank() || targetText == null || targetText.isBlank()) {
                return null;
            }

            TranslationMemory memory = new TranslationMemory();
            memory.setUserId(userId);
            memory.setProjectId(projectId);
            memory.setSourceLang(sourceLang);
            memory.setTargetLang(targetLang);
            memory.setSourceText(sourceText);
            memory.setTargetText(targetText);
            memory.setSourceEngine(engine);
            memory.setTranslationMode(translationMode);
            memory.setUsageCount(0);

            // 生成向量
            float[] embedding = embeddingPort.embed(sourceText);
            if (embedding.length > 0) {
                memory.setEmbedding(toFloatList(embedding));
            }

            glossaryPort.saveTranslationMemory(memory);
            log.debug("存储翻译记忆: id={}, sourceLen={}", memory.getId(), sourceText.length());
            return memory.getId();
        }

        /**
         * 增加使用计数
         */
        public void incrementUsage(Long memoryId) {
            glossaryPort.incrementMemoryUsage(memoryId);
        }

        /**
         * 按用户和语言对查询翻译记忆（MySQL 层，精确匹配）
         */
        public List<TranslationMemory> searchByUserAndLang(Long userId, String sourceLang, String targetLang, int limit) {
            return glossaryPort.findTopMemoryByUserAndLang(userId, sourceLang, targetLang, limit);
        }

        /**
         * 按项目查询翻译记忆
         */
        public List<TranslationMemory> searchByProject(Long projectId) {
            return glossaryPort.findMemoryByProjectId(projectId);
        }

        public void deleteAllTranslationMemory() {
            glossaryPort.deleteAllTranslationMemory();
        }

        private List<Float> toFloatList(float[] array) {
            List<Float> list = new ArrayList<>(array.length);
            for (float v : array) {
                list.add(v);
            }
            return list;
        }
    }