修改Vip部分接口,实现Vip和DB1接口功能及单元测试,新增VipSeed和UserStar实体类

Change-Id: I0479a68f3ff8c8ccd0fd7e9e5894e5b48cb7ffec
diff --git a/src/main/java/vip/Vip.java b/src/main/java/vip/Vip.java
index c9d3dc7..e0b3ad1 100644
--- a/src/main/java/vip/Vip.java
+++ b/src/main/java/vip/Vip.java
@@ -1,5 +1,195 @@
 package vip;
+import java.io.File;
+import java.util.List;
 
-// public class Vip implements VipInterface {
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.querydsl.jpa.impl.JPAQuery;
+
+import entity.QSeed;
+import entity.QUser;
+import entity.QVipSeed;
+import entity.Seed;
+import entity.User;
+import entity.VipSeed;
+
+public class Vip implements VipInterface {
+
+    int seedKeepNumber = 10;
+
+    @PersistenceContext
+    private EntityManager entitymanager;
     
-// }
+    //获取专线下载的文件,并记录用户的下载行为
+    //如果用户权限足够,文件存在,integer为0,如果用户权限足够,文件不存在,
+    //integer为1,file为null 如果用户权限不足,file为null,integer为2;
+    @Override
+    public Pair<File,Integer>  GetTTorent(String seedid,String userid,String ip){
+        EntityManager em = this.entitymanager;
+        File file = null;
+        try {
+            if (seedid == null || userid == null || ip == null) {
+                return Pair.of(null, 2);
+            }
+            Seed seed = em.find(Seed.class, seedid);
+            if (seed == null || seed.url == null) {
+                return Pair.of(null, 1);
+            }
+            User user = em.find(User.class, userid);
+            if (user == null) {
+                return Pair.of(null, 2);
+            }
+            file = new File(seed.url);
+            JPAQuery<Boolean> query = new JPAQuery<>(em);
+            QUser u = QUser.user;
+            Boolean status = query.select(u.accountstate).where(u.userid.eq(userid)).fetchOne();
+            if (!file.exists()) {
+                if (status){
+                    return Pair.of(null, 2);
+                } else {
+                    return Pair.of(null, 1);
+                }
+            }
+            if (status){
+                return Pair.of(null, 2);
+            }
+            
+            // 记录下载行为
+            javax.persistence.EntityTransaction tx = em.getTransaction();
+            tx.begin();
+            entity.SeedDownload sd = new entity.SeedDownload();
+            sd.seedId = seedid;
+            sd.userId = userid;
+            sd.clientIp = ip;
+            java.time.LocalDateTime now = java.time.LocalDateTime.now();
+            sd.downloadStart = now;
+            sd.downloadEnd = now;
+            em.persist(sd);
+            tx.commit();
+        } catch (Exception e) {
+            // ignore persistence errors and still return the file
+        }
+        return Pair.of(file, 0);
+    }
+
+    //种子增加了新的保种人数,返回值:0,写入成功,1写入失败,其他待定
+    @Override
+    public int AddFarmerNumber(int number,String seedid){
+        try {
+            VipSeed vipseed = entitymanager.find(VipSeed.class, seedid);
+            if(vipseed == null){
+                return 1;
+            }
+            vipseed.farmernumber = vipseed.farmernumber + number;
+            entitymanager.merge(vipseed);
+
+            return 0;
+            
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 1;
+        }
+
+    }
+
+    //种子降低的保种人数,返回值:0,写入成功,1:写入失败,其他待定
+    @Override
+    public int ReduceFarmerNumber(int number,String seedid){
+        try {
+            VipSeed vipSeed = entitymanager.find(VipSeed.class, seedid);
+            if(vipSeed == null){
+                return 1;
+            }
+            vipSeed.farmernumber = vipSeed.farmernumber - number;
+            entitymanager.merge(vipSeed);
+
+            return 0;
+            
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 1;
+        }
+
+    }
+
+    //将种子加入保种列表
+    // @Override
+    public int KeepSeed(String seedid){
+        try {
+            Seed seed = entitymanager.find(Seed.class, seedid);
+            if(seed == null){
+                return 1; //种子不存在
+            }
+            VipSeed vipSeed = new VipSeed();
+            vipSeed.seedid = seedid;
+            vipSeed.seed = seed;
+            vipSeed.seedercount = 1; // 初始保种人数为1
+            vipSeed.rewardmagic = 50; // 初始奖励魔法值为50
+            vipSeed.stopcaching = 0; // 初始停止缓存状态为0
+            vipSeed.bonus = 50; // 初始奖励为50
+            vipSeed.cachestate = true; // 初始缓存状态为true
+            vipSeed.farmernumber = 0; // 初始农民人数为0
+            
+            entitymanager.persist(vipSeed);
+            return 0; // 成功添加到保种列表
+            
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 2; // 添加失败
+        }
+
+    }
+
+    //将种子移除保种列表
+    @Override
+    public int RemoveSeed(String seedid){
+        try {
+            VipSeed vipSeed = entitymanager.find(VipSeed.class, seedid);
+            if(vipSeed == null){
+                return 0;
+            }
+            entitymanager.remove(vipSeed);
+            return 0;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 1;
+        }
+
+    }
+
+    //由外部触发,调用类内函数更新保种列表
+    @Override
+    public void CheckSeed(){
+        JPAQuery<VipSeed> query = new JPAQuery<>(entitymanager);
+        QVipSeed v = QVipSeed.vipSeed;
+        // 保证 select(v) 返回 List<VipSeed>
+        List<VipSeed> allVipSeeds = query.select(v).from(v).fetch();
+        for (VipSeed vipSeed : allVipSeeds) {
+            if (vipSeed.farmernumber > seedKeepNumber) {
+                entitymanager.remove(vipSeed);
+            }
+        }
+    }
+
+    //获取当前需要保种的所有种子信息
+    @Override
+    public Seed[] GetSeedToPlant(){
+        JPAQuery<String> query = new JPAQuery<>(entitymanager);
+        QVipSeed v = QVipSeed.vipSeed;
+        List<String> allSeedId = query.select(v.seedid).from(v).fetch();
+        
+        if(allSeedId.isEmpty()){
+            return new Seed[0];
+        }
+        JPAQuery<Seed> query2 = new JPAQuery<>(entitymanager);
+        QSeed s = QSeed.seed;
+        List<Seed> allSeeds = query2.select(s).from(s).where(s.seedid.in(allSeedId)).fetch();
+        
+        return allSeeds.toArray(new Seed[0]);
+    }
+
+}
+
diff --git a/src/main/java/vip/VipInterface.java b/src/main/java/vip/VipInterface.java
index fd3413c..6348e73 100644
--- a/src/main/java/vip/VipInterface.java
+++ b/src/main/java/vip/VipInterface.java
@@ -1,18 +1,17 @@
 package vip;
+import java.io.File;
+
 import org.apache.commons.lang3.tuple.Pair;
 
 import entity.Seed;
-import entity.TTorent;
-
-import java.io.File;
 public interface VipInterface{
     
-    public Pair<File,Integer>  GetTTorent(String seedid,String userid);//获取专线下载的文件,并记录用户的下载行为
+    public Pair<File,Integer>  GetTTorent(String seedid,String userid,String ip);//获取专线下载的文件,并记录用户的下载行为
     //如果用户权限足够,文件存在,integer为0,如果用户权限足够,文件不存在,integer为1,file为null 如果用户权限不足,file为null,integer为2;
 
     public int AddFarmerNumber(int number,String seedid);//种子增加了新的保种人数,返回值:0,写入成功,1写入失败,其他待定
     public int ReduceFarmerNumber(int number,String seedid);//种子降低的保种人数,返回值:0,写入成功,1:写入失败,其他待定
-    public int KeepSeed(TTorent seed,String seedid);//将种子加入保种列表
+    public int KeepSeed(String seedid);//将种子加入保种列表
     public int RemoveSeed(String seedid);//将种子移除保种列表
 
     public void CheckSeed();//由外部触发,调用类内函数更新保种列表