TodoTaskViewController.swift 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536
  1. //
  2. // TodoTaskViewController.swift
  3. // O2Platform
  4. //
  5. // Created by 刘振兴 on 16/8/1.
  6. // Copyright © 2016年 zoneland. All rights reserved.
  7. //
  8. import UIKit
  9. import Alamofire
  10. import AlamofireImage
  11. import AlamofireObjectMapper
  12. import SwiftyJSON
  13. import ObjectMapper
  14. import CocoaLumberjack
  15. struct TaskURLGenenater {
  16. var url:String
  17. var pageModel:CommonPageModel
  18. func pagingURL() -> String {
  19. var tUrl = self.url
  20. tUrl = AppDelegate.o2Collect.setRequestParameter(tUrl, requestParameter:self.pageModel.toDictionary() as [String : AnyObject]?)!
  21. return tUrl.addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed)!
  22. }
  23. // mutating func nextPage(_ pageModel:CommonPageModel?) -> String {
  24. // if let pModel = pageModel {
  25. // self.pageModel = pModel
  26. // }
  27. // var tUrl = self.url
  28. // tUrl = AppDelegate.o2Collect.setRequestParameter(tUrl, requestParameter:self.pageModel.toDictionary() as [String : AnyObject]?)!
  29. // return tUrl.addingPercentEscapes(using: String.Encoding.utf8)!
  30. // }
  31. }
  32. class TodoTaskViewController: UITableViewController {
  33. var segmentedControl:SegmentedControl!
  34. var currentTaskURLGenenater:TaskURLGenenater!
  35. var models:[TodoCellModel<TodoTask>] = []
  36. var filterModels:[TodoCellModel<TodoTask>] = []
  37. var emptyTexts:[String] = ["没有要处理的待办","没有要处理的待阅","没有已办数据","没有已阅数据"]
  38. var urls:[Int:TaskURLGenenater] {
  39. let todoTaskURL = AppDelegate.o2Collect.generateURLWithAppContextKey(TaskContext.taskContextKey, query: TaskContext.todoTaskListQuery, parameter: nil,coverted: false)
  40. let todoedTaskURL = AppDelegate.o2Collect.generateURLWithAppContextKey(TaskedContext.taskedContextKey, query: TaskedContext.taskedListByPageSizeQuery, parameter: nil,coverted: false)
  41. let readTaskURL = AppDelegate.o2Collect.generateURLWithAppContextKey(ReadContext.readContextKey, query: ReadContext.readListByPageSizeQuery, parameter: nil,coverted: false)
  42. let readedTaskURL = AppDelegate.o2Collect.generateURLWithAppContextKey(ReadedContext.readedContextKey, query: ReadedContext.readedListByPageSizeQuery, parameter: nil,coverted: false)
  43. return [0: TaskURLGenenater(url: todoTaskURL!,pageModel: CommonPageModel()),2: TaskURLGenenater(url: todoedTaskURL!,pageModel: CommonPageModel()),1 : TaskURLGenenater(url: readTaskURL!,pageModel: CommonPageModel()),3: TaskURLGenenater(url: readedTaskURL!,pageModel: CommonPageModel())]
  44. }
  45. //添加搜索功能
  46. var fileterUrls:[Int:TaskURLGenenater] {
  47. let todoTaskURL = AppDelegate.o2Collect.generateURLWithAppContextKey(TaskContext.taskContextKey, query: TaskContext.todoTaskListFilterQuery, parameter: nil,coverted: false)
  48. let todoedTaskURL = AppDelegate.o2Collect.generateURLWithAppContextKey(TaskedContext.taskedContextKey, query: TaskedContext.taskedListByPageSizeFilterQuery, parameter: nil,coverted: false)
  49. let readTaskURL = AppDelegate.o2Collect.generateURLWithAppContextKey(ReadContext.readContextKey, query: ReadContext.readListByPageSizeFilterQuery, parameter: nil,coverted: false)
  50. let readedTaskURL = AppDelegate.o2Collect.generateURLWithAppContextKey(ReadedContext.readedContextKey, query: ReadedContext.readedListByPageSizeFilterQuery, parameter: nil,coverted: false)
  51. return [0: TaskURLGenenater(url: todoTaskURL!,pageModel: CommonPageModel()),2: TaskURLGenenater(url: todoedTaskURL!,pageModel: CommonPageModel()),1 : TaskURLGenenater(url: readTaskURL!,pageModel: CommonPageModel()),3: TaskURLGenenater(url: readedTaskURL!,pageModel: CommonPageModel())]
  52. }
  53. //容器视图
  54. var searchBarContainerView = UIView()
  55. //搜索文本
  56. var searchText = ""
  57. //搜索控件
  58. var searchController:UISearchController = UISearchController(searchResultsController: nil)
  59. override func viewWillAppear(_ animated: Bool) {
  60. super.viewWillAppear(animated)
  61. self.title = ""
  62. }
  63. override func viewWillDisappear(_ animated: Bool) {
  64. super.viewWillDisappear(animated)
  65. if self.searchController.isActive {
  66. self.searchController.isActive = false
  67. }
  68. self.searchController.searchBar.removeFromSuperview()
  69. }
  70. override func viewDidLoad() {
  71. super.viewDidLoad()
  72. self.initSegmentedControl()
  73. let taskIndex = AppConfigSettings.shared.taskIndex
  74. self.currentTaskURLGenenater = self.urls[taskIndex]
  75. // //添加搜索功能
  76. // self.searchController.searchResultsUpdater = self
  77. // self.searchController.delegate = self
  78. // self.searchController.dimsBackgroundDuringPresentation = false
  79. // self.searchController.hidesNavigationBarDuringPresentation = false
  80. // definesPresentationContext = true
  81. // self.searchController.searchBar.sizeToFit()
  82. // self.searchController.searchBar.backgroundColor = RGB(251, g: 71, b: 71)
  83. // self.tableView.tableHeaderView = self.searchController.searchBar
  84. //
  85. // //设置搜索框是否显示
  86. // self.setSearchBarIsShow()
  87. //分页刷新功能
  88. self.tableView.mj_header = MJRefreshNormalHeader(refreshingBlock: {
  89. self.headerLoadData()
  90. })
  91. self.tableView.mj_footer = MJRefreshAutoFooter(refreshingBlock: {
  92. self.footerLoadData()
  93. })
  94. self.headerLoadData()
  95. //self.tableView.mj_header.beginRefreshing()
  96. //self.loadDataByURL(genernater!.nextPage(nil))
  97. }
  98. //隐藏搜索框
  99. func setSearchBarIsShow(){
  100. // if taskIndex == 0 {
  101. // self.searchController.searchBar.isHidden = true
  102. // }else{
  103. // self.searchController.searchBar.isHidden = false
  104. // }
  105. }
  106. func headerLoadData(){
  107. let taskIndex = AppConfigSettings.shared.taskIndex
  108. if !self.searchController.isActive {
  109. self.currentTaskURLGenenater = self.urls[taskIndex]
  110. self.currentTaskURLGenenater.pageModel = CommonPageModel()
  111. self.loadFirstDataByURL()
  112. }else{
  113. self.currentTaskURLGenenater = self.fileterUrls[taskIndex]
  114. self.currentTaskURLGenenater.pageModel = CommonPageModel()
  115. self.loadFilterFirstDataByURL()
  116. }
  117. //self.loadDataByURL(genernater!.nextPage(nil))
  118. }
  119. func footerLoadData(){
  120. var genernater = self.currentTaskURLGenenater
  121. if !(genernater?.pageModel.isLast())! {
  122. genernater?.pageModel.nextPage()
  123. if !self.searchController.isActive {
  124. self.loadDataNextByURL()
  125. }else{
  126. self.loadFilterNexdataByURL()
  127. }
  128. }else{
  129. DispatchQueue.main.async {
  130. self.showSuccess(title: "已到最后一页,没有更多的数据了")
  131. }
  132. }
  133. }
  134. func loadFilterFirstDataByURL(){
  135. let tv = self.tableView as! ZLBaseTableView
  136. tv.emptyTitle = self.emptyTexts[AppConfigSettings.shared.taskIndex]
  137. //ProgressHUD.show("加载中...",interaction: false)
  138. self.filterModels.removeAll()
  139. Alamofire.request(self.currentTaskURLGenenater.pagingURL(), method: .post, parameters: ["key":self.searchText], encoding: JSONEncoding.default, headers: nil).responseJSON { (response) in
  140. switch response.result {
  141. case .success(let val):
  142. let type = JSON(val)["type"]
  143. if type == "success" {
  144. let data = JSON(val)["data"]
  145. let todoTaskArray = Mapper<TodoTask>().mapArray(JSONString: data.description)
  146. if let todoTasks = todoTaskArray {
  147. for task in todoTasks {
  148. let model = TodoCellModel<TodoTask>(title: task.title,applicationName: task.applicationName,status: task.activityName,time: task.updateTime,sourceObj: task)
  149. self.filterModels.append(model)
  150. }
  151. }
  152. //设置页码
  153. let count = JSON(val)["count"]
  154. //第一次设置总数
  155. self.currentTaskURLGenenater.pageModel.setPageTotal(count.int!)
  156. DispatchQueue.main.async {
  157. self.tableView.reloadData()
  158. //ProgressHUD.showSuccess("加载成功")
  159. }
  160. }else{
  161. DispatchQueue.main.async {
  162. DDLogError(JSON(val).description)
  163. self.tableView.reloadData()
  164. //ProgressHUD.showError("加载失败")
  165. }
  166. }
  167. case .failure(let err):
  168. DispatchQueue.main.async {
  169. DDLogError(err.localizedDescription)
  170. self.tableView.reloadData()
  171. //ProgressHUD.showError("加载失败")
  172. }
  173. }
  174. if tv.mj_header.isRefreshing(){
  175. tv.mj_header.endRefreshing()
  176. }
  177. }
  178. }
  179. func loadFilterNexdataByURL(){
  180. let tv = self.tableView as! ZLBaseTableView
  181. tv.emptyTitle = self.emptyTexts[AppConfigSettings.shared.taskIndex]
  182. //ProgressHUD.show("加载中...",interaction: false)
  183. let todoTask = self.models.last?.sourceObj!
  184. self.currentTaskURLGenenater.pageModel.nextPageId = (todoTask?.id)!
  185. Alamofire.request(self.currentTaskURLGenenater.pagingURL(), method: .post, parameters: ["key":self.searchText], encoding: JSONEncoding.default, headers: nil).responseJSON { (response) in
  186. switch response.result {
  187. case .success(let val):
  188. let type = JSON(val)["type"]
  189. if type == "success" {
  190. let data = JSON(val)["data"]
  191. let todoTaskArray = Mapper<TodoTask>().mapArray(JSONString: data.description)
  192. if let todoTasks = todoTaskArray {
  193. for task in todoTasks {
  194. let model = TodoCellModel<TodoTask>(title: task.title,applicationName: task.applicationName,status: task.activityName,time: task.updateTime,sourceObj: task)
  195. self.filterModels.append(model)
  196. }
  197. }
  198. DispatchQueue.main.async {
  199. self.tableView.reloadData()
  200. // ProgressHUD.showSuccess("加载成功")
  201. }
  202. }else{
  203. DispatchQueue.main.async {
  204. DDLogError(JSON(val).description)
  205. self.tableView.reloadData()
  206. //ProgressHUD.showSuccess("加载失败")
  207. }
  208. }
  209. case .failure(let err):
  210. DispatchQueue.main.async {
  211. DDLogError(err.localizedDescription)
  212. self.tableView.reloadData()
  213. //ProgressHUD.showSuccess("加载失败")
  214. }
  215. }
  216. if tv.mj_footer.isRefreshing() {
  217. tv.mj_footer.endRefreshing()
  218. }
  219. }
  220. }
  221. //加载第一页数据
  222. func loadFirstDataByURL(){
  223. let tv = self.tableView as! ZLBaseTableView
  224. tv.emptyTitle = self.emptyTexts[AppConfigSettings.shared.taskIndex]
  225. //ProgressHUD.show("加载中...",interaction: false)
  226. self.models.removeAll()
  227. Alamofire.request(self.currentTaskURLGenenater.pagingURL(), method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil).responseJSON { (response) in
  228. switch response.result {
  229. case .success(let val):
  230. let type = JSON(val)["type"]
  231. if type == "success" {
  232. let data = JSON(val)["data"]
  233. let todoTaskArray = Mapper<TodoTask>().mapArray(JSONString: data.description)
  234. if let todoTasks = todoTaskArray {
  235. for task in todoTasks {
  236. let model = TodoCellModel<TodoTask>(title: task.title,applicationName: task.applicationName,status: task.activityName,time: task.updateTime,sourceObj: task)
  237. self.models.append(model)
  238. }
  239. }
  240. //设置页码
  241. let count = JSON(val)["count"]
  242. //第一次设置总数
  243. self.currentTaskURLGenenater.pageModel.setPageTotal(count.int!)
  244. DispatchQueue.main.async {
  245. self.tableView.reloadData()
  246. //ProgressHUD.showSuccess("加载成功")
  247. }
  248. }else{
  249. DispatchQueue.main.async {
  250. DDLogError(JSON(val).description)
  251. self.tableView.reloadData()
  252. //ProgressHUD.showError("加载失败")
  253. }
  254. }
  255. case .failure(let err):
  256. DispatchQueue.main.async {
  257. DDLogError(err.localizedDescription)
  258. self.tableView.reloadData()
  259. //ProgressHUD.showError("加载失败")
  260. }
  261. }
  262. if tv.mj_header.isRefreshing(){
  263. tv.mj_header.endRefreshing()
  264. }
  265. }
  266. }
  267. //加载下一页数据
  268. func loadDataNextByURL() {
  269. let tv = self.tableView as! ZLBaseTableView
  270. tv.emptyTitle = self.emptyTexts[AppConfigSettings.shared.taskIndex]
  271. //ProgressHUD.show("加载中...",interaction: false)
  272. let todoTask = self.models.last?.sourceObj!
  273. self.currentTaskURLGenenater.pageModel.nextPageId = (todoTask?.id)!
  274. Alamofire.request(self.currentTaskURLGenenater.pagingURL(), method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil).responseJSON { (response) in
  275. switch response.result {
  276. case .success(let val):
  277. let type = JSON(val)["type"]
  278. if type == "success" {
  279. let data = JSON(val)["data"]
  280. let todoTaskArray = Mapper<TodoTask>().mapArray(JSONString: data.description)
  281. if let todoTasks = todoTaskArray {
  282. for task in todoTasks {
  283. let model = TodoCellModel<TodoTask>(title: task.title,applicationName: task.applicationName,status: task.activityName,time: task.updateTime,sourceObj: task)
  284. self.models.append(model)
  285. }
  286. }
  287. DispatchQueue.main.async {
  288. self.tableView.reloadData()
  289. // ProgressHUD.showSuccess("加载成功")
  290. }
  291. }else{
  292. DispatchQueue.main.async {
  293. DDLogError(JSON(val).description)
  294. self.tableView.reloadData()
  295. //ProgressHUD.showSuccess("加载失败")
  296. }
  297. }
  298. case .failure(let err):
  299. DispatchQueue.main.async {
  300. DDLogError(err.localizedDescription)
  301. self.tableView.reloadData()
  302. //ProgressHUD.showSuccess("加载失败")
  303. }
  304. }
  305. if tv.mj_footer.isRefreshing() {
  306. tv.mj_footer.endRefreshing()
  307. }
  308. }
  309. }
  310. //初始化控件
  311. func initSegmentedControl(){
  312. let titleStrings = ["待办", "待阅", "已办", "已阅"]
  313. let titles: [NSAttributedString] = {
  314. let attributes = [NSAttributedString.Key.font: UIFont(name: "PingFangSC-Regular", size: 17.0)!
  315. , NSAttributedString.Key.foregroundColor: UIColor.white]
  316. var titles = [NSAttributedString]()
  317. for titleString in titleStrings {
  318. let title = NSAttributedString(string: titleString, attributes: attributes)
  319. titles.append(title)
  320. }
  321. return titles
  322. }()
  323. let selectedTitles: [NSAttributedString] = {
  324. let attributes = [NSAttributedString.Key.font: UIFont(name: "PingFangSC-Regular", size: 17.0)!, NSAttributedString.Key.foregroundColor: UIColor.darkGray]
  325. var selectedTitles = [NSAttributedString]()
  326. for titleString in titleStrings {
  327. let selectedTitle = NSAttributedString(string: titleString, attributes: attributes)
  328. selectedTitles.append(selectedTitle)
  329. }
  330. return selectedTitles
  331. }()
  332. segmentedControl = SegmentedControl.initWithTitles(titles, selectedTitles: selectedTitles)
  333. segmentedControl.delegate = self
  334. segmentedControl.backgroundColor = UIColor.clear
  335. segmentedControl.selectionBoxColor = UIColor.white
  336. segmentedControl.selectionBoxStyle = .default
  337. segmentedControl.selectionBoxCornerRadius = 15
  338. segmentedControl.frame.size = CGSize(width: 70 * titles.count, height: 30)
  339. segmentedControl.isLongPressEnabled = true
  340. segmentedControl.isUnselectedSegmentsLongPressEnabled = true
  341. segmentedControl.longPressMinimumPressDuration = 1
  342. //segmentedControl.setTitleAttachedIcons([#imageLiteral(resourceName: "taskSegmentAdditionIcon")], selectedTitleAttachedIcons: [#imageLiteral(resourceName: "taskSegmentAdditionIconSelected")])
  343. navigationItem.titleView = segmentedControl
  344. segmentedControl.setSelected(at: AppConfigSettings.shared.taskIndex, animated: true)
  345. }
  346. // MARK: - Table view data source
  347. override func numberOfSections(in tableView: UITableView) -> Int {
  348. return 1
  349. }
  350. override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  351. if !self.searchController.isActive {
  352. return self.models.count
  353. }else{
  354. return self.filterModels.count
  355. }
  356. }
  357. override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  358. let cell = tableView.dequeueReusableCell(withIdentifier: "TodoTaskTableViewCell", for: indexPath) as! TodoTaskTableViewCell
  359. if !self.searchController.isActive {
  360. let model = self.models[indexPath.row]
  361. cell.cellModel = model
  362. }else{
  363. let model = self.filterModels[indexPath.row]
  364. cell.cellModel = model
  365. }
  366. return cell
  367. }
  368. override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  369. // self.performSegue(withIdentifier: "toSignature", sender: nil)
  370. var todoTask:TodoTask?
  371. if !self.searchController.isActive {
  372. todoTask = self.models[indexPath.row].sourceObj
  373. }else{
  374. todoTask = self.filterModels[indexPath.row].sourceObj
  375. }
  376. //根据不同的类型跳转显示
  377. switch self.segmentedControl.selectedIndex {
  378. case 0:
  379. self.performSegue(withIdentifier: "showTodoDetailSegue", sender: todoTask)
  380. case 1:
  381. self.performSegue(withIdentifier: "showTodoDetailSegue", sender: todoTask)
  382. case 2:
  383. self.performSegue(withIdentifier: "showTodoedDetailSegue", sender: todoTask)
  384. case 3:
  385. self.performSegue(withIdentifier: "showTodoDetailSegue", sender: todoTask)
  386. default:
  387. DDLogDebug("no click")
  388. }
  389. }
  390. override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
  391. return UIView()
  392. }
  393. //prepare
  394. override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  395. if segue.identifier == "showTodoDetailSegue" {
  396. let destVC = segue.destination as! TodoTaskDetailViewController
  397. destVC.todoTask = sender as? TodoTask
  398. destVC.backFlag = 2 //返回标志
  399. }else if segue.identifier == "showTodoedDetailSegue" {
  400. let destVC = segue.destination as! TodoedTaskViewController
  401. destVC.todoTask = sender as? TodoTask
  402. }else if segue.identifier == "toSignature" {
  403. DDLogDebug("签名去了。。。。。。。。。")
  404. }
  405. }
  406. //backWindtodoTask
  407. @IBAction func unWindForTodoTask(_ segue:UIStoryboardSegue){
  408. DDLogDebug(segue.identifier!)
  409. if segue.identifier == "backToTodoTask" {
  410. self.segmentedControl.setSelected(at: 0, animated: true)
  411. AppConfigSettings.shared.taskIndex = 0
  412. self.tableView.mj_header.beginRefreshing()
  413. //self.segmentedSelected(self.taskSegmentedControl)
  414. }else if segue.identifier == "backToReadTask" {
  415. self.segmentedControl.setSelected(at: 1, animated: true)
  416. AppConfigSettings.shared.taskIndex = 1
  417. self.tableView.mj_header.beginRefreshing()
  418. }
  419. }
  420. }
  421. //searcher update
  422. extension TodoTaskViewController:UISearchResultsUpdating,UISearchControllerDelegate{
  423. func willPresentSearchController(_ searchController: UISearchController) {
  424. DDLogDebug("willPresentSearchController 1, searchController.isActive = \(searchController.isActive)")
  425. self.models.removeAll()
  426. self.tableView.reloadData()
  427. }
  428. func didPresentSearchController(_ searchController: UISearchController) {
  429. DDLogDebug(" didPresentSearchController 2, searchController.isActive = \(searchController.isActive)")
  430. }
  431. func willDismissSearchController(_ searchController: UISearchController) {
  432. DDLogDebug(" didPresentSearchController 3, searchController.isActive = \(searchController.isActive)")
  433. }
  434. func didDismissSearchController(_ searchController: UISearchController) {
  435. DDLogDebug(" didDismissSearchController 4, searchController.isActive = \(searchController.isActive)")
  436. //self.tableView.mj_header.beginRefreshing()
  437. }
  438. func updateSearchResults(for searchController: UISearchController) {
  439. if let sText = searchController.searchBar.text {
  440. self.searchText = sText
  441. self.headerLoadData()
  442. }
  443. }
  444. }
  445. extension TodoTaskViewController:SegmentedControlDelegate{
  446. func segmentedControl(_ segmentedControl: SegmentedControl, didSelectIndex selectedIndex: Int) {
  447. DDLogDebug("click \(selectedIndex)")
  448. AppConfigSettings.shared.taskIndex = selectedIndex
  449. self.setSearchBarIsShow()
  450. self.headerLoadData()
  451. //self.tableView.mj_header.beginRefreshing()
  452. }
  453. func segmentedControl(_ segmentedControl: SegmentedControl, didLongPressIndex longPressIndex: Int) {
  454. }
  455. }