Cheat接口部分实现及测试代码

Change-Id: I5a8782b13477c829089b8aa842663f42ca1e2d9a
diff --git a/src/main/java/cheat/Cheat.java b/src/main/java/cheat/Cheat.java
index db38ede..3eecaff 100644
--- a/src/main/java/cheat/Cheat.java
+++ b/src/main/java/cheat/Cheat.java
@@ -1,5 +1,203 @@
 package cheat;
 
-// public class Cheat implements CheatInterfnterface {
-    
-// }
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.transaction.Transactional;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.querydsl.jpa.impl.JPAQueryFactory;
+
+import entity.Appeal;
+import entity.QAppeal;
+import entity.QSeed;
+import entity.User;
+import entity.config;
+
+public class Cheat implements CheatInterfnterface {
+
+    @PersistenceContext
+    private EntityManager entityManager;
+
+    @Override
+    @Transactional
+    public boolean AddAppeal(Appeal appeal) {
+        try {
+            entityManager.persist(appeal);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public Appeal GetAppeal(String appealid) {
+        try {
+            JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
+            QAppeal qAppeal = QAppeal.appeal;
+            Appeal appeal = queryFactory
+                .selectFrom(qAppeal)
+                .where(qAppeal.appealid.eq(appealid))
+                .fetchOne();
+            return appeal;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    @Override
+    public Appeal[] GetAppealList() {
+        try {
+            JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
+            QAppeal qAppeal = QAppeal.appeal;
+            List<Appeal> appeals = queryFactory
+                .selectFrom(qAppeal)
+                .fetch();
+            return appeals.toArray(new Appeal[0]);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    @Override
+    public boolean HandleAppeal(String appealid, Integer status) {
+        try {
+            Appeal appeal = GetAppeal(appealid);
+            if (appeal != null) {
+                appeal.status = status;
+                entityManager.merge(appeal);
+                User user = entityManager.find(User.class, appeal.appealuserid);
+                if (user != null && user.accountstate != false) {
+                    if (status == 1) {
+                        user.accountstate = false;
+                    }
+                    entityManager.merge(user);
+                }
+                return true;
+            }
+            return false;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    public Pair<String, String>[] GetFakeSeed() {
+        List<Pair<String, String>> fakeSeeds = new ArrayList<>();
+        try {
+            JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
+            QSeed qSeed = QSeed.seed;
+            List<com.querydsl.core.Tuple> results = queryFactory
+                .select(qSeed.seedid, qSeed.seeduserid)
+                .from(qSeed)
+                .where(qSeed.faketime.gt(new config().FakeTime))
+                .fetch();
+            for (com.querydsl.core.Tuple result : results) {
+                String seedid = result.get(qSeed.seedid);
+                String userid = result.get(qSeed.seeduserid);
+                fakeSeeds.add(Pair.of(seedid, userid));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+        return fakeSeeds.toArray(new Pair[0]);
+    }
+
+    @Override
+    public String[] GetPunishedUserList() {
+        List<String> punishedUsers = new ArrayList<>();
+        try {
+            JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
+            entity.QUser qUser = entity.QUser.user;
+            List<String> results = queryFactory
+                .select(qUser.userid)
+                .from(qUser)
+                .where(qUser.accountstate.isTrue())
+                .fetch();
+            for (String userid : results) {
+                punishedUsers.add(userid);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+        return punishedUsers.toArray(new String[0]);
+    }
+
+    @Override
+    public void DetectTrans() {
+        // JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
+        // QSeed qSeed = QSeed.seed;
+        // List<Seed> seeds = queryFactory
+        //     .selectFrom(qSeed)
+        //     .fetch();
+        // for (Seed seed : seeds) {
+        //     QTransRecord qTransRecord = QTransRecord.transRecord;
+        //     List<TransRecord> tasks = queryFactory
+        //         .selectFrom(qTransRecord)
+        //         .where(qTransRecord.seedid.eq(seed.seedid))
+        //         .fetch();
+
+        //     int n = tasks.size();
+        //     if (n == 0) continue;
+
+        //     double[] xArr = new double[n];
+        //     for (int i = 0; i < n; i++) {
+        //         TransRecord t = tasks.get(i);
+        //         xArr[i] = Math.max(0, t.upload - t.download);
+        //     }
+
+        //     double sum = 0;
+        //     for (double x : xArr) sum += x;
+        //     double mu = sum / n;
+
+        //     double sqSum = 0;
+        //     for (double x : xArr) sqSum += (x - mu) * (x - mu);
+        //     double sigma = Math.sqrt(sqSum / n);
+
+        //     for (int i = 0; i < n; i++) {
+        //         if (Math.abs(xArr[i] - mu) > 3 * sigma) {
+        //             User user = entityManager.find(User.class, tasks.get(i).downloaduserid);
+        //             if (user != null) {
+        //                 user.detectedCount++;
+        //                 user.lastDetectedTime = new java.util.Date();
+        //                 entityManager.merge(user);
+        //             }
+        //         }
+        //     }
+        // }
+    }
+
+    @Override
+    public void DetectFakeSeed(){
+    }
+
+    @Override
+    public boolean DetectFakeSeed(String seedid){
+        return false;
+    }
+
+    @Override
+    public void PunishUser(){
+        JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
+        entity.QUser qUser = entity.QUser.user;
+        List<User> users = queryFactory
+            .selectFrom(qUser)
+            .where(qUser.detectedCount.gt(new entity.config().CheatTime) 
+                .or(qUser.fakeDetectedCount.gt(new entity.config().FakeTime)))
+            .fetch();
+
+        for (User user : users) {
+            user.accountstate = true;
+            entityManager.merge(user);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/cheat/CheatInterfnterface.java b/src/main/java/cheat/CheatInterfnterface.java
index cca8818..e7e4942 100644
--- a/src/main/java/cheat/CheatInterfnterface.java
+++ b/src/main/java/cheat/CheatInterfnterface.java
@@ -1,21 +1,18 @@
 package cheat;
 import org.apache.commons.lang3.tuple.Pair;
-
 import entity.Appeal;
 public interface CheatInterfnterface{
-    public Pair<String,String>[] GetFeakSeed();//返回做假种的列表,<seedid,userid>
-    public void DetectFeakSeed();//检测所有种子是否为假种,并将检测结果写入数据表
+    public Pair<String,String>[] GetFakeSeed();//返回做假种的列表,<seedid,userid>
+    public void DetectFakeSeed();//检测所有种子是否为假种,并将检测结果写入数据表
     public void DetectTrans();//检测所有种子是存在伪造上传量下载量
-    public boolean DetectTransSeed(String seedid);//检测单个种子是否存在伪造上传量下载量
-    public boolean DetectFeakSeed(String seedid);//检测单个用户是否存在假种
-    public void PunishUser();//扫描数据库中的可疑表,标记可疑用户
-    public boolean DetectUser(String userid);//检测单个用户是否存在可疑行为,每次登录的时候进行检查
-    public String[] GetPunishedUserList();//获取所有可疑用户的列表
 
+    public boolean DetectFakeSeed(String seedid);//检测单个用户是否存在假种
+    public void PunishUser();//扫描数据库中的可疑表,标记可疑用户
+    public String[] GetPunishedUserList();//获取所有可疑用户的列表
+    
     public boolean AddAppeal(Appeal appeal);//数据库中写入一个申诉请求
     public Appeal GetAppeal(String appealid);//获取某个申诉
     public Appeal[] GetAppealList();//获取所有申诉列表
-
-    public boolean RevokePunish(String userid);//撤销某个用户的惩罚
-
+    public boolean HandleAppeal(String appealid, Integer status);//处理申诉
+    // status = 0表示未处理, = 1表示通过, = 2表示拒绝
 }
diff --git a/src/main/java/entity/Appeal.java b/src/main/java/entity/Appeal.java
index 36816c4..0ab79f7 100644
--- a/src/main/java/entity/Appeal.java
+++ b/src/main/java/entity/Appeal.java
@@ -31,5 +31,5 @@
     public String fileURL;
 
     @Column(name = "status", nullable = false)
-    public int state; // 0: pending, 1: approved, 2: rejected
+    public int status; // 0: pending, 1: approved, 2: rejected
 }
diff --git a/src/main/java/entity/User.java b/src/main/java/entity/User.java
index d1d67c7..6cdafb8 100644
--- a/src/main/java/entity/User.java
+++ b/src/main/java/entity/User.java
@@ -7,6 +7,9 @@
 import javax.persistence.Id;
 import javax.persistence.OneToOne;
 import javax.persistence.Table;
+import java.util.Date;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
 import javax.persistence.Transient;
 import com.querydsl.core.annotations.QueryEntity;
 
@@ -25,6 +28,21 @@
     public String password;
     @Column(name = "gender", nullable = false)
     public String sex;
+
+    @Column(name = "detectedCount", nullable = false)
+    public int detectedCount = 0;
+
+    @Temporal(TemporalType.TIMESTAMP)
+    @Column(name = "lastDetectedTime",nullable = false)
+    public Date lastDetectedTime = new Date();
+
+    @Column(name = "fake_detected_count", nullable = false)
+    public int fakeDetectedCount = 0;
+
+    @Temporal(TemporalType.TIMESTAMP)
+    @Column(name = "fake_last_detected_time", nullable = false)
+    public Date fakeLastDetectedTime = new Date();
+
     @Transient
     public String age;
     @Column(name = "school")
diff --git a/src/main/java/entity/config.java b/src/main/java/entity/config.java
index 71f3b4f..c509df3 100644
--- a/src/main/java/entity/config.java
+++ b/src/main/java/entity/config.java
@@ -5,6 +5,7 @@
     public static final int FarmNumber=3;
     public static final int FakeTime=3;
     public static final int BegVote=3;
+    public static final int CheatTime=5;
     // 请根据实际环境修改为可达的地址
     public static final String SqlURL = "192.168.5.9:3306";
     public static final String Database = "pt_database";
diff --git a/src/main/java/object/config.java b/src/main/java/object/config.java
new file mode 100644
index 0000000..750ce35
--- /dev/null
+++ b/src/main/java/object/config.java
@@ -0,0 +1,9 @@
+package object;
+
+public class config {
+    public String TrackerURL;
+    public int FarmNumber;
+    public int FakeTime = 5;
+    public int BegVote;
+    public String SqlURL="192.168.5.9:3306";
+}