FragmentUploadAction.kt 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. package com.cr.pages
  2. import android.graphics.Color
  3. import android.os.Bundle
  4. import android.view.LayoutInflater
  5. import android.view.View
  6. import android.view.ViewGroup
  7. import android.widget.Button
  8. import android.widget.LinearLayout
  9. import android.widget.ProgressBar
  10. import android.widget.TextView
  11. import cn.carbs.android.segmentcontrolview.library.SegmentControlView
  12. import com.bigkoo.pickerview.adapter.ArrayWheelAdapter
  13. import com.contrarywind.listener.OnItemSelectedListener
  14. import com.cr.common.CrUnitManager
  15. import com.cr.common.DataManager
  16. import com.cr.cruav.CrApplication
  17. import com.cr.cruav.R
  18. import com.cr.data.CrConfig
  19. import com.cr.data.CrUtil
  20. import com.cr.dialog.DialogLoadingUtil
  21. import com.cr.map.CaseModel
  22. import com.cr.map.EventMap
  23. import com.cr.map.MapAction
  24. import com.cr.models.SelModel
  25. import com.cr.models.SubmitCaseModel
  26. import com.cr.network.NetManager
  27. import com.cr.network.TCPDataTask
  28. import com.cr.view.CrViewWheel
  29. import com.cr.widget.CrImageBrowserWidget
  30. import dji.v5.utils.common.ContextUtil
  31. import org.json.JSONArray
  32. /**
  33. * 操作系统:MAC系统
  34. * 创建者:王成
  35. * 创建日期:2023/8/18 10:26
  36. * 描述:案件上传页面
  37. */
  38. class FragmentUploadAction : CrNavigationFragment(), View.OnClickListener {
  39. // todo: 2023/8/18 控件定义
  40. private var btnAsyncCaseType: Button? = null // define: 2023/8/18 同步案件类型按钮
  41. private var btnAsyncCaseDesc: Button? = null // define: 2023/8/18 同步案件描述信息按钮
  42. private var wheelCaseType: CrViewWheel? = null // define: 2023/8/18 案件类型选择器
  43. private var wheelCaseDesc: CrViewWheel? = null // define: 2023/8/18 案件描述选择器
  44. private var lblMessage: TextView? = null // define: 2023/8/23 信息显示
  45. private var lblLongitude: TextView? = null // define: 2023/8/25 经度
  46. private var lblLatitude: TextView? = null // define: 2023/8/25 纬度
  47. private var lblAngle: TextView? = null // define: 2023/8/25 角度
  48. private var lblAltitude: TextView? = null // define: 2023/8/25 高度
  49. private var imageBrowser: CrImageBrowserWidget? = null // define: 2023/8/26 图片浏览器
  50. private var btnSubmit: LinearLayout? = null // define: 2023/8/26 上传按钮
  51. private var progressBar: ProgressBar? = null // define: 2023/8/28 进度条
  52. private var lblProgress: TextView? = null // define: 2023/8/28 进度条文字提示
  53. private var segmentSubmitType: SegmentControlView? = null // define: 2023/9/1 上传方式
  54. private var segmentConstructProgress:SegmentControlView?=null // define: 2023/9/1 建设程度
  55. // todo: 2023/8/23 变量定义
  56. private var caseSubmitDescriptionList: List<SelModel>? = null // define: 2023/8/23 案件上传描述信息列表
  57. private var caseTypeList: List<SelModel>? = null // define: 2023/8/24 案件类型列表
  58. private var adapterCaseType: ArrayWheelAdapter<String>? = null // define: 2023/8/24 案件类型适配器
  59. private var adapterCaseDesc: ArrayWheelAdapter<String>? = null // define: 2023/8/24 案件描述适配器
  60. private var itemsCaseType: MutableList<String>? = null // define: 2023/8/24 案件类型数据集
  61. private var itemsCaseDesc: MutableList<String>? = null // define: 2023/8/24 案件描述信息数据集
  62. private var joinCase: CaseModel? = null // define: 2023/8/25 关联的案件
  63. private var caseType: String? = null // define: 2023/9/1 案件类型
  64. private var caseDesc: String? = null // define: 2023/9/1 案件描述
  65. private var strSubmitType:String = "ADD" // define: 2023/9/1 上传案件方式
  66. private var strConstructProgress:String = "在建" // define: 2023/9/1 建设程度
  67. /**
  68. * 初始化
  69. * @param inflater LayoutInflater
  70. * @param container ViewGroup?
  71. * @param savedInstanceState Bundle?
  72. * @return View?
  73. */
  74. override fun onCreateView(
  75. inflater: LayoutInflater,
  76. container: ViewGroup?,
  77. savedInstanceState: Bundle?
  78. ): View? {
  79. self = this
  80. mainView = inflater.inflate(R.layout.frag_case_upload_upload, null)
  81. // todo: 2023/8/18 挂载控件
  82. joinControls()
  83. // todo: 2023/8/24 初始化页面
  84. initPage()
  85. return mainView
  86. }
  87. /**
  88. * 挂载控件 覆写
  89. */
  90. override fun joinControls() {
  91. super.joinControls()
  92. mainView?.let {
  93. btnAsyncCaseType = it.findViewById(R.id.btn_async_case_type)
  94. btnAsyncCaseDesc = it.findViewById(R.id.btn_async_desc)
  95. btnAsyncCaseType?.setOnClickListener(this)
  96. btnAsyncCaseDesc?.setOnClickListener(this)
  97. wheelCaseType = it.findViewById(R.id.wheel_case_type)
  98. wheelCaseDesc = it.findViewById(R.id.wheel_case_desc)
  99. setWheel(wheelCaseType!!, listenerWheelCaseType)
  100. setWheel(wheelCaseDesc!!, listenerWheelCaseDesc)
  101. lblMessage = it.findViewById(R.id.lbl_message)
  102. lblLongitude = it.findViewById(R.id.lbl_longitude)
  103. lblLatitude = it.findViewById(R.id.lbl_latitude)
  104. lblAngle = it.findViewById(R.id.lbl_angle)
  105. lblAltitude = it.findViewById(R.id.lbl_altitude)
  106. // todo: 2023/8/26 挂接图片浏览器
  107. imageBrowser = it.findViewById(R.id.image_browser)
  108. // todo: 2023/8/26 挂载上传按钮
  109. btnSubmit = it.findViewById(R.id.btn_submit)
  110. btnSubmit?.setOnClickListener(this)
  111. // todo: 2023/8/28 挂载进度条
  112. progressBar = it.findViewById(R.id.progress_bar)
  113. lblProgress = it.findViewById(R.id.lbl_progress)
  114. // todo: 2023/9/1 挂载上传方式及建设程度控件
  115. segmentSubmitType = it.findViewById(R.id.segment_submit_type)
  116. segmentConstructProgress = it.findViewById(R.id.segment_construct_progress)
  117. segmentSubmitType?.setOnSegmentChangedListener(segmentSubmitTypeListener)
  118. segmentConstructProgress?.setOnSegmentChangedListener(segmentConstructProgressListener)
  119. }
  120. }
  121. /**
  122. * 页面初始化
  123. */
  124. override fun initPage() {
  125. super.initPage()
  126. // todo: 2023/8/24 初始化选择器
  127. itemsCaseDesc = mutableListOf()
  128. adapterCaseDesc = ArrayWheelAdapter(itemsCaseDesc)
  129. wheelCaseDesc?.adapter = adapterCaseDesc
  130. // todo: 2023/8/25 同步本地案件描述
  131. syncLocalCaseDescription()
  132. itemsCaseType = mutableListOf()
  133. adapterCaseType = ArrayWheelAdapter(itemsCaseType)
  134. wheelCaseType?.adapter = adapterCaseType
  135. // todo: 2023/8/25 同步显示本地案件类型
  136. syncLocalCaseType()
  137. // todo: 2023/8/25 同步关联案件显示
  138. updateCaseView()
  139. }
  140. /**
  141. * 设置选择器
  142. * @param wheel CrViewWheel 选择器
  143. * @param listener OnItemSelectedListener 监听
  144. */
  145. private fun setWheel(wheel: CrViewWheel, listener: OnItemSelectedListener) {
  146. wheel.setTextColorCenter(Color.YELLOW) // TODO: 4/17/21 设置选中项颜色
  147. wheel.setItemsVisibleCount(5)
  148. wheel.setTextSize(CrUtil.getDimens(R.dimen.sp_6))
  149. wheel.setTypeface(CrUtil.getFont(ContextUtil.getContext()))
  150. wheel.setCyclic(false) // TODO: 6/9/21 禁止循环
  151. wheel.setOnItemSelectedListener(listener)
  152. }
  153. /**
  154. * 案件类型选择器监听
  155. */
  156. private val listenerWheelCaseType = OnItemSelectedListener { index ->
  157. caseType = caseTypeList!![index].name
  158. }
  159. /**
  160. * 案件描述选择器监听
  161. */
  162. private val listenerWheelCaseDesc = OnItemSelectedListener { index ->
  163. caseDesc = caseSubmitDescriptionList!![index].name
  164. }
  165. /**
  166. * 显示消息
  167. * @param message String 消息内容
  168. */
  169. private fun setMessage(message: String) {
  170. mainHandler.post {
  171. lblMessage?.text = "${CrUnitManager.toSystemYMDHMSDate()} $message"
  172. }
  173. }
  174. /**
  175. * 同步本地案件描述信息
  176. */
  177. private fun syncLocalCaseDescription() {
  178. caseSubmitDescriptionList = DataManager.getCaseSubmitDescription()
  179. itemsCaseDesc!!.clear()
  180. for (model in caseSubmitDescriptionList!!) {
  181. itemsCaseDesc?.add(model.name!!)
  182. }
  183. wheelCaseDesc?.setSelectItem(itemsCaseDesc!![0])
  184. wheelCaseDesc?.onItemSelected()
  185. }
  186. /**
  187. * 同步本地案件类型
  188. */
  189. private fun syncLocalCaseType() {
  190. caseTypeList = DataManager.getCaseType()
  191. itemsCaseType!!.clear()
  192. for (model in caseTypeList!!) {
  193. itemsCaseType?.add(model.name!!)
  194. }
  195. wheelCaseType?.setSelectItem("违章建筑")
  196. // todo: 2023/9/1 赋值
  197. wheelCaseType?.onItemSelected()
  198. }
  199. /**
  200. * 同步案件描述信息
  201. */
  202. private fun asyncCaseDescription() {
  203. TCPDataTask.getInstance().sendJSON(
  204. NetManager.getServerUrl("appQueryCaseDescription"),
  205. CrConfig.user!!,
  206. object : TCPDataTask.IChangeCallback {
  207. // todo: 2023/8/23 成功
  208. override fun onSuccess(jsonArray: JSONArray) {
  209. var list = SelModel.fromJSONArray(jsonArray)
  210. if (DataManager.saveCaseSubmitDescription(list!!)) {
  211. setMessage("案件描述信息同步成功!")
  212. syncLocalCaseDescription()
  213. } else {
  214. setMessage("案件描述信息同步成功,本地化存储失败!")
  215. }
  216. }
  217. // todo: 2023/8/23 失败
  218. override fun onFailed(message: String) {
  219. showError(message)
  220. }
  221. },
  222. "获取中..."
  223. )
  224. }
  225. /**
  226. * 同步案件类型信息
  227. */
  228. private fun asyncCaseType() {
  229. TCPDataTask.getInstance().sendJSON(
  230. NetManager.getServerUrl("appQueryCaseSource"),
  231. CrConfig.user!!,
  232. object : TCPDataTask.IChangeCallback {
  233. // todo: 2023/8/23 成功
  234. override fun onSuccess(jsonArray: JSONArray) {
  235. var list = SelModel.fromJSONArray(jsonArray)
  236. if (DataManager.saveCaseType(list!!)) {
  237. setMessage("案件类型同步成功!")
  238. syncLocalCaseType()
  239. } else {
  240. setMessage("案件类型同步成功,本地化存储失败!")
  241. }
  242. }
  243. // todo: 2023/8/23 失败
  244. override fun onFailed(message: String) {
  245. showError(message)
  246. }
  247. },
  248. "获取中..."
  249. )
  250. }
  251. /**
  252. * 重写点击事件
  253. * @param view View 视图
  254. */
  255. override fun onClick(view: View?) {
  256. when (view?.id) {
  257. R.id.btn_async_desc -> {
  258. // todo: 2023/8/23 同步描述信息
  259. asyncCaseDescription()
  260. }
  261. R.id.btn_async_case_type -> {
  262. // todo: 2023/8/24 同步案件类型
  263. asyncCaseType()
  264. }
  265. R.id.btn_submit -> {
  266. // todo: 2023/8/26 提报
  267. submit()
  268. }
  269. }
  270. }
  271. /**
  272. * 检查上传信息
  273. * @return SubmitCaseModel?
  274. */
  275. private fun checkSubmitInfo(): SubmitCaseModel? {
  276. if (caseDesc == null) {
  277. showError("请选择案件描述信息!")
  278. return null
  279. }
  280. if (caseType == null) {
  281. showError("请选择案件类型信息!")
  282. return null
  283. }
  284. var resModel = SubmitCaseModel(CrConfig.user!!.userId!!)
  285. resModel.name = joinCase!!.name!!
  286. resModel.longitude = joinCase!!.longitude!!
  287. resModel.latitude = joinCase!!.latitude!!
  288. resModel.altitude = joinCase!!.altitude!!
  289. resModel.angle = joinCase!!.angle!!
  290. resModel.joinCaseId = joinCase!!.joinNetCaseAJHArray!!.joinToString(",")
  291. resModel.joinPolygon = joinCase!!.joinPolygon!!.coords!!
  292. resModel.caseArea = joinCase!!.joinPolygon!!.area!!
  293. resModel.submitType = strSubmitType
  294. resModel.constructProgress = strConstructProgress
  295. return resModel
  296. }
  297. /**
  298. * 案件上传方式选择监听
  299. */
  300. private val segmentSubmitTypeListener =
  301. SegmentControlView.OnSegmentChangedListener { newSelectedIndex ->
  302. when(newSelectedIndex){
  303. 0->{
  304. strSubmitType = "ADD"
  305. }
  306. 1->{
  307. strSubmitType = "UPP"
  308. }
  309. }
  310. }
  311. /**
  312. * 案件建设程度选择监听
  313. */
  314. private val segmentConstructProgressListener =
  315. SegmentControlView.OnSegmentChangedListener { newSelectedIndex ->
  316. when(newSelectedIndex){
  317. 0->{
  318. strSubmitType = "在建"
  319. }
  320. 1->{
  321. strSubmitType = "完工"
  322. }
  323. }
  324. }
  325. /**
  326. * 提报
  327. */
  328. private fun submit() {
  329. // todo: 2023/9/1 检查上传信息
  330. var submitCaseModel: SubmitCaseModel? = checkSubmitInfo() ?: return
  331. var filePathList = mutableListOf<String>()
  332. // todo: 2023/8/28 加入文件
  333. for (name in joinCase?.imgArray!!) {
  334. filePathList.add("${CrUtil.IMAGE_PATH}${name}")
  335. // todo: 2023/9/1 挂载上报照片名称
  336. submitCaseModel?.submitImages += "${name};"
  337. }
  338. TCPDataTask.getInstance().sendUploadFiles(
  339. NetManager.getServerUrl("appUploadCase"),
  340. filePathList,
  341. submitCaseModel!!,
  342. object : TCPDataTask.IProgressCallback {
  343. // todo: 2023/8/28 开始
  344. override fun onStart() {
  345. DialogLoadingUtil.show(CrApplication.getContext(),"案件上传中...")
  346. }
  347. // todo: 2023/8/28 上传失败
  348. override fun onFailed(message: String) {
  349. DialogLoadingUtil.dismiss()
  350. showError(message)
  351. }
  352. // todo: 2023/8/28 上传进度
  353. override fun onProgress(progress: Long, total: Long) {
  354. progressBar?.max = total.toInt()
  355. progressBar?.progress = progress.toInt()
  356. // todo: 2023/8/31 显示上传进度
  357. var jd = (progress * 1f / total * 1f) * 100;
  358. lblProgress?.text = String.format("%.2f", jd) + "%";
  359. }
  360. // todo: 2023/8/28 上传完成
  361. override fun onSuccess(message: String) {
  362. DialogLoadingUtil.dismiss()
  363. // todo: 2023/9/27 通知地图更新
  364. CrApplication.getEventBus().post(EventMap(MapAction.EventCaseUploadSuccess,joinCase))
  365. // todo: 2023/9/27 底部信息
  366. setMessage(message)
  367. }
  368. })
  369. }
  370. /**
  371. * 更新关联案件信息展示
  372. */
  373. private fun updateCaseView() {
  374. this.joinCase?.let {
  375. // todo: 2023/8/25 设置显示
  376. lblLongitude?.text = String.format("%.6f", it.longitude)
  377. lblLatitude?.text = String.format("%.6f", it.latitude)
  378. lblAngle?.text = String.format("%.3f", it.angle)
  379. lblAltitude?.text = String.format("%.3f", it.altitude)
  380. // todo: 2023/8/26 挂接关联照片
  381. for (fileName in it.imgArray!!) {
  382. val filePath = "${CrUtil.IMAGE_PATH}${fileName}"
  383. imageBrowser?.crAppendImage(filePath)
  384. }
  385. }
  386. }
  387. /**
  388. * 设置关联的案件
  389. * @param joinCase CaseModel 案件
  390. */
  391. fun crSetJoinCase(joinCase: CaseModel) {
  392. this.joinCase = joinCase;
  393. // todo: 2023/9/1 打印
  394. this.joinCase?.joinPolygon?.toString()?.let { CrUtil.print(it) }
  395. updateCaseView()
  396. }
  397. }