RQPTObjectMolule.m 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682
  1. //
  2. // RQPTObjectMolule.m
  3. // jiaPei
  4. //
  5. // Created by 张嵘 on 2022/4/8.
  6. // Copyright © 2022 JCZ. All rights reserved.
  7. //
  8. #import "RQPTObjectMolule.h"
  9. #import "MapManager.h"
  10. typedef NS_ENUM(NSInteger, RQQRCodeType) {
  11. /// 无
  12. RQQRCodeType_NO = 0,
  13. /// 莆田门禁
  14. RQQRCodeType_PTMJ = 1,
  15. /// 莆田实操
  16. RQQRCodeType_PTSC = 2,
  17. /// 浙江模拟
  18. RQQRCodeType_ZJJP = 3,
  19. };
  20. @interface RQPTObjectMolule ()
  21. @property (nonatomic, readwrite, assign) RQQRCodeType rqQRCodeType;
  22. @property (nonatomic, readwrite, assign) BOOL isShowChooseSubject;
  23. @property (nonatomic, readwrite, copy) NSString *PTSC6_str;
  24. @end
  25. @implementation RQPTObjectMolule
  26. static id rq_ptObjectModule = nil;
  27. #pragma mark - init
  28. + (instancetype)sharedInstance {
  29. static dispatch_once_t onceToken;
  30. dispatch_once(&onceToken, ^{
  31. rq_ptObjectModule = [[self alloc] init];
  32. });
  33. return rq_ptObjectModule;
  34. }
  35. - (instancetype)init {
  36. if (self = [super init]) {
  37. }
  38. return self;
  39. }
  40. #pragma mark - PublicMethods
  41. // 扫码验证
  42. - (void)uploadScanCodeVerifyWithQRCodeResultStr:(NSString *)resultStr resultBlock:(void (^)(BOOL isSuccess))resultBlock {
  43. _rqQRCodeType = RQQRCodeType_NO;
  44. @weakify(self)
  45. if (![Util connectedToNetWork]) {
  46. showMsgUnconnect();
  47. resultBlock(NO);
  48. return;
  49. }
  50. //新需求 - 2023-6-19
  51. // 二维码内容:
  52. // #FJMN#xczx@@模拟器序列号@@时间戳
  53. // 例:#FJMN#xczx@@mn3423424@@1677114420415
  54. if ([resultStr containsString:@"#FJMN#"] && resultStr.length > 8) {
  55. NSString *testString = [DES3Util decrypt:[resultStr substringFromIndex:6]];
  56. NSArray *array = [testString componentsSeparatedByString:@"@@"];
  57. NSString *devSn = array[1];
  58. NSString *timeStamp = array[2];
  59. NSMutableArray *arr = [NSMutableArray array];
  60. [arr addPro:@"devSn" Value:devSn];///设备ID
  61. [arr addPro:@"stuid" Value:RQ_USER_MANAGER.currentUser.outId];///学员ID
  62. [arr addPro:@"timestamp" Value:timeStamp];///时间戳
  63. [jiaPeiManager requestAnythingWithURL:@"phoneMnLogin" array:arr data:nil completion:^(NSDictionary * root) {
  64. NSString *body = root[@"body"];
  65. [RQ_SHARE_FUNCTION showAlertWithMessage:body completion:nil];
  66. return;
  67. }];
  68. }
  69. if ([resultStr containsString:@"#DECODE#"] && resultStr.length > 8) {
  70. ///程序内某些验证
  71. if([resultStr containsString:@"?text="]){ //特殊处理
  72. NSArray *components = [resultStr componentsSeparatedByString:@"?text="];
  73. resultStr = components.lastObject;
  74. }
  75. NSString *testString = [DES3Util decrypt:[resultStr substringFromIndex:8]];
  76. NSLog(@"\n原完整内容: %@ \n解密后: #DECODE#%@",resultStr,testString);
  77. // testString = @"#LNJP#huizhi@@BFEBFBFF000206A7@@1530258491165";
  78. if (testString == nil) {
  79. [RQ_SHARE_FUNCTION showAlertWithMessage:@"二维码内容格式错误(#DECODE#+异常字符串)" completion:nil];
  80. return;
  81. }
  82. //#DECODE##JSJP#PTMJ@@13503005883@@1611296660969@@119.206163@@26.03922@@1@@3503090060
  83. NSArray *array;
  84. if ([testString containsString:@"#JSJP#PTMJ"]) {
  85. ///莆田门禁入场/离场
  86. array = [testString componentsSeparatedByString:@"@@"];
  87. testString = [testString substringFromIndex:6];
  88. _rqQRCodeType = RQQRCodeType_PTMJ;
  89. /// 二维码明文
  90. /// #JSJP#PTMJ@@SIM卡号@@kind@@regionId@@1611042927509@@119.2065@@26.038985
  91. } else if ([testString containsString:@"#JSJP#PTSC"]) {
  92. ///莆田实操签到/签退
  93. array = [testString componentsSeparatedByString:@"@@"];
  94. testString = [testString substringFromIndex:6];
  95. _rqQRCodeType = RQQRCodeType_PTSC;
  96. /// 二维码明文
  97. /// #JSJP#PTSC@@13503003479@@1649213031058@@26.038049@@119.206105@@3@@1649212908@@17@@0@@2022-04-06 10:43:51@@0.0@@184.86@@3346341302335557
  98. /// //SIM,//时间戳,//纬度,//经度,//当前科目,//课堂classid,//扫码类型,//卫星定位速度,//GPS时间,//行驶记录速度,//方向 //学员编号 //是否开启水印 //车牌号 //教练名称
  99. } else if ([testString containsString:@"#ZJJP#"]) {
  100. testString = [testString substringFromIndex:6];
  101. array = [testString componentsSeparatedByString:@"@@"];
  102. _rqQRCodeType = RQQRCodeType_ZJJP;
  103. /// 二维码明文
  104. ///#ZJJP#12345678909@@1@@3310@@1677132394000
  105. ///#ZJJP#SIM卡号@@类型@@地区编号@@时间戳 (类型:1签到 2签退 3过程)
  106. } else if ([testString containsString:@"#FJCOACH#"]) {
  107. //testString = [testString substringFromIndex:9];
  108. array = [testString componentsSeparatedByString:@"@@"];
  109. [self bindStudentAppCoachIdArr:array];
  110. return;
  111. } else if ([testString containsString:@"#iats#"]) {//ning 新增 二维码 扫描 登录
  112. //#DECODE##iats#861766043407976;1708670874970
  113. testString = [testString substringFromIndex:6];
  114. array = [testString componentsSeparatedByString:@";"];
  115. // /iats-api/api/jsjpNotice
  116. [self noticeAppjsjpNoticeArr:array];
  117. return;
  118. }
  119. __block NSString *ptSubjectStr;
  120. self.PTSC6_str = @"";
  121. if (_rqQRCodeType == RQQRCodeType_PTSC && !RQObjectIsNil(array[5]) && !RQObjectIsNil(array[7])) {
  122. ptSubjectStr = array[5];
  123. self.PTSC6_str = [ptSubjectStr copy];
  124. NSString *trainTypeStr = array[7];
  125. if ([trainTypeStr isEqualToString:@"17"]) {
  126. if ([ptSubjectStr isEqualToString:@"5"] || RQStringIsEmpty(ptSubjectStr)) {
  127. NSMutableArray *editArr = array.mutableCopy;
  128. [RQ_ALERTVIEW_MANAGER showAlertWithTitle:@"温馨提示" message:@"请选择培训科目" confirmTitleOne:@"科目二" confirmTitleTwo:@"科目三" cancelTitle:@"取消" confirmOneAction:^{
  129. @strongify(self)
  130. RQ_PT_Object_Module.ptSubjectStr = @"2";
  131. [editArr replaceObjectAtIndex:5 withObject:RQ_PT_Object_Module.ptSubjectStr];
  132. [self postUploadScanCodeVerifyWithCodeArr:editArr.copy resultBlock:resultBlock];
  133. } confirmTwoAction:^{
  134. @strongify(self)
  135. RQ_PT_Object_Module.ptSubjectStr = @"3";
  136. [editArr replaceObjectAtIndex:5 withObject:RQ_PT_Object_Module.ptSubjectStr];
  137. [self postUploadScanCodeVerifyWithCodeArr:editArr.copy resultBlock:resultBlock];
  138. } cancleAction:^{
  139. resultBlock(NO);
  140. }];
  141. } else if ([ptSubjectStr isEqualToString:@"3"] || [ptSubjectStr isEqualToString:@"2"]) {
  142. RQ_PT_Object_Module.ptSubjectStr = ptSubjectStr;
  143. [self postUploadScanCodeVerifyWithCodeArr:array resultBlock:resultBlock];
  144. } else {
  145. [NSObject rq_showAlertViewWithTitle:@"温馨提示" message:@"无训练阶段相关参数" confirmTitle:@"确定"];
  146. resultBlock(NO);
  147. }
  148. } else if ([trainTypeStr isEqualToString:@"19"]) {
  149. if (RQStringIsNotEmpty(RQ_PT_Object_Module.ptSubjectStr)) {
  150. NSMutableArray *editArr = array.mutableCopy;
  151. [editArr replaceObjectAtIndex:5 withObject:RQ_PT_Object_Module.ptSubjectStr];
  152. [self postUploadScanCodeVerifyWithCodeArr:editArr.copy resultBlock:resultBlock];
  153. } else {
  154. [self postUploadScanCodeVerifyWithCodeArr:array resultBlock:resultBlock];
  155. }
  156. } else {
  157. [self postUploadScanCodeVerifyWithCodeArr:array resultBlock:resultBlock];
  158. }
  159. } else if (_rqQRCodeType == RQQRCodeType_ZJJP && !RQObjectIsNil(array[1])) {
  160. NSString *type = array[1];
  161. if ([type isEqualToString:@"1"]) {
  162. /// 如果是签到需要传科目
  163. if (!self.isShowChooseSubject) {
  164. self.isShowChooseSubject = YES;
  165. [RQ_ALERTVIEW_MANAGER showAlertWithTitle:@"温馨提示" message:@"请选择培训科目" confirmTitleOne:@"科目二" confirmTitleTwo:@"科目三" cancelTitle:@"取消" confirmOneAction:^{
  166. @strongify(self)
  167. RQ_PT_Object_Module.zjSubjectStr = @"2";
  168. [self zjmnWithArr:array];
  169. self.isShowChooseSubject = NO;
  170. } confirmTwoAction:^{
  171. @strongify(self)
  172. RQ_PT_Object_Module.zjSubjectStr = @"3";
  173. [self zjmnWithArr:array];
  174. self.isShowChooseSubject = NO;
  175. } cancleAction:^{
  176. @strongify(self)
  177. self.isShowChooseSubject = NO;
  178. }];
  179. }
  180. } else {
  181. /// 签退的时候科目传空字符
  182. RQ_PT_Object_Module.zjSubjectStr = @"";
  183. [self zjmnWithArr:array];
  184. }
  185. } else {
  186. [self postUploadScanCodeVerifyWithCodeArr:array resultBlock:resultBlock];
  187. }
  188. } else {
  189. NSString *testString = [DES3Util decrypt:resultStr];
  190. NSLog(@"%@",testString);
  191. }
  192. }
  193. //通知设备登录成功
  194. - (void)noticeAppjsjpNoticeArr:(NSArray *)array {
  195. NSString *muserId = array[0];
  196. NSString *timestamp = array[1];
  197. //时间戳判断
  198. long long this_timestamp = [[NSDate date] timeIntervalSince1970]*1000;
  199. if(this_timestamp-[timestamp longLongValue]>60*5*1000){
  200. ShowMsg(@"操作超时!");
  201. return;
  202. }
  203. NSMutableArray *arr = [NSMutableArray array];
  204. [arr addPro:@"idcard" Value:RQ_USER_MANAGER.currentUser.loginCode];
  205. [arr addPro:@"imei" Value:muserId];
  206. [arr addPro:@"status" Value:@"1"];
  207. [MBProgressHUD rq_showProgressHUD:@""];
  208. [jiaPeiManager requestAnythingWithURL:@"jsjpNotice" array:arr data:nil completion:^(NSDictionary * result) {
  209. NSLog(@"dict=%@",result);
  210. if(result){
  211. int code = [result[@"code"] intValue];
  212. if(code==0){
  213. //成功
  214. NSLog(@"通知设备登录成功");
  215. }
  216. [RQ_SHARE_FUNCTION showAlertWithMessage:result[@"msg"] completion:nil];
  217. }
  218. [MBProgressHUD rq_hideHUD];
  219. }];
  220. }
  221. //绑定教练id
  222. - (void)bindStudentAppCoachIdArr:(NSArray *)array {
  223. //学员绑定教练ID(新需求) - 2023-07-06
  224. //#FJCOACH#@@315483254@@3501
  225. NSString *appCoachId = array[1];
  226. NSString *dqbh = array[2];
  227. if([dqbh isEqualToString:RQ_USER_MANAGER.currentUser.city]){
  228. NSMutableArray *arr = [NSMutableArray array];
  229. [arr addPro:@"appCoachId" Value:appCoachId];
  230. [arr addPro:@"city" Value:RQ_USER_MANAGER.currentUser.city];
  231. [arr addPro:@"id" Value:RQ_USER_MANAGER.currentUser.outId];
  232. [MBProgressHUD rq_showProgressHUD:@""];
  233. [jiaPeiManager requestGetWithURL:@"jsjp-admin/open-api/tms/coachInfo/updateStudentAppCoachIdById" array:arr appendurlString:nil completion:^(id result) {
  234. NSLog(@"dict=%@",result);
  235. int code = [result[@"code"] intValue];
  236. if(code==0){
  237. //成功
  238. NSLog(@"绑定成功");
  239. }
  240. [RQ_SHARE_FUNCTION showAlertWithMessage:result[@"msg"] completion:nil];
  241. [MBProgressHUD rq_hideHUD];
  242. }];
  243. }else {
  244. ShowMsg(@"教练和学员不在同一个地区,无法绑定!");
  245. }
  246. }
  247. - (void)zjmnWithArr:(NSArray *)array {
  248. @weakify(self)
  249. [[RACScheduler mainThreadScheduler] afterDelay:0.5 schedule:^{
  250. [RQ_CHECKBODY_MANAGER beginCheckBodyWithCheckNum:0 checkBodyType:RQCheckBodyType_PTSC waterMarkArr:@[] completeBlock:^(BOOL success, NSDictionary * _Nullable dic) {
  251. @strongify(self)
  252. if (success) {
  253. [self face2faceWithQRCodeType:_rqQRCodeType rqCodeArr:array photo:dic[@"normalImg"] resultBlock:^(BOOL isSuccess, id a) {
  254. @strongify(self)
  255. if (isSuccess) {
  256. if (!RQObjectIsNil(a)) {
  257. NSDictionary *dic = a;
  258. NSString *str = dic[@"body"];
  259. if (RQStringIsNotEmpty(str)) {
  260. NSMutableArray *uploadTrainFileMnArr = [NSMutableArray array];
  261. [uploadTrainFileMnArr addPro:@"objid" Value:RQ_USER_MANAGER.currentUser.outId];///学员ID
  262. [uploadTrainFileMnArr addPro:@"dqbh" Value:RQ_USER_MANAGER.currentUser.city];///地区编号
  263. [uploadTrainFileMnArr addPro:@"sim" Value:array[0]];///SIM卡号
  264. [uploadTrainFileMnArr addPro:@"event" Value:array[1]];///扫码类型:1 签到 2签退 3培训过程
  265. [uploadTrainFileMnArr addPro:@"classId" Value:@""];///課堂ID
  266. [uploadTrainFileMnArr addPro:@"photo" Value:str];///人脸照片
  267. NSInteger timeStamp = [RQ_SHARE_FUNCTION getTimeStampWithDate:[NSDate date]];
  268. NSString *timeStampStr = [NSString stringWithFormat:@"%@",[NSNumber numberWithInteger:timeStamp]];
  269. if (timeStampStr.length < 10) {
  270. timeStampStr = [NSString stringWithFormat:@"%@",[NSNumber numberWithInteger:[NSString rq_randomNumberWithFrom:1647311377 to:9999999999]]];
  271. } else if (timeStampStr.length > 10) {
  272. timeStampStr = [timeStampStr substringFromIndex:timeStampStr.length - 10];
  273. }
  274. [uploadTrainFileMnArr addPro:@"picno" Value:timeStampStr];///照片编号
  275. NSString *type = array[1];
  276. if ([type isEqualToString:@"1"]) {
  277. /// 签到的时候先签到后上传图片
  278. [self uploadZjmnLoginWithArray:array resultBlock:^(BOOL isSuccess) {
  279. @strongify(self)
  280. if (isSuccess) {
  281. [self uploadTrainFileMnWithArray:uploadTrainFileMnArr.copy resultBlock:^(BOOL isSuccess) {
  282. }];
  283. }
  284. }];
  285. } else {
  286. /// 签退的时候先上传图片后签退
  287. [self uploadTrainFileMnWithArray:uploadTrainFileMnArr.copy resultBlock:^(BOOL isSuccess) {
  288. @strongify(self)
  289. if (isSuccess) {
  290. [self uploadZjmnLoginWithArray:array resultBlock:^(BOOL isSuccess) {
  291. if (isSuccess) {
  292. NSLog(@"签退成功");
  293. }
  294. }];
  295. } else {
  296. }
  297. }];
  298. }
  299. }
  300. }
  301. }
  302. }];
  303. }
  304. }];
  305. }];
  306. }
  307. - (void)postUploadScanCodeVerifyWithCodeArr:(NSArray *)array resultBlock:(void (^)(BOOL isSuccess))resultBlock {
  308. [MBProgressHUD rq_showProgressHUD:@"正在获取当前位置..."];
  309. [RQ_MAP_MANAGER updateLocationWithCompleteBlock:^(BOOL success, CLLocation * _Nonnull location, BMKLocation * _Nullable bmkLocation) {
  310. [MBProgressHUD rq_hideHUD];
  311. if (success) {
  312. NSString *method = @"uploadScanCodeVerify";
  313. NSInteger faceNum = RQPuTianFaceNum;
  314. NSMutableArray *arr = [NSMutableArray array];
  315. NSArray *waterMaekArr = @[];
  316. [arr addPro:@"stuid" Value:RQ_USER_MANAGER.currentUser.outId];///学员ID
  317. [arr addPro:@"dqbh" Value:RQ_USER_MANAGER.currentUser.city];///地区编号
  318. [arr addPro:@"lng" Value:[NSString stringWithFormat:@"%f",location.coordinate.longitude]];///手机经度
  319. [arr addPro:@"lat" Value:[NSString stringWithFormat:@"%f",location.coordinate.latitude]];///手机纬度
  320. if (_rqQRCodeType == RQQRCodeType_PTMJ) {
  321. [arr addPro:@"kind" Value:array[5]];///扫码类型:1 :入场; 2:离场
  322. [arr addPro:@"sim" Value:array[1]];///SIM卡号
  323. [arr addPro:@"regionId" Value:array[6]];///场地ID
  324. [arr addPro:@"timestamp" Value:array[2]];///时间戳
  325. [arr addPro:@"devlng" Value:array[3]];///设备经度
  326. [arr addPro:@"devlat" Value:array[4]];///设备纬度
  327. method = @"uploadScanCodeVerify";
  328. faceNum = RQPuTianFaceNum;
  329. } else if (_rqQRCodeType == RQQRCodeType_PTSC) {
  330. [arr addPro:@"stunum" Value:array[12]];///学员编号
  331. [arr addPro:@"subject" Value:array[5]];///当前扫码训练阶段
  332. [arr addPro:@"imei" Value:[FCUUID uuidForDevice]];///唯一识别号
  333. [arr addPro:@"event" Value:array[7]];///扫码类型:17 签到 19签退
  334. [arr addPro:@"sim" Value:array[1]];///SIM卡号
  335. [arr addPro:@"timestamp" Value:array[2]];///时间戳
  336. [arr addPro:@"devlng" Value:array[4]];///设备经度
  337. [arr addPro:@"devlat" Value:array[3]];///设备纬度
  338. method = @"uploadScCodeVerify";
  339. faceNum = RQ_USER_MANAGER.scbdFaceCount;//后台配置-根据地区变化
  340. BOOL isOpenWater = array.count > 14? (RQObjectIsNil(array[13])? NO : ![[NSNumber numberWithString:array[13]] boolValue]) : NO;
  341. waterMaekArr = isOpenWater? @[[NSDate rq_currentTimestamp],
  342. [NSString stringWithFormat:@"经纬度:%@,%@",[NSString stringWithFormat:@"%f",location.coordinate.longitude],[NSString stringWithFormat:@"%f",location.coordinate.latitude]],
  343. [NSString stringWithFormat:@"教练姓名:%@",[NSString stringWithFormat:@"%@",array[15]]],
  344. [NSString stringWithFormat:@"学员姓名:%@",[NSString stringWithFormat:@"%@",RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.userName)? RQ_USER_MANAGER.currentUser.userName : @""]],
  345. [NSString stringWithFormat:@"车牌号:%@",[NSString stringWithFormat:@"%@",array[14]]],
  346. [NSString stringWithFormat:@"驾校:%@",[NSString stringWithFormat:@"%@",RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.schInfo.name)? RQ_USER_MANAGER.currentUser.schInfo.name : @""]],
  347. [NSString stringWithFormat:@"车速:%@km/h",[NSString stringWithFormat:@"%@",array[10]]],
  348. ] : @[];
  349. }
  350. [MBProgressHUD rq_showProgressHUD:@"验证中..."];
  351. [jiaPeiManager requestAnythingWithURL:method array:arr data:nil completion:^(NSDictionary * root) {
  352. [MBProgressHUD rq_hideHUD];
  353. if (!root) {
  354. resultBlock(NO);
  355. [RQ_SHARE_FUNCTION showAlertWithMessage:@"操作失败,请重试!" completion:nil];
  356. [Tools playAudioWithString:@"操作失败,请重试!"];
  357. return;
  358. }
  359. if ([root[@"code"] integerValue] == 0) {
  360. dispatch_async(dispatch_get_main_queue(), ^{
  361. [RQ_CHECKBODY_MANAGER beginCheckBodyWithCheckNum:faceNum checkBodyType:RQCheckBodyType_PTSC waterMarkArr:waterMaekArr completeBlock:^(BOOL success, NSDictionary * _Nullable dic) {
  362. if (success) {
  363. [self face2faceWithQRCodeType:_rqQRCodeType rqCodeArr:array photo:dic[@"normalImg"] resultBlock:^(BOOL isSuccess, id a) {
  364. resultBlock(isSuccess);
  365. }];
  366. }
  367. }];
  368. });
  369. } else {
  370. resultBlock(NO);
  371. if ([root[@"body"] isKindOfClass:[NSString class]] && ![root[@"body"] isEqualToString:@""]) {
  372. [Tools playAudioWithString:root[@"body"]];
  373. [RQ_SHARE_FUNCTION showAlertWithMessage:root[@"body"] completion:nil];
  374. [Bugly reportException:[NSException exceptionWithName:[NSString stringWithFormat:@"uploadScCodeVerify---%@",root[@"body"]] reason:[arr jsonStringEncoded] userInfo:[RQ_USER_MANAGER.currentUser dictionaryValue]]];
  375. } else {
  376. [RQ_SHARE_FUNCTION showAlertWithMessage:@"操作失败,请重试!" completion:nil];
  377. [Tools playAudioWithString:@"操作失败,请重试!"];
  378. }
  379. }
  380. }];
  381. } else {
  382. resultBlock(NO);
  383. [RQ_SHARE_FUNCTION showAlertWithMessage:@"定位失败!" completion:nil];
  384. }
  385. }];
  386. }
  387. #pragma mark - PrivateMethods
  388. - (void)face2faceWithQRCodeType:(RQQRCodeType)rqCodeType rqCodeArr:(NSArray *)rqCodeArr photo:(NSString *)photoStr resultBlock:(void (^)(BOOL isSuccess , __nullable id a))resultBlock {
  389. @weakify(self)
  390. if (![Util connectedToNetWork]) {
  391. showMsgUnconnect();
  392. resultBlock(NO, nil);
  393. return;
  394. }
  395. if ([photoStr isEqualToString:@"(null)"] || [photoStr isEqualToString:@""]) {
  396. resultBlock(NO, nil);
  397. return;
  398. }
  399. [MBProgressHUD rq_showProgressHUD:@"正在获取当前位置..."];
  400. [RQ_MAP_MANAGER updateLocationWithCompleteBlock:^(BOOL success, CLLocation * _Nonnull location, BMKLocation * _Nullable bmkLocation) {
  401. [MBProgressHUD rq_hideHUD];
  402. if (success) {
  403. NSString *method;
  404. NSTimeInterval timeI = [[NSDate date] timeIntervalSince1970] * 1000;//获取时间戳 单位:s *1000毫秒
  405. NSInteger timeInt = [NSString stringWithFormat:@"%.0f",timeI].integerValue;
  406. NSString *currentTimeStr = [NSString stringWithFormat:@"%ld",timeInt];
  407. if (currentTimeStr.length > 10) {
  408. currentTimeStr = [currentTimeStr substringFromIndex:currentTimeStr.length - 10];
  409. }
  410. NSMutableArray *arr = [NSMutableArray array];
  411. [arr addPro:@"objid" Value:RQ_USER_MANAGER.currentUser.outId];///学员ID或教练ID
  412. [arr addPro:@"dqbh" Value:RQ_USER_MANAGER.currentUser.city];///地区编号
  413. [arr addPro:@"photo" Value:photoStr? : @""];///照片Base64数据
  414. if (rqCodeType == RQQRCodeType_PTMJ) {
  415. method = @"mjFace2face";
  416. [arr addPro:@"type" Value:@"1"];///拍照类型:1 :学员; 2:教练
  417. [arr addPro:@"kind" Value:rqCodeArr[5]];///扫码类型:1 :入场; 2:离场
  418. [arr addPro:@"sim" Value:rqCodeArr[1]];///SIM卡号
  419. [arr addPro:@"regionId" Value:rqCodeArr[6]];///场地ID
  420. [arr addPro:@"lng" Value:[NSString stringWithFormat:@"%f",location.coordinate.longitude]];///手机经度
  421. [arr addPro:@"lat" Value:[NSString stringWithFormat:@"%f",location.coordinate.latitude]];///手机纬度
  422. method = @"mjFace2face";
  423. } else if (rqCodeType == RQQRCodeType_PTSC) {
  424. method = @"mjFace2face";
  425. [arr addPro:@"type" Value:@"1"];///拍照类型:1 :学员; 2:教练
  426. [arr addPro:@"classId" Value:rqCodeArr[6]];///课堂ID
  427. [arr addPro:@"subject" Value:rqCodeArr[5]];///当前扫码训练阶段
  428. [arr addPro:@"imei" Value:[FCUUID uuidForDevice]];///唯一识别号
  429. [arr addPro:@"event" Value:rqCodeArr[7]];///扫码类型:17 签到 19签退
  430. [arr addPro:@"sim" Value:rqCodeArr[1]];///SIM卡号
  431. [arr addPro:@"speed" Value:rqCodeArr[8]];///卫星定位速度
  432. [arr addPro:@"gpstime" Value:rqCodeArr[9]];///GPS时间
  433. [arr addPro:@"drispeed" Value:rqCodeArr[10]];///行驶记录速度
  434. [arr addPro:@"direction" Value:rqCodeArr[11]];///卫星定位速度
  435. [arr addPro:@"picno" Value:currentTimeStr];///照片编号
  436. [arr addPro:@"lng" Value:[[NSString stringWithFormat:@"%@",rqCodeArr[4]] stringByReplacingOccurrencesOfString:@"." withString:@""]];///设备经度
  437. [arr addPro:@"lat" Value:[[NSString stringWithFormat:@"%@",rqCodeArr[3]] stringByReplacingOccurrencesOfString:@"." withString:@""]];///设备纬度
  438. method = @"scFace2face";
  439. } else if (rqCodeType == RQQRCodeType_ZJJP) {
  440. method = @"zjFace2face";
  441. [arr addPro:@"sim" Value:rqCodeArr[0]];///SIM卡号
  442. [arr addPro:@"event" Value:rqCodeArr[1]];///扫码类型:1 签到 2签退 3培训过程
  443. } else {
  444. method = @"mjFace2face";
  445. [arr addPro:@"type" Value:@"1"];///拍照类型:1 :学员; 2:教练
  446. }
  447. [MBProgressHUD rq_showProgressHUD:@"验证中..."];
  448. [jiaPeiManager requestAnythingWithURL:method array:arr data:nil completion:^(NSDictionary * root) {
  449. @strongify(self)
  450. [MBProgressHUD rq_hideHUD];
  451. if (!root) {
  452. resultBlock(NO, nil);
  453. [RQ_SHARE_FUNCTION showAlertWithMessage:@"操作失败,请重试!" completion:nil];
  454. [Tools playAudioWithString:@"操作失败,请重试!"];
  455. return;
  456. }
  457. if ([root[@"code"] integerValue] == 0) {
  458. resultBlock(YES, root);
  459. if ([root[@"body"] isKindOfClass:[NSString class]] && ![root[@"body"] isEqualToString:@""]) {
  460. if (self.rqQRCodeType == RQQRCodeType_ZJJP) {
  461. } else {
  462. [Tools playAudioWithString:root[@"body"]];
  463. [RQ_SHARE_FUNCTION showAlertWithMessage:root[@"body"] completion:nil];
  464. }
  465. } else {
  466. if (self.rqQRCodeType == RQQRCodeType_PTSC) {
  467. NSString *message = @"操作成功!";
  468. if([self.PTSC6_str isEqualToString:@"5"]){
  469. if ([rqCodeArr[7] integerValue] == 17) {
  470. message = @"扫码签到验证成功,请等待设备响应";
  471. } else if ([rqCodeArr[7] integerValue] == 19) {
  472. message = @"扫码签退验证成功,请等待设备响应";
  473. }
  474. }else{
  475. message = @"扫码成功, 请在设备进行下一步操作";
  476. }
  477. [RQ_SHARE_FUNCTION showAlertWithMessage:message completion:nil];
  478. [Tools playAudioWithString:message];
  479. } else if (self.rqQRCodeType == RQQRCodeType_ZJJP) {
  480. } else {
  481. [RQ_SHARE_FUNCTION showAlertWithMessage:@"操作成功!" completion:nil];
  482. [Tools playAudioWithString:@"操作成功!"];
  483. }
  484. }
  485. } else {
  486. resultBlock(NO, nil);
  487. if ([root[@"body"] isKindOfClass:[NSString class]] && ![root[@"body"] isEqualToString:@""]) {
  488. [Tools playAudioWithString:root[@"body"]];
  489. [RQ_SHARE_FUNCTION showAlertWithMessage:root[@"body"] completion:nil];
  490. } else {
  491. [RQ_SHARE_FUNCTION showAlertWithMessage:@"操作失败,请重试!" completion:nil];
  492. [Tools playAudioWithString:@"操作失败,请重试!"];
  493. }
  494. }
  495. }];
  496. } else {
  497. resultBlock(NO, nil);
  498. [RQ_SHARE_FUNCTION showAlertWithMessage:@"定位失败!" completion:nil];
  499. }
  500. }];
  501. }
  502. - (void)uploadZjmnLoginWithArray:(NSArray *)array resultBlock:(void (^)(BOOL isSuccess))resultBlock {
  503. if (![Util connectedToNetWork]) {
  504. showMsgUnconnect();
  505. resultBlock(NO);
  506. return;
  507. }
  508. NSString *trainTypeStr = array[1];
  509. NSInteger timeStamp = [RQ_SHARE_FUNCTION getTimeStampWithDate:[NSDate date]];
  510. NSString *timeStampStr = [NSString stringWithFormat:@"%@",[NSNumber numberWithInteger:timeStamp]];
  511. NSString *classIdStr = timeStampStr;
  512. if (classIdStr.length < 10) {
  513. /// 如果生成时间戳错误 用一个随机十位数代替
  514. classIdStr = [NSString stringWithFormat:@"%@",[NSNumber numberWithInteger:[NSString rq_randomNumberWithFrom:1647311377 to:9999999999]]];
  515. } else if (classIdStr.length > 10) {
  516. classIdStr = [classIdStr substringFromIndex:classIdStr.length - 10];
  517. }
  518. if ([trainTypeStr isEqualToString:@"1"]) {
  519. [QMUITips showLoading:@"签到中..." inView:DefaultTipsParentView];
  520. // [MBProgressHUD rq_showProgressHUD:@"签到中..."];
  521. } else if ([trainTypeStr isEqualToString:@"2"]) {
  522. // [MBProgressHUD rq_showProgressHUD:@"签退中..."];
  523. [QMUITips showLoading:@"签退中..." inView:DefaultTipsParentView];
  524. classIdStr = @"";
  525. }
  526. NSString *method = @"uploadZjmnLogin";
  527. NSMutableArray *arr = [NSMutableArray array];
  528. [arr addPro:@"stuid" Value:RQ_USER_MANAGER.currentUser.outId];///学员ID
  529. [arr addPro:@"dqbh" Value:RQ_USER_MANAGER.currentUser.city];///地区编号
  530. [arr addPro:@"sim" Value:array[0]];///SIM卡号
  531. [arr addPro:@"event" Value:array[1]];///扫码类型:1 签到 2签退 3培训过程
  532. [arr addPro:@"subject" Value:RQ_PT_Object_Module.zjSubjectStr];///当前扫码训练阶段
  533. [arr addPro:@"classId" Value:classIdStr];///課堂ID
  534. [arr addPro:@"timestamp" Value:array[3]];///时间戳
  535. if (array.count > 4) {
  536. [arr addPro:@"trainModel" Value:array[4]];/// 2 普通模拟 8考核模拟
  537. }
  538. ///
  539. [jiaPeiManager requestAnythingWithURL:method array:arr data:nil completion:^(NSDictionary * root) {
  540. // [MBProgressHUD rq_hideHUD];
  541. [QMUITips hideAllTips];
  542. if (!root) {
  543. resultBlock(NO);
  544. [QMUITips showError:@"操作失败,请重试!"];
  545. // [RQ_SHARE_FUNCTION showAlertWithMessage:@"操作失败,请重试!" completion:nil];
  546. [Tools playAudioWithString:@"操作失败,请重试!"];
  547. return;
  548. }
  549. if ([root[@"code"] integerValue] == 0) {
  550. resultBlock(YES);
  551. if ([root[@"body"] isKindOfClass:[NSString class]] && ![root[@"body"] isEqualToString:@""]) {
  552. [Tools playAudioWithString:root[@"body"]];
  553. [QMUITips showSucceed:root[@"body"]];
  554. // [RQ_SHARE_FUNCTION showAlertWithMessage:root[@"body"] completion:nil];
  555. } else {
  556. [QMUITips showError:@"操作成功!"];
  557. // [RQ_SHARE_FUNCTION showAlertWithMessage:@"操作成功!" completion:nil];
  558. [Tools playAudioWithString:@"操作成功!"];
  559. }
  560. } else {
  561. resultBlock(NO);
  562. if ([root[@"body"] isKindOfClass:[NSString class]] && ![root[@"body"] isEqualToString:@""]) {
  563. [Tools playAudioWithString:root[@"body"]];
  564. // [RQ_SHARE_FUNCTION showAlertWithMessage:root[@"body"] completion:nil];
  565. [QMUITips showError:root[@"body"]];
  566. } else {
  567. [QMUITips showError:@"操作失败,请重试!"];
  568. // [RQ_SHARE_FUNCTION showAlertWithMessage:@"操作失败,请重试!" completion:nil];
  569. [Tools playAudioWithString:@"操作失败,请重试!"];
  570. }
  571. }
  572. }];
  573. }
  574. - (void)uploadTrainFileMnWithArray:(NSArray *)array resultBlock:(void (^)(BOOL isSuccess))resultBlock {
  575. if (![Util connectedToNetWork]) {
  576. resultBlock(NO);
  577. showMsgUnconnect();
  578. return;
  579. }
  580. NSString *method = @"uploadTrainFileMn";
  581. [jiaPeiManager requestAnythingWithURL:method array:array data:nil completion:^(NSDictionary * root) {
  582. if (!root) {
  583. resultBlock(NO);
  584. [RQ_SHARE_FUNCTION showAlertWithMessage:@"上传失败,请重试!" completion:nil];
  585. [Tools playAudioWithString:@"上传失败,请重试!"];
  586. return;
  587. }
  588. if ([root[@"code"] integerValue] == 0) {
  589. resultBlock(YES);
  590. } else {
  591. resultBlock(NO);
  592. if ([root[@"body"] isKindOfClass:[NSString class]] && ![root[@"body"] isEqualToString:@""]) {
  593. [Tools playAudioWithString:root[@"body"]];
  594. [RQ_SHARE_FUNCTION showAlertWithMessage:root[@"body"] completion:nil];
  595. }
  596. }
  597. }];
  598. }
  599. - (NSString *)ptSubjectStr {
  600. NSString *key = [NSString stringWithFormat:@"ptSubjectStr-%@",RQ_USER_MANAGER.currentUser.stuNum];
  601. id object = [self getObjectWithKey:key];
  602. if (RQObjectIsNil(object)) {
  603. return @"";
  604. } else {
  605. NSString *myPtSubjectStr = (NSString *)object;
  606. return myPtSubjectStr;
  607. }
  608. }
  609. - (void)setPtSubjectStr:(NSString *)ptSubjectStr {
  610. NSString *key = [NSString stringWithFormat:@"ptSubjectStr-%@",RQ_USER_MANAGER.currentUser.stuNum];
  611. [self saveObjectWithObject:ptSubjectStr ForKey:key];
  612. }
  613. - (NSString *)zjSubjectStr {
  614. NSString *key = [NSString stringWithFormat:@"zjSubjectStr-%@",RQ_USER_MANAGER.currentUser.stuNum];
  615. id object = [self getObjectWithKey:key];
  616. if (RQObjectIsNil(object)) {
  617. return @"";
  618. } else {
  619. NSString *myZjSubjectStr = (NSString *)object;
  620. return myZjSubjectStr;
  621. }
  622. }
  623. - (void)setZjSubjectStr:(NSString *)zjSubjectStr {
  624. NSString *key = [NSString stringWithFormat:@"zjSubjectStr-%@",RQ_USER_MANAGER.currentUser.stuNum];
  625. [self saveObjectWithObject:zjSubjectStr ForKey:key];
  626. }
  627. - (void)saveObjectWithObject:(id)object ForKey:(NSString* )key {
  628. NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
  629. if (!object) {
  630. [ud removeObjectForKey:key];
  631. }else{
  632. [ud setObject:object forKey:key];
  633. }
  634. [ud synchronize];
  635. }
  636. - (id)getObjectWithKey:(NSString *)key {
  637. NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
  638. return [ud objectForKey:key];
  639. }
  640. @end