diff --git a/src/main/java/database/Database1.java b/src/main/java/database/Database1.java
index 934a6c5..98effe1 100644
--- a/src/main/java/database/Database1.java
+++ b/src/main/java/database/Database1.java
@@ -43,6 +43,8 @@
 import entity.QUserVotes;
 import entity.QPost;
 import entity.Seed;
+import entity.SeedPromotion;
+import entity.SeedWithPromotionDTO;
 import entity.User;
 import entity.UserPT;
 import entity.UserStar;
@@ -55,6 +57,7 @@
 import entity.QUserStar;
 import entity.SubmitSeed;
 import entity.SubmitSeedId;
+import entity.QSeedPromotion;
 
 
 import org.slf4j.Logger;
@@ -306,17 +309,37 @@
     }
 
     @Override
-    public Seed[] GetSeedListByTag(String tag){
+    public SeedWithPromotionDTO[] GetSeedListByTag(String tag){
         EntityManager em = createEntityManager();
         try {
             JPAQuery<Seed> query = new JPAQuery<>(em);
             QSeed s = QSeed.seed;
             QUser u = QUser.user;
+            QSeedPromotion sp = QSeedPromotion.seedPromotion;
+            
             // 使用 fetch join 预先加载关联的 user 对象，避免懒加载导致的 ResultSet closed 错误
             List<Seed> seeds = query.select(s).from(s)
                     .leftJoin(s.user, u).fetchJoin()
                     .where(s.seedtag.eq(tag)).fetch();
-            return seeds.toArray(new Seed[0]);
+            
+            // 创建结果列表
+            List<SeedWithPromotionDTO> result = new ArrayList<>();
+            Date currentDate = new Date();
+            
+            for (Seed seed : seeds) {
+                // 查询当前有效的促销信息
+                JPAQuery<SeedPromotion> promotionQuery = new JPAQuery<>(em);
+                SeedPromotion promotion = promotionQuery.select(sp).from(sp)
+                        .where(sp.seed.seedid.eq(seed.seedid)
+                                .and(sp.startTime.loe(currentDate))
+                                .and(sp.endTime.goe(currentDate)))
+                        .fetchOne();
+                
+                Integer discount = promotion != null ? promotion.discount : null;
+                result.add(new SeedWithPromotionDTO(seed, discount));
+            }
+            
+            return result.toArray(new SeedWithPromotionDTO[0]);
         } finally {
             em.close();
         }
@@ -1472,7 +1495,7 @@
     //获取迁移信息
     
     @Override
-    public boolean ExamTransmitProfile(String profileid,boolean result){
+    public boolean ExamTransmitProfile(String profileid, boolean result, Integer grantedUpload){
         if (profileid == null || profileid.isEmpty()) {
             logger.warn("参数无效: profileid为空");
             return false;
@@ -1506,9 +1529,9 @@
                     profile.magicgived = String.valueOf(magicToGive);
 
                     // 发放上传量
-                    long uploadToGive = Long.parseLong(profile.uploadtogive);
-                    userPT.upload += uploadToGive;
-                    profile.uploadgived = String.valueOf(uploadToGive);
+                    // long uploadToGive = Long.parseLong(profile.uploadtogive);
+                    userPT.upload += grantedUpload;
+                    profile.uploadgived = String.valueOf(grantedUpload);
 
                     em.merge(userPT);
                     em.merge(profile);
@@ -1722,7 +1745,7 @@
     }
 
     @Override
-    public int UploadMigration(String userid, File file) {
+    public int UploadMigration(String userid, File file, String uploadtogive) {
         if (userid == null || userid.isEmpty() || file == null) {
             return 2; // 参数无效
         }
@@ -1740,7 +1763,7 @@
             Profile migration = new Profile();
             migration.profileurl = java.util.UUID.randomUUID().toString();
             migration.userid = userid;
-            migration.uploadtogive = "0"; // 初始上传量为0
+            migration.uploadtogive = uploadtogive; // 初始上传量为0
             migration.magictogive = "0"; // 初始魔力值为0
             migration.downloadgived = "0"; // 初始下载量为0
             migration.uploadgived = "0"; // 初始上传量为0
@@ -2012,4 +2035,103 @@
             }
         }
     }
+
+    @Override
+    public Seed[] getAllSeeds() {
+        EntityManager entitymanager = createEntityManager();
+        try {
+            JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
+            QSeed s = QSeed.seed;
+            List<Seed> seeds = query.select(s).from(s).fetch();
+            return seeds.toArray(new Seed[0]);
+        } catch (Exception e) {
+            e.printStackTrace();
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            return new Seed[0];
+        } finally {
+            if (entitymanager != null) {
+                entitymanager.close();
+            }
+        }
+    }
+
+    @Override
+    public SeedPromotion[] getAllSeedPromotions() {
+        EntityManager entitymanager = createEntityManager();
+        try {
+            JPAQuery<SeedPromotion> query = new JPAQuery<>(entitymanager);
+            QSeedPromotion sp = QSeedPromotion.seedPromotion;
+            List<SeedPromotion> promotions = query.select(sp).from(sp).fetch();
+            return promotions.toArray(new SeedPromotion[0]);
+        } catch (Exception e) {
+            e.printStackTrace();
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            return new SeedPromotion[0];
+        } finally {
+            if (entitymanager != null) {
+                entitymanager.close();
+            }
+        }
+    }
+
+    @Override
+    public int createSeedPromotion(String seedid, Date startTime, Date endTime, Integer discount) {
+        if (seedid == null || seedid.isEmpty() || startTime == null || endTime == null || discount == null) {
+            return 2; // 参数无效
+        }
+
+        EntityManager entitymanager = createEntityManager();
+        EntityTransaction tx = entitymanager.getTransaction();
+
+        try {
+            tx.begin();
+
+            // 检查种子是否存在
+            Seed seed = entitymanager.find(Seed.class, seedid);
+            if (seed == null) {
+                return 1; // 种子不存在
+            }
+
+            // 检查是否已存在相同的促销活动
+            QSeedPromotion sp = QSeedPromotion.seedPromotion;
+            SeedPromotion existingPromotion = new JPAQuery<>(entitymanager)
+                    .select(sp)
+                    .from(sp)
+                    .where(sp.seed.seedid.eq(seedid))
+                    .fetchOne();
+
+            // 创建新的促销活动
+            SeedPromotion promotion = new SeedPromotion();
+            promotion.promotionId = java.util.UUID.randomUUID().toString();
+            promotion.seed = seed;
+            promotion.startTime = startTime;
+            promotion.endTime = endTime;
+            promotion.discount = discount;
+
+            if (existingPromotion != null) {
+                promotion.promotionId = existingPromotion.promotionId; // 如果已存在，则使用现有的ID
+                entitymanager.merge(promotion); // 更新现有的促销活动
+            } else {
+                entitymanager.persist(promotion); // 创建新的促销活动
+            }
+
+            tx.commit();
+            return 0; // 成功
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            if (tx.isActive()) {
+                tx.rollback();
+            }
+            return 4; // 其他错误
+        } finally {
+            if (entitymanager != null) {
+                entitymanager.close();
+            }
+        }
+    }
 }
\ No newline at end of file
