Browse Source

修改重新登陆会多次打卡的问题

Bitliker 8 years ago
parent
commit
656876d36a

+ 2 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/MainActivity.java

@@ -41,6 +41,7 @@ import com.baidu.android.pushservice.PushManager;
 import com.baidu.autoupdatesdk.BDAutoUpdateSDK;
 import com.baidu.autoupdatesdk.UICheckUpdateCallback;
 import com.common.LogUtil;
+import com.common.config.BaseConfig;
 import com.common.data.DateFormatUtil;
 import com.common.data.ListUtils;
 import com.common.data.StringUtil;
@@ -576,6 +577,7 @@ public class MainActivity extends BaseActivity implements ImStatusListener, NetW
 		handler.post(new Runnable() {
 			@Override
 			public void run() {
+				if (!BaseConfig.isDebug())
 				startService(new Intent(MainActivity.this, AutoErpService.class));
 			}
 		});

+ 2 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/util/oa/AutoErpService.java

@@ -15,6 +15,7 @@ import android.util.Log;
 
 import com.alibaba.fastjson.JSON;
 import com.common.LogUtil;
+import com.common.config.BaseConfig;
 import com.common.data.DateFormatUtil;
 import com.common.data.ListUtils;
 import com.common.data.StringUtil;
@@ -301,6 +302,7 @@ public class AutoErpService extends Service {
 	 * @throws Exception
 	 */
 	private void reckonWork() {
+		if (BaseConfig.isDebug()) return;
 		if (System.currentTimeMillis() - updateTime < 30000) {
 			return;
 		}

+ 6 - 0
app_core/common/src/main/java/com/common/data/DateFormatUtil.java

@@ -264,4 +264,10 @@ public class DateFormatUtil {
     }
 
 
+    public static long hhmm2Long(String hhMM){
+        if (StringUtil.isEmpty(hhMM)) return 0;
+        String che = long2Str(DateFormatUtil.YMD) + " " + hhMM + ":00";//当天下班时间
+        return DateFormatUtil.str2Long(che, DateFormatUtil.YMD_HMS);
+    }
+
 }

+ 18 - 3
app_core/common/src/main/java/com/core/net/location/BdLocationHelper.java

@@ -4,7 +4,6 @@ import android.content.Context;
 import android.content.Intent;
 import android.support.v4.content.LocalBroadcastManager;
 
-import com.alibaba.fastjson.JSON;
 import com.baidu.location.BDLocation;
 import com.baidu.location.BDLocationListener;
 import com.baidu.location.LocationClient;
@@ -91,6 +90,13 @@ public class BdLocationHelper {
 	 * 重新定位
 	 **/
 	public void requestLocation() {
+		requestLocation(null);
+	}
+
+	public void requestLocation(OnReceiveListener onReceiveListener) {
+		if (onReceiveListener != null) {
+			this.onReceiveListener = onReceiveListener;
+		}
 		if (mLocationClient == null) return;
 		if (!mLocationClient.isStarted()) {
 			mFaildCount = 0;
@@ -100,7 +106,6 @@ public class BdLocationHelper {
 		}
 	}
 
-
 	private BDLocationListener mLocationListener = new BDLocationListener() {
 		@Override
 		public void onReceiveLocation(BDLocation location) {
@@ -121,6 +126,8 @@ public class BdLocationHelper {
 				|| location.getLocType() == BDLocation.TypeOffLineLocation//离线定位(未验证离线定位的有效性)
 				) {
 			//定位成功
+			mLocationClient.stop();
+			LogUtil.i("定位成功" + location.getLocType());
 			locationOk = true;
 			latLng = new LatLng(location.getLatitude(), location.getLongitude());
 			this.location = location.getLocationDescribe();
@@ -133,10 +140,13 @@ public class BdLocationHelper {
 			if (!StringUtil.isEmpty(address))
 				PreferenceUtils.putString("bdaddress", address);
 			errorMessage = "";
-			LogUtil.i(JSON.toJSONString(this));
 			//发送广播
 			broadcast.putExtra(Constants.ACTION_LOCATION_CHANGE, locationOk);
 			LocalBroadcastManager.getInstance(BaseConfig.getContext()).sendBroadcast(broadcast);
+			if (onReceiveListener != null) {
+				onReceiveListener.receive(latLng, this.location, address);
+				onReceiveListener = null;
+			}
 		} else {
 			//统一为定位失败
 			locationOk = false;
@@ -226,5 +236,10 @@ public class BdLocationHelper {
 		errorMessage = null;
 	}
 
+	private OnReceiveListener onReceiveListener;
+
+	public interface OnReceiveListener {
+		void receive(LatLng latLng, String location, String address);
+	}
 }
 

+ 32 - 33
app_modular/applogin/src/main/java/com/modular/login/activity/RegisterSelectActivity.java

@@ -5,42 +5,41 @@ import android.os.Bundle;
 import android.view.View;
 
 import com.core.base.BaseActivity;
-import com.core.utils.IntentUtils;
 import com.modular.login.R;
 
 import de.hdodenhof.circleimageview.CircleImageView;
 
 public class RegisterSelectActivity extends BaseActivity implements View.OnClickListener {
-    private CircleImageView ivHead;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_register_select);
-        ivHead = (CircleImageView) findViewById(R.id.iv_head);
-        getSupportActionBar().setTitle("新用户注册");
-        findViewById(R.id.person_btn).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                startActivity(new Intent(mContext, PersonalRegActivity.class));
-                finish();
-            }
-        });
-
-        findViewById(R.id.company_btn).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                IntentUtils.webLinks(mContext,
-                        "https://account.ubtob.com/sso/register",
-                        "企业注册");
-//                startActivity(new Intent(mContext, EnterpriseRegisterActivity.class));
-//                finish();
-            }
-        });
-    }
-
-    @Override
-    public void onClick(View v) {
-
-    }
+	private CircleImageView ivHead;
+
+	@Override
+	protected void onCreate(Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		setContentView(R.layout.activity_register_select);
+		ivHead = (CircleImageView) findViewById(R.id.iv_head);
+		getSupportActionBar().setTitle("新用户注册");
+		findViewById(R.id.person_btn).setOnClickListener(new View.OnClickListener() {
+			@Override
+			public void onClick(View v) {
+				startActivity(new Intent(mContext, PersonalRegActivity.class));
+				finish();
+			}
+		});
+
+		findViewById(R.id.company_btn).setOnClickListener(new View.OnClickListener() {
+			@Override
+			public void onClick(View v) {
+//                IntentUtils.webLinks(mContext,
+//                        "https://account.ubtob.com/sso/register",
+//                        "企业注册");
+				startActivity(new Intent(mContext, EnterpriseRegisterActivity.class));
+				finish();
+			}
+		});
+	}
+
+	@Override
+	public void onClick(View v) {
+
+	}
 }

+ 0 - 61
app_modular/apptasks/src/main/java/com/modular/apptasks/AutoTasks.java

@@ -1,61 +0,0 @@
-package com.modular.apptasks;
-
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-
-import com.core.utils.CommonInterface;
-import com.modular.apptasks.service.AutoTaskHttp;
-
-/**
- * Created by Bitliker on 2017/9/29.
- */
-
-public class AutoTasks {
-	private static AutoTasks instance;
-	private AutoTaskHttp taskHttp;
-	public static AutoTasks getInstance() {
-		AutoTasks inst = instance;
-		if (inst == null) {
-			synchronized (AutoTasks.class) {
-				inst = instance;
-				if (inst == null) {
-					inst = new AutoTasks();
-					instance = inst;
-				}
-			}
-		}
-		return inst;
-	}
-
-	private AutoTasks() {
-
-	}
-
-	//初始化时候
-	public void initTask() {
-		initMission();
-	}
-
-	/**
-	 * 初始化外勤
-	 * 1.先获取网络的外勤,获取到网络的外勤数据以后在保存到数据库
-	 */
-	private void initMission() {
-		CommonInterface.getInstance().getOutSetInfo(new CommonInterface.OnResultListener() {
-			@Override
-			public void result(@NonNull boolean success, @NonNull int what, @Nullable String message) {
-				if (success){
-					getTaskHttp().loadMissionPlan();
-				}
-			}
-		});
-	}
-
-
-	public AutoTaskHttp getTaskHttp() {
-		if (taskHttp==null){
-			taskHttp=new AutoTaskHttp();
-		}
-		return taskHttp;
-	}
-}

+ 164 - 5
app_modular/apptasks/src/main/java/com/modular/apptasks/presenter/AutoPresenter.java

@@ -1,9 +1,27 @@
 package com.modular.apptasks.presenter;
 
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.support.v4.content.LocalBroadcastManager;
+
+import com.baidu.mapapi.model.LatLng;
+import com.common.LogUtil;
+import com.common.config.BaseConfig;
+import com.common.data.DateFormatUtil;
 import com.common.data.ListUtils;
+import com.common.data.StringUtil;
 import com.common.thread.ThreadUtil;
+import com.core.app.AppConstant;
+import com.core.app.MyApplication;
 import com.core.dao.work.WorkModelDao;
 import com.core.model.WorkModel;
+import com.core.net.http.http.OAHttpHelper;
+import com.core.net.location.BdLocationHelper;
+import com.core.utils.BaiduMapUtil;
+import com.modular.apptasks.util.AlarmUtil;
+import com.uas.appworks.OA.erp.utils.AutoErpSigninUitl;
 
 import java.util.List;
 
@@ -14,38 +32,179 @@ import java.util.List;
  */
 public class AutoPresenter {
 
+	private final String[] flags = {
+			AppConstant.CHANGE_WORK_TASK,//
+			AppConstant.UPDATA_ERP_CHANGE//切换账套
+	};
+
 	public static AutoPresenter onCreate() {
 		return new AutoPresenter();
 	}
 
-	private AutoPresenter() {
+	private AutoErpSigninUitl signinUitl;
 
+	private AutoPresenter() {
+		signinUitl = new AutoErpSigninUitl();
+		initBroadcast();
+		initTask();
 	}
 
 
 	public void onDestroy() {
+		LocalBroadcastManager.getInstance(BaseConfig.getContext()).unregisterReceiver(updateReceiver);
+	}
+
+	private void initTask() {
+		reckonWork(true);
+	}
 
+	/* 初始化广播	 */
+	private void initBroadcast() {
+		IntentFilter filter = new IntentFilter();
+		if (flags != null && flags.length > 0) {
+			for (String e : flags)
+				filter.addAction(e);
+		}
+		LocalBroadcastManager.getInstance(BaseConfig.getContext()).registerReceiver(updateReceiver, filter);
 	}
 
+	private BroadcastReceiver updateReceiver = new BroadcastReceiver() {
+		@Override
+		public void onReceive(Context context, Intent intent) {
+			if (intent == null || StringUtil.isEmpty(intent.getAction())) return;
+			LogUtil.i("onReceive=" + intent.getAction());
+			switch (intent.getAction()) {
+				case AppConstant.CHANGE_WORK_TASK:
+					//判断是否开启任务
+					if (intent.getBooleanExtra(AppConstant.CHANGE_WORK_TASK, true)) {
+						reckonWork(false);
+					}
+					break;
+				case AppConstant.UPDATA_ERP_CHANGE:
+					initTask();
+					break;
+
+			}
+		}
+	};
+
 
 	/*计算打开*/
 	private void reckonWork(final boolean loadAble) {
 		ThreadUtil.getInstance().addTask(new Runnable() {
 			@Override
 			public void run() {
-				reckonWorkInThread(loadAble);
+				reckonWorkThread(loadAble);
 			}
 		});
 	}
 
-	private void reckonWorkInThread(boolean loadAble) {
+	/**
+	 * 尽最少的计算,判断时候需要打卡或是下一次打卡的时间戳
+	 *
+	 * @param loadAble
+	 */
+	private void reckonWorkThread(boolean loadAble) {
 		List<WorkModel> models = WorkModelDao.getInstance().queryAuto();
 		if (!ListUtils.isEmpty(models)) {
-
+			String newHHMM = DateFormatUtil.long2Str(DateFormatUtil.HM);
+			for (WorkModel m : models) {
+				if (satisfyModelThread(newHHMM, m)) {
+					LogUtil.i("break;break;break;");
+					break;
+				}
+			}
 		} else if (loadAble) {
-			//TODO 下拉数据
+			OAHttpHelper.getInstance().post(new Runnable() {
+				@Override
+				public void run() {
+					signinUitl.loadWorkSet();
+				}
+			});
+		}
+	}
+
+
+	/*判断班次是否符合打卡或是提交定时任务*/
+	private boolean satisfyModelThread(String newHHMM, WorkModel model) {
+		//1.判断上班(打卡条件:在上班开始时间到上班时间可以打卡)
+		//1.1 判断上班有没有打卡
+		if (StringUtil.isEmpty(model.getWorkSignin())) {
+			//1.2 判断当前时间是否在上班结束时间之前,当属于该范围,可以为他打卡
+			if (newHHMM.compareTo(model.getWorkTime()) <= 0) {
+				//1.3 判断当前时间在上班开始时间之后,符合打卡==》前往打卡
+				if (newHHMM.compareTo(model.getWorkStart()) >= 0) {
+					saveWorkLogThread(true, model);
+					return true;
+				} else {//当前时间在上班开始时间之前,需要定闹铃==》前往闹铃
+					pushAlarmThread(true, model);
+					return true;
+				}
+
+			}//如果不符合,需要计算下班范围
 		}
+		//2.判断下班
+		//2.1 判断下班有没有打卡
+		if (StringUtil.isEmpty(model.getOffSignin())) {
+			//2.2 判断当前时间是否在下班结束范围之内,当属于该范围,可以为他打卡
+			if (newHHMM.compareTo(model.getOffend()) <= 0) {
+				//1.3 判断当前时间在下班时间之后,符合打卡==》前往打卡
+				if (newHHMM.compareTo(model.getOffTime()) >= 0) {
+					saveWorkLogThread(false, model);
+					return true;
+				} else {
+					pushAlarmThread(false, model);
+					return true;
+				}
+			}
+		}
+		return false;
 	}
 
+	/*符合条件,进行判断距离和打卡操作*/
+	private void saveWorkLogThread(final boolean isWork, final WorkModel model) {
+		LogUtil.i("符合打卡时间");
+		MyApplication.getInstance().getBdLocationHelper().requestLocation(new BdLocationHelper.OnReceiveListener() {
+			@Override
+			public void receive(LatLng latLng, String location, String address) {
+				//判断是否符合打卡
+				if (BaiduMapUtil.getInstence().isInWorkPlce()) {
+					signinUitl.signinWork(model);
+				} else {
+					//不符合打卡情况下,去判断下一次打卡时间
+					ThreadUtil.getInstance().addTask(new Runnable() {
+						@Override
+						public void run() {
+							pushAlarmThread(isWork, model);
+						}
+					});
+				}
+			}
+		});
+	}
+
+	/*提交定时任务*/
+	private void pushAlarmThread(boolean isWork, WorkModel model) {
+		long nextTime = 0;
+		long startTime = 0;
+		long endTime = 0;
+		if (isWork) {
+			long workStart = DateFormatUtil.hhmm2Long(model.getWorkStart());
+			long workTime = DateFormatUtil.hhmm2Long(model.getWorkTime());
+			startTime = Math.max(workStart, workTime - 1000 * 30 * 60);
+			endTime = workTime;
+		} else {
+			startTime = DateFormatUtil.hhmm2Long(model.getOffTime());
+			endTime = startTime + 1000 * 30 * 60;
+		}
+		while (startTime <= endTime) {
+			if (startTime > System.currentTimeMillis()) {
+				nextTime = startTime;
+				break;
+			}
+			startTime += 5 * 60 * 1000;
+		}
+		AlarmUtil.startAlarm(AlarmUtil.ID_WORK, AlarmUtil.ACTION_WORK, nextTime);
+	}
 
 }

+ 25 - 23
app_modular/apptasks/src/main/java/com/modular/apptasks/service/AutoTaskHttp.java → app_modular/apptasks/src/main/java/com/modular/apptasks/util/AutoTaskHttp.java

@@ -1,8 +1,12 @@
-package com.modular.apptasks.service;
+package com.modular.apptasks.util;
 
 import com.alibaba.fastjson.JSONArray;
 import com.common.LogUtil;
-import com.core.model.MissionModel;
+import com.core.api.wxapi.ApiConfig;
+import com.core.api.wxapi.ApiPlatform;
+import com.core.api.wxapi.ApiUtils;
+import com.core.net.http.http.OAHttpHelper;
+import com.core.net.http.http.Request;
 import com.core.utils.CommonUtil;
 import com.modular.apputils.listener.OnSmartHttpListener;
 import com.modular.apputils.network.Failure;
@@ -10,13 +14,8 @@ import com.modular.apputils.network.Parameter;
 import com.modular.apputils.network.SmartHttpClient;
 import com.modular.apputils.network.Success;
 
-import java.util.List;
-
-import rx.Observable;
-import rx.Subscriber;
-import rx.android.schedulers.AndroidSchedulers;
-import rx.functions.Action1;
-import rx.schedulers.Schedulers;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * Created by Bitliker on 2017/9/29
@@ -27,6 +26,23 @@ public class AutoTaskHttp implements OnSmartHttpListener {
 	private final int SIGNIN_MISSION = 22;//外勤签到
 	private final int HAVE_OUT_PLAN = 23;//还有未拜访外勤计划
 
+	private final int LOAD_WORK_SET = 24;//获取打卡设置
+	private boolean isB2b;
+
+	public AutoTaskHttp() {
+		isB2b = ApiUtils.getApiModel() instanceof ApiPlatform;
+	}
+
+	/*获取打卡设置*/
+	public void loadWorkSet() {
+		String action = isB2b ? ApiConfig.getInstance(ApiUtils.getApiModel()).getmApiBase().get_plat_senior_setting_url :
+				"mobile/getconfigs.action";
+		Parameter.Builder builder = new Parameter.Builder().setAction(action).record(LOAD_WORK_SET);
+		if (!isB2b) {
+			builder.add("code", 1);
+		}
+		SmartHttpClient.api().get(builder.build(), this);
+	}
 
 	//获取外勤计划列表
 	public void loadMissionPlan() {
@@ -59,20 +75,6 @@ public class AutoTaskHttp implements OnSmartHttpListener {
 
 
 	private void handlerData(final JSONArray array) {
-		Observable.create(new Observable.OnSubscribe<List<MissionModel>>() {
-			@Override
-			public void call(Subscriber<? super List<MissionModel>> subscriber) {
-
-
-			}
-		}).observeOn(Schedulers.newThread())
-				.subscribeOn(AndroidSchedulers.mainThread())
-				.subscribe(new Action1<List<MissionModel>>() {
-					@Override
-					public void call(List<MissionModel> missionModel) {
-
-					}
-				});
 
 
 	}

+ 1 - 1
app_modular/apptasks/src/main/java/com/modular/apptasks/util/ReckonAutoUtil.java

@@ -108,7 +108,7 @@ public class ReckonAutoUtil {
 	 * @param w 计算班次
 	 * @return
 	 */
-	private boolean satisfyNextSignin(WorkModel w) {
+	public boolean satisfyNextSignin(WorkModel w) {
 		if (StringUtil.isEmpty(w.getOffend()) || StringUtil.isEmpty(w.getWorkStart()))
 			return false;
 		String newHHMM = DateFormatUtil.long2Str(DateFormatUtil.HM);

+ 17 - 9
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/utils/AutoErpSigninUitl.java

@@ -82,12 +82,18 @@ public class AutoErpSigninUitl implements OnHttpResultListener {
 		isB2b = ApiUtils.getApiModel() instanceof ApiPlatform;
 	}
 
+	private boolean signWorking = false;
+
 	/**
 	 * 签到内勤
 	 *
 	 * @param model 签到班次对象
 	 */
 	public void signinWork(WorkModel model) {
+		if (signWorking) {
+			return;
+		}
+		signWorking = true;
 		//1.判读mac地址是否符合     3.签到
 		if (!MyApplication.getInstance().isNetworkActive()) {
 			CommonUtil.saveAutoLogtoLocal(getString(R.string.auto_sign_failed), getString(R.string.common_notlinknet));
@@ -98,12 +104,18 @@ public class AutoErpSigninUitl implements OnHttpResultListener {
 			CommonUtil.saveAutoLogtoLocal(getString(R.string.auto_sign_failed), "未获取到mac地址");
 			return;
 		}
+		final Bundle bundle = new Bundle();
+		bundle.putParcelable("data", model);
 		if (isB2b) {
-			Bundle bundle = new Bundle();
-			bundle.putParcelable("data", model);
 			signinWork(bundle, "");
 		} else {
-			validatorMac(model, macAddress);
+			//去除手机判断	validatorMac(model, macAddress);
+			CommonInterface.getInstance().getCodeByNet("CardLog", new CommonInterface.OnResultListener() {
+				@Override
+				public void result(boolean isOk, int result, String message) {
+					signinWork(bundle, message);
+				}
+			});
 		}
 	}
 
@@ -428,6 +440,7 @@ public class AutoErpSigninUitl implements OnHttpResultListener {
 				case LOAD_WORKLOG://签到后保存到打卡数据库里面
 					if (isJSON && JSON.parseObject(message).containsKey("listdata")) {
 						saveSignin2DB(bundle, JSON.parseObject(message).getJSONArray("listdata"));
+						signWorking = false;
 					}
 					break;
 				case SIGNIN_MISSION:
@@ -671,14 +684,10 @@ public class AutoErpSigninUitl implements OnHttpResultListener {
 		//取最后一个
 		JSONObject object = array.getJSONObject(array.size() - 1);
 		String time = object.getString("cl_time");//获取最后一次打卡信息,班次打卡信息
-		time = DateFormatUtil.long2Str(DateFormatUtil.str2Long(time,DateFormatUtil.YMD_HMS), DateFormatUtil.HM);//获取到的
-		LogUtil.i("获取最后一次打卡信息,班次打卡信息=" + time);
+		time = DateFormatUtil.long2Str(DateFormatUtil.str2Long(time, DateFormatUtil.YMD_HMS), DateFormatUtil.HM);//获取到的
 		if (StringUtil.isEmpty(time) || model == null) return;
-		LogUtil.i("model="+JSON.toJSONString(model));
-		LogUtil.i("AUTO_SIGN_SW="+PreferenceUtils.getBoolean(PreferenceUtils.AUTO_SIGN_SW, true));
 		if (StringUtil.isEmpty(model.getWorkSignin()) && model.getWorkStart().compareTo(time) <= 0
 				&& model.getWorkTime().compareTo(time) >= 0) {
-			LogUtil.i("11111111111111111111" );
 			model.setWorkSignin(time);
 			long i = WorkModelDao.getInstance().update(model);
 			if (PreferenceUtils.getBoolean(PreferenceUtils.AUTO_SIGN_SW, true)) {
@@ -693,7 +702,6 @@ public class AutoErpSigninUitl implements OnHttpResultListener {
 			MsgBroadcast.sendLocalBroadcast(intent);
 		} else if (StringUtil.isEmpty(model.getOffSignin()) && model.getOffTime().compareTo(time) <= 0
 				&& model.getOffend().compareTo(time) >= 0) {
-			LogUtil.i("22222222222222222222222222222222" );
 			model.setOffSignin(time);
 			WorkModelDao.getInstance().update(model);
 			if (PreferenceUtils.getBoolean(PreferenceUtils.AUTO_SIGN_SW, true)) {