diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1e6c783..f45af90 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -60,6 +60,7 @@
+
+
+
(jobId)
+ requireContext().navigatePageTo(jobId)
}
})
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1e6c783..f45af90 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -60,6 +60,7 @@
+
(jobId)
+ requireContext().navigatePageTo(jobId)
}
})
}
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
index a455056..18f54d5 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
@@ -380,4 +380,21 @@
@Field("id") id: String,
@Field("transferPerson") transferPerson: String
): String
+
+ /**
+ * 确认工单
+ * @param id 工单id
+ * @param firstState 现场情况描述
+ * @param firstStatePhotos 现场情况照片路径集合
+ * @param needHandle 是否需要处理,1是需要处理,0是不需要处理(决定转入处理中还是已完成)
+ */
+ @FormUrlEncoded
+ @POST("/job/confirmJob")
+ suspend fun confirmWorkOrder(
+ @Header("token") token: String,
+ @Field("id") id: String,
+ @Field("firstState") firstState: String,
+ @Field("firstStatePhotos") firstStatePhotos: String,
+ @Field("needHandle") needHandle: String
+ ): String
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1e6c783..f45af90 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -60,6 +60,7 @@
+
(jobId)
+ requireContext().navigatePageTo(jobId)
}
})
}
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
index a455056..18f54d5 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
@@ -380,4 +380,21 @@
@Field("id") id: String,
@Field("transferPerson") transferPerson: String
): String
+
+ /**
+ * 确认工单
+ * @param id 工单id
+ * @param firstState 现场情况描述
+ * @param firstStatePhotos 现场情况照片路径集合
+ * @param needHandle 是否需要处理,1是需要处理,0是不需要处理(决定转入处理中还是已完成)
+ */
+ @FormUrlEncoded
+ @POST("/job/confirmJob")
+ suspend fun confirmWorkOrder(
+ @Header("token") token: String,
+ @Field("id") id: String,
+ @Field("firstState") firstState: String,
+ @Field("firstStatePhotos") firstStatePhotos: String,
+ @Field("needHandle") needHandle: String
+ ): String
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
index 2de85eb..786bc4e 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
@@ -335,4 +335,16 @@
suspend fun transferWorkOrder(id: String, userId: String): String {
return api.transferWorkOrder(AuthenticationHelper.token!!, id, userId)
}
+
+ /**
+ * 确认工单
+ */
+ suspend fun confirmWorkOrder(
+ id: String, firstState: String, firstStatePhotos: String, needHandle: String
+ ): String {
+ return api.confirmWorkOrder(
+ AuthenticationHelper.token!!,
+ id, firstState, firstStatePhotos, needHandle
+ )
+ }
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1e6c783..f45af90 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -60,6 +60,7 @@
+
(jobId)
+ requireContext().navigatePageTo(jobId)
}
})
}
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
index a455056..18f54d5 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
@@ -380,4 +380,21 @@
@Field("id") id: String,
@Field("transferPerson") transferPerson: String
): String
+
+ /**
+ * 确认工单
+ * @param id 工单id
+ * @param firstState 现场情况描述
+ * @param firstStatePhotos 现场情况照片路径集合
+ * @param needHandle 是否需要处理,1是需要处理,0是不需要处理(决定转入处理中还是已完成)
+ */
+ @FormUrlEncoded
+ @POST("/job/confirmJob")
+ suspend fun confirmWorkOrder(
+ @Header("token") token: String,
+ @Field("id") id: String,
+ @Field("firstState") firstState: String,
+ @Field("firstStatePhotos") firstStatePhotos: String,
+ @Field("needHandle") needHandle: String
+ ): String
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
index 2de85eb..786bc4e 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
@@ -335,4 +335,16 @@
suspend fun transferWorkOrder(id: String, userId: String): String {
return api.transferWorkOrder(AuthenticationHelper.token!!, id, userId)
}
+
+ /**
+ * 确认工单
+ */
+ suspend fun confirmWorkOrder(
+ id: String, firstState: String, firstStatePhotos: String, needHandle: String
+ ): String {
+ return api.confirmWorkOrder(
+ AuthenticationHelper.token!!,
+ id, firstState, firstStatePhotos, needHandle
+ )
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderNotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderNotConfirmedDetailActivity.kt
new file mode 100644
index 0000000..a34bacf
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderNotConfirmedDetailActivity.kt
@@ -0,0 +1,470 @@
+package com.casic.qd.smartwell.view
+
+import android.content.Context
+import android.os.CountDownTimer
+import android.os.Handler
+import android.text.Editable
+import android.text.TextWatcher
+import android.util.Log
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import androidx.recyclerview.widget.GridLayoutManager
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.adapter.NineGridImageAdapter
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.*
+import com.casic.qd.smartwell.utils.*
+import com.casic.qd.smartwell.vm.AuthenticateViewModel
+import com.casic.qd.smartwell.vm.OperationViewModel
+import com.casic.qd.smartwell.vm.UploadImageViewModel
+import com.casic.qd.smartwell.vm.WorkOrderViewModel
+import com.casic.qd.smartwell.widgets.SingleChoiceDialog
+import com.casic.qd.smartwell.widgets.TimeLineBottomSheet
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.app.multilib.widget.dialog.AlertControlDialog
+import com.pengxh.app.multilib.widget.dialog.AlertMessageDialog
+import com.pengxh.app.multilib.widget.dialog.BottomActionSheet
+import com.qmuiteam.qmui.widget.dialog.QMUITipDialog
+import kotlinx.android.synthetic.main.activity_order_not_confirmed_detail.*
+import kotlinx.android.synthetic.main.include_base_order_detail.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import java.io.File
+
+class OrderNotConfirmedDetailActivity : BaseActivity() {
+
+ private val kTag = "OrderNotConfirmedDetailActivity"
+ private lateinit var workOrderViewModel: WorkOrderViewModel
+ private lateinit var uploadImageViewModel: UploadImageViewModel
+ private lateinit var authenticateViewModel: AuthenticateViewModel
+ private lateinit var operationViewModel: OperationViewModel
+ private lateinit var imageAdapter: NineGridImageAdapter
+ private lateinit var weakReferenceHandler: WeakReferenceHandler
+ private lateinit var jobId: String
+ private lateinit var needHandle: String
+ private val context: Context = this@OrderNotConfirmedDetailActivity
+ private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集
+ private val realPaths: ArrayList = ArrayList() //真实图片路径
+
+ override fun initLayoutView(): Int = R.layout.activity_order_not_confirmed_detail
+
+ override fun setupTopBarLayout() {
+ titleView.text = "工单详情"
+ leftBackView.visibility = View.VISIBLE
+ leftBackView.setOnClickListener { finish() }
+ }
+
+ override fun initData() {
+ jobId = intent.getStringExtra(Constant.INTENT_PARAM)!!
+ //初始化图片九宫格
+ imageAdapter = NineGridImageAdapter(this)
+ addImageRecyclerView.layoutManager = GridLayoutManager(this, 3)
+ addImageRecyclerView.adapter = imageAdapter
+
+ workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java)
+ uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java)
+ authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java)
+ operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java)
+
+ weakReferenceHandler = WeakReferenceHandler(callback)
+ }
+
+ override fun initEvent() {
+ sceneEditView.addTextChangedListener(object : TextWatcher {
+ override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
+
+ }
+
+ override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
+
+ }
+
+ override fun afterTextChanged(s: Editable?) {
+ val text = s.toString().trim()
+ inputLengthView.text = String.format("${text.length}/100")
+ if (text.length > 100) {
+ inputLengthView.setTextColor(R.color.redTextColor.convertColor())
+ "现场情况字符不能超过100个字符".show()
+ } else {
+ inputLengthView.setTextColor(R.color.subTextColor.convertColor())
+ }
+ }
+ })
+
+ workOrderViewModel.obtainWorkOrderDetail(jobId)
+ workOrderViewModel.detailModel.observe(this, {
+ if (it.code == 200) {
+ val orderDetail = it.data!![0]
+ alarmContentView.text = orderDetail.alarmContentName
+ alarmDateView.text = orderDetail.alarmTime
+ orderCodeView.text = orderDetail.jobCode
+ wellCodeView.text = orderDetail.wellCode
+ devCodeView.text = orderDetail.devcode
+ val level = orderDetail.alarmLevel.toString()
+ if (level.isBlank()) {
+ alarmLevelView.text = "未知"
+ alarmLevelView.setTextColor(R.color.mainTextColor.convertColor())
+ } else {
+ alarmLevelView.text = level.toChinese()
+ alarmLevelView.setTextColor(R.color.redTextColor.convertColor())
+ }
+ alarmValueView.text = orderDetail.alarmValue
+ val wellPosition = orderDetail.position.toString()
+ wellLocationView.text = wellPosition
+ if (wellPosition.length > 12) {
+ locationTipsView.visibility = View.VISIBLE
+ locationTipsView.setOnClickListener {
+ AlertMessageDialog.Builder()
+ .setContext(this)
+ .setTitle("窨井完整位置")
+ .setMessage(wellPosition)
+ .setPositiveButton("知道了").setOnDialogButtonClickListener {}.build()
+ .show()
+ }
+ } else {
+ locationTipsView.visibility = View.GONE
+ }
+
+ //工单流转细节
+ val orderFlow = orderDetail.flow!!
+ if (orderFlow.size != 0) {
+ transferOrderButton.visibility = View.GONE
+ transferTipsView.visibility = View.VISIBLE
+ transferTipsView.setOnClickListener {
+ TimeLineBottomSheet.Builder()
+ .setContext(this)
+ .setFlowItems(orderFlow)
+ .build().show()
+ }
+ } else {
+ transferOrderButton.visibility = View.VISIBLE
+ transferTipsView.visibility = View.GONE
+ }
+ acceptDateView.text = orderDetail.getJobTime
+ dispatchDateView.text = orderDetail.createTime
+
+ //转单
+ transferOrderButton.setOnClickListener {
+ authenticateViewModel.obtainSubordinate("0", "leader,member")
+ }
+ authenticateViewModel.subordinateModel.observe(this, { subordinate ->
+ if (subordinate.code == 200) {
+ if (subordinate.data!!.isEmpty()) {
+ "无下级转单人员,无法转单".show()
+ } else {
+ val roleArray: ArrayList = ArrayList() //下级流转人员集合
+ subordinate.data?.forEach { dataBean ->
+ roleArray.add(dataBean.name.toString())
+ }
+ SingleChoiceDialog.Builder()
+ .setContext(this)
+ .setChoiceItemTitles(roleArray)
+ .setOnSingleChoiceClickListener(object :
+ SingleChoiceDialog.OnSingleChoiceClickListener {
+ override fun onItemClick(position: Int) {
+ val personBean = subordinate.data!![position]
+ AlertControlDialog.Builder()
+ .setContext(context)
+ .setTitle("操作提示")
+ .setMessage("确定要转单吗")
+ .setNegativeButton("取消")
+ .setPositiveButton("确定")
+ .setOnDialogButtonClickListener(object :
+ AlertControlDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ val orderId = orderDetail.jobId.toString()
+ if (orderId.isBlank()) {
+ "工单ID异常,无法转单".show()
+ return
+ }
+ operationViewModel.transferWorkOrder(
+ orderId, personBean.id!!
+ )
+ }
+
+ override fun onCancelClick() {
+
+ }
+ }).build().show()
+ }
+ }).build().show()
+ }
+ }
+ })
+
+ //提交
+ submitButton.setOnClickListener {
+ val orderId = orderDetail.jobId.toString()
+ if (orderId.isBlank()) {
+ "工单ID异常,无法确认工单".show()
+ return@setOnClickListener
+ }
+ val state = sceneEditView.text.toString().trim()
+ if (state.isBlank()) {
+ "请输入现场情况".show()
+ return@setOnClickListener
+ }
+ if (state.length > 100) {
+ "请输入少于100个字".show()
+ return@setOnClickListener
+ }
+ if (imagePaths.size == 0) {
+ "请上传现场图片".show()
+ return@setOnClickListener
+ }
+ needHandle = when {
+ normalRadioButton.isChecked -> {
+ "0"
+ }
+ abnormalRadioButton.isChecked -> {
+ "1"
+ }
+ else -> {
+ "请选择窨井当前情况".show()
+ return@setOnClickListener
+ }
+ }
+ //弹窗提示用户
+ AlertControlDialog.Builder()
+ .setContext(this)
+ .setTitle("操作提示")
+ .setMessage("确定要提交吗")
+ .setNegativeButton("取消")
+ .setPositiveButton("确定")
+ .setOnDialogButtonClickListener(object :
+ AlertControlDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ operationViewModel.confirmWorkOrder(
+ orderId, state, imagePaths.reformat(), needHandle
+ )
+ }
+
+ override fun onCancelClick() {
+
+ }
+ }).build().show()
+ }
+ }
+ })
+
+ //数据加载状态处理
+ workOrderViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "数据加载中,请稍后")
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+
+ imageAdapter.setOnItemClickListener(object : NineGridImageAdapter.OnItemClickListener {
+ override fun onAddImageClick() {
+ selectPicture()
+ }
+
+ override fun onItemClick(position: Int) {
+ if (realPaths[position].isEmpty()) {
+ "图片加载失败,无法查看大图".show()
+ } else {
+ context.navigatePageTo(position, realPaths)
+ }
+ }
+
+ override fun onItemLongClick(view: View?, position: Int) {
+ imagePaths.removeAt(position)
+ imageAdapter.deleteImage(position)
+ }
+ })
+ uploadImageViewModel.resultModel.observe(this, {
+ if (it.code == 200) {
+ val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1
+ if (sumItemCount <= 4) {
+ val url = it.data.toString()
+ if (url.isNotBlank()) {
+ imagePaths.add(url)
+ realPaths.add(url.combineImagePath())
+ }
+ imageAdapter.setupImage(realPaths)
+ } else {
+ "最多只能上传3张图片".show()
+ }
+ }
+ })
+ uploadImageViewModel.loadState.observe(this, {
+ dismissLoadingDialog()
+ })
+
+ //转单状态处理
+ operationViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "转单中,请稍后")
+ }
+ is LoadState.Success -> {
+ DialogHelper.dismissLoadingDialog()
+ /**
+ * 转单只需要刷新待确认列表
+ * */
+// BroadcastReceiverManager.instance.sendBroadcast(
+// Constant.NOT_CONFIRMED_ACTION, ""
+// )
+ this.finish()
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+
+ //确认工单状态处理
+ operationViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "处理中,请稍后")
+ }
+ is LoadState.Success -> {
+ DialogHelper.dismissLoadingDialog()
+ /**
+ * 确认工单首先需要刷新待确认列表
+ * 1、如果是提交工单,选择正常,需要刷新已完成列表
+ * 2、如果是提交工单,选择异常,需要刷新处理中列表
+ * */
+// BroadcastReceiverManager.instance.sendBroadcast(
+// Constant.NOT_CONFIRMED_ACTION, ""
+// )
+// if (needHandle == "0") {
+// BroadcastReceiverManager.instance.sendBroadcast(
+// Constant.COMPLETED_ACTION, ""
+// )
+// } else {
+// BroadcastReceiverManager.instance.sendBroadcast(
+// Constant.IN_HANDLE_ACTION, ""
+// )
+// }
+ this.finish()
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ }
+
+ private fun selectPicture() {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitles(arrayOf("拍照", "相册"))
+ .setOnActionSheetListener { position ->
+ when (position) {
+ 0 -> {
+ PictureSelector.create(this)
+ .openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照保存失败,请重试".show()
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ 1 -> {
+ PictureSelector.create(this)
+ .openGallery(SelectMimeType.ofImage())
+ .isGif(false)
+ .isMaxSelectEnabledMask(true)
+ .setFilterMinFileSize(100)
+ .setMaxSelectNum(3)
+ .isDisplayCamera(false)
+ .setImageEngine(GlideLoadEngine.instance)
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ showLoadingDialog(context, "图片上传中,请稍后...")
+ if (result == null) {
+ "选择照片失败,请重试".show()
+ return
+ }
+ // 线程控制图片压缩上传过程,防止速度过快导致压缩失败
+ val sum = (result.size * 500).toLong()
+ object : CountDownTimer(sum, 500) {
+ override fun onTick(millisUntilFinished: Long) {
+ val i = millisUntilFinished / 500
+ val message = weakReferenceHandler.obtainMessage()
+ message.obj = result[i.toInt()]
+ message.what = 2022061702
+ weakReferenceHandler.handleMessage(message)
+ }
+
+ override fun onFinish() {
+
+ }
+ }.start()
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ }
+ }.build().show()
+ }
+
+ private val callback = Handler.Callback {
+ if (it.what == 2022061702) {
+ analyticalSelectResults(it.obj as LocalMedia)
+ }
+ true
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片
+// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
+// result.realPath
+// } else {
+// result.sandboxPath
+// }
+// Log.d(kTag, "初始路径:" + result.path)
+// Log.d(kTag, "绝对路径:" + result.realPath)
+// Log.d(kTag, "原图路径:" + result.originalPath)
+// Log.d(kTag, "沙盒路径:" + result.sandboxPath)
+ result.realPath.compressImage(context, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ Log.d(kTag, "onSuccess: " + file.absolutePath)
+ //上传图片
+ uploadImageViewModel.uploadImage(file)
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+
+ private var loadingDialog: QMUITipDialog? = null
+
+ fun showLoadingDialog(context: Context?, message: String?) {
+ loadingDialog = QMUITipDialog.Builder(context)
+ .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING)
+ .setTipWord(message)
+ .create()
+ loadingDialog!!.show()
+ }
+
+ fun dismissLoadingDialog() {
+ if (loadingDialog != null) {
+ if (loadingDialog!!.isShowing) {
+ loadingDialog!!.dismiss()
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1e6c783..f45af90 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -60,6 +60,7 @@
+
(jobId)
+ requireContext().navigatePageTo(jobId)
}
})
}
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
index a455056..18f54d5 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
@@ -380,4 +380,21 @@
@Field("id") id: String,
@Field("transferPerson") transferPerson: String
): String
+
+ /**
+ * 确认工单
+ * @param id 工单id
+ * @param firstState 现场情况描述
+ * @param firstStatePhotos 现场情况照片路径集合
+ * @param needHandle 是否需要处理,1是需要处理,0是不需要处理(决定转入处理中还是已完成)
+ */
+ @FormUrlEncoded
+ @POST("/job/confirmJob")
+ suspend fun confirmWorkOrder(
+ @Header("token") token: String,
+ @Field("id") id: String,
+ @Field("firstState") firstState: String,
+ @Field("firstStatePhotos") firstStatePhotos: String,
+ @Field("needHandle") needHandle: String
+ ): String
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
index 2de85eb..786bc4e 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
@@ -335,4 +335,16 @@
suspend fun transferWorkOrder(id: String, userId: String): String {
return api.transferWorkOrder(AuthenticationHelper.token!!, id, userId)
}
+
+ /**
+ * 确认工单
+ */
+ suspend fun confirmWorkOrder(
+ id: String, firstState: String, firstStatePhotos: String, needHandle: String
+ ): String {
+ return api.confirmWorkOrder(
+ AuthenticationHelper.token!!,
+ id, firstState, firstStatePhotos, needHandle
+ )
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderNotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderNotConfirmedDetailActivity.kt
new file mode 100644
index 0000000..a34bacf
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderNotConfirmedDetailActivity.kt
@@ -0,0 +1,470 @@
+package com.casic.qd.smartwell.view
+
+import android.content.Context
+import android.os.CountDownTimer
+import android.os.Handler
+import android.text.Editable
+import android.text.TextWatcher
+import android.util.Log
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import androidx.recyclerview.widget.GridLayoutManager
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.adapter.NineGridImageAdapter
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.*
+import com.casic.qd.smartwell.utils.*
+import com.casic.qd.smartwell.vm.AuthenticateViewModel
+import com.casic.qd.smartwell.vm.OperationViewModel
+import com.casic.qd.smartwell.vm.UploadImageViewModel
+import com.casic.qd.smartwell.vm.WorkOrderViewModel
+import com.casic.qd.smartwell.widgets.SingleChoiceDialog
+import com.casic.qd.smartwell.widgets.TimeLineBottomSheet
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.app.multilib.widget.dialog.AlertControlDialog
+import com.pengxh.app.multilib.widget.dialog.AlertMessageDialog
+import com.pengxh.app.multilib.widget.dialog.BottomActionSheet
+import com.qmuiteam.qmui.widget.dialog.QMUITipDialog
+import kotlinx.android.synthetic.main.activity_order_not_confirmed_detail.*
+import kotlinx.android.synthetic.main.include_base_order_detail.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import java.io.File
+
+class OrderNotConfirmedDetailActivity : BaseActivity() {
+
+ private val kTag = "OrderNotConfirmedDetailActivity"
+ private lateinit var workOrderViewModel: WorkOrderViewModel
+ private lateinit var uploadImageViewModel: UploadImageViewModel
+ private lateinit var authenticateViewModel: AuthenticateViewModel
+ private lateinit var operationViewModel: OperationViewModel
+ private lateinit var imageAdapter: NineGridImageAdapter
+ private lateinit var weakReferenceHandler: WeakReferenceHandler
+ private lateinit var jobId: String
+ private lateinit var needHandle: String
+ private val context: Context = this@OrderNotConfirmedDetailActivity
+ private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集
+ private val realPaths: ArrayList = ArrayList() //真实图片路径
+
+ override fun initLayoutView(): Int = R.layout.activity_order_not_confirmed_detail
+
+ override fun setupTopBarLayout() {
+ titleView.text = "工单详情"
+ leftBackView.visibility = View.VISIBLE
+ leftBackView.setOnClickListener { finish() }
+ }
+
+ override fun initData() {
+ jobId = intent.getStringExtra(Constant.INTENT_PARAM)!!
+ //初始化图片九宫格
+ imageAdapter = NineGridImageAdapter(this)
+ addImageRecyclerView.layoutManager = GridLayoutManager(this, 3)
+ addImageRecyclerView.adapter = imageAdapter
+
+ workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java)
+ uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java)
+ authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java)
+ operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java)
+
+ weakReferenceHandler = WeakReferenceHandler(callback)
+ }
+
+ override fun initEvent() {
+ sceneEditView.addTextChangedListener(object : TextWatcher {
+ override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
+
+ }
+
+ override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
+
+ }
+
+ override fun afterTextChanged(s: Editable?) {
+ val text = s.toString().trim()
+ inputLengthView.text = String.format("${text.length}/100")
+ if (text.length > 100) {
+ inputLengthView.setTextColor(R.color.redTextColor.convertColor())
+ "现场情况字符不能超过100个字符".show()
+ } else {
+ inputLengthView.setTextColor(R.color.subTextColor.convertColor())
+ }
+ }
+ })
+
+ workOrderViewModel.obtainWorkOrderDetail(jobId)
+ workOrderViewModel.detailModel.observe(this, {
+ if (it.code == 200) {
+ val orderDetail = it.data!![0]
+ alarmContentView.text = orderDetail.alarmContentName
+ alarmDateView.text = orderDetail.alarmTime
+ orderCodeView.text = orderDetail.jobCode
+ wellCodeView.text = orderDetail.wellCode
+ devCodeView.text = orderDetail.devcode
+ val level = orderDetail.alarmLevel.toString()
+ if (level.isBlank()) {
+ alarmLevelView.text = "未知"
+ alarmLevelView.setTextColor(R.color.mainTextColor.convertColor())
+ } else {
+ alarmLevelView.text = level.toChinese()
+ alarmLevelView.setTextColor(R.color.redTextColor.convertColor())
+ }
+ alarmValueView.text = orderDetail.alarmValue
+ val wellPosition = orderDetail.position.toString()
+ wellLocationView.text = wellPosition
+ if (wellPosition.length > 12) {
+ locationTipsView.visibility = View.VISIBLE
+ locationTipsView.setOnClickListener {
+ AlertMessageDialog.Builder()
+ .setContext(this)
+ .setTitle("窨井完整位置")
+ .setMessage(wellPosition)
+ .setPositiveButton("知道了").setOnDialogButtonClickListener {}.build()
+ .show()
+ }
+ } else {
+ locationTipsView.visibility = View.GONE
+ }
+
+ //工单流转细节
+ val orderFlow = orderDetail.flow!!
+ if (orderFlow.size != 0) {
+ transferOrderButton.visibility = View.GONE
+ transferTipsView.visibility = View.VISIBLE
+ transferTipsView.setOnClickListener {
+ TimeLineBottomSheet.Builder()
+ .setContext(this)
+ .setFlowItems(orderFlow)
+ .build().show()
+ }
+ } else {
+ transferOrderButton.visibility = View.VISIBLE
+ transferTipsView.visibility = View.GONE
+ }
+ acceptDateView.text = orderDetail.getJobTime
+ dispatchDateView.text = orderDetail.createTime
+
+ //转单
+ transferOrderButton.setOnClickListener {
+ authenticateViewModel.obtainSubordinate("0", "leader,member")
+ }
+ authenticateViewModel.subordinateModel.observe(this, { subordinate ->
+ if (subordinate.code == 200) {
+ if (subordinate.data!!.isEmpty()) {
+ "无下级转单人员,无法转单".show()
+ } else {
+ val roleArray: ArrayList = ArrayList() //下级流转人员集合
+ subordinate.data?.forEach { dataBean ->
+ roleArray.add(dataBean.name.toString())
+ }
+ SingleChoiceDialog.Builder()
+ .setContext(this)
+ .setChoiceItemTitles(roleArray)
+ .setOnSingleChoiceClickListener(object :
+ SingleChoiceDialog.OnSingleChoiceClickListener {
+ override fun onItemClick(position: Int) {
+ val personBean = subordinate.data!![position]
+ AlertControlDialog.Builder()
+ .setContext(context)
+ .setTitle("操作提示")
+ .setMessage("确定要转单吗")
+ .setNegativeButton("取消")
+ .setPositiveButton("确定")
+ .setOnDialogButtonClickListener(object :
+ AlertControlDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ val orderId = orderDetail.jobId.toString()
+ if (orderId.isBlank()) {
+ "工单ID异常,无法转单".show()
+ return
+ }
+ operationViewModel.transferWorkOrder(
+ orderId, personBean.id!!
+ )
+ }
+
+ override fun onCancelClick() {
+
+ }
+ }).build().show()
+ }
+ }).build().show()
+ }
+ }
+ })
+
+ //提交
+ submitButton.setOnClickListener {
+ val orderId = orderDetail.jobId.toString()
+ if (orderId.isBlank()) {
+ "工单ID异常,无法确认工单".show()
+ return@setOnClickListener
+ }
+ val state = sceneEditView.text.toString().trim()
+ if (state.isBlank()) {
+ "请输入现场情况".show()
+ return@setOnClickListener
+ }
+ if (state.length > 100) {
+ "请输入少于100个字".show()
+ return@setOnClickListener
+ }
+ if (imagePaths.size == 0) {
+ "请上传现场图片".show()
+ return@setOnClickListener
+ }
+ needHandle = when {
+ normalRadioButton.isChecked -> {
+ "0"
+ }
+ abnormalRadioButton.isChecked -> {
+ "1"
+ }
+ else -> {
+ "请选择窨井当前情况".show()
+ return@setOnClickListener
+ }
+ }
+ //弹窗提示用户
+ AlertControlDialog.Builder()
+ .setContext(this)
+ .setTitle("操作提示")
+ .setMessage("确定要提交吗")
+ .setNegativeButton("取消")
+ .setPositiveButton("确定")
+ .setOnDialogButtonClickListener(object :
+ AlertControlDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ operationViewModel.confirmWorkOrder(
+ orderId, state, imagePaths.reformat(), needHandle
+ )
+ }
+
+ override fun onCancelClick() {
+
+ }
+ }).build().show()
+ }
+ }
+ })
+
+ //数据加载状态处理
+ workOrderViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "数据加载中,请稍后")
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+
+ imageAdapter.setOnItemClickListener(object : NineGridImageAdapter.OnItemClickListener {
+ override fun onAddImageClick() {
+ selectPicture()
+ }
+
+ override fun onItemClick(position: Int) {
+ if (realPaths[position].isEmpty()) {
+ "图片加载失败,无法查看大图".show()
+ } else {
+ context.navigatePageTo(position, realPaths)
+ }
+ }
+
+ override fun onItemLongClick(view: View?, position: Int) {
+ imagePaths.removeAt(position)
+ imageAdapter.deleteImage(position)
+ }
+ })
+ uploadImageViewModel.resultModel.observe(this, {
+ if (it.code == 200) {
+ val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1
+ if (sumItemCount <= 4) {
+ val url = it.data.toString()
+ if (url.isNotBlank()) {
+ imagePaths.add(url)
+ realPaths.add(url.combineImagePath())
+ }
+ imageAdapter.setupImage(realPaths)
+ } else {
+ "最多只能上传3张图片".show()
+ }
+ }
+ })
+ uploadImageViewModel.loadState.observe(this, {
+ dismissLoadingDialog()
+ })
+
+ //转单状态处理
+ operationViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "转单中,请稍后")
+ }
+ is LoadState.Success -> {
+ DialogHelper.dismissLoadingDialog()
+ /**
+ * 转单只需要刷新待确认列表
+ * */
+// BroadcastReceiverManager.instance.sendBroadcast(
+// Constant.NOT_CONFIRMED_ACTION, ""
+// )
+ this.finish()
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+
+ //确认工单状态处理
+ operationViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "处理中,请稍后")
+ }
+ is LoadState.Success -> {
+ DialogHelper.dismissLoadingDialog()
+ /**
+ * 确认工单首先需要刷新待确认列表
+ * 1、如果是提交工单,选择正常,需要刷新已完成列表
+ * 2、如果是提交工单,选择异常,需要刷新处理中列表
+ * */
+// BroadcastReceiverManager.instance.sendBroadcast(
+// Constant.NOT_CONFIRMED_ACTION, ""
+// )
+// if (needHandle == "0") {
+// BroadcastReceiverManager.instance.sendBroadcast(
+// Constant.COMPLETED_ACTION, ""
+// )
+// } else {
+// BroadcastReceiverManager.instance.sendBroadcast(
+// Constant.IN_HANDLE_ACTION, ""
+// )
+// }
+ this.finish()
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ }
+
+ private fun selectPicture() {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitles(arrayOf("拍照", "相册"))
+ .setOnActionSheetListener { position ->
+ when (position) {
+ 0 -> {
+ PictureSelector.create(this)
+ .openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照保存失败,请重试".show()
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ 1 -> {
+ PictureSelector.create(this)
+ .openGallery(SelectMimeType.ofImage())
+ .isGif(false)
+ .isMaxSelectEnabledMask(true)
+ .setFilterMinFileSize(100)
+ .setMaxSelectNum(3)
+ .isDisplayCamera(false)
+ .setImageEngine(GlideLoadEngine.instance)
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ showLoadingDialog(context, "图片上传中,请稍后...")
+ if (result == null) {
+ "选择照片失败,请重试".show()
+ return
+ }
+ // 线程控制图片压缩上传过程,防止速度过快导致压缩失败
+ val sum = (result.size * 500).toLong()
+ object : CountDownTimer(sum, 500) {
+ override fun onTick(millisUntilFinished: Long) {
+ val i = millisUntilFinished / 500
+ val message = weakReferenceHandler.obtainMessage()
+ message.obj = result[i.toInt()]
+ message.what = 2022061702
+ weakReferenceHandler.handleMessage(message)
+ }
+
+ override fun onFinish() {
+
+ }
+ }.start()
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ }
+ }.build().show()
+ }
+
+ private val callback = Handler.Callback {
+ if (it.what == 2022061702) {
+ analyticalSelectResults(it.obj as LocalMedia)
+ }
+ true
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片
+// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
+// result.realPath
+// } else {
+// result.sandboxPath
+// }
+// Log.d(kTag, "初始路径:" + result.path)
+// Log.d(kTag, "绝对路径:" + result.realPath)
+// Log.d(kTag, "原图路径:" + result.originalPath)
+// Log.d(kTag, "沙盒路径:" + result.sandboxPath)
+ result.realPath.compressImage(context, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ Log.d(kTag, "onSuccess: " + file.absolutePath)
+ //上传图片
+ uploadImageViewModel.uploadImage(file)
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+
+ private var loadingDialog: QMUITipDialog? = null
+
+ fun showLoadingDialog(context: Context?, message: String?) {
+ loadingDialog = QMUITipDialog.Builder(context)
+ .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING)
+ .setTipWord(message)
+ .create()
+ loadingDialog!!.show()
+ }
+
+ fun dismissLoadingDialog() {
+ if (loadingDialog != null) {
+ if (loadingDialog!!.isShowing) {
+ loadingDialog!!.dismiss()
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt
index ca8de57..76e2b7e 100644
--- a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt
@@ -29,41 +29,40 @@
it.printStackTrace()
})
-// fun confirmWorkOrder(
-// id: String, firstState: String,
-// firstStatePhotos: String, needHandle: String
-// ) = launch({
-// loadState.value = LoadState.Loading
-// val response =
-// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle)
-// val responseCode = response.separateResponseCode()
-// if (responseCode == 200) {
-// loadState.value = LoadState.Success
-// "工单确认成功".show()
-// } else {
-// loadState.value = LoadState.Fail
-// response.toErrorMessage().show()
-// }
-// }, {
-// loadState.value = LoadState.Fail
-// it.printStackTrace()
-// })
-//
-fun transferWorkOrder(id: String, userId: String) = launch({
- loadState.value = LoadState.Loading
- val response = RetrofitServiceManager.transferWorkOrder(id, userId)
- val responseCode = response.separateResponseCode()
- if (responseCode == 200) {
- loadState.value = LoadState.Success
- "转单成功".show()
- } else {
+ fun confirmWorkOrder(
+ id: String, firstState: String, firstStatePhotos: String, needHandle: String
+ ) = launch({
+ loadState.value = LoadState.Loading
+ val response =
+ RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle)
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ loadState.value = LoadState.Success
+ "工单确认成功".show()
+ } else {
+ loadState.value = LoadState.Fail
+ response.toErrorMessage().show()
+ }
+ }, {
loadState.value = LoadState.Fail
- response.toErrorMessage().show()
- }
-}, {
- loadState.value = LoadState.Fail
- it.printStackTrace()
-})
+ it.printStackTrace()
+ })
+
+ fun transferWorkOrder(id: String, userId: String) = launch({
+ loadState.value = LoadState.Loading
+ val response = RetrofitServiceManager.transferWorkOrder(id, userId)
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ loadState.value = LoadState.Success
+ "转单成功".show()
+ } else {
+ loadState.value = LoadState.Fail
+ response.toErrorMessage().show()
+ }
+ }, {
+ loadState.value = LoadState.Fail
+ it.printStackTrace()
+ })
fun completeOrder(id: String, handleMessage: String, handlePhotos: String) = launch({
loadState.value = LoadState.Loading
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1e6c783..f45af90 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -60,6 +60,7 @@
+
(jobId)
+ requireContext().navigatePageTo(jobId)
}
})
}
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
index a455056..18f54d5 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
@@ -380,4 +380,21 @@
@Field("id") id: String,
@Field("transferPerson") transferPerson: String
): String
+
+ /**
+ * 确认工单
+ * @param id 工单id
+ * @param firstState 现场情况描述
+ * @param firstStatePhotos 现场情况照片路径集合
+ * @param needHandle 是否需要处理,1是需要处理,0是不需要处理(决定转入处理中还是已完成)
+ */
+ @FormUrlEncoded
+ @POST("/job/confirmJob")
+ suspend fun confirmWorkOrder(
+ @Header("token") token: String,
+ @Field("id") id: String,
+ @Field("firstState") firstState: String,
+ @Field("firstStatePhotos") firstStatePhotos: String,
+ @Field("needHandle") needHandle: String
+ ): String
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
index 2de85eb..786bc4e 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
@@ -335,4 +335,16 @@
suspend fun transferWorkOrder(id: String, userId: String): String {
return api.transferWorkOrder(AuthenticationHelper.token!!, id, userId)
}
+
+ /**
+ * 确认工单
+ */
+ suspend fun confirmWorkOrder(
+ id: String, firstState: String, firstStatePhotos: String, needHandle: String
+ ): String {
+ return api.confirmWorkOrder(
+ AuthenticationHelper.token!!,
+ id, firstState, firstStatePhotos, needHandle
+ )
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderNotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderNotConfirmedDetailActivity.kt
new file mode 100644
index 0000000..a34bacf
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderNotConfirmedDetailActivity.kt
@@ -0,0 +1,470 @@
+package com.casic.qd.smartwell.view
+
+import android.content.Context
+import android.os.CountDownTimer
+import android.os.Handler
+import android.text.Editable
+import android.text.TextWatcher
+import android.util.Log
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import androidx.recyclerview.widget.GridLayoutManager
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.adapter.NineGridImageAdapter
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.*
+import com.casic.qd.smartwell.utils.*
+import com.casic.qd.smartwell.vm.AuthenticateViewModel
+import com.casic.qd.smartwell.vm.OperationViewModel
+import com.casic.qd.smartwell.vm.UploadImageViewModel
+import com.casic.qd.smartwell.vm.WorkOrderViewModel
+import com.casic.qd.smartwell.widgets.SingleChoiceDialog
+import com.casic.qd.smartwell.widgets.TimeLineBottomSheet
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.app.multilib.widget.dialog.AlertControlDialog
+import com.pengxh.app.multilib.widget.dialog.AlertMessageDialog
+import com.pengxh.app.multilib.widget.dialog.BottomActionSheet
+import com.qmuiteam.qmui.widget.dialog.QMUITipDialog
+import kotlinx.android.synthetic.main.activity_order_not_confirmed_detail.*
+import kotlinx.android.synthetic.main.include_base_order_detail.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import java.io.File
+
+class OrderNotConfirmedDetailActivity : BaseActivity() {
+
+ private val kTag = "OrderNotConfirmedDetailActivity"
+ private lateinit var workOrderViewModel: WorkOrderViewModel
+ private lateinit var uploadImageViewModel: UploadImageViewModel
+ private lateinit var authenticateViewModel: AuthenticateViewModel
+ private lateinit var operationViewModel: OperationViewModel
+ private lateinit var imageAdapter: NineGridImageAdapter
+ private lateinit var weakReferenceHandler: WeakReferenceHandler
+ private lateinit var jobId: String
+ private lateinit var needHandle: String
+ private val context: Context = this@OrderNotConfirmedDetailActivity
+ private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集
+ private val realPaths: ArrayList = ArrayList() //真实图片路径
+
+ override fun initLayoutView(): Int = R.layout.activity_order_not_confirmed_detail
+
+ override fun setupTopBarLayout() {
+ titleView.text = "工单详情"
+ leftBackView.visibility = View.VISIBLE
+ leftBackView.setOnClickListener { finish() }
+ }
+
+ override fun initData() {
+ jobId = intent.getStringExtra(Constant.INTENT_PARAM)!!
+ //初始化图片九宫格
+ imageAdapter = NineGridImageAdapter(this)
+ addImageRecyclerView.layoutManager = GridLayoutManager(this, 3)
+ addImageRecyclerView.adapter = imageAdapter
+
+ workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java)
+ uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java)
+ authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java)
+ operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java)
+
+ weakReferenceHandler = WeakReferenceHandler(callback)
+ }
+
+ override fun initEvent() {
+ sceneEditView.addTextChangedListener(object : TextWatcher {
+ override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
+
+ }
+
+ override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
+
+ }
+
+ override fun afterTextChanged(s: Editable?) {
+ val text = s.toString().trim()
+ inputLengthView.text = String.format("${text.length}/100")
+ if (text.length > 100) {
+ inputLengthView.setTextColor(R.color.redTextColor.convertColor())
+ "现场情况字符不能超过100个字符".show()
+ } else {
+ inputLengthView.setTextColor(R.color.subTextColor.convertColor())
+ }
+ }
+ })
+
+ workOrderViewModel.obtainWorkOrderDetail(jobId)
+ workOrderViewModel.detailModel.observe(this, {
+ if (it.code == 200) {
+ val orderDetail = it.data!![0]
+ alarmContentView.text = orderDetail.alarmContentName
+ alarmDateView.text = orderDetail.alarmTime
+ orderCodeView.text = orderDetail.jobCode
+ wellCodeView.text = orderDetail.wellCode
+ devCodeView.text = orderDetail.devcode
+ val level = orderDetail.alarmLevel.toString()
+ if (level.isBlank()) {
+ alarmLevelView.text = "未知"
+ alarmLevelView.setTextColor(R.color.mainTextColor.convertColor())
+ } else {
+ alarmLevelView.text = level.toChinese()
+ alarmLevelView.setTextColor(R.color.redTextColor.convertColor())
+ }
+ alarmValueView.text = orderDetail.alarmValue
+ val wellPosition = orderDetail.position.toString()
+ wellLocationView.text = wellPosition
+ if (wellPosition.length > 12) {
+ locationTipsView.visibility = View.VISIBLE
+ locationTipsView.setOnClickListener {
+ AlertMessageDialog.Builder()
+ .setContext(this)
+ .setTitle("窨井完整位置")
+ .setMessage(wellPosition)
+ .setPositiveButton("知道了").setOnDialogButtonClickListener {}.build()
+ .show()
+ }
+ } else {
+ locationTipsView.visibility = View.GONE
+ }
+
+ //工单流转细节
+ val orderFlow = orderDetail.flow!!
+ if (orderFlow.size != 0) {
+ transferOrderButton.visibility = View.GONE
+ transferTipsView.visibility = View.VISIBLE
+ transferTipsView.setOnClickListener {
+ TimeLineBottomSheet.Builder()
+ .setContext(this)
+ .setFlowItems(orderFlow)
+ .build().show()
+ }
+ } else {
+ transferOrderButton.visibility = View.VISIBLE
+ transferTipsView.visibility = View.GONE
+ }
+ acceptDateView.text = orderDetail.getJobTime
+ dispatchDateView.text = orderDetail.createTime
+
+ //转单
+ transferOrderButton.setOnClickListener {
+ authenticateViewModel.obtainSubordinate("0", "leader,member")
+ }
+ authenticateViewModel.subordinateModel.observe(this, { subordinate ->
+ if (subordinate.code == 200) {
+ if (subordinate.data!!.isEmpty()) {
+ "无下级转单人员,无法转单".show()
+ } else {
+ val roleArray: ArrayList = ArrayList() //下级流转人员集合
+ subordinate.data?.forEach { dataBean ->
+ roleArray.add(dataBean.name.toString())
+ }
+ SingleChoiceDialog.Builder()
+ .setContext(this)
+ .setChoiceItemTitles(roleArray)
+ .setOnSingleChoiceClickListener(object :
+ SingleChoiceDialog.OnSingleChoiceClickListener {
+ override fun onItemClick(position: Int) {
+ val personBean = subordinate.data!![position]
+ AlertControlDialog.Builder()
+ .setContext(context)
+ .setTitle("操作提示")
+ .setMessage("确定要转单吗")
+ .setNegativeButton("取消")
+ .setPositiveButton("确定")
+ .setOnDialogButtonClickListener(object :
+ AlertControlDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ val orderId = orderDetail.jobId.toString()
+ if (orderId.isBlank()) {
+ "工单ID异常,无法转单".show()
+ return
+ }
+ operationViewModel.transferWorkOrder(
+ orderId, personBean.id!!
+ )
+ }
+
+ override fun onCancelClick() {
+
+ }
+ }).build().show()
+ }
+ }).build().show()
+ }
+ }
+ })
+
+ //提交
+ submitButton.setOnClickListener {
+ val orderId = orderDetail.jobId.toString()
+ if (orderId.isBlank()) {
+ "工单ID异常,无法确认工单".show()
+ return@setOnClickListener
+ }
+ val state = sceneEditView.text.toString().trim()
+ if (state.isBlank()) {
+ "请输入现场情况".show()
+ return@setOnClickListener
+ }
+ if (state.length > 100) {
+ "请输入少于100个字".show()
+ return@setOnClickListener
+ }
+ if (imagePaths.size == 0) {
+ "请上传现场图片".show()
+ return@setOnClickListener
+ }
+ needHandle = when {
+ normalRadioButton.isChecked -> {
+ "0"
+ }
+ abnormalRadioButton.isChecked -> {
+ "1"
+ }
+ else -> {
+ "请选择窨井当前情况".show()
+ return@setOnClickListener
+ }
+ }
+ //弹窗提示用户
+ AlertControlDialog.Builder()
+ .setContext(this)
+ .setTitle("操作提示")
+ .setMessage("确定要提交吗")
+ .setNegativeButton("取消")
+ .setPositiveButton("确定")
+ .setOnDialogButtonClickListener(object :
+ AlertControlDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ operationViewModel.confirmWorkOrder(
+ orderId, state, imagePaths.reformat(), needHandle
+ )
+ }
+
+ override fun onCancelClick() {
+
+ }
+ }).build().show()
+ }
+ }
+ })
+
+ //数据加载状态处理
+ workOrderViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "数据加载中,请稍后")
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+
+ imageAdapter.setOnItemClickListener(object : NineGridImageAdapter.OnItemClickListener {
+ override fun onAddImageClick() {
+ selectPicture()
+ }
+
+ override fun onItemClick(position: Int) {
+ if (realPaths[position].isEmpty()) {
+ "图片加载失败,无法查看大图".show()
+ } else {
+ context.navigatePageTo(position, realPaths)
+ }
+ }
+
+ override fun onItemLongClick(view: View?, position: Int) {
+ imagePaths.removeAt(position)
+ imageAdapter.deleteImage(position)
+ }
+ })
+ uploadImageViewModel.resultModel.observe(this, {
+ if (it.code == 200) {
+ val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1
+ if (sumItemCount <= 4) {
+ val url = it.data.toString()
+ if (url.isNotBlank()) {
+ imagePaths.add(url)
+ realPaths.add(url.combineImagePath())
+ }
+ imageAdapter.setupImage(realPaths)
+ } else {
+ "最多只能上传3张图片".show()
+ }
+ }
+ })
+ uploadImageViewModel.loadState.observe(this, {
+ dismissLoadingDialog()
+ })
+
+ //转单状态处理
+ operationViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "转单中,请稍后")
+ }
+ is LoadState.Success -> {
+ DialogHelper.dismissLoadingDialog()
+ /**
+ * 转单只需要刷新待确认列表
+ * */
+// BroadcastReceiverManager.instance.sendBroadcast(
+// Constant.NOT_CONFIRMED_ACTION, ""
+// )
+ this.finish()
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+
+ //确认工单状态处理
+ operationViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "处理中,请稍后")
+ }
+ is LoadState.Success -> {
+ DialogHelper.dismissLoadingDialog()
+ /**
+ * 确认工单首先需要刷新待确认列表
+ * 1、如果是提交工单,选择正常,需要刷新已完成列表
+ * 2、如果是提交工单,选择异常,需要刷新处理中列表
+ * */
+// BroadcastReceiverManager.instance.sendBroadcast(
+// Constant.NOT_CONFIRMED_ACTION, ""
+// )
+// if (needHandle == "0") {
+// BroadcastReceiverManager.instance.sendBroadcast(
+// Constant.COMPLETED_ACTION, ""
+// )
+// } else {
+// BroadcastReceiverManager.instance.sendBroadcast(
+// Constant.IN_HANDLE_ACTION, ""
+// )
+// }
+ this.finish()
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ }
+
+ private fun selectPicture() {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitles(arrayOf("拍照", "相册"))
+ .setOnActionSheetListener { position ->
+ when (position) {
+ 0 -> {
+ PictureSelector.create(this)
+ .openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照保存失败,请重试".show()
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ 1 -> {
+ PictureSelector.create(this)
+ .openGallery(SelectMimeType.ofImage())
+ .isGif(false)
+ .isMaxSelectEnabledMask(true)
+ .setFilterMinFileSize(100)
+ .setMaxSelectNum(3)
+ .isDisplayCamera(false)
+ .setImageEngine(GlideLoadEngine.instance)
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ showLoadingDialog(context, "图片上传中,请稍后...")
+ if (result == null) {
+ "选择照片失败,请重试".show()
+ return
+ }
+ // 线程控制图片压缩上传过程,防止速度过快导致压缩失败
+ val sum = (result.size * 500).toLong()
+ object : CountDownTimer(sum, 500) {
+ override fun onTick(millisUntilFinished: Long) {
+ val i = millisUntilFinished / 500
+ val message = weakReferenceHandler.obtainMessage()
+ message.obj = result[i.toInt()]
+ message.what = 2022061702
+ weakReferenceHandler.handleMessage(message)
+ }
+
+ override fun onFinish() {
+
+ }
+ }.start()
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ }
+ }.build().show()
+ }
+
+ private val callback = Handler.Callback {
+ if (it.what == 2022061702) {
+ analyticalSelectResults(it.obj as LocalMedia)
+ }
+ true
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片
+// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
+// result.realPath
+// } else {
+// result.sandboxPath
+// }
+// Log.d(kTag, "初始路径:" + result.path)
+// Log.d(kTag, "绝对路径:" + result.realPath)
+// Log.d(kTag, "原图路径:" + result.originalPath)
+// Log.d(kTag, "沙盒路径:" + result.sandboxPath)
+ result.realPath.compressImage(context, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ Log.d(kTag, "onSuccess: " + file.absolutePath)
+ //上传图片
+ uploadImageViewModel.uploadImage(file)
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+
+ private var loadingDialog: QMUITipDialog? = null
+
+ fun showLoadingDialog(context: Context?, message: String?) {
+ loadingDialog = QMUITipDialog.Builder(context)
+ .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING)
+ .setTipWord(message)
+ .create()
+ loadingDialog!!.show()
+ }
+
+ fun dismissLoadingDialog() {
+ if (loadingDialog != null) {
+ if (loadingDialog!!.isShowing) {
+ loadingDialog!!.dismiss()
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt
index ca8de57..76e2b7e 100644
--- a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt
@@ -29,41 +29,40 @@
it.printStackTrace()
})
-// fun confirmWorkOrder(
-// id: String, firstState: String,
-// firstStatePhotos: String, needHandle: String
-// ) = launch({
-// loadState.value = LoadState.Loading
-// val response =
-// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle)
-// val responseCode = response.separateResponseCode()
-// if (responseCode == 200) {
-// loadState.value = LoadState.Success
-// "工单确认成功".show()
-// } else {
-// loadState.value = LoadState.Fail
-// response.toErrorMessage().show()
-// }
-// }, {
-// loadState.value = LoadState.Fail
-// it.printStackTrace()
-// })
-//
-fun transferWorkOrder(id: String, userId: String) = launch({
- loadState.value = LoadState.Loading
- val response = RetrofitServiceManager.transferWorkOrder(id, userId)
- val responseCode = response.separateResponseCode()
- if (responseCode == 200) {
- loadState.value = LoadState.Success
- "转单成功".show()
- } else {
+ fun confirmWorkOrder(
+ id: String, firstState: String, firstStatePhotos: String, needHandle: String
+ ) = launch({
+ loadState.value = LoadState.Loading
+ val response =
+ RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle)
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ loadState.value = LoadState.Success
+ "工单确认成功".show()
+ } else {
+ loadState.value = LoadState.Fail
+ response.toErrorMessage().show()
+ }
+ }, {
loadState.value = LoadState.Fail
- response.toErrorMessage().show()
- }
-}, {
- loadState.value = LoadState.Fail
- it.printStackTrace()
-})
+ it.printStackTrace()
+ })
+
+ fun transferWorkOrder(id: String, userId: String) = launch({
+ loadState.value = LoadState.Loading
+ val response = RetrofitServiceManager.transferWorkOrder(id, userId)
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ loadState.value = LoadState.Success
+ "转单成功".show()
+ } else {
+ loadState.value = LoadState.Fail
+ response.toErrorMessage().show()
+ }
+ }, {
+ loadState.value = LoadState.Fail
+ it.printStackTrace()
+ })
fun completeOrder(id: String, handleMessage: String, handlePhotos: String) = launch({
loadState.value = LoadState.Loading
diff --git a/app/src/main/res/layout/activity_order_in_handle_detail.xml b/app/src/main/res/layout/activity_order_in_handle_detail.xml
index eebf675..9759156 100644
--- a/app/src/main/res/layout/activity_order_in_handle_detail.xml
+++ b/app/src/main/res/layout/activity_order_in_handle_detail.xml
@@ -1,6 +1,5 @@
+ android:textColor="@color/mainTextColor" />
+
(jobId)
+ requireContext().navigatePageTo(jobId)
}
})
}
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
index a455056..18f54d5 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
@@ -380,4 +380,21 @@
@Field("id") id: String,
@Field("transferPerson") transferPerson: String
): String
+
+ /**
+ * 确认工单
+ * @param id 工单id
+ * @param firstState 现场情况描述
+ * @param firstStatePhotos 现场情况照片路径集合
+ * @param needHandle 是否需要处理,1是需要处理,0是不需要处理(决定转入处理中还是已完成)
+ */
+ @FormUrlEncoded
+ @POST("/job/confirmJob")
+ suspend fun confirmWorkOrder(
+ @Header("token") token: String,
+ @Field("id") id: String,
+ @Field("firstState") firstState: String,
+ @Field("firstStatePhotos") firstStatePhotos: String,
+ @Field("needHandle") needHandle: String
+ ): String
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
index 2de85eb..786bc4e 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
@@ -335,4 +335,16 @@
suspend fun transferWorkOrder(id: String, userId: String): String {
return api.transferWorkOrder(AuthenticationHelper.token!!, id, userId)
}
+
+ /**
+ * 确认工单
+ */
+ suspend fun confirmWorkOrder(
+ id: String, firstState: String, firstStatePhotos: String, needHandle: String
+ ): String {
+ return api.confirmWorkOrder(
+ AuthenticationHelper.token!!,
+ id, firstState, firstStatePhotos, needHandle
+ )
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderNotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderNotConfirmedDetailActivity.kt
new file mode 100644
index 0000000..a34bacf
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderNotConfirmedDetailActivity.kt
@@ -0,0 +1,470 @@
+package com.casic.qd.smartwell.view
+
+import android.content.Context
+import android.os.CountDownTimer
+import android.os.Handler
+import android.text.Editable
+import android.text.TextWatcher
+import android.util.Log
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import androidx.recyclerview.widget.GridLayoutManager
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.adapter.NineGridImageAdapter
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.*
+import com.casic.qd.smartwell.utils.*
+import com.casic.qd.smartwell.vm.AuthenticateViewModel
+import com.casic.qd.smartwell.vm.OperationViewModel
+import com.casic.qd.smartwell.vm.UploadImageViewModel
+import com.casic.qd.smartwell.vm.WorkOrderViewModel
+import com.casic.qd.smartwell.widgets.SingleChoiceDialog
+import com.casic.qd.smartwell.widgets.TimeLineBottomSheet
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import com.pengxh.app.multilib.widget.dialog.AlertControlDialog
+import com.pengxh.app.multilib.widget.dialog.AlertMessageDialog
+import com.pengxh.app.multilib.widget.dialog.BottomActionSheet
+import com.qmuiteam.qmui.widget.dialog.QMUITipDialog
+import kotlinx.android.synthetic.main.activity_order_not_confirmed_detail.*
+import kotlinx.android.synthetic.main.include_base_order_detail.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import java.io.File
+
+class OrderNotConfirmedDetailActivity : BaseActivity() {
+
+ private val kTag = "OrderNotConfirmedDetailActivity"
+ private lateinit var workOrderViewModel: WorkOrderViewModel
+ private lateinit var uploadImageViewModel: UploadImageViewModel
+ private lateinit var authenticateViewModel: AuthenticateViewModel
+ private lateinit var operationViewModel: OperationViewModel
+ private lateinit var imageAdapter: NineGridImageAdapter
+ private lateinit var weakReferenceHandler: WeakReferenceHandler
+ private lateinit var jobId: String
+ private lateinit var needHandle: String
+ private val context: Context = this@OrderNotConfirmedDetailActivity
+ private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集
+ private val realPaths: ArrayList = ArrayList() //真实图片路径
+
+ override fun initLayoutView(): Int = R.layout.activity_order_not_confirmed_detail
+
+ override fun setupTopBarLayout() {
+ titleView.text = "工单详情"
+ leftBackView.visibility = View.VISIBLE
+ leftBackView.setOnClickListener { finish() }
+ }
+
+ override fun initData() {
+ jobId = intent.getStringExtra(Constant.INTENT_PARAM)!!
+ //初始化图片九宫格
+ imageAdapter = NineGridImageAdapter(this)
+ addImageRecyclerView.layoutManager = GridLayoutManager(this, 3)
+ addImageRecyclerView.adapter = imageAdapter
+
+ workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java)
+ uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java)
+ authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java)
+ operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java)
+
+ weakReferenceHandler = WeakReferenceHandler(callback)
+ }
+
+ override fun initEvent() {
+ sceneEditView.addTextChangedListener(object : TextWatcher {
+ override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
+
+ }
+
+ override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
+
+ }
+
+ override fun afterTextChanged(s: Editable?) {
+ val text = s.toString().trim()
+ inputLengthView.text = String.format("${text.length}/100")
+ if (text.length > 100) {
+ inputLengthView.setTextColor(R.color.redTextColor.convertColor())
+ "现场情况字符不能超过100个字符".show()
+ } else {
+ inputLengthView.setTextColor(R.color.subTextColor.convertColor())
+ }
+ }
+ })
+
+ workOrderViewModel.obtainWorkOrderDetail(jobId)
+ workOrderViewModel.detailModel.observe(this, {
+ if (it.code == 200) {
+ val orderDetail = it.data!![0]
+ alarmContentView.text = orderDetail.alarmContentName
+ alarmDateView.text = orderDetail.alarmTime
+ orderCodeView.text = orderDetail.jobCode
+ wellCodeView.text = orderDetail.wellCode
+ devCodeView.text = orderDetail.devcode
+ val level = orderDetail.alarmLevel.toString()
+ if (level.isBlank()) {
+ alarmLevelView.text = "未知"
+ alarmLevelView.setTextColor(R.color.mainTextColor.convertColor())
+ } else {
+ alarmLevelView.text = level.toChinese()
+ alarmLevelView.setTextColor(R.color.redTextColor.convertColor())
+ }
+ alarmValueView.text = orderDetail.alarmValue
+ val wellPosition = orderDetail.position.toString()
+ wellLocationView.text = wellPosition
+ if (wellPosition.length > 12) {
+ locationTipsView.visibility = View.VISIBLE
+ locationTipsView.setOnClickListener {
+ AlertMessageDialog.Builder()
+ .setContext(this)
+ .setTitle("窨井完整位置")
+ .setMessage(wellPosition)
+ .setPositiveButton("知道了").setOnDialogButtonClickListener {}.build()
+ .show()
+ }
+ } else {
+ locationTipsView.visibility = View.GONE
+ }
+
+ //工单流转细节
+ val orderFlow = orderDetail.flow!!
+ if (orderFlow.size != 0) {
+ transferOrderButton.visibility = View.GONE
+ transferTipsView.visibility = View.VISIBLE
+ transferTipsView.setOnClickListener {
+ TimeLineBottomSheet.Builder()
+ .setContext(this)
+ .setFlowItems(orderFlow)
+ .build().show()
+ }
+ } else {
+ transferOrderButton.visibility = View.VISIBLE
+ transferTipsView.visibility = View.GONE
+ }
+ acceptDateView.text = orderDetail.getJobTime
+ dispatchDateView.text = orderDetail.createTime
+
+ //转单
+ transferOrderButton.setOnClickListener {
+ authenticateViewModel.obtainSubordinate("0", "leader,member")
+ }
+ authenticateViewModel.subordinateModel.observe(this, { subordinate ->
+ if (subordinate.code == 200) {
+ if (subordinate.data!!.isEmpty()) {
+ "无下级转单人员,无法转单".show()
+ } else {
+ val roleArray: ArrayList = ArrayList() //下级流转人员集合
+ subordinate.data?.forEach { dataBean ->
+ roleArray.add(dataBean.name.toString())
+ }
+ SingleChoiceDialog.Builder()
+ .setContext(this)
+ .setChoiceItemTitles(roleArray)
+ .setOnSingleChoiceClickListener(object :
+ SingleChoiceDialog.OnSingleChoiceClickListener {
+ override fun onItemClick(position: Int) {
+ val personBean = subordinate.data!![position]
+ AlertControlDialog.Builder()
+ .setContext(context)
+ .setTitle("操作提示")
+ .setMessage("确定要转单吗")
+ .setNegativeButton("取消")
+ .setPositiveButton("确定")
+ .setOnDialogButtonClickListener(object :
+ AlertControlDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ val orderId = orderDetail.jobId.toString()
+ if (orderId.isBlank()) {
+ "工单ID异常,无法转单".show()
+ return
+ }
+ operationViewModel.transferWorkOrder(
+ orderId, personBean.id!!
+ )
+ }
+
+ override fun onCancelClick() {
+
+ }
+ }).build().show()
+ }
+ }).build().show()
+ }
+ }
+ })
+
+ //提交
+ submitButton.setOnClickListener {
+ val orderId = orderDetail.jobId.toString()
+ if (orderId.isBlank()) {
+ "工单ID异常,无法确认工单".show()
+ return@setOnClickListener
+ }
+ val state = sceneEditView.text.toString().trim()
+ if (state.isBlank()) {
+ "请输入现场情况".show()
+ return@setOnClickListener
+ }
+ if (state.length > 100) {
+ "请输入少于100个字".show()
+ return@setOnClickListener
+ }
+ if (imagePaths.size == 0) {
+ "请上传现场图片".show()
+ return@setOnClickListener
+ }
+ needHandle = when {
+ normalRadioButton.isChecked -> {
+ "0"
+ }
+ abnormalRadioButton.isChecked -> {
+ "1"
+ }
+ else -> {
+ "请选择窨井当前情况".show()
+ return@setOnClickListener
+ }
+ }
+ //弹窗提示用户
+ AlertControlDialog.Builder()
+ .setContext(this)
+ .setTitle("操作提示")
+ .setMessage("确定要提交吗")
+ .setNegativeButton("取消")
+ .setPositiveButton("确定")
+ .setOnDialogButtonClickListener(object :
+ AlertControlDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ operationViewModel.confirmWorkOrder(
+ orderId, state, imagePaths.reformat(), needHandle
+ )
+ }
+
+ override fun onCancelClick() {
+
+ }
+ }).build().show()
+ }
+ }
+ })
+
+ //数据加载状态处理
+ workOrderViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "数据加载中,请稍后")
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+
+ imageAdapter.setOnItemClickListener(object : NineGridImageAdapter.OnItemClickListener {
+ override fun onAddImageClick() {
+ selectPicture()
+ }
+
+ override fun onItemClick(position: Int) {
+ if (realPaths[position].isEmpty()) {
+ "图片加载失败,无法查看大图".show()
+ } else {
+ context.navigatePageTo(position, realPaths)
+ }
+ }
+
+ override fun onItemLongClick(view: View?, position: Int) {
+ imagePaths.removeAt(position)
+ imageAdapter.deleteImage(position)
+ }
+ })
+ uploadImageViewModel.resultModel.observe(this, {
+ if (it.code == 200) {
+ val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1
+ if (sumItemCount <= 4) {
+ val url = it.data.toString()
+ if (url.isNotBlank()) {
+ imagePaths.add(url)
+ realPaths.add(url.combineImagePath())
+ }
+ imageAdapter.setupImage(realPaths)
+ } else {
+ "最多只能上传3张图片".show()
+ }
+ }
+ })
+ uploadImageViewModel.loadState.observe(this, {
+ dismissLoadingDialog()
+ })
+
+ //转单状态处理
+ operationViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "转单中,请稍后")
+ }
+ is LoadState.Success -> {
+ DialogHelper.dismissLoadingDialog()
+ /**
+ * 转单只需要刷新待确认列表
+ * */
+// BroadcastReceiverManager.instance.sendBroadcast(
+// Constant.NOT_CONFIRMED_ACTION, ""
+// )
+ this.finish()
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+
+ //确认工单状态处理
+ operationViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "处理中,请稍后")
+ }
+ is LoadState.Success -> {
+ DialogHelper.dismissLoadingDialog()
+ /**
+ * 确认工单首先需要刷新待确认列表
+ * 1、如果是提交工单,选择正常,需要刷新已完成列表
+ * 2、如果是提交工单,选择异常,需要刷新处理中列表
+ * */
+// BroadcastReceiverManager.instance.sendBroadcast(
+// Constant.NOT_CONFIRMED_ACTION, ""
+// )
+// if (needHandle == "0") {
+// BroadcastReceiverManager.instance.sendBroadcast(
+// Constant.COMPLETED_ACTION, ""
+// )
+// } else {
+// BroadcastReceiverManager.instance.sendBroadcast(
+// Constant.IN_HANDLE_ACTION, ""
+// )
+// }
+ this.finish()
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ }
+
+ private fun selectPicture() {
+ BottomActionSheet.Builder()
+ .setContext(this)
+ .setActionItemTitles(arrayOf("拍照", "相册"))
+ .setOnActionSheetListener { position ->
+ when (position) {
+ 0 -> {
+ PictureSelector.create(this)
+ .openCamera(SelectMimeType.ofImage())
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ if (result == null) {
+ "拍照保存失败,请重试".show()
+ return
+ }
+ analyticalSelectResults(result[0])
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ 1 -> {
+ PictureSelector.create(this)
+ .openGallery(SelectMimeType.ofImage())
+ .isGif(false)
+ .isMaxSelectEnabledMask(true)
+ .setFilterMinFileSize(100)
+ .setMaxSelectNum(3)
+ .isDisplayCamera(false)
+ .setImageEngine(GlideLoadEngine.instance)
+ .forResult(object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList?) {
+ showLoadingDialog(context, "图片上传中,请稍后...")
+ if (result == null) {
+ "选择照片失败,请重试".show()
+ return
+ }
+ // 线程控制图片压缩上传过程,防止速度过快导致压缩失败
+ val sum = (result.size * 500).toLong()
+ object : CountDownTimer(sum, 500) {
+ override fun onTick(millisUntilFinished: Long) {
+ val i = millisUntilFinished / 500
+ val message = weakReferenceHandler.obtainMessage()
+ message.obj = result[i.toInt()]
+ message.what = 2022061702
+ weakReferenceHandler.handleMessage(message)
+ }
+
+ override fun onFinish() {
+
+ }
+ }.start()
+ }
+
+ override fun onCancel() {
+
+ }
+ })
+ }
+ }
+ }.build().show()
+ }
+
+ private val callback = Handler.Callback {
+ if (it.what == 2022061702) {
+ analyticalSelectResults(it.obj as LocalMedia)
+ }
+ true
+ }
+
+ private fun analyticalSelectResults(result: LocalMedia) {
+ //压缩图片
+// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
+// result.realPath
+// } else {
+// result.sandboxPath
+// }
+// Log.d(kTag, "初始路径:" + result.path)
+// Log.d(kTag, "绝对路径:" + result.realPath)
+// Log.d(kTag, "原图路径:" + result.originalPath)
+// Log.d(kTag, "沙盒路径:" + result.sandboxPath)
+ result.realPath.compressImage(context, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ Log.d(kTag, "onSuccess: " + file.absolutePath)
+ //上传图片
+ uploadImageViewModel.uploadImage(file)
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+
+ private var loadingDialog: QMUITipDialog? = null
+
+ fun showLoadingDialog(context: Context?, message: String?) {
+ loadingDialog = QMUITipDialog.Builder(context)
+ .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING)
+ .setTipWord(message)
+ .create()
+ loadingDialog!!.show()
+ }
+
+ fun dismissLoadingDialog() {
+ if (loadingDialog != null) {
+ if (loadingDialog!!.isShowing) {
+ loadingDialog!!.dismiss()
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt
index ca8de57..76e2b7e 100644
--- a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt
@@ -29,41 +29,40 @@
it.printStackTrace()
})
-// fun confirmWorkOrder(
-// id: String, firstState: String,
-// firstStatePhotos: String, needHandle: String
-// ) = launch({
-// loadState.value = LoadState.Loading
-// val response =
-// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle)
-// val responseCode = response.separateResponseCode()
-// if (responseCode == 200) {
-// loadState.value = LoadState.Success
-// "工单确认成功".show()
-// } else {
-// loadState.value = LoadState.Fail
-// response.toErrorMessage().show()
-// }
-// }, {
-// loadState.value = LoadState.Fail
-// it.printStackTrace()
-// })
-//
-fun transferWorkOrder(id: String, userId: String) = launch({
- loadState.value = LoadState.Loading
- val response = RetrofitServiceManager.transferWorkOrder(id, userId)
- val responseCode = response.separateResponseCode()
- if (responseCode == 200) {
- loadState.value = LoadState.Success
- "转单成功".show()
- } else {
+ fun confirmWorkOrder(
+ id: String, firstState: String, firstStatePhotos: String, needHandle: String
+ ) = launch({
+ loadState.value = LoadState.Loading
+ val response =
+ RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle)
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ loadState.value = LoadState.Success
+ "工单确认成功".show()
+ } else {
+ loadState.value = LoadState.Fail
+ response.toErrorMessage().show()
+ }
+ }, {
loadState.value = LoadState.Fail
- response.toErrorMessage().show()
- }
-}, {
- loadState.value = LoadState.Fail
- it.printStackTrace()
-})
+ it.printStackTrace()
+ })
+
+ fun transferWorkOrder(id: String, userId: String) = launch({
+ loadState.value = LoadState.Loading
+ val response = RetrofitServiceManager.transferWorkOrder(id, userId)
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ loadState.value = LoadState.Success
+ "转单成功".show()
+ } else {
+ loadState.value = LoadState.Fail
+ response.toErrorMessage().show()
+ }
+ }, {
+ loadState.value = LoadState.Fail
+ it.printStackTrace()
+ })
fun completeOrder(id: String, handleMessage: String, handlePhotos: String) = launch({
loadState.value = LoadState.Loading
diff --git a/app/src/main/res/layout/activity_order_in_handle_detail.xml b/app/src/main/res/layout/activity_order_in_handle_detail.xml
index eebf675..9759156 100644
--- a/app/src/main/res/layout/activity_order_in_handle_detail.xml
+++ b/app/src/main/res/layout/activity_order_in_handle_detail.xml
@@ -1,6 +1,5 @@
+ android:textColor="@color/mainTextColor" />