Browse Source

合并私有分支

Bitliker 8 years ago
parent
commit
bd3c4a426e

+ 7 - 1
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/MainActivity.java

@@ -572,9 +572,11 @@ public class MainActivity extends BaseActivity implements ImStatusListener, NetW
 //        }
 //        dbManager.closeDB();
 		doHiTask();
+		autoPresenter = AutoPresenter.onCreate();
 		handler.post(new Runnable() {
 			@Override
 			public void run() {
+				if (!BaseConfig.isDebug())
 				startService(new Intent(MainActivity.this, AutoErpService.class));
 			}
 		});
@@ -582,7 +584,7 @@ public class MainActivity extends BaseActivity implements ImStatusListener, NetW
 
 	}
 
-
+	private AutoPresenter autoPresenter;
 	private Handler handler = new Handler();
 	private Runnable runnable = new MyRunnable();
 	private Boolean firstRed = true;
@@ -870,6 +872,7 @@ public class MainActivity extends BaseActivity implements ImStatusListener, NetW
 		UserDao.getInstance().updateUnLineTime(MyApplication.getInstance().mLoginUser.getUserId(), time);
 	}
 
+
 	@Override
 	protected void onDestroy() {
 		saveOfflineTime();
@@ -882,6 +885,9 @@ public class MainActivity extends BaseActivity implements ImStatusListener, NetW
 		unregisterReceiver(mUserLogInOutReceiver);
 		screenListener.unregisterListener();
 		//移除广播接收
+		if (autoPresenter != null) {
+			autoPresenter.onDestroy();
+		}
 		super.onDestroy();
 	}
 

+ 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

@@ -265,4 +265,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);
+	}
 }
 

+ 1 - 1
app_modular/apptasks/src/main/AndroidManifest.xml

@@ -7,7 +7,7 @@
         android:label="@string/app_name"
         android:supportsRtl="true">
         <receiver
-            android:name=".service.AutoTaskReceiver"
+            android:name=".receiver.AutoTaskReceiver"
             android:enabled="true"
             android:exported="true">
             <intent-filter>

+ 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;
-	}
-}

+ 210 - 0
app_modular/apptasks/src/main/java/com/modular/apptasks/presenter/AutoPresenter.java

@@ -0,0 +1,210 @@
+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;
+
+/**
+ * 创建新的自动任务管理类,由MainActivity控制,和MainActivity生命周期同步
+ * 1.定时任务由服务的循环变成Alarm模式,节约电
+ * Created by Bitliker on 2017/10/11.
+ */
+public class AutoPresenter {
+
+	private final String[] flags = {
+			AppConstant.CHANGE_WORK_TASK,//
+			AppConstant.UPDATA_ERP_CHANGE//切换账套
+	};
+
+	public static AutoPresenter onCreate() {
+		return new 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() {
+				reckonWorkThread(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) {
+			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);
+	}
+
+}

+ 1 - 1
app_modular/apptasks/src/main/java/com/modular/apptasks/service/AutoTaskReceiver.java → app_modular/apptasks/src/main/java/com/modular/apptasks/receiver/AutoTaskReceiver.java

@@ -1,4 +1,4 @@
-package com.modular.apptasks.service;
+package com.modular.apptasks.receiver;
 
 import android.content.BroadcastReceiver;
 import android.content.Context;

+ 8 - 3
app_modular/apptasks/src/main/java/com/modular/apptasks/util/AlarmUtil.java

@@ -9,7 +9,7 @@ import android.os.Build;
 import com.common.LogUtil;
 import com.common.config.BaseConfig;
 import com.common.data.DateFormatUtil;
-import com.modular.apptasks.service.AutoTaskReceiver;
+import com.modular.apptasks.receiver.AutoTaskReceiver;
 
 /**
  * AlarmManager.ELAPSED_REALTIME 表示闹钟在手机睡眠状态下不可用,该状态下闹钟使用相对时间(相对于系统启动开始),状态值为3;
@@ -22,8 +22,13 @@ import com.modular.apptasks.service.AutoTaskReceiver;
 
 public class AlarmUtil {
 
-	public  static final int ID_WORK=101;
-	public  static final String ACTION_WORK="action_work";
+	/*打卡定时任务*/
+	public static final int ID_WORK = 101;
+	public static final String ACTION_WORK = "action_work";
+
+	/*外勤定时任务*/
+	public static final int ID_MISSION = 102;
+	public static final String ACTION_MISSION = "action_mission";
 
 	/**
 	 * 使用闹钟模式开启定时任务,定时回调

+ 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);

+ 13 - 6
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));
@@ -409,7 +415,12 @@ public class AutoErpSigninUitl implements OnHttpResultListener {
 				case MAC_VAL://判断mac地址
 					if (isJSON && JSON.parseObject(message).containsKey("success") &&
 							JSON.parseObject(message).getBoolean("success")) {
-
+						CommonInterface.getInstance().getCodeByNet("CardLog", new CommonInterface.OnResultListener() {
+							@Override
+							public void result(boolean isOk, int result, String message) {
+								signinWork(bundle, message);
+							}
+						});
 					} else {
 						CommonUtil.saveAutoLogtoLocal(getString(R.string.auto_sign_failed), message);
 					}
@@ -429,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:
@@ -673,13 +685,9 @@ 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);
 		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)) {
@@ -694,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)) {