Browse Source

外勤签到人脸打卡

RaoMeng 6 years ago
parent
commit
84e2584ab5
23 changed files with 298 additions and 80 deletions
  1. 4 3
      WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/OutofficeSetActivity.java
  2. 2 2
      WeiChat/src/main/java/com/xzjmyk/pm/activity/util/imageloader/BitmapUtil.java
  3. 1 0
      app_core/common/build.gradle
  4. 1 1
      app_core/common/src/main/java/com/core/app/AppConfig.java
  5. 2 0
      app_core/common/src/main/java/com/core/app/Constants.java
  6. 15 4
      app_core/common/src/main/java/com/core/base/BaseToolBarActivity.java
  7. 61 0
      app_core/common/src/main/java/com/core/utils/BitmapUtils.java
  8. 6 2
      app_core/common/src/main/java/com/core/utils/CommonInterface.java
  9. 8 0
      app_core/common/src/main/java/com/core/utils/CommonInterfaceHandler.java
  10. 13 0
      app_core/common/src/main/java/com/core/utils/CommonUtil.java
  11. 4 2
      app_core/common/src/main/res/layout/activity_mission_set.xml
  12. 52 32
      app_core/network/src/main/java/com/me/network/app/http/HttpRequest.java
  13. 4 2
      app_core/network/src/main/java/com/me/network/app/http/impl/RetrofitImpl.java
  14. 9 3
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/activity/MissionActivity.java
  15. 19 4
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/activity/MissionSetActivity.java
  16. 6 4
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/model/IMission.java
  17. 3 2
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/presenter/IMissionPresenter.java
  18. 70 6
      app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/presenter/MissionPresenter.java
  19. 1 1
      app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/activity/ContactsAddActivity.java
  20. 1 1
      app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/activity/ContactsDetialActivity.java
  21. 0 2
      app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/activity/CustomerVisitDetailsActivity.java
  22. 12 7
      app_modular/facesdk/src/main/java/com/baidu/aip/excep/activity/RealTimeDetectFaceActivty.java
  23. 4 2
      version.gradle

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

@@ -60,9 +60,9 @@ public class OutofficeSetActivity extends BaseActivity {
                 case 0x11:
                     object = JSON.parseObject(message);
                     if (object.containsKey("success") && object.getBoolean("success"))
-                        ToastMessage( "保存成功");
+                        ToastMessage("保存成功");
                     else
-                        ToastMessage( "保存失败");
+                        ToastMessage("保存失败");
                     break;
             }
         }
