FANGLH 9 лет назад
Родитель
Сommit
329b8d144d

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

@@ -38,12 +38,11 @@ public class MissionDao {
     }
 
     public MissionDao() {
-
+        helper = new DBOpenHelper(MyApplication.getInstance());
     }
 
 
     public boolean upStatus(int id, int status) {
-        helper = new DBOpenHelper(MyApplication.getInstance());
         SQLiteDatabase db = null;
         long i = 0;
         try {
@@ -70,7 +69,6 @@ public class MissionDao {
 
     //获取当天全部数据
     public List<MissionPlanEntity> queryByEnCode() {
-        helper = new DBOpenHelper(MyApplication.getInstance());
         SQLiteDatabase db = null;
         Cursor cursor = null;
         List<MissionPlanEntity> missions = null;
@@ -119,7 +117,6 @@ 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 {//创建
@@ -127,11 +124,74 @@ public class MissionDao {
         }
     }
 
+//    public boolean updataOrCreate(List<MissionPlanEntity> entities) {
+//        List<MissionPlanEntity> chche = queryByEnCode();
+//        if (ListUtils.isEmpty(chche)) return insertAll(entities);
+//        else {
+//
+//
+//        }
+//        return insertAll(entities);
+//    }
+
+
     public boolean updataOrCreate(List<MissionPlanEntity> entities) {
-        helper = new DBOpenHelper(MyApplication.getInstance());
-        return insertAll(entities);
+        if (ListUtils.isEmpty(entities)) return false;
+        show("updataOrCreate");
+        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();
+            db.beginTransaction();//开启事务
+            ContentValues values = null;
+            for (MissionPlanEntity mission : entities) {
+                show("MissionPlanEntity");
+                //对象为空或是拜访时间没有情况下不插入数据库
+                if (mission == null || StringUtils.isEmpty(mission.getVisitTime())) {
+                    show("进来的是这打上");
+                    continue;
+                }
+                values = new ContentValues();
+                values.put("id", mission.getId());
+                values.put("master", master);
+                values.put("emcode", emcode);
+                values.put("company", mission.getCompanyName());
+                values.put("companyAddr", mission.getCompanyAddr());
+                if (mission.getLatLng() != null) {
+                    values.put("latitude", mission.getLatLng().latitude);
+                    values.put("longitude", mission.getLatLng().longitude);
+                }
+                values.put("visittime", mission.getVisitTime());
+                values.put("realvisitTime", mission.getRealTime());
+                values.put("realLeaveTime", mission.getRealLeave());
+                values.put("status", 0);
+                values.put("date", getDateByString(mission.getVisitTime()));//拜访日期
+                i = db.insert(tibleName, null, values);
+                if (i == -1) {
+                    String where = "master=? and emcode=? and id=? ";
+                    String[] whereArgs = {master, emcode, String.valueOf(mission.getId())};
+                    i = db.update(tibleName, values, where, whereArgs);
+                    show("update i=" + i);
+                }
+                show("i====" + i);
+            }
+            db.setTransactionSuccessful();
+        } catch (android.database.SQLException e) {
+            show("SQLException=" + e.getMessage());
+        } catch (Exception e) {
+            show("Exception=" + e.getMessage());
+        } finally {
+            db.endTransaction();
+            if (db != null)
+                db.close();
+            return i > 0;
+        }
     }
 
+
     private boolean insertAll(List<MissionPlanEntity> entities) {
         show("insertAll");
         SQLiteDatabase db = null;
@@ -306,4 +366,28 @@ public class MissionDao {
             return clearOk;
         }
     }
+
+
+    public boolean clearAll(long date) {
+        SQLiteDatabase db = null;
+        boolean clearOk = false;
+        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();
+            String where = "master=? and emcode=? and date=?";
+            String[] whereArg = {master, emcode, TimeUtils.s_long_2_str(date)};
+            int i = db.delete(tibleName, where, whereArg);
+            clearOk = i > 0;
+        } catch (SQLException e) {
+            if (e != null)
+                show("clearAll SQLException" + e.getMessage());
+        } catch (Exception e) {
+            if (e != null)
+                show("clearAll Exception" + e.getMessage());
+        } finally {
+            return clearOk;
+        }
+    }
 }

+ 47 - 21
WeiChat/src/main/java/com/xzjmyk/pm/activity/db/dao/WorkModelDao.java

@@ -42,9 +42,9 @@ public class WorkModelDao {
      *
      * @param models
      */
-    public void createOrUpdata(List<WorkModel> models, long logTime) {
-        List<WorkModel> chche = query(true, TimeUtils.s_long_2_str(System.currentTimeMillis()));
-        if (ListUtils.isEmpty(chche)) insert(models, logTime);
+    public void createOrUpdata(List<WorkModel> models) {
+        List<WorkModel> chche = query(true);
+        if (ListUtils.isEmpty(chche)) insert(models);
         else {
             List<WorkModel> update = new ArrayList<>();
             List<WorkModel> delete = new ArrayList<>();
@@ -79,9 +79,9 @@ public class WorkModelDao {
                     }
                 }
             }
-            delete(delete,logTime);
-            insert(models, logTime);
-            update(update,logTime);
+            delete(delete);
+            insert(models);
+            update(update);
         }
 
     }
@@ -91,15 +91,15 @@ public class WorkModelDao {
      * 获取数据库中全部数据
      *
      * @param allSignin 是否包含迟到和早退情况
-     * @param date      日期  yyyy-MM-dd
      * @return
      */
-    public List<WorkModel> query(boolean allSignin, String date) {
+    public List<WorkModel> query(boolean allSignin) {
         List<WorkModel> models = new ArrayList<>();
         DBOpenHelper helper = null;
         SQLiteDatabase db = null;
         Cursor c = null;
         try {
+            String date = TimeUtils.s_long_2_str(System.currentTimeMillis());
             String emCode = CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_username");
             String master = CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_master");
             if (StringUtils.isEmpty(emCode) || StringUtils.isEmpty(master)) return null;
@@ -133,7 +133,7 @@ public class WorkModelDao {
                         offSignin = "";
                 }
                 model = new WorkModel(workStart, workTime, workend, workSignin, offStart,
-                        offTime, offend, offSignin, leaveAlarm, workAlarm, offAlarm,date);
+                        offTime, offend, offSignin, leaveAlarm, workAlarm, offAlarm, date);
                 models.add(model);
             }
         } catch (Exception e) {
@@ -149,7 +149,13 @@ public class WorkModelDao {
     }
 
 
-    private long insert(List<WorkModel> models, long logTime) {
+    /**
+     * 插入数据
+     *
+     * @param models 数据列表
+     * @return
+     */
+    private long insert(List<WorkModel> models) {
         if (ListUtils.isEmpty(models)) return 0;
         DBOpenHelper helper = null;
         SQLiteDatabase db = null;
@@ -157,7 +163,7 @@ public class WorkModelDao {
         try {
             String emCode = CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_username");
             String master = CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_master");
-            String date = TimeUtils.s_long_2_str(logTime);
+            String date = TimeUtils.s_long_2_str(System.currentTimeMillis());
             if (StringUtils.isEmpty(emCode) || StringUtils.isEmpty(master)) return 0;
             helper = new DBOpenHelper(MyApplication.getInstance());
             db = helper.getWritableDatabase();
@@ -204,7 +210,13 @@ public class WorkModelDao {
     }
 
 
-    private long delete(List<WorkModel> models, long logTime) {
+    /**
+     * 删除数据
+     *
+     * @param models 对应数据列表
+     * @return
+     */
+    private long delete(List<WorkModel> models) {
         DBOpenHelper helper = null;
         SQLiteDatabase db = null;
         long i = 0;
@@ -221,9 +233,9 @@ public class WorkModelDao {
                         StringUtils.isEmpty(e.getOffStart()) || StringUtils.isEmpty(e.getOffTime()) || StringUtils.isEmpty(e.getOffend()))
                     continue;
                 String where = "emCode=? and master=?  and workStart=? and workTime=?" +
-                        " and workend=? and offStart=? and offTime=? and offend=? and date=?";
+                        " and workend=? and offStart=? and offTime=? and offend=? ";
                 String[] whereArg = {"emCode", "master", e.getWorkStart(), e.getWorkTime(), e.getWorkend()
-                        , e.getOffStart(), e.getOffTime(), e.getOffend(),TimeUtils.s_long_2_str(logTime)};
+                        , e.getOffStart(), e.getOffTime(), e.getOffend()};
                 i = db.delete(TIBLE_NAME, where, whereArg);
             }
             db.setTransactionSuccessful();
@@ -237,7 +249,9 @@ public class WorkModelDao {
         }
     }
 
-    private long deleteAll(String date) {
+    public long clearAll(long date) {
+        if (date <= 0) return -1;
+        Log.i("gongpengming", "date=" + TimeUtils.s_long_2_str(date));
         DBOpenHelper helper = null;
         SQLiteDatabase db = null;
         long i = 0;
@@ -248,7 +262,7 @@ public class WorkModelDao {
             helper = new DBOpenHelper(MyApplication.getInstance());
             db = helper.getWritableDatabase();
             String where = "emCode=? and master=?  and date=?";
-            String[] whereArg = {"emCode", "master", date};
+            String[] whereArg = {"emCode", "master", TimeUtils.s_long_2_str(date)};
             i = db.delete(TIBLE_NAME, where, whereArg);
         } catch (Exception e) {
 
@@ -259,7 +273,13 @@ public class WorkModelDao {
         }
     }
 
-    private long update(List<WorkModel> models,long logTime) {
+    /**
+     * 更新数据   事务
+     *
+     * @param models 更新数据列表
+     * @return
+     */
+    private long update(List<WorkModel> models) {
         if (ListUtils.isEmpty(models)) return 0;
         DBOpenHelper helper = null;
         SQLiteDatabase db = null;
@@ -290,9 +310,9 @@ public class WorkModelDao {
                 else values.put("offSignin", e.getOffSignin());
 
                 String where = "emCode=? and master=?  and workStart=? and workTime=?" +
-                        " and workend=? and offStart=? and offTime=? and offend=? and date=?";
+                        " and workend=? and offStart=? and offTime=? and offend=? ";
                 String[] whereArg = {emCode, master, e.getWorkStart(), e.getWorkTime(), e.getWorkend()
-                        , e.getOffStart(), e.getOffTime(), e.getOffend(),TimeUtils.s_long_2_str(logTime)};
+                        , e.getOffStart(), e.getOffTime(), e.getOffend()};
                 i = db.update(TIBLE_NAME, values, where, whereArg);
             }
             db.setTransactionSuccessful();
@@ -307,7 +327,13 @@ public class WorkModelDao {
         }
     }
 
-    public long update(WorkModel models, long logtime) {
+    /**
+     * 更新一行数据   签到后使用
+     *
+     * @param models
+     * @return
+     */
+    public long update(WorkModel models) {
         if (models == null) return 0;
         DBOpenHelper helper = null;
         SQLiteDatabase db = null;
@@ -338,7 +364,7 @@ public class WorkModelDao {
                     " and workend=? and offStart=? and offTime=? and offend=? and date=?";
 
             String[] whereArg = {"emCode", "master", models.getWorkStart(), models.getWorkTime(), models.getWorkend()
-                    , models.getOffStart(), models.getOffTime(), models.getOffend(), TimeUtils.s_long_2_str(logtime)};
+                    , models.getOffStart(), models.getOffTime(), models.getOffend(), TimeUtils.s_long_2_str(System.currentTimeMillis())};
             i = db.update(TIBLE_NAME, values, where, whereArg);
         } catch (Exception e) {
         } finally {

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

@@ -21,7 +21,6 @@ import com.xzjmyk.pm.activity.ui.erp.entity.ErrorEntity;
 import com.xzjmyk.pm.activity.ui.erp.model.WorkModel;
 import com.xzjmyk.pm.activity.ui.erp.util.ListUtils;
 import com.xzjmyk.pm.activity.ui.erp.util.StringUtils;
-import com.xzjmyk.pm.activity.util.TimeUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -58,7 +57,7 @@ public class TestActivity extends BaseActivity implements View.OnClickListener {
     public void onClick(View view) {
         switch (view.getId()) {
             case R.id.error_list:
-                List<WorkModel> models = WorkModelDao.getInstance().query(true, TimeUtils.s_long_2_str(System.currentTimeMillis()));
+                List<WorkModel> models = WorkModelDao.getInstance().query(true );
                 if (ListUtils.isEmpty(models)) {
                     show("models  为空");
                 } else {

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

@@ -24,7 +24,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.baidu.mapapi.search.core.PoiInfo;
 import com.lidroid.xutils.ViewUtils;
 import com.lidroid.xutils.view.annotation.ViewInject;
-import com.xzjmyk.pm.activity.AppConfig;
 import com.xzjmyk.pm.activity.BdLocationHelper;
 import com.xzjmyk.pm.activity.MyApplication;
 import com.xzjmyk.pm.activity.R;
@@ -125,7 +124,6 @@ public class SigninFragment extends EasyFragment implements View.OnClickListener
                         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");
                         companyY = Double.parseDouble(jsonObject.containsKey("latitude") ? (StringUtils.isEmpty(jsonObject.getString("latitude")) ? "0" : jsonObject.getString("latitude")) : "0");
-
                         PreferenceUtils.putFloat("longitude", (float) companyX);
                         PreferenceUtils.putFloat("latitude", (float) companyY);
                         PreferenceUtils.putInt("distance", companyDistance);
@@ -321,16 +319,7 @@ public class SigninFragment extends EasyFragment implements View.OnClickListener
                 getActivity().overridePendingTransition(R.anim.anim_activity_back_in, R.anim.anim_activity_back_out);
                 break;
             case R.id.signin_btn:
-                if (!AppConfig.COMPANY) {
-                    if (!AppConfig.COMPANY) {
-                        CodeUtil.getInstance().getCode(ct, "CardLog", new CodeUtil.OnCodeLinstener() {
-                            @Override
-                            public void callBack(String code) {
-                                doSigninByNotCompany(code);
-                            }
-                        });
-                    }
-                } else if (isPlay()) {
+                if (isPlay()) {
                     if (!CommonUtil.isNetWorkConnected(ct)) {
                         Crouton.makeText(ct, "当前网络不可用,请检查网络连接", Style.holoRedLight, 2000);
                         return;
@@ -812,6 +801,7 @@ public class SigninFragment extends EasyFragment implements View.OnClickListener
 
     //签到
     private void doSignin(String code) {
+        ct.progressDialog.show();
         isSignining = true;
         signin_btn.setFocusable(false);
         String url = "mobile/saveCardLog.action";
@@ -835,34 +825,6 @@ public class SigninFragment extends EasyFragment implements View.OnClickListener
         loadNet(url, param, 0x13);
     }
 
-    private void doSigninByNotCompany(String code) {
-        isSignining = true;
-        signin_btn.setFocusable(false);
-        String url = "mobile/saveCardLog.action";
-        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);
-        if (distance > companyDistance) {
-            form.put("cl_location", "英唐大厦");
-            form.put("cl_distance", Math.random() * 100);
-            form.put("cl_address", "中国广东省深圳市南山区科技南五路5");
-        } else {
-            form.put("cl_location", loaction);
-            form.put("cl_distance", distance);
-            form.put("cl_address", addr);
-        }
-        String formStore = StringUtils.mapToJson(form);
-        param.put("caller", "CardLog");
-        param.put("formStore", formStore);
-        loadNet(url, param, 0x13);
-    }
 
     //请求合并,抽取共同代码
     private void loadNet(String urlCheche, Map<String, Object> param, int what) {

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

@@ -47,6 +47,7 @@ import static com.xzjmyk.pm.activity.util.PreferenceUtils.getBoolean;
  * 0x12:打卡列表
  * Created by Bitliker on 2016/11/25.
  */
+@Deprecated
 public class SigninUtil {
     private NotificationManage notificationManage;
     private Context ct;

+ 166 - 9
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/attendance/AutoErpService.java

@@ -12,17 +12,39 @@ import android.os.IBinder;
 import android.util.Log;
 
 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.db.dao.SigningDao;
+import com.xzjmyk.pm.activity.db.dao.WorkModelDao;
+import com.xzjmyk.pm.activity.ui.erp.entity.MissionPlanEntity;
+import com.xzjmyk.pm.activity.ui.erp.model.WorkModel;
+import com.xzjmyk.pm.activity.ui.erp.util.CommonInterfaceUtil;
+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 java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
+import static com.xzjmyk.pm.activity.util.PreferenceUtils.getBoolean;
+
 /**
  * 自动Erp服务,开启线程
  */
-public class AutoErpService extends Service {
+public class AutoErpService extends Service implements CacheAutoUtil.OnLoadListener {
+    public static final int STATUS_SIGNING = 0x11;//自动打卡
+    public static final int STATUS_WORK_ALARM = 0x12;//上班提醒
+    public static final int STATUS_OFF_ALARM = 0x13;//下班提醒
+    public static final int STATUS_MISSION = 0x14;//外勤签到
+    public static final int STATUS_LEAVE_ALARM = 0x15;//离开提醒
+
 
+    private CacheAutoUtil cacheAutoUtil;//工具类
+    private ReckonAutoUtil reckonAutoUtil;
+    private boolean isAlarm;//是否打卡提醒
+    private boolean isAuto;//是否自动打卡
+    private long intervalTime = 1 * 60 * 1000;//计算循环的时间
+    private int iter = 0;
     private final String[] flags = {
 
     };
@@ -33,6 +55,7 @@ public class AutoErpService extends Service {
         }
     };
 
+
     @Override
     public IBinder onBind(Intent intent) {
         throw new UnsupportedOperationException("Not yet implemented");
@@ -43,7 +66,7 @@ public class AutoErpService extends Service {
         try {
             initBroadcast();
             initDB();
-            initNet();
+            init();
             initTask();
         } catch (Exception e) {
             e.printStackTrace();
@@ -82,24 +105,141 @@ public class AutoErpService extends Service {
     /**
      * 初始化数据库
      */
-    private void initDB() throws Exception {
-        //刚进来时候清空数据库,
-        SigningDao.getInstance().clearAll();
-        MissionDao.getInstance().clearAll();
+    private void initDB() {
+        //  刚进来时候清空昨天数据
+        try {
+            WorkModelDao.getInstance().clearAll(System.currentTimeMillis() - 24 * 60 * 60 * 1000);
+            MissionDao.getInstance().clearAll(System.currentTimeMillis() - 24 * 60 * 60 * 1000);
+        } catch (Exception e) {
+            if (e != null)
+                log("initDB Exception=" + e.getMessage());
+        }
     }
 
     /**
      * 初始化网络请求
      */
-    private void initNet() {
+    private void init() {
+        initWork();
+        initMission();
+//        getCacheUtil().loadhasMission();//判断是否还有外勤计划
+    }
 
+    private void initMission() {
+        CommonInterfaceUtil commonInterfaceUtil = new CommonInterfaceUtil();
+        commonInterfaceUtil.getOutSetInfo(new CommonInterfaceUtil.OnResultListener() {
+            @Override
+            public void result(int code, String result) {
+                boolean isNeedAutoOut = getBoolean(AppConfig.AUTO_MISSION, false);
+                if (isNeedAutoOut) {
+                    getCacheUtil().loadMissionPlan();//缓存外勤计划列表
+                } else {
+                    try {
+                        //如果不是自动外勤,清空数据库今天的数据
+                        MissionDao.getInstance().clearAll(System.currentTimeMillis());
+                    } catch (Exception e) {
+                        if (e != null)
+                            log("initNet Exception=" + e.getMessage());
+                    }
+                }
+            }
+        });
+    }
+
+    private void initWork() {
+        //判断是否是自动打卡
+        //是否自动打卡
+        isAlarm = CommonUtil.getSharedPreferencesBoolean(MyApplication.getInstance(), AppConfig.ALARMA_CLICK, false);
+        //是否提醒
+        isAuto = CommonUtil.getSharedPreferencesBoolean(MyApplication.getInstance(), AppConfig.AUTO_SIGNIN, true);
+        if (isAlarm || isAuto) {
+            getCacheUtil().validatorMac();//缓存是否是本人mac地址
+            getCacheUtil().loadWorkData();//缓存打卡班次列表
+        } else {
+            try {
+                //如果不是自动打卡和提醒,清空数据库今天的数据
+                WorkModelDao.getInstance().clearAll(System.currentTimeMillis());
+            } catch (Exception e) {
+                if (e != null)
+                    log("initNet Exception=" + e.getMessage());
+            }
+        }
+    }
+
+
+    @Override
+    public void loadOk(boolean saveOk, int flag) {
     }
 
+    @Override
+    public void loadError(int flag, String message) {
+
+    }
+
+
     //开启异步任务
     private class AutoAsyncTask extends AsyncTask<Void, Map<String, Object>, Void> {
         @Override
         protected Void doInBackground(Void... voids) {
-            return null;
+            try {
+                while (true) {
+                    Map<String, Object> map = null;
+                    if (isCanMission()) {
+                        List<MissionPlanEntity> plans = MissionDao.getInstance().queryByEnCode();
+                        if (iter % 6 == 0 && !ListUtils.isEmpty(plans)) {
+                            log("自动外勤");
+                            //符合外勤判断
+                            //判断是否自动外勤
+                            boolean isAuto = getBoolean(AppConfig.AUTO_MISSION, false);
+                            if (isAuto) {
+                                MissionPlanEntity mission = getReckonAutoUtil().reckonMission(plans);
+                                if (mission != null) {
+                                    map.clear();
+                                    map.put("type", STATUS_MISSION);
+                                    map.put("data", mission);
+                                    publishProgress(map);
+                                }
+                            }
+                        }
+
+                    }
+                    if (isCanWork()) {
+                        if (isAuto) {
+                            WorkModel model = getReckonAutoUtil().reckonAutoWork();
+                            if (model != null) {
+                                //TODO 打卡
+                                map = new HashMap<>();
+                                map.put("type", STATUS_SIGNING);
+                                map.put("data", model);
+                                publishProgress(map);
+                            }
+                        } else if (isAlarm) {
+                            int type = getReckonAutoUtil().reckonAlarm(intervalTime);
+                            if (type == 1) {
+                                map = new HashMap<>();
+                                map.put("type", STATUS_LEAVE_ALARM);
+                                publishProgress(map);
+                            } else if (type == 2) {
+                                map = new HashMap<>();
+                                map.put("type", STATUS_WORK_ALARM);
+                                publishProgress(map);
+                            } else if (type == 2) {
+                                map = new HashMap<>();
+                                map.put("type", STATUS_OFF_ALARM);
+                                publishProgress(map);
+                            }
+                        }
+                    }
+                    iter++;
+                    Thread.sleep(intervalTime);
+                }
+            } catch (Exception e) {
+                if (e != null)
+                    log("AutoAsyncTask Exception=" + e.getMessage());
+            } finally {
+                return null;
+            }
+
         }
 
         @Override
@@ -108,6 +248,23 @@ public class AutoErpService extends Service {
         }
     }
 
+    private ReckonAutoUtil getReckonAutoUtil() {
+        if (reckonAutoUtil == null) reckonAutoUtil = new ReckonAutoUtil();
+        return reckonAutoUtil;
+    }
+
+    private CacheAutoUtil getCacheUtil() {
+        if (cacheAutoUtil == null) cacheAutoUtil = new CacheAutoUtil(this);
+        return cacheAutoUtil;
+    }
+
+    private boolean isCanMission() {
+        return true;
+    }
+
+    private boolean isCanWork() {
+        return true;
+    }
 
     /**
      * 打印信息方法

+ 117 - 50
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/attendance/CacheAutoUtil.java

@@ -6,9 +6,12 @@ import android.util.Log;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+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.db.dao.WorkModelDao;
+import com.xzjmyk.pm.activity.ui.erp.entity.MissionPlanEntity;
 import com.xzjmyk.pm.activity.ui.erp.model.WorkModel;
 import com.xzjmyk.pm.activity.ui.erp.util.CommonUtil;
 import com.xzjmyk.pm.activity.ui.erp.util.ListUtils;
@@ -20,6 +23,7 @@ import com.xzjmyk.pm.activity.util.TimeUtils;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import static com.xzjmyk.pm.activity.ui.erp.util.CommonUtil.getSharedPreferences;
@@ -35,17 +39,21 @@ public class CacheAutoUtil implements HttpHandler.OnResultListener {
     private final int MAC_VAL = 0x13;//判断mac地址
     private final int HAVE_OUT_PLAN = 0x14;//判断是否还有外勤
     private final int LOAD_PLAN = 0x15;//外勤计划
+    private OnLoadListener onLoadListener;
 
-
-
-    public CacheAutoUtil() {
+    public CacheAutoUtil(OnLoadListener onLoadListener) {
+        this.onLoadListener = onLoadListener;
     }
 
-
     @Override
     public void result(int what, boolean isJSON, String message, Bundle bundle) {
         try {
-            handlerSuccess(what, isJSON, message, bundle);
+            if (isJSON) {
+                JSONObject object = JSON.parseObject(message);
+                handlerSuccess(what, object, bundle);
+            } else {
+                //TODO 返回不是json数据的情况
+            }
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -54,20 +62,21 @@ public class CacheAutoUtil implements HttpHandler.OnResultListener {
     @Override
     public void error(int what, int statuCode, String message, Bundle bundle) {
         try {
+            //TODO 返回错误时候
+
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
 
     /**
-     * 获取打卡班次 net
+     * 获取打卡班次,为了自动打卡,只缓存当天的数据 net
      */
-    public void loadWorkData(long time) {
+    public void loadWorkData() {
         Map<String, Object> param = new HashMap<>();
-        param.put("date", TimeUtils.int_long_2_str(time));
+        param.put("date", TimeUtils.int_long_2_str(System.currentTimeMillis()));
         param.put("emcode", getSharedPreferences(MyApplication.getInstance(), "erp_username"));
         Bundle bundle = new Bundle();
-        bundle.putLong("time", time);
         HttpHandler.getInstance().loadERPByNet(WORK_DATA, "mobile/getWorkDate.action", param, bundle, this);
     }
 
@@ -106,7 +115,7 @@ public class CacheAutoUtil implements HttpHandler.OnResultListener {
     /**
      * 获取是否有外勤计划 net
      */
-    public void loadIsMission() {
+    public void loadhasMission() {
         Map<String, Object> param = new HashMap<>();
         param.put("emcode", CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_username"));
         HttpHandler.getInstance().
@@ -123,34 +132,48 @@ public class CacheAutoUtil implements HttpHandler.OnResultListener {
                 loadERPByNet(LOAD_PLAN, "mobile/mobileoutplan.action", param, null, this);
     }
 
-    /*************************************
+    /*****************
      * 处理数据
-     * ********************************************
+     ********************/
+
+    /**
+     * 当访问网络获取数据成功
      *
-     * @param what
-     * @param isJSON
-     * @param message
-     * @param bundle
+     * @param what   请求标识
+     * @param object json对象
+     * @param bundle bundle对象
+     * @throws Exception
      */
-    private void handlerSuccess(int what, boolean isJSON, String message, Bundle bundle) throws Exception {
+    private void handlerSuccess(int what, JSONObject object, Bundle bundle) throws Exception {
         switch (what) {
             case WORK_DATA://打卡班次
-                long time = System.currentTimeMillis();
-                if (bundle != null) time = bundle.getLong("time");
-                handlerWorkData(isJSON, message, time);
+                handlerWorkData(object);
                 break;
             case WORK_LOG://打卡列表
-                long logTime = System.currentTimeMillis();
                 ArrayList<WorkModel> models = null;
                 if (bundle != null) models = bundle.getParcelableArrayList("models");
-                if (bundle != null) logTime = bundle.getLong("time");
-                handlerWorkLog(isJSON, message, models,logTime);
+                handlerWorkLog(object, models);
                 break;
             case MAC_VAL://判断mac地址
+                String emcode = CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_username");
+                PreferenceUtils.putBoolean("MAC" + emcode, true);
                 break;
             case HAVE_OUT_PLAN://判断是否还有外勤
+                if (!object.containsKey("success") || !object.getBoolean("success")) return;
+                if (object.containsKey("isOffline")) {
+                    int isOffline = Integer.valueOf(object.getString("isOffline"));
+                    //当判断到外勤计划为有值  1.外勤计划有  2.自动外勤
+                    PreferenceUtils.putBoolean(AppConfig.HAVE_OUT_PLAN, isOffline > 0);
+                }
                 break;
             case LOAD_PLAN://外勤计划
+                JSONArray array = null;
+                if (object.get("data") instanceof JSONArray) {
+                    array = object.getJSONArray("data");
+                } else if (object.get("success") instanceof JSONArray) {
+                    array = object.getJSONArray("success");
+                }
+                handlerMission(array);
                 break;
         }
     }
@@ -159,13 +182,9 @@ public class CacheAutoUtil implements HttpHandler.OnResultListener {
     /**
      * 处理打卡签到
      *
-     * @param isJSON
-     * @param message
-     * @param time
+     * @param object json对象
      */
-    private void handlerWorkData(boolean isJSON, String message, long time) throws Exception {
-        if (!isJSON) return;
-        JSONObject object = JSON.parseObject(message);
+    private void handlerWorkData(JSONObject object) throws Exception {
         double longitude = 0, latitude = 0;
         int distance = 0;
         boolean comaddressset = object.getBooleanValue("comaddressset");
@@ -202,7 +221,7 @@ public class CacheAutoUtil implements HttpHandler.OnResultListener {
         if (ListUtils.isEmpty(models)) {
             return;
         }
-        loadLog(models, time);
+        loadLog(models, System.currentTimeMillis());
     }
 
     /**
@@ -249,19 +268,10 @@ public class CacheAutoUtil implements HttpHandler.OnResultListener {
     /**
      * 处理打卡签到列表,建议在线程钟使用
      *
-     * @param isJSON  是否是json数据
-     * @param message 返回信息
-     * @param models  获取班次信息时候的数据
-     * @param logTime
+     * @param models 获取班次信息时候的数据
      * @throws Exception
      */
-    private void handlerWorkLog(boolean isJSON, String message, ArrayList<WorkModel> models, long logTime) throws Exception {
-        if (!isJSON || ListUtils.isEmpty(models)) {
-            //TODO 数据为空,容错处理
-            log("ListUtils.isEmpty(models) 数据为空,容错处理");
-            return;
-        }
-        JSONObject object = JSON.parseObject(message);
+    private void handlerWorkLog(JSONObject object, ArrayList<WorkModel> models) throws Exception {
         JSONArray listdata = object.getJSONArray("listdata");
         if (ListUtils.isEmpty(listdata)) {
             //TODO 数据为空,容错处理
@@ -293,7 +303,53 @@ public class CacheAutoUtil implements HttpHandler.OnResultListener {
             }
         }
         //保存数据库
-        WorkModelDao.getInstance().createOrUpdata(models,logTime);
+        WorkModelDao.getInstance().createOrUpdata(models);
+    }
+
+    /**
+     * 解析处理外勤计划列表并保存到数据库
+     *
+     * @param array
+     */
+    private void handlerMission(JSONArray array) throws Exception {
+        if (ListUtils.isEmpty(array)) {
+            //TODO 外勤计划列表为空情况
+            return; //获取到拜访计划数据
+        }
+        JSONObject object = null;
+        MissionPlanEntity entity = null;
+        List<MissionPlanEntity> entities = new ArrayList<>();
+        for (int i = 0; i < array.size(); i++) {
+            object = array.getJSONObject(i);
+            entity = new MissionPlanEntity();
+            entity.setId(object.getInteger("MPD_ID"));
+            entity.setCompanyName(object.getString("MPD_COMPANY"));
+            entity.setCompanyAddr(object.getString("MPD_ADDRESS"));
+            double longitude = object.getDoubleValue("MD_LONGITUDE");
+            double latitude = object.getDoubleValue("MD_LATITUDE");
+            if (longitude > 0 && latitude > 0) {
+                entity.setLatLng(new LatLng(latitude, longitude));
+            }
+            if (object.containsKey("MPD_ARRIVEDATE")) {
+                entity.setVisitTime(object.getString("MPD_ARRIVEDATE"));
+            } else if (object.containsKey("TO_CHAR(MPD_ARRIVEDATE,'YYYY-MM-DDHH24:MI:SS')")) {
+                entity.setVisitTime(object.getString("TO_CHAR(MPD_ARRIVEDATE,'YYYY-MM-DDHH24:MI:SS')"));
+            }
+            try {
+                long mpd_actdate = object.getLongValue("MPD_ACTDATE");
+                long mpd_outdate = object.getLongValue("MPD_OUTDATE");
+                if (mpd_actdate != 0)
+                    entity.setRealTime(TimeUtils.f_long_2_str(mpd_actdate));
+                if (mpd_outdate != 0)
+                    entity.setRealLeave(TimeUtils.f_long_2_str(mpd_outdate));
+            } catch (Exception e) {
+            }
+            entity.setStatus(0);
+            entities.add(entity);
+        }
+        if (!ListUtils.isEmpty(entities))
+            MissionDao.getInstance().updataOrCreate(entities);
+
     }
 
 
@@ -310,14 +366,6 @@ public class CacheAutoUtil implements HttpHandler.OnResultListener {
         return TimeUtils.long2str(time, "HH:mm");
     }
 
-    public interface LoadListener {
-        //正确信息
-        void loadOk(String message);
-
-        //错误信息
-        void loadError(String message);
-    }
-
 
     private String getMinTime(String time) {
         if (StringUtils.isEmpty(time)) {
@@ -327,6 +375,25 @@ public class CacheAutoUtil implements HttpHandler.OnResultListener {
         }
     }
 
+
+    public interface OnLoadListener {
+        /**
+         * 下拉正确时候
+         *
+         * @param saveOk 是否保存成功
+         * @param flag   标识位
+         */
+        void loadOk(boolean saveOk, int flag);
+
+        /**
+         * 处理错误情况
+         *
+         * @param flag    标识位
+         * @param message 错误原因
+         */
+        void loadError(int flag, String message);
+    }
+
     private void log(String message) {
         try {
             if (!AppConfig.DEBUG || StringUtils.isEmpty(message)) return;

+ 192 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/attendance/ReckonAutoUtil.java

@@ -0,0 +1,192 @@
+package com.xzjmyk.pm.activity.ui.erp.util.attendance;
+
+import android.util.Log;
+
+import com.xzjmyk.pm.activity.AppConfig;
+import com.xzjmyk.pm.activity.MyApplication;
+import com.xzjmyk.pm.activity.db.dao.WorkModelDao;
+import com.xzjmyk.pm.activity.ui.erp.entity.MissionPlanEntity;
+import com.xzjmyk.pm.activity.ui.erp.model.WorkModel;
+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.PreferenceUtils;
+import com.xzjmyk.pm.activity.util.TimeUtils;
+
+import java.util.List;
+
+/**
+ * 计算自动外勤和自动打卡工具类
+ * Created by Bitliker on 2016/12/13.
+ */
+public class ReckonAutoUtil {
+
+    /**
+     * 计算是否符合自动外勤,返回外勤列表中距离最小的对象,如果不符合,返回空
+     * 1.判断进行中的外勤计划,如果离开了签到最后一次,结束该计划
+     * 2.如果第一个不存在,判断获取最近的位置(包含已经结束的,防止定位不准问题)
+     *
+     * @param list 外勤列表数据
+     * @return
+     * @throws ClassCastException
+     */
+    public MissionPlanEntity reckonMission(List<MissionPlanEntity> list) throws ClassCastException {
+        int companyDistance = PreferenceUtils.getInt(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;//定位不存在
+            //获取当前与目的地的距离
+            if (e.getStatus() == 2) continue;
+            float distance = Float.valueOf(BaiduMapUtil.getInstence().getDistance(e.getLatLng()));
+            if (distance > companyDistance && !StringUtils.isEmpty(e.getRealTime())) {
+                //1.判断进行中的外勤计划,如果离开了签到最后一次,结束该计划
+                log("符合外勤签退");
+                minBean = e;
+                minBean.setStatus(2);//结束该外勤
+                break;
+            } else if (distance < companyDistance) { //判断符合自动外勤
+                log("符合外勤签到");
+                if (minDistance <= 0 || minDistance > distance) {//2.如果第一个不存在,判断获取最近的位置
+                    minDistance = distance;
+                    minBean = e;
+                    minBean.setStatus(1);
+                }
+            }
+        }
+        return minBean;
+    }
+
+
+    /**
+     * 计算自动打卡
+     */
+    public WorkModel reckonAutoWork() {
+        WorkModel model = getPlaceWork();
+        if (model == null) return null;
+        if (StringUtils.isEmpty(model.getWorkStart()) || StringUtils.isEmpty(model.getWorkTime()) ||
+                StringUtils.isEmpty(model.getWorkend()) || StringUtils.isEmpty(model.getOffStart()) ||
+                StringUtils.isEmpty(model.getOffTime()) || StringUtils.isEmpty(model.getOffend()))
+            return null;
+        long workStart = getTimeByHHmm(model.getWorkStart());
+        long workEnd = getTimeByHHmm(model.getWorkTime());
+        long offStart = getTimeByHHmm(model.getOffTime());
+        long offEnd = getTimeByHHmm(model.getOffend());
+        if ((workStart < System.currentTimeMillis() && workEnd > System.currentTimeMillis()) ||
+                (offStart < System.currentTimeMillis() && offEnd > System.currentTimeMillis()))
+            return model;
+        return null;
+    }
+
+    /**
+     * 计算是否符合提醒
+     *
+     * @param intervalTime
+     * @return
+     */
+    public int reckonAlarm(long intervalTime) {
+        WorkModel model = getPlaceWork();
+        if (model == null) return 0;
+        if (isOutoffWork(model)) return 1;
+        long time = getWorkAlarm(model);
+        if (time != 0 && Math.abs(System.currentTimeMillis() - time) <= intervalTime) {
+            model.setWorkAlarm(true);
+            long i = WorkModelDao.getInstance().update(model);
+            if (i > 0)
+                return 2;
+        }
+        time = getOffAlarm(model);
+        if (time != 0 && Math.abs(System.currentTimeMillis() - time) <= intervalTime) {
+            model.setOffAlarm(true);
+            long i = WorkModelDao.getInstance().update(model);
+            if (i > 0)
+                return 3;
+        }
+        return 0;
+    }
+
+
+    //获取当前所处于的班次
+    public WorkModel getPlaceWork() {
+        List<WorkModel> models = WorkModelDao.getInstance().query(false);//获取当天所有班次,去除迟到和早退签到数据
+        if (ListUtils.isEmpty(models)) return null;
+        for (WorkModel m : models) {
+            if (StringUtils.isEmpty(m.getOffend()) || StringUtils.isEmpty(m.getWorkStart()))
+                continue;
+            long start = getTimeByHHmm(m.getWorkStart());
+            long end = getTimeByHHmm(m.getOffend());
+            if (end > System.currentTimeMillis() && start < System.currentTimeMillis()) return m;
+        }
+        return null;
+    }
+
+
+    private long getWorkAlarm(WorkModel model) {
+        if (model == null || !StringUtils.isEmpty(model.getWorkSignin()) || model.isWorkAlarm() || StringUtils.isEmpty(model.getWorkTime()))
+            return 0;
+        int difference = CommonUtil.getSharedPreferencesInt(MyApplication.getInstance(), "ALARM_WORK_TIME", 5);//上班提前xx分钟
+        return getTimeByHHmm(model.getWorkTime()) - difference * 60000;
+    }
+
+
+    private long getOffAlarm(WorkModel model) {
+        if (model == null || !StringUtils.isEmpty(model.getOffSignin()) || model.isOffAlarm() || StringUtils.isEmpty(model.getOffTime()))
+            return 0;
+        int difference = CommonUtil.getSharedPreferencesInt(MyApplication.getInstance(), "ALARM_OFFWORK_TIME", 5);//下班延迟xx分钟
+        return getTimeByHHmm(model.getOffTime()) + difference * 60000;
+    }
+
+
+    /*通过时分获取当天改时间时间戳*/
+    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);
+    }
+
+    //5.判断是否离开工作范围
+    protected boolean isOutoffWork(WorkModel model) {
+        if (!isWorkTime(model)) return false;
+        int comDistance = PreferenceUtils.getInt(MyApplication.getInstance(), "distance", 0);//规定距离
+        if (comDistance == 0) return false;
+        boolean is = comDistance < BaiduMapUtil.getInstence().getDistance() && !model.isLeaveAlarm();
+        if (is) {
+            model.setLeaveAlarm(true);
+            WorkModelDao.getInstance().update(model);
+        }
+        return is;
+    }
+
+    /*当前是否在办公时间内*/
+    private boolean isWorkTime(WorkModel model) {
+        try {
+            //此语句判空处理有问题!!! Arison
+            if (getTimeByHHmm(model.getWorkTime()) < System.currentTimeMillis() && getTimeByHHmm(model.getOffTime()) > System.currentTimeMillis())
+                return true;
+            else return false;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 打印信息方法
+     *
+     * @param message 信息内容
+     */
+    private void log(String message) {
+        try {
+            if (!AppConfig.DEBUG || StringUtils.isEmpty(message)) return;
+            Log.i("gongpengming", message);
+        } catch (Exception e) {
+            if (e != null)
+                Log.i("gongpengming", "log Exception=" + e.getMessage());
+        }
+    }
+}