Bitlikr пре 9 година
родитељ
комит
c4cba242ba
29 измењених фајлова са 1265 додато и 332 уклоњено
  1. 1 2
      WeiChat/src/main/java/com/xzjmyk/pm/activity/db/dao/MissionDao.java
  2. 11 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/db/dao/WorkModelDao.java
  3. 6 5
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/DestinationActivity.java
  4. 55 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/MissionActivity.java
  5. 9 10
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/OAActivity.java
  6. 2 2
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/OutofficeSetActivity.java
  7. 17 3
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/TestActivity.java
  8. 8 4
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/WorkActivity.java
  9. 49 71
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/presenter/MissionPresenter.java
  10. 71 58
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/presenter/WorkPresenter.java
  11. 25 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/presenter/imp/IAutoErp.java
  12. 0 17
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/presenter/imp/ISave.java
  13. 8 12
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/presenter/imp/IWorkPresenter.java
  14. 1 1
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/presenter/imp/IWorkView.java
  15. 201 118
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/attendance/AutoErpService.java
  16. 722 0
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/attendance/AutoErpSigninUitl.java
  17. 29 7
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/attendance/ReckonAutoUtil.java
  18. 2 1
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/auto/AlarmService.java
  19. 1 5
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/auto/HttpHandler.java
  20. BIN
      WeiChat/src/main/res/drawable-xhdpi/add_address.png
  21. BIN
      WeiChat/src/main/res/drawable-xhdpi/icon_all_mission.png
  22. BIN
      WeiChat/src/main/res/drawable-xhdpi/icon_emind.png
  23. BIN
      WeiChat/src/main/res/drawable-xhdpi/icon_last_missiom.png
  24. BIN
      WeiChat/src/main/res/drawable-xxhdpi/add_address.png
  25. BIN
      WeiChat/src/main/res/drawable-xxhdpi/icon_all_mission.png
  26. BIN
      WeiChat/src/main/res/drawable-xxhdpi/icon_emind.png
  27. BIN
      WeiChat/src/main/res/drawable-xxhdpi/icon_last_missiom.png
  28. 45 14
      WeiChat/src/main/res/layout/item_aims_base.xml
  29. 2 2
      WeiChat/src/main/res/values/gpm_values.xml

+ 1 - 2
WeiChat/src/main/java/com/xzjmyk/pm/activity/db/dao/MissionDao.java

