RQYDTZGZHYQuestionModule.m 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538
  1. //
  2. // RQYDTZGZHYQuestionModule.m
  3. // jiaPei
  4. //
  5. // Created by 张嵘 on 2022/4/7.
  6. // Copyright © 2022 JCZ. All rights reserved.
  7. //
  8. #import "RQYDTZGZHYQuestionModule.h"
  9. static NSString *dbNameStr = @"zgzhy";
  10. static NSString *dbTypeStr = @"db";
  11. static NSString *questionTableNameStr = @"web_note";
  12. @interface RQYDTZGZHYQuestionModule ()
  13. @property (nonatomic, readwrite, strong) FMDatabaseQueue *databaseQueue;
  14. @property (nonatomic, readwrite, copy) NSArray *chapterNameSubjectOneArr;
  15. @property (nonatomic, readwrite, copy) NSArray *chapterNameSubjectFourArr;
  16. @property (nonatomic, readwrite, assign) RQHomePageCarType carType;
  17. @end
  18. @implementation RQYDTZGZHYQuestionModule
  19. static id rq_ydtZgzHyQuestionModule = nil;
  20. #pragma mark - init
  21. + (instancetype)sharedInstance {
  22. static dispatch_once_t onceToken;
  23. dispatch_once(&onceToken, ^{
  24. rq_ydtZgzHyQuestionModule = [[self alloc] init];
  25. });
  26. return rq_ydtZgzHyQuestionModule;
  27. }
  28. - (instancetype)init {
  29. if (self = [super init]) {
  30. NSString *resourcePath = [[NSBundle mainBundle] pathForResource:dbNameStr ofType:dbTypeStr];
  31. [self initDatabaseQueueWithResourcePath:resourcePath];
  32. }
  33. return self;
  34. }
  35. #pragma mark - PublicMethods
  36. - (void)initDatabaseQueueWithResourcePath:(NSString *)resourcePath {
  37. NSError *error;
  38. NSString *dbPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@",dbNameStr,dbTypeStr]];
  39. if ([RQFileManager isPathExist:dbPath]) {
  40. self.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:dbPath];
  41. NSLog(@"数据库path-----%@",dbPath);
  42. if ([self getQuestionVersion] >= [self getQuestionVersionWithResourcePath:resourcePath]) {
  43. } else {
  44. [[RQFileManager fileManager] removeItemAtPath:dbPath error:&error];
  45. [[RQFileManager fileManager] copyItemAtPath:resourcePath toPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@",dbNameStr,dbTypeStr]] error:&error];
  46. self.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:dbPath];
  47. }
  48. } else {
  49. [[RQFileManager fileManager] copyItemAtPath:resourcePath toPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@",dbNameStr,dbTypeStr]] error:&error];
  50. self.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:dbPath];
  51. NSLog(@"数据库path-----%@",dbPath);
  52. }
  53. }
  54. - (NSInteger)getQuestionVersion {
  55. __block NSInteger version = 0;
  56. if (_databaseQueue) {
  57. [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
  58. FMResultSet *resultSet;
  59. resultSet = [db executeQuery:@"SELECT version FROM t_version"];
  60. while ([resultSet next]) {
  61. version = [resultSet longForColumn:@"version"];
  62. }
  63. }];
  64. }
  65. return version;
  66. }
  67. - (NSInteger)getQuestionVersionWithResourcePath:(NSString *)resourcePath {
  68. __block NSInteger version = 0;
  69. [[FMDatabaseQueue databaseQueueWithPath:resourcePath] inDatabase:^(FMDatabase * _Nonnull db) {
  70. FMResultSet *resultSet;
  71. resultSet = [db executeQuery:@"SELECT version FROM t_version"];
  72. while ([resultSet next]) {
  73. version = [resultSet longForColumn:@"version"];
  74. }
  75. }];
  76. return version;
  77. }
  78. - (NSArray *)getQuestionWithSubject:(RQHomePageSubjectType)subject exerciseType:(RQExerciseType)exerciseType {
  79. return [self getQuestionWithSubject:subject exerciseType:exerciseType isNeedMediaData:NO];
  80. }
  81. - (NSArray *)getQuestionWithSubject:(RQHomePageSubjectType)subject exerciseType:(RQExerciseType)exerciseType isNeedMediaData:(BOOL)isNeedMediaData {
  82. @weakify(self)
  83. NSMutableArray *arr = @[].mutableCopy;
  84. NSString *queryStr = [self getQuestionQueryStrWithSubject:subject exerciseType:exerciseType];
  85. if (exerciseType == RQExerciseType_Exam) {
  86. /// 车型
  87. NSString *queryCarTypeStr = [NSString stringWithFormat:@"gs LIKE '%%%@%%'",RQ_YDTQuestion_Module.carTypeStr];
  88. /// 科目
  89. NSString *querySubjectTypeStr = [NSString stringWithFormat:@"kemu = '%@'",[RQ_YDTQuestion_Module getSubjectNameWithSubject:subject]];
  90. RACSignal *signal0 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
  91. NSMutableArray *difficultArr = @[].mutableCopy;
  92. [[[self getExamRuleWithCarType:self.carType subject:subject].rac_sequence.signal map:^id _Nullable(RQYDTExamRuleModel *ydtExamRuleModel) {
  93. NSString *chapterIdStr = [NSString stringWithFormat:@"strTppe = %ld",(long)ydtExamRuleModel.chapter_id];
  94. NSString *typeStr = [NSString stringWithFormat:@"Type IN %@",(RQ_YDTQuestion_Module.subject == RQHomePageSubjectType_SubjectOne)? @"(1, 2)" : @"(1, 2, 3)"];
  95. NSString *randomStr = [NSString stringWithFormat:@"RANDOM() LIMIT %@",[NSString qmui_stringWithNSInteger:ydtExamRuleModel.difficult_count]];
  96. 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];
  97. return difficultQueryStr;
  98. }].toArray.rac_sequence.signal subscribeNext:^(NSString *difficultQueryStr) {
  99. @strongify(self)
  100. [difficultArr addObjectsFromArray:[self queryQuestionWithQueryStr:difficultQueryStr]];
  101. } completed:^{
  102. [subscriber sendNext:difficultArr.copy];
  103. [subscriber sendCompleted];
  104. }];
  105. return [RACDisposable disposableWithBlock:^{}];
  106. }];
  107. RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
  108. NSMutableArray *judgeArr = @[].mutableCopy;
  109. [[[self getExamRuleWithCarType:self.carType subject:subject].rac_sequence.signal map:^id _Nullable(RQYDTExamRuleModel *ydtExamRuleModel) {
  110. @strongify(self)
  111. NSString *chapterIdStr = [NSString stringWithFormat:@"AND strTppe = %ld",(long)ydtExamRuleModel.chapter_id];
  112. NSString *judgeCountStr = [NSString stringWithFormat:@"RANDOM() LIMIT %ld",(long)ydtExamRuleModel.judge_count];
  113. 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];
  114. NSMutableArray *judgeChapterArr = [self queryQuestionWithQueryStr:judgeQueryStr].mutableCopy;
  115. if (judgeChapterArr.count < ydtExamRuleModel.judge_count) {
  116. 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)]];
  117. NSArray *judgeChapterAddArr = [self queryQuestionWithQueryStr:judgeQueryAddStr];
  118. [judgeChapterArr addObjectsFromArray:judgeChapterAddArr];
  119. return judgeChapterArr.copy;
  120. } else {
  121. return judgeChapterArr.copy;
  122. }
  123. }].toArray.rac_sequence.signal subscribeNext:^(NSArray *judgeChapterArr) {
  124. [judgeArr addObjectsFromArray:judgeChapterArr];
  125. } completed:^{
  126. [subscriber sendNext:judgeArr.copy];
  127. [subscriber sendCompleted];
  128. }];
  129. return [RACDisposable disposableWithBlock:^{}];
  130. }];
  131. RACSignal *signal2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
  132. NSMutableArray *choiceArr = @[].mutableCopy;
  133. [[[self getExamRuleWithCarType:self.carType subject:subject].rac_sequence.signal map:^id _Nullable(RQYDTExamRuleModel *ydtExamRuleModel) {
  134. @strongify(self)
  135. NSString *chapterIdStr = [NSString stringWithFormat:@"AND strTppe = %ld",(long)ydtExamRuleModel.chapter_id];
  136. NSString *choiceCountStr = [NSString stringWithFormat:@"RANDOM() LIMIT %ld",(long)ydtExamRuleModel.choice_count];
  137. 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];
  138. NSMutableArray *choiceChapterArr = [self queryQuestionWithQueryStr:choiceQueryStr].mutableCopy;
  139. if (choiceChapterArr.count < ydtExamRuleModel.choice_count) {
  140. 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)]];
  141. NSArray *choiceChapterAddArr = [self queryQuestionWithQueryStr:choiceQueryAddStr];
  142. [choiceChapterArr addObjectsFromArray:choiceChapterAddArr];
  143. return choiceChapterArr.copy;
  144. } else {
  145. return choiceChapterArr.copy;
  146. }
  147. }].toArray.rac_sequence.signal subscribeNext:^(NSArray *choiceChapterArr) {
  148. [choiceArr addObjectsFromArray:choiceChapterArr];
  149. } completed:^{
  150. [subscriber sendNext:choiceArr.copy];
  151. [subscriber sendCompleted];
  152. }];
  153. return [RACDisposable disposableWithBlock:^{}];
  154. }];
  155. RACSignal *signal3 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
  156. NSMutableArray *multipleChoiceArr = @[].mutableCopy;
  157. [[[self getExamRuleWithCarType:self.carType subject:subject].rac_sequence.signal map:^id _Nullable(RQYDTExamRuleModel *ydtExamRuleModel) {
  158. @strongify(self)
  159. NSString *chapterIdStr = [NSString stringWithFormat:@"AND strTppe = %ld",(long)ydtExamRuleModel.chapter_id];
  160. NSString *multipleChoiceCountStr = [NSString stringWithFormat:@"RANDOM() LIMIT %ld",(long)ydtExamRuleModel.multiple_choice_count];
  161. 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];
  162. NSMutableArray *multipleChoiceChapterArr = [self queryQuestionWithQueryStr:multipleChoiceQueryStr].mutableCopy;
  163. if (multipleChoiceChapterArr.count < ydtExamRuleModel.multiple_choice_count) {
  164. 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)]];
  165. NSArray *multipleChoiceChapterAddArr = [self queryQuestionWithQueryStr:multipleChoiceQueryAddStr];
  166. [multipleChoiceChapterArr addObjectsFromArray:multipleChoiceChapterAddArr];
  167. return multipleChoiceChapterArr.copy;
  168. } else {
  169. return multipleChoiceChapterArr.copy;
  170. }
  171. }].toArray.rac_sequence.signal subscribeNext:^(NSArray *multipleChoiceChapterArr) {
  172. [multipleChoiceArr addObjectsFromArray:multipleChoiceChapterArr];
  173. } completed:^{
  174. [subscriber sendNext:multipleChoiceArr.copy];
  175. [subscriber sendCompleted];
  176. }];
  177. return [RACDisposable disposableWithBlock:^{}];
  178. }];
  179. return [[[RACSignal combineLatest:@[signal0, signal1, signal2, signal3] reduce:^id (NSArray *arr0, NSArray *arr1, NSArray *arr2, NSArray *arr3){
  180. NSMutableArray *judgeArr = [NSMutableArray arrayWithArray:arr1];
  181. NSMutableArray *choiceArr = [NSMutableArray arrayWithArray:arr2];
  182. NSMutableArray *multipleChoiceArr = [NSMutableArray arrayWithArray:arr3];
  183. dispatch_semaphore_t sema = dispatch_semaphore_create(0);
  184. [[arr0.rac_sequence.signal filter:^BOOL(RQYDTQuestionModel *ydtDifficultQuestionModel) {
  185. return ![judgeArr containsObject:ydtDifficultQuestionModel] && ![choiceArr containsObject:ydtDifficultQuestionModel] && ![multipleChoiceArr containsObject:ydtDifficultQuestionModel];
  186. }].toArray.rac_sequence.signal subscribeNext:^(RQYDTQuestionModel *ydtDifficultQuestionModel) {
  187. if (ydtDifficultQuestionModel.Type == 1) {
  188. NSMutableArray *sortChapterArr = [judgeArr.rac_sequence.signal filter:^BOOL(RQYDTQuestionModel *ydtJudgeQuestionModel) {
  189. return [ydtJudgeQuestionModel.strTppe isEqualToString:ydtDifficultQuestionModel.strTppe] && ![arr0 containsObject:ydtJudgeQuestionModel];
  190. }].toArray.mutableCopy;
  191. if (sortChapterArr.count > 0) {
  192. [judgeArr replaceObjectAtIndex:[judgeArr indexOfObject:sortChapterArr.lastObject] withObject:ydtDifficultQuestionModel];
  193. }
  194. } else if (ydtDifficultQuestionModel.Type == 2) {
  195. NSMutableArray *sortChapterArr = [choiceArr.rac_sequence.signal filter:^BOOL(RQYDTQuestionModel *ydtChoiceQuestionModel) {
  196. return [ydtChoiceQuestionModel.strTppe isEqualToString:ydtDifficultQuestionModel.strTppe] && ![arr0 containsObject:ydtChoiceQuestionModel];
  197. }].toArray.mutableCopy;
  198. if (sortChapterArr.count > 0) {
  199. [choiceArr replaceObjectAtIndex:[choiceArr indexOfObject:sortChapterArr.lastObject] withObject:ydtDifficultQuestionModel];
  200. }
  201. } else {
  202. NSMutableArray *sortChapterArr = [multipleChoiceArr.rac_sequence.signal filter:^BOOL(RQYDTQuestionModel *ydtMultiChoiceQuestionModel) {
  203. return [ydtMultiChoiceQuestionModel.strTppe isEqualToString:ydtDifficultQuestionModel.strTppe] && ![arr0 containsObject:ydtMultiChoiceQuestionModel];
  204. }].toArray.mutableCopy;
  205. if (sortChapterArr.count > 0) {
  206. [multipleChoiceArr replaceObjectAtIndex:[multipleChoiceArr indexOfObject:sortChapterArr.lastObject] withObject:ydtDifficultQuestionModel];
  207. }
  208. }
  209. } completed:^{
  210. /// Key: 按照排序的key; ascending: YES为升序, NO为降序。
  211. NSSortDescriptor *strTppeSorter = [[NSSortDescriptor alloc] initWithKey:@"strTppe" ascending:YES];
  212. // NSSortDescriptor *diff_degreeSorter = [NSSortDescriptor sortDescriptorWithKey:@"diff_degree" ascending:YES];
  213. NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:strTppeSorter, nil];
  214. [arr addObjectsFromArray:[judgeArr sortedArrayUsingDescriptors:sortDescriptors]];
  215. [arr addObjectsFromArray:[choiceArr sortedArrayUsingDescriptors:sortDescriptors]];
  216. [arr addObjectsFromArray:[multipleChoiceArr sortedArrayUsingDescriptors:sortDescriptors]];
  217. dispatch_semaphore_signal(sema);
  218. }];
  219. dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
  220. return arr.copy;
  221. }] map:^id _Nullable(NSArray *examArr) {
  222. return examArr;
  223. }].toArray firstObject];
  224. return arr.copy;
  225. } else {
  226. return [self queryQuestionWithQueryStr:queryStr];
  227. }
  228. }
  229. - (NSArray *)getChapterQuestionWithChapterName:(NSString *)chapterName {
  230. NSString *queryCarTypeStr = [NSString stringWithFormat:@"gs LIKE '%%%@%%'",RQ_YDTQuestion_Module.carTypeStr];
  231. NSString *querySubjectTypeStr = [NSString stringWithFormat:@"kemu = '%@'",RQ_YDTQuestion_Module.subjectStr];
  232. NSString *midStr = [NSString stringWithFormat:@"AND strTppe = %ld",[self getMidWithChapterName:chapterName]];
  233. 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)"];
  234. NSString *orderSqlStr = @"ID + 0 ASC";
  235. NSString *queryStr = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ AND %@ AND cityid = 0 %@ %@ ORDER BY %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, exerciseTypeStr, midStr, orderSqlStr];
  236. return [self queryQuestionWithQueryStr:queryStr];
  237. }
  238. - (NSArray *)getChapter {
  239. switch (RQ_YDTQuestion_Module.subject) {
  240. case RQHomePageSubjectType_SubjectOne:
  241. return self.chapterNameSubjectOneArr;
  242. case RQHomePageSubjectType_SubjectFour:
  243. return self.chapterNameSubjectFourArr;
  244. default:
  245. return self.chapterNameSubjectOneArr;
  246. }
  247. }
  248. - (NSArray *)getPoint {
  249. NSString *queryCarTypeStr = [NSString stringWithFormat:@"gs LIKE '%%%@%%'",RQ_YDTQuestion_Module.carTypeStr];
  250. NSString *querySubjectTypeStr = [NSString stringWithFormat:@"kemu = '%@'",RQ_YDTQuestion_Module.subjectStr];
  251. NSString *queryStr = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ AND %@", @"Point", queryCarTypeStr, querySubjectTypeStr];
  252. return [self queryPointWithQueryStr:queryStr];
  253. }
  254. - (NSArray *)getPointQuestionWithPointId:(NSInteger)pointId {
  255. NSString *queryStr = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE ID IN (SELECT qid FROM point_map WHERE pid = %ld)",questionTableNameStr,pointId];
  256. return [self queryQuestionWithQueryStr:queryStr];
  257. }
  258. - (BOOL)isNewRuleQuestionWithQuestionId:(NSInteger)questionId {
  259. __block BOOL isNewRule = NO;
  260. if (_databaseQueue) {
  261. [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
  262. FMResultSet *resultSet;
  263. 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];
  264. resultSet = [db executeQuery:queryStr];
  265. while ([resultSet next]) {
  266. NSInteger newRuleNum = [resultSet intForColumn:@"newRuleNum"];
  267. isNewRule = (newRuleNum != 0);
  268. }
  269. }];
  270. }
  271. return isNewRule;
  272. }
  273. - (NSData *)getMediaDataWithMediaName:(NSString *)mediaName {
  274. __block NSData *data;
  275. if (_databaseQueue) {
  276. [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
  277. FMResultSet *resultSet;
  278. NSString *sqlStr = [NSString stringWithFormat:@"SELECT media_content FROM t_app_question_media WHERE media_name LIKE '%@'", mediaName];
  279. resultSet = [db executeQuery:sqlStr];
  280. while ([resultSet next]) {
  281. data = [resultSet columnIsNull:@"media_content"]? nil : [resultSet dataForColumn:@"media_content"];
  282. }
  283. }];
  284. }
  285. return data;
  286. }
  287. - (NSInteger)getQuestionNumWithExerciseType:(RQExerciseType)exerciseType {
  288. NSString *queryStr = [self getQuestionQueryStrWithSubject:RQHomePageSubjectType_SubjectOne exerciseType:exerciseType];
  289. NSString *numQueryStr = [NSString stringWithFormat:@"%@ %@",@"SELECT COUNT(*) AS countNum" ,[queryStr componentsSeparatedByString:@"SELECT *"].lastObject];
  290. __block NSInteger countNum = 0;
  291. if (_databaseQueue) {
  292. [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
  293. FMResultSet *resultSet = [db executeQuery:numQueryStr];
  294. while ([resultSet next]) {
  295. countNum = [resultSet intForColumn:@"countNum"];
  296. }
  297. }];
  298. }
  299. return countNum;
  300. }
  301. #pragma mark - Private Method
  302. - (NSString *)getQuestionQueryStrWithSubject:(RQHomePageSubjectType)subject exerciseType:(RQExerciseType)exerciseType {
  303. /// 车型
  304. NSString *queryCarTypeStr = [NSString stringWithFormat:@"gs LIKE '%%%@%%'",RQ_YDTQuestion_Module.carTypeStr];
  305. /// 科目
  306. NSString *querySubjectTypeStr = [NSString stringWithFormat:@"kemu = '%@'",[RQ_YDTQuestion_Module getSubjectNameWithSubject:subject]];
  307. /// 默认按strTppe排序
  308. NSString *modifyStr = RQ_USER_MANAGER.isLogin? @"AND test_remove.modify_flag = 0" : @"";
  309. NSString *orderSqlStr = @"strTppe + 0 ASC";
  310. NSString *collectStr = @"";
  311. NSString *doStr = @"";
  312. NSString *removeStr = @"";
  313. NSString *categoryStr = @"";
  314. NSString *conditionStr = @"";
  315. switch (exerciseType) {
  316. case RQExerciseType_Sequential:
  317. case RQExerciseType_Recitation:
  318. break;
  319. case RQExerciseType_Random:
  320. orderSqlStr = @"RANDOM()";
  321. break;
  322. case RQExerciseType_Remove:
  323. 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];
  324. break;
  325. case RQExerciseType_Remove_NotUpload:
  326. 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];
  327. break;
  328. case RQExerciseType_Collect:
  329. 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];
  330. break;
  331. case RQExerciseType_Collect_NotUpload:
  332. 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];
  333. break;
  334. case RQExerciseType_Wrong:
  335. 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];
  336. break;
  337. case RQExerciseType_Wrong_NotUpload:
  338. 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];
  339. break;
  340. case RQExerciseType_Do:
  341. 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];
  342. break;
  343. case RQExerciseType_UnDo:
  344. 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];
  345. conditionStr = @"AND test_do.test_id is NULL";
  346. break;
  347. case RQExerciseType_ChooseExLib:
  348. break;
  349. case RQExerciseType_Disputed:
  350. categoryStr = @"category = 1";
  351. break;
  352. case RQExerciseType_Mi_One:
  353. categoryStr = @"category = 3";
  354. break;
  355. case RQExerciseType_Mi_Two:
  356. categoryStr = @"category = 4";
  357. break;
  358. case RQExerciseType_HandPick:
  359. categoryStr = @"category = 5";
  360. break;
  361. case RQExerciseType_NewRule:
  362. categoryStr = @"category = 8";
  363. break;
  364. case RQExerciseType_Fallible:
  365. conditionStr = @"AND diff_degree = 5 AND error_rate >= 0.25";
  366. break;
  367. case RQExerciseType_SingleChoice:
  368. conditionStr = @"AND Type = 2";
  369. break;
  370. case RQExerciseType_MutableChoice:
  371. conditionStr = @"AND Type = 3";
  372. break;
  373. case RQExerciseType_Judge:
  374. conditionStr = @"AND Type = 1";
  375. break;
  376. case RQExerciseType_Text:
  377. conditionStr = @"AND media_url = ''";
  378. break;
  379. case RQExerciseType_Image:
  380. conditionStr = @"AND media_url <> '' AND sinaimg <> ''";
  381. break;
  382. case RQExerciseType_Video:
  383. conditionStr = @"AND media_url <> '' AND video_url <> ''";
  384. break;
  385. default:
  386. break;
  387. }
  388. // NSString *selectQueryStr = isNeedMediaData? @"web_note.*, t_app_question_media.media_content" : @"*";
  389. NSString *selectQueryStr = @"*";
  390. NSString *whereQueryStr = [NSString stringWithFormat:@"%@ AND %@ AND cityid = 0", queryCarTypeStr, querySubjectTypeStr];
  391. NSString *categoryWhereQueryStr = [NSString stringWithFormat:@"%@ AND %@ AND city_id = 0", queryCarTypeStr, querySubjectTypeStr];
  392. 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] : @"";
  393. NSString *exerciseTypeQueryStr = [NSString stringWithFormat:@"%@%@%@",collectStr,doStr,removeStr];
  394. // 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" : @"";
  395. NSString *needMediaDataStr = @"";
  396. NSString *queryStr = [NSString stringWithFormat:@"SELECT %@ FROM web_note %@ %@ %@ WHERE %@ %@ ORDER BY %@", selectQueryStr, categoryQueryStr, exerciseTypeQueryStr, needMediaDataStr, whereQueryStr, conditionStr, orderSqlStr];
  397. return queryStr;
  398. }
  399. - (NSArray *)queryQuestionWithQueryStr:(NSString *)queryStr {
  400. NSMutableArray *arr = @[].mutableCopy;
  401. [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
  402. NSString *sqlStr = [NSString stringWithFormat:@"ATTACH DATABASE '%@' AS jsjp_user_db",RQ_YDT_USER_Question_Module.dbPath];
  403. bool success = [db executeStatements:sqlStr];
  404. if(!success) {
  405. NSLog(@"%@", db.lastErrorMessage);
  406. }
  407. FMResultSet *resultSet = [db executeQuery:queryStr];
  408. NSInteger num = 0;
  409. while ([resultSet next]) {
  410. RQYDTQuestionModel *ydtQuestionModel = [RQYDTQuestionModel ydtQuestionModelWithFMResultSet:resultSet];
  411. ydtQuestionModel.num = num;
  412. [arr addObject:ydtQuestionModel];
  413. num ++;
  414. }
  415. [resultSet close];
  416. }];
  417. return arr.copy;
  418. }
  419. - (NSInteger)getMidWithChapterName:(NSString *)chapterName {
  420. __block NSInteger mid = 0;
  421. if (_databaseQueue) {
  422. [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
  423. FMResultSet *resultSet;
  424. NSString *querySubjectTypeStr = [NSString stringWithFormat:@"AND kemu = '%@'",RQ_YDTQuestion_Module.subjectStr];
  425. NSString *chapterNameStr = [NSString stringWithFormat:@"AND Str = '%@'",chapterName];
  426. NSString *sqlStr = [NSString stringWithFormat:@"SELECT mid FROM Chapter WHERE Fid = 0 %@ %@",querySubjectTypeStr ,chapterNameStr];
  427. resultSet = [db executeQuery:sqlStr];
  428. while ([resultSet next]) {
  429. mid = [resultSet longForColumn:@"mid"];
  430. }
  431. }];
  432. }
  433. return mid;
  434. }
  435. - (NSArray *)queryPointWithQueryStr:(NSString *)queryStr {
  436. NSMutableArray *arr = @[].mutableCopy;
  437. if (_databaseQueue) {
  438. [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
  439. FMResultSet *resultSet;
  440. resultSet = [db executeQuery:queryStr];
  441. while ([resultSet next]) {
  442. RQYDTPointModel *ydtPointModel = [RQYDTPointModel ydtPointModelWithFMResultSet:resultSet];
  443. [arr addObject:ydtPointModel];
  444. }
  445. }];
  446. }
  447. return arr.copy;
  448. }
  449. - (NSArray *)getExamRuleWithCarType:(RQHomePageCarType)carType subject:(RQHomePageSubjectType)subject {
  450. NSString *queryCarTypeStr = [NSString stringWithFormat:@"gs LIKE '%%%@%%'",RQ_YDTQuestion_Module.carTypeStr];
  451. NSString *querySubjectTypeStr = [NSString stringWithFormat:@"kemu = '%@'",RQ_YDTQuestion_Module.subjectStr];
  452. NSString *examRuleTableName = (carType == RQHomePageCarType_ZGZ_HY)? @"t_app_exam_rule_huoyun" : @"t_app_exam_rule";
  453. NSString *queryStr = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ AND %@ AND areacode = 0 ", examRuleTableName, queryCarTypeStr, querySubjectTypeStr];
  454. return [self queryExamRuleWithQueryStr:queryStr];
  455. }
  456. - (NSArray *)queryExamRuleWithQueryStr:(NSString *)queryStr {
  457. NSMutableArray *arr = @[].mutableCopy;
  458. if (_databaseQueue) {
  459. [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
  460. FMResultSet *resultSet;
  461. resultSet = [db executeQuery:queryStr];
  462. while ([resultSet next]) {
  463. RQYDTExamRuleModel *ydtExamRuleModel = [RQYDTExamRuleModel ydtExamRuleModelWithFMResultSet:resultSet];
  464. [arr addObject:ydtExamRuleModel];
  465. }
  466. }];
  467. }
  468. return arr.copy;
  469. }
  470. #pragma mark - LazyLoad
  471. - (NSArray *)chapterNameSubjectOneArr {
  472. return @[@"驾驶员的职业道德、职业心理与职业健康",
  473. @"道路货物运输从业相关法律法规",
  474. @"道路货物运输相关标准",
  475. @"道路货物运输专业知识",
  476. @"汽车使用技术",
  477. @"道路货物运输安全、应急处置",
  478. @"货运情景试题",];
  479. }
  480. - (NSArray *)chapterNameSubjectFourArr {
  481. return @[];
  482. }
  483. - (RQHomePageCarType)carType {
  484. return RQHomePageCarType_ZGZ_HY;
  485. }
  486. @end