// // RQYDTZGZWYCQuestionModule.m // jiaPei // // Created by 张嵘 on 2022/4/7. // Copyright © 2022 JCZ. All rights reserved. // #import "RQYDTZGZWYCQuestionModule.h" static NSString *dbNameStr = @"zgzwyc"; static NSString *dbTypeStr = @"db"; static NSString *questionTableNameStr = @"web_note"; @interface RQYDTZGZWYCQuestionModule () @property (nonatomic, readwrite, strong) FMDatabaseQueue *databaseQueue; @property (nonatomic, readwrite, copy) NSArray *chapterNameSubjectOneArr; @property (nonatomic, readwrite, copy) NSArray *chapterNameSubjectFourArr; @property (nonatomic, readwrite, assign) RQHomePageCarType carType; @end @implementation RQYDTZGZWYCQuestionModule static id rq_ydtZgzWycQuestionModule = nil; #pragma mark - init + (instancetype)sharedInstance { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ rq_ydtZgzWycQuestionModule = [[self alloc] init]; }); return rq_ydtZgzWycQuestionModule; } - (instancetype)init { if (self = [super init]) { NSString *resourcePath = [[NSBundle mainBundle] pathForResource:dbNameStr ofType:dbTypeStr]; [self initDatabaseQueueWithResourcePath:resourcePath]; } return self; } #pragma mark - PublicMethods - (void)initDatabaseQueueWithResourcePath:(NSString *)resourcePath { NSError *error; NSString *dbPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@",dbNameStr,dbTypeStr]]; if ([RQFileManager isPathExist:dbPath]) { self.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:dbPath]; NSLog(@"数据库path-----%@",dbPath); if ([self getQuestionVersion] >= [self getQuestionVersionWithResourcePath:resourcePath]) { } else { [[RQFileManager fileManager] removeItemAtPath:dbPath error:&error]; [[RQFileManager fileManager] copyItemAtPath:resourcePath toPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@",dbNameStr,dbTypeStr]] error:&error]; self.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:dbPath]; } } else { [[RQFileManager fileManager] copyItemAtPath:resourcePath toPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@",dbNameStr,dbTypeStr]] error:&error]; self.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:dbPath]; NSLog(@"数据库path-----%@",dbPath); } } - (NSInteger)getQuestionVersion { __block NSInteger version = 0; if (_databaseQueue) { [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) { FMResultSet *resultSet; resultSet = [db executeQuery:@"SELECT version FROM t_version"]; while ([resultSet next]) { version = [resultSet longForColumn:@"version"]; } }]; } return version; } - (NSInteger)getQuestionVersionWithResourcePath:(NSString *)resourcePath { __block NSInteger version = 0; [[FMDatabaseQueue databaseQueueWithPath:resourcePath] inDatabase:^(FMDatabase * _Nonnull db) { FMResultSet *resultSet; resultSet = [db executeQuery:@"SELECT version FROM t_version"]; while ([resultSet next]) { version = [resultSet longForColumn:@"version"]; } }]; return version; } - (NSArray *)getQuestionWithSubject:(RQHomePageSubjectType)subject exerciseType:(RQExerciseType)exerciseType { return [self getQuestionWithSubject:subject exerciseType:exerciseType isNeedMediaData:NO]; } - (NSArray *)getQuestionWithSubject:(RQHomePageSubjectType)subject exerciseType:(RQExerciseType)exerciseType isNeedMediaData:(BOOL)isNeedMediaData { @weakify(self) NSMutableArray *arr = @[].mutableCopy; NSString *queryStr = [self getQuestionQueryStrWithSubject:subject exerciseType:exerciseType]; if (exerciseType == RQExerciseType_Exam) { /// 车型 NSString *queryCarTypeStr = [NSString stringWithFormat:@"gs LIKE '%%%@%%'",RQ_YDTQuestion_Module.carTypeStr]; /// 科目 NSString *querySubjectTypeStr = [NSString stringWithFormat:@"kemu = '%@'",[RQ_YDTQuestion_Module getSubjectNameWithSubject:subject]]; RACSignal *signal0 = [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) { NSMutableArray *difficultArr = @[].mutableCopy; [[[self getExamRuleWithCarType:self.carType subject:subject].rac_sequence.signal map:^id _Nullable(RQYDTExamRuleModel *ydtExamRuleModel) { NSString *chapterIdStr = [NSString stringWithFormat:@"strTppe = %ld",(long)ydtExamRuleModel.chapter_id]; NSString *typeStr = [NSString stringWithFormat:@"Type IN %@",(RQ_YDTQuestion_Module.subject == RQHomePageSubjectType_SubjectOne)? @"(1, 2)" : @"(1, 2, 3)"]; NSString *randomStr = [NSString stringWithFormat:@"RANDOM() LIMIT %@",[NSString qmui_stringWithNSInteger:ydtExamRuleModel.difficult_count]]; NSString *difficultQueryStr = [NSString stringWithFormat:@"SELECT DISTINCT * FROM %@ WHERE %@ AND %@ AND diff_degree IN (4, 5) AND cityid = 0 AND %@ AND %@ ORDER BY %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, chapterIdStr, typeStr, randomStr]; return difficultQueryStr; }].toArray.rac_sequence.signal subscribeNext:^(NSString *difficultQueryStr) { @strongify(self) [difficultArr addObjectsFromArray:[self queryQuestionWithQueryStr:difficultQueryStr]]; } completed:^{ [subscriber sendNext:difficultArr.copy]; [subscriber sendCompleted]; }]; return [RACDisposable disposableWithBlock:^{}]; }]; RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) { NSMutableArray *judgeArr = @[].mutableCopy; [[[self getExamRuleWithCarType:self.carType subject:subject].rac_sequence.signal map:^id _Nullable(RQYDTExamRuleModel *ydtExamRuleModel) { @strongify(self) NSString *chapterIdStr = [NSString stringWithFormat:@"AND strTppe = %ld",(long)ydtExamRuleModel.chapter_id]; NSString *judgeCountStr = [NSString stringWithFormat:@"RANDOM() LIMIT %ld",(long)ydtExamRuleModel.judge_count]; NSString *judgeQueryStr = [NSString stringWithFormat:@"SELECT DISTINCT * FROM %@ WHERE %@ AND %@ AND Type = 1 AND diff_degree IN (0,1,2,3) AND cityid = 0 %@ ORDER BY %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, chapterIdStr, judgeCountStr]; NSMutableArray *judgeChapterArr = [self queryQuestionWithQueryStr:judgeQueryStr].mutableCopy; if (judgeChapterArr.count < ydtExamRuleModel.judge_count) { NSString *judgeQueryAddStr = [NSString stringWithFormat:@"SELECT DISTINCT * FROM %@ WHERE %@ AND %@ AND Type = 1 AND diff_degree IN (4,5) AND cityid = 0 %@ ORDER BY RANDOM() LIMIT %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, chapterIdStr, [NSString stringWithFormat:@"%ld",(long)(ydtExamRuleModel.judge_count - judgeChapterArr.count)]]; NSArray *judgeChapterAddArr = [self queryQuestionWithQueryStr:judgeQueryAddStr]; [judgeChapterArr addObjectsFromArray:judgeChapterAddArr]; return judgeChapterArr.copy; } else { return judgeChapterArr.copy; } }].toArray.rac_sequence.signal subscribeNext:^(NSArray *judgeChapterArr) { [judgeArr addObjectsFromArray:judgeChapterArr]; } completed:^{ [subscriber sendNext:judgeArr.copy]; [subscriber sendCompleted]; }]; return [RACDisposable disposableWithBlock:^{}]; }]; RACSignal *signal2 = [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) { NSMutableArray *choiceArr = @[].mutableCopy; [[[self getExamRuleWithCarType:self.carType subject:subject].rac_sequence.signal map:^id _Nullable(RQYDTExamRuleModel *ydtExamRuleModel) { @strongify(self) NSString *chapterIdStr = [NSString stringWithFormat:@"AND strTppe = %ld",(long)ydtExamRuleModel.chapter_id]; NSString *choiceCountStr = [NSString stringWithFormat:@"RANDOM() LIMIT %ld",(long)ydtExamRuleModel.choice_count]; NSString *choiceQueryStr = [NSString stringWithFormat:@"SELECT DISTINCT * FROM %@ WHERE %@ AND %@ AND Type = 2 AND diff_degree IN (0,1,2,3) AND cityid = 0 %@ ORDER BY %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, chapterIdStr, choiceCountStr]; NSMutableArray *choiceChapterArr = [self queryQuestionWithQueryStr:choiceQueryStr].mutableCopy; if (choiceChapterArr.count < ydtExamRuleModel.choice_count) { NSString *choiceQueryAddStr = [NSString stringWithFormat:@"SELECT DISTINCT * FROM %@ WHERE %@ AND %@ AND Type = 2 AND diff_degree IN (4,5) AND cityid = 0 %@ ORDER BY RANDOM() LIMIT %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, chapterIdStr, [NSString stringWithFormat:@"%ld",(long)(ydtExamRuleModel.choice_count - choiceChapterArr.count)]]; NSArray *choiceChapterAddArr = [self queryQuestionWithQueryStr:choiceQueryAddStr]; [choiceChapterArr addObjectsFromArray:choiceChapterAddArr]; return choiceChapterArr.copy; } else { return choiceChapterArr.copy; } }].toArray.rac_sequence.signal subscribeNext:^(NSArray *choiceChapterArr) { [choiceArr addObjectsFromArray:choiceChapterArr]; } completed:^{ [subscriber sendNext:choiceArr.copy]; [subscriber sendCompleted]; }]; return [RACDisposable disposableWithBlock:^{}]; }]; RACSignal *signal3 = [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) { NSMutableArray *multipleChoiceArr = @[].mutableCopy; [[[self getExamRuleWithCarType:self.carType subject:subject].rac_sequence.signal map:^id _Nullable(RQYDTExamRuleModel *ydtExamRuleModel) { @strongify(self) NSString *chapterIdStr = [NSString stringWithFormat:@"AND strTppe = %ld",(long)ydtExamRuleModel.chapter_id]; NSString *multipleChoiceCountStr = [NSString stringWithFormat:@"RANDOM() LIMIT %ld",(long)ydtExamRuleModel.multiple_choice_count]; NSString *multipleChoiceQueryStr = [NSString stringWithFormat:@"SELECT DISTINCT * FROM %@ WHERE %@ AND %@ AND Type = 3 AND diff_degree IN (0,1,2,3) AND cityid = 0 %@ ORDER BY %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, chapterIdStr, multipleChoiceCountStr]; NSMutableArray *multipleChoiceChapterArr = [self queryQuestionWithQueryStr:multipleChoiceQueryStr].mutableCopy; if (multipleChoiceChapterArr.count < ydtExamRuleModel.multiple_choice_count) { NSString *multipleChoiceQueryAddStr = [NSString stringWithFormat:@"SELECT DISTINCT * FROM %@ WHERE %@ AND %@ AND Type = 3 AND diff_degree IN (4,5) AND cityid = 0 %@ ORDER BY RANDOM() LIMIT %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, chapterIdStr, [NSString stringWithFormat:@"%ld",(long)(ydtExamRuleModel.multiple_choice_count - multipleChoiceChapterArr.count)]]; NSArray *multipleChoiceChapterAddArr = [self queryQuestionWithQueryStr:multipleChoiceQueryAddStr]; [multipleChoiceChapterArr addObjectsFromArray:multipleChoiceChapterAddArr]; return multipleChoiceChapterArr.copy; } else { return multipleChoiceChapterArr.copy; } }].toArray.rac_sequence.signal subscribeNext:^(NSArray *multipleChoiceChapterArr) { [multipleChoiceArr addObjectsFromArray:multipleChoiceChapterArr]; } completed:^{ [subscriber sendNext:multipleChoiceArr.copy]; [subscriber sendCompleted]; }]; return [RACDisposable disposableWithBlock:^{}]; }]; return [[[RACSignal combineLatest:@[signal0, signal1, signal2, signal3] reduce:^id (NSArray *arr0, NSArray *arr1, NSArray *arr2, NSArray *arr3){ NSMutableArray *judgeArr = [NSMutableArray arrayWithArray:arr1]; NSMutableArray *choiceArr = [NSMutableArray arrayWithArray:arr2]; NSMutableArray *multipleChoiceArr = [NSMutableArray arrayWithArray:arr3]; dispatch_semaphore_t sema = dispatch_semaphore_create(0); [[arr0.rac_sequence.signal filter:^BOOL(RQYDTQuestionModel *ydtDifficultQuestionModel) { return ![judgeArr containsObject:ydtDifficultQuestionModel] && ![choiceArr containsObject:ydtDifficultQuestionModel] && ![multipleChoiceArr containsObject:ydtDifficultQuestionModel]; }].toArray.rac_sequence.signal subscribeNext:^(RQYDTQuestionModel *ydtDifficultQuestionModel) { if (ydtDifficultQuestionModel.Type == 1) { NSMutableArray *sortChapterArr = [judgeArr.rac_sequence.signal filter:^BOOL(RQYDTQuestionModel *ydtJudgeQuestionModel) { return [ydtJudgeQuestionModel.strTppe isEqualToString:ydtDifficultQuestionModel.strTppe] && ![arr0 containsObject:ydtJudgeQuestionModel]; }].toArray.mutableCopy; if (sortChapterArr.count > 0) { [judgeArr replaceObjectAtIndex:[judgeArr indexOfObject:sortChapterArr.lastObject] withObject:ydtDifficultQuestionModel]; } } else if (ydtDifficultQuestionModel.Type == 2) { NSMutableArray *sortChapterArr = [choiceArr.rac_sequence.signal filter:^BOOL(RQYDTQuestionModel *ydtChoiceQuestionModel) { return [ydtChoiceQuestionModel.strTppe isEqualToString:ydtDifficultQuestionModel.strTppe] && ![arr0 containsObject:ydtChoiceQuestionModel]; }].toArray.mutableCopy; if (sortChapterArr.count > 0) { [choiceArr replaceObjectAtIndex:[choiceArr indexOfObject:sortChapterArr.lastObject] withObject:ydtDifficultQuestionModel]; } } else { NSMutableArray *sortChapterArr = [multipleChoiceArr.rac_sequence.signal filter:^BOOL(RQYDTQuestionModel *ydtMultiChoiceQuestionModel) { return [ydtMultiChoiceQuestionModel.strTppe isEqualToString:ydtDifficultQuestionModel.strTppe] && ![arr0 containsObject:ydtMultiChoiceQuestionModel]; }].toArray.mutableCopy; if (sortChapterArr.count > 0) { [multipleChoiceArr replaceObjectAtIndex:[multipleChoiceArr indexOfObject:sortChapterArr.lastObject] withObject:ydtDifficultQuestionModel]; } } } completed:^{ /// Key: 按照排序的key; ascending: YES为升序, NO为降序。 NSSortDescriptor *strTppeSorter = [[NSSortDescriptor alloc] initWithKey:@"strTppe" ascending:YES]; // NSSortDescriptor *diff_degreeSorter = [NSSortDescriptor sortDescriptorWithKey:@"diff_degree" ascending:YES]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:strTppeSorter, nil]; [arr addObjectsFromArray:[judgeArr sortedArrayUsingDescriptors:sortDescriptors]]; [arr addObjectsFromArray:[choiceArr sortedArrayUsingDescriptors:sortDescriptors]]; [arr addObjectsFromArray:[multipleChoiceArr sortedArrayUsingDescriptors:sortDescriptors]]; dispatch_semaphore_signal(sema); }]; dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); return arr.copy; }] map:^id _Nullable(NSArray *examArr) { return examArr; }].toArray firstObject]; return arr.copy; } else { return [self queryQuestionWithQueryStr:queryStr]; } } - (NSArray *)getChapterQuestionWithChapterName:(NSString *)chapterName { NSString *queryCarTypeStr = [NSString stringWithFormat:@"gs LIKE '%%%@%%'",RQ_YDTQuestion_Module.carTypeStr]; NSString *querySubjectTypeStr = [NSString stringWithFormat:@"kemu = '%@'",RQ_YDTQuestion_Module.subjectStr]; NSString *midStr = [NSString stringWithFormat:@"AND strTppe = %ld",[self getMidWithChapterName:chapterName]]; NSString *exerciseTypeStr = [NSString stringWithFormat:@"AND ID NOT IN (SELECT ID FROM web_note INNER JOIN jsjp_user_db.test_remove ON test_remove.test_id = web_note.ID)"]; NSString *orderSqlStr = @"ID + 0 ASC"; NSString *queryStr = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ AND %@ AND cityid = 0 %@ %@ ORDER BY %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, exerciseTypeStr, midStr, orderSqlStr]; return [self queryQuestionWithQueryStr:queryStr]; } - (NSArray *)getChapter { switch (RQ_YDTQuestion_Module.subject) { case RQHomePageSubjectType_SubjectOne: return self.chapterNameSubjectOneArr; case RQHomePageSubjectType_SubjectFour: return self.chapterNameSubjectFourArr; default: return self.chapterNameSubjectOneArr; } } - (NSArray *)getPoint { NSString *queryCarTypeStr = [NSString stringWithFormat:@"gs LIKE '%%%@%%'",RQ_YDTQuestion_Module.carTypeStr]; NSString *querySubjectTypeStr = [NSString stringWithFormat:@"kemu = '%@'",RQ_YDTQuestion_Module.subjectStr]; NSString *queryStr = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ AND %@", @"Point", queryCarTypeStr, querySubjectTypeStr]; return [self queryPointWithQueryStr:queryStr]; } - (NSArray *)getPointQuestionWithPointId:(NSInteger)pointId { NSString *queryStr = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE ID IN (SELECT qid FROM point_map WHERE pid = %ld)",questionTableNameStr,pointId]; return [self queryQuestionWithQueryStr:queryStr]; } - (BOOL)isNewRuleQuestionWithQuestionId:(NSInteger)questionId { __block BOOL isNewRule = NO; if (_databaseQueue) { [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) { FMResultSet *resultSet; NSString *queryStr = [NSString stringWithFormat:@"SELECT COUNT(*) AS newRuleNum FROM t_app_question_category WHERE gs LIKE '%@' AND kemu = '%@' AND city_id = 0 AND category = 8 AND question_id = %ld",dbNameStr,RQ_YDTQuestion_Module.subjectStr, (long)questionId]; resultSet = [db executeQuery:queryStr]; while ([resultSet next]) { NSInteger newRuleNum = [resultSet intForColumn:@"newRuleNum"]; isNewRule = (newRuleNum != 0); } }]; } return isNewRule; } - (NSData *)getMediaDataWithMediaName:(NSString *)mediaName { __block NSData *data; if (_databaseQueue) { [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) { FMResultSet *resultSet; NSString *sqlStr = [NSString stringWithFormat:@"SELECT media_content FROM t_app_question_media WHERE media_name LIKE '%@'", mediaName]; resultSet = [db executeQuery:sqlStr]; while ([resultSet next]) { data = [resultSet columnIsNull:@"media_content"]? nil : [resultSet dataForColumn:@"media_content"]; } }]; } return data; } - (NSInteger)getQuestionNumWithExerciseType:(RQExerciseType)exerciseType { NSString *queryStr = [self getQuestionQueryStrWithSubject:RQHomePageSubjectType_SubjectOne exerciseType:exerciseType]; NSString *numQueryStr = [NSString stringWithFormat:@"%@ %@",@"SELECT COUNT(*) AS countNum" ,[queryStr componentsSeparatedByString:@"SELECT *"].lastObject]; __block NSInteger countNum = 0; if (_databaseQueue) { [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) { FMResultSet *resultSet = [db executeQuery:numQueryStr]; while ([resultSet next]) { countNum = [resultSet intForColumn:@"countNum"]; } }]; } return countNum; } #pragma mark - Private Method - (NSString *)getQuestionQueryStrWithSubject:(RQHomePageSubjectType)subject exerciseType:(RQExerciseType)exerciseType { /// 车型 NSString *queryCarTypeStr = [NSString stringWithFormat:@"gs LIKE '%%%@%%'",RQ_YDTQuestion_Module.carTypeStr]; /// 科目 NSString *querySubjectTypeStr = [NSString stringWithFormat:@"kemu = '%@'",[RQ_YDTQuestion_Module getSubjectNameWithSubject:subject]]; /// 默认按strTppe排序 NSString *modifyStr = RQ_USER_MANAGER.isLogin? @"AND test_remove.modify_flag = 0" : @""; NSString *orderSqlStr = @"strTppe + 0 ASC"; NSString *collectStr = @""; NSString *doStr = @""; NSString *removeStr = @""; NSString *categoryStr = @""; NSString *conditionStr = @""; switch (exerciseType) { case RQExerciseType_Sequential: case RQExerciseType_Recitation: break; case RQExerciseType_Random: orderSqlStr = @"RANDOM()"; break; case RQExerciseType_Remove: removeStr = [NSString stringWithFormat:@"INNER JOIN jsjp_user_db.test_remove ON test_remove.test_id = web_note.ID %@ AND car_type = %ld",modifyStr,RQ_YDTQuestion_Module.carType]; break; case RQExerciseType_Remove_NotUpload: removeStr = [NSString stringWithFormat:@"INNER JOIN jsjp_user_db.test_remove ON test_remove.test_id = web_note.ID AND test_remove.upload_flag = 0 %@ AND car_type = %ld",modifyStr,RQ_YDTQuestion_Module.carType]; break; case RQExerciseType_Collect: collectStr = [NSString stringWithFormat:@"INNER JOIN jsjp_user_db.test_collect ON test_collect.test_id = web_note.ID AND car_type = %ld",RQ_YDTQuestion_Module.carType]; break; case RQExerciseType_Collect_NotUpload: collectStr = [NSString stringWithFormat:@"INNER JOIN jsjp_user_db.test_collect ON test_collect.test_id = web_note.ID AND test_collect.upload_flag = 0 AND car_type = %ld",RQ_YDTQuestion_Module.carType]; break; case RQExerciseType_Wrong: doStr = [NSString stringWithFormat:@"INNER JOIN jsjp_user_db.test_do ON test_do.test_id = web_note.ID AND test_do.is_correct = 0 AND car_type = %ld",RQ_YDTQuestion_Module.carType]; break; case RQExerciseType_Wrong_NotUpload: doStr = [NSString stringWithFormat:@"INNER JOIN jsjp_user_db.test_do ON test_do.test_id = web_note.ID AND test_do.is_correct = 0 AND test_do.upload_flag = 0 AND car_type = %ld",RQ_YDTQuestion_Module.carType]; break; case RQExerciseType_Do: doStr = [NSString stringWithFormat:@"INNER JOIN jsjp_user_db.test_do ON test_do.test_id = web_note.ID AND car_type = %ld",RQ_YDTQuestion_Module.carType]; break; case RQExerciseType_UnDo: doStr = [NSString stringWithFormat:@"LEFT JOIN jsjp_user_db.test_do ON test_do.test_id = web_note.ID AND car_type = %ld",RQ_YDTQuestion_Module.carType]; conditionStr = @"AND test_do.test_id is NULL"; break; case RQExerciseType_ChooseExLib: break; case RQExerciseType_Disputed: categoryStr = @"category = 1"; break; case RQExerciseType_Mi_One: categoryStr = @"category = 3"; break; case RQExerciseType_Mi_Two: categoryStr = @"category = 4"; break; case RQExerciseType_HandPick: categoryStr = @"category = 5"; break; case RQExerciseType_NewRule: categoryStr = @"category = 8"; break; case RQExerciseType_Fallible: conditionStr = @"AND diff_degree = 5 AND error_rate >= 0.25"; break; case RQExerciseType_SingleChoice: conditionStr = @"AND Type = 2"; break; case RQExerciseType_MutableChoice: conditionStr = @"AND Type = 3"; break; case RQExerciseType_Judge: conditionStr = @"AND Type = 1"; break; case RQExerciseType_Text: conditionStr = @"AND media_url = ''"; break; case RQExerciseType_Image: conditionStr = @"AND media_url <> '' AND sinaimg <> ''"; break; case RQExerciseType_Video: conditionStr = @"AND media_url <> '' AND video_url <> ''"; break; default: break; } // NSString *selectQueryStr = isNeedMediaData? @"web_note.*, t_app_question_media.media_content" : @"*"; NSString *selectQueryStr = @"*"; NSString *whereQueryStr = [NSString stringWithFormat:@"%@ AND %@ AND cityid = 0", queryCarTypeStr, querySubjectTypeStr]; NSString *categoryWhereQueryStr = [NSString stringWithFormat:@"%@ AND %@ AND city_id = 0", queryCarTypeStr, querySubjectTypeStr]; NSString *categoryQueryStr = RQStringIsNotEmpty(categoryStr)? [NSString stringWithFormat:@"INNER JOIN ( SELECT MIN(question_id) AS question_id FROM t_app_question_category WHERE %@ AND %@ GROUP BY question_id ) AS t1 ON web_note.ID = t1.question_id ", categoryWhereQueryStr, categoryStr] : @""; NSString *exerciseTypeQueryStr = [NSString stringWithFormat:@"%@%@%@",collectStr,doStr,removeStr]; // NSString *needMediaDataStr = isNeedMediaData? @"LEFT JOIN t_app_question_media ON t_app_question_media.media_name = web_note.video_url OR t_app_question_media.media_name = web_note.sinaimg" : @""; NSString *needMediaDataStr = @""; NSString *queryStr = [NSString stringWithFormat:@"SELECT %@ FROM web_note %@ %@ %@ WHERE %@ %@ ORDER BY %@", selectQueryStr, categoryQueryStr, exerciseTypeQueryStr, needMediaDataStr, whereQueryStr, conditionStr, orderSqlStr]; return queryStr; } - (NSArray *)queryQuestionWithQueryStr:(NSString *)queryStr { NSMutableArray *arr = @[].mutableCopy; [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) { NSString *sqlStr = [NSString stringWithFormat:@"ATTACH DATABASE '%@' AS jsjp_user_db",RQ_YDT_USER_Question_Module.dbPath]; bool success = [db executeStatements:sqlStr]; if(!success) { NSLog(@"%@", db.lastErrorMessage); } FMResultSet *resultSet = [db executeQuery:queryStr]; NSInteger num = 0; while ([resultSet next]) { RQYDTQuestionModel *ydtQuestionModel = [RQYDTQuestionModel ydtQuestionModelWithFMResultSet:resultSet]; ydtQuestionModel.num = num; [arr addObject:ydtQuestionModel]; num ++; } [resultSet close]; }]; return arr.copy; } - (NSInteger)getMidWithChapterName:(NSString *)chapterName { __block NSInteger mid = 0; if (_databaseQueue) { [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) { FMResultSet *resultSet; NSString *querySubjectTypeStr = [NSString stringWithFormat:@"AND kemu = '%@'",RQ_YDTQuestion_Module.subjectStr]; NSString *chapterNameStr = [NSString stringWithFormat:@"AND Str = '%@'",chapterName]; NSString *sqlStr = [NSString stringWithFormat:@"SELECT mid FROM Chapter WHERE Fid = 0 %@ %@",querySubjectTypeStr ,chapterNameStr]; resultSet = [db executeQuery:sqlStr]; while ([resultSet next]) { mid = [resultSet longForColumn:@"mid"]; } }]; } return mid; } - (NSArray *)queryPointWithQueryStr:(NSString *)queryStr { NSMutableArray *arr = @[].mutableCopy; if (_databaseQueue) { [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) { FMResultSet *resultSet; resultSet = [db executeQuery:queryStr]; while ([resultSet next]) { RQYDTPointModel *ydtPointModel = [RQYDTPointModel ydtPointModelWithFMResultSet:resultSet]; [arr addObject:ydtPointModel]; } }]; } return arr.copy; } - (NSArray *)getExamRuleWithCarType:(RQHomePageCarType)carType subject:(RQHomePageSubjectType)subject { NSString *queryCarTypeStr = [NSString stringWithFormat:@"gs LIKE '%%%@%%'",RQ_YDTQuestion_Module.carTypeStr]; NSString *querySubjectTypeStr = [NSString stringWithFormat:@"kemu = '%@'",RQ_YDTQuestion_Module.subjectStr]; NSString *examRuleTableName = (carType == RQHomePageCarType_ZGZ_HY)? @"t_app_exam_rule_huoyun" : @"t_app_exam_rule"; NSString *queryStr = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ AND %@ AND areacode = 0 ", examRuleTableName, queryCarTypeStr, querySubjectTypeStr]; return [self queryExamRuleWithQueryStr:queryStr]; } - (NSArray *)queryExamRuleWithQueryStr:(NSString *)queryStr { NSMutableArray *arr = @[].mutableCopy; if (_databaseQueue) { [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) { FMResultSet *resultSet; resultSet = [db executeQuery:queryStr]; while ([resultSet next]) { RQYDTExamRuleModel *ydtExamRuleModel = [RQYDTExamRuleModel ydtExamRuleModelWithFMResultSet:resultSet]; [arr addObject:ydtExamRuleModel]; } }]; } return arr.copy; } #pragma mark - LazyLoad - (NSArray *)chapterNameSubjectOneArr { return @[@"职业道德与服务规范", @"安全运营与治安防范", @"汽车使用与常见故障处理", @"节能驾驶", @"运价知识与计价器使用", @"道路交通事故处理与应急救护", @"租车汽车政策、法规、标准", @"出租车服务质量信誉考核", @"网约车全国公共科目",]; } - (NSArray *)chapterNameSubjectFourArr { return @[]; } - (RQHomePageCarType)carType { return RQHomePageCarType_ZGZ_WYC; } @end