@@ -149,12 +149,11 @@ public class MissionDao {
                 values.put("visittime", mission.getVisitTime());
                 values.put("realvisitTime", mission.getRealTime());
                 values.put("realLeaveTime", mission.getRealLeave());
-                values.put("status", 0);
                 values.put("distance", mission.getDistance());
                 values.put("location", mission.getLocation());
                 values.put("recorddate", mission.getRecorddate());
                 values.put("date", getDateByString(mission.getVisitTime()));//拜访日期
-                i = db.insert(tibleName, null, values);
+                i = db.insert(tibleName, "status", values);
                 if (i == -1) {
                     String where = "master=? and emcode=? and id=? ";
                     String[] whereArgs = {master, emcode, String.valueOf(mission.getId())};

+ 11 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/db/dao/WorkModelDao.java

@@ -11,6 +11,7 @@ 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.ui.tool.ThreadUtil;
 import com.xzjmyk.pm.activity.util.TimeUtils;
 
 import java.util.ArrayList;
@@ -37,6 +38,16 @@ public class WorkModelDao {
     private WorkModelDao() {
     }
 
+    public boolean insteByThread(final List<WorkModel> models) {
+        ThreadUtil.getInstance().addTask(new Runnable() {
+            @Override
+            public void run() {
+                createOrUpdata(models);
+            }
+        });
+        return false;
+    }
+
     /**
      * 从网络下载数据并添加到数据库
      *

+ 6 - 5
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/DestinationActivity.java

@@ -259,10 +259,11 @@ public class DestinationActivity extends BaseActivity {
             }
             String company = entity.getCompanyName();
             if (!StringUtils.isEmpty(company) && entity.getStatus() == 2) {
-                String text = "将 " + company + " 加入常用地址";
+                String text = "将 " + company;
                 int start = text.indexOf(company.charAt(0));
                 SpannableStringBuilder style = new SpannableStringBuilder(text);
-                style.setSpan(new TextAppearanceSpan(MyApplication.getInstance(), R.style.text_color), start, company.length() + start, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+                style.setSpan(new TextAppearanceSpan(MyApplication.getInstance(), R.style.text_color),
+                        start, company.length() + start, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                 holder.add_tv.setText(style);
                 holder.add_tv.setOnClickListener(new View.OnClickListener() {
                     @Override
@@ -277,9 +278,9 @@ public class DestinationActivity extends BaseActivity {
             if (entity.getStatus() != 2) {
                 holder.company_tv.setText(getNotNull(entity.getCompanyName()));
                 holder.companyaddr_tv.setText(getNotNull(entity.getCompanyAddr()));
-                holder.visit_num_tv.setText("拜访次数:" + entity.getVisitcount());
-                holder.last_time_tv.setText("上次拜访时间:" + entity.getVisitTime());
-                holder.long_tv.setText("距离:" + BaiduMapUtil.getInstence().getDistance(entity.getLatLng()) + "m");
+                holder.visit_num_tv.setText("总拜访 " + entity.getVisitcount() + "次");
+                holder.last_time_tv.setText("上次拜访 " + entity.getVisitTime());
+                holder.long_tv.setText(BaiduMapUtil.getInstence().getDistance(entity.getLatLng()) + "m");
             }
             return view;
         }

+ 55 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/MissionActivity.java

@@ -3,12 +3,15 @@ package com.xzjmyk.pm.activity.ui.erp.activity.oa;
 import android.content.Intent;
 import android.os.Bundle;
 import android.support.v7.widget.RecyclerView;
+import android.view.Menu;
+import android.view.MenuItem;
 import android.view.View;
 
 import com.baidu.mapapi.model.LatLng;
 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.MyApplication;
 import com.xzjmyk.pm.activity.R;
 import com.xzjmyk.pm.activity.ui.base.BaseActivity;
@@ -19,7 +22,9 @@ import com.xzjmyk.pm.activity.ui.erp.presenter.imp.IMission;
 import com.xzjmyk.pm.activity.ui.erp.presenter.imp.IMissionPresenter;
 import com.xzjmyk.pm.activity.ui.erp.util.ListUtils;
 import com.xzjmyk.pm.activity.ui.erp.util.StringUtils;
+import com.xzjmyk.pm.activity.ui.erp.util.auto.AlarmService;
 import com.xzjmyk.pm.activity.util.BaiduMapUtil;
+import com.xzjmyk.pm.activity.util.PreferenceUtils;
 import com.xzjmyk.pm.activity.util.TimeUtils;
 import com.xzjmyk.pm.activity.view.MostLinearLayoutManager;
 import com.xzjmyk.pm.activity.view.crouton.Crouton;
@@ -34,6 +39,8 @@ public class MissionActivity extends BaseActivity implements View.OnClickListene
     public int position;//调转指针
     private IMissionPresenter presenter;
     private MissionAdapter adapter;
+    private int flag;
+    private boolean adminStatus;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -44,12 +51,39 @@ public class MissionActivity extends BaseActivity implements View.OnClickListene
         initEvent();
     }
 
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        getMenuInflater().inflate(R.menu.menu_outoffice, menu);
+        return super.onCreateOptionsMenu(menu);
+    }
+
+    @Override
+    public void onBackPressed() {
+        endActivity();
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        if (item.getItemId() == android.R.id.home) {
+            endActivity();
+            return true;
+        } else if (item.getItemId() == R.id.title) {
+            Intent intent = new Intent(ct, MissionSetActivity.class);
+            intent.putExtra(AppConfig.IS_ADMIN, adminStatus);
+            startActivityForResult(intent, 0x20);
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
     private void initEvent() {
         findViewById(R.id.click_btn).setOnClickListener(this);
         findViewById(R.id.additem_tv).setOnClickListener(this);
     }
 
     private void initView() {
+        if (getIntent() != null)
+            flag = getIntent().getIntExtra("flag", 0);
+        adminStatus = getIntent() == null ? false : getIntent().getBooleanExtra(AppConfig.IS_ADMIN, false);
         adapter = new MissionAdapter(this, this);
         recycler.setLayoutManager(new MostLinearLayoutManager(ct));
         recycler.setAdapter(adapter);
@@ -58,6 +92,27 @@ public class MissionActivity extends BaseActivity implements View.OnClickListene
     }
 
 
+    private void endActivity() {
+        //更新外勤计划 TODO 先这样定 后期修改缓存方式
+        sendBroadcast(new Intent(AlarmService.UPDATA_MISSION_PLAN));
+        boolean isAuto = PreferenceUtils.getBoolean(AppConfig.AUTO_MISSION, false);
+        if (isAuto) {
+            setResult(0x20);
+            finish();
+        } else {
+            if (flag == 1) {
+                //启动手动外勤
+                Intent intent = new Intent(ct, OutofficeActivity.class);
+                intent.putExtra(AppConfig.IS_ADMIN, true);//上传管理员状态
+                startActivity(intent);
+                finish();
+            } else if (flag == 2) {
+                setResult(0x20);
+                finish();
+            }
+        }
+    }
+
     @Override
     public void showLoading() {
         progressDialog.show();

+ 9 - 10
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/OAActivity.java

@@ -748,25 +748,24 @@ public class OAActivity extends BaseActivity implements View.OnClickListener, Wo
                 startActivityForResult(intent, 0x11);
                 break;
             case R.id.signin://打卡签到
-                startActivity(new Intent(activity, SigninActivity.class));
-//                startActivity(new Intent(activity, WorkActivity.class));
+//                startActivity(new Intent(activity, SigninActivity.class));
+                startActivity(new Intent(activity, WorkActivity.class));
                 break;
             case R.id.outoffice:  //外勤签到
                 boolean is = PreferenceUtils.getBoolean(AppConfig.AUTO_MISSION, false);
                 Log.i("gongpengming", "isAuto=" + is);
-                intent = new Intent(activity, MissionActivity.class);
-//                if (is && AppConfig.IS_MISSION) {
+                if (is && AppConfig.IS_MISSION) {
 //                    intent = new Intent(activity, MissionPlanActivity.class);
-//                    intent.putExtra("flag", 1);
-//                } else {
-//                    intent = new Intent(activity, OutofficeActivity.class);
-//                }
+                    intent = new Intent(activity, MissionActivity.class);
+                    intent.putExtra("flag", 1);
+                } else {
+                    intent = new Intent(activity, OutofficeActivity.class);
+                }
                 intent.putExtra(AppConfig.IS_ADMIN, adminStatus > 0);//上传管理员状态
                 startActivity(intent);
                 break;
             case R.id.meeting://会议管理
-//                startActivity(new Intent(activity, MeetingActivity.class));
-                startActivity(new Intent(activity, WorkActivity.class));
+                startActivity(new Intent(activity, MeetingActivity.class));
                 break;
             case R.id.worklog://工作日志
                 startActivity(new Intent(activity, WorkDailyAddActivity.class));

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

@@ -124,7 +124,7 @@ public class OutofficeSetActivity extends BaseActivity {
 
 
     private void initview() {
-        mission_rl.setVisibility( AppConfig.IS_MISSION? View.VISIBLE : View.GONE);
+        mission_rl.setVisibility(AppConfig.IS_MISSION ? View.VISIBLE : View.GONE);
         Intent intent = getIntent();
         if (intent != null) {
             isImage.setChecked(intent.getBooleanExtra("isImage", false));
@@ -219,7 +219,7 @@ public class OutofficeSetActivity extends BaseActivity {
             @Override
             public void result(int code, String result) {
                 if (isAuto) {
-                    Intent intent = new Intent(ct, MissionPlanActivity.class);
+                    Intent intent = new Intent(ct, MissionActivity.class);
                     intent.putExtra("flag", 2);
                     intent.putExtra(AppConfig.IS_ADMIN, true);//上传管理员状态
                     startActivityForResult(intent, 0x20);

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

@@ -1,6 +1,5 @@
 package com.xzjmyk.pm.activity.ui.erp.activity.oa;
 
-import android.content.Intent;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.LayoutInflater;
@@ -15,9 +14,11 @@ import com.lidroid.xutils.ViewUtils;
 import com.lidroid.xutils.view.annotation.ViewInject;
 import com.xzjmyk.pm.activity.AppConfig;
 import com.xzjmyk.pm.activity.R;
+import com.xzjmyk.pm.activity.db.dao.MissionDao;
 import com.xzjmyk.pm.activity.db.dao.WorkModelDao;
 import com.xzjmyk.pm.activity.ui.base.BaseActivity;
 import com.xzjmyk.pm.activity.ui.erp.entity.ErrorEntity;
+import com.xzjmyk.pm.activity.ui.erp.model.MissionModel;
 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;
@@ -66,7 +67,6 @@ public class TestActivity extends BaseActivity implements View.OnClickListener {
                         show("getOffTime" + m.getOffTime());
                         show("getWorkStart" + m.getWorkStart());
                         show("getWorkSignin" + m.getWorkSignin());
-
                         show("getOffTime" + m.getOffTime());
                         show("getOffSignin" + m.getOffSignin());
                         show("getOffend" + m.getOffend());
@@ -76,7 +76,21 @@ public class TestActivity extends BaseActivity implements View.OnClickListener {
                 }
                 break;
             case R.id.test_btn:
-                startActivity(new Intent(ct, WorkActivity.class));
+                List<MissionModel> models = MissionDao.getInstance().queryByEnCode();
+                if (ListUtils.isEmpty(models)) {
+                    show("models  为空");
+                } else {
+                    for (MissionModel m : models) {
+                        show("getCompanyName" + m.getCompanyName());
+                        show("getCompanyAddr" + m.getCompanyAddr());
+                        show("getStatus" + m.getStatus());
+                        show("getLocation" + m.getLocation());
+                        show("getDistance" + m.getDistance());
+                        show("getRecorddate" + m.getRecorddate());
+                        show("getVisitTime" + m.getVisitTime());
+                        show("__________________________________");
+                    }
+                }
                 break;
         }
     }

+ 8 - 4
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/WorkActivity.java

@@ -20,7 +20,6 @@ import com.xzjmyk.pm.activity.ui.base.BaseActivity;
 import com.xzjmyk.pm.activity.ui.erp.adapter.WorkAdapter;
 import com.xzjmyk.pm.activity.ui.erp.model.WorkModel;
 import com.xzjmyk.pm.activity.ui.erp.presenter.WorkPresenter;
-import com.xzjmyk.pm.activity.ui.erp.presenter.imp.IWorkPresenter;
 import com.xzjmyk.pm.activity.ui.erp.presenter.imp.IWorkView;
 import com.xzjmyk.pm.activity.ui.erp.util.CommonUtil;
 import com.xzjmyk.pm.activity.ui.erp.util.ListUtils;
@@ -56,7 +55,7 @@ public class WorkActivity extends BaseActivity implements View.OnClickListener,
     private WorkAdapter adapter;
 
     private boolean isToday = true;
-    private IWorkPresenter presenter;
+    private WorkPresenter presenter;
     private String macAddress;
     private String macError;//变更mac地址
     private long selectTime;
@@ -92,11 +91,11 @@ public class WorkActivity extends BaseActivity implements View.OnClickListener,
     private void initView() {
         selectTime = System.currentTimeMillis();
         getMac();
-        presenter = new WorkPresenter(this);
+        presenter = new WorkPresenter(this, macAddress);
         adapter = new WorkAdapter(ct);
         listview.setLayoutManager(new LinearLayoutManager(ct));
         listview.setAdapter(adapter);
-        presenter.startForUi();
+        presenter.start();
         date_tv.setText(TimeUtils.long2str(System.currentTimeMillis(), "yyyy年MM月dd日") + TimeUtils.getWeek(System.currentTimeMillis()));
         findViewById(R.id.signin_btn).setOnClickListener(this);
         findViewById(R.id.unoffice_).setOnClickListener(this);
@@ -179,6 +178,11 @@ public class WorkActivity extends BaseActivity implements View.OnClickListener,
         this.latLng = latLng;
     }
 
+    @Override
+    public void setErrorMac(String message) {
+        macError = message;
+    }
+
 
     @Override
     public void showToast(String message, int colorId) {

+ 49 - 71
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/presenter/MissionPresenter.java

@@ -13,7 +13,6 @@ import com.xzjmyk.pm.activity.db.dao.MissionDao;
 import com.xzjmyk.pm.activity.ui.erp.model.MissionModel;
 import com.xzjmyk.pm.activity.ui.erp.presenter.imp.IMission;
 import com.xzjmyk.pm.activity.ui.erp.presenter.imp.IMissionPresenter;
-import com.xzjmyk.pm.activity.ui.erp.presenter.imp.ISave;
 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;
@@ -38,14 +37,9 @@ public class MissionPresenter implements IMissionPresenter, HttpHandler.OnResult
     private final int SAVE_PLAN = 0x12;
     private final int SAVE_ADDRESS = 0x13;
     private IMission iMission;
-    private ISave iSave;
     private List<MissionModel> models;
 
 
-    public MissionPresenter(ISave iSave) {
-        this.iSave = iSave;
-    }
-
     public MissionPresenter(IMission iMission) {
         this.iMission = iMission;
         models = new ArrayList<>();
@@ -273,76 +267,60 @@ public class MissionPresenter implements IMissionPresenter, HttpHandler.OnResult
                 iMission.showModels(models);
             }
             return; //获取到拜访计划数据
-        }
-        JSONObject object = null;
-        MissionModel entity = null;
-        final List<MissionModel> entities = new ArrayList<>();
-        for (int i = 0; i < array.size(); i++) {
-            object = array.getJSONObject(i);
-            entity = new MissionModel();
-            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(1);
-            //TODO 添加时间和位置数据
-            entity.setDistance(object.getDoubleValue("MPD_DISTANCE"));
-//            entity.setLocation(MyApplication.getInstance().getBdLocationHelper().getName());
-//            entity.setRecorddate();
-
-            entities.add(entity);
-        }
-        if (!ListUtils.isEmpty(entities)) {
-            models = entities;
-            if (iMission != null) {
-                iMission.dimssLoading();
-                iMission.showModels(entities);
-            }
-            final List<MissionModel> finalEntities = entities;
-            ThreadUtil.getInstance().addTask(new Runnable() {
-                @Override
-                public void run() {
-                    boolean saveOk = MissionDao.getInstance().updataOrCreate(finalEntities);
-                    if (!saveOk) {//保存数据库失败
-                        saveOk = MissionDao.getInstance().updataOrCreate(finalEntities);
-                    }
-                    if (iSave != null) {
-                        final boolean finalSaveOk = saveOk;
-                        HttpHandler.getInstance().post(new Runnable() {
-                            @Override
-                            public void run() {
-                                iSave.saveStatus(2,finalSaveOk);
-                            }
-                        });
-                    }
-                }
-            });
         } else {
-            if (iMission != null) {
-                iMission.dimssLoading();
-                iMission.showModels(models);
+            JSONObject object = null;
+            MissionModel entity = null;
+            final List<MissionModel> entities = new ArrayList<>();
+            for (int i = 0; i < array.size(); i++) {
+                object = array.getJSONObject(i);
+                entity = new MissionModel();
+                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(1);
+                //TODO 添加时间和位置数据
+                entity.setDistance(object.getDoubleValue("MPD_DISTANCE"));
+                entity.setLocation(object.getString("MPD_LOCATION"));
+                entity.setRecorddate(object.getString("MPD_RECORDDATE"));
+                entities.add(entity);
             }
+            if (!ListUtils.isEmpty(entities))
+                models = entities;
         }
+        setModels();
     }
 
+    private void setModels() {
+        if (iMission != null) {
+            iMission.dimssLoading();
+            iMission.showModels(models);
+        }
+        ThreadUtil.getInstance().addTask(new Runnable() {
+            @Override
+            public void run() {
+                MissionDao.getInstance().updataOrCreate(models);
+            }
+        });
+    }
 
     private void addEntity(List<MissionModel> entitys) {
         MissionModel entity = new MissionModel();

+ 71 - 58
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/presenter/WorkPresenter.java

@@ -16,7 +16,6 @@ import com.xzjmyk.pm.activity.MyApplication;
 import com.xzjmyk.pm.activity.R;
 import com.xzjmyk.pm.activity.db.dao.WorkModelDao;
 import com.xzjmyk.pm.activity.ui.erp.model.WorkModel;
-import com.xzjmyk.pm.activity.ui.erp.presenter.imp.ISave;
 import com.xzjmyk.pm.activity.ui.erp.presenter.imp.IWorkPresenter;
 import com.xzjmyk.pm.activity.ui.erp.presenter.imp.IWorkView;
 import com.xzjmyk.pm.activity.ui.erp.util.CommonInterfaceUtil;
@@ -56,22 +55,20 @@ public class WorkPresenter implements HttpHandler.OnResultListener, IWorkPresent
     private double companyLatitude;
     private double companyLongitude;
     private int companyDistance;
-    private boolean isMacInNet;//服务器上是否有mac地址
+    private boolean isMacInNet = false;//服务器上是否有mac地址
     private boolean isSubmiting = false;
     private CommonInterfaceUtil util;
     private List<PoiInfo> pois;
 
+    private String macAddress;
 
-    private IWorkView iWorkView;
-    private ISave iWork;
 
-    public WorkPresenter(ISave iWork) {
-        this.iWork = iWork;
-    }
+    private IWorkView iWorkView;
 
-    public WorkPresenter(IWorkView iWorkView) {
+    public WorkPresenter(IWorkView iWorkView, String macAddress) {
         this.iWorkView = iWorkView;
-        isMacInNet = true;
+        this.macAddress = macAddress;
+        getMacByNet();
     }
 
 
@@ -93,6 +90,16 @@ public class WorkPresenter implements HttpHandler.OnResultListener, IWorkPresent
         HttpHandler.getInstance().loadERPByNet(WORK_LOG, "mobile/oa/workdata.action", param, bundle, this);
     }
 
+    //判断mac地址是否已经上传
+    private void getMacByNet() {
+        //获取网络数据
+        Map<String, Object> param = new HashMap<>();
+        param.put("macaddress", macAddress);
+        param.put("emcode", CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_username"));
+        HttpHandler.getInstance().loadERPByNet(LOAD_MAC, "mobile/queryMobileMac.action",
+                param, null, this);
+    }
+
 
     private void validatorMac(ArrayList<WorkModel> models, String macAddress) {
         Map<String, Object> param = new HashMap<>();
@@ -282,19 +289,15 @@ public class WorkPresenter implements HttpHandler.OnResultListener, IWorkPresent
      * @param logTime 日期时间戳
      * @throws Exception
      */
-    private void handlerWorkLog(boolean isJSON, String message, ArrayList<WorkModel> models, long logTime) throws Exception {
+    private void handlerWorkLog(boolean isJSON, String message, final ArrayList<WorkModel> models, long logTime) throws Exception {
         if (!isJSON || ListUtils.isEmpty(models)) {
-            if (iWorkView != null)
-                iWorkView.showModel(models);
+            showModels(models, logTime);
             return;
         }
         JSONObject object = JSON.parseObject(message);
         JSONArray listdata = object.getJSONArray("listdata");
         if (ListUtils.isEmpty(listdata)) {
-            if (iWorkView != null) {
-                iWorkView.dimssLoading();
-                iWorkView.showModel(models);
-            }
+            showModels(models, logTime);
             log("ListUtils.isEmpty(listdata) 数据为空,容错处理");
             return;
         }
@@ -322,30 +325,33 @@ public class WorkPresenter implements HttpHandler.OnResultListener, IWorkPresent
                 }
             }
         }
+
+        showModels(models, logTime);
+    }
+
+    private void showModels(final List<WorkModel> models, long longTime) {
+        //页面显示
+        if (iWorkView != null) {
+            iWorkView.showModel(models);
+            iWorkView.dimssLoading();
+        }
+
         //下拉数据后保存到数据库
         if (!ListUtils.isEmpty(models) &&
-                TimeUtils.s_long_2_str(logTime).equals(TimeUtils.s_long_2_str(System.currentTimeMillis()))) {
+                TimeUtils.s_long_2_str(longTime).equals(TimeUtils.s_long_2_str(System.currentTimeMillis()))) {
             //当天日期数据
-            final List<WorkModel> finaModels = models;
             ThreadUtil.getInstance().addTask(new Runnable() {
                 @Override
                 public void run() {
-                    final boolean save = WorkModelDao.getInstance().createOrUpdata(finaModels);
-                    if (iWork != null)
-                        HttpHandler.getInstance().post(new Runnable() {
-                            @Override
-                            public void run() {
-                                iWork.saveStatus(1,save);
-                            }
-                        });
+                    List<WorkModel> saveModels = new ArrayList<>();
+                    for (WorkModel e : models)
+                        saveModels.add(e);
+                    WorkModelDao.getInstance().createOrUpdata(saveModels);
+
                 }
             });
         }
-        //页面显示
-        if (iWorkView != null) {
-            iWorkView.showModel(models);
-            iWorkView.dimssLoading();
-        }
+
     }
 
     /**
@@ -400,27 +406,23 @@ public class WorkPresenter implements HttpHandler.OnResultListener, IWorkPresent
      *********************************/
 
     @Override
-    public void startForSave() {
-        loadWorkData(System.currentTimeMillis());
-    }
-
-    @Override
-    public void startForUi() {
-        MyApplication.getInstance().getBdLocationHelper().setListener(new BdLocationHelper.OnBaiduResultListener() {
-            @Override
-            public void result(boolean isOk) {
-                if (!isChangPoi)
-                    try {
-                        setBaiduLocation();
-                    } catch (Exception e) {
-                        if (e != null) log("startForUi Exception=" + e.getMessage());
-                    }
-            }
-        });
+    public void start() {
+        if (iWorkView != null) {
+            MyApplication.getInstance().getBdLocationHelper().setListener(new BdLocationHelper.OnBaiduResultListener() {
+                @Override
+                public void result(boolean isOk) {
+                    if (!isChangPoi)
+                        try {
+                            setBaiduLocation();
+                        } catch (Exception e) {
+                            if (e != null) log("startForUi Exception=" + e.getMessage());
+                        }
+                }
+            });
+        }
         loadWorkData(System.currentTimeMillis());
     }
 
-    @Override
     public void loadWorkData(long time) {
         if (iWorkView != null)
             iWorkView.showLoading();
@@ -445,13 +447,23 @@ public class WorkPresenter implements HttpHandler.OnResultListener, IWorkPresent
         }
     }
 
-    @Override
+
+    /**
+     * 提交打卡
+     *
+     * @param models     班次以及打卡记录数据
+     * @param macAddress mac地址
+     */
     public void submitWork(ArrayList<WorkModel> models, String macAddress) {
         validatorMac(models, macAddress);
     }
 
 
-    @Override
+    /**
+     * 更改位置信息
+     *
+     * @param poi 位置信息
+     */
     public void changPoi(PoiInfo poi) {
         isChangPoi = true;
         loaction = StringUtils.isEmpty(poi.name) ? "" : poi.name;//位置名称
@@ -481,7 +493,6 @@ public class WorkPresenter implements HttpHandler.OnResultListener, IWorkPresent
                     handlerWorkLog(isJSON, message, models, logTime);
                     break;
                 case MAC_VAL://判断mac地址
-                    isMacInNet = true;
                     if (isJSON && JSON.parseObject(message).containsKey("success") &&
                             JSON.parseObject(message).getBoolean("success")) {
                         getUtil().getCodeByNet("CardLog", new CommonInterfaceUtil.OnResultListener() {
@@ -531,16 +542,18 @@ public class WorkPresenter implements HttpHandler.OnResultListener, IWorkPresent
 
     @Override
     public void error(int what, int statuCode, String message, Bundle bundle) {
-        if (MAC_VAL == what) {
-            log("一样的");
-        } else {
-            log("不一样的 ");
-        }
+
         try {
             if (StringUtils.isInclude(message, "该设备不是考勤打卡常用设备")) {
                 if (iWorkView != null) iWorkView.showErrorMac();
             } else if (StringUtils.isInclude(message, "设备正处于申请变更绑定阶段")) {
-                if (iWorkView != null)
+                if (iWorkView != null) {
+                    iWorkView.showToast(R.string.mac_changing, R.color.load_warning);
+                    iWorkView.setErrorMac(MyApplication.getInstance().getResources().getString(R.string.mac_changing));
+                }
+            } else {
+                String mes = StringUtils.getChinese(message);
+                if (!StringUtils.isEmpty(mes) && iWorkView != null)
                     iWorkView.showToast(R.string.mac_changing, R.color.load_warning);
             }
         } catch (Exception e) {

+ 25 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/presenter/imp/IAutoErp.java

@@ -0,0 +1,25 @@
+package com.xzjmyk.pm.activity.ui.erp.presenter.imp;
+
+/**
+ * 自动签到回调
+ * Created by Bitliker on 2016/12/16.
+ */
+public interface IAutoErp {
+
+    /**
+     * 签到成功
+     *
+     * @param type   1.内勤签到  2.外勤签到
+     * @param saveOk 是否保存到数据库成功
+     */
+    void success(int type, boolean saveOk);
+
+
+    /**
+     * 签到失败
+     *
+     * @param type    1.内勤签到  2.外勤签到
+     * @param message 失败信息
+     */
+    void failure(int type, String message);
+}

+ 0 - 17
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/presenter/imp/ISave.java

@@ -1,17 +0,0 @@
-package com.xzjmyk.pm.activity.ui.erp.presenter.imp;
-
-/**
- * 班次接口,没有View层
- * Created by Bitliker on 2016/12/16.
- */
-
-public interface ISave {
-
-    /**
-     * 保存数据返回状态
-     *
-     * @param type   类型  1.内勤  2.外勤
-     * @param saveOk 更新成功
-     */
-    void saveStatus(int type, boolean saveOk);
-}

+ 8 - 12
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/presenter/imp/IWorkPresenter.java

@@ -1,6 +1,5 @@
 package com.xzjmyk.pm.activity.ui.erp.presenter.imp;
 
-import com.baidu.mapapi.search.core.PoiInfo;
 import com.xzjmyk.pm.activity.ui.erp.model.WorkModel;
 
 import java.util.ArrayList;
@@ -11,21 +10,18 @@ import java.util.ArrayList;
 
 public interface IWorkPresenter {
 
-    void startForSave();
 
-    void startForUi();
-    /**
-     * 获取班次
-     *
-     * @param time 日期时间戳
-     */
-    void loadWorkData(long time);
+    void start();
 
-    void submit(ArrayList<WorkModel> models, String macAddress);
+//    void loadWorkData(long time);//下拉班次,只有打卡界面才有
 
-    void submitWork(ArrayList<WorkModel> models, String macAddress);
+    void submit(ArrayList<WorkModel> models, String macAddress);//提交,判断重复打卡
 
-    void changPoi(PoiInfo poi);
+
+
+//    void submitWork(ArrayList<WorkModel> models, String macAddress);//提交,不用判断重复打卡   只有打卡界面才用
+
+//    void changPoi(PoiInfo poi);//只有打卡界面才有
 
 
 }

+ 1 - 1
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/presenter/imp/IWorkView.java

@@ -23,5 +23,5 @@ public interface IWorkView extends HttpImp {
 
     void setPois(List<PoiInfo> pois, LatLng latLng);
 
-
+    void setErrorMac(String message);
 }

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

@@ -1,64 +1,116 @@
 package com.xzjmyk.pm.activity.ui.erp.util.attendance;
 
-import android.annotation.TargetApi;
 import android.app.Service;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.os.AsyncTask;
-import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
 import android.os.IBinder;
+import android.os.Message;
 import android.util.Log;
 
 import com.xzjmyk.pm.activity.AppConfig;
 import com.xzjmyk.pm.activity.MyApplication;
+import com.xzjmyk.pm.activity.R;
 import com.xzjmyk.pm.activity.db.dao.MissionDao;
 import com.xzjmyk.pm.activity.db.dao.WorkModelDao;
+import com.xzjmyk.pm.activity.ui.erp.activity.oa.WorkActivity;
 import com.xzjmyk.pm.activity.ui.erp.model.MissionModel;
 import com.xzjmyk.pm.activity.ui.erp.model.WorkModel;
-import com.xzjmyk.pm.activity.ui.erp.presenter.MissionPresenter;
-import com.xzjmyk.pm.activity.ui.erp.presenter.WorkPresenter;
-import com.xzjmyk.pm.activity.ui.erp.presenter.imp.IMissionPresenter;
-import com.xzjmyk.pm.activity.ui.erp.presenter.imp.ISave;
-import com.xzjmyk.pm.activity.ui.erp.presenter.imp.IWorkPresenter;
 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 com.xzjmyk.pm.activity.ui.erp.util.auto.NotificationManage;
+import com.xzjmyk.pm.activity.ui.tool.ThreadUtil;
+import com.xzjmyk.pm.activity.util.PreferenceUtils;
 
-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 implements ISave {
+public class AutoErpService extends Service {
+    public static final String SAVE_WORK_ACTION = "SAVE_WORK_ACTION";
+    public static final String SAVE_MISSION_ACTION = "SAVE_MISSION_ACTION";
+    public static final String LOAD_MISSION = "LOAD_MISSION";
+
     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 IWorkPresenter workPresenter;
-    private IMissionPresenter missionPresenter;
 
-    private ReckonAutoUtil reckonAutoUtil;
+    private ReckonAutoUtil reckonAutoUtil;//计算工具
+    private NotificationManage notificationManage;//通知管理器
+
+
     private boolean isAlarm;//是否打卡提醒
     private boolean isAuto;//是否自动打卡
-    private long intervalTime = 1 * 60 * 1000;//计算循环的时间
-    private int iter = 0;
-    private boolean saveOk = false;
-    private final String[] flags = {
 
+    private final long MINUTE = 60 * 1000;//一分钟的时间戳
+    private long workInterval = MINUTE;//计算循环的时间
+    private long missionInterval = 2 * MINUTE;//计算循环的时间
+    private AutoErpSigninUitl signinUitl;
+
+    private final String[] flags = {
+            SAVE_WORK_ACTION, SAVE_MISSION_ACTION, LOAD_MISSION
     };
+    private Handler handler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            Bundle bundle = msg.getData();
+            switch (msg.what) {
+                case STATUS_SIGNING://自动打卡
+                    if (bundle != null) {
+                        //TODO 打卡
+                        WorkModel model = bundle.getParcelable("data");
+                        signinUitl.signinWork(model);
+                    }
+                    break;
+                case STATUS_WORK_ALARM://上班提醒
+                    getNotificationManage().sendNotification(MyApplication.getInstance(),
+                            "上班时间快到了,请及时打卡", WorkActivity.class);
+                    break;
+                case STATUS_OFF_ALARM://下班提醒
+                    getNotificationManage().sendNotification(MyApplication.getInstance(),
+                            "下班时间已到了,请及时打卡", WorkActivity.class);
+                    break;
+                case STATUS_MISSION://外勤签到
+                    MissionModel model = bundle.getParcelable("data");
+                    signinUitl.signinMissio(model);
+                    break;
+                case STATUS_LEAVE_ALARM://内勤离开提醒
+                    getNotificationManage().sendNotification(MyApplication.getInstance(),
+                            R.string.outoff_work, WorkActivity.class);
+                    break;
+            }
+        }
+    };
+
+    private boolean isWorkRuning = false;
+    private boolean isMissionRuning = false;
+
     private BroadcastReceiver updateReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
+            try {
+                if (intent == null || StringUtils.isEmpty(intent.getAction())) return;
+                if (intent.getAction().equals(SAVE_WORK_ACTION)) {
+                    if (!isWorkRuning)
+                        startWorkTask();
+                } else if (intent.getAction().equals(SAVE_MISSION_ACTION)) {
+                    if (!isMissionRuning)
+                        startMissionTask();
+                } else if (intent.getAction().equals(LOAD_MISSION)) {
+                    signinUitl.loadMissionPlan();
+                }
+            } catch (Exception e) {
 
+            }
         }
     };
 
@@ -71,10 +123,10 @@ public class AutoErpService extends Service implements ISave {
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
         try {
-            initBroadcast();
-            initDB();
-            init();
-            initTask();
+            initBroadcast();//初始化广播接受器
+            initDB();//初始化数据库数据,1.删除昨天数据   2.下拉当天数据
+            init();//初始化
+            initTask();//初始化任务
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -101,12 +153,116 @@ public class AutoErpService extends Service implements ISave {
 
     /**
      * 初始化任务
+     * 1.判断任务是否应该启动
+     * 2.启动任务
      */
-    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
     private void initTask() throws Exception {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
-            new AutoAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
-        else new AutoAsyncTask().execute();
+
+    }
+
+
+    /**
+     * 开启自动打卡和提醒任务
+     * 在获取打卡列表之后,
+     *
+     * @throws Exception
+     */
+    private void startWorkTask() throws Exception {
+        log("startWorkTask");
+        isWorkRuning = true;
+        ThreadUtil.getInstance().addTask(new Runnable() {
+            @Override
+            public void run() {
+                while (true) {
+                    try {
+                        if (!isCanWork()) {
+                            isWorkRuning = false;
+                            break;
+                        }
+                        if (isAuto) {
+                            WorkModel model = getReckonAutoUtil().reckonAutoWork();
+                            if (model != null) {
+                                log("符合打卡");
+                                //TODO 符合打卡
+                                Message message = handler.obtainMessage();
+                                message.what = STATUS_SIGNING;
+                                Bundle bundle = new Bundle();
+                                bundle.putParcelable("data", model);
+                                message.setData(bundle);
+                                handler.sendMessage(message);
+                            }
+                        } else if (isAlarm) {//提醒  1.离开办公室 2.上班提醒   3.下班提醒
+                            int type = getReckonAutoUtil().reckonAlarm(isAlarm, workInterval);
+                            if (type == 1) {
+                                //TODO 符合离开办公室提醒
+                                handler.sendEmptyMessage(STATUS_LEAVE_ALARM);
+                            } else if (type == 2) {
+                                //TODO 符合上班提醒
+                                handler.sendEmptyMessage(STATUS_WORK_ALARM);
+                            } else if (type == 3) {
+                                //TODO 符合下班提醒
+                                handler.sendEmptyMessage(STATUS_OFF_ALARM);
+                            }
+                        }
+                        Thread.sleep(workInterval);
+                    } catch (InterruptedException e) {
+                        if (e != null)
+                            log("startWorkTask InterruptedException=" + e.getMessage());
+                    } catch (Exception e) {
+                        if (e != null)
+                            log("startWorkTask Exception=" + e.getMessage());
+                    }
+                }
+            }
+        });
+
+    }
+
+    /**
+     * 开启自动外勤任务
+     * 在获取外勤计划列表之后
+     *
+     * @throws Exception
+     */
+    private void startMissionTask() throws Exception {
+        log("startMissionTask");
+        isMissionRuning = true;
+        ThreadUtil.getInstance().addTask(new Runnable() {
+            @Override
+            public void run() {
+                while (true) {
+                    try {
+                        if (!isCanMission()) {
+                            isMissionRuning = false;
+                            break;
+                        }
+                        List<MissionModel> plans = MissionDao.getInstance().queryByEnCode();
+                        log("自动外勤 plans==" + (ListUtils.isEmpty(plans) ? 0 : plans.size()));
+                        //符合外勤判断
+                        //判断是否自动外勤
+                        boolean isAuto = PreferenceUtils.getBoolean(AppConfig.AUTO_MISSION, false);
+                        if (isAuto) {
+                            MissionModel mission = getReckonAutoUtil().reckonMission(plans);
+                            if (mission != null) {//TODO 符合外勤签到
+                                Message message = handler.obtainMessage();
+                                message.what = STATUS_MISSION;
+                                Bundle bundle = new Bundle();
+                                bundle.putParcelable("data", mission);
+                                message.setData(bundle);
+                                handler.sendMessage(message);
+                            }
+                        }
+                        Thread.sleep(missionInterval);
+                    } catch (InterruptedException e) {
+                        if (e != null)
+                            log("startWorkTask InterruptedException=" + e.getMessage());
+                    } catch (Exception e) {
+                        if (e != null)
+                            log("startWorkTask Exception=" + e.getMessage());
+                    }
+                }
+            }
+        });
     }
 
     /**
@@ -121,20 +277,16 @@ public class AutoErpService extends Service implements ISave {
             if (e != null)
                 log("initDB Exception=" + e.getMessage());
         }
-        try {//缓存数据
-            workPresenter = new WorkPresenter(this);
-            workPresenter.startForSave();
-            missionPresenter = new MissionPresenter(this);
-            missionPresenter.start();
+        try {//TODO 缓存数据
+
         } catch (Exception e) {
 
         }
     }
 
-    /**
-     * 初始化网络请求
-     */
+
     private void init() {
+        signinUitl = new AutoErpSigninUitl();
         initWork();
         initMission();
     }
@@ -144,8 +296,9 @@ public class AutoErpService extends Service implements ISave {
         commonInterfaceUtil.getOutSetInfo(new CommonInterfaceUtil.OnResultListener() {
             @Override
             public void result(int code, String result) {
-                boolean isNeedAutoOut = getBoolean(AppConfig.AUTO_MISSION, false);
+                boolean isNeedAutoOut = PreferenceUtils.getBoolean(AppConfig.AUTO_MISSION, false);
                 if (isNeedAutoOut) {
+                    signinUitl.loadMissionPlan();
                 } else {
                     try {
                         //如果不是自动外勤,清空数据库今天的数据
@@ -167,6 +320,7 @@ public class AutoErpService extends Service implements ISave {
         isAuto = CommonUtil.getSharedPreferencesBoolean(MyApplication.getInstance(), AppConfig.AUTO_SIGNIN, true);
         if (isAlarm || isAuto) {
             //TODO 下拉班次数据和是否本机账号
+            signinUitl.loadWorkData();
         } else {
             try {
                 //如果不是自动打卡和提醒,清空数据库今天的数据
@@ -178,87 +332,6 @@ public class AutoErpService extends Service implements ISave {
         }
     }
 
-    /**
-     * 数据库保存回调
-     *
-     * @param type   类型  1.内勤  2.外勤
-     * @param saveOk 更新成功
-     */
-    @Override
-    public void saveStatus(int type, boolean saveOk) {
-        saveOk = true;
-    }
-
-
-    //开启异步任务
-    private class AutoAsyncTask extends AsyncTask<Void, Map<String, Object>, Void> {
-        @Override
-        protected Void doInBackground(Void... voids) {
-            try {
-                while (true) {
-                    Map<String, Object> map = null;
-                    if (isCanMission()) {
-                        List<MissionModel> plans = MissionDao.getInstance().queryByEnCode();
-                        if (iter % 6 == 0 && !ListUtils.isEmpty(plans)) {
-                            log("自动外勤");
-                            //符合外勤判断
-                            //判断是否自动外勤
-                            boolean isAuto = getBoolean(AppConfig.AUTO_MISSION, false);
-                            if (isAuto) {
-                                MissionModel 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
-        protected void onProgressUpdate(Map<String, Object>... values) {
-            super.onProgressUpdate(values);
-        }
-    }
 
     private ReckonAutoUtil getReckonAutoUtil() {
         if (reckonAutoUtil == null) reckonAutoUtil = new ReckonAutoUtil();
@@ -273,6 +346,16 @@ public class AutoErpService extends Service implements ISave {
         return true;
     }
 
+    /**
+     * start handler date
+     */
+    //防止空值
+    private NotificationManage getNotificationManage() {
+        if (notificationManage == null)
+            notificationManage = new NotificationManage();
+        return notificationManage;
+    }
+
     /**
      * 打印信息方法
      *

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

@@ -0,0 +1,722 @@
+package com.xzjmyk.pm.activity.ui.erp.util.attendance;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+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.baidu.mapapi.search.route.DrivingRouteLine;
+import com.baidu.mapapi.search.route.DrivingRouteResult;
+import com.xzjmyk.pm.activity.AppConfig;
+import com.xzjmyk.pm.activity.BdLocationHelper;
+import com.xzjmyk.pm.activity.MyApplication;
+import com.xzjmyk.pm.activity.R;
+import com.xzjmyk.pm.activity.db.dao.MissionDao;
+import com.xzjmyk.pm.activity.db.dao.WorkModelDao;
+import com.xzjmyk.pm.activity.ui.MainActivity;
+import com.xzjmyk.pm.activity.ui.erp.activity.oa.MissionActivity;
+import com.xzjmyk.pm.activity.ui.erp.activity.oa.OutSigninOKActivity;
+import com.xzjmyk.pm.activity.ui.erp.activity.oa.WorkActivity;
+import com.xzjmyk.pm.activity.ui.erp.model.MissionModel;
+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 com.xzjmyk.pm.activity.ui.erp.util.auto.HttpHandler;
+import com.xzjmyk.pm.activity.ui.erp.util.auto.NotificationManage;
+import com.xzjmyk.pm.activity.ui.erp.util.baidu.OnGetDrivingRouteResult;
+import com.xzjmyk.pm.activity.ui.tool.ThreadUtil;
+import com.xzjmyk.pm.activity.util.BaiduMapUtil;
+import com.xzjmyk.pm.activity.util.MacAndIDUtil;
+import com.xzjmyk.pm.activity.util.PreferenceUtils;
+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;
+
+/**
+ * 负责签到   内外勤
+ * Created by Bitliker on 2016/12/20.
+ */
+public class AutoErpSigninUitl implements HttpHandler.OnResultListener {
+
+    private final int MAC_VAL = 0x11;//判断mac地址
+    private final int SIGNING = 0x12;//内勤签到
+    private final int LOAD_WORKLOG = 0x13;//打卡列表
+    private final int SIGNIN_MISSION = 0x14;//外勤签到
+    private final int HAVE_OUT_PLAN = 0x15;//还有未拜访外勤计划
+
+    private final int WORK_DATA = 0x16;//内勤列表
+    private final int WORK_LOG = 0x17;//下拉列表时候的获取打卡列表
+    private final int LOAD_PLAN = 0x18;
+
+    private NotificationManage notificationManage;
+
+    public AutoErpSigninUitl() {
+        notificationManage = new NotificationManage();
+    }
+
+    /**
+     * 签到内勤
+     *
+     * @param model 签到班次对象
+     */
+    public void signinWork(WorkModel model) {
+        //1.判读mac地址是否符合     3.签到
+        MacAndIDUtil util = new MacAndIDUtil();
+        String macAddress = util.getMac(MyApplication.getInstance());
+        if (StringUtils.isEmpty(macAddress)) {
+            return;
+        }
+        validatorMac(model, macAddress);
+    }
+
+    /**
+     * 签到外勤
+     *
+     * @param model 签到对象
+     */
+    public void signinMissio(MissionModel model) {
+        if (model == null) return;
+        Context ct = MyApplication.getInstance();
+        if (!MyApplication.getInstance().isNetworkActive()) {
+            notificationManage.sendNotification(ct, R.string.out_net_signin, OutSigninOKActivity.class);
+        }
+        Map<String, Object> param = new HashMap<>();
+        Map<String, Object> formStore = new HashMap<>();
+        String emconde = CommonUtil.getSharedPreferences(ct, "erp_username");
+        String name = CommonUtil.getSharedPreferences(ct, "erp_emname");
+        if (StringUtils.isEmpty(name))
+            name = MyApplication.getInstance().mLoginUser.getNickName();
+        formStore.put("mo_address", model.getCompanyAddr());//TODO 当前地址
+        formStore.put("mo_mancode", emconde);//人员编号
+        formStore.put("mo_man", name);//人员编号
+        formStore.put("mo_remark", "自动外勤签到");//备注
+        formStore.put("mo_company", model.getCompanyName());//TODO 当前公司
+        param.put("caller", "Mobile_outsign");
+        param.put("mpd_id", model.getId());
+        param.put("formStore", StringUtils.mapToJson(formStore));
+        Bundle bundle = new Bundle();
+        bundle.putParcelable("data", model);
+        HttpHandler.getInstance().loadERPByNet(SIGNIN_MISSION, "mobile/addAutoSign.action",
+                param, bundle, this);
+    }
+
+
+    private void validatorMac(WorkModel model, String macAddress) {
+        Map<String, Object> param = new HashMap<>();
+        param.put("macAddress", macAddress);
+        param.put("emcode", CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_username"));
+        Bundle bundle = new Bundle();
+        bundle.putParcelable("data", model);
+        HttpHandler.getInstance().loadERPByNet(MAC_VAL, "mobile/addMobileMac.action",
+                param, bundle, this);
+    }
+
+
+    //签到
+    private void signinWork(Bundle bunder, String code) {
+        Context ct = MyApplication.getInstance();
+        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", getSharedPreferences(ct, "erp_username"));
+        String emname = getSharedPreferences(ct, "erp_emname");
+        if (StringUtils.isEmpty(emname)) {
+            emname = MyApplication.getInstance().mLoginUser.getNickName().trim();
+        }
+        form.put("cl_emname", emname);
+        boolean isp = isPlay(form);
+        if (!isp) {
+            return;//不符合打卡
+        }
+        String formStore = StringUtils.mapToJson(form);
+        param.put("caller", "CardLog");
+        param.put("formStore", formStore);
+        param.put("emcode", getSharedPreferences(ct, "erp_username"));
+        HttpHandler.getInstance().loadERPByNet(SIGNING, "mobile/saveCardLog.action",
+                param, bunder, this);
+    }
+
+
+    /*判断是否符合打卡*/
+    private boolean isPlay(Map<String, Object> form) {
+        try {
+            //判断是否符合打卡
+            BdLocationHelper helper = MyApplication.getInstance().getBdLocationHelper();
+            form.put("cl_address", helper.getAddress());
+            form.put("cl_location", helper.getName());
+            int comDistance = PreferenceUtils.getInt("distance", 0);
+            float distance = BaiduMapUtil.getInstence().getDistance();
+            if (comDistance < distance) {
+                //TODO 规定地址<实际地址  不符合
+                //判断是否有外勤
+                boolean isOutPlan = PreferenceUtils.getBoolean(AppConfig.HAVE_OUT_PLAN, false);
+                if (!isOutPlan) {
+                    //TODO 没有自动外勤
+                }
+                return false;
+            } else {
+                form.put("cl_distance", distance);
+                return true;
+            }
+        } catch (NullPointerException e) {
+            return false;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    //获取打卡记录
+    private void loadLog(Bundle bunder) throws Exception {
+        String date = TimeUtils.s_long_2_str(System.currentTimeMillis());
+        //获取网络数据
+        Map<String, Object> param = new HashMap<>();
+        String code = getSharedPreferences(MyApplication.getInstance(), "erp_username");
+        param.put("currentMaster", getSharedPreferences(MyApplication.getInstance(), "erp_master"));
+        param.put("page", 1);
+        param.put("pageSize", 1);
+        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", getSharedPreferences(MyApplication.getInstance(), "erp_master"));
+        HttpHandler.getInstance().loadERPByNet(LOAD_WORKLOG, "mobile/oa/workdata.action",
+                param, bunder, this);
+    }
+
+    //获取是否有外勤计划
+    public void loadIsMission(MissionModel model) {
+        Map<String, Object> param = new HashMap<>();
+        param.put("emcode", CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_username"));
+        Bundle bunder = new Bundle();
+        bunder.putParcelable("data", model);
+        HttpHandler.getInstance().loadERPByNet(HAVE_OUT_PLAN, "mobile/yesornoplan.action",
+                param, bunder, this);
+    }
+
+
+    /*****************
+     * 下拉列表
+     ***********************/
+    /**
+     * 下拉内勤数据
+     */
+    public void loadWorkData() {
+        Map<String, Object> param = new HashMap<>();
+        param.put("date", TimeUtils.int_long_2_str(System.currentTimeMillis()));
+        param.put("emcode", CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_username"));
+        Bundle bundle = new Bundle();
+        HttpHandler.getInstance().loadERPByNet(WORK_DATA, "mobile/getWorkDate.action", param, bundle, this);
+    }
+
+    private void loadLog(ArrayList<WorkModel> models) {
+        String date = TimeUtils.s_long_2_str(System.currentTimeMillis());
+        //获取网络数据
+        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", 100);
+        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"));
+        Bundle bundle = new Bundle();
+        bundle.putParcelableArrayList("models", models);
+        HttpHandler.getInstance().loadERPByNet(WORK_LOG, "mobile/oa/workdata.action", param, bundle, this);
+    }
+
+    //获取外勤计划列表
+    public void loadMissionPlan() {
+        Map<String, Object> param = new HashMap<>();
+        param.put("emcode",
+                CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_username"));
+        HttpHandler.getInstance().loadERPByNet(LOAD_PLAN, "mobile/mobileoutplan.action", param, null, this);
+    }
+
+    @Override
+    public void result(int what, boolean isJSON, String message, final Bundle bundle) {
+        try {
+            switch (what) {
+                case MAC_VAL://判断mac地址
+                    if (isJSON && JSON.parseObject(message).containsKey("success") &&
+                            JSON.parseObject(message).getBoolean("success")) {
+                        CommonInterfaceUtil util = new CommonInterfaceUtil();
+                        util.getCodeByNet("CardLog", new CommonInterfaceUtil.OnResultListener() {
+                            @Override
+                            public void result(int code, String result) {
+                                signinWork(bundle, result);
+                            }
+                        });
+                    }
+                    break;
+                case SIGNING:
+                    loadLog(bundle);
+                    break;
+                case LOAD_WORKLOG:
+                    if (isJSON && JSON.parseObject(message).containsKey("listdata")) {
+                        saveSignin2DB(bundle, JSON.parseObject(message).getJSONArray("listdata"));
+                    }
+                    break;
+                case SIGNIN_MISSION:
+                    if (isJSON) {
+                        if (JSON.parseObject(message).containsKey("success") && JSON.parseObject(message).getBoolean("success")) {
+                            //成功  更新数据库
+                            if (bundle == null) return;
+                            MissionModel mission = bundle.getParcelable("data");
+                            if (mission == null) return;
+                            updataMissonDB(mission);
+                        }
+                    }
+                    break;
+                case HAVE_OUT_PLAN:
+                    if (!isJSON) return;
+                    JSONObject object = JSON.parseObject(message);
+                    if (!object.containsKey("success") || !object.getBoolean("success")) return;
+                    if (object.containsKey("isOffline")) {
+                        int isOffline = Integer.valueOf(object.getString("isOffline"));
+                        //当判断到外勤计划为有值  1.外勤计划有  2.自动外勤
+                        if (bundle != null && bundle.getParcelable("data") != null) {
+                            MissionModel model = bundle.getParcelable("data");
+                            if (model == null) {
+                                log("model==null");
+                                return;
+                            }
+                            boolean saveOk = MissionDao.getInstance().updata(model);
+                            if (isOffline > 0) {//还有外勤计划
+                                if (saveOk)
+                                    notificationManage.sendNotification(MyApplication.getInstance(),
+                                            "对" + model.getCompanyName() + "外勤签退成功", MissionActivity.class);
+                            } else {//没有外勤计划
+                                endMission(model, saveOk);
+                            }
+                        }
+                    }
+                case WORK_DATA://打卡班次
+                    handlerWorkData(isJSON, message);
+                    break;
+                case WORK_LOG://
+                    ArrayList<WorkModel> models = null;
+                    if (bundle != null) models = bundle.getParcelableArrayList("models");
+                    handlerWorkLog(isJSON, message, models);
+                    break;
+                case LOAD_PLAN:
+                    JSONArray array = null;
+                    if (isJSON && JSON.parseObject(message).get("data") instanceof JSONArray) {
+                        array = JSON.parseObject(message).getJSONArray("data");
+                    } else if (JSON.parseObject(message).get("success") instanceof JSONArray) {
+                        array = JSON.parseObject(message).getJSONArray("success");
+                    }
+                    handlerData(array);
+                    break;
+                default:
+                    break;
+            }
+        } catch (Exception e) {
+            if (e != null)
+                log("result=" + e.getMessage());
+        }
+
+
+    }
+
+    @Override
+    public void error(int what, int statuCode, String message, Bundle bundle) {
+
+    }
+
+    /**
+     * 外勤签到签退处理
+     * 1.签退:status==1&&离开范围之内==》mission.setStatus(2) ,先把状态设置位2在传进来签退
+     * 2.签到:在范围之内,status不做任何改变 传进来签到
+     *
+     * @param mission 传进来的对象
+     * @throws Exception
+     */
+    private void updataMissonDB(MissionModel mission) throws Exception {
+        //更新数据库
+        if (mission == null) return;//如果数据库没有,一般不会出现这样的情况
+        if (mission.getStatus() == 2) {//进来签退
+            Log.i("gongpengming", "进来签退");
+            mission.setRealLeave(TimeUtils.f_long_2_str(System.currentTimeMillis()));
+            loadIsMission(mission);
+        } else {//签到
+            Log.i("gongpengming", "签到");
+            mission.setRealTime(TimeUtils.f_long_2_str(System.currentTimeMillis()));
+            if (mission.getStatus() != 1) {
+                mission.setStatus(1);//说明没有打过卡  TODO 可以通过判断签到时间是否存在来判断是否提示签到
+                boolean saveOk = MissionDao.getInstance().updata(mission);
+                if (saveOk)
+                    notificationManage.sendNotification(MyApplication.getInstance(), "外勤签到成功",
+                            MissionActivity.class);
+            }
+        }
+    }
+
+    /**
+     * 外勤签退后判断时候还有外勤计划,如果没有,判断是否符合返回公司  返回提示请返回公司签到
+     *
+     * @param model
+     * @param saveOk
+     * @throws Exception
+     */
+    private void endMission(final MissionModel model, final boolean saveOk) throws Exception {
+        //TODO 英唐大厦应该改为公司名称
+        BaiduMapUtil.getInstence().getDrivingRoute(MyApplication.getInstance().
+                getBdLocationHelper().getCityName(), MyApplication.getInstance().
+                getBdLocationHelper().getName(), "英唐大厦", new OnGetDrivingRouteResult() {
+            @Override
+            public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
+                List<DrivingRouteLine> list = drivingRouteResult.getRouteLines();
+                if (ListUtils.isEmpty(list)) {//获取路线列表为空
+                    if (saveOk)
+                        notificationManage.sendNotification(MyApplication.getInstance(), "对" + model.getCompanyName() + "外勤签退成功",
+                                MissionActivity.class);
+                    return;
+                }
+                int minTime = 0;
+                for (DrivingRouteLine e : list) {//TODO 获取最优最快路线及时间
+                    if (minTime == 0 || minTime > e.getDuration()) {
+                        minTime = e.getDuration();
+                    }
+                }
+                log("最短时间为" + minTime);
+                //获取使用时间为。。。。
+                //当前时间
+                List<WorkModel> models = WorkModelDao.getInstance().query(true);
+                if (ListUtils.isEmpty(models)) {
+                    log("数据库中的班次为空的");
+                    if (saveOk)
+                        notificationManage.sendNotification(MyApplication.getInstance(),
+                                "对" + model.getCompanyName() + "外勤签退成功", MissionActivity.class);
+                    return;
+                }
+                String lastTime = null;
+                for (WorkModel e : models) {
+                    if (StringUtils.isEmpty(e.getOffTime())) continue;
+                    if (StringUtils.isEmpty(lastTime) || e.getOffTime().compareTo(lastTime) > 0)
+                        lastTime = e.getOffTime();
+                }
+                if (StringUtils.isEmpty(lastTime)) {
+                    if (saveOk)
+                        notificationManage.sendNotification(MyApplication.getInstance(),
+                                "对" + model.getCompanyName() + "外勤签退成功", MissionActivity.class);
+                    return;
+                }
+                int time = getTime(lastTime);
+                log("与下班时间相差" + time);
+                int deTime = PreferenceUtils.getInt(AppConfig.AUTO_MISSION_TIME, 10);
+                if ((minTime + deTime * 60) < time) {
+                    notificationManage.sendNotification(MyApplication.getInstance(),
+                            "外勤签退成功,您还有时间返回公司,请回公司签到", MainActivity.class);
+                } else {
+                    Log.i("gongpengming", "时间不符合");
+                    if (saveOk)
+                        notificationManage.sendNotification(MyApplication.getInstance(),
+                                "外勤签退成功,当天任务已结束", MissionActivity.class);
+                }
+            }
+        });
+    }
+
+    //保存到数据库
+    private void saveSignin2DB(Bundle bundle, JSONArray array) throws Exception {
+        WorkModel model = null;
+        if (bundle != null && bundle.getParcelable("data") != null) {
+            model = bundle.getParcelable("data");
+        } else {
+            List<WorkModel> models = WorkModelDao.getInstance().query(false);
+            if (ListUtils.isEmpty(models)) return;
+            String time = TimeUtils.long2str(System.currentTimeMillis(), "HH:mm");
+            for (WorkModel m : models) {
+                //当前时间位于该班次之间
+                if (m.getWorkStart().compareTo(time) < 0 && m.getOffend().compareTo(time) > 0) {
+                    model = m;
+                    break;
+                }
+            }
+        }
+        //取最后一个
+        JSONObject object = array.getJSONObject(array.size() - 1);
+        String time = object.getString("cl_time");//获取最后一次打卡信息,班次打卡信息
+        time = TimeUtils.clearDay(time);//获取到的
+        if (StringUtils.isEmpty(time) || model == null) return;
+        if (StringUtils.isEmpty(model.getWorkSignin()) && model.getWorkStart().compareTo(time) < 0
+                && model.getWorkTime().compareTo(time) > 0) {
+            model.setWorkSignin(time);
+            long i = WorkModelDao.getInstance().update(model);
+            notificationManage.sendNotification(MyApplication.getInstance(),
+                    R.string.auto_signin, WorkActivity.class);
+        } else if (StringUtils.isEmpty(model.getOffSignin()) && model.getOffTime().compareTo(time) < 0
+                && model.getOffend().compareTo(time) > 0) {
+            model.setOffSignin(time);
+            long i = WorkModelDao.getInstance().update(model);
+            notificationManage.sendNotification(MyApplication.getInstance(),
+                    R.string.auto_signin, WorkActivity.class);
+        }
+    }
+
+    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", "show Exception" + e.getMessage());
+        }
+    }
+
+
+    /**
+     * 处理打卡签到
+     *
+     * @param isJSON
+     * @param message
+     */
+    private void handlerWorkData(boolean isJSON, String message) throws Exception {
+        if (!isJSON) {
+            return;
+        }
+        JSONObject object = JSON.parseObject(message);
+        boolean comaddressset = object.getBooleanValue("comaddressset");
+        double companyLongitude = 0;
+        double companyLatitude = 0;
+        int companyDistance = 0;
+        if (comaddressset) {
+            companyLongitude = object.getDoubleValue("longitude");
+            companyLatitude = object.getDoubleValue("latitude");
+            companyDistance = object.getIntValue("distance");
+        }
+        try {
+            PreferenceUtils.putInt("distance", companyDistance);
+            PreferenceUtils.putFloat("longitude", (float) companyLongitude);
+            PreferenceUtils.putFloat("latitude", (float) companyLatitude);
+        } catch (ClassCastException e) {
+            if (e != null)
+                log("handlerWorkData ClassCastException=" + e.getMessage());
+        } catch (Exception e) {
+            if (e != null)
+                log("handlerWorkData Exception=" + e.getMessage());
+        }
+        ArrayList<WorkModel> models = new ArrayList<>();
+        if (object.containsKey("wd_degree")) {//有排班
+            if (object.containsKey("Class1")) {
+                handlerByClass(models, object.getJSONObject("Class1"));
+            }
+            if (object.containsKey("Class2")) {
+                handlerByClass(models, object.getJSONObject("Class2"));
+            }
+            if (object.containsKey("Class3")) {
+                handlerByClass(models, object.getJSONObject("Class3"));
+            }
+        }
+        if (ListUtils.isEmpty(models)) {
+            return;
+        }
+        loadLog(models);
+    }
+
+    /**
+     * 处理班次情况,简化代码  分开函数
+     *
+     * @param models
+     * @param object
+     */
+    private void handlerByClass(ArrayList<WorkModel> models, JSONObject object) {
+        String wd_onbeg = object.getString("wd_onbeg");
+        String wd_onduty = object.getString("wd_onduty");
+        String wd_offduty = object.getString("wd_offduty");
+        String wd_offend = object.getString("wd_offend");
+        if (StringUtils.isEmpty(wd_onbeg)
+                || StringUtils.isEmpty(wd_onduty)
+                || StringUtils.isEmpty(wd_offduty)
+                || StringUtils.isEmpty(wd_offend)) return;
+        WorkModel model = new WorkModel();
+        model.setWorkStart(wd_onbeg);
+        model.setWorkTime(wd_onduty);
+        String rangeTime = null;
+        try {
+            rangeTime = getStartAndEndTime(true, wd_onduty);
+            if (!StringUtils.isEmpty(rangeTime)) {
+                model.setWorkend(rangeTime);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        model.setOffTime(wd_offduty);
+        model.setOffend(wd_offend);
+        try {
+            rangeTime = getStartAndEndTime(false, wd_offduty);
+            if (!StringUtils.isEmpty(rangeTime)) {
+                model.setOffStart(rangeTime);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        models.add(model);
+    }
+
+    /**
+     * 处理打卡签到列表,建议在线程钟使用
+     *
+     * @param isJSON  是否是json数据
+     * @param message 返回信息
+     * @param models  获取班次信息时候的数据
+     * @throws Exception
+     */
+    private void handlerWorkLog(boolean isJSON, String message, final ArrayList<WorkModel> models) throws Exception {
+        if (!isJSON || ListUtils.isEmpty(models)) {
+            return;
+        }
+        JSONObject object = JSON.parseObject(message);
+        JSONArray listdata = object.getJSONArray("listdata");
+        if (ListUtils.isEmpty(listdata)) {
+            log("ListUtils.isEmpty(listdata) 数据为空,容错处理");
+            return;
+        }
+        String timeLog = null;
+        for (int i = 0; i < listdata.size(); i++) {
+            timeLog = getMinTime(listdata.getJSONObject(i).getString("cl_time"));
+            for (int j = 0; j < models.size(); j++) {
+                WorkModel e = models.get(j);
+                if (StringUtils.isEmpty(e.getWorkStart()) || StringUtils.isEmpty(e.getWorkTime()) ||
+                        StringUtils.isEmpty(e.getOffend()) || StringUtils.isEmpty(e.getOffTime()))
+                    continue;
+                if (e.getWorkStart().compareTo(timeLog) <= 0 && e.getOffend().compareTo(timeLog) >= 0) {
+                    //符合该班次
+                    if (e.getWorkend().compareTo(timeLog) >= 0) {
+                        if (StringUtils.isEmpty(e.getWorkSignin()) || e.getWorkSignin().compareTo(timeLog) >= 0) {
+                            models.get(j).setWorkSignin(timeLog);
+                        }
+                    }
+                    if (e.getOffStart().compareTo(timeLog) <= 0) {
+                        if (StringUtils.isEmpty(e.getOffSignin()) || e.getOffSignin().compareTo(timeLog) <= 0) {
+                            models.get(j).setOffSignin(timeLog);
+                        }
+                    }
+                    break;
+                }
+            }
+        }
+        //下拉数据后保存到数据库
+        if (!ListUtils.isEmpty(models)) {
+            //当天日期数据
+            ThreadUtil.getInstance().addTask(new Runnable() {
+                @Override
+                public void run() {
+                    List<WorkModel> saveModels = new ArrayList<>();
+                    for (WorkModel e : models)
+                        saveModels.add(e);
+                    boolean saveOK = WorkModelDao.getInstance().createOrUpdata(saveModels);
+                    //TODO 保存成功知会服务
+                    if (saveOK) {
+                        Intent intent = new Intent();
+                        intent.setAction(AutoErpService.SAVE_WORK_ACTION);
+                        MyApplication.getInstance().sendBroadcast(intent);
+                    }
+                }
+            });
+        }
+    }
+
+
+    /**
+     * 解析处理外勤计划列表并保存到数据库
+     *
+     * @param array
+     */
+    private void handlerData(JSONArray array) throws Exception {
+        if (ListUtils.isEmpty(array)) {
+            return; //获取到拜访计划数据
+        } else {
+            JSONObject object = null;
+            MissionModel entity = null;
+            final List<MissionModel> entities = new ArrayList<>();
+            for (int i = 0; i < array.size(); i++) {
+                object = array.getJSONObject(i);
+                entity = new MissionModel();
+                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(1);
+                entity.setDistance(object.getDoubleValue("MPD_DISTANCE"));
+                entity.setLocation(object.getString("MPD_LOCATION"));
+                entity.setRecorddate(object.getString("MPD_RECORDDATE"));
+                entities.add(entity);
+            }
+            if (!ListUtils.isEmpty(entities)) {
+                //TODO 保存到数据库
+                ThreadUtil.getInstance().addTask(new Runnable() {
+                    @Override
+                    public void run() {
+                        boolean saveOk = MissionDao.getInstance().updataOrCreate(entities);
+                        if (saveOk) {
+                            Intent intent = new Intent();
+                            intent.setAction(AutoErpService.SAVE_MISSION_ACTION);
+                            MyApplication.getInstance().sendBroadcast(intent);
+                        }
+                    }
+                });
+            }
+        }
+    }
+
+    /**
+     * 获取截至时间
+     *
+     * @param isWork   是否上班
+     * @param workTime 时间 (上班时间||下班时间)
+     * @return 服务器没有给的时间
+     */
+    private String getStartAndEndTime(boolean isWork, String workTime) throws Exception {
+        long dayTime = TimeUtils.f_str_2_long(TimeUtils.s_long_2_str(System.currentTimeMillis()) + " " + workTime + ":00");//获取当前天的workTime
+        long time = isWork ? dayTime + 90 * 60 * 1000 : dayTime - 90 * 60 * 1000;
+        return TimeUtils.long2str(time, "HH:mm");
+    }
+
+    private String getMinTime(String time) {
+        if (StringUtils.isEmpty(time)) {
+            return "";
+        } else {
+            return TimeUtils.long2str(TimeUtils.f_str_2_long(time), "HH:mm");
+        }
+    }
+
+    //获取当前时间鱼下班时间的差
+    private int getTime(String lastTime) {
+        long time = TimeUtils.f_str_2_long(TimeUtils.s_long_2_str(System.currentTimeMillis())
+                + " " + lastTime + ":00");
+        long time2 = time - System.currentTimeMillis();
+        if (time < 0) return 0;
+        return (int) (time2 / 1000);
+    }
+}

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

@@ -54,7 +54,6 @@ public class ReckonAutoUtil {
                 if (minDistance <= 0 || minDistance > distance) {//2.如果第一个不存在,判断获取最近的位置
                     minDistance = distance;
                     minBean = e;
-                    minBean.setStatus(1);
                 }
             }
         }
@@ -65,7 +64,7 @@ public class ReckonAutoUtil {
     /**
      * 计算自动打卡
      */
-    public WorkModel reckonAutoWork() throws Exception{
+    public WorkModel reckonAutoWork() throws Exception {
         WorkModel model = getPlaceWork();
         if (model == null) return null;
         if (StringUtils.isEmpty(model.getWorkStart()) || StringUtils.isEmpty(model.getWorkTime()) ||
@@ -74,24 +73,47 @@ public class ReckonAutoUtil {
             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;
+        if (workStart < System.currentTimeMillis() && workEnd > System.currentTimeMillis()) {
+            int comDistance = PreferenceUtils.getInt(MyApplication.getInstance(), "distance", 0);//规定距离
+            if (comDistance == 0) {
+                //TODO  公司距离为空
+                return null;
+            }
+            //公司规定范围 大于当前位置范围
+            boolean is = comDistance > BaiduMapUtil.getInstence().getDistance() &&
+                    StringUtils.isEmpty(model.getWorkSignin());
+            if (is)
+                return model;
+        } else if (offStart < System.currentTimeMillis() && offEnd > System.currentTimeMillis()) {
+            int comDistance = PreferenceUtils.getInt(MyApplication.getInstance(), "distance", 0);//规定距离
+            if (comDistance == 0) {
+                //TODO  公司距离为空
+                return null;
+            }
+            //公司规定范围 大于当前位置范围
+            boolean is = comDistance > BaiduMapUtil.getInstence().getDistance() &&
+                    StringUtils.isEmpty(model.getOffSignin());
+            if (is)
+                return model;
+        }
         return null;
     }
 
     /**
      * 计算是否符合提醒
      *
-     * @param intervalTime
+     * @param isAlarm      是否开启提醒
+     * @param intervalTime 轮回时间
      * @return
      */
-    public int reckonAlarm(long intervalTime) {
+    public int reckonAlarm(boolean isAlarm, long intervalTime) {
         WorkModel model = getPlaceWork();
         if (model == null) return 0;
         if (isOutoffWork(model)) return 1;
+        if (!isAlarm) return 0;
         long time = getWorkAlarm(model);
         if (time != 0 && Math.abs(System.currentTimeMillis() - time) <= intervalTime) {
             model.setWorkAlarm(true);

+ 2 - 1
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/auto/AlarmService.java

@@ -251,7 +251,8 @@ public class AlarmService extends Service {
                         util.signinMission(bean);
                         break;
                     case STATUS_LEAVE_ALARM://离开办公室提醒
-                        getNotificationManage().sendNotification(MyApplication.getInstance(), R.string.outoff_work, SigninActivity.class);
+                        getNotificationManage().sendNotification(MyApplication.getInstance(),
+                                R.string.outoff_work, SigninActivity.class);
 //                        MissionPlanEntity bean1 = (MissionPlanEntity) map.get("data");
 //                        updateDB(bean1.getId(), 3);
 //                        getNotificationManage().sendNotification(MyApplication.getInstance(),

+ 1 - 5
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/auto/HttpHandler.java

@@ -25,11 +25,9 @@ import static android.os.Message.obtain;
 public class HttpHandler extends Handler {
 
     private static HttpHandler instance;
-    private String baseUrl = null;
     private JsonValidator validator = null;
 
     private HttpHandler() {
-        baseUrl = CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_baseurl");
         validator = new JsonValidator();
     }
 
@@ -72,9 +70,7 @@ public class HttpHandler extends Handler {
     public void loadERPByNet(int what, String action, Map<String, Object> param, Bundle bundle, OnResultListener listener) {
         LinkedHashMap<String, Object> headers = new LinkedHashMap<>();
         headers.put("Cookie", "JSESSIONID=" + CommonUtil.getSharedPreferences(MyApplication.getInstance(), "sessionId"));
-        if (StringUtils.isEmpty(baseUrl))
-            baseUrl = CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_baseurl");
-        String url = baseUrl + action;
+        String url = CommonUtil.getSharedPreferences(MyApplication.getInstance(), "erp_baseurl") + action;
         if (bundle == null)
             bundle = new Bundle();
         if (listener != null)

BIN
WeiChat/src/main/res/drawable-xhdpi/add_address.png


BIN
WeiChat/src/main/res/drawable-xhdpi/icon_all_mission.png


BIN
WeiChat/src/main/res/drawable-xhdpi/icon_emind.png


BIN
WeiChat/src/main/res/drawable-xhdpi/icon_last_missiom.png


BIN
WeiChat/src/main/res/drawable-xxhdpi/add_address.png


BIN
WeiChat/src/main/res/drawable-xxhdpi/icon_all_mission.png


BIN
WeiChat/src/main/res/drawable-xxhdpi/icon_emind.png


BIN
WeiChat/src/main/res/drawable-xxhdpi/icon_last_missiom.png


+ 45 - 14
WeiChat/src/main/res/layout/item_aims_base.xml

@@ -8,7 +8,8 @@
         android:id="@+id/content"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:padding="@dimen/misson_item_pl">
+        android:padding="@dimen/misson_item_pl"
+        android:visibility="gone">
 
         <TextView
             android:id="@+id/long_tv"
@@ -49,6 +50,7 @@
             android:layout_alignBottom="@+id/visit_num_tv"
             android:layout_alignParentLeft="true"
             android:layout_alignParentStart="true"
+            android:drawableLeft="@drawable/icon_last_missiom"
             android:textColor="@color/text_hine"
             android:textSize="@dimen/text_hine" />
 
@@ -60,6 +62,7 @@
             android:layout_marginLeft="30dp"
             android:layout_marginTop="5dp"
             android:layout_toRightOf="@id/last_time_tv"
+            android:drawableLeft="@drawable/icon_all_mission"
             android:textColor="@color/text_hine"
             android:textSize="@dimen/text_hine" />
     </RelativeLayout>
@@ -68,22 +71,33 @@
         android:id="@+id/empty"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
+        android:background="@color/item_line"
         android:orientation="vertical">
 
-        <TextView
+        <LinearLayout
             android:layout_width="match_parent"
-            android:layout_height="50dp"
-            android:background="@color/item_line"
+            android:layout_height="wrap_content"
             android:gravity="center"
-            android:text="没有符合条件的结果"
-            android:textColor="@color/text_main" />
+            android:padding="10dp">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="40dp"
+                android:layout_gravity="center"
+                android:drawableLeft="@drawable/icon_emind"
+                android:gravity="center"
+                android:text="没有符合条件的结果" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="20dp"
+            android:background="#ebe9e9" />
 
         <RelativeLayout
             android:id="@+id/add_rl"
             android:layout_width="match_parent"
-            android:layout_height="50dp"
-            android:layout_marginTop="20dp"
-            android:background="@color/item_color1"
+            android:layout_height="wrap_content"
             android:padding="10dp">
 
             <ImageView
@@ -91,19 +105,36 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_alignParentRight="true"
-                android:layout_centerVertical="true"
+                android:layout_marginTop="12dp"
                 android:src="@drawable/oa_next" />
 
+            <ImageView
+                android:id="@+id/home_tag"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:src="@drawable/add_address" />
+
             <TextView
                 android:id="@+id/add_tv"
                 android:layout_width="wrap_content"
-                android:layout_height="match_parent"
-                android:layout_alignParentLeft="true"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="5dp"
                 android:layout_toLeftOf="@id/add_tag"
+                android:layout_toRightOf="@id/home_tag"
                 android:gravity="center|left"
-                android:text="aaaaa"
-                android:textColor="@color/text_main" />
+                android:textColor="@color/text_main"
+                android:textSize="@dimen/text_main" />
 
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignLeft="@id/add_tv"
+                android:layout_below="@id/add_tv"
+                android:layout_marginTop="3dp"
+                android:layout_toLeftOf="@id/add_tag"
+                android:layout_toRightOf="@id/home_tag"
+                android:text="加入常用地址"
+                android:textSize="@dimen/text_main" />
 
         </RelativeLayout>
     </LinearLayout>

+ 2 - 2
WeiChat/src/main/res/values/gpm_values.xml

@@ -117,7 +117,7 @@
     <dimen name="drawable_padding">5dp</dimen>
 
     <style name="text_color">  
-        <item name="android:textColor">@color/red</item>
-        <item name="android:textSize">25sp</item>
+        <item name="android:textColor">#268508</item>
+        <item name="android:textSize">@dimen/text_main</item>
     </style>
 </resources>