NYExaminationRoomViewController.m 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. //
  2. // NYExaminationRoomViewController.m
  3. // jiaPei
  4. //
  5. // Created by Ning.ge on 2024/10/17.
  6. // Copyright © 2024 JCZ. All rights reserved.
  7. //
  8. #import "NYExaminationRoomViewController.h"
  9. #import "NYChartView.h"
  10. #import "NYQuestionContentView.h"
  11. #import <SDWebImage/UIImageView+WebCache.h>
  12. @interface NYExaminationRoomViewController ()
  13. @property (nonatomic, readwrite, strong) NYExaminationRoomViewModel *viewModel;
  14. @property (weak, nonatomic) IBOutlet UIView *content_view;
  15. @property (weak, nonatomic) IBOutlet UIView *content01_view;
  16. @property (weak, nonatomic) IBOutlet UIView *right_view;
  17. @property (weak, nonatomic) IBOutlet UIView *center_view;
  18. @property (weak, nonatomic) IBOutlet UIView *right_bk_view;
  19. @property (weak, nonatomic) IBOutlet UIView *bottom_view;
  20. @property (weak, nonatomic) IBOutlet UIImageView *usericon_view;
  21. @property (weak, nonatomic) IBOutlet UILabel *username_label;
  22. @property (weak, nonatomic) IBOutlet UILabel *timeLabel;
  23. @property (weak, nonatomic) IBOutlet UILabel *sex_label;
  24. @property (weak, nonatomic) IBOutlet UILabel *type_label;
  25. @property (weak, nonatomic) IBOutlet UILabel *km_label;
  26. @property (weak, nonatomic) IBOutlet UILabel *showtips_label;
  27. @property (weak, nonatomic) IBOutlet UIButton *previous_btn;
  28. @property (weak, nonatomic) IBOutlet UIButton *next_btn;
  29. @property (weak, nonatomic) IBOutlet UIButton *submit_btn;
  30. @property (weak, nonatomic) IBOutlet UIButton *image_btn;
  31. @property (weak, nonatomic) IBOutlet UIButton *image_big_btn;
  32. @property (nonatomic,weak) NYChartMatrixView *chartMatrixView;
  33. @property (nonatomic,strong) NYQuestionContentView *questionContentView;
  34. @property (nonatomic,strong) NYExaminationTipsViewController *examinationTipsViewController;
  35. @property (nonatomic,strong) NSArray *exercise_array;
  36. @property (nonatomic,assign) int index;
  37. //成绩
  38. @property (nonatomic,assign) NSInteger score;
  39. @end
  40. @implementation NYExaminationRoomViewController
  41. @dynamic viewModel;
  42. - (void)viewDidLoad {
  43. [super viewDidLoad];
  44. // Do any additional setup after loading the view from its nib.
  45. self.previous_btn.layer.borderWidth = 1.0f;
  46. self.previous_btn.layer.borderColor = UIColorHex(0x9A9B9D).CGColor;
  47. self.next_btn.layer.borderWidth = 1.0f;
  48. self.next_btn.layer.borderColor = UIColorHex(0x9A9B9D).CGColor;
  49. self.submit_btn.layer.borderWidth = 1.0f;
  50. self.submit_btn.layer.borderColor = UIColorHex(0x9A9B9D).CGColor;
  51. //小李题
  52. if(self.viewModel.questionArr!=NULL){
  53. self.timeLabel.hidden = YES;
  54. self.submit_btn.hidden = YES;
  55. }
  56. self.content01_view.layer.borderWidth = 1.0f;
  57. self.content01_view.layer.borderColor = UIColorHex(0xD9D9D9).CGColor;
  58. [self enterLandscapeFullScreen:UIInterfaceOrientationLandscapeLeft animated:YES];
  59. [self.view setNeedsLayout];
  60. [self.view layoutIfNeeded];
  61. [self initYDTQuestiondata];
  62. [self setUserLeft];
  63. [self setRightChartView];
  64. [self setupTimeLabel];
  65. [self setQuestionContentView];
  66. [self exerciseLoadData];
  67. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(optionDTNotification:) name:NYExerciseOptionDTNotification object:nil];
  68. }
  69. - (void)dealloc
  70. {
  71. [[NSNotificationCenter defaultCenter] removeObserver:self];
  72. }
  73. - (void)initYDTQuestiondata{
  74. if(self.viewModel.questionArr!=NULL){
  75. self.score = 0;
  76. self.exercise_array = self.viewModel.questionArr;
  77. self.index = 0;
  78. }else{
  79. self.score = 0;
  80. NSArray *arr = [RQ_YDTQuestion_Module getQuestionWithExerciseType:RQExerciseType_Exam];
  81. __block NSInteger num = 0;
  82. arr = [arr.rac_sequence.signal map:^id _Nullable(RQYDTQuestionModel *ydtQuestionModel) {
  83. ydtQuestionModel.num = num;
  84. num ++;
  85. return [RQExerciseModel exerciseModelWithRQYDTQuestionModel:ydtQuestionModel];
  86. }].toArray;
  87. self.exercise_array = arr;
  88. self.index = 0;
  89. }
  90. }
  91. - (void)exerciseLoadData{
  92. self.previous_btn.selected = NO;
  93. self.next_btn.selected = NO;
  94. self.previous_btn.userInteractionEnabled = YES;
  95. self.next_btn.userInteractionEnabled = YES;
  96. if(self.exercise_array.count>0){
  97. if(self.index>self.exercise_array.count-1){
  98. return;
  99. }
  100. RQExerciseModel *exercise = self.exercise_array[self.index];
  101. [self.questionContentView readLodData:exercise];
  102. [self imageLoadData:exercise];
  103. [self showtipsLoadData:exercise];
  104. [self rightLoadData];
  105. }
  106. if(self.index==0){
  107. self.previous_btn.selected = YES;
  108. self.previous_btn.userInteractionEnabled = NO;
  109. self.next_btn.userInteractionEnabled = YES;
  110. }
  111. if(self.index==self.exercise_array.count-1){
  112. self.next_btn.selected = YES;
  113. self.previous_btn.userInteractionEnabled = YES;
  114. self.next_btn.userInteractionEnabled = NO;
  115. }
  116. }
  117. - (void)rightLoadData{
  118. self.chartMatrixView.selectIndex = self.index;
  119. }
  120. - (void)showtipsLoadData:(RQExerciseModel *)exerciseModel{
  121. NSString *typeString = @"";
  122. switch (exerciseModel.ydtQuestionModel.Type) {
  123. case 1:
  124. typeString = @"判断题";
  125. break;
  126. case 2:
  127. typeString = @"单选题";
  128. break;
  129. case 3:
  130. typeString = @"多选题";
  131. break;
  132. default:
  133. typeString = @"";
  134. break;
  135. }
  136. self.showtips_label.text = [NSString stringWithFormat:@"操作提示:%@",typeString];
  137. }
  138. - (void)imageLoadData:(RQExerciseModel *)exerciseModel{
  139. self.image_btn.hidden = YES;
  140. NSString *imageString = @"";
  141. if (RQStringIsNotEmpty(exerciseModel.ydtQuestionModel.media_url)) {
  142. if (RQStringIsNotEmpty(exerciseModel.ydtQuestionModel.sinaimg)) {
  143. imageString = exerciseModel.ydtQuestionModel.media_url;
  144. } else if (RQStringIsNotEmpty(exerciseModel.ydtQuestionModel.video_url)) {
  145. imageString = @"";
  146. } else {
  147. imageString = @"";
  148. }
  149. } else {
  150. imageString = @"";
  151. }
  152. if (RQStringIsNotEmpty(exerciseModel.ydtQuestionModel.sinaimg) || RQStringIsNotEmpty(exerciseModel.ydtQuestionModel.media_url)) {
  153. if (!RQObjectIsNil(exerciseModel.ydtQuestionModel.media_content)) {
  154. NSString *imageStr = [exerciseModel.ydtQuestionModel.media_content base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
  155. UIImage *sinaImage = [UIImage sd_imageWithData:[NSData dataWithBase64EncodedString:imageStr] scale:1 firstFrameOnly:YES];
  156. exerciseModel.ydtQuestionModel.sinaImage = sinaImage;
  157. } else {
  158. NSString *media_name;
  159. if(RQStringIsNotEmpty(exerciseModel.ydtQuestionModel.sinaimg)){//不为空
  160. media_name = exerciseModel.ydtQuestionModel.sinaimg;
  161. imageString = exerciseModel.ydtQuestionModel.sinaimg;
  162. }else{
  163. if ([exerciseModel.ydtQuestionModel.media_url containsString:@"https://"]) {
  164. media_name = [exerciseModel.ydtQuestionModel.media_url componentsSeparatedByString:@"/"].lastObject;
  165. }
  166. }
  167. //本地无数据-使用网络url-本地图片有水印 直接用url
  168. imageString = exerciseModel.ydtQuestionModel.media_url;
  169. }
  170. }
  171. if (RQStringIsNotEmpty(imageString)) {
  172. self.image_btn.hidden = NO;
  173. [self.image_btn sd_setImageWithURL:[NSURL URLWithString:imageString] forState:UIControlStateNormal placeholderImage:RQWebImagePlaceholder()];
  174. [self.image_big_btn sd_setImageWithURL:[NSURL URLWithString:imageString] forState:UIControlStateNormal placeholderImage:RQWebImagePlaceholder()];
  175. }
  176. }
  177. - (void)setUserLeft {
  178. @weakify(self)
  179. NSArray *titls = @[@"科目一",@"科目二",@"科目三",@"科目四",@"科一特训",@"科四特训"];
  180. self.usericon_view.layer.cornerRadius = 58*0.5;
  181. self.usericon_view.layer.masksToBounds = YES;
  182. [self.usericon_view yy_setImageWithURL:[NSURL URLWithString:RQ_USER_MANAGER.currentUser.photo] placeholder:RQWebAvatarImagePlaceholder() options:RQWebImageOptionAutomatic completion:^(UIImage * _Nullable image, NSURL * _Nonnull url, YYWebImageFromType from, YYWebImageStage stage, NSError * _Nullable error) {
  183. @strongify(self);
  184. if(image) {
  185. image = [image qmui_imageResizedInLimitedSize:CGSizeMake(RQ_FIT_HORIZONTAL(54.f), RQ_FIT_HORIZONTAL(54.f)) resizingMode:QMUIImageResizingModeScaleAspectFill];
  186. image = [image qmui_imageWithBorderColor:UIColor.whiteColor borderWidth:1 cornerRadius:RQ_FIT_HORIZONTAL(54.f) / 2.f];
  187. self.usericon_view.image = image;
  188. }
  189. }];
  190. self.username_label.text = [NSString stringWithFormat:@"考生姓名:%@",RQ_USER_MANAGER.currentUser.userName];
  191. NSString *sexStr = @"女";
  192. if([RQ_USER_MANAGER.currentUser.sex isEqualToString:@"1"]){
  193. sexStr = @"男";
  194. }
  195. self.sex_label.text = [NSString stringWithFormat:@"性别:%@",sexStr];
  196. self.type_label.text = [NSString stringWithFormat:@"考试类型:%@",RQ_USER_MANAGER.currentUser.carType];
  197. if(RQ_YDTQuestion_Module.subject>4){
  198. self.km_label.text = [NSString stringWithFormat:@"科目:%@",titls[RQ_YDTQuestion_Module.subject-1]];
  199. }else{
  200. self.km_label.text = [NSString stringWithFormat:@"科目:%@",titls[RQ_YDTQuestion_Module.subject]];
  201. }
  202. }
  203. //题目-tableview
  204. - (void)setQuestionContentView {
  205. NYQuestionContentView *questionContentView = [[NYQuestionContentView alloc] init];
  206. [self.center_view addSubview:questionContentView];
  207. self.questionContentView = questionContentView;
  208. [questionContentView mas_makeConstraints:^(MASConstraintMaker *make) {
  209. make.left.right.top.mas_equalTo(self.center_view);
  210. make.bottom.mas_equalTo(self.bottom_view.mas_top);
  211. }];
  212. }
  213. - (void)setRightChartView {
  214. NSMutableArray *dataSource = [NSMutableArray array];
  215. UIColor *color = UIColorHex(0x3D3C38);
  216. for (int i=0; i<self.exercise_array.count; i++) {
  217. NSString *count = [NSString stringWithFormat:@"%d",i+1];
  218. [dataSource addObject:@{
  219. @"count":count,
  220. @"color":color
  221. }];
  222. }
  223. @weakify(self)
  224. NYChartMatrixView *chartMatrixView = [[NYChartMatrixView alloc] init];
  225. chartMatrixView.dataSource = dataSource;
  226. chartMatrixView.matrixItemClickBlock = ^(id _Nonnull obj, int index) {
  227. NSLog(@"点击了 cell=%@ index=%d",obj,index);
  228. @strongify(self)
  229. self.index = index;
  230. [self exerciseLoadData];
  231. };
  232. [self.right_bk_view addSubview:chartMatrixView];
  233. self.chartMatrixView = chartMatrixView;
  234. [chartMatrixView mas_makeConstraints:^(MASConstraintMaker *make) {
  235. make.left.right.top.bottom.mas_equalTo(self.right_bk_view);
  236. // make.centerY.mas_equalTo(self.view.mas_centerY);
  237. // make.height.mas_equalTo(KRealValue(401-20));
  238. }];
  239. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  240. [chartMatrixView loadView];
  241. chartMatrixView.selectIndex = 0;
  242. });
  243. }
  244. //右-刷新
  245. - (void)rightChartViewLoadData {
  246. @try {
  247. NSMutableArray *dataSource = [NSMutableArray array];
  248. for (int i=0; i<self.exercise_array.count; i++) {
  249. NSString *count = [NSString stringWithFormat:@"%d",i+1];
  250. RQExerciseModel *exercise = self.exercise_array[i];
  251. UIColor *color = UIColorHex(0x3D3C38);
  252. if(exercise.answerResultsType != RQAnswerResultsType_Unanswered) {//已答题
  253. count = [exercise.userAnswerStr stringByReplacingOccurrencesOfString:@"," withString:@""];
  254. if(exercise.answerResultsType == RQAnswerResultsType_Error) { // 回答错误
  255. color = UIColorHex(0xBC322D);
  256. }
  257. }
  258. [dataSource addObject:@{
  259. @"count":count,
  260. @"color":color
  261. }];
  262. }
  263. self.chartMatrixView.dataSource = dataSource;
  264. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  265. [self.chartMatrixView loadView];
  266. });
  267. } @catch (NSException *exception) {
  268. NSLog(@"ExaminationRoom %@",exception.description);
  269. }
  270. }
  271. - (void)setupTimeLabel{
  272. if(self.viewModel.questionArr==NULL){
  273. RQ_Exercise_Module.count = 45 * 60;
  274. [RQ_Exercise_Module startTimer];
  275. RAC(_timeLabel, text) = [RACObserve(RQ_Exercise_Module, count) map:^id _Nullable(id _Nullable value) {
  276. NSUInteger sec = RQ_Exercise_Module.count%60;
  277. NSUInteger min = RQ_Exercise_Module.count/60;
  278. NSString* sec0,*min0;
  279. sec0 = sec<10 ? @"0" : @"";
  280. min0 = min<10 ? @"0" : @"";
  281. return [NSString stringWithFormat:@"%@%lu:%@%lu",min0,(unsigned long)min,sec0,(unsigned long)sec];
  282. }];
  283. }
  284. }
  285. - (void)viewWillAppear:(BOOL)animated {
  286. [super viewWillAppear:animated];
  287. [self.navigationController.navigationBar setHidden:YES];
  288. if (RQ_Exercise_Module.timer) {
  289. [RQ_Exercise_Module.timer setFireDate:[NSDate distantPast]];
  290. }
  291. }
  292. - (void)viewWillDisappear:(BOOL)animated {
  293. [super viewWillDisappear:animated];
  294. if(!RQ_Exercise_Module.isShow_CatalogueView){
  295. if (RQ_Exercise_Module.timer) {
  296. [RQ_Exercise_Module.timer setFireDate:[NSDate distantFuture]];
  297. }
  298. }
  299. }
  300. - (void)viewDidDisappear:(BOOL)animated {
  301. [super viewDidDisappear:animated];
  302. if(!RQ_Exercise_Module.isShow_CatalogueView){
  303. [RQ_Exercise_Module.timer invalidate];
  304. RQ_Exercise_Module.timer = nil;
  305. RQ_Exercise_Module.count = 0;
  306. RQ_Exercise_Module.beginDate = nil;
  307. }
  308. }
  309. - (NYExaminationTipsViewController *)examinationTipsViewController {
  310. if(!_examinationTipsViewController){
  311. _examinationTipsViewController = [[NYExaminationTipsViewController alloc ]init];
  312. }
  313. return _examinationTipsViewController;
  314. }
  315. - (IBAction)backAtciondo:(id)sender {
  316. if(self.viewModel.questionArr!=NULL){
  317. [self.navigationController.navigationBar setHidden:NO];
  318. [self.navigationController popToRootViewControllerAnimated:YES];
  319. return;
  320. }
  321. [self.examinationTipsViewController showTypeTipsView:3 invView:self.view inModel:nil];
  322. }
  323. - (void)gobackAtciondo{
  324. [self.navigationController.navigationBar setHidden:NO];
  325. [self.navigationController popToRootViewControllerAnimated:YES];
  326. }
  327. - (void)enterLandscapeFullScreen:(UIInterfaceOrientation)orientation animated:(BOOL)animated {
  328. [[UIDevice currentDevice] setValue:[NSNumber numberWithInt:UIInterfaceOrientationUnknown] forKey:@"orientation"];
  329. NSNumber *orientationUnknown = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft];
  330. [[UIDevice currentDevice] setValue:orientationUnknown forKey:@"orientation"];
  331. }
  332. //支持的方向
  333. - (UIInterfaceOrientationMask)supportedInterfaceOrientations
  334. {
  335. return UIInterfaceOrientationMaskLandscapeLeft|UIInterfaceOrientationMaskLandscapeRight;
  336. }
  337. - (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation
  338. {
  339. return UIInterfaceOrientationPortrait;
  340. }
  341. #pragma mark ######事件######
  342. //上一题
  343. - (IBAction)previousActiondo:(id)sender {
  344. if(self.index<0)return;
  345. self.index--;
  346. [self exerciseLoadData];
  347. }
  348. //下一题
  349. - (IBAction)nextActiondo:(id)sender {
  350. if(self.index>self.exercise_array.count)return;
  351. self.index++;
  352. [self exerciseLoadData];
  353. }
  354. //交卷
  355. - (IBAction)submitActiondo:(id)sender {
  356. // self.exerciseModel.answerResultsType = RQAnswerResultsType_Error;
  357. NSPredicate *predicateE = [NSPredicate predicateWithFormat:@"answerResultsType == %@", @(RQAnswerResultsType_Error)];
  358. NSUInteger errorCount = [[self.exercise_array filteredArrayUsingPredicate:predicateE] count];
  359. NSPredicate *predicateC = [NSPredicate predicateWithFormat:@"answerResultsType == %@", @(RQAnswerResultsType_Correct)];
  360. NSUInteger correctount = [[self.exercise_array filteredArrayUsingPredicate:predicateC] count];
  361. NSInteger totalNum = self.exercise_array.count;
  362. NSInteger errorNum = errorCount;
  363. NSInteger rightNum = correctount;
  364. NSInteger hasdoNum = errorNum + rightNum;
  365. NSInteger undoNum = totalNum - hasdoNum;
  366. NSInteger perScore = 100 / totalNum;
  367. NSInteger score = rightNum * perScore;
  368. CGFloat progress = (hasdoNum * 1.00) / (totalNum * 1.00);
  369. BOOL isSuccess = (score >= 90);
  370. self.score = score;
  371. self.examinationTipsViewController.t1_centont_label.text = [NSString stringWithFormat:@"你当前考试答对%zd题,答错%zd题,未答%zd题",rightNum,errorNum,undoNum];
  372. self.examinationTipsViewController.t2_centont_label.text = isSuccess ? [NSString stringWithFormat:@"您本次模拟考试得%zd分。恭喜您及格了!",score]:[NSString stringWithFormat:@"您本次模拟考试得%zd分。不及格!祝你下次考试成功!",score];
  373. [self.examinationTipsViewController showTypeTipsView:1 invView:self.view inModel:nil];
  374. }
  375. //放大图片
  376. - (IBAction)imageBigActiondo:(UIButton *)sender {
  377. self.image_big_btn.hidden = ! self.image_big_btn.hidden;
  378. }
  379. //通知-事件-答题结果-交卷
  380. - (void)optionDTNotification:(NSNotification*)notif{
  381. int type = [notif.object intValue];
  382. if(type==0){//答对了
  383. [self nextActiondo:nil];//进入下一题
  384. [self rightChartViewLoadData];
  385. }else if(type==1){//答错了
  386. @try {
  387. if(self.index>self.exercise_array.count){
  388. return;
  389. }
  390. RQExerciseModel *exercise = self.exercise_array[self.index];
  391. [self.examinationTipsViewController showTypeTipsView:0 invView:self.view inModel:exercise];
  392. [self rightChartViewLoadData];
  393. } @catch (NSException *exception) {
  394. NSLog(@"ExaminationRoom%@",exception.description);
  395. }
  396. }else if(type==2){//交卷
  397. NSUInteger sec = RQ_Exercise_Module.count%60;
  398. NSUInteger min = RQ_Exercise_Module.count/60;
  399. NSString* sec0,*min0;
  400. sec0 = sec<10 ? @"0" : @"";
  401. min0 = min<10 ? @"0" : @"";
  402. //提交做题记录
  403. NSInteger allTimeCount = (RQ_YDTQuestion_Module.carType == RQHomePageCarType_Motorcycle)? 30 * 60 : 45 * 60;
  404. NSInteger useCount = allTimeCount - min * 60 - sec;
  405. NSString *beginDateStr = [[NSDateFormatter rq_defaultDateFormatter] stringFromDate:RQ_Exercise_Module.beginDate];
  406. NSDate *endDte = [NSDate dateWithTimeInterval:useCount sinceDate:RQ_Exercise_Module.beginDate];
  407. NSString *endDateStr = [[NSDateFormatter rq_defaultDateFormatter] stringFromDate:endDte];
  408. @weakify(self)
  409. [[[RQ_HTTP_Service saveFavQuestionWithScore:self.score startDate:beginDateStr endDate:endDateStr] deliverOnMainThread] subscribeNext:^(id _Nullable x) {
  410. NSLog(@"交卷成功-成绩%zd",self.score);
  411. } error:^(NSError * _Nullable error) {
  412. NSLog(@"交卷失败-成绩%zd",self.score);
  413. }];
  414. [self.examinationTipsViewController showTypeTipsView:2 invView:self.view inModel:nil];
  415. }else if(type==3){//关闭退出
  416. [self gobackAtciondo];
  417. }
  418. }
  419. @end