PhotoViewController.swift 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  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 okButton: UIButton!{
  29. didSet{
  30. okButton.addTapGestureRecognizer(action: self.okAction)
  31. }
  32. }
  33. @IBOutlet weak var photoCollectionView: UICollectionView!{
  34. didSet{
  35. photoCollectionView.delegate = adapter
  36. photoCollectionView.dataSource = adapter
  37. self.list.signal.observe({ [weak self](item) in
  38. guard let value = item.value else { return }
  39. self?.adapter.list = value
  40. self?.photoCollectionView.reloadData()
  41. })
  42. }
  43. }
  44. @IBOutlet weak var allSelectButton: UIView!{
  45. didSet{
  46. allSelectButton.addTapGestureRecognizer(action: self.allSelectAction)
  47. }
  48. }
  49. @IBOutlet weak var allSelectLabel: UILabel!
  50. @IBOutlet weak var allSelectCheck: CheckImageButton!
  51. @IBOutlet weak var allUserAlbumButton: UIView!{
  52. didSet{
  53. allUserAlbumButton.addTapGestureRecognizer(action: self.allUserAlbumAction)
  54. }
  55. }
  56. @IBOutlet weak var allUserAlbumLabel: UILabel!
  57. @IBOutlet weak var allUserAlbumCheck: CheckImageButton!
  58. @IBOutlet weak var cameraButton: UIButton!{
  59. didSet{
  60. cameraButton.addTapGestureRecognizer(action: self.cameraAction)
  61. }
  62. }
  63. @IBOutlet weak var deleteButton: UIButton!{
  64. didSet{
  65. deleteButton.addTapGestureRecognizer(action: self.deleteAction)
  66. }
  67. }
  68. @IBOutlet weak var closeButton: UIImageView!{
  69. didSet{
  70. closeButton.addTapGestureRecognizer(action: self.cancelAction)
  71. }
  72. }
  73. @IBOutlet weak var deptNmLabel: UILabel!{
  74. didSet{
  75. PictureViewController.deptNm.signal.observe { [weak deptNmLabel](item) in
  76. guard let value = item.value as? String else{ return }
  77. let attr = deptNmLabel?.attributedText?.attributes(at: 0, effectiveRange: nil)
  78. let attrString = NSMutableAttributedString(string: value, attributes: attr)
  79. deptNmLabel?.attributedText = attrString
  80. }
  81. }
  82. }
  83. @IBOutlet weak var treatClsKrLabel: UILabel!{
  84. didSet{
  85. PictureViewController.treatClsKr.signal.observe { [weak treatClsKrLabel](item) in
  86. guard let value = item.value as? String else{ return }
  87. let attr = treatClsKrLabel?.attributedText?.attributes(at: 0, effectiveRange: nil)
  88. let attrString = NSMutableAttributedString(string: value, attributes: attr)
  89. treatClsKrLabel?.attributedText = attrString
  90. }
  91. }
  92. }
  93. @IBOutlet weak var doctorNmLabel: UILabel!{
  94. didSet{
  95. PictureViewController.doctorNm.signal.observe { [weak doctorNmLabel](item) in
  96. guard let value = item.value as? String else{ return }
  97. let attr = doctorNmLabel?.attributedText?.attributes(at: 0, effectiveRange: nil)
  98. let attrString = NSMutableAttributedString(string: value, attributes: attr)
  99. doctorNmLabel?.attributedText = attrString
  100. }
  101. }
  102. }
  103. let adapter = PhotoCollectionViewAdapter()
  104. var list = MutableProperty<[(String,[Photo])]?>(nil)
  105. static var reUploadItem = MutableProperty<Photo?>(nil)
  106. var allSelectCheckFlag = MutableProperty<Bool>(false)
  107. var successCount = 0
  108. var failCount = 0
  109. var uploadCount = 0 //전체 업로드한 개수를 기억한다.
  110. }
  111. extension PhotoViewController{
  112. override func viewDidLoad() {
  113. super.viewDidLoad()
  114. PictureViewController.patientId.signal.observe { [weak self](item) in
  115. guard let _ = item.value else{ return }
  116. if let VC = self?.parent as? PictureViewController, let user = VC.user{
  117. self?.list.value = Photo.list(user: user)
  118. }
  119. }
  120. //이미지 프로세싱 완료처리
  121. CustomCameraViewController.photoProcessCommit.signal.observe { [weak self](item) in
  122. DispatchQueue.main.async {
  123. self?.reloadTable(checkAll: self?.allUserAlbumCheck.checked ?? false)
  124. }
  125. }
  126. PhotoViewController.reUploadItem.signal.observe { [weak self](item) in
  127. guard let value = item.value as? Photo else{ return }
  128. self?.uploadItem(value)
  129. }
  130. allSelectCheckFlag.signal.observe { [weak self](item) in
  131. guard let value = item.value as? Bool else{ return }
  132. guard let list = self?.adapter.list else{ return }
  133. for item in list{
  134. for item2 in item.1{
  135. item2.isChecked = value
  136. }
  137. }
  138. self?.photoCollectionView.reloadData()
  139. }
  140. }
  141. override func viewWillLayoutSubviews() {
  142. super.viewWillLayoutSubviews()
  143. }
  144. override func didReceiveMemoryWarning() {
  145. super.didReceiveMemoryWarning()
  146. // Dispose of any resources that can be recreated.
  147. }
  148. func cancelAction(){
  149. self.navigationController?.popViewController(animated: true)
  150. }
  151. //선택된 사진 전송
  152. func okAction(){
  153. self.successCount = 0
  154. self.failCount = 0
  155. self.uploadCount = 0
  156. let isCheckCount = self.adapter.list?.filter({
  157. $0.1.filter({$0.isChecked}).count > 0
  158. }).count ?? 0
  159. guard isCheckCount > 0 else{
  160. // self.showAlert("파일을 한 개 이상 선택해주세요", "", "확인")
  161. return
  162. }
  163. guard let list = self.adapter.list else{ return }
  164. var arrayUploadList:[Photo]? = [Photo]()
  165. for item in list{
  166. for item2 in item.1{
  167. //선택된 사진이 이미 보낸적이 있다면 업데이트하지 않는다
  168. if item2.isChecked && item2.isSended == false{
  169. arrayUploadList?.append(item2)
  170. }else{
  171. continue
  172. }
  173. }
  174. }
  175. self.uploadCount = arrayUploadList?.count ?? 0
  176. if self.uploadCount != 0 {
  177. for upload in arrayUploadList! {
  178. self.uploadItem(upload)
  179. }
  180. }
  181. if let parent = self.parent as? PictureViewController{
  182. parent.callBack?(["success":"\(successCount)", "fail":"\(failCount)"])
  183. }
  184. }
  185. func uploadItem(_ photo:Photo){
  186. var param = [String:Any]()
  187. param["hospitalCd"] = photo.user?.hospitalCD ?? ""
  188. param["userId"] = photo.user?.userId ?? ""
  189. param["patientId"] = photo.user?.patientId ?? ""
  190. param["deptCd"] = photo.user?.deptCd ?? ""
  191. param["doctorId"] = photo.user?.doctorId ?? ""
  192. param["searchCls"] = photo.user?.treatCls ?? ""
  193. param["thumbnail"] = ""
  194. param["excutionDtTm"] = Date().fromString(format: "yyyy-MM-dd hh:mm:ss")
  195. param["visitDt"] = photo.user?.visitDt ?? ""
  196. if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
  197. //원본 이미지 찾기
  198. let origin = dir.appendingPathComponent("kunkuk/\(photo.file ?? "")")
  199. if let data = try? Data(contentsOf: origin){
  200. // let binaryString = data.reduce("") { (acc, byte) -> String in
  201. // print(String(byte, radix: 2))
  202. // return acc + String(byte, radix: 2)
  203. // }
  204. // param["image"] = binaryString
  205. param["image"] = data.base64EncodedString()
  206. }
  207. }
  208. let url = "\(MCarePlusConstants.DOMAIN_NAME)\(photo.user?.serviceUrl ?? "")"
  209. APIClient(url)
  210. .param(reqParam: param)
  211. .enType(.json)
  212. .connect { [weak self](result:[String:Any]) in
  213. print(result)
  214. guard let `result` = result["result"] as? [[String:Any]] else{ return }
  215. let returnCd = result.first?["returnCd"] as? String
  216. //성공일시
  217. if returnCd == "0000"{
  218. self?.successCount += 1
  219. photo.isSended = true
  220. photo.update()
  221. self?.reloadTable(checkAll: self?.allUserAlbumCheck.checked ?? false )
  222. }else{
  223. self?.failCount += 1
  224. }
  225. self!.isUploadComplete()
  226. }
  227. }
  228. func isUploadComplete(){
  229. let total = self.uploadCount
  230. let sumCount = self.successCount + self.failCount
  231. if total == sumCount {
  232. //전송완료
  233. if failCount == 0 {
  234. self.showAlert("\(successCount)건 전송 완료되었습니다.", "", "확인")
  235. } else {
  236. self.showAlert("\(failCount)건 전송 실패하였습니다.", "", "확인")
  237. }
  238. } else {
  239. //전송중
  240. }
  241. }
  242. //선택된 사진 삭제
  243. func deleteAction(){
  244. let isCheckCount = self.adapter.list?.filter({
  245. $0.1.filter({$0.isChecked}).count > 0
  246. }).count ?? 0
  247. guard isCheckCount > 0 else{
  248. // self.showAlert("파일을 한 개 이상 선택해주세요", "", "확인")
  249. return
  250. }
  251. self.showAlert("정말 삭제하시겠습니까?", "", "확인", "취소", { [weak self] (action) in
  252. guard let `self` = self else{ return }
  253. guard let list = self.adapter.list else{ return }
  254. for item in list{
  255. for item2 in item.1{
  256. if item2.isChecked{
  257. do {
  258. if let file = item2.file{
  259. self.fileDelete(file: file)
  260. }
  261. let _ = item2.delete()
  262. }
  263. }else{
  264. continue
  265. }
  266. }
  267. }
  268. self.reloadTable(checkAll: self.allUserAlbumCheck.checked)
  269. }, { [weak self] (action) in
  270. })
  271. }
  272. func fileDelete(file:String){
  273. //도큐먼트의 유저 디렉토리를 찾는다
  274. if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
  275. let path = dir.appendingPathComponent("kunkuk")
  276. //해당 폴더가 없으면 생성
  277. if !FileManager.default.fileExists(atPath: path.path){
  278. try? FileManager.default.createDirectory(at: path, withIntermediateDirectories: true, attributes: nil)
  279. }
  280. let thumb = dir.appendingPathComponent("thumb")
  281. //해당 폴더가 없으면 생성
  282. if !FileManager.default.fileExists(atPath: thumb.path){
  283. try? FileManager.default.createDirectory(at: thumb, withIntermediateDirectories: true, attributes: nil)
  284. }
  285. let fileURL = path.appendingPathComponent(file)
  286. let thumbURL = thumb.appendingPathComponent(file)
  287. try? FileManager.default.removeItem(at: fileURL)
  288. try? FileManager.default.removeItem(at: thumbURL)
  289. }
  290. }
  291. //테이블 리로드 rx swift 이용
  292. func reloadTable(){
  293. guard let parent = self.parent as? PictureViewController else{ return }
  294. guard let user = parent.user else{ return }
  295. if self.allUserAlbumCheck.checked {
  296. self.list.value = Photo.list(user: user)
  297. }else{
  298. self.list.value = Photo.allList(user: user)
  299. }
  300. self.allSelectCheckFlag.value = false
  301. self.allUserAlbumCheck.checked = !self.allUserAlbumCheck.checked
  302. }
  303. //테이블 리로드 rx swift 이용
  304. func reloadTable(checkAll:Bool){
  305. guard let parent = self.parent as? PictureViewController else{ return }
  306. guard let user = parent.user else{ return }
  307. if checkAll {
  308. self.list.value = Photo.allList(user: user)
  309. }else{
  310. self.list.value = Photo.list(user: user)
  311. }
  312. self.allSelectCheckFlag.value = false
  313. self.allUserAlbumCheck.checked = checkAll
  314. }
  315. //커스텀 카메라 호출
  316. func cameraAction(){
  317. if let parent = self.parent as? PictureViewController{
  318. parent.cameraAction(action: nil)
  319. }
  320. }
  321. //전체선택 체크박스
  322. func allSelectAction(){
  323. //인덱스패스 저장용
  324. var selectedArr = Set<IndexPath>()
  325. //섹션카운트
  326. let section = self.photoCollectionView.numberOfSections
  327. // //전체선택일경우 전체선택 or 해제
  328. // if self.allSelectLabel.text == "전체선택"{
  329. // self.allSelectLabel.text = "선택해제"
  330. // self.allSelectCheck.isChecked = true
  331. // self.allSelectCheckFlag.value = true
  332. // }else{
  333. // self.allSelectLabel.text = "전체선택"
  334. // self.allSelectCheck.isChecked = false
  335. // self.allSelectCheckFlag.value = false
  336. // }
  337. // if self.allSelectCheck.isChecked {
  338. // self.allSelectLabel.text = "선택해제"
  339. // } else {
  340. // self.allSelectLabel.text = "전체선택"
  341. // }
  342. self.allSelectCheck.isChecked = !self.allSelectCheck.isChecked
  343. self.allSelectCheckFlag.value = !self.allSelectCheckFlag.value
  344. }
  345. //전체환자 체크박스
  346. func allUserAlbumAction(){
  347. // if self.allUserAlbumLabel.text == "전체환자"{
  348. // self.allUserAlbumLabel.text = "개인환자"
  349. // self.allUserAlbumCheck.isChecked = true
  350. //
  351. // }else{
  352. // self.allUserAlbumLabel.text = "전체환자"
  353. // self.allUserAlbumCheck.isChecked = false
  354. // }
  355. // if self.allUserAlbumCheck.isChecked {
  356. // self.allUserAlbumLabel.text = "개인환자"
  357. // } else {
  358. // self.allUserAlbumLabel.text = "전체환자"
  359. // }
  360. // self.allUserAlbumCheck.isChecked = !self.allUserAlbumCheck.isChecked
  361. self.allSelectCheck.isChecked = false
  362. self.reloadTable()
  363. }
  364. }