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" />