@@ -213,7 +213,8 @@ public class OutofficeSetActivity extends BaseActivity {
 
         int distance = PreferenceUtils.getInt(AppConfig.ALARM_MISSION_DISTANCE, 500);
         final int time = PreferenceUtils.getInt(AppConfig.AUTO_MISSION_TIME, 30);
-        CommonInterface.getInstance().addOutSet(distance, time, isAuto, false, new CommonInterface.OnResultListener() {
+        int faceSign = PreferenceUtils.getInt(AppConfig.FACE_SIGN, -1);
+        CommonInterface.getInstance().addOutSet(distance, time, isAuto, false, faceSign, new CommonInterface.OnResultListener() {
             @Override
             public void result(boolean isOk, int result, String message) {
                 if (isOk && isAuto) {

+ 2 - 2
WeiChat/src/main/java/com/xzjmyk/pm/activity/util/imageloader/BitmapUtil.java

@@ -70,7 +70,6 @@ public class BitmapUtil {
     }
 
 
-
     public static Drawable getScaleDraw(String imgPath, Context mContext) {
         Bitmap bitmap = null;
         try {
@@ -258,7 +257,7 @@ public class BitmapUtil {
     /**
      * 将多个Bitmap合并成一个图片。
      *
-     * @param columns    将多个图合成多少列
+     * @param columns 将多个图合成多少列
      * @param bitmaps ... 要合成的图片
      * @return
      */
@@ -352,4 +351,5 @@ public class BitmapUtil {
 
         return myCaptureFile;
     }
+
 }

+ 1 - 0
app_core/common/build.gradle

@@ -77,6 +77,7 @@ dependencies {
     compile deps.wechatSdk
     compile 'com.github.hss01248:NotifyUtil:1.0.1'
     compile deps.basePopup
+    compile deps.acprogress
 
 //    androidTestCompile deps.leakcanaryNp
 //    debugCompile deps.leakcanary

+ 1 - 1
app_core/common/src/main/java/com/core/app/AppConfig.java

@@ -19,7 +19,7 @@ public class AppConfig {
     public final static String ALARMA_CLICK = "ALARMA_CLICK";//判断是否选中提醒
     public final static String AUTO_MISSION = "AUTO_MISSION";//是否自动外勤
     public final static String NEED_PROCESS = "NEED_PROCESS";//外勤设置是否需要审批
-    public final static String FACE_SIGN = "FACE_SIGN";//外勤设置是否开启人脸打卡
+    public final static String FACE_SIGN = "FACE_SIGN";//外勤设置是否开启人脸打卡  1:打开 2:关闭  -1:没有人脸设置
 
     public final static String ALARM_MISSION_TIME = "ALARM_MISSION_TIME";//提醒时间
     public final static String ALARM_MISSION_DISTANCE = "ALARM_MISSION_DISTANCE";//有效距离

+ 2 - 0
app_core/common/src/main/java/com/core/app/Constants.java

@@ -588,5 +588,7 @@ public class Constants {
         String LIST_CONDITION = "mListCondition";//列表Condition
         String DB_FIND_CONDITION = "dbfindCondition";//录入界面,dbfind字段添加的前提Condition
         String BILL_LIST_FIELD_FORWARD = "Bill_List_Field_Forward";//录入界面,dbfind字段添加的前提Condition
+
+        String FACE_SIGN_BASE64 = "face_sign_base64";//人脸识别的base64编码
     }
 }

+ 15 - 4
app_core/common/src/main/java/com/core/base/BaseToolBarActivity.java

@@ -2,6 +2,7 @@ package com.core.base;
 
 import android.annotation.SuppressLint;
 import android.content.Context;
+import android.graphics.Color;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.support.annotation.LayoutRes;
@@ -24,6 +25,9 @@ import com.core.utils.CommonUtil;
 import com.core.utils.StatusBarUtil;
 import com.core.utils.ToastUtil;
 
+import cc.cloudist.acplibrary.ACProgressConstant;
+import cc.cloudist.acplibrary.ACProgressFlower;
+
 /**
  * Created by Bitlike on 2018/5/3.
  */
@@ -31,6 +35,7 @@ public class BaseToolBarActivity extends AppCompatActivity {
     private FrameLayout contentFl;
     private Toolbar commonToolBar;
     private TextView commonTitleTv;
+    protected ACProgressFlower loadingView;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -38,6 +43,11 @@ public class BaseToolBarActivity extends AppCompatActivity {
                 WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
         super.onCreate(savedInstanceState);
         super.setContentView(R.layout.base_bar_layout);
+        loadingView = new ACProgressFlower.Builder(this)
+                .direction(ACProgressConstant.DIRECT_CLOCKWISE)
+                .themeColor(Color.WHITE)
+                .fadeColor(Color.DKGRAY).build();
+
         contentFl = findViewById(R.id.contentFl);
         int rceId = getLayoutRes();
         if (rceId > 0) {
@@ -57,7 +67,7 @@ public class BaseToolBarActivity extends AppCompatActivity {
     public CharSequence getToolBarTitle() {
         if (commonTitleTv != null && !TextUtils.isEmpty(commonTitleTv.getText())) {
             return commonTitleTv.getText();
-        } else if (getSupportActionBar() != null&&!TextUtils.isEmpty(getSupportActionBar().getTitle())) {
+        } else if (getSupportActionBar() != null && !TextUtils.isEmpty(getSupportActionBar().getTitle())) {
             return getSupportActionBar().getTitle();
         }
         return "";
@@ -93,12 +103,12 @@ public class BaseToolBarActivity extends AppCompatActivity {
     }
 
     public void initCommonToolbar() {
-        LogUtil.d("arison","commonToolBar="+commonToolBar);
+        LogUtil.d("arison", "commonToolBar=" + commonToolBar);
         if (commonToolBar != null) {
             StatusBarUtil.immersive(this, 0x00000000, 0.0f);
             setSupportActionBar(commonToolBar);
             getSupportActionBar().setDisplayShowTitleEnabled(false);
-            LogUtil.d("arison","标题栏设置padding");
+            LogUtil.d("arison", "标题栏设置padding");
             StatusBarUtil.setPaddingSmart(this, commonToolBar);
             commonToolBar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
                 @Override
@@ -185,7 +195,7 @@ public class BaseToolBarActivity extends AppCompatActivity {
                 commonTitleTv.setText(titleId);
             }
             if (getSupportActionBar() != null) {
-                getSupportActionBar(). setTitle(titleId);
+                getSupportActionBar().setTitle(titleId);
             }
         }
 
@@ -298,4 +308,5 @@ public class BaseToolBarActivity extends AppCompatActivity {
     protected void onStart() {
         super.onStart();
     }
+
 }

+ 61 - 0
app_core/common/src/main/java/com/core/utils/BitmapUtils.java

@@ -0,0 +1,61 @@
+package com.core.utils;
+
+import android.graphics.Bitmap;
+import android.os.Environment;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+public class BitmapUtils {
+
+    public static File saveBitmapToFile(Bitmap bitmap, String fileName) {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
+        int options = 100;
+        while (baos.toByteArray().length / 1024 > 500) {  //循环判断如果压缩后图片是否大于500kb,大于继续压缩
+            baos.reset();//重置baos即清空baos
+            options -= 10;//每次都减少10
+            bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
+            long length = baos.toByteArray().length;
+        }
+
+        File file = new File(Environment.getExternalStorageDirectory(), "/uu/faceSign/");
+        if (!file.exists()) {
+            file.mkdirs();
+        }
+        file = new File(Environment.getExternalStorageDirectory(), "/uu/faceSign/" + fileName + ".png");
+        try {
+            FileOutputStream fos = new FileOutputStream(file);
+            try {
+                fos.write(baos.toByteArray());
+                fos.flush();
+                fos.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        }
+
+        recycleBitmap(bitmap);
+        return file;
+    }
+
+    public static void recycleBitmap(Bitmap... bitmaps) {
+        if (bitmaps == null) {
+            return;
+        }
+        try {
+            for (Bitmap bm : bitmaps) {
+                if (null != bm && !bm.isRecycled()) {
+                    bm.recycle();
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 6 - 2
app_core/common/src/main/java/com/core/utils/CommonInterface.java

@@ -97,9 +97,10 @@ public class CommonInterface implements OnHttpResultListener {
      * @param distance         范围
      * @param time             预留时间
      * @param isAuto           是否开启自动外勤
+     * @param faceSign         是否开启人脸打卡
      * @param onResultListener
      */
-    public void addOutSet(int distance, int time, boolean isAuto, boolean needprocess, OnResultListener onResultListener) {
+    public void addOutSet(int distance, int time, boolean isAuto, boolean needprocess, int faceSign, OnResultListener onResultListener) {
         boolean isB2b = ApiUtils.getApiModel() instanceof ApiPlatform;
         Map<String, Object> param = new HashMap<>();
         Map<String, Object> formStore = new HashMap<>();
@@ -112,6 +113,9 @@ public class CommonInterface implements OnHttpResultListener {
         formStore.put("mo_needprocess", needprocess ? 1 : 0);//距离
         formStore.put("mo_time", time);//预留时间
         formStore.put("mo_autosign", isAuto ? 1 : 0);//是否自动外勤
+        if (faceSign != -1) {
+            formStore.put("mo_facesign", faceSign);//是否人脸打卡
+        }
         param.put("formStore", JSONUtil.map2JSON(formStore));
         String url = isB2b ? ApiConfig.getInstance(ApiUtils.getApiModel()).getmApiBase().saveOutSet : "mobile/addOutSet.action";
         loadNet(ADD_OUT_SET_WHAT, url, param, new Bundle(), Request.Mode.POST, onResultListener);
@@ -155,7 +159,7 @@ public class CommonInterface implements OnHttpResultListener {
     //获取班次数据
     private void loadWorkData(long time, OnResultListener onResultListener) {
         Map<String, Object> param = new HashMap<>();
-        param.put("date", DateFormatUtil.long2Str(time,"yyyyMMdd"));
+        param.put("date", DateFormatUtil.long2Str(time, "yyyyMMdd"));
         Bundle bundle = new Bundle();
         bundle.putLong("time", time);
         boolean isB2b = ApiUtils.getApiModel() instanceof ApiPlatform;

+ 8 - 0
app_core/common/src/main/java/com/core/utils/CommonInterfaceHandler.java

@@ -63,6 +63,7 @@ public class CommonInterfaceHandler {
                 PreferenceUtils.putBoolean(AppConfig.NEED_PROCESS, false);
                 PreferenceUtils.putInt(AppConfig.ALARM_MISSION_DISTANCE, 0);
                 PreferenceUtils.putInt(AppConfig.AUTO_MISSION_TIME, 0);
+                PreferenceUtils.putInt(AppConfig.FACE_SIGN, -1);
                 return false;
             }
             object = array.getJSONObject(0);
@@ -71,11 +72,18 @@ public class CommonInterfaceHandler {
         int time = JSONUtil.getInt(object, "mo_time", "MO_TIME");
         boolean isAuto = JSONUtil.getInt(object, "mo_autosign", "MO_AUTOSIGN") > 0;
         boolean needprocess = JSONUtil.getInt(object, "MO_NEEDPROCESS", "MO_NEEDPROCESS") > 0;
+        int faceSign = -1;
+        if (object.containsKey("MO_FACESIGN")) {
+            faceSign = JSONUtil.getInt(object, "MO_FACESIGN");
+        } else {
+            faceSign = -1;
+        }
         //获取到外勤设置   保存下来
         PreferenceUtils.putBoolean(AppConfig.AUTO_MISSION, isAuto);
         PreferenceUtils.putBoolean(AppConfig.NEED_PROCESS, needprocess);
         PreferenceUtils.putInt(AppConfig.ALARM_MISSION_DISTANCE, distance);
         PreferenceUtils.putInt(AppConfig.AUTO_MISSION_TIME, time);
+        PreferenceUtils.putInt(AppConfig.FACE_SIGN, faceSign);
         return true;
     }
 

+ 13 - 0
app_core/common/src/main/java/com/core/utils/CommonUtil.java

@@ -12,6 +12,7 @@ import android.content.pm.PackageManager;
 import android.content.res.AssetManager;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
+import android.graphics.Color;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 import android.net.Uri;
@@ -85,6 +86,9 @@ import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import cc.cloudist.acplibrary.ACProgressConstant;
+import cc.cloudist.acplibrary.ACProgressFlower;
+
 import static android.view.View.DRAWING_CACHE_QUALITY_AUTO;
 import static android.view.View.DRAWING_CACHE_QUALITY_HIGH;
 import static android.view.View.DRAWING_CACHE_QUALITY_LOW;
@@ -1467,4 +1471,13 @@ public class CommonUtil {
         view.setText(style);
     }
 
+
+    public static ACProgressFlower newLoading(Context context, String text) {
+        return new ACProgressFlower.Builder(context)
+                .direction(ACProgressConstant.DIRECT_CLOCKWISE)
+                .themeColor(Color.WHITE)
+                .text(text)
+                .fadeColor(Color.DKGRAY).build();
+    }
+
 }

+ 4 - 2
app_core/common/src/main/res/layout/activity_mission_set.xml

@@ -111,8 +111,10 @@
         android:layout_height="1px"
         android:background="@color/item_line" />
 
-    <RelativeLayout style="@style/commonSettingItem"
-        android:visibility="gone">
+    <RelativeLayout
+        android:id="@+id/face_sign_ll"
+        style="@style/commonSettingItem"
+        android:visibility="visible">
 
         <TextView
             android:layout_width="wrap_content"

+ 52 - 32
app_core/network/src/main/java/com/me/network/app/http/HttpRequest.java

@@ -53,39 +53,20 @@ public class HttpRequest {
      */
     public void sendRequest(final String requestHost, final HttpParams httpParams, final HttpCallback callback) {
 
-        if (httpParams == null) {
-            throw new IllegalArgumentException("httpParams can not be NULL");
-        }
-        if (requestHost == null) {
-            throw new IllegalArgumentException("requestHost can not be NULL");
-        }
-        if (callback == null) {
-            throw new IllegalArgumentException("callback can not be NULL");
-        }
-        if (httpParams.getUrl() == null) {
-            throw new IllegalArgumentException("requestUrl can not be NULL");
-        }
+        if (validHttpParams(requestHost, httpParams, callback)) return;
 
-        if (!isNetWorkConnected(BaseApplication.getInstance())) {
-            try {
-                callback.onFail(httpParams.getFlag(), BaseApplication.getInstance().getString(R.string.networks_out));
-                return;
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
-        mHttpClient = new HttpClient.Builder(requestHost).isDebug(true).build();
+        mHttpClient.Api().send(getBuild(httpParams), getResult(httpParams, callback));
+    }
 
-        mHttpClient.Api().send(new HttpClient.Builder()
-                .url(httpParams.getUrl())
-                .connectTimeout(httpParams.getConnectTimeOut())
-                .writeTimeout(httpParams.getWriteTimeOut())
-                .readTimeout(httpParams.getReadTimeOut())
-                .addHeaders(httpParams.getHeaders())
-                .addParams(httpParams.getParams())
-                .postBody(httpParams.getPostBody())
-                .method(httpParams.getMethod())
-                .build(), new ResultSubscriber<Object>(new Result2Listener<Object>() {
+    public void uploadFile(final String requestHost, final HttpParams httpParams, final HttpCallback callback) {
+
+        if (validHttpParams(requestHost, httpParams, callback)) return;
+
+        mHttpClient.Api().uploads(getBuild(httpParams), getResult(httpParams, callback));
+    }
+
+    private ResultSubscriber<Object> getResult(final HttpParams httpParams, final HttpCallback callback) {
+        return new ResultSubscriber<Object>(new Result2Listener<Object>() {
             @Override
             public void onResponse(Object response) {
                 try {
@@ -126,7 +107,46 @@ public class HttpRequest {
                     e.printStackTrace();
                 }
             }
-        }));
+        });
+    }
+
+    private com.me.network.app.http.HttpClient getBuild(HttpParams httpParams) {
+        return new com.me.network.app.http.HttpClient.Builder()
+                .url(httpParams.getUrl())
+                .connectTimeout(httpParams.getConnectTimeOut())
+                .writeTimeout(httpParams.getWriteTimeOut())
+                .readTimeout(httpParams.getReadTimeOut())
+                .addHeaders(httpParams.getHeaders())
+                .addParams(httpParams.getParams())
+                .postBody(httpParams.getPostBody())
+                .method(httpParams.getMethod())
+                .build();
+    }
+
+    private boolean validHttpParams(String requestHost, HttpParams httpParams, HttpCallback callback) {
+        if (httpParams == null) {
+            throw new IllegalArgumentException("httpParams can not be NULL");
+        }
+        if (requestHost == null) {
+            throw new IllegalArgumentException("requestHost can not be NULL");
+        }
+        if (callback == null) {
+            throw new IllegalArgumentException("callback can not be NULL");
+        }
+        if (httpParams.getUrl() == null) {
+            throw new IllegalArgumentException("requestUrl can not be NULL");
+        }
+
+        if (!isNetWorkConnected(BaseApplication.getInstance())) {
+            try {
+                callback.onFail(httpParams.getFlag(), BaseApplication.getInstance().getString(R.string.networks_out));
+                return true;
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        mHttpClient = new HttpClient.Builder(requestHost).isDebug(true).build();
+        return false;
     }
 
     /**

+ 4 - 2
app_core/network/src/main/java/com/me/network/app/http/impl/RetrofitImpl.java

@@ -31,6 +31,7 @@ import okhttp3.Cache;
 import okhttp3.Cookie;
 import okhttp3.CookieJar;
 import okhttp3.HttpUrl;
+import okhttp3.MediaType;
 import okhttp3.MultipartBody;
 import okhttp3.OkHttpClient;
 import okhttp3.OkHttpClient.Builder;
@@ -110,7 +111,7 @@ public class RetrofitImpl extends HttpBase {
                     new CacheInterceptor(String.valueOf(mbuilder.getCacheTime()), mbuilder.getCacheType()));
         }
 
-        
+
         if (!TextUtils.isEmpty(mbuilder.getBaseUrl())) {
             mOkHttpClient = mOkBuilder.build();
             retrofit = new Retrofit.Builder().client(mOkHttpClient)
@@ -159,7 +160,8 @@ public class RetrofitImpl extends HttpBase {
             } else {
                 File file = (File) object;
                 //其中参数“file”和服务器接收的参数 一一对应,保证多文件上传唯一key不变
-                builder.addFormDataPart("file", file.getName(), RequestBody.create(null, file));
+                builder.addFormDataPart(key, file.getName(),
+                        RequestBody.create(MediaType.parse("image/png"), file));
             }
         }
         //创建RequestBody

+ 9 - 3
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/activity/MissionActivity.java

@@ -45,7 +45,6 @@ import com.lidroid.xutils.ViewUtils;
 import com.modular.apputils.utils.PopupWindowHelper;
 import com.uas.applocation.Interface.OnLocationListener;
 import com.uas.applocation.UasLocationHelper;
-import com.uas.applocation.base.UASLocationManager;
 import com.uas.applocation.model.UASLocation;
 import com.uas.applocation.utils.LocationDistanceUtils;
 import com.uas.appworks.OA.erp.adapter.MissionAdapter;
@@ -72,6 +71,7 @@ public class MissionActivity extends OABaseActivity implements View.OnClickListe
     private boolean showSubmit;
     private boolean adminStatus;
     private boolean locationOk = true;
+    private MissionModel mMissionModel;
 
     private long time = System.currentTimeMillis();
     private BroadcastReceiver receiver = new BroadcastReceiver() {
@@ -241,6 +241,7 @@ public class MissionActivity extends OABaseActivity implements View.OnClickListe
 
     @Override
     public void faceSign(MissionModel missionModel) {
+        mMissionModel = missionModel;
         requestPermission(Manifest.permission.CAMERA, new Runnable() {
             @Override
             public void run() {
@@ -254,6 +255,11 @@ public class MissionActivity extends OABaseActivity implements View.OnClickListe
         });
     }
 
+    @Override
+    public void faceUpload(MissionModel mission, String faceBase64) {
+        presenter.uploadFace(this, mission, faceBase64);
+    }
+
     @Override
     public void onClick(View view) {
         if (view.getId() == R.id.additem_tv) {
@@ -416,8 +422,8 @@ public class MissionActivity extends OABaseActivity implements View.OnClickListe
             }
 
         } else if (requestCode == 0x223 && RESULT_OK == resultCode) {
-//            presenter.signinMission(null);
-            toast("人脸验证通过");
+            String faceBase64 = data.getStringExtra(Constants.Intents.FACE_SIGN_BASE64);
+            presenter.signinMission(mMissionModel, faceBase64);
         }
     }
 

+ 19 - 4
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/activity/MissionSetActivity.java

@@ -28,6 +28,7 @@ public class MissionSetActivity extends SupportToolBarActivity implements View.O
     private SwitchView auto_sv, needprocess_sv, mFaceSignSwitchView;
     private RelativeLayout distance_rl;
     private RelativeLayout time_rl;
+    private RelativeLayout mFaceSignRl;
     private TextView distance_tv;
     private TextView time_tv;
 
@@ -36,7 +37,7 @@ public class MissionSetActivity extends SupportToolBarActivity implements View.O
     private int time = 30;
     private boolean adminStatus;
     private boolean needprocess;
-    private boolean mFaceSign;
+    private int mFaceSign;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -87,6 +88,14 @@ public class MissionSetActivity extends SupportToolBarActivity implements View.O
                 PreferenceUtils.putBoolean(AppConfig.NEED_PROCESS, needprocess);
             }
         });
+        mFaceSignSwitchView.setOnCheckedChangeListener(new SwitchView.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(View view, boolean isChecked) {
+                mFaceSign = isChecked ? 1 : 0;
+                updataSet();
+                PreferenceUtils.putInt(AppConfig.FACE_SIGN, mFaceSign);
+            }
+        });
         if (adminStatus) {
             distance_rl.setOnClickListener(this);
             time_rl.setOnClickListener(this);
@@ -108,14 +117,20 @@ public class MissionSetActivity extends SupportToolBarActivity implements View.O
         time_rl = (RelativeLayout) findViewById(R.id.time_rl);
         distance_tv = (TextView) findViewById(R.id.distance_tv);
         time_tv = (TextView) findViewById(R.id.time_tv);
+        mFaceSignRl = findViewById(R.id.face_sign_ll);
 
         isAuto = PreferenceUtils.getBoolean(AppConfig.AUTO_MISSION, false);
         needprocess = PreferenceUtils.getBoolean(AppConfig.NEED_PROCESS, false);
-        mFaceSign = PreferenceUtils.getBoolean(AppConfig.FACE_SIGN, false);
+        mFaceSign = PreferenceUtils.getInt(AppConfig.FACE_SIGN, -1);
 
         auto_sv.setChecked(isAuto);
         needprocess_sv.setChecked(needprocess);
-        mFaceSignSwitchView.setChecked(mFaceSign);
+        if (mFaceSign == -1) {
+            mFaceSignRl.setVisibility(View.GONE);
+        } else {
+            mFaceSignRl.setVisibility(View.VISIBLE);
+            mFaceSignSwitchView.setChecked(mFaceSign == 1);
+        }
 
         setClickAble(isAuto);
         distance = PreferenceUtils.getInt(AppConfig.ALARM_MISSION_DISTANCE, 500);
@@ -205,6 +220,6 @@ public class MissionSetActivity extends SupportToolBarActivity implements View.O
     }
 
     private void updataSet() {
-        CommonInterface.getInstance().addOutSet(distance, time, isAuto, needprocess, null);
+        CommonInterface.getInstance().addOutSet(distance, time, isAuto, needprocess, mFaceSign, null);
     }
 }

+ 6 - 4
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/model/IMission.java

@@ -12,11 +12,13 @@ import java.util.List;
 
 public interface IMission extends HttpImp {
 
-	void showModels(List<MissionModel> models);
+    void showModels(List<MissionModel> models);
 
-	void showFinds(List<SelectBean> models);
+    void showFinds(List<SelectBean> models);
 
-	void changModelStatus(int status, int postion);
+    void changModelStatus(int status, int postion);
 
-	void faceSign(MissionModel missionModel);
+    void faceSign(MissionModel missionModel);
+
+    void faceUpload(MissionModel mission, String faceBase64);
 }

+ 3 - 2
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/presenter/IMissionPresenter.java

@@ -1,5 +1,6 @@
 package com.uas.appworks.OA.erp.presenter;
 
+import android.content.Context;
 import android.content.Intent;
 
 import com.core.model.MissionModel;
@@ -24,9 +25,9 @@ public interface IMissionPresenter {
 
 	void sign(List<MissionModel> models);
 
-	void signinMission(MissionModel model);
+	void signinMission(MissionModel model,String faceBase64);
 
 	void finder(String licker);
 
-
+	void uploadFace(Context context, MissionModel mission, String faceBase64);
 }

+ 70 - 6
app_modular/appworks/src/main/java/com/uas/appworks/OA/erp/presenter/MissionPresenter.java

@@ -1,19 +1,21 @@
 package com.uas.appworks.OA.erp.presenter;
 
-import android.Manifest;
 import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
+import android.text.TextUtils;
+import android.widget.Toast;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.baidu.aip.excep.activity.RealTimeDetectFaceActivty;
+import com.baidu.aip.excep.utils.Base64Util;
 import com.common.LogUtil;
 import com.common.data.DateFormatUtil;
 import com.common.data.JSONUtil;
 import com.common.data.ListUtils;
 import com.common.data.StringUtil;
+import com.common.file.FileUtils;
 import com.common.preferences.PreferenceUtils;
 import com.core.api.wxapi.ApiConfig;
 import com.core.api.wxapi.ApiPlatform;
@@ -27,21 +29,29 @@ import com.core.model.SelectBean;
 import com.core.net.http.http.OAHttpHelper;
 import com.core.net.http.http.OnHttpResultListener;
 import com.core.net.http.http.Request;
+import com.core.utils.BitmapUtils;
 import com.core.utils.CommonUtil;
 import com.core.utils.TimeUtils;
 import com.core.utils.ToastUtil;
 import com.core.utils.WorkHandlerUtil;
+import com.me.network.app.base.HttpCallback;
+import com.me.network.app.base.HttpParams;
+import com.me.network.app.http.HttpRequest;
+import com.me.network.app.http.Method;
 import com.uas.applocation.UasLocationHelper;
 import com.uas.applocation.utils.LocationDistanceUtils;
 import com.uas.appworks.OA.erp.model.IMission;
 import com.uas.appworks.R;
 import com.uas.appworks.dao.MissionDao;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import cc.cloudist.acplibrary.ACProgressFlower;
+
 
 /**
  * Created by Bitliker on 2016/12/19.
@@ -60,7 +70,8 @@ public class MissionPresenter implements IMissionPresenter, OnHttpResultListener
     private IMission iMission;
     private boolean isB2b;
     private MissionModel modelIntent;
-
+    private int mFaceSign;
+    private ACProgressFlower mUploadLoading;
 
     public MissionPresenter(IMission iMission) {
         this.iMission = iMission;
@@ -136,10 +147,11 @@ public class MissionPresenter implements IMissionPresenter, OnHttpResultListener
         if (mission == null) {
             iMission.showToast("无可签到签退的计划", R.color.load_error);
         } else {
-            if (false) {
+            mFaceSign = PreferenceUtils.getInt(AppConfig.FACE_SIGN, -1);//-1:人脸设置不存在 1:打开 0:关闭
+            if (mFaceSign == 1) {
                 iMission.faceSign(mission);
             } else {
-                signinMission(mission);
+                signinMission(mission, null);
             }
         }
     }
@@ -442,7 +454,7 @@ public class MissionPresenter implements IMissionPresenter, OnHttpResultListener
     private boolean submiting = false;
 
     @Override
-    public void signinMission(MissionModel model) {
+    public void signinMission(MissionModel model, String faceBase64) {
         if (model == null) return;
         if (!MyApplication.getInstance().isNetworkActive()) {
             iMission.showToast(R.string.networks_out, R.color.load_error);
@@ -478,6 +490,7 @@ public class MissionPresenter implements IMissionPresenter, OnHttpResultListener
         param.put("formStore", JSONUtil.map2JSON(formStore));
         Bundle bundle = new Bundle();
         bundle.putParcelable("data", model);
+        bundle.putString("faceBase64", faceBase64);
         String url = isB2b ? ApiConfig.getInstance(ApiUtils.getApiModel()).getmApiBase().saveOutSign :
                 "mobile/addAutoSign.action";
         Request request = new Request.Bulider()
@@ -592,6 +605,12 @@ public class MissionPresenter implements IMissionPresenter, OnHttpResultListener
                                         iMission.showToast("手动签到成功", R.color.load_error);
                                         loadMissionPlan();
                                     }
+
+
+                                    String faceBase64 = bundle.getString("faceBase64", null);
+                                    if (!TextUtils.isEmpty(faceBase64)) {
+                                        iMission.faceUpload(mission, faceBase64);
+                                    }
                                 }
                             }
                         }
@@ -646,7 +665,52 @@ public class MissionPresenter implements IMissionPresenter, OnHttpResultListener
             if (StringUtil.isEmpty(showMessage)) return;
             if (iMission != null) iMission.showToast(showMessage, R.color.load_error);
         }
+    }
+
+    @Override
+    public void uploadFace(final Context context, MissionModel mission, String faceBase64) {
+        if (mUploadLoading == null) {
+            mUploadLoading = CommonUtil.newLoading(context, "附件上传中...");
+        }
+        mUploadLoading.show();
+        File faceFile = null;
+        try {
+            faceFile = BitmapUtils.saveBitmapToFile(Base64Util.base64ToBitmap(faceBase64), "face");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
 
+        HttpRequest.getInstance().uploadFile(CommonUtil.getAppBaseUrl(context),
+                new HttpParams.Builder()
+                        .url("mobile/signUploadPicture.action")
+                        .method(Method.GET)
+                        .addParam("mpd_id", mission.getId())
+                        .addParam("emcode", CommonUtil.getEmcode())
+                        .addParam("result", "true")
+                        .addParam("master", CommonUtil.getMaster())
+                        .addParam("sessionId", CommonUtil.getSharedPreferences(context, "sessionId"))
+                        //人脸照
+                        .addParam("img", faceFile)
+                        .addHeader("Cookie", CommonUtil.getErpCookie(context))
+                        .build(), new HttpCallback() {
+                    @Override
+                    public void onSuccess(int flag, Object o) throws Exception {
+                        if (mUploadLoading.isShowing()) {
+                            mUploadLoading.dismiss();
+
+                            Toast.makeText(context, "附件上传成功", Toast.LENGTH_LONG).show();
+                        }
+                    }
+
+                    @Override
+                    public void onFail(int flag, String failStr) throws Exception {
+                        if (mUploadLoading.isShowing()) {
+                            mUploadLoading.dismiss();
+
+                            Toast.makeText(context, "附件上传失败", Toast.LENGTH_LONG).show();
+                        }
+                    }
+                });
     }
 
 

+ 1 - 1
app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/activity/ContactsAddActivity.java

@@ -488,7 +488,7 @@ public class ContactsAddActivity extends BaseActivity implements OnItemsButtonAd
                 .isDebug(true)
                 .build();
         httpClient.Api().uploads(new HttpClient.Builder("mobile/upload")
-        .add("file1",file)
+        .add("file",file)
         .method(Method.POST)
         .build(),new ResultSubscriber<>(new ResultListener<Object>() {
             @Override

+ 1 - 1
app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/activity/ContactsDetialActivity.java

@@ -504,7 +504,7 @@ public class ContactsDetialActivity extends BaseActivity implements OnItemsButto
                 .isDebug(true)
                 .build();
         httpClient.Api().uploads(new HttpClient.Builder("mobile/upload")
-        .add("file1",file)
+        .add("file",file)
         .method(Method.POST)
         .build(),new ResultSubscriber<>(new ResultListener<Object>() {
             @Override

+ 0 - 2
app_modular/appworks/src/main/java/com/uas/appworks/crm3_0/activity/CustomerVisitDetailsActivity.java

@@ -12,7 +12,6 @@ import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
 import android.widget.ListView;
-import android.widget.PopupWindow;
 import android.widget.TextView;
 import android.widget.Toast;
 
@@ -52,7 +51,6 @@ import com.modular.apputils.listener.OnSmartHttpListener;
 import com.modular.apputils.model.BillGroupModel;
 import com.modular.apputils.network.Parameter;
 import com.modular.apputils.network.Tags;
-import com.modular.apputils.utils.PopupWindowHelper;
 import com.modular.apputils.utils.UUHttpHelper;
 import com.modular.apputils.widget.BillUpdatePopup;
 import com.modular.apputils.widget.VeriftyDialog;

+ 12 - 7
app_modular/facesdk/src/main/java/com/baidu/aip/excep/activity/RealTimeDetectFaceActivty.java

@@ -1,5 +1,6 @@
 package com.baidu.aip.excep.activity;
 
+import android.content.Intent;
 import android.os.Looper;
 import android.text.TextUtils;
 
@@ -11,6 +12,7 @@ import com.baidu.aip.excep.utils.FaceConfig;
 import com.common.LogUtil;
 import com.common.data.JSONUtil;
 import com.common.data.ListUtils;
+import com.core.app.Constants;
 import com.core.app.MyApplication;
 import com.core.model.User;
 import com.core.utils.CommonUtil;
@@ -169,8 +171,7 @@ public class RealTimeDetectFaceActivty extends DetectLoginActivity {
                             JSONObject object = JSON.parseObject(o.toString());
                             String error_msg = JSONUtil.getText(object, "error_msg");
                             if (TextUtils.isEmpty(error_msg) || error_msg.equals("SUCCESS")) {
-                                setResult(RESULT_OK);
-                                finish();
+                                okAndEnd(faceBase64);
                             } else {
                                 showErrorDialog(error_msg);
                                 return;
@@ -224,23 +225,27 @@ public class RealTimeDetectFaceActivty extends DetectLoginActivity {
                     }
                 }
                 if (mFaceVerify.isPass()) {
-                    okAndEnd();
+                    okAndEnd(faceBase64);
                 } else {
                     detectError();
                 }
             }
-        } else if (222207==error_code){
+        } else if (222207 == error_code) {
             showRegisterDialog(faceBase64, group_id_list, user_id);
-        }else {
+        } else {
             detectError();
         }
     }
 
     /**
      * 操作成功并退出
+     *
+     * @param faceBase64
      */
-    public void okAndEnd() {
-        setResult(RESULT_OK);
+    public void okAndEnd(String faceBase64) {
+        Intent intent = new Intent();
+        intent.putExtra(Constants.Intents.FACE_SIGN_BASE64, faceBase64);
+        setResult(RESULT_OK, intent);
         finish();
     }
 

+ 4 - 2
version.gradle

@@ -52,7 +52,8 @@ ext {
             rxAndroid2Version                   : '2.0.1',
             bottomsheetVersion                  : '1.5.3',
             circleprogressbarVersion            : '1.3.0',
-            basePopupVersion                    : '2.1.5'
+            basePopupVersion                    : '2.1.5',
+            acprogressVersion                   : '1.2.1'
     ]
 
     deps = [
@@ -110,7 +111,8 @@ ext {
             rxandroid2                   : 'io.reactivex.rxjava2:rxandroid:' + depsVersion.rxAndroid2Version,
             bottomsheet                  : 'com.flipboard:bottomsheet-core:' + depsVersion.bottomsheetVersion,
             circleprogressbar            : 'com.dinuscxj:circleprogressbar:' + depsVersion.circleprogressbarVersion,
-            basePopup                    : 'com.github.razerdp:BasePopup:' + depsVersion.basePopupVersion
+            basePopup                    : 'com.github.razerdp:BasePopup:' + depsVersion.basePopupVersion,
+            acprogress                   : 'cc.cloudist.acplibrary:library:' + depsVersion.acprogressVersion
     ]
 }