Browse Source

完成外勤打卡人脸识别

huangyp 6 years ago
parent
commit
5a6a291422

+ 1 - 1
shiku_im/Podfile

@@ -21,7 +21,7 @@ target 'shiku_im' do
   pod 'pop'
   pod 'TZImagePickerController'
   pod 'EGOCache'
-  pod 'SDWebImage'
+  pod 'SDWebImage'=>'4.4.6'
   pod 'HMSegmentedControl'
 
 end

+ 11 - 11
shiku_im/Podfile.lock

@@ -23,12 +23,12 @@ PODS:
     - FMDB/standard (= 2.7.5)
   - FMDB/standard (2.7.5)
   - HMSegmentedControl (1.5.5)
-  - IQKeyboardManager (6.2.0)
+  - IQKeyboardManager (6.3.0)
   - Masonry (1.1.0)
-  - MJExtension (3.0.15.1)
-  - MJRefresh (3.1.15.7)
+  - MJExtension (3.0.17)
+  - MJRefresh (3.2.0)
   - pop (1.0.12)
-  - ReactiveObjC (3.1.0)
+  - ReactiveObjC (3.1.1)
   - SDWebImage (4.4.6):
     - SDWebImage/Core (= 4.4.6)
   - SDWebImage/Core (4.4.6)
@@ -49,7 +49,7 @@ DEPENDENCIES:
   - MJRefresh
   - pop
   - ReactiveObjC
-  - SDWebImage
+  - SDWebImage (= 4.4.6)
   - SVProgressHUD
   - TZImagePickerController
   - WechatOpenSDK
@@ -80,17 +80,17 @@ SPEC CHECKSUMS:
   EGOCache: 191fd213da6804d487b49b1a91772ba904f3e324
   FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
   HMSegmentedControl: f514c6dad47aa3065e0ed2e8046b73efc71221b9
-  IQKeyboardManager: 6194101620b73af5e67900b8f89707a99de0b804
+  IQKeyboardManager: 2ca9d64893247556f53523dcd8d78641f0ba7c23
   Masonry: 678fab65091a9290e40e2832a55e7ab731aad201
-  MJExtension: 19bc33ce2eee2d319760f5622562cf581a6ff756
-  MJRefresh: 697f8ec75ebdbe9207767bb682cf0f51b0d8a41f
+  MJExtension: 74ec83124a68891619fb7ba9c5c811bbf1691076
+  MJRefresh: ed450d6eb9d3346a2cb033ab7eb6de090aeef437
   pop: d582054913807fd11fd50bfe6a539d91c7e1a55a
-  ReactiveObjC: 2a38ea15335de4119d8b17caf1db1484f61db902
+  ReactiveObjC: 011caa393aa0383245f2dcf9bf02e86b80b36040
   SDWebImage: 3f3f0c02f09798048c47a5ed0a13f17b063572d8
   SVProgressHUD: 1428aafac632c1f86f62aa4243ec12008d7a51d6
   TZImagePickerController: 7850b158d025065b162a1a963d445040b828abc9
   WechatOpenSDK: 9b721089507c895d05f997408c30bb6e6f5f9b60
 
-PODFILE CHECKSUM: 2e58a501fbc028fd37151a6316b97f5594e0e1d5
+PODFILE CHECKSUM: b24727c5036e6873182234452070d8185a3752ed
 
-COCOAPODS: 1.5.2
+COCOAPODS: 1.6.0

+ 2 - 2
shiku_im/shiku_im.xcodeproj/project.pbxproj

@@ -18651,7 +18651,7 @@
 			files = (
 			);
 			inputPaths = (
-				"${SRCROOT}/Pods/Target Support Files/Pods-shiku_im/Pods-shiku_im-resources.sh",
+				"${PODS_ROOT}/Target Support Files/Pods-shiku_im/Pods-shiku_im-resources.sh",
 				"${PODS_ROOT}/AliPay/AlipaySDK.bundle",
 				"${PODS_ROOT}/Bugtags/Bugtags.bundle",
 				"${PODS_ROOT}/IQKeyboardManager/IQKeyboardManager/Resources/IQKeyboardManager.bundle",
@@ -18670,7 +18670,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-shiku_im/Pods-shiku_im-resources.sh\"\n";
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-shiku_im/Pods-shiku_im-resources.sh\"\n";
 			showEnvVarsInLog = 0;
 		};
 /* End PBXShellScriptBuildPhase section */

+ 1 - 1
shiku_im/shiku_im/controller/myOA/ALLURLHeader.h

@@ -13,7 +13,7 @@
 /*ip地址*/
 #define g_id  [[NSUserDefaults standardUserDefaults] objectForKey:@"ipAndPort"]
 //#define g_id @"http://192.168.253.63:8080/uas_system/"
-//#define g_id @"http://10.1.80.197:8888/uas-system"
+//#define g_id @"http://10.1.80.197:8888/uas-system/"
 /*新账户中心token*/
 #define g_accountToken [[NSUserDefaults standardUserDefaults] objectForKey:@"accountToken"]
 /*sessionId*/

+ 215 - 4
shiku_im/shiku_im/controller/myOA/JOOutWorkPlanVC.m

@@ -41,6 +41,12 @@
 #import "UASChooseAddDetailVc.h"
 #import "UASWorkManager.h"
 #import "UASLocaManager.h"
+
+//人脸识别
+#import "DetectionViewController.h"
+#import "NetAccessModel.h"
+#import <IDLFaceSDK/IDLFaceSDK.h>
+
 #pragma mark -- 自定义的cell
 
 
@@ -672,6 +678,7 @@
     
     NSMutableArray * _jingweidubrr;
     
+    int _faceGo;//判断外勤是否开启人脸打卡
 }
 
 @property (nonatomic,strong) AMapSearchAPI * searchAPI;
@@ -801,6 +808,7 @@
     
     self.isPunchHand = NO;
     
+    _faceGo = 0;
 }
 //2,设置导航栏
 - (void)setUpNavi
@@ -832,14 +840,78 @@
     
 }
 
--(void)punchCard{
+#pragma mark --- 手动签到第一步
+-(void)punchCard
+{
+    [MBProgressHUD showMessage:@""];
+    
+    NSString *url = [NSString stringWithFormat:@"%@/mobile/getOutSetInfo.action?master=%@&sessionUser=%@&sessionId=%@",g_id,g_master,g_sessionUser,g_sessionId];
+    
+    url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
     
+    UASNetworkManager *mannage = [UASNetworkManager shareManager];
+    
+    mannage.responseSerializer = [AFJSONResponseSerializer serializer];
+    
+    [mannage request:url method:POST parameters:nil progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
+        [MBProgressHUD hideHUD];
+        
+        NSDictionary *rootDic = responseObject;
+        
+        if ([rootDic objectForKey:@"result"] == nil)
+        {
+            return ;
+        }
+        if ([[rootDic objectForKey:@"result"] isKindOfClass:[NSNull class]]) {
+            
+            return;
+        }
+        
+        NSMutableArray * arr = [[NSMutableArray alloc]initWithArray:[NSDictionary changeType:[rootDic objectForKey:@"result"]]];
+        
+        if (arr.count == 0)
+        {
+            return;
+        }
+        
+        for (id obj in rootDic[@"result"])
+        {
+
+            if ([[obj allKeys] containsObject:@"MO_FACESIGN"]) {
+                
+                NSString *faceSign = [NSString stringWithFormat:@"%@",obj[@"MO_FACESIGN"]];
+                
+                if ([faceSign isEqualToString:@"1"]) {
+                    
+                    _faceGo = 1;
+                    
+                }
+            }
+            
+        }
+        
+        if (_faceGo) {
+            [self FaceLoginJudgeMyself];
+        }else{
+            [self startPunchCard:nil];
+        }
+        
+    } failure:^(NSURLSessionDataTask *task, NSError *error) {
+        
+        [MBProgressHUD hideHUD];
+        
+    }];
+}
+
+#pragma mark --- 外勤打卡开始
+-(void)startPunchCard:(NSData *)imageData
+{
     self.isPunchHand = YES;
     //重新创建,防止数据错乱
     self.outManager = [UASWorkManager manager];
     @weakify(self)
-    [self.outManager outWorkPunchByHandCompleted:^(BOOL success, NSString *str) {
-       @strongify(self)
+    [self.outManager outWorkPunchByHandWithImageData:imageData Completed:^(BOOL success, NSString *str) {
+        @strongify(self)
         if (success) {
             
             [self shouldRefreshData];
@@ -847,8 +919,147 @@
         }
         
     }];
+}
+
+#pragma mark --- 人脸识别开始
+-(void)FaceLoginJudgeMyself
+{
+    // 设置鉴权
+    NSString* licensePath = [[NSBundle mainBundle] pathForResource:FACE_LICENSE_NAME ofType:FACE_LICENSE_SUFFIX];
+    NSAssert([[NSFileManager defaultManager] fileExistsAtPath:licensePath], @"license文件路径不对,请仔细查看文档");
+    [[FaceSDKManager sharedInstance] setLicenseID:FACE_LICENSE_ID andLocalLicenceFile:licensePath];
+    
+    [SVProgressHUD appearance].defaultStyle = SVProgressHUDStyleDark;
+    
+    [[NetAccessModel sharedInstance] getAccessTokenWithAK:FACE_API_KEY SK:FACE_SECRET_KEY];
+    
+    __weak typeof(self) weakSelf = self;
+    DetectionViewController *dvc = [[DetectionViewController alloc] init];
+    dvc.completion = ^(NSDictionary* images, UIImage* originImage){
+        if (images[@"bestImage"] != nil && [images[@"bestImage"] count] != 0) {
+            NSData* data = [[NSData alloc] initWithBase64EncodedString:[images[@"bestImage"] lastObject] options:NSDataBase64DecodingIgnoreUnknownCharacters];
+            UIImage* bestImage = [UIImage imageWithData:data];
+            DLog(@"bestImage = %@",bestImage);
+            NSString* bestImageStr = [[images[@"bestImage"] lastObject] copy];
+            [weakSelf identify:bestImageStr originImage:images[@"cropImage"]?:originImage andViewController:dvc andImageData:data];
+        }
+    };
+    
+    [self presentViewController:dvc animated:YES completion:nil];
     
 }
+
+#pragma mark --- 人脸验证流程
+- (void)identify:(NSString*)bestImageStr originImage:(UIImage *)originImage andViewController:(DetectionViewController *)dvc andImageData:(NSData *)imageData{
+    __weak typeof(self) weakSelf = self;
+    [[NetAccessModel sharedInstance] identifyUserLivenessWithFaceImageStr:bestImageStr completion:^(NSError *error, id resultObject) {
+        
+        if (resultObject) {
+            NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:resultObject options:NSJSONReadingAllowFragments error:nil];
+            SLog(@"人脸识别数据:%@",dict);
+            
+            //先判断接口请求是否成功
+            NSString *success = FORMAT(@"%@",dict[@"error_msg"]);
+            if ([success isEqualToString:@"SUCCESS"]) {
+                //判断人脸库是否存在当前用户
+                NSArray *userList = dict[@"result"][@"user_list"];
+                if (userList.count == 0) {
+                    //无此用户走人脸注册流程
+                    [UASAlertView showWithTitle:nil content:@"您未录入人脸照片,点击“确定”录入系统" sureTitle:@"确定录入" cancelTitle:Localized(@"UU_custom_cancle") click:^(NSInteger index) {
+                        if (index == 2) {
+                            [weakSelf RegisterUserFactToBaiduFaceListWithFaceImageString:bestImageStr andViewController:dvc andImageData:imageData];
+                        }
+                        if (index == 1) {
+                            [dvc dismissViewControllerAnimated:YES completion:nil];
+                        }
+                    }];
+                    
+                }else{
+                    NSDictionary *userDic = userList[0];
+                    float score = [[userDic objectForKey:@"score"] floatValue];
+                    if (score > 85) {
+                        //是本人,走打卡流程
+                        [dvc dismissViewControllerAnimated:YES completion:nil];
+
+                        [self startPunchCard:imageData];
+                    }else{
+                        //不是本人
+                        [UASAlertView showWithTitle:nil content:@"抱歉,没有认出你哦" sureTitle:@"再试一次" cancelTitle:Localized(@"UU_custom_cancle") click:^(NSInteger index) {
+                            if (index == 2) {
+                                [IDLFaceDetectionManager.sharedInstance reset];
+                                [[IDLFaceDetectionManager sharedInstance] startInitial];
+                                dvc.hasFinished = NO;
+                                [dvc startCapture];
+                            }
+                            if (index == 1) {
+                                [dvc dismissViewControllerAnimated:YES completion:nil];
+                            }
+                        }];
+                    }
+                }
+            }
+            else if ([success isEqualToString:@"liveness check fail"]){
+                [UASAlertView showWithTitle:nil content:@"不能拿照片骗我哦" sureTitle:@"再试一次" cancelTitle:Localized(@"UU_custom_cancle") click:^(NSInteger index) {
+                    if (index == 2) {
+                        [IDLFaceDetectionManager.sharedInstance reset];
+                        [[IDLFaceDetectionManager sharedInstance] startInitial];
+                        dvc.hasFinished = NO;
+                        [dvc startCapture];
+                    }
+                    if (index == 1) {
+                        [dvc dismissViewControllerAnimated:YES completion:nil];
+                    }
+                }];
+            }
+            else{
+                if ([FORMAT(@"%@",[dict objectForKey:@"error_code"])isEqualToString:@"222207"]) {
+                    //无此用户走人脸注册流程
+                    [UASAlertView showWithTitle:nil content:@"您未录入人脸照片,点击“确定”录入系统" sureTitle:@"确定录入" cancelTitle:Localized(@"UU_custom_cancle") click:^(NSInteger index) {
+                        if (index == 2) {
+                            [weakSelf RegisterUserFactToBaiduFaceListWithFaceImageString:bestImageStr andViewController:dvc andImageData:imageData];
+                        }
+                        if (index == 1) {
+                            [dvc dismissViewControllerAnimated:YES completion:nil];
+                        }
+                    }];
+                }else{
+                    [UASAlertView showWithTitle:nil content:success sureTitle:@"再试一次" cancelTitle:Localized(@"UU_custom_cancle") click:^(NSInteger index) {
+                        if (index == 2) {
+                            [IDLFaceDetectionManager.sharedInstance reset];
+                            [[IDLFaceDetectionManager sharedInstance] startInitial];
+                            dvc.hasFinished = NO;
+                            [dvc startCapture];
+                        }
+                        if (index == 1) {
+                            [dvc dismissViewControllerAnimated:YES completion:nil];
+                        }
+                    }];
+                }
+            }
+        }
+        
+    }];
+}
+
+#pragma mark --- 人脸注册
+-(void)RegisterUserFactToBaiduFaceListWithFaceImageString:(NSString*)bestImageStr andViewController:(DetectionViewController *)dvc andImageData:(NSData *)imageData
+{
+    //    __weak typeof(self) weakSelf = self;
+    [[NetAccessModel sharedInstance] registerFaceWithImageBaseString:bestImageStr  completion:^(NSError *error, id resultObject) {
+        NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:resultObject options:NSJSONReadingAllowFragments error:nil];
+        SLog(@"人脸识别数据:%@",dict);
+        
+        //先判断接口请求是否成功
+        NSString *success = FORMAT(@"%@",dict[@"error_msg"]);
+        if ([success isEqualToString:@"SUCCESS"]) {
+            [dvc dismissViewControllerAnimated:YES completion:nil];
+            //注册成功后,走打卡流程
+            [self startPunchCard:imageData];
+        }
+    }];
+}
+
+
 //2.1导航栏右按钮--设置界面
 - (void)pushToSetting
 {
@@ -1991,7 +2202,7 @@
         [_idAndCodeArr addObject:[NSString stringWithFormat:@"%@",responseObject[@"code"]]];
         
         
-        NSString *urlid = [NSString stringWithFormat:@"%@common/getId.action?seq=%@&sessionId=%@",ip,@"MOBILE_OUTPLAN_SEQ",sessionId];
+        NSString *urlid = [NSString stringWithFormat:@"%@common/getId.action?seq=%@&sessionId=%@",g_id,@"MOBILE_OUTPLAN_SEQ",sessionId];
         
         
         urlid = [urlid stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

+ 138 - 70
shiku_im/shiku_im/controller/myOA/OutWorkingSettingViewController.m

@@ -18,6 +18,8 @@
 
 @property(nonatomic,strong)UITableView * tableView;
 
+@property(nonatomic,strong)NSMutableArray *dataArr;
+
 @end
 
 @implementation OutWorkingSettingViewController
@@ -25,6 +27,7 @@
     //增加一个自动打卡的按钮
     UISwitch * _switch1;
     UISwitch * _switch2;
+    UISwitch * _switch3;//是否开启人脸打卡
     
     UILabel * _remindTime;
     UILabel * _legDistance;
@@ -46,6 +49,9 @@
     //是否需要审批
     NSString *_returnNeedProcess;
     
+    //是否开启人脸打卡
+    NSString *_returnNeedFace;
+    
 }
 
 - (void)viewDidLoad {
@@ -56,6 +62,13 @@
     _returnStatus = @"";
     _returnTime = @"";
     _returnNeedProcess = @"0";
+    _returnNeedFace = @"0";
+    
+    NSArray * ERPtitleArr=@[Localized(@"UU_me_set_outsideWorkSet_autoOutsideWork"),Localized(@"UU_me_set_outsideWorkSet_effectiveDistance"),Localized(@"UU_me_set_outsideWorkSet_reserveTime"),Localized(@"UU_me_set_outsideWorkSet_needApprove")];
+    for (int i = 0; i < ERPtitleArr.count; i++) {
+        [self.dataArr addObject:ERPtitleArr[i]];
+    }
+    
     //设置UI
     [self setNavi];
 
@@ -89,10 +102,10 @@
     NSString *sessionId = [[NSUserDefaults standardUserDefaults] stringForKey:@"sessionId"];
     NSString *url;
     if (g_B2BUser) {
-        url= [NSString stringWithFormat:@"%@mobile/outplan/getOutSet?master=%@&emcode=%@&sessionId=%@&enuu=%@",ipStr,@"(null)",g_emcode,sessionId,g_B2B_enuu];
+        url= [NSString stringWithFormat:@"%@mobile/outplan/getOutSet?master=%@&emcode=%@&sessionId=%@&enuu=%@",g_id,@"(null)",g_emcode,sessionId,g_B2B_enuu];
     }else{
         
-        url = [NSString stringWithFormat:@"%@/mobile/getOutSetInfo.action?master=%@&sessionUser=%@&sessionId=%@",ipStr,g_master,g_sessionUser,sessionId];
+        url = [NSString stringWithFormat:@"%@/mobile/getOutSetInfo.action?master=%@&sessionUser=%@&sessionId=%@",g_id,g_master,g_sessionUser,sessionId];
         
     }
     DLog(@"拼接的URL是什么呢:%@",url);
@@ -128,6 +141,11 @@
                 _returnStatus = [NSString stringWithFormat:@"%@",obj[@"MO_AUTOSIGN"]];
                 _returnTime = [NSString stringWithFormat:@"%@",obj[@"MO_TIME"]];
                 _returnNeedProcess = FORMAT(@"%@",obj[@"MO_NEEDPROCESS"]);
+                
+                if ([[obj allKeys] containsObject:@"MO_FACESIGN"]) {
+                    _returnNeedFace = FORMAT(@"%@",obj[@"MO_FACESIGN"]);
+                    [self.dataArr addObject:@"人脸打卡"];
+                }
             }
         }
         DLog(@"获取的服务器的数据分别是:%@%@",_returnDistance,_returnTime);
@@ -242,7 +260,7 @@
     NSDictionary * dic;
     if (g_B2BUser) {
         dic = @{
-//                @"mo_autosign":_YNAutoSign,
+                //                @"mo_autosign":_YNAutoSign,
                 @"mo_distance":[_legDistance.text substringToIndex:_legDistance.text.length-1],
                 @"mo_time":[_preTime.text substringToIndex:_preTime.text.length-2],
                 @"enuu":g_B2B_enuu,
@@ -255,69 +273,78 @@
                 @"mo_time":[_preTime.text substringToIndex:_preTime.text.length-2],
                 @"mo_needprocess":_returnNeedProcess,
                 };
+        if (self.dataArr.count > 4) {
+            dic = @{
+                    @"mo_autosign":_YNAutoSign,
+                    @"mo_distance":[_legDistance.text substringToIndex:_legDistance.text.length-1],
+                    @"mo_time":[_preTime.text substringToIndex:_preTime.text.length-2],
+                    @"mo_needprocess":_returnNeedProcess,
+                    @"mo_facesign":_returnNeedFace,
+                    };
+        }
     }
     
-        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
-        NSString *str=[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
-        NSString * url;
-        if (g_B2BUser) {
-         url = [NSString stringWithFormat:@"%@mobile/outplan/saveOutSet?caller=OUTSET&formStore=%@&emcode=%@&enuu=%@&sessionId=%@",ipStr,str,g_emcode,g_B2B_enuu,sessionId];
-        }else{
-
-        url = [NSString stringWithFormat:@"%@/mobile/addOutSet.action?caller=OUTSET&formStore=%@&master=%@&sessionUser=%@&sessionId=%@",ipStr,str,g_master,g_sessionUser,sessionId];
-        }
-        DLog(@"保存的url是:%@",url);
+    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
+    NSString *str=[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
+    NSString * url;
+    if (g_B2BUser) {
+        url = [NSString stringWithFormat:@"%@mobile/outplan/saveOutSet?caller=OUTSET&formStore=%@&emcode=%@&enuu=%@&sessionId=%@",ipStr,str,g_emcode,g_B2B_enuu,sessionId];
+    }else{
         
-        url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
+        url = [NSString stringWithFormat:@"%@/mobile/addOutSet.action?caller=OUTSET&formStore=%@&master=%@&sessionUser=%@&sessionId=%@",ipStr,str,g_master,g_sessionUser,sessionId];
+    }
+    DLog(@"保存的url是:%@",url);
+    
+    url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
+    
+    UASNetworkManager *mannage = [UASNetworkManager shareManager];        //拼接sessionID
+    NSString *paramSessionId=[@"" stringByAppendingFormat:@"JSESSIONID=%@",sessionId];
+    //设置cookie
+    if (g_ERPUser) {
+        [mannage.requestSerializer setValue:paramSessionId forHTTPHeaderField:@"Cookie"];
+        [mannage.requestSerializer setValue:[NSString stringWithFormat:@"%@",g_sessionUser] forHTTPHeaderField:@"sessionUser"];
         
-        UASNetworkManager *mannage = [UASNetworkManager shareManager];        //拼接sessionID
-        NSString *paramSessionId=[@"" stringByAppendingFormat:@"JSESSIONID=%@",sessionId];
-        //设置cookie
+    }
+    mannage.responseSerializer = [AFJSONResponseSerializer serializer];
+    [mannage request:url method:POST parameters:nil progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
         if (g_ERPUser) {
-            [mannage.requestSerializer setValue:paramSessionId forHTTPHeaderField:@"Cookie"];
-            [mannage.requestSerializer setValue:[NSString stringWithFormat:@"%@",g_sessionUser] forHTTPHeaderField:@"sessionUser"];
-
-        }
-        mannage.responseSerializer = [AFJSONResponseSerializer serializer];
-        [mannage request:url method:POST parameters:nil progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
-            if (g_ERPUser) {
-                if (_switch1.isOn == NO) {
-                    [self.navigationController popViewControllerAnimated:YES];
-                    
-                }
-                else{
-                    [self.navigationController popViewControllerAnimated:YES];
-                }
-            }
-            else{
-                
+            if (_switch1.isOn == NO) {
                 [self.navigationController popViewControllerAnimated:YES];
-            }
-
-            [[NSNotificationCenter defaultCenter] postNotificationName:@"kaiqizidongwaiqing" object:nil];
-
-        } failure:^(NSURLSessionDataTask *task, NSError *error) {
-            DLog(@"返回的错误是什么呢:%@",error);
-            NSData *returnData = [[error userInfo] objectForKey:@"com.alamofire.serialization.response.error.data"];
-            if (returnData)
-            {
-                NSDictionary *content = [NSJSONSerialization JSONObjectWithData:returnData options:NSJSONReadingMutableContainers error:nil];//转换数据格式
-                
-                NSString *errorStr = [NSString stringWithFormat:@"%@",[content objectForKey:@"exceptionInfo"]];
-                DLog(@"错误信息是:%@",errorStr);
-                
-                [JOShowMessageFromNavi showDropViewWithMessage:errorStr ToNavi:self.navigationController withColor:nil];
-                [MBProgressHUD showError:@"设置失败"];
                 
             }
             else{
-                
-                [MBProgressHUD showError:@"网络错误"];
-                
+                [self.navigationController popViewControllerAnimated:YES];
             }
+        }
+        else{
+            
             [self.navigationController popViewControllerAnimated:YES];
-
-        }];
+        }
+        
+        [[NSNotificationCenter defaultCenter] postNotificationName:@"kaiqizidongwaiqing" object:nil];
+        
+    } failure:^(NSURLSessionDataTask *task, NSError *error) {
+        DLog(@"返回的错误是什么呢:%@",error);
+        NSData *returnData = [[error userInfo] objectForKey:@"com.alamofire.serialization.response.error.data"];
+        if (returnData)
+        {
+            NSDictionary *content = [NSJSONSerialization JSONObjectWithData:returnData options:NSJSONReadingMutableContainers error:nil];//转换数据格式
+            
+            NSString *errorStr = [NSString stringWithFormat:@"%@",[content objectForKey:@"exceptionInfo"]];
+            DLog(@"错误信息是:%@",errorStr);
+            
+            [JOShowMessageFromNavi showDropViewWithMessage:errorStr ToNavi:self.navigationController withColor:nil];
+            [MBProgressHUD showError:@"设置失败"];
+            
+        }
+        else{
+            
+            [MBProgressHUD showError:@"网络错误"];
+            
+        }
+        [self.navigationController popViewControllerAnimated:YES];
+        
+    }];
 }
 
 /**判断是否管理员*/
@@ -346,13 +373,14 @@
             _btn2.userInteractionEnabled = YES;
             _btn3.userInteractionEnabled = YES;
             _switch1.enabled = YES;
-            _switch2.enabled=YES;
-            
+            _switch2.enabled = YES;
+            _switch3.enabled = YES;
         }else{
             _btn2.userInteractionEnabled = NO;
             _btn3.userInteractionEnabled = NO;
             _switch1.enabled = NO;
-            _switch2.enabled=NO;
+            _switch2.enabled = NO;
+            _switch3.enabled = NO;
         }
         
     }
@@ -399,6 +427,10 @@
 //    _switch2.transform = CGAffineTransformMakeScale(0.8, 0.75);
     [_switch2 addTarget:self action:@selector(swicthOn2:) forControlEvents:UIControlEventValueChanged];
 //    _switch1.enabled = NO;
+    _switch3 = [[UISwitch alloc]initWithFrame:CGRectMake(self_width-60,6.5, 30, 10)];
+    //    _switch1.transform = CGAffineTransformMakeScale(0.8, 0.75);
+    [_switch3 addTarget:self action:@selector(swicthOn3:) forControlEvents:UIControlEventValueChanged];
+    
     
     _preTime =[[UILabel alloc]initWithFrame:CGRectMake(SCREEN_WIDTH-150, 0, 120, 45)];
     _preTime.textAlignment = NSTextAlignmentRight;
@@ -501,6 +533,17 @@
     
 }
 
+-(void)swicthOn3:(id)sender
+{
+    if (_switch3.isOn == YES)
+    {
+        _returnNeedFace = @"1";
+    }
+    else{
+        _returnNeedFace = @"0";
+    }
+}
+
 //点击选择时间按钮
 - (void)getSelectTime:(UIButton *)btn
 {
@@ -540,12 +583,12 @@
     UITableViewCell * cell =[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:ID];
     cell.selectionStyle=UITableViewCellSelectionStyleNone;
     
-    NSArray * ERPtitleArr=@[Localized(@"UU_me_set_outsideWorkSet_autoOutsideWork"),Localized(@"UU_me_set_outsideWorkSet_effectiveDistance"),Localized(@"UU_me_set_outsideWorkSet_reserveTime"),Localized(@"UU_me_set_outsideWorkSet_needApprove")];
+    
     NSUserDefaults * user=[NSUserDefaults standardUserDefaults];
     NSString * yeorno=[user objectForKey:ZIDONG_WAIQING];
     if (indexPath.row==0) {
         UILabel * signLable = [[UILabel alloc]initWithFrame:CGRectMake(10, 0, 150, 45)];
-        signLable.text = ERPtitleArr[indexPath.row];
+        signLable.text = self.dataArr[indexPath.row];
         signLable.font =FONT_SIZE(14);
         [cell.contentView addSubview:signLable];
         
@@ -583,7 +626,7 @@
      else if (indexPath.row==1)
     {
         UILabel * propertyDis = [[UILabel alloc]initWithFrame:CGRectMake(10, 0, 150, 45)];
-        propertyDis.text =[NSString stringWithFormat:@"%@",ERPtitleArr[indexPath.row]];
+        propertyDis.text =[NSString stringWithFormat:@"%@",self.dataArr[indexPath.row]];
         propertyDis.font = FONT_SIZE(14);
         [cell.contentView addSubview:propertyDis];
         if (_returnDistance.length!=0) {
@@ -610,7 +653,7 @@
     else if (indexPath.row==2)
     {
         UILabel * yuliushjian = [[UILabel alloc]initWithFrame:CGRectMake(10, 0, 150, 45)];
-        yuliushjian.text = ERPtitleArr[indexPath.row];
+        yuliushjian.text = self.dataArr[indexPath.row];
         yuliushjian.font = FONT_SIZE(14);
         [cell.contentView addSubview:yuliushjian];
         if (_returnTime.length!=0) {
@@ -636,8 +679,8 @@
     }else if (indexPath.row == 3)
     {
         UILabel * signLable = [[UILabel alloc]initWithFrame:CGRectMake(10, 0, 150, 45)];
-        signLable.text = ERPtitleArr[indexPath.row];
-        signLable.font =FONT_SIZE(14);
+        signLable.text = self.dataArr[indexPath.row];
+        signLable.font = FONT_SIZE(14);
         [cell.contentView addSubview:signLable];
         
         [cell.contentView addSubview:_switch2];
@@ -651,18 +694,34 @@
 
             [_switch2 setOn:NO];
         }
+    }else if (indexPath.row == 4)
+    {
+        UILabel * faceLable = [[UILabel alloc]initWithFrame:CGRectMake(10, 0, 150, 45)];
+        faceLable.text = self.dataArr[indexPath.row];
+        faceLable.font = FONT_SIZE(14);
+        [cell.contentView addSubview:faceLable];
+        
+        [cell.contentView addSubview:_switch3];
+        
+        
+        if ([_returnNeedFace isEqualToString:@"1"]) {
+            
+            [_switch3 setOn:YES];
+        }
+        else {
+            
+            [_switch3 setOn:NO];
+        }
     }
+    
+    
     if (g_B2BUser&&indexPath.row==0) {
         
         cell.hidden = YES;
         _tableView.frame = CGRectMake(0, -45, SCREEN_WIDTH, SCREEN_HEIGHT+45);
         
     }
-    
-    
-    
-    
-    
+   
     return cell;
 }
 
@@ -673,7 +732,7 @@
 }
 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 {
-    return 4;
+    return self.dataArr.count;
 }
 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
 {
@@ -693,4 +752,13 @@
     [tableView setTableFooterView:view];
 }
 
+#pragma mark --- lazy
+-(NSMutableArray *)dataArr
+{
+    if (!_dataArr) {
+        _dataArr = [NSMutableArray new];
+    }
+    return _dataArr;
+}
+
 @end

+ 1 - 1
shiku_im/shiku_im/controller/myOA/WorkTools/UASWorkManager.h

@@ -31,7 +31,7 @@
 /**
  手动外勤
  */
--(void)outWorkPunchByHandCompleted:(void(^)(BOOL success,NSString *str))completed;;
+-(void)outWorkPunchByHandWithImageData:(NSData *)imageData Completed:(void(^)(BOOL success,NSString *str))completed;
 
 
 /**

+ 73 - 22
shiku_im/shiku_im/controller/myOA/WorkTools/UASWorkManager.m

@@ -61,6 +61,15 @@
  */
 @property(strong,nonatomic)NSMutableArray<NSString *> *mapArr;
 
+/**
+ 外勤是否启用人脸打卡
+ */
+@property(assign,nonatomic)BOOL autoFaceSign;
+
+/**
+ 如果启用了人脸打卡的照片data
+ */
+@property(strong,nonatomic)NSData *imageData;
 
 /**
  自动打卡定时器
@@ -209,7 +218,7 @@
 /**
  手动外勤
  */
--(void)outWorkPunchByHandCompleted:(void(^)(BOOL success,NSString *str))completed{
+-(void)outWorkPunchByHandWithImageData:(NSData *)imageData Completed:(void(^)(BOOL success,NSString *str))completed{
     
     [MBProgressHUD showMessage:@""];
     
@@ -219,6 +228,10 @@
     
     self.outCompleted = completed;
     
+    self.autoFaceSign = NO;
+    
+    self.imageData = imageData;
+    
     [self prepareOutPlan];
     
 }
@@ -390,10 +403,20 @@
             
             [self.outArr addObject:[NSString stringWithFormat:@"%@",obj[@"MO_TIME"]]];
             
+            if ([[obj allKeys] containsObject:@"MO_FACESIGN"]) {
+                
+                NSString *faceSign = [NSString stringWithFormat:@"%@",obj[@"MO_FACESIGN"]];
+                
+                if ([faceSign isEqualToString:@"1"]) {
+                    
+                    self.autoFaceSign = YES;
+                    
+                }
+            }
+            
         }
         
         
-        
         if ([self.outArr[0] integerValue] == 1)
         {
             
@@ -449,8 +472,8 @@
             
         }
         
-        NSString * times=[NSString getLongCurrenTime];
-        NSDictionary *dic =    [NSDictionary dictionaryWithObjectsAndKeys:
+        NSString * times = [NSString getLongCurrenTime];
+        NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:
                                 times,@"aa_date",
                                 @"iOS判定是否是自动外勤",@"aa_type",
                                 errorAtr,@"aa_remark",
@@ -1256,7 +1279,7 @@
     
 }
 
-//半天外勤计划打卡调用此接口
+#pragma mark --- 半天外勤计划打卡调用此接口
 -(void)postHalfOutCard:(OutWorkModel *)model andSwitch:(NSString *)switchs{
     
     UASNetworkManager *manager = [UASNetworkManager shareManager];
@@ -1433,7 +1456,7 @@
                         
                         [delegate showAlert:[NSString stringWithFormat:@"拜访%@签退成功",model.MPD_COMPANY]];
                         
-                        
+                        [MBProgressHUD hideHUD];
                         
                     }];
                     
@@ -1507,7 +1530,7 @@
                             
                             [delegate showAlert:[NSString stringWithFormat:@"拜访%@签到成功",model.MPD_COMPANY]];
                             
-                            
+                            [MBProgressHUD hideHUD];
                         }
                         
                         
@@ -1587,21 +1610,18 @@
                         
                         [delegate showAlert:[NSString stringWithFormat:@"拜访%@签到成功",model.MPD_COMPANY]];
                         
-                        
+                        [MBProgressHUD hideHUD];
                     }];
                     
                 }
                 
             }];
-            
-            
-            
-            
-            
+  
         }
         
-        
-        
+        if (self.autoFaceSign) { //如果开启人脸,上传附件
+            [self uploadFaceToServer:model];
+        }
         
     } failure:^(NSURLSessionDataTask *task, NSError *error) {
         
@@ -1616,13 +1636,13 @@
         AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
         
         [delegate showAlert:@"服务器配置异常"];
-        
+        [MBProgressHUD hideHUD];
     }];
     
 }
 
 
-//全天外勤计划打卡调用此接口
+#pragma mark --- 全天外勤计划打卡调用此接口
 -(void)postAllOutCard:(OutWorkModel *)model andSwitch:(NSString *)switchs{
     
     UASNetworkManager *manager = [UASNetworkManager shareManager];
@@ -1800,7 +1820,7 @@
                         AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
                         
                         [delegate showAlert:[NSString stringWithFormat:@"拜访%@签退成功",model.MPD_COMPANY]];
-                        
+                        [MBProgressHUD hideHUD];
                     }];
                     
                 }
@@ -1870,7 +1890,7 @@
                             
                             [delegate showAlert:[NSString stringWithFormat:@"拜访%@签到成功",model.MPD_COMPANY]];
                             
-                            
+                            [MBProgressHUD hideHUD];
                         }
                         
                         
@@ -1942,7 +1962,7 @@
                             
                             [delegate showAlert:[NSString stringWithFormat:@"拜访%@签到成功",model.MPD_COMPANY]];
                             
-                            
+                            [MBProgressHUD hideHUD];
                         }
                         
                         
@@ -2012,7 +2032,7 @@
                         
                         [delegate showAlert:[NSString stringWithFormat:@"拜访%@签退成功",model.MPD_COMPANY]];
                         
-                        
+                        [MBProgressHUD hideHUD];
                     }];
                     
                 }
@@ -2070,12 +2090,15 @@
                 
                 [delegate showAlert:[NSString stringWithFormat:@"拜访%@签到成功",model.MPD_COMPANY]];
             
-                
+                [MBProgressHUD hideHUD];
             }
             
             
         }
         
+        if (self.autoFaceSign) {//如果开启人脸,则上传附件
+            [self uploadFaceToServer:model];
+        }
         
         
     } failure:^(NSURLSessionDataTask *task, NSError *error) {
@@ -2096,6 +2119,34 @@
     
 }
 
+#pragma mark --- 上传附件-人脸照片
+-(void)uploadFaceToServer:(OutWorkModel *)model
+{
+    if (self.imageData) {
+//        [MBProgressHUD showMessage:@"上传人脸"];
+        
+        NSDictionary * dic = @{
+                               @"mpd_id":model.MPD_ID,
+                               @"emcode":g_emcode,
+                               @"result":@"true",
+                               @"master":g_master,
+                               };
+        
+        [[UASNetworkManager shareManager] request:FORMAT(@"%@/mobile/signUploadPicture.action",g_id) method:POST parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
+            if (self.imageData) {
+                [formData appendPartWithFileData:self.imageData name:@"img" fileName:@"file.jpg" mimeType:@"image/jpeg"];
+            }
+        } progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
+            SLog(@"成功上传附件");
+            [MBProgressHUD hideHUD];
+        } failure:^(NSURLSessionDataTask *task, NSError *error) {
+            SLog(@"失败上传附件");
+            [MBProgressHUD hideHUD];
+        }];
+    }
+
+}
+
 /**
  创建消息表
  */

+ 1 - 1
shiku_im/shiku_im/文件夹1/WorkMain(工作新页面)/Controllers/UASWorkMainVC.m

@@ -685,7 +685,7 @@
         
         [[NSUserDefaults standardUserDefaults] setObject:@"click" forKey:@"OANewGuidePunch2"];
     
-        NSUserDefaults * user=[NSUserDefaults standardUserDefaults];
+        NSUserDefaults * user = [NSUserDefaults standardUserDefaults];
         NSString * str= [NSString stringWithFormat:@"%@",[user objectForKey:@"OutPlanIsOpenOrClose"]];
         
         if ([str isEqualToString:@"1"])