PhotoViewController.swift 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. //
  2. // ViewController.swift
  3. // photosApp2
  4. //
  5. // Created by Muskan on 10/4/17.
  6. // Copyright © 2017 akhil. All rights reserved.
  7. //
  8. import UIKit
  9. import Photos
  10. import ReactiveCocoa
  11. import ReactiveSwift
  12. class PhotoViewController: UIViewController{
  13. @IBOutlet weak var patientIdLabel :UILabel!{
  14. didSet{
  15. patientIdLabel.reactive.text <~ PictureViewController.patientId
  16. }
  17. }
  18. @IBOutlet weak var patientNmLabel :UILabel!{
  19. didSet{
  20. patientNmLabel.reactive.text <~ PictureViewController.patientNm
  21. }
  22. }
  23. @IBOutlet weak var ageGenderLabel :UILabel!{
  24. didSet{
  25. ageGenderLabel.reactive.text <~ PictureViewController.ageGender
  26. }
  27. }
  28. @IBOutlet weak var cancelButton: UIButton!{
  29. didSet{
  30. cancelButton.addTapGestureRecognizer(action: self.cancelAction)
  31. }
  32. }
  33. @IBOutlet weak var okButton: UIButton!{
  34. didSet{
  35. okButton.addTapGestureRecognizer(action: self.okAction)
  36. }
  37. }
  38. @IBOutlet weak var photoCollectionView: UICollectionView!{
  39. didSet{
  40. photoCollectionView.delegate = adapter
  41. photoCollectionView.dataSource = adapter
  42. self.list.signal.observe({ [weak self](item) in
  43. guard let value = item.value else { return }
  44. self?.adapter.list = value
  45. self?.photoCollectionView.reloadData()
  46. })
  47. }
  48. }
  49. @IBOutlet weak var allSelectButton: UIView!{
  50. didSet{
  51. allSelectButton.addTapGestureRecognizer(action: self.allSelectAction)
  52. }
  53. }
  54. @IBOutlet weak var allSelectLabel: UILabel!
  55. @IBOutlet weak var allSelectCheck: CheckImageButton!
  56. @IBOutlet weak var allUserAlbumButton: UIView!{
  57. didSet{
  58. allUserAlbumButton.addTapGestureRecognizer(action: self.allUserAlbumAction)
  59. }
  60. }
  61. @IBOutlet weak var allUserAlbumLabel: UILabel!
  62. @IBOutlet weak var allUserAlbumCheck: CheckImageButton!
  63. @IBOutlet weak var cameraButton: UIButton!{
  64. didSet{
  65. cameraButton.addTapGestureRecognizer(action: self.cameraAction)
  66. }
  67. }
  68. @IBOutlet weak var deleteButton: UIButton!{
  69. didSet{
  70. deleteButton.addTapGestureRecognizer(action: self.deleteAction)
  71. }
  72. }
  73. @IBOutlet weak var closeButton: UIImageView!{
  74. didSet{
  75. closeButton.addTapGestureRecognizer(action: self.cancelAction)
  76. }
  77. }
  78. @IBOutlet weak var deptNmLabel: UILabel!{
  79. didSet{
  80. PictureViewController.deptNm.signal.observe { [weak deptNmLabel](item) in
  81. guard let value = item.value as? String else{ return }
  82. let attr = deptNmLabel?.attributedText?.attributes(at: 0, effectiveRange: nil)
  83. let attrString = NSMutableAttributedString(string: value, attributes: attr)
  84. deptNmLabel?.attributedText = attrString
  85. }
  86. }
  87. }
  88. @IBOutlet weak var treatClsKrLabel: UILabel!{
  89. didSet{
  90. PictureViewController.treatClsKr.signal.observe { [weak treatClsKrLabel](item) in
  91. guard let value = item.value as? String else{ return }
  92. let attr = treatClsKrLabel?.attributedText?.attributes(at: 0, effectiveRange: nil)
  93. let attrString = NSMutableAttributedString(string: value, attributes: attr)
  94. treatClsKrLabel?.attributedText = attrString
  95. }
  96. }
  97. }
  98. @IBOutlet weak var doctorNmLabel: UILabel!{
  99. didSet{
  100. PictureViewController.doctorNm.signal.observe { [weak doctorNmLabel](item) in
  101. guard let value = item.value as? String else{ return }
  102. let attr = doctorNmLabel?.attributedText?.attributes(at: 0, effectiveRange: nil)
  103. let attrString = NSMutableAttributedString(string: value, attributes: attr)
  104. doctorNmLabel?.attributedText = attrString
  105. }
  106. }
  107. }
  108. let adapter = PhotoCollectionViewAdapter()
  109. var list = MutableProperty<[(String,[Photo])]?>(nil)
  110. static var reUploadItem = MutableProperty<Photo?>(nil)
  111. var successCount = 0
  112. var failCount = 0
  113. }
  114. extension PhotoViewController{
  115. override func viewDidLoad() {
  116. super.viewDidLoad()
  117. PictureViewController.patientId.signal.observe { [weak self](item) in
  118. guard let _ = item.value else{ return }
  119. if let VC = self?.parent as? PictureViewController, let user = VC.user{
  120. self?.list.value = Photo.list(user: user)
  121. }
  122. }
  123. //이미지 프로세싱 완료처리
  124. CustomCameraViewController.photoProcessCommit.signal.observe { [weak self](item) in
  125. DispatchQueue.main.async {
  126. self?.reloadTable()
  127. }
  128. }
  129. PhotoViewController.reUploadItem.signal.observe { [weak self](item) in
  130. guard let value = item.value as? Photo else{ return }
  131. self?.uploadItem(value)
  132. }
  133. }
  134. override func viewWillLayoutSubviews() {
  135. super.viewWillLayoutSubviews()
  136. }
  137. override func didReceiveMemoryWarning() {
  138. super.didReceiveMemoryWarning()
  139. // Dispose of any resources that can be recreated.
  140. }
  141. func cancelAction(){
  142. self.navigationController?.popViewController(animated: true)
  143. }
  144. //선택된 사진 전송
  145. func okAction(){
  146. successCount = 0
  147. failCount = 0
  148. guard self.adapter.selectedArr.count > 0 else{
  149. self.showAlert("파일을 한 개 이상 선택해주세요", "", "확인")
  150. return
  151. }
  152. //비동기화 통신코드 동기화 구현 필요
  153. for indexPath in self.adapter.selectedArr{
  154. guard let list = self.list.value else{ return }
  155. let photos = list[indexPath.first ?? 0].1
  156. let photo = photos[indexPath.row]
  157. //선택된 사진이 이미 보낸적이 있다면 업데이트하지 않는다
  158. if photo.isSended == false{
  159. self.uploadItem(photo)
  160. }
  161. self.adapter.selectedArr = self.adapter.selectedArr.filter({$0 != indexPath})
  162. }
  163. if let parent = self.parent as? PictureViewController{
  164. parent.callBack?(["success":"\(successCount)", "fail":"\(failCount)"])
  165. }
  166. self.showAlert("서버에 업로드 되었습니다.", "", "확인")
  167. }
  168. func uploadItem(_ photo:Photo){
  169. var param = [String:Any]()
  170. param["hospitalCd"] = photo.user?.hospitalCD ?? ""
  171. param["userId"] = photo.user?.userId ?? ""
  172. param["patientId"] = photo.user?.patientId ?? ""
  173. param["deptCd"] = photo.user?.deptCd ?? ""
  174. param["doctorId"] = photo.user?.doctorId ?? ""
  175. param["searchCls"] = photo.user?.treatCls ?? ""
  176. param["thumbnail"] = ""
  177. param["excutionDtTm"] = Date().fromString(format: "yyyy-MM-dd hh:mm:ss")
  178. param["visitDt"] = photo.user?.visitDt ?? ""
  179. if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
  180. //원본 이미지 찾기
  181. let origin = dir.appendingPathComponent("kunkuk/\(photo.file ?? "")")
  182. if let data = try? Data(contentsOf: origin){
  183. // let binaryString = data.reduce("") { (acc, byte) -> String in
  184. // print(String(byte, radix: 2))
  185. // return acc + String(byte, radix: 2)
  186. // }
  187. // param["image"] = binaryString
  188. param["image"] = data.base64EncodedString()
  189. }
  190. }
  191. let url = "\(MCarePlusConstants.DOMAIN_NAME)\(photo.user?.serviceUrl ?? "")"
  192. APIClient(url)
  193. .param(reqParam: param)
  194. .enType(.json)
  195. .connect { [weak self](result:[String:Any]) in
  196. print(result)
  197. guard let `result` = result["result"] as? [[String:Any]] else{ return }
  198. let returnCd = result.first?["returnCd"] as? String
  199. //성공일시
  200. if returnCd == "0000"{
  201. self?.successCount += 1
  202. photo.isSended = true
  203. photo.update()
  204. self?.reloadTable()
  205. }else{
  206. self?.failCount += 1
  207. }
  208. }
  209. }
  210. //선택된 사진 삭제
  211. func deleteAction(){
  212. guard self.adapter.selectedArr.count > 0 else{
  213. self.showAlert("파일을 한 개 이상 선택해주세요", "", "확인")
  214. return
  215. }
  216. self.showAlert("정말 삭제하시겠습니까?", "", "확인", "취소", { [weak self] (action) in
  217. guard let `self` = self else{ return }
  218. for indexPath in self.adapter.selectedArr{
  219. guard let list = self.list.value else{ return }
  220. let photos = list[indexPath.first ?? 0].1
  221. let photo = photos[indexPath.row]
  222. do {
  223. if let file = photo.file{
  224. self.fileDelete(file: file)
  225. }
  226. let _ = photo.delete()
  227. }
  228. self.adapter.selectedArr = self.adapter.selectedArr.filter({$0 != indexPath})
  229. }
  230. self.reloadTable()
  231. }, { [weak self] (action) in
  232. })
  233. }
  234. func fileDelete(file:String){
  235. //도큐먼트의 유저 디렉토리를 찾는다
  236. if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
  237. let path = dir.appendingPathComponent("kunkuk")
  238. //해당 폴더가 없으면 생성
  239. if !FileManager.default.fileExists(atPath: path.path){
  240. try? FileManager.default.createDirectory(at: path, withIntermediateDirectories: true, attributes: nil)
  241. }
  242. let thumb = dir.appendingPathComponent("thumb")
  243. //해당 폴더가 없으면 생성
  244. if !FileManager.default.fileExists(atPath: thumb.path){
  245. try? FileManager.default.createDirectory(at: thumb, withIntermediateDirectories: true, attributes: nil)
  246. }
  247. let fileURL = path.appendingPathComponent(file)
  248. let thumbURL = thumb.appendingPathComponent(file)
  249. try? FileManager.default.removeItem(at: fileURL)
  250. try? FileManager.default.removeItem(at: thumbURL)
  251. }
  252. }
  253. //테이블 리로드 rx swift 이용
  254. func reloadTable(){
  255. guard let parent = self.parent as? PictureViewController else{ return }
  256. guard let user = parent.user else{ return }
  257. if self.allUserAlbumLabel.text == "전체환자"{
  258. self.list.value = Photo.list(user: user)
  259. }else{
  260. self.list.value = Photo.allList(user: user)
  261. }
  262. }
  263. //커스텀 카메라 호출
  264. func cameraAction(){
  265. if let parent = self.parent as? PictureViewController{
  266. parent.cameraAction(action: nil)
  267. }
  268. }
  269. //전체선택 / 해제
  270. func allSelectAction(){
  271. //인덱스패스 저장용
  272. var selectedArr = Set<IndexPath>()
  273. //섹션카운트
  274. let section = self.photoCollectionView.numberOfSections
  275. //전체선택일경우 전체선택 or 해제
  276. if self.allSelectLabel.text == "전체선택"{
  277. self.allSelectLabel.text = "선택해제"
  278. self.allSelectCheck.isChecked = true
  279. for i in 0..<section{
  280. let row = self.photoCollectionView.numberOfItems(inSection: i)
  281. for j in 0..<row{
  282. selectedArr.insert(IndexPath(row: j, section: i))
  283. }
  284. }
  285. }else{
  286. self.allSelectLabel.text = "전체선택"
  287. self.allSelectCheck.isChecked = false
  288. }
  289. self.adapter.selectedArr = selectedArr
  290. self.photoCollectionView.reloadData()
  291. }
  292. //전체앨범 or 선택환자
  293. func allUserAlbumAction(){
  294. if self.allUserAlbumLabel.text == "전체환자"{
  295. self.allUserAlbumLabel.text = "개인환자"
  296. self.allUserAlbumCheck.isChecked = true
  297. }else{
  298. self.allUserAlbumLabel.text = "전체환자"
  299. self.allUserAlbumCheck.isChecked = false
  300. }
  301. self.reloadTable()
  302. }
  303. }