更新求种后端函数

Change-Id: I9e593e5eecfc6337120f75b3f6338f8279579dd1
diff --git a/src/main/java/database/Database1.java b/src/main/java/database/Database1.java
index b91e471..26ddc29 100644
--- a/src/main/java/database/Database1.java
+++ b/src/main/java/database/Database1.java
@@ -4,8 +4,14 @@
 import java.util.UUID;
 import java.util.HashMap;
 import java.util.List;
+import java.util.ArrayList;
 import java.util.Map;
 import java.util.Date;
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
@@ -17,10 +23,14 @@
 import com.querydsl.core.Tuple;
 
 import entity.BegInfo;
+import entity.BegInfoDetail;
+import entity.BegSeedDetail;
 import entity.Notice;
 import entity.Post;
 import entity.PostReply;
 import entity.Profile;
+import entity.SeedWithVotes;
+import entity.QAdmin;
 import entity.QBegInfo;
 import entity.QNotice;
 import entity.QProfile;
@@ -40,6 +50,12 @@
 import entity.PostReply;
 import entity.QPostReply;
 import entity.UserInvite;
+import entity.QAdmin;
+import entity.UserStar;
+import entity.QUserStar;
+import entity.SubmitSeed;
+import entity.SubmitSeedId;
+
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -210,8 +226,16 @@
     @Override
     public UserPT GetInformationPT(String userid){
         EntityManager entitymanager = createEntityManager();
-        UserPT userPT = entitymanager.find(UserPT.class, userid);
-        return userPT;
+        try {
+            UserPT userPT = entitymanager.find(UserPT.class, userid);
+            if (userPT == null) {
+                return null; // 用户PT信息不存在
+            }
+            return userPT;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null; // 出现异常,返回null
+        }
     }
 
     //返回状态:0 success,1 邮箱重复,2其他原因
@@ -527,8 +551,8 @@
     //邀请用户,返回状态:0 success,1 剩余次数不足,2,3其他原因
     @Override
     public int InviteUser(String inviterid,String inviteemail){
+        EntityManager entitymanager = createEntityManager();
         try {
-            EntityManager entitymanager = createEntityManager();
             User user = entitymanager.find(User.class, inviterid);
             if (user == null || !user.email.equals(inviteemail)) {
                 return 3;
@@ -537,61 +561,88 @@
                 return 1;
             }
             user.invitetimes -= 1;
+            entitymanager.getTransaction().begin();
             entitymanager.merge(user);
+            entitymanager.getTransaction().commit();
             return 0;
         } catch (Exception e) {
             e.printStackTrace();
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
             return 2;
         }
-        
     }
 
     //添加一个收藏,返回状态:0 success,1 不存在,2其他原因
     @Override
     public boolean AddCollect(String userid,String seedid){
         EntityManager entitymanager = createEntityManager();
-        JPAQuery<User> query2 = new JPAQuery<>(entitymanager);
-        QUser u2 = QUser.user;
-        User user = query2.select(u2).from(u2).where(u2.userid.eq(userid)).fetchOne();
-        if (user == null) {
-            return false;
-        }
-        JPAQuery<Seed> query3 = new JPAQuery<>(entitymanager);
-        QSeed p = QSeed.seed;
-        Seed seed = query3.select(p).from(p).where(p.seedid.eq(seedid)).fetchOne();
-        if (seed == null) {
-            return false;
-        }
-        JPAQuery<String> query = new JPAQuery<>(entitymanager);
-        QUserStar u = QUserStar.userStar;
-        List<String> allSeedId = query.select(u.seedid).from(u).where(u.userid.eq(userid)).fetch();
+        try {
+            JPAQuery<User> query2 = new JPAQuery<>(entitymanager);
+            QUser u2 = QUser.user;
+            User user = query2.select(u2).from(u2).where(u2.userid.eq(userid)).fetchOne();
+            if (user == null) {
+                return false;
+            }
+            JPAQuery<Seed> query3 = new JPAQuery<>(entitymanager);
+            QSeed p = QSeed.seed;
+            Seed seed = query3.select(p).from(p).where(p.seedid.eq(seedid)).fetchOne();
+            if (seed == null) {
+                return false;
+            }
+            JPAQuery<String> query = new JPAQuery<>(entitymanager);
+            QUserStar u = QUserStar.userStar;
+            List<String> allSeedId = query.select(u.seedid).from(u).where(u.userid.eq(userid)).fetch();
 
-        if (allSeedId.contains(seedid)) {
+            if (allSeedId.contains(seedid)) {
+                return false;
+            }
+            UserStar userStar = new UserStar();
+            userStar.userid = userid;
+            userStar.seedid = seedid;
+            entitymanager.getTransaction().begin();
+            entitymanager.persist(userStar);
+            entitymanager.getTransaction().commit();
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
             return false;
+        } finally {
+            if (entitymanager != null) {
+                entitymanager.close();
+            }
         }
-        UserStar userStar = new UserStar();
-        userStar.userid = userid;
-        userStar.seedid = seedid;
-        entitymanager.persist(userStar);
-        return true;
     }
 
     //删除一个收藏,返回状态:0 success,1 不存在,2其他原因
     @Override
-    public boolean DeleteCollect(String userid,String seedid){
+    public boolean DeleteCollect(String userid, String seedid){
+        EntityManager entitymanager = createEntityManager();
         try {
-            EntityManager entitymanager = createEntityManager();
             JPAQuery<UserStar> query = new JPAQuery<>(entitymanager);
             QUserStar u = QUserStar.userStar;
             UserStar userStar = query.select(u).from(u).where(u.userid.eq(userid).and(u.seedid.eq(seedid))).fetchOne();
             if (userStar == null) {
                 return true; // 收藏不存在
             }
+            entitymanager.getTransaction().begin();
             entitymanager.remove(userStar);
+            entitymanager.getTransaction().commit();
             return true;
         } catch (Exception e) {
             e.printStackTrace();
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
             return false;
+        } finally {
+            if (entitymanager != null) {
+                entitymanager.close();
+            }
         }
         
     }
@@ -1199,7 +1250,7 @@
 
             // 1:1兑换,直接加上魔力值(假设单位是MB)
             userPT.magic -= magic;
-            userPT.upload += magic;
+            userPT.upload += magic * 10000000;
 
             // 更新分享率
             if (userPT.download > 0) {
@@ -1216,6 +1267,7 @@
             if (tx != null && tx.isActive()) {
                 tx.rollback();
             }
+            e.printStackTrace();
             logger.error("魔力值兑换上传量时发生错误: {}", e.getMessage());
             return false;
         } finally {
@@ -1254,7 +1306,7 @@
 
             // 1:1兑换,直接减去魔力值对应的下载量(假设单位是MB)
             userPT.magic -= magic;
-            userPT.download = Math.max(0, userPT.download - magic);
+            userPT.download = Math.max(0, userPT.download - magic * 10000000);
 
             // 更新分享率
             if (userPT.download > 0) {
@@ -1308,7 +1360,7 @@
 
             // 1:1兑换VIP下载次数
             userPT.magic -= magic;
-            userPT.viptime += magic;
+            userPT.viptime += magic / 100;
 
             em.merge(userPT);
             tx.commit();
@@ -1456,10 +1508,13 @@
                     profile.uploadgived = String.valueOf(uploadToGive);
 
                     em.merge(userPT);
+                    em.merge(profile);
                 }
+            } else {
+                // 如果审核不通过,删除迁移申请
+                em.remove(profile);
+                logger.info("迁移申请 {} 审核不通过,已删除", profileid);
             }
-
-            em.merge(profile);
             tx.commit();
 
             logger.info("成功审核迁移申请 {}, 结果: {}", profileid, result);
@@ -1509,19 +1564,35 @@
     @Override
     public Post[] GetPostList() {
         EntityManager entitymanager = createEntityManager();
-        JPAQuery<Post> query = new JPAQuery<>(entitymanager);
-        QPost p = QPost.post;
-        List<Post> posts = query.select(p).from(p).fetch();
-        return posts.toArray(new Post[0]);
+        try{
+            JPAQuery<Post> query = new JPAQuery<>(entitymanager);
+            QPost p = QPost.post;
+            List<Post> posts = query.select(p).from(p).fetch();
+            return posts.toArray(new Post[0]);
+        } catch (Exception e) {
+            logger.error("获取帖子列表时发生错误: {}", e.getMessage());
+            return new Post[0];
+        } finally {
+            entitymanager.close();
+            logger.info("Post list retrieved successfully.");
+        }
     }
 
     @Override
     public Post GetPost(String postid) {
         EntityManager entitymanager = createEntityManager();
-        JPAQuery<Post> query = new JPAQuery<>(entitymanager);
-        QPost p = QPost.post;
-        Post post = query.select(p).from(p).where(p.postid.eq(postid)).fetchOne();
-        return post;
+        try {
+            JPAQuery<Post> query = new JPAQuery<>(entitymanager);
+            QPost p = QPost.post;
+            Post post = query.select(p).from(p).where(p.postid.eq(postid)).fetchOne();
+            return post;
+        } catch (Exception e) {
+            logger.error("获取帖子列表时发生错误: {}", e.getMessage());
+            return new Post();
+        } finally {
+            entitymanager.close();
+            logger.info("Post list retrieved successfully.");
+        }
     }
 
     @Override
@@ -1536,28 +1607,408 @@
     @Override
     public Post[] SearchPost(String postQ) {
         EntityManager entitymanager = createEntityManager();
-        JPAQuery<Post> query = new JPAQuery<>(entitymanager);
-        QPost p = QPost.post;
-        List<Post> posts = query.select(p).from(p).fetch();
+        try {
+            JPAQuery<Post> query = new JPAQuery<>(entitymanager);
+            QPost p = QPost.post;
+            List<Post> posts = query.select(p).from(p).fetch();
 
-        if (posts == null || postQ == null || postQ.trim().isEmpty()) {
+            if (posts == null || postQ == null || postQ.trim().isEmpty()) {
+                return posts.toArray(new Post[0]);
+            }
+
+            String processedQuery = postQ.toLowerCase().trim();
+            Map<Post, Integer> postCountMap = new HashMap<>();
+            for(Post post : posts){
+                String title = post.posttitle.toLowerCase().trim();
+                int count = countCommonCharacter(processedQuery, title);
+                postCountMap.put(post, count);
+            }
+            posts.sort((s1, s2) -> {
+                int count1 = postCountMap.getOrDefault(s1, 0);
+                int count2 = postCountMap.getOrDefault(s2, 0);
+                return Integer.compare(count2, count1);
+            });
+
             return posts.toArray(new Post[0]);
+        } catch (Exception e) {
+            logger.error("搜索帖子时发生错误: {}", e.getMessage());
+            return new Post[0];
+        } finally {
+            entitymanager.close();
+            logger.info("Post search completed successfully.");
         }
-
-        String processedQuery = postQ.toLowerCase().trim();
-        Map<Post, Integer> postCountMap = new HashMap<>();
-        for(Post post : posts){
-            String title = post.posttitle.toLowerCase().trim();
-            int count = countCommonCharacter(processedQuery, title);
-            postCountMap.put(post, count);
-        }
-        posts.sort((s1, s2) -> {
-            int count1 = postCountMap.getOrDefault(s1, 0);
-            int count2 = postCountMap.getOrDefault(s2, 0);
-            return Integer.compare(count2, count1);
-        });
-
-        return posts.toArray(new Post[0]);
     }
-}
 
+    @Override
+    public int CheckAdmin(String userid) {
+        if (userid == null || userid.isEmpty()) {
+            logger.warn("参数无效: userid为空");
+            return 2; // 参数无效
+        }
+
+        EntityManager entitymanager = createEntityManager();
+        JPAQuery<String> query = new JPAQuery<>(entitymanager);
+        QAdmin a = QAdmin.admin;
+        String adminId = query.select(a.userId).from(a).where(a.userId.eq(userid)).fetchOne();
+        if (adminId == null) {
+            logger.warn("用户 {} 不是管理员", userid);
+            return 1; // 用户不是管理员
+        } else {
+            logger.info("用户 {} 是管理员", userid);
+            return 0; // 用户是管理员
+        }
+    }
+
+    @Override
+    public int InviteNewUser(String inviterid, String invitedemail) {
+        EntityManager entitymanager = createEntityManager();
+        try {
+            User user = entitymanager.find(User.class, inviterid);
+            if (user == null) {
+                return 3;
+            }
+            if (user.invitetimes <= 0) {
+                return 1;
+            }
+            user.invitetimes -= 1;
+
+            UserInvite invite = new UserInvite();
+            invite.userId = inviterid;
+            invite.inviterEmail = invitedemail;
+            invite.inviterRegistered = false;
+            invite.user = user;
+
+            entitymanager.getTransaction().begin();
+            entitymanager.merge(user);
+            entitymanager.persist(invite);
+            entitymanager.getTransaction().commit();
+            return 0;
+        } catch (Exception e) {
+            e.printStackTrace();
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            return 2;
+        }
+    }
+
+    @Override
+    public UserStar[] GetUserStarList(String userid) {
+        if (userid == null || userid.isEmpty()) {
+            logger.warn("参数无效: userid为空");
+            return new UserStar[0];
+        }
+
+        EntityManager entitymanager = createEntityManager();
+        try {
+            JPAQuery<UserStar> query = new JPAQuery<>(entitymanager);
+            QUserStar us = QUserStar.userStar;
+            List<UserStar> stars = query.select(us).from(us).where(us.userid.eq(userid)).fetch();
+            return stars.toArray(new UserStar[0]);
+        } catch (Exception e) {
+            e.printStackTrace();
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            return new UserStar[0];
+        } finally {
+            if (entitymanager != null) {
+                entitymanager.close();
+            }
+        }
+    }
+
+    @Override
+    public int UploadMigration(String userid, File file) {
+        if (userid == null || userid.isEmpty() || file == null) {
+            return 2; // 参数无效
+        }
+
+        EntityManager entitymanager = createEntityManager();
+
+        try {
+            // 检查用户是否存在
+            User user = entitymanager.find(User.class, userid);
+            if (user == null) {
+                return 1; // 用户不存在
+            }
+
+            // 创建迁移记录
+            Profile migration = new Profile();
+            migration.profileurl = java.util.UUID.randomUUID().toString();
+            migration.userid = userid;
+            migration.uploadtogive = "0"; // 初始上传量为0
+            migration.magictogive = "0"; // 初始魔力值为0
+            migration.downloadgived = "0"; // 初始下载量为0
+            migration.uploadgived = "0"; // 初始上传量为0
+            migration.magicgived = "0"; // 初始魔力值为0
+            migration.downloadgived = "0"; // 初始下载量为0
+            migration.exampass = false; // 初始审核状态为未通过
+            migration.user = user;
+            Path storageDir = Paths.get(config.MIGRATION_STORAGE_DIR);
+            if (!Files.exists(storageDir)) {
+                Files.createDirectories(storageDir);
+            }
+            String filename = file.getName();
+            Path target = storageDir.resolve(migration.profileurl + "_" + filename);
+            Files.copy(file.toPath(), target, StandardCopyOption.REPLACE_EXISTING);
+            migration.applicationurl = target.toString(); // 设置迁移文件的存储路径
+
+            entitymanager.getTransaction().begin();
+            entitymanager.persist(migration);
+            entitymanager.getTransaction().commit();
+
+            return 0; // 成功
+
+        } catch (Exception e) {
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            e.printStackTrace();
+            return 2; // 其他错误
+        } finally {
+            if (entitymanager != null) {
+                entitymanager.close();
+            }
+        }
+    }
+
+    @Override
+    public BegSeedDetail[] GetBegList() {
+        EntityManager entitymanager = createEntityManager();
+        try {
+            JPAQuery<BegInfo> query = new JPAQuery<>(entitymanager);
+            QBegInfo b = QBegInfo.begInfo;
+            List<BegInfo> begList = query.select(b).from(b).fetch();
+            
+            List<BegSeedDetail> begSeedDetailList = new ArrayList<>();
+            for (BegInfo begInfo : begList) {
+                // 查询对应的BegInfo表的Info字段
+                BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begInfo.begid);
+                // 构造BegSeedDetail对象
+                BegSeedDetail begSeedDetail = new BegSeedDetail(begInfo, begInfoDetail);
+                begSeedDetailList.add(begSeedDetail);
+            }
+            
+            return begSeedDetailList.toArray(new BegSeedDetail[0]);
+        } catch (Exception e) {
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            e.printStackTrace();
+            return new BegSeedDetail[0];
+        } finally {
+            if(entitymanager != null){
+                entitymanager.close();
+            }
+        }
+    }
+
+    @Override
+    public BegInfo GetBegDetail(String begid) {
+        EntityManager entitymanager = createEntityManager();
+        try {
+            JPAQuery<BegInfo> query = new JPAQuery<>(entitymanager);
+            QBegInfo b = QBegInfo.begInfo;
+            BegInfo begDetail = query.select(b).from(b).where(b.begid.eq(begid)).fetchOne();
+            return begDetail;
+        } catch (Exception e) {
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            e.printStackTrace();
+            return null;
+        } finally {
+            if(entitymanager != null){
+                entitymanager.close();
+            }
+        }
+    }
+
+    @Override
+    public BegSeedDetail GetBegSeedDetail(String begid) {
+        if (begid == null || begid.isEmpty()) {
+            return null;
+        }
+
+        EntityManager entitymanager = createEntityManager();
+        try {
+            // 查询 BegSeed 表数据
+            JPAQuery<BegInfo> begQuery = new JPAQuery<>(entitymanager);
+            QBegInfo b = QBegInfo.begInfo;
+            BegInfo begInfo = begQuery.select(b).from(b).where(b.begid.eq(begid)).fetchOne();
+            
+            if (begInfo == null) {
+                return null;
+            }
+
+            // 查询 BegInfo 表的 Info 字段
+            BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begid);
+            
+            // 构造返回对象
+            return new BegSeedDetail(begInfo, begInfoDetail);
+        } catch (Exception e) {
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            e.printStackTrace();
+            return null;
+        } finally {
+            if(entitymanager != null){
+                entitymanager.close();
+            }
+        }
+    }
+
+    @Override
+    public SeedWithVotes[] GetBegSeedListWithVotes(String begid) {
+        if (begid == null || begid.isEmpty()) {
+            return new SeedWithVotes[0];
+        }
+
+        EntityManager entitymanager = createEntityManager();
+        try {
+            JPAQuery<Tuple> query = new JPAQuery<>(entitymanager);
+            QSubmitSeed ss = QSubmitSeed.submitSeed;
+            QSeed s = QSeed.seed;
+
+            List<Tuple> results = query.select(s, ss.votes)
+                    .from(ss)
+                    .join(ss.seed, s)
+                    .where(ss.begInfo.begid.eq(begid))
+                    .fetch();
+
+            List<SeedWithVotes> seedsWithVotes = new java.util.ArrayList<>();
+            for (Tuple result : results) {
+                Seed seed = result.get(s);
+                Integer votes = result.get(ss.votes);
+                seedsWithVotes.add(new SeedWithVotes(seed, votes != null ? votes : 0));
+            }
+
+            return seedsWithVotes.toArray(new SeedWithVotes[0]);
+        } catch (Exception e) {
+            return new SeedWithVotes[0];
+        } finally {
+            entitymanager.close();
+        }
+    }
+
+    @Override
+    public int SubmitBegSeed(String begid, String seedid, String userid) {
+        if (begid == null || begid.isEmpty() || seedid == null || seedid.isEmpty() || userid == null || userid.isEmpty()) {
+            return 2; // 参数无效
+        }
+
+        EntityManager entitymanager = createEntityManager();
+        EntityTransaction tx = entitymanager.getTransaction();
+
+        try {
+            tx.begin();
+            
+            // 检查种子信息是否存在
+            Seed seed = entitymanager.find(Seed.class, seedid);
+            if (seed == null || !seed.seeduserid.equals(userid)) {
+                return 1;
+            }
+
+            // int ret = SubmitSeed(begid, seed);
+            BegInfo begInfo = entitymanager.find(BegInfo.class, begid);
+            if (begInfo == null) {
+                return 2;
+            }
+
+            // 检查种子是否已提交过
+            QSubmitSeed ss = QSubmitSeed.submitSeed;
+            SubmitSeed submitSeed = new JPAQuery<>(entitymanager)
+                    .select(ss)
+                    .from(ss)
+                    .where(ss.begInfo.begid.eq(begid))
+                    .where(ss.seed.seedid.eq(seed.seedid))
+                    .fetchOne();
+
+            submitSeed = new SubmitSeed();
+            submitSeed.begInfo = begInfo;
+            submitSeed.seed = seed;
+            submitSeed.votes = 0; // 初始投票数为0
+            BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begid);
+            if (begInfoDetail == null) {
+                return 1;
+            }
+
+            entitymanager.getTransaction().begin();
+            entitymanager.persist(submitSeed);
+            entitymanager.getTransaction().commit();
+
+            // 创建提交记录
+            entitymanager.createNativeQuery("INSERT INTO SubmitSeed (beg_id, seed_id, votes) VALUES (?, ?, 0)")
+                    .setParameter(1, begid)
+                    .setParameter(2, seed.seedid)
+                    .executeUpdate();
+            return 0;
+
+        } catch (Exception e) {
+            if (tx.isActive()) {
+                tx.rollback();
+            }
+            return 3; // 其他错误
+        } finally {
+            if (entitymanager != null) {
+                entitymanager.close();
+            }
+        }
+    }
+
+    @Override
+    public int createBagSeed(BegInfo begInfo, String userid, String info) {
+        if (begInfo == null || begInfo.begid == null || begInfo.begid.isEmpty()) {
+            return 2; // 参数无效
+        }
+
+        EntityManager entitymanager = createEntityManager();
+        try {
+            BegInfoDetail begInfoDetail = entitymanager.find(BegInfoDetail.class, begInfo.begid);
+            if (begInfoDetail != null) {
+                return 1; // 已存在
+            }
+
+            User user = entitymanager.find(User.class, userid);
+            if (user == null) {
+                return 2; // 用户不存在
+            }
+
+            UserPT userPT = entitymanager.find(UserPT.class, userid);
+            if (userPT == null) {
+                return 2; // 用户PT信息不存在
+            }
+
+            if (userPT.magic < begInfo.magic) {
+                return 3; // 魔力值不足
+            }
+
+            begInfoDetail = new BegInfoDetail();
+            begInfoDetail.begId = begInfo.begid;
+            begInfoDetail.info = info;
+            begInfoDetail.userId = userid;
+            begInfoDetail.user = user;
+            userPT.magic -= begInfo.magic; // 扣除魔力值
+
+            entitymanager.getTransaction().begin();
+            entitymanager.persist(userPT);
+            entitymanager.persist(begInfo);
+            entitymanager.persist(begInfoDetail);
+            entitymanager.getTransaction().commit();
+
+            return 0;
+        } catch (Exception e) {
+            if (entitymanager.getTransaction().isActive()) {
+                entitymanager.getTransaction().rollback();
+            }
+            e.printStackTrace();
+            return 2; // 其他错误
+        } finally {
+            if (entitymanager != null) {
+                entitymanager.close();
+            }
+        }
+    }
+}
\ No newline at end of file