Преглед изворни кода

修改自动打卡相关bug以及逻辑问题
初步完成自动外勤

Bitlikr пре 9 година
родитељ
комит
32297151e3

+ 0 - 21
WeiChat/src/main/java/com/xzjmyk/pm/activity/BdLocationHelper.java

@@ -9,7 +9,6 @@ import com.baidu.location.LocationClient;
 import com.baidu.location.LocationClientOption;
 import com.baidu.location.Poi;
 import com.xzjmyk.pm.activity.sp.LocationSp;
-import com.xzjmyk.pm.activity.ui.erp.util.alarm.AlarmManage;
 
 import java.util.List;
 
@@ -30,7 +29,6 @@ public class BdLocationHelper {
     private List<Poi> pois;
     private int scanSpan = 20 * 1000;
     private long oldTime = 0;
-    private AlarmManage manage;
 
     BdLocationHelper(Context context) {
         mContext = context;
@@ -143,31 +141,12 @@ public class BdLocationHelper {
             if (listener != null) {
                 listener.result(true);
             }
-//            reckonAlarm();
         }
     };
 
     private static final long INTERVAL_TIME = 60000;//间隔时间
     private int type = 1;//1.内勤  2.外勤
 
-    /*计算提醒*/
-    private void reckonAlarm() {
-        if (oldTime != 0 && (System.currentTimeMillis() - oldTime) < INTERVAL_TIME) {//不在规定时间刷新,不记录数据
-            return;
-        }
-        oldTime = System.currentTimeMillis();
-        switch (type) {
-            case 1:
-                if (manage == null)
-                    manage = new AlarmManage();
-                manage.reckonNextAlarm();
-                break;
-            case 2:
-                //TODO 外勤签到
-
-                break;
-        }
-    }
 
 
     public String getName() {

+ 59 - 24
WeiChat/src/main/java/com/xzjmyk/pm/activity/db/dao/ErrorMagDao.java

@@ -6,9 +6,12 @@ import android.database.SQLException;
 import android.database.sqlite.SQLiteDatabase;
 import android.util.Log;
 
+import com.xzjmyk.pm.activity.AppConfig;
 import com.xzjmyk.pm.activity.MyApplication;
-import com.xzjmyk.pm.activity.ui.erp.activity.oa.TestActivity;
 import com.xzjmyk.pm.activity.ui.erp.db.DBOpenHelper;
+import com.xzjmyk.pm.activity.ui.erp.entity.ErrorEntity;
+import com.xzjmyk.pm.activity.ui.erp.util.StringUtils;
+import com.xzjmyk.pm.activity.util.TimeUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -18,69 +21,101 @@ import java.util.List;
  */
 
 public class ErrorMagDao {
-
+    private static ErrorMagDao instance;
     private DBOpenHelper helper = null;
     private String tibleName = "error_mag";
 
-    public ErrorMagDao() {
+    public static ErrorMagDao getInstance() {
+        if (instance == null) {
+            instance = new ErrorMagDao();
+        }
+        return instance;
+    }
+
+    private ErrorMagDao() {
         helper = new DBOpenHelper(MyApplication.getInstance());
     }
 
     //获取当天全部数据
-    public List<TestActivity.Bean> queryAll() {
+    public List<ErrorEntity> queryAll() {
         SQLiteDatabase db = null;
         Cursor cursor = null;
-        List<TestActivity.Bean> missions = null;
+        List<ErrorEntity> beans = null;
         try {
+            helper = new DBOpenHelper(MyApplication.getInstance());
             db = helper.getReadableDatabase();
             String[] columns = {"id", "time", "title", "msg"};
             String selection = null;
             String[] selecttionArg = null;
             cursor = db.query(tibleName, columns, selection, selecttionArg, null, null, null);
-            TestActivity.Bean mission = null;
-            missions = new ArrayList<>();
+            ErrorEntity bean = null;
+            beans = new ArrayList<>();
             while (cursor.moveToNext()) {
-                mission = new TestActivity.Bean();
-                mission.id = cursor.getInt(0);
-                mission.time = cursor.getString(1);
-                mission.title = cursor.getString(2);
-                mission.msg = cursor.getString(3);
-                missions.add(mission);
+                bean = new ErrorEntity();
+                bean.setId(cursor.getInt(0));
+                bean.setTime(cursor.getString(1));
+                bean.setTitle(cursor.getString(2));
+                bean.setMsg(cursor.getString(3));
+                beans.add(bean);
             }
-            Log.i("gongpengming", "missions==" + missions.size());
         } catch (SQLException e) {
-            Log.i("gongpengming", "SQLException=" + e.getMessage());
+            show("SQLException=" + e.getMessage());
         } catch (Exception e) {
-            Log.i("gongpengming", "Exception=" + e.getMessage());
+            show("Exception=" + e.getMessage());
         } finally {
             if (db != null)
                 db.close();
             if (cursor != null)
                 cursor.close();
-            return missions;
+            return beans;
         }
     }
 
     //插入一个数据
-    public boolean insert(TestActivity.Bean mission) {
+    public boolean insert(ErrorEntity bean) {
+        delete(bean);
         SQLiteDatabase db = null;
         long i = 0;
         try {
+            helper = new DBOpenHelper(MyApplication.getInstance());
             db = helper.getWritableDatabase();
             ContentValues values = new ContentValues();
-            values.put("time", mission.time);
-            values.put("title", mission.title);
-            values.put("msg", mission.msg);
+            values.put("time", bean.getTime());
+            values.put("title", bean.getTitle());
+            values.put("msg", bean.getMsg());
             i = db.insert(tibleName, null, values);
-            Log.i("gongpengming", "i==" + i);
         } catch (SQLException e) {
-            Log.i("gongpengming", "SQLException=" + e.getMessage());
+            show("SQLException=" + e.getMessage());
         } catch (Exception e) {
-            Log.i("gongpengming", "Exception=" + e.getMessage());
+            show("Exception=" + e.getMessage());
         } finally {
             if (db != null)
                 db.close();
             return i > 0;
         }
     }
+
+    private void delete(ErrorEntity bean) {
+        SQLiteDatabase db = null;
+        long i = 0;
+        try {
+            db = helper.getWritableDatabase();
+            String time = TimeUtils.f_long_2_str(TimeUtils.f_str_2_long(bean.getTime()) - 60 * 60 * 1000);//前面1小时
+            String where = "time < ?";
+            String[] whereArg = {time};
+            db.delete(tibleName, where, whereArg);
+        } catch (SQLException e) {
+            show("SQLException=" + e.getMessage());
+        } catch (Exception e) {
+            show("Exception=" + e.getMessage());
+        } finally {
+            if (db != null)
+                db.close();
+        }
+    }
+
+    private void show(String str) {
+        if (StringUtils.isEmpty(str) || !AppConfig.DEBUG) return;
+        Log.i("gongpengming", str);
+    }
 }

+ 39 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/db/dao/MissionDao.java

@@ -25,13 +25,50 @@ import java.util.List;
 public class MissionDao {
     private DBOpenHelper helper = null;
     private String tibleName = "mission";
+    private static MissionDao instance;
+
+    public static MissionDao getInstance() {
+        if (instance == null) {
+            synchronized (MissionDao.class) {
+                instance = new MissionDao();
+            }
+        }
+        return instance;
+    }
 
     public MissionDao() {
+
+    }
+
+
+    public boolean upStatus(int id, int status) {
         helper = new DBOpenHelper(MyApplication.getInstance());
+        SQLiteDatabase db = null;
+        long i = 0;
+        try {
+            String master = CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_master");
+            String emcode = CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_username");
+            if (StringUtils.isEmpty(master) || StringUtils.isEmpty(emcode)) return false;
+            db = helper.getWritableDatabase();
+            ContentValues values = new ContentValues();
+            values.put("status",status);
+            String where = "master=? and emcode=? and id=? ";
+            String[] whereArgs = {master, emcode, String.valueOf(id)};
+            i = db.update(tibleName, values, where, whereArgs);
+        } catch (android.database.SQLException e) {
+            show("SQLException=" + e.getMessage());
+        } catch (Exception e) {
+            show("Exception=" + e.getMessage());
+        } finally {
+            if (db != null)
+                db.close();
+            return i > 0;
+        }
     }
 
     //获取当天全部数据
     public List<MissionPlanEntity> queryByEnCode() {
+        helper = new DBOpenHelper(MyApplication.getInstance());
         SQLiteDatabase db = null;
         Cursor cursor = null;
         List<MissionPlanEntity> missions = null;
@@ -80,6 +117,7 @@ public class MissionDao {
     //更新或是创建一个数据
     public boolean updataOrCreate(MissionPlanEntity mission) {
         if (mission == null) return false;
+        helper = new DBOpenHelper(MyApplication.getInstance());
         if (mission.getStatus() > 0) {//更新
             return updata(mission);
         } else {//创建
@@ -88,6 +126,7 @@ public class MissionDao {
     }
 
     public boolean updataOrCreate(List<MissionPlanEntity> entities) {
+        helper = new DBOpenHelper(MyApplication.getInstance());
         return insertAll(entities);
     }
 

+ 6 - 6
WeiChat/src/main/java/com/xzjmyk/pm/activity/db/dao/SigninDao.java

@@ -56,12 +56,12 @@ public class SigninDao {
             values.put("workTime", bean.getWorkTime());
             values.put("master", master);
             values.put("offTime", bean.getOffTime());
-            if (StringUtils.isEmpty(bean.getWorkSignin()) || bean.getWorkSignin().compareTo(bean.getWorkTime()) > 0) {
+            if (StringUtils.isEmpty(bean.getWorkSignin()) || bean.getWorkSignin().compareTo(bean.getWorkTime()) >= 0) {
                 values.put("workSignin", "");
             } else {
                 values.put("workSignin", bean.getWorkSignin());
             }
-            if (StringUtils.isEmpty(bean.getOffSignin()) || bean.getOffSignin().compareTo(bean.getOffTime()) < 0) {
+            if (StringUtils.isEmpty(bean.getOffSignin()) || bean.getOffSignin().compareTo(bean.getOffTime()) <= 0) {
                 values.put("offSignin", "");
             } else {
                 values.put("offSignin", bean.getOffSignin());
@@ -74,11 +74,11 @@ public class SigninDao {
             String[] whereArgs = {emCode, master, bean.getStartTime(), bean.getEndTime()};
             item = db.update(titleName, values, where, whereArgs);
         } catch (SQLException e) {
-            testShow("SQLException="+e.getMessage());
+            testShow("SQLException=" + e.getMessage());
             e.printStackTrace();
             return false;
         } catch (Exception e) {
-            testShow("Exception="+e.getMessage());
+            testShow("Exception=" + e.getMessage());
             e.printStackTrace();
             return false;
         } finally {
@@ -225,8 +225,8 @@ public class SigninDao {
     }
 
 
-    private void testShow( String message) {
+    private void testShow(String message) {
         if (!AppConfig.DEBUG || StringUtils.isEmpty(message)) return;
-        Log.i("gongpengming",  message);
+        Log.i("gongpengming", message);
     }
 }

+ 0 - 4
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/SplashActivity.java

@@ -28,7 +28,6 @@ import com.xzjmyk.pm.activity.ui.account.RegisterActivity;
 import com.xzjmyk.pm.activity.ui.base.BaseActivity;
 import com.xzjmyk.pm.activity.ui.erp.net.ViewUtil;
 import com.xzjmyk.pm.activity.ui.erp.util.LogUtil;
-import com.xzjmyk.pm.activity.ui.erp.util.alarm.AlarmManage;
 import com.xzjmyk.pm.activity.util.DeviceInfoUtil;
 import com.xzjmyk.pm.activity.util.Md5Util;
 import com.xzjmyk.pm.activity.volley.ObjectResult;
@@ -74,9 +73,6 @@ public class SplashActivity extends BaseActivity {
             }
         });
         mSelectLv.setVisibility(View.INVISIBLE);
-        //TODO gongpengming 先关闭
-//        AlarmManage manage = new AlarmManage();
-//        manage.setSigninAlarm(this);
         initConfig();// 初始化配置
         
 

+ 7 - 2
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/OutLogListActivity.java

@@ -213,7 +213,12 @@ public class OutLogListActivity extends BaseActivity {
             holder.location.setText(getStrByJson(object, "mo_company"));
             holder.addr.setText(getStrByJson(object, "mo_address"));
             holder.remark.setText(getStrByJson(object, "mo_remark"));
-            if (object.containsKey("mo_attachid") && object.getInteger("mo_attachid") > 1000) {
+            int reId = 0;
+            try {
+                reId = object.containsKey("mo_attachid") ? object.getIntValue("mo_attachid"):0;
+            } catch (Exception e) {
+            }
+            if (reId>1000){
                 holder.image.setVisibility(View.VISIBLE);
                 ImageLoader.getInstance().displayImage(getImageUrl(object.getInteger("mo_attachid")), holder.image);
                 holder.image.setOnClickListener(new View.OnClickListener() {
@@ -224,7 +229,7 @@ public class OutLogListActivity extends BaseActivity {
                         ct.startActivity(intent);
                     }
                 });
-            } else {
+            }else{
                 holder.image.setVisibility(View.GONE);
             }
             return view;

+ 21 - 15
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/TestActivity.java

@@ -1,6 +1,7 @@
 package com.xzjmyk.pm.activity.ui.erp.activity.oa;
 
 import android.os.Bundle;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -12,7 +13,10 @@ import com.lidroid.xutils.ViewUtils;
 import com.lidroid.xutils.view.annotation.ViewInject;
 import com.xzjmyk.pm.activity.R;
 import com.xzjmyk.pm.activity.db.dao.ErrorMagDao;
+import com.xzjmyk.pm.activity.db.dao.MissionDao;
 import com.xzjmyk.pm.activity.ui.base.BaseActivity;
+import com.xzjmyk.pm.activity.ui.erp.entity.ErrorEntity;
+import com.xzjmyk.pm.activity.ui.erp.entity.MissionPlanEntity;
 import com.xzjmyk.pm.activity.ui.erp.util.ListUtils;
 import com.xzjmyk.pm.activity.ui.erp.util.StringUtils;
 
@@ -23,7 +27,7 @@ public class TestActivity extends BaseActivity implements View.OnClickListener {
     @ViewInject(R.id.listView)
     private ListView listView;
 
-    private List<Bean> beans;
+    private List<ErrorEntity> beans;
     private ErrorAdaptr adaptr;
     private Object data;
 
@@ -46,19 +50,27 @@ public class TestActivity extends BaseActivity implements View.OnClickListener {
     public void onClick(View view) {
         switch (view.getId()) {
             case R.id.error_list:
-                getData();
+                beans = ErrorMagDao.getInstance().queryAll();
                 listView.setAdapter(adaptr);
                 adaptr.notifyDataSetChanged();
                 break;
             case R.id.test_btn:
+                List<MissionPlanEntity> list = MissionDao.getInstance().queryByEnCode();
+                if (ListUtils.isEmpty(list)) {
+                    Log.i("gongpengming", "当前列表为空");
+                } else {
+                    for (MissionPlanEntity e : list) {
+                        Log.i("gongpengming", "e.getCompanyName=" + e.getCompanyName());
+                        Log.i("gongpengming", "e.getVisitTime=" + e.getVisitTime());
+                        Log.i("gongpengming", "e.getRealTime=" + e.getRealTime());
+                        Log.i("gongpengming", "e.getStatus=" + e.getStatus());
+                        Log.i("gongpengming", "+++++++++++++++++++++++++++++++++++=");
+                    }
+                }
                 break;
         }
     }
 
-    public void getData() {
-        ErrorMagDao dao = new ErrorMagDao();
-        beans = dao.queryAll();
-    }
     class ErrorAdaptr extends BaseAdapter {
         @Override
         public int getCount() {
@@ -88,9 +100,9 @@ public class TestActivity extends BaseActivity implements View.OnClickListener {
             } else {
                 holer = (ViewHoler) view.getTag();
             }
-            holer.time_tv.setText(getNull(beans.get(i).time));
-            holer.title_tv.setText(getNull(beans.get(i).title));
-            holer.msg_tv.setText(getNull(beans.get(i).msg));
+            holer.time_tv.setText(getNull(beans.get(i).getTime()));
+            holer.title_tv.setText(getNull(beans.get(i).getTitle()));
+            holer.msg_tv.setText(getNull(beans.get(i).getMsg()));
             return view;
         }
 
@@ -99,12 +111,6 @@ public class TestActivity extends BaseActivity implements View.OnClickListener {
         }
     }
 
-    public static class Bean {
-        public int id;
-        public String time;
-        public String title;
-        public String msg;
-    }
 
     private String getNull(String str) {
         if (StringUtils.isEmpty(str)) return "";

+ 44 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/entity/ErrorEntity.java

@@ -0,0 +1,44 @@
+package com.xzjmyk.pm.activity.ui.erp.entity;
+
+/**
+ * 错误信息表
+ * Created by Bitliker on 2016/12/1.
+ */
+public class ErrorEntity {
+    private int id;//自增id
+    private String time;//时间
+    private String title;//标题  类名
+    private String msg;//错误信息
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getTime() {
+        return time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+}

+ 1 - 1
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/entity/MissionPlanEntity.java

@@ -19,7 +19,7 @@ public class MissionPlanEntity implements Parcelable {
     private String realLeave;//实际离开时间  yyyy-MM-dd HH:mm:ss
     private LatLng latLng;//选择地址的经纬度
     private int visitcount;//拜访次数
-    private int status;//状态  1.已提交  0.未提交  (数据库中 0.未进行  1.进行中  2.已完成)
+    private int status;//状态  1.已提交  0.未提交  (数据库中 0.未进行  1.进行中  2.已完成 3.已提醒)
 
     public MissionPlanEntity() {
     }

+ 14 - 9
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/fragment/SigninFragment.java

@@ -119,7 +119,6 @@ public class SigninFragment extends EasyFragment implements View.OnClickListener
             switch (msg.what) {
                 case 0x11://获取班次
                     JSONObject jsonObject = parseObject(message);//返回对象
-                    Log.i("handleMessage11: ", jsonObject.toString());
                     if (jsonObject.containsKey("comaddressset") ? jsonObject.getBoolean("comaddressset") : false) {//如果有分配公司
                         companyDistance = Integer.parseInt(jsonObject.containsKey("distance") ? (StringUtils.isEmpty(jsonObject.getString("distance")) ? "-1" : jsonObject.getString("distance")) : "-1");
                         companyX = Double.parseDouble(jsonObject.containsKey("longitude") ? (StringUtils.isEmpty(jsonObject.getString("longitude")) ? "0" : jsonObject.getString("longitude")) : "0");
@@ -128,6 +127,10 @@ public class SigninFragment extends EasyFragment implements View.OnClickListener
                         CommonUtil.setSharedPreferences(ct, "companyY", (float) companyY);
                         CommonUtil.setSharedPreferences(ct, "distance", companyDistance);
                         unoffice_mm.setText(setDistance());
+                    } else {
+                        CommonUtil.setSharedPreferences(ct, "companyX", (float) 0);
+                        CommonUtil.setSharedPreferences(ct, "companyY", (float) 0);
+                        CommonUtil.setSharedPreferences(ct, "distance", 0);
                     }
                     if (jsonObject.getBoolean("success")) {
                         //有班次
@@ -608,8 +611,6 @@ public class SigninFragment extends EasyFragment implements View.OnClickListener
     }
 
 
-
-
     //处理数据,用户无排班时候,获取默认排版
     public void setDataByNoDegree(JSONObject object) {
         ArrayList<SigninBean> beans = new ArrayList<>();
@@ -683,7 +684,7 @@ public class SigninFragment extends EasyFragment implements View.OnClickListener
     public void setDataByLogs(JSONArray array) {
         List<SigninBean> beans = getDataByAdapter();
         if (beans == null) return;
-        if (array.size() <= 0) {
+        if (ListUtils.isEmpty(array)) {
             for (int i = 0; i < beans.size(); i++) {
                 beans.get(i).setWorkSignin("");
                 beans.get(i).setOffSignin("");
@@ -702,16 +703,20 @@ public class SigninFragment extends EasyFragment implements View.OnClickListener
             for (int i = 0; i < beans.size(); i++) {
                 b = beans.get(i);
                 if (!StringUtils.isEmpty(b.getStartTime()) && !StringUtils.isEmpty(b.getEndTime())
-                        && e.compareTo(b.getStartTime()) > 0 && e.compareTo(b.getEndTime()) < 0) {
+                        && e.compareTo(b.getStartTime()) >= 0//该时间大于等于上班开始签到范围
+                        && e.compareTo(b.getEndTime()) <= 0) {//该时间小于下班结束签到范围
                     //在排版范围内
-                    if (!StringUtils.isEmpty(b.getWorkTime()) && e.compareTo(b.getStartTime()) > 0
+                    if (!StringUtils.isEmpty(b.getWorkTime()) &&
+                            e.compareTo(b.getStartTime()) >= 0
                             && e.compareTo(getEndSignin(b.getWorkTime(), true)) < 0) {
                         //在上班范围
                         if (StringUtils.isEmpty(b.getWorkSignin()) || e.compareTo(b.getWorkSignin()) < 0) {
                             beans.get(i).setWorkSignin(e);
                         }
                     }
-                    if (!StringUtils.isEmpty(b.getOffTime()) && e.compareTo(b.getEndTime()) < 0 && e.compareTo(getEndSignin(b.getOffTime(), false)) > 0) {
+                    if (!StringUtils.isEmpty(b.getOffTime()) &&
+                            e.compareTo(b.getEndTime()) <= 0 &&
+                            e.compareTo(getEndSignin(b.getOffTime(), false)) > 0) {
                         //在下班范围
                         if (StringUtils.isEmpty(b.getOffSignin()) || e.compareTo(b.getOffSignin()) > 0) {
                             beans.get(i).setOffSignin(e);
@@ -737,10 +742,10 @@ public class SigninFragment extends EasyFragment implements View.OnClickListener
         }
         if (adapter == null) {
             adapter = new SigninAdapter(ct);
-            adapter.setBeans(beans, isToday,selectTime);
+            adapter.setBeans(beans, isToday, selectTime);
             listview.setAdapter(adapter);
         } else {
-            adapter.setBeans(beans, isToday,selectTime);
+            adapter.setBeans(beans, isToday, selectTime);
             adapter.notifyDataSetChanged();
         }
     }

+ 7 - 4
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/SigninUtil.java

@@ -95,6 +95,7 @@ public class SigninUtil {
                     break;
                 case 0x17:
                     //符合打卡
+                    Log.i("gongpengming", "对的进来打卡");
                     CodeUtil.getInstance().getCode(MyApplication.getInstance(), "CardLog", new CodeUtil.OnCodeLinstener() {
                                 @Override
                                 public void callBack(String code) {
@@ -104,7 +105,8 @@ public class SigninUtil {
                     );
                     break;
                 case Constants.APP_SOCKETIMEOUTEXCEPTION://请求超时
-                    if (StringUtils.isEmpty(message)) {
+                    Log.i("gongpengming", "进来了");
+                    if (!StringUtils.isEmpty(message)) {
                         if (StringUtils.isInclude(message, "该设备不是考勤打卡常用设备")) {
                             getManage().sendNotification(MyApplication.getInstance(), "该设备不是考勤打卡常用设备,无法为您自动打卡", SigninActivity.class);
                         } else if (StringUtils.isInclude(message, "设备正处于申请变更绑定阶段")) {
@@ -148,11 +150,12 @@ public class SigninUtil {
             return;
         mission.setRealTime(TimeUtils.f_long_2_str(System.currentTimeMillis()));
         if (mission.getStatus() == 2)//如果是离开后的打卡
-        {//TODO 如果是结束该外勤,请求接口判断是否还有外勤计划,如果没有,计算并提示是否会公司进行签到
+        {
+            //TODO 如果是结束该外勤,请求接口判断是否还有外勤计划,如果没有,计算并提示是否会公司进行签到
+
         } else
             mission.setStatus(1);//打上卡了,进行中
-        MissionDao dao = new  MissionDao();
-        boolean saveOk = dao.updataOrCreate(mission);
+        boolean saveOk = MissionDao.getInstance().updataOrCreate(mission);
         if (saveOk)
             getManage().sendNotification(ct, "外勤签到成功", MissionPlanActivity.class);
     }

+ 161 - 178
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/alarm/AlarmManage.java

@@ -1,75 +1,83 @@
 package com.xzjmyk.pm.activity.ui.erp.util.alarm;
 
-import android.content.Context;
-import android.database.SQLException;
-import android.os.Handler;
-import android.os.Message;
 import android.util.Log;
 
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.xzjmyk.pm.activity.BdLocationHelper;
+import com.xzjmyk.pm.activity.AppConfig;
 import com.xzjmyk.pm.activity.MyApplication;
-import com.xzjmyk.pm.activity.R;
 import com.xzjmyk.pm.activity.bean.oa.SigninBean;
+import com.xzjmyk.pm.activity.db.dao.ErrorMagDao;
 import com.xzjmyk.pm.activity.db.dao.SigninDao;
-import com.xzjmyk.pm.activity.ui.erp.activity.oa.SigninActivity;
-import com.xzjmyk.pm.activity.ui.erp.net.ViewUtil;
-import com.xzjmyk.pm.activity.ui.erp.util.CodeUtil;
+import com.xzjmyk.pm.activity.ui.erp.entity.ErrorEntity;
+import com.xzjmyk.pm.activity.ui.erp.entity.MissionPlanEntity;
 import com.xzjmyk.pm.activity.ui.erp.util.CommonUtil;
+import com.xzjmyk.pm.activity.ui.erp.util.ListUtils;
 import com.xzjmyk.pm.activity.ui.erp.util.StringUtils;
 import com.xzjmyk.pm.activity.util.BaiduMapUtil;
 import com.xzjmyk.pm.activity.util.TimeUtils;
 
-import java.util.HashMap;
-import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Map;
-
-import static com.alibaba.fastjson.JSON.parseObject;
-import static com.xzjmyk.pm.activity.ui.erp.net.ViewUtil.ct;
 
 /**
- * 提醒管理器
- * Created by pengminggong on 2016/10/26.
+ * 关于提醒管理器(1.上班时间内离开办公地点  2.考勤提醒  3.自动签到外勤)
+ * <p>
+ * Created by Bitliker on 2016/11/18.
  */
-public class AlarmManage extends IAlarmManage {
-
-    private NotificationManage manage;
-    private SigninBean bean;
-    private boolean isWork;
-
-    private Handler handler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            String message = msg.getData().getString("result");
-            switch (msg.what) {
-                case 0x11:
-                    loadLog();
-                    break;
-                case 0x12:
-                    if (parseObject(message).containsKey("listdata")) {
-                        setDataByLogs(parseObject(message).getJSONArray("listdata"));
-                    }
-                    break;
-                default:
-                    break;
+public class AlarmManage {
+    /**
+     * 计算是否符合自动外勤,返回外勤列表中距离最小的对象,如果不符合,返回空
+     * 1.判断进行中的外勤计划,如果离开了签到最后一次,结束该计划
+     * 2.如果第一个不存在,判断获取最近的位置(包含已经结束的,防止定位不准问题)
+     *
+     * @param list 外勤列表数据
+     * @return
+     * @throws ClassCastException
+     */
+    public MissionPlanEntity reckonMission(List<MissionPlanEntity> list) throws ClassCastException {
+        int companyDistance = CommonUtil.getSharedPreferencesInt(MyApplication.getInstance(), AppConfig.ALARM_MISSION_DISTANCE, 500);
+        MissionPlanEntity minBean = null;
+        float minDistance = 0;
+        if (ListUtils.isEmpty(list)) {
+            return minBean;
+        }
+        for (MissionPlanEntity e : list) {
+            if (e.getLatLng() == null) continue;//定位不存在
+            //获取当前与目的地的距离
+            float distance = Float.valueOf(BaiduMapUtil.getInstence().getDistance(e.getLatLng()));
+            if (e.getStatus() == 1 && distance > companyDistance) {//1.判断进行中的外勤计划,如果离开了签到最后一次,结束该计划
+                Log.i("gongpengming", "符合外勤签退");
+                minBean = e;
+                minBean.setStatus(2);//结束该外勤
+                break;
+            } else if (distance < companyDistance) { //判断符合自动外勤
+                Log.i("gongpengming", "符合外勤签到");
+                if (minDistance <= 0 || minDistance > distance) {//2.如果第一个不存在,判断获取最近的位置
+                    minDistance = distance;
+                    minBean = e;
+                }
             }
         }
-    };
-
-
-    public AlarmManage() {
-        manage = new NotificationManage();
+        return minBean;
     }
 
-    private NotificationManage getManage() {
-        if (manage == null)
-            manage = new NotificationManage();
-        return manage;
+    //自动外勤提醒
+    public MissionPlanEntity alarmMission(List<MissionPlanEntity> list) throws ClassCastException {
+        //获取当天外勤计划
+        if (ListUtils.isEmpty(list)) {
+            return null;
+        }
+        for (MissionPlanEntity e : list) {
+            if (!StringUtils.isEmpty(e.getVisitTime()) &&
+                    //当前时间大于计划时间
+                    System.currentTimeMillis() > TimeUtils.f_str_2_long(e.getVisitTime())
+                    //没有签到过
+                    && StringUtils.isEmpty(e.getRealTime()) && e.getStatus() != 3) {
+                return e;
+            }
+        }
+        return null;
     }
 
-    //设置提醒
+    //自动打卡和提醒
     public int reckonNextAlarm() {
         //1.判断是否离开办公地点
 //        if (isOutoffWork()) {//离开办公地点
@@ -78,27 +86,25 @@ public class AlarmManage extends IAlarmManage {
 //        }
         boolean isAlarm = CommonUtil.getSharedPreferencesBoolean(MyApplication.getInstance(), "ALARMA_CLICK", false);//是否自动打卡
         boolean isAuto = CommonUtil.getSharedPreferencesBoolean(MyApplication.getInstance(), "AUTO_SIGNIN", true);//是否提醒
-        if (!isAlarm && !isAuto) return -1;
         long time = 0;
-        bean = getNextBean();
+        SigninBean bean = getNextBean();//获取当前所在班次的下班之前
         if (bean == null) return -1;
         if (isAuto) {
-            time = getNextWorkAuto(bean);//获取下一次自动上班打卡
-            Log.i("gongpengming", "获取下一次自动上班打卡时间为=" + TimeUtils.f_long_2_str(time));
-            if (time != 0 && Math.abs(System.currentTimeMillis() - time) <= 60000) {
+            time = getWorkAuto(bean);//获取下一次自动上班打卡
+            Log.i("gongpengming", "time=" + TimeUtils.f_long_2_str(time));//过期返回0
+            try {
+                saveMsg2DB(time);
+            } catch (Exception e) {
+
+            }
+            if (time != 0) {
                 //TODO 符合自动上班打卡
-//                SigninUtil util = new SigninUtil();
-//                util.autoSignin();
-//                doAutoSignin(true);
                 return 1;
             }
-            time = getNextOffAuto(bean);//获取下一次自动上班打卡
+            time = getOffAuto(bean);//获取下一次自动上班打卡
             Log.i("gongpengming", "获取下一次自动上班打卡=" + TimeUtils.f_long_2_str(time));
-            if (time != 0 && Math.abs(System.currentTimeMillis() - time) <= 60000) {
+            if (time != 0) {
                 //TODO 符合自动下班打卡
-//                SigninUtil util = new SigninUtil();
-//                util.autoSignin();
-//                doAutoSignin(false);
                 return 1;
             }
         }
@@ -108,7 +114,6 @@ public class AlarmManage extends IAlarmManage {
             Log.i("gongpengming", "获取上班提醒时间=" + TimeUtils.f_long_2_str(time));
             if (time != 0 && Math.abs(System.currentTimeMillis() - time) <= 60000) {
                 //TODO 符合上班提醒
-                getManage().sendNotification(MyApplication.getInstance(), "请按时上班打卡", SigninActivity.class);
                 bean.setWorkAlarm(bean.getWorkAlarm() + 1);
                 dao.updateByBrean(bean);
                 return 2;
@@ -117,139 +122,117 @@ public class AlarmManage extends IAlarmManage {
             Log.i("gongpengming", "获取下班提醒时间=" + TimeUtils.f_long_2_str(time));
             if (time != 0 && Math.abs(System.currentTimeMillis() - time) <= 60000) {
                 //TODO 符合下班提醒
-                getManage().sendNotification(MyApplication.getInstance(), "请按时下班打卡", SigninActivity.class);
                 bean.setOffAlarm(bean.getOffAlarm() + 1);
                 dao.updateByBrean(bean);
                 return 3;
             }
         }
-        return -1;
+        return 0;
     }
 
-    private void doAutoSignin(boolean isWork) {
-        this.isWork = isWork;
-        if (bean != null) {//已经签过卡了
-            if (isWork) {
-                if (!StringUtils.isEmpty(bean.getWorkSignin()) && !StringUtils.isEmpty(bean.getWorkTime())
-                        && bean.getWorkSignin().compareTo(bean.getWorkTime()) < 0)
-                    return;
-            } else {
-                if (!StringUtils.isEmpty(bean.getOffSignin()) && !StringUtils.isEmpty(bean.getOffTime())
-                        && bean.getOffSignin().compareTo(bean.getOffTime()) > 0)
-                    return;
-            }
-        }
-        CodeUtil.getInstance().getCode(MyApplication.getInstance(), "CardLog", new CodeUtil.OnCodeLinstener() {
-                    @Override
-                    public void callBack(String code) {
-                        doSignin(MyApplication.getInstance(), code);
-                    }
-                }
-        );
+    //5.判断是否离开工作范围
+    protected boolean isOutoffWork() {
+        if (!isWorkTime()) return false;
+        int comDistance = CommonUtil.getSharedPreferencesInt(MyApplication.getInstance(), "distance", 0);//规定距离
+        Log.i("gongpengming", "distance=" + comDistance);
+        return comDistance < Float.valueOf(BaiduMapUtil.getInstence().getDistance()) ? true : false;
     }
 
-    //签到
-    private void doSignin(Context ct, String code) {
-        Map<String, Object> param = new HashMap<>();
-        Map<String, Object> form = new HashMap<>();
-        form.put("cl_code", code);
-        form.put("cl_phone", MyApplication.getInstance().mLoginUser.getTelephone());
-        form.put("cl_emcode", CommonUtil.getSharedPreferences(ct, "erp_username"));
-        String emname = CommonUtil.getSharedPreferences(ct, "erp_emname");
-        if (StringUtils.isEmpty(emname)) {
-            emname = MyApplication.getInstance().mLoginUser.getNickName().trim();
-        }
-        form.put("cl_emname", emname);
-        boolean isp = isPlay(ct, form);
-        if (!isp) return;//不符合打卡
-        String formStore = StringUtils.mapToJson(form);
-        param.put("caller", "CardLog");
-        param.put("formStore", formStore);
-        String url = CommonUtil.getSharedPreferences(ct, "erp_baseurl") + "mobile/saveCardLog.action";
-        param.put("emcode", CommonUtil.getSharedPreferences(ct, "erp_username"));
-        LinkedHashMap<String, Object> headers = new LinkedHashMap<>();
-        headers.put("Cookie", "JSESSIONID=" + CommonUtil.getSharedPreferences(ct, "sessionId"));
-        ViewUtil.httpSendRequest(ct, url, param, handler, headers, 0x11, null, null, "get");
+
+    private void saveMsg2DB(long time) {
+        ErrorEntity entity = new ErrorEntity();
+        entity.setTitle("IAlarmManage");
+        entity.setTime(TimeUtils.f_long_2_str(System.currentTimeMillis()));
+        entity.setMsg("获取下一次自动上班打卡时间为=" + TimeUtils.f_long_2_str(time));
+        ErrorMagDao.getInstance().insert(entity);
     }
 
-    /*判断是否符合打卡*/
-    private boolean isPlay(Context ct, Map<String, Object> form) {
-        try {
-            //判断是否符合打卡
-            BdLocationHelper helper = MyApplication.getInstance().getBdLocationHelper();
-            form.put("cl_address", helper.getAddress());
-            form.put("cl_location", helper.getName());
-            int comDistance = CommonUtil.getSharedPreferencesInt(ct, "distance", 0);
-            String distance = BaiduMapUtil.getInstence().getDistance();
-            if (comDistance < Float.valueOf(distance)) {//规定地址<实际地址  不符合
-                helper.requestLocation();//当不符合时候提交定位,并不执行打卡签到
-                return false;
-            } else {
-                form.put("cl_distance", distance);
-                return true;
+
+    private SigninBean getNextBean() {
+        SigninDao dao = new SigninDao(MyApplication.getInstance());
+        List<SigninBean> list = dao.queryByEmcode();//获取所有班次
+        if (ListUtils.isEmpty(list)) return null;
+        long endTime = 0;
+        SigninBean minSignin = null;
+        for (SigninBean e : list) {
+            endTime = getTimeByHHmm(StringUtils.isEmpty(e.getEndTime()) ? e.getOffTime() : e.getEndTime());
+            if (System.currentTimeMillis() < endTime) {//当前时间在该班次结束之前
+                return e;
             }
-        } catch (NullPointerException e) {
-            return false;
-        } catch (SQLException e) {
-            return false;
-        }
+            if (minSignin == null) minSignin = e;
+            else if (StringUtils.isEmpty(minSignin.getWorkTime()) && StringUtils.isEmpty(minSignin.getWorkTime()) &&
+                    minSignin.getWorkTime().compareTo(e.getWorkTime()) > 0) minSignin = e;
+        }//当天班次无存在符合时间点
+        return null;
     }
 
-    //获取打卡记录 date:yyyy-MM-dd
-    private void loadLog() {
-        String date = TimeUtils.s_long_2_str(System.currentTimeMillis());
-        //获取网络数据
-        String url = CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_baseurl") + "mobile/oa/workdata.action";
-        Map<String, Object> param = new HashMap<>();
-        String code = CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_username");
-        param.put("currentMaster", CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_master"));
-        param.put("page", 1);
-        param.put("pageSize", 1000);
-        param.put("condition", "cl_emcode='" + code + "' and to_char(cl_time,'yyyy-MM-dd')='" + date + "'");
-        param.put("caller", "CardLog");
-        param.put("emcode", code);
-        param.put("master", CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_master"));
-        param.put("sessionUser", CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_username"));
-        param.put("sessionId", CommonUtil.getSharedPreferences(MyApplication.getInstance(), "sessionId"));
-        LinkedHashMap<String, Object> headers = new LinkedHashMap<>();
-        headers.put("Cookie", "JSESSIONID=" + CommonUtil.getSharedPreferences(ct, "sessionId"));
-        ViewUtil.httpSendRequest(MyApplication.getInstance(), url, param, handler, headers, 0x12, null, null, "get");
+
+    private long getNextWorkAlarm(SigninBean bean) {
+        if (bean == null || !StringUtils.isEmpty(bean.getWorkSignin()) || bean.getWorkAlarm() != 0 || StringUtils.isEmpty(bean.getWorkTime()))
+            return 0;
+        int difference = CommonUtil.getSharedPreferencesInt(MyApplication.getInstance(), "ALARM_WORK_TIME", 5);//上班提前xx分钟
+        return getTimeByHHmm(bean.getWorkTime()) - difference * 60000;
     }
 
-    //处理数据,获取到用户签到列表
-    private void setDataByLogs(JSONArray array) {
-        //取最后一个
-        JSONObject object = array.getJSONObject(array.size() - 1);
-        String time = object.getString("cl_time");//获取最后一次打卡信息,班次打卡信息
-        time = TimeUtils.clearDay(time);//获取到的
-        if (StringUtils.isEmpty(time)) return;
-        SigninDao dao = new SigninDao(MyApplication.getInstance());
-        if (bean != null) {
-            if (isWork && !StringUtils.isEmpty(bean.getStartTime()) && bean.getStartTime().compareTo(time) < 0
-                    && bean.getWorkTime().compareTo(time) > 0) {//打卡时间小于上班时间
-                bean.setWorkSignin(time);
-                getManage().sendNotification(MyApplication.getInstance(), R.string.auto_signin, SigninActivity.class);
-                dao.updateByBrean(bean);
-            } else if (!isWork && !StringUtils.isEmpty(bean.getEndTime()) && bean.getEndTime().compareTo(time) > 0
-                    && bean.getOffTime().compareTo(time) < 0) {
-                bean.setOffSignin(time);
-                dao.updateByBrean(bean);
-                getManage().sendNotification(MyApplication.getInstance(), R.string.auto_signin, SigninActivity.class);
-            }
+
+    private long getNextOffAlarm(SigninBean bean) {
+        if (bean == null || !StringUtils.isEmpty(bean.getOffSignin()) || bean.getOffAlarm() != 0 || StringUtils.isEmpty(bean.getOffTime()))
+            return 0;
+        int difference = CommonUtil.getSharedPreferencesInt(MyApplication.getInstance(), "ALARM_OFFWORK_TIME", 5);//下班延迟xx分钟
+        return getTimeByHHmm(bean.getOffTime()) + difference * 60000;
+    }
+
+
+    //获取上班打卡时间
+    private long getWorkAuto(SigninBean bean) {
+        if (bean == null || !StringUtils.isEmpty(bean.getWorkSignin())
+                || StringUtils.isEmpty(bean.getWorkTime()) ||
+                StringUtils.isEmpty(bean.getStartTime()))
+            return 0;
+        long workTime = getTimeByHHmm(bean.getWorkTime());
+        long startTime = getTimeByHHmm(bean.getStartTime());//上班范围+3分钟
+        if (startTime < System.currentTimeMillis() && workTime > System.currentTimeMillis()) {
+            return System.currentTimeMillis();
         } else {
-            List<SigninBean> beans = dao.queryByEmcode();
-            for (SigninBean e : beans) {
-                if (!StringUtils.isEmpty(e.getStartTime()) && !StringUtils.isEmpty(e.getEndTime()) && e.getStartTime().compareTo(time) < 0 && e.getEndTime().compareTo(time) > 0) {
-                    //在该班次内
-                    if (isWork) e.setWorkSignin(time);
-                    else e.setOffSignin(time);
-                    //TODO 保存数据库
-                    dao.updateByBrean(e);
-                    return;
-                }
-            }
+            return 0;
         }
+    }
 
+
+    //获取下班打卡时间
+    private long getOffAuto(SigninBean bean) {
+        if (bean == null || !StringUtils.isEmpty(bean.getOffSignin()) ||
+                StringUtils.isEmpty(bean.getOffTime()) ||
+                StringUtils.isEmpty(bean.getEndTime()))
+            return 0;
+        long workTime = getTimeByHHmm(bean.getOffTime());
+        long endTime = getTimeByHHmm(bean.getEndTime());//上班范围+3分钟
+        if (workTime < System.currentTimeMillis() && endTime > System.currentTimeMillis()) {
+            return System.currentTimeMillis();
+        } else {
+            return 0;
+        }
+    }
+
+
+    /*通过时分获取当天改时间时间戳*/
+    private long getTimeByHHmm(String time) {
+        if (StringUtils.isEmpty(time)) return 0;
+        String che = TimeUtils.s_long_2_str(System.currentTimeMillis()) + " " + time + ":00";//当天下班时间
+        return TimeUtils.f_str_2_long(che);
     }
 
+    /*当前是否在办公时间内*/
+    private boolean isWorkTime() {
+        try {
+            SigninBean bean = getNextBean();
+            //此语句判空处理有问题!!! Arison
+            if (!StringUtils.isEmpty(bean.getWorkTime()) && System.currentTimeMillis() > getTimeByHHmm(bean.getWorkTime()))
+                return true;
+            else return false;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
 }

+ 38 - 19
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/alarm/AlarmService.java

@@ -18,6 +18,7 @@ import com.baidu.mapapi.model.LatLng;
 import com.xzjmyk.pm.activity.AppConfig;
 import com.xzjmyk.pm.activity.MyApplication;
 import com.xzjmyk.pm.activity.db.dao.MissionDao;
+import com.xzjmyk.pm.activity.ui.erp.activity.oa.MissionPlanActivity;
 import com.xzjmyk.pm.activity.ui.erp.activity.oa.SigninActivity;
 import com.xzjmyk.pm.activity.ui.erp.entity.MissionPlanEntity;
 import com.xzjmyk.pm.activity.ui.erp.net.ViewUtil;
@@ -38,13 +39,12 @@ public class AlarmService extends Service {
     public static long intervalTime = 1 * 60 * 1000;//轮询时间间隔,初始化1分钟,外勤时候为6分钟
     public static int aralmType = 1;//提醒类型   1.内勤  2.外勤
     private AlarmTask alarmTask;
-    private IAlarmManage iManage;
+    private AlarmManage iManage;
     private NotificationManage manage;
 
     private BroadcastReceiver receiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
-            Log.i("gongpengming", "进来了");
             if (intent != null) {
                 loadIsMission();
             }
@@ -110,7 +110,7 @@ public class AlarmService extends Service {
         IntentFilter filter = new IntentFilter();
         filter.addAction("com.xzjmyk.pm.activity.ui.erp.util.alarm");
         registerReceiver(receiver, filter);
-        if (iManage == null) iManage = new IAlarmManage();
+        if (iManage == null) iManage = new AlarmManage();
         if (manage == null) manage = new NotificationManage();
         if (alarmTask == null) {
             alarmTask = new AlarmTask();
@@ -151,20 +151,27 @@ public class AlarmService extends Service {
             try {
                 while (true) {
                     if (aralmType == 1) {//内勤签到
+                        Log.i("gongpengming", "内勤签到计算");
                         //1.自动打卡  2.提醒上班   3.提醒下班
                         int i = getiManage().reckonNextAlarm();//获取签到还是提醒,当为-1时候为错误
-                        if (i != -1) {
+                        Log.i("gongpengming", "自动打卡i==" + i);
+                        if (i != -1 || i != 0) {
                             map.clear();
                             map.put("type", i);
                             publishProgress(map);
                         }
                     } else if (aralmType == 2) {//外勤签到
+                        Log.i("gongpengming", "进来外勤签到计算");
                         //判断是否自动外勤
                         boolean isAuto = CommonUtil.getSharedPreferencesBoolean(MyApplication.getInstance(), AppConfig.AUTO_MISSION, false);
                         //判断是否外勤提醒
                         boolean isAlarm = CommonUtil.getSharedPreferencesBoolean(MyApplication.getInstance(), AppConfig.ALARM_MISSION, false);
+                        List<MissionPlanEntity> plans = MissionDao.getInstance().queryByEnCode();
+                        if (ListUtils.isEmpty(plans)) Log.i("gongpengming", "plans是空");
+                        MissionPlanEntity mission = null;
                         if (isAuto) {
-                            MissionPlanEntity mission = getiManage().reckonMission();
+                            Log.i("gongpengming", "自动外勤");
+                            mission = getiManage().reckonMission(plans);
                             if (mission != null) {//如果返回不为空,打卡
                                 Log.i("gongpengming", "符合打卡");
                                 map.clear();
@@ -172,22 +179,26 @@ public class AlarmService extends Service {
                                 map.put("data", mission);
                                 publishProgress(map);
                             } else if (isAlarm) {//如果为空,且提醒
-                                boolean is = getiManage().alarmMission();
-                                if (is) {
+                                mission = getiManage().alarmMission(plans);
+                                if (mission != null) {
+                                    Log.i("gongpengming", "符合提醒");
                                     map.clear();
                                     map.put("type", 5);
+                                    map.put("data", mission);
                                     publishProgress(map);
                                 }
                             }
                         } else if (isAlarm) {//且提醒
-                            boolean is = getiManage().alarmMission();
-                            if (is) {
+                            mission = getiManage().alarmMission(plans);
+                            if (mission != null) {
                                 map.clear();
                                 map.put("type", 5);
+                                map.put("data", mission);
                                 publishProgress(map);
                             }
                         }
                     }
+                    Log.i("gongpengming", intervalTime / 1000 + "间隔时间");
                     Thread.sleep(intervalTime);
                 }
             } catch (InterruptedException e) {
@@ -217,11 +228,18 @@ public class AlarmService extends Service {
                         break;
                     case 4://自动外勤
                         MissionPlanEntity bean = (MissionPlanEntity) map.get("data");
-                        if (bean!=null)Log.i("gongpengming","不为空");
+                        if (bean != null) Log.i("gongpengming", "不为空");
                         util = new SigninUtil(bean);
                         util.missionSignin();
                         break;
                     case 5://外勤提醒
+                        MissionPlanEntity bean1 = (MissionPlanEntity) map.get("data");
+                        if (bean1 != null) Log.i("gongpengming", "不为空");
+                        boolean isOk = updateDB(bean1.getId(), 3);
+                        if (isOk)
+                            Log.i("gongpengming", "更新完成" + bean1.getCompanyName());
+                        getManage().sendNotification(MyApplication.getInstance(),
+                                "您的外勤" + bean1.getCompanyName() + "已到达时间", MissionPlanActivity.class);
                         break;
                     default:
                         break;
@@ -232,6 +250,7 @@ public class AlarmService extends Service {
         }
     }
 
+
     //获取是否有外勤计划
     private void loadIsMission() {
         net("mobile/yesornoplan.action", 0x11);
@@ -251,10 +270,15 @@ public class AlarmService extends Service {
         ViewUtil.httpSendRequest(MyApplication.getInstance(), url, param, handler, headers, what, null, null, "post");
     }
 
+    //更新数据库状态
+    private boolean updateDB(int id, int status) {
+        return MissionDao.getInstance().upStatus(id, status);
+    }
 
+    //处理获取的外勤计划数据
     private void handlerData(JSONArray array) {
         if (ListUtils.isEmpty(array)) {
-            aralmType = 1;//开启内勤打卡模式
+            aralmType = 1;//开启内勤打卡模式,获取到的外勤计划为空
             return; //获取到拜访计划数据
         }
         JSONObject object = null;
@@ -280,14 +304,9 @@ public class AlarmService extends Service {
             entities.add(entity);
         }
         if (!ListUtils.isEmpty(entities))
-            save2DB(entities);
+            MissionDao.getInstance().updataOrCreate(entities);
     }
 
-    //保存到数据库
-    private void save2DB(List<MissionPlanEntity> entities) {
-        MissionDao dao = new  MissionDao();
-        dao.updataOrCreate(entities);
-    }
 
     private NotificationManage getManage() {
         if (manage == null)
@@ -295,9 +314,9 @@ public class AlarmService extends Service {
         return manage;
     }
 
-    public IAlarmManage getiManage() {
+    public AlarmManage getiManage() {
         if (iManage == null)
-            iManage = new IAlarmManage();
+            iManage = new AlarmManage();
         return iManage;
     }
 }

+ 0 - 253
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/alarm/IAlarmManage.java

@@ -1,253 +0,0 @@
-package com.xzjmyk.pm.activity.ui.erp.util.alarm;
-
-import android.util.Log;
-
-import com.xzjmyk.pm.activity.AppConfig;
-import com.xzjmyk.pm.activity.MyApplication;
-import com.xzjmyk.pm.activity.bean.oa.SigninBean;
-import com.xzjmyk.pm.activity.db.dao.ErrorMagDao;
-import com.xzjmyk.pm.activity.db.dao.MissionDao;
-import com.xzjmyk.pm.activity.db.dao.SigninDao;
-import com.xzjmyk.pm.activity.ui.erp.activity.oa.TestActivity;
-import com.xzjmyk.pm.activity.ui.erp.entity.MissionPlanEntity;
-import com.xzjmyk.pm.activity.ui.erp.util.CommonUtil;
-import com.xzjmyk.pm.activity.ui.erp.util.ListUtils;
-import com.xzjmyk.pm.activity.ui.erp.util.StringUtils;
-import com.xzjmyk.pm.activity.util.BaiduMapUtil;
-import com.xzjmyk.pm.activity.util.TimeUtils;
-
-import java.util.List;
-
-/**
- * 关于提醒管理器(1.上班时间内离开办公地点  2.考勤提醒  3.自动签到外勤)
- * <p>
- * Created by Bitliker on 2016/11/18.
- */
-public class IAlarmManage {
-    /**
-     * 计算是否符合自动外勤,返回外勤列表中距离最小的对象,如果不符合,返回空
-     * 1.判断进行中的外勤计划,如果离开了签到最后一次,结束该计划
-     * 2.如果第一个不存在,判断获取最近的位置(包含已经结束的,防止定位不准问题)
-     *
-     * @return
-     * @throws ClassCastException
-     */
-    public MissionPlanEntity reckonMission() throws ClassCastException {
-        int companyDistance = CommonUtil.getSharedPreferencesInt(MyApplication.getInstance(), AppConfig.ALARM_MISSION_DISTANCE, 500);
-         MissionDao dao = new  MissionDao();
-        List<MissionPlanEntity> list = dao.queryByEnCode();
-        MissionPlanEntity minBean = null;
-        float minDistance = 0;
-        if (ListUtils.isEmpty(list)) {
-            return minBean;
-        }
-        for (MissionPlanEntity e : list) {
-            if (e.getLatLng() == null) continue;//定位不存在
-            //获取当前与目的地的距离
-            float distance = Float.valueOf(BaiduMapUtil.getInstence().getDistance(e.getLatLng()));
-            if (e.getStatus() == 1 && distance > companyDistance) {//1.判断进行中的外勤计划,如果离开了签到最后一次,结束该计划
-                Log.i("gongpengming", "符合外勤签退");
-                minBean = e;
-                minBean.setStatus(2);//结束该外勤
-                break;
-            } else if (distance < companyDistance) { //判断符合自动外勤
-                Log.i("gongpengming", "符合外勤签到");
-                if (minDistance <= 0 || minDistance > distance) {//2.如果第一个不存在,判断获取最近的位置
-                    minDistance = distance;
-                    minBean = e;
-                }
-            }
-        }
-        return minBean;
-    }
-
-    //自动外勤提醒
-    public boolean alarmMission() throws ClassCastException {
-       MissionDao dao = new  MissionDao();
-        //获取当天外勤计划
-        List<MissionPlanEntity> list = dao.queryByEnCode();
-        if (ListUtils.isEmpty(list)) {
-            return false;
-        }
-        for (MissionPlanEntity e : list) {
-            if (!StringUtils.isEmpty(e.getVisitTime()) &&
-                    //当前时间大于计划时间
-                    System.currentTimeMillis() > TimeUtils.f_str_2_long(e.getVisitTime())
-                    && StringUtils.isEmpty(e.getRealTime())) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    //自动打卡和提醒
-    public int reckonNextAlarm() {
-        //1.判断是否离开办公地点
-//        if (isOutoffWork()) {//离开办公地点
-//            getManage().sendNotification(MyApplication.getInstance(), R.string.outoff_work, SigninActivity.class);
-//            return;
-//        }
-
-        boolean isAlarm = CommonUtil.getSharedPreferencesBoolean(MyApplication.getInstance(), "ALARMA_CLICK", false);//是否自动打卡
-        boolean isAuto = CommonUtil.getSharedPreferencesBoolean(MyApplication.getInstance(), "AUTO_SIGNIN", true);//是否提醒
-        if (!isAlarm && !isAuto) return -1;
-        long time = 0;
-        SigninBean bean = getNextBean();
-        if (bean == null) return -1;
-        if (isAuto) {
-            time = getNextWorkAuto(bean);//获取下一次自动上班打卡
-            TestActivity.Bean b = new TestActivity.Bean();
-            b.time = TimeUtils.f_long_2_str(System.currentTimeMillis());
-            b.title = "IAlarmManage";
-            b.msg = "获取下一次自动上班打卡时间为=" + TimeUtils.f_long_2_str(time);
-            ErrorMagDao dao = new ErrorMagDao();
-            dao.insert(b);
-            Log.i("gongpengming", "获取下一次自动上班打卡时间为=" + TimeUtils.f_long_2_str(time));
-            if (time != 0 && Math.abs(System.currentTimeMillis() - time) <= 60000) {
-                //TODO 符合自动上班打卡
-                return 1;
-            }
-            time = getNextOffAuto(bean);//获取下一次自动上班打卡
-            Log.i("gongpengming", "获取下一次自动上班打卡=" + TimeUtils.f_long_2_str(time));
-            if (time != 0 && Math.abs(System.currentTimeMillis() - time) <= 60000) {
-                //TODO 符合自动下班打卡
-                return 1;
-            }
-        }
-        if (isAlarm) {
-            SigninDao dao = new SigninDao(MyApplication.getInstance());
-            time = getNextWorkAlarm(bean);//获取上班提醒时间
-            Log.i("gongpengming", "获取上班提醒时间=" + TimeUtils.f_long_2_str(time));
-            if (time != 0 && Math.abs(System.currentTimeMillis() - time) <= 60000) {
-                //TODO 符合上班提醒
-                bean.setWorkAlarm(bean.getWorkAlarm() + 1);
-                dao.updateByBrean(bean);
-                return 2;
-            }
-            time = getNextOffAlarm(bean);//获取下班提醒时间
-            Log.i("gongpengming", "获取下班提醒时间=" + TimeUtils.f_long_2_str(time));
-            if (time != 0 && Math.abs(System.currentTimeMillis() - time) <= 60000) {
-                //TODO 符合下班提醒
-                bean.setOffAlarm(bean.getOffAlarm() + 1);
-                dao.updateByBrean(bean);
-                return 3;
-            }
-        }
-        return -1;
-    }
-
-
-    //暴露接口
-    //1.获取下一个上班提醒时间戳
-    protected long getNextWorkAlarm() {
-        return getNextWorkAlarm(getNextBean());
-    }
-
-    //2.获取下一个下班提醒时间戳
-    protected long getNextOffAlarm() {
-
-        return getNextOffAlarm(getNextBean());
-    }
-
-    //3.获取下一个上班自动打卡时间时间戳(1.没有打过卡 2.在当前时间之内)
-    protected long getNextWorkAuto() {
-        return getNextWorkAuto(getNextBean());
-    }
-
-    //4.获取下一个下班自动打卡时间时间戳
-    protected long getNextOffAuto() {
-        return getNextOffAuto(getNextBean());
-    }
-
-    //5.判断是否离开工作范围
-    protected boolean isOutoffWork() {
-        if (!isWorkTime()) return false;
-        int comDistance = CommonUtil.getSharedPreferencesInt(MyApplication.getInstance(), "distance", 0);//规定距离
-        Log.i("gongpengming", "distance=" + comDistance);
-        return comDistance < Float.valueOf(BaiduMapUtil.getInstence().getDistance()) ? true : false;
-    }
-    //end暴露接口
-
-
-    protected SigninBean getNextBean() {
-        SigninDao dao = new SigninDao(MyApplication.getInstance());
-        List<SigninBean> list = dao.queryByEmcode();//获取所有班次
-        if (ListUtils.isEmpty(list)) return null;
-        long endTime = 0;
-        SigninBean minSignin = null;
-        for (SigninBean e : list) {
-            endTime = getTimeByHHmm(StringUtils.isEmpty(e.getEndTime()) ? e.getOffTime() : e.getEndTime());
-            if (System.currentTimeMillis() < endTime) {//当前时间在该班次结束之前
-                return e;
-            }
-            if (minSignin == null) minSignin = e;
-            else if (StringUtils.isEmpty(minSignin.getWorkTime()) && StringUtils.isEmpty(minSignin.getWorkTime()) &&
-                    minSignin.getWorkTime().compareTo(e.getWorkTime()) > 0) minSignin = e;
-        }//当天班次无存在符合时间点
-        return null;
-    }
-
-
-    protected long getNextWorkAlarm(SigninBean bean) {
-        if (bean == null || !StringUtils.isEmpty(bean.getWorkSignin()) || bean.getWorkAlarm() != 0 || StringUtils.isEmpty(bean.getWorkTime()))
-            return 0;
-        int difference = CommonUtil.getSharedPreferencesInt(MyApplication.getInstance(), "ALARM_WORK_TIME", 5);//上班提前xx分钟
-        return getTimeByHHmm(bean.getWorkTime()) - difference * 60000;
-    }
-
-
-    protected long getNextOffAlarm(SigninBean bean) {
-        if (bean == null || !StringUtils.isEmpty(bean.getOffSignin()) || bean.getOffAlarm() != 0 || StringUtils.isEmpty(bean.getOffTime()))
-            return 0;
-        int difference = CommonUtil.getSharedPreferencesInt(MyApplication.getInstance(), "ALARM_OFFWORK_TIME", 5);//下班延迟xx分钟
-        return getTimeByHHmm(bean.getOffTime()) + difference * 60000;
-    }
-
-
-    protected long getNextWorkAuto(SigninBean bean) {
-        if (bean == null || !StringUtils.isEmpty(bean.getWorkSignin()) || StringUtils.isEmpty(bean.getWorkTime()))
-            return 0;
-        int[] workTimes = {10, 8, 6, 4, 2};
-        long workTime = getTimeByHHmm(bean.getWorkTime());
-        for (int e : workTimes) {
-            long time = workTime - e * 60000;
-            if (System.currentTimeMillis() < time) return time;
-        }
-        return 0;
-    }
-
-
-    protected long getNextOffAuto(SigninBean bean) {
-        if (bean == null || !StringUtils.isEmpty(bean.getOffSignin()) || StringUtils.isEmpty(bean.getOffTime()))
-            return 0;
-        int[] offTimes = {4, 6, 8, 10, 12};
-        long workTime = getTimeByHHmm(bean.getOffTime());
-        for (int e : offTimes) {
-            long time = workTime + e * 60000;
-            if (System.currentTimeMillis() < time) return time;
-        }
-        return 0;
-    }
-
-
-    /*通过时分获取当天改时间时间戳*/
-    protected long getTimeByHHmm(String time) {
-        if (StringUtils.isEmpty(time)) return 0;
-        String che = TimeUtils.s_long_2_str(System.currentTimeMillis()) + " " + time + ":00";//当天下班时间
-        return TimeUtils.f_str_2_long(che);
-    }
-
-    /*当前是否在办公时间内*/
-    protected boolean isWorkTime() {
-        try {
-            SigninBean bean = getNextBean();
-            //此语句判空处理有问题!!! Arison
-            if (!StringUtils.isEmpty(bean.getWorkTime()) && System.currentTimeMillis() > getTimeByHHmm(bean.getWorkTime()))
-                return true;
-            else return false;
-        } catch (Exception e) {
-            e.printStackTrace();
-            return false;
-        }
-    }
-}

+ 2 - 1
WeiChat/src/main/res/layout/fragment_me.xml

@@ -493,7 +493,8 @@
             android:id="@+id/test_rl"
             style="@style/IMTbleLine_UP_Me"
             android:layout_marginTop="7dp"
-            android:background="@drawable/selector_me_menu_item_bg">
+            android:background="@drawable/selector_me_menu_item_bg"
+            android:visibility="gone">
 
             <TextView
                 android:layout_width="wrap_content"

+ 1 - 1
WeiChat/src/main/res/values/strings.xml

@@ -18,7 +18,7 @@
     </string-array>
     <string name="delete_item">确定要删除吗</string>
     <string name="out_net_signin">网络未连接,无法自动为您签到</string>
-    <string name="too_long_signin">当前位置距离考勤地点太远,打卡失败</string>
+    <string name="too_long_signin">当前位置距离考勤地点太远或没有获取到办公地址,打卡失败</string>
     <string name="add_company_name">请选择或输入公司名称</string>
     <string name="add_company_addr">请选择或输入公司地址</string>
     <string name="updata">更新</string>