From 804db17db811558fbcfcb1394306daca2672ce3a Mon Sep 17 00:00:00 2001 From: songzhiling <17630035658@163.com> Date: Wed, 14 May 2025 09:39:33 +0800 Subject: [PATCH] =?UTF-8?q?feat(servicing):=20=E6=9B=B4=E6=96=B0=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E7=9B=B8=E5=85=B3=E5=8A=9F=E8=83=BD=E5=92=8C=E7=95=8C?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加推送服务以支持消息推送 - 优化电子签名功能,修复相关问题 - 更新订单状态处理逻辑 -重构部分代码以提高可维护性 - 调整界面样式,优化用户体验 --- .../main/java/com/za/sdk/demo/MainActivity.kt | 2 +- servicing/build.gradle | 2 +- servicing/src/main/AndroidManifest.xml | 6 + .../com/za/bean/db/order/PhotoTemplateInfo.kt | 1 + .../src/main/java/com/za/room/RoomHelper.kt | 2 +- .../com/za/signature/GridPaintActivity.java | 4 +- .../com/za/signature/util/BitmapUtil.java | 7 +- .../java/com/za/ui/new_order/NewOrderVm.kt | 3 +- .../ui/order_report/ReportFloatingManager.kt | 2 +- .../com/za/ui/servicing/ele_sign/EleSignVm.kt | 280 ++++----- .../go_accident/GoAccidentSiteActivity.kt | 5 +- .../servicing/go_accident/GoAccidentSiteVm.kt | 4 +- .../GoToDestinationActivity.kt | 5 +- .../go_to_destination/GoToDestinationVm.kt | 4 +- .../OrderDetailItemScreen.kt | 458 +++++++++----- .../in_servicing_setting/OrderDetailScreen.kt | 132 ++-- .../OrderRequirementsScreen.kt | 164 ++--- .../InServicePeopleConfirmActivity.kt | 2 +- .../ServicePeopleConfirmScreen.kt | 12 +- .../servicing/order_confirm/ConfirmEleVm.kt | 11 +- .../servicing/order_give_up/OrderGiveUpVm.kt | 593 +++++++++--------- .../servicing/view/InServicingBottomView.kt | 76 ++- .../wait_to_start/WaitToStartActivity.kt | 11 +- .../servicing/wait_to_start/WaitToStartVm.kt | 29 +- .../src/main/res/drawable/sv_customer.xml | 30 + .../src/main/res/drawable/sv_map_dist.xml | 15 + .../src/main/res/drawable/sv_navigation.xml | 33 +- .../src/main/res/drawable/sv_order_report.xml | 48 ++ .../main/res/drawable/sv_service_phone.xml | 36 ++ .../layout-land/sign_activity_grid_paint.xml | 3 +- .../main/res/layout/floating_view_layout.xml | 2 +- .../res/layout/sign_activity_grid_paint.xml | 10 +- servicing/src/main/res/values/colors.xml | 2 +- 33 files changed, 1185 insertions(+), 809 deletions(-) create mode 100644 servicing/src/main/res/drawable/sv_customer.xml create mode 100644 servicing/src/main/res/drawable/sv_map_dist.xml create mode 100644 servicing/src/main/res/drawable/sv_order_report.xml create mode 100644 servicing/src/main/res/drawable/sv_service_phone.xml diff --git a/app/src/main/java/com/za/sdk/demo/MainActivity.kt b/app/src/main/java/com/za/sdk/demo/MainActivity.kt index 9389713..f4cc486 100644 --- a/app/src/main/java/com/za/sdk/demo/MainActivity.kt +++ b/app/src/main/java/com/za/sdk/demo/MainActivity.kt @@ -27,7 +27,7 @@ class MainActivity : ComponentActivity() { .fillMaxSize() .clickable { val uri = - "zd.assist://app?taskCode=ZD250429100095&driverName=宋志领&driverPhone=17630035658&rescueVehicle=沪88888".toUri() + "zd.assist://app?taskCode=ZD250512100030&driverName=宋志领&driverPhone=17630035658&rescueVehicle=沪88888".toUri() val intent = Intent(Intent.ACTION_VIEW, uri) startActivity(intent) } diff --git a/servicing/build.gradle b/servicing/build.gradle index 9c3b1de..ceef4fc 100644 --- a/servicing/build.gradle +++ b/servicing/build.gradle @@ -73,7 +73,7 @@ publishing { release(MavenPublication) { groupId = 'io.github.szl9' artifactId = 'zd_servicing' - version = "1.0.1.9.9.57" + version = "1.0.1.9.9.63" pom { packaging = "aar" diff --git a/servicing/src/main/AndroidManifest.xml b/servicing/src/main/AndroidManifest.xml index a0f1d51..37f85ef 100644 --- a/servicing/src/main/AndroidManifest.xml +++ b/servicing/src/main/AndroidManifest.xml @@ -197,6 +197,12 @@ android:exported="false" android:theme="@style/Theme.Dealer" /> + + + () { if (jpushBean?.distLat != null && jpushBean.distLat != 0.0 && jpushBean.distLng != null && jpushBean.distLng != 0.0) { val startMarkers = MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.mipmap.sv_dist_map)) + .icon(ImageUtil.vectorToBitmap(ActivityUtils.getTopActivity(), R.drawable.sv_map_dist)) .position(LatLng(jpushBean.distLat, jpushBean.distLng)) .title(jpushBean.distAddress) .snippet("目的地") diff --git a/servicing/src/main/java/com/za/ui/order_report/ReportFloatingManager.kt b/servicing/src/main/java/com/za/ui/order_report/ReportFloatingManager.kt index 15be03c..8fe0c21 100644 --- a/servicing/src/main/java/com/za/ui/order_report/ReportFloatingManager.kt +++ b/servicing/src/main/java/com/za/ui/order_report/ReportFloatingManager.kt @@ -100,7 +100,7 @@ class ReportFloatingManager : Service() { // 设置应用图标 floatingView?.findViewById(R.id.floating_image) - ?.setImageResource(R.mipmap.ic_customer) + ?.setImageResource(R.drawable.sv_order_report) windowManager?.addView(floatingView, params) animateWindowAppear() diff --git a/servicing/src/main/java/com/za/ui/servicing/ele_sign/EleSignVm.kt b/servicing/src/main/java/com/za/ui/servicing/ele_sign/EleSignVm.kt index 1532d4a..389c937 100644 --- a/servicing/src/main/java/com/za/ui/servicing/ele_sign/EleSignVm.kt +++ b/servicing/src/main/java/com/za/ui/servicing/ele_sign/EleSignVm.kt @@ -22,164 +22,158 @@ import kotlinx.coroutines.flow.MutableStateFlow import java.io.File class EleSignVm : IServicingVm() { - private val _uiState = MutableStateFlow(UiState()) - val uiState get() = _uiState - override fun updateState(uiState: UiState) { - _uiState.value = uiState - } + private val _uiState = MutableStateFlow(UiState()) + val uiState get() = _uiState + override fun updateState(uiState : UiState) { + _uiState.value = uiState + } - override fun dispatch(action: Action) { - when (action) { - is Action.Init -> init() - is Action.UpdateState -> updateState(action.uiState) - is Action.Upload -> upload() - is Action.UploadSignature -> uploadSignature(action.path) - is Action.UploadOffline -> uploadOffline() - } - } + override fun dispatch(action : Action) { + when (action) { + is Action.Init -> init() + is Action.UpdateState -> updateState(action.uiState) + is Action.Upload -> upload() + is Action.UploadSignature -> uploadSignature(action.path) + is Action.UploadOffline -> uploadOffline() + } + } - private fun uploadOffline() { - val eleWorkOrderBean = RoomHelper.db?.eleWorkOrderDao()?.getEleWorkOrder(getCurrentOrder()?.taskId - ?: 0) - if (eleWorkOrderBean == null) { - ToastUtils.showLong("数据获取失败,请返回首页重试!") - return - } + private fun uploadOffline() { + val eleWorkOrderBean = + RoomHelper.db?.eleWorkOrderDao()?.getEleWorkOrder(getCurrentOrder()?.taskId ?: 0) + if (eleWorkOrderBean == null) { + ToastUtils.showLong("数据获取失败,请返回首页重试!") + return + } - if (uiState.value.eleWorkOrderBean?.serverCustomSignPath.isNullOrBlank()) { - val signOfflineUpdateTaskBean = OfflineUpdateTaskBean( - imageLocalPath = uiState.value.eleWorkOrderBean?.localCustomSignPath, - taskId = getCurrentOrder()?.taskId, - taskCode = getCurrentOrder()?.taskCode, - offlineTitle = "电子工单-客户签名照片", - offlineType = 5 - ) - insertOfflineTask(signOfflineUpdateTaskBean) - } + if (uiState.value.eleWorkOrderBean?.serverCustomSignPath.isNullOrBlank()) { + val signOfflineUpdateTaskBean = + OfflineUpdateTaskBean(imageLocalPath = uiState.value.eleWorkOrderBean?.localCustomSignPath, + taskId = getCurrentOrder()?.taskId, + taskCode = getCurrentOrder()?.taskCode, + offlineTitle = "电子工单-客户签名照片", + offlineType = 5) + insertOfflineTask(signOfflineUpdateTaskBean) + } - val offlineUpdateTaskBean = OfflineUpdateTaskBean( - taskId = getCurrentOrder()?.taskId, - taskCode = getCurrentOrder()?.taskCode, - customerSignPath = uiState.value.eleWorkOrderBean?.serverCustomSignPath, - offlineTitle = "电子工单-车况检查表", - offlineType = 3, - eleState = 2, - userOrderId = getCurrentOrder()?.userOrderId - ) - insertOfflineTask(offlineUpdateTaskBean) - updateCurrentEleWorkOrder(eleWorkOrderBean.copy(orderWorkStatus = 2)) - updateState(uiState.value.copy(goNextPage = UpdateTaskBean(getCurrentOrder()?.taskState), orderInfo = getCurrentOrder())) - } + val offlineUpdateTaskBean = OfflineUpdateTaskBean(taskId = getCurrentOrder()?.taskId, + taskCode = getCurrentOrder()?.taskCode, + customerSignPath = uiState.value.eleWorkOrderBean?.serverCustomSignPath, + offlineTitle = "电子工单-车况检查表", + offlineType = 3, + eleState = 2, + userOrderId = getCurrentOrder()?.userOrderId) + insertOfflineTask(offlineUpdateTaskBean) + updateCurrentEleWorkOrder(eleWorkOrderBean.copy(orderWorkStatus = 2)) + updateState(uiState.value.copy(goNextPage = UpdateTaskBean(getCurrentOrder()?.taskState), + orderInfo = getCurrentOrder())) + } - private fun uploadSignature(path: String) { - LoadingManager.showLoading() - val eleWorkOrderBean = uiState.value.eleWorkOrderBean?.copy(localCustomSignPath = path) - if (eleWorkOrderBean != null) { - RoomHelper.db?.eleWorkOrderDao()?.update(eleWorkOrderBean) - updateState(uiState.value.copy(eleWorkOrderBean = eleWorkOrderBean)) - LogUtil.print("uploadSignature success", eleWorkOrderBean.toJson() ?: "") - } - CommonMethod.uploadImage(File(path), - success = { - LoadingManager.hideLoading() - if (eleWorkOrderBean != null) { - val temp = eleWorkOrderBean.copy(serverCustomSignPath = it) - RoomHelper.db?.eleWorkOrderDao()?.update(temp) - updateState(uiState.value.copy(eleWorkOrderBean = temp)) - LogUtil.print("uploadSignature success", temp.toJson() ?: "") - } - }, - failed = { - LoadingManager.hideLoading() - LogUtil.print("uploadSignature", "failed==$it") - }) - } + private fun uploadSignature(path : String) { + LoadingManager.showLoading() + val eleWorkOrderBean = uiState.value.eleWorkOrderBean?.copy(localCustomSignPath = path) + if (eleWorkOrderBean != null) { + RoomHelper.db?.eleWorkOrderDao()?.update(eleWorkOrderBean) + updateState(uiState.value.copy(eleWorkOrderBean = eleWorkOrderBean)) + LogUtil.print("uploadSignature success", eleWorkOrderBean.toJson() ?: "") + } + CommonMethod.uploadImage(File(path), success = { + LoadingManager.hideLoading() + if (eleWorkOrderBean != null) { + val temp = eleWorkOrderBean.copy(serverCustomSignPath = it) + RoomHelper.db?.eleWorkOrderDao()?.update(temp) + updateState(uiState.value.copy(eleWorkOrderBean = temp)) + LogUtil.print("uploadSignature success", temp.toJson() ?: "") + } + }, failed = { + LoadingManager.hideLoading() + LogUtil.print("uploadSignature", "failed==$it") + }) + } - private fun upload() { - val eleWorkOrderBean = RoomHelper.db?.eleWorkOrderDao()?.getEleWorkOrder(getCurrentOrder()?.taskId - ?: 0) - if (eleWorkOrderBean == null) { - ToastUtils.showLong("数据获取失败,请返回首页重试!") - return - } + private fun upload() { + val eleWorkOrderBean = + RoomHelper.db?.eleWorkOrderDao()?.getEleWorkOrder(getCurrentOrder()?.taskId ?: 0) + if (eleWorkOrderBean == null) { + ToastUtils.showLong("数据获取失败,请返回首页重试!") + return + } - if (uiState.value.eleWorkOrderBean?.localCustomSignPath.isNullOrBlank()) { - ToastUtils.showLong("签名照不能为空!!") - return - } + if (uiState.value.eleWorkOrderBean?.localCustomSignPath.isNullOrBlank()) { + ToastUtils.showLong("签名照不能为空!!") + return + } - if (getCurrentOrderOfflineTask() != null) { - uploadOffline() - return - } + if (! getCurrentOrderOfflineTask().isNullOrEmpty()) { + uploadOffline() + return + } - if (!uiState.value.eleWorkOrderBean?.localCustomSignPath.isNullOrBlank() && uiState.value.eleWorkOrderBean?.serverCustomSignPath.isNullOrBlank()) { - updateState(uiState.value.copy(showOfflineDialog = true)) - return - } + if (! uiState.value.eleWorkOrderBean?.localCustomSignPath.isNullOrBlank() && uiState.value.eleWorkOrderBean?.serverCustomSignPath.isNullOrBlank()) { + showTipDialog("请先上传签名!") + return + } - val saveEleOrderRequest = SaveEleOrderRequest( - state = 2, - userOrderId = getCurrentOrder()?.userOrderId, - taskOrderId = getCurrentOrder()?.taskId, - customerSignPath = uiState.value.eleWorkOrderBean?.serverCustomSignPath - ) + val saveEleOrderRequest = SaveEleOrderRequest(state = 2, + userOrderId = getCurrentOrder()?.userOrderId, + taskOrderId = getCurrentOrder()?.taskId, + customerSignPath = uiState.value.eleWorkOrderBean?.serverCustomSignPath) - LoadingManager.showLoading() - RetrofitHelper.getDefaultService().saveElectronOrder(saveEleOrderRequest) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : BaseObserver() { - override fun doSuccess(it: String?) { - LoadingManager.hideLoading() - updateCurrentEleWorkOrder(eleWorkOrderBean.copy(orderWorkStatus = 2)) - updateState(uiState.value.copy(goNextPage = UpdateTaskBean(getCurrentOrder()?.taskState), orderInfo = getCurrentOrder())) - } + LoadingManager.showLoading() + RetrofitHelper.getDefaultService().saveElectronOrder(saveEleOrderRequest) + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : BaseObserver() { + override fun doSuccess(it : String?) { + LoadingManager.hideLoading() + updateCurrentEleWorkOrder(eleWorkOrderBean.copy(orderWorkStatus = 2)) + updateState(uiState.value.copy(goNextPage = UpdateTaskBean(getCurrentOrder()?.taskState), + orderInfo = getCurrentOrder())) + } - override fun doFailure(code: Int, msg: String?) { - LoadingManager.hideLoading() - ToastUtils.showShort(msg) - if (code == Const.NetWorkException) { - updateState(uiState.value.copy(showOfflineDialog = true)) - } - LogUtil.print("eleSign upload failed", msg ?: "") - } - }) - } + override fun doFailure(code : Int, msg : String?) { + LoadingManager.hideLoading() + ToastUtils.showShort(msg) + if (code == Const.NetWorkException) { + updateState(uiState.value.copy(showOfflineDialog = true)) + } + LogUtil.print("eleSign upload failed", msg ?: "") + } + }) + } - private fun init() { - LoadingManager.showLoading() - CommonMethod.queryElectronOrder(getCurrentOrder(), - success = { - LoadingManager.hideLoading() - val photoList = RoomHelper.db?.eleCarDamagePhotoDao()?.getEleCarDamagePhotos(getCurrentOrder()?.taskId - ?: 0) - updateState(uiState.value.copy(eleWorkOrderBean = it, damagePhoto = photoList, orderInfo = getCurrentOrder())) - LogUtil.print("电子表单更新车辆损伤照片", "eleWorkOrderBean==${it.toJson()}") - }, - failed = { - LoadingManager.hideLoading() - ToastUtils.showShort("数据加载异常,请返回重试!") - }) - } + private fun init() { + LoadingManager.showLoading() + CommonMethod.queryElectronOrder(getCurrentOrder(), success = { + LoadingManager.hideLoading() + val photoList = RoomHelper.db?.eleCarDamagePhotoDao() + ?.getEleCarDamagePhotos(getCurrentOrder()?.taskId ?: 0) + updateState(uiState.value.copy(eleWorkOrderBean = it, + damagePhoto = photoList, + orderInfo = getCurrentOrder())) + LogUtil.print("电子表单更新车辆损伤照片", "eleWorkOrderBean==${it.toJson()}") + }, failed = { + LoadingManager.hideLoading() + ToastUtils.showShort("数据加载异常,请返回重试!") + }) + } - sealed class Action { - data object Init : Action() - data class UpdateState(val uiState: UiState) : Action() - data object Upload : Action() - data object UploadOffline : Action() - data class UploadSignature(val path: String) : Action() - } + sealed class Action { + data object Init : Action() + data class UpdateState(val uiState : UiState) : Action() + data object Upload : Action() + data object UploadOffline : Action() + data class UploadSignature(val path : String) : Action() + } - data class UiState( - val orderInfo: OrderInfo? = null, - val eleWorkOrderBean: EleWorkOrderBean? = null, - val goNextPage: UpdateTaskBean? = null, - val isGoNextPageDialog: Boolean? = null, - val showCallPhoneDialog: Boolean? = null, - val showOfflineDialog: Boolean? = null, - val damagePhoto: List? = null, - ) + data class UiState( + val orderInfo : OrderInfo? = null, + val eleWorkOrderBean : EleWorkOrderBean? = null, + val goNextPage : UpdateTaskBean? = null, + val isGoNextPageDialog : Boolean? = null, + val showCallPhoneDialog : Boolean? = null, + val showOfflineDialog : Boolean? = null, + val damagePhoto : List? = null, + ) } \ No newline at end of file diff --git a/servicing/src/main/java/com/za/ui/servicing/go_accident/GoAccidentSiteActivity.kt b/servicing/src/main/java/com/za/ui/servicing/go_accident/GoAccidentSiteActivity.kt index f466bea..293444e 100644 --- a/servicing/src/main/java/com/za/ui/servicing/go_accident/GoAccidentSiteActivity.kt +++ b/servicing/src/main/java/com/za/ui/servicing/go_accident/GoAccidentSiteActivity.kt @@ -65,6 +65,7 @@ import com.za.ext.finish import com.za.ext.goNextPage import com.za.servicing.R import com.za.ui.servicing.view.InServicingHeadView +import com.za.ui.servicing.view.ServiceOperation class GoAccidentSiteActivity : BaseActivity() { @Composable @@ -354,7 +355,7 @@ fun GoAccidentSiteScreen(vm : GoAccidentSiteVm = viewModel()) { if (order.distLat != null && order.distLat != 0.0 && order.distLng != null && order.distLng != 0.0) { mapView.map.addMarker(MarkerOptions().position(LatLng(order.distLat !!, order.distLng !!)).title("目的地") - .icon(BitmapDescriptorFactory.fromResource(R.mipmap.sv_dist_map)) + .icon(ImageUtil.vectorToBitmap(context, R.drawable.sv_map_dist)) .anchor(0.5f, 0.5f)) } } @@ -385,6 +386,8 @@ fun GoAccidentSiteScreen(vm : GoAccidentSiteVm = viewModel()) { } } }) + + ServiceOperation(orderInfo = uiState.value.orderInfo) } } } \ No newline at end of file diff --git a/servicing/src/main/java/com/za/ui/servicing/go_accident/GoAccidentSiteVm.kt b/servicing/src/main/java/com/za/ui/servicing/go_accident/GoAccidentSiteVm.kt index 09d7b91..9da2acb 100644 --- a/servicing/src/main/java/com/za/ui/servicing/go_accident/GoAccidentSiteVm.kt +++ b/servicing/src/main/java/com/za/ui/servicing/go_accident/GoAccidentSiteVm.kt @@ -11,6 +11,7 @@ import com.amap.api.services.route.DriveRouteResult import com.amap.api.services.route.RideRouteResult import com.amap.api.services.route.RouteSearch import com.amap.api.services.route.WalkRouteResult +import com.blankj.utilcode.util.ActivityUtils import com.blankj.utilcode.util.ToastUtils import com.za.base.Const import com.za.base.IServicingVm @@ -20,6 +21,7 @@ import com.za.bean.request.UpdateTaskBean import com.za.bean.request.UpdateTaskRequest import com.za.common.GlobalData import com.za.common.log.LogUtil +import com.za.common.util.ImageUtil import com.za.ext.getNextStatus import com.za.ext.toJson import com.za.net.CommonMethod @@ -152,7 +154,7 @@ class GoAccidentSiteVm : IServicingVm(null) } - if (showChoiceMapDialog != null) { - ChoiceMapDialog( - dismiss = { showChoiceMapDialog = null }, - lat = orderInfo?.lat.takeIf { showChoiceMapDialog == 1 } ?: orderInfo?.distLat, - lng = orderInfo?.lng.takeIf { showChoiceMapDialog == 1 } ?: orderInfo?.distLng, - address = orderInfo?.address.takeIf { showChoiceMapDialog == 1 } - ?: orderInfo?.distAddress, - ) - } + // 1 事发地 2 目的地 + var showChoiceMapDialog by remember { mutableStateOf(null) } + if (showChoiceMapDialog != null) { + ChoiceMapDialog( + dismiss = { showChoiceMapDialog = null }, + lat = orderInfo?.lat.takeIf { showChoiceMapDialog == 1 } ?: orderInfo?.distLat, + lng = orderInfo?.lng.takeIf { showChoiceMapDialog == 1 } ?: orderInfo?.distLng, + address = orderInfo?.address.takeIf { showChoiceMapDialog == 1 } + ?: orderInfo?.distAddress, + ) + } - Column(modifier = Modifier - .fillMaxWidth() - .background(color = Color.White, shape = RoundedCornerShape(4.dp)) - .padding(10.dp), verticalArrangement = Arrangement.Top) { - Box(contentAlignment = Alignment.CenterStart) { - Text(text = "服务信息", color = Color.Black, fontWeight = FontWeight.Medium, fontSize = 16.sp) - } - HorizontalDivider(color = black5, modifier = Modifier.padding(vertical = 10.dp)) + Column(modifier = Modifier + .fillMaxWidth() + .background(color = Color.White, shape = RoundedCornerShape(4.dp)) + .padding(10.dp), + verticalArrangement = Arrangement.Top) { + Box(contentAlignment = Alignment.CenterStart) { + Text(text = "服务信息", + color = Color.Black, + fontWeight = FontWeight.Medium, + fontSize = 16.sp) + } + HorizontalDivider(color = black5, modifier = Modifier.padding(vertical = 10.dp)) - Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { - Text(text = "服务类型", color = titleColor, fontSize = titleSize, fontWeight = FontWeight.Medium, modifier = Modifier.width(75.dp)) - Spacer(modifier = Modifier.width(5.dp)) - Text(text = "${orderInfo?.serviceTypeName}", color = contentColor, fontSize = titleSize, fontWeight = FontWeight.Medium) - } + Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { + Text(text = "服务类型", + color = titleColor, + fontSize = titleSize, + fontWeight = FontWeight.Medium, + modifier = Modifier.width(75.dp)) + Spacer(modifier = Modifier.width(5.dp)) + Text(text = "${orderInfo?.serviceTypeName}", + color = contentColor, + fontSize = titleSize, + fontWeight = FontWeight.Medium) + } - Spacer(modifier = Modifier.height(10.dp)) - Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { - Text(text = "车辆位于", color = titleColor, fontSize = titleSize, fontWeight = FontWeight.Medium, modifier = Modifier.width(75.dp)) - Spacer(modifier = Modifier.width(5.dp)) - Text(text = "${orderInfo?.addressProperty}", color = contentColor, fontSize = titleSize, fontWeight = FontWeight.Medium) - } - Spacer(modifier = Modifier.height(10.dp)) - Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.Top) { - Text(text = "事发地", color = titleColor, fontSize = titleSize, fontWeight = FontWeight.Medium, modifier = Modifier.width(75.dp)) - Spacer(modifier = Modifier.width(5.dp)) - Text(text = "${orderInfo?.address}", - color = headBgColor, - textDecoration = TextDecoration.Underline, - fontSize = titleSize, fontWeight = FontWeight.Medium, modifier = Modifier.clickable { showChoiceMapDialog = 1 }) - } - Spacer(modifier = Modifier.height(10.dp)) - Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.Top) { - Text(text = "事发地备注", color = titleColor, fontSize = titleSize, fontWeight = FontWeight.Medium, modifier = Modifier.width(75.dp)) - Spacer(modifier = Modifier.width(5.dp)) - Text(text = "${orderInfo?.addressRemark}", color = contentColor, fontSize = titleSize, fontWeight = FontWeight.Medium) - } + Spacer(modifier = Modifier.height(10.dp)) + Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { + Text(text = "车辆位于", + color = titleColor, + fontSize = titleSize, + fontWeight = FontWeight.Medium, + modifier = Modifier.width(75.dp)) + Spacer(modifier = Modifier.width(5.dp)) + Text(text = "${orderInfo?.addressProperty}", + color = contentColor, + fontSize = titleSize, + fontWeight = FontWeight.Medium) + } + Spacer(modifier = Modifier.height(10.dp)) + Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.Top) { + Text(text = "事发地", + color = titleColor, + fontSize = titleSize, + fontWeight = FontWeight.Medium, + modifier = Modifier.width(75.dp)) + Spacer(modifier = Modifier.width(5.dp)) + Text(text = "${orderInfo?.address}", + color = headBgColor, + textDecoration = TextDecoration.Underline, + fontSize = titleSize, + fontWeight = FontWeight.Medium, + modifier = Modifier.clickable { showChoiceMapDialog = 1 }) + } + Spacer(modifier = Modifier.height(10.dp)) + Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.Top) { + Text(text = "事发地备注", + color = titleColor, + fontSize = titleSize, + fontWeight = FontWeight.Medium, + modifier = Modifier.width(75.dp)) + Spacer(modifier = Modifier.width(5.dp)) + Text(text = "${orderInfo?.addressRemark}", + color = contentColor, + fontSize = titleSize, + fontWeight = FontWeight.Medium) + } - if (!orderInfo?.distAddress.isNullOrBlank()) { - Spacer(modifier = Modifier.height(10.dp)) - Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.Top) { - Text(text = "目的地", color = titleColor, fontSize = titleSize, fontWeight = FontWeight.Medium, modifier = Modifier.width(75.dp)) - Spacer(modifier = Modifier.width(5.dp)) - Text(text = "${orderInfo?.distAddress}", - color = headBgColor, - textDecoration = TextDecoration.Underline, - fontSize = titleSize, fontWeight = FontWeight.Medium, modifier = Modifier.clickable { showChoiceMapDialog = 2 }) - } - Spacer(modifier = Modifier.height(10.dp)) - Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.Top) { - Text(text = "目的地备注", color = titleColor, fontSize = titleSize, fontWeight = FontWeight.Medium, modifier = Modifier.width(75.dp)) - Spacer(modifier = Modifier.width(5.dp)) - Text(text = "${orderInfo?.distAddressRemark}", color = contentColor, fontSize = titleSize, fontWeight = FontWeight.Medium) - } - } + if (! orderInfo?.distAddress.isNullOrBlank()) { + Spacer(modifier = Modifier.height(10.dp)) + Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.Top) { + Text(text = "目的地", + color = titleColor, + fontSize = titleSize, + fontWeight = FontWeight.Medium, + modifier = Modifier.width(75.dp)) + Spacer(modifier = Modifier.width(5.dp)) + Text(text = "${orderInfo?.distAddress}", + color = headBgColor, + textDecoration = TextDecoration.Underline, + fontSize = titleSize, + fontWeight = FontWeight.Medium, + modifier = Modifier.clickable { showChoiceMapDialog = 2 }) + } + Spacer(modifier = Modifier.height(10.dp)) + Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.Top) { + Text(text = "目的地备注", + color = titleColor, + fontSize = titleSize, + fontWeight = FontWeight.Medium, + modifier = Modifier.width(75.dp)) + Spacer(modifier = Modifier.width(5.dp)) + Text(text = "${orderInfo?.distAddressRemark}", + color = contentColor, + fontSize = titleSize, + fontWeight = FontWeight.Medium) + } + } - Spacer(modifier = Modifier.height(10.dp)) - Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { - Text(text = "订单状态", color = titleColor, fontSize = titleSize, fontWeight = FontWeight.Medium, modifier = Modifier.width(75.dp)) - Spacer(modifier = Modifier.width(5.dp)) - Text(text = "${orderInfo?.convertToFlowName()}", color = contentColor, fontSize = titleSize, fontWeight = FontWeight.Medium) - } + Spacer(modifier = Modifier.height(10.dp)) + Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { + Text(text = "订单状态", + color = titleColor, + fontSize = titleSize, + fontWeight = FontWeight.Medium, + modifier = Modifier.width(75.dp)) + Spacer(modifier = Modifier.width(5.dp)) + Text(text = "${orderInfo?.convertToFlowName()}", + color = contentColor, + fontSize = titleSize, + fontWeight = FontWeight.Medium) + } - Spacer(modifier = Modifier.height(10.dp)) - Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { - Text(text = "备注", color = titleColor, fontSize = titleSize, fontWeight = FontWeight.Medium, modifier = Modifier.width(75.dp)) - Spacer(modifier = Modifier.width(5.dp)) - Text(text = orderInfo?.importantTip - ?: "", color = contentColor, fontSize = titleSize, fontWeight = FontWeight.Medium) - } - } + Spacer(modifier = Modifier.height(10.dp)) + Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { + Text(text = "备注", + color = titleColor, + fontSize = titleSize, + fontWeight = FontWeight.Medium, + modifier = Modifier.width(75.dp)) + Spacer(modifier = Modifier.width(5.dp)) + Text(text = orderInfo?.importantTip ?: "", + color = contentColor, + fontSize = titleSize, + fontWeight = FontWeight.Medium) + } + } - Spacer(modifier = Modifier.height(10.dp)) + Spacer(modifier = Modifier.height(10.dp)) + + CommonButton(text = "客户放弃") { + OrderGiveUpActivity.goOrderGiveUpActivity(context, + orderInfo = orderInfo, + userOrderId = orderInfo?.userOrderId, + giveUpType = 0) + } } \ No newline at end of file diff --git a/servicing/src/main/java/com/za/ui/servicing/in_servicing_setting/OrderDetailScreen.kt b/servicing/src/main/java/com/za/ui/servicing/in_servicing_setting/OrderDetailScreen.kt index 2be907f..7d2095c 100644 --- a/servicing/src/main/java/com/za/ui/servicing/in_servicing_setting/OrderDetailScreen.kt +++ b/servicing/src/main/java/com/za/ui/servicing/in_servicing_setting/OrderDetailScreen.kt @@ -1,80 +1,98 @@ package com.za.ui.servicing.in_servicing_setting +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.horizontalScroll +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp +import com.za.base.theme.headBgColor +import com.za.base.theme.white80 import com.za.base.view.HeadView import com.za.bean.db.order.OrderInfo import com.za.ext.finish +import kotlinx.coroutines.launch @Composable -fun OrderDetailScreen(orderInfo: OrderInfo?) { - val context = LocalContext.current -// val titleList = listOf("订单详情", "案件照片") - val titleList = listOf("订单详情") - val pagerState = rememberPagerState(initialPage = 0, pageCount = { titleList.size }) - val scope = rememberCoroutineScope() - Scaffold(topBar = { - HeadView(title = "案件信息", onBack = { context.finish() }) - }) { - Column(modifier = Modifier - .fillMaxSize() - .padding(it)) { +fun OrderDetailScreen(orderInfo : OrderInfo?) { + val context = LocalContext.current + val titleList = listOf("订单详情", "案件要求") + val pagerState = rememberPagerState(initialPage = 0, pageCount = { titleList.size }) + val scope = rememberCoroutineScope() + Scaffold(topBar = { + HeadView(title = "订单信息", onBack = { context.finish() }) + }) { + Column(modifier = Modifier + .fillMaxSize() + .padding(it)) { + Row(modifier = Modifier + .fillMaxWidth() + .horizontalScroll(state = rememberScrollState()) + .height(30.dp) + .background(color = headBgColor), + verticalAlignment = Alignment.CenterVertically) { + for (i in 0 until pagerState.pageCount) { + if (pagerState.currentPage == i) { + Column(modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally) { + Text(text = titleList[i], color = Color.White) + HorizontalDivider(thickness = 0.dp, + modifier = Modifier + .width(25.dp) + .height(3.dp) + .background(color = Color.White, + shape = RoundedCornerShape(8.dp))) + } + } else { + Box(modifier = Modifier + .weight(1f) + .clickable { + scope.launch { + pagerState.animateScrollToPage(page = i) + } + }, contentAlignment = Alignment.Center) { + Text(text = titleList[i], color = white80) + } + } + } + } -// Row(modifier = Modifier -// .fillMaxWidth() -// .horizontalScroll(state = rememberScrollState()) -// .height(30.dp) -// .background(color = headBgColor), verticalAlignment = Alignment.CenterVertically) { -// for (i in 0 until pagerState.pageCount) { -// if (pagerState.currentPage == i) { -// Column(modifier = Modifier -// .weight(1f), -// verticalArrangement = Arrangement.Center, -// horizontalAlignment = Alignment.CenterHorizontally) { -// Text(text = titleList[i], color = Color.White) -// HorizontalDivider(thickness = 0.dp, -// modifier = Modifier -// .width(25.dp) -// .height(3.dp) -// .background(color = Color.White, shape = RoundedCornerShape(8.dp))) -// } -// } else { -// Box(modifier = Modifier -// .weight(1f) -// .clickable { -// scope.launch { -// pagerState.animateScrollToPage(page = i) -// } -// }, contentAlignment = Alignment.Center) { -// Text(text = titleList[i], color = white80) -// } -// } -// } -// } - - HorizontalPager(state = pagerState, modifier = Modifier - .fillMaxSize() - .padding(10.dp), verticalAlignment = Alignment.CenterVertically) { - when (pagerState.currentPage) { - 0 -> OrderDetailItemScreen(orderInfo = orderInfo) - 1 -> OrderPhotoScreen(orderInfo = orderInfo) - 2 -> OrderSettleScreen(orderInfo = orderInfo) - 3 -> OrderEleScreen(orderInfo = orderInfo) - 4 -> OrderTriceScreen(orderInfo = orderInfo) - } - } + HorizontalPager(state = pagerState, + modifier = Modifier + .fillMaxSize() + .padding(10.dp), + verticalAlignment = Alignment.CenterVertically) { + when (pagerState.currentPage) { + 0 -> OrderDetailItemScreen(orderInfo = orderInfo) + 1 -> OrderRequirementsScreen(orderInfo = orderInfo) + 2 -> OrderSettleScreen(orderInfo = orderInfo) + 3 -> OrderEleScreen(orderInfo = orderInfo) + 4 -> OrderTriceScreen(orderInfo = orderInfo) + } + } - } - } + } + } } \ No newline at end of file diff --git a/servicing/src/main/java/com/za/ui/servicing/in_servicing_setting/OrderRequirementsScreen.kt b/servicing/src/main/java/com/za/ui/servicing/in_servicing_setting/OrderRequirementsScreen.kt index 0bd20b7..b7b8093 100644 --- a/servicing/src/main/java/com/za/ui/servicing/in_servicing_setting/OrderRequirementsScreen.kt +++ b/servicing/src/main/java/com/za/ui/servicing/in_servicing_setting/OrderRequirementsScreen.kt @@ -18,118 +18,86 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil.compose.AsyncImage import com.za.base.theme.black5 import com.za.base.theme.black65 -import com.za.base.view.HeadView import com.za.bean.db.order.OrderInfo -import com.za.ext.finish import com.za.servicing.R @Composable -fun OrderRequirementsScreen(orderInfo: OrderInfo?) { - val context = LocalContext.current - Scaffold(topBar = { - HeadView(title = "案件要求", onBack = { - context.finish() - }) - }) { - Column(modifier = Modifier - .fillMaxSize() - .verticalScroll(state = rememberScrollState()) - .padding(it) - .padding(horizontal = 16.dp)) { - Spacer(modifier = Modifier.height(12.dp)) - OrderRequirementsItemView(title = "特殊提醒", content = orderInfo?.otherNotes) - OrderRequirementsItemView(title = "收费标准", content = orderInfo?.feeStandard) - if (!orderInfo?.carModel.isNullOrBlank()) { - CarModeView(orderInfo = orderInfo) - } - OrderRequirementsItemView(title = "救援要求", content = orderInfo?.taskNotes) - OrderRequirementsItemView(title = "客户要求", content = orderInfo?.customerNotes) - Spacer(modifier = Modifier.height(16.dp)) - } - } +fun OrderRequirementsScreen(orderInfo : OrderInfo?) { + Scaffold { + Column(modifier = Modifier + .fillMaxSize() + .verticalScroll(state = rememberScrollState()) + .padding(it) + .padding(horizontal = 16.dp)) { + Spacer(modifier = Modifier.height(12.dp)) + OrderRequirementsItemView(title = "特殊提醒", content = orderInfo?.otherNotes) + OrderRequirementsItemView(title = "收费标准", content = orderInfo?.feeStandard) + if (! orderInfo?.carModel.isNullOrBlank()) { + CarModeView(orderInfo = orderInfo) + } + OrderRequirementsItemView(title = "救援要求", content = orderInfo?.taskNotes) + OrderRequirementsItemView(title = "客户要求", content = orderInfo?.customerNotes) + Spacer(modifier = Modifier.height(16.dp)) + } + } } @Composable -private fun OrderRequirementsItemView(title: String?, content: String?) { - Column(modifier = Modifier - .fillMaxWidth() - .padding(vertical = 12.dp)) { - Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically - ) { - AsyncImage( - model = R.drawable.sv_warn_red, - contentDescription = null, - modifier = Modifier.size(16.dp) - ) - Spacer(modifier = Modifier.width(8.dp)) - Text( - text = title ?: "", - color = Color.Black, - fontSize = 15.sp, - fontWeight = FontWeight.Medium - ) - } - Spacer(modifier = Modifier.height(12.dp)) - Text( - text = content?.replace("
", "\n\n") ?: "无", - fontSize = 14.sp, - fontWeight = FontWeight.Normal, - color = black65, - lineHeight = 20.sp, - modifier = Modifier.padding(start = 24.dp) - ) - Spacer(modifier = Modifier.height(12.dp)) - HorizontalDivider( - color = black5, - modifier = Modifier.fillMaxWidth() - ) - } +private fun OrderRequirementsItemView(title : String?, content : String?) { + Column(modifier = Modifier + .fillMaxWidth() + .padding(vertical = 12.dp)) { + Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { + AsyncImage(model = R.drawable.sv_warn_red, + contentDescription = null, + modifier = Modifier.size(16.dp)) + Spacer(modifier = Modifier.width(8.dp)) + Text(text = title ?: "", + color = Color.Black, + fontSize = 15.sp, + fontWeight = FontWeight.Medium) + } + Spacer(modifier = Modifier.height(12.dp)) + Text(text = content?.replace("
", "\n\n") ?: "无", + fontSize = 14.sp, + fontWeight = FontWeight.Normal, + color = black65, + lineHeight = 20.sp, + modifier = Modifier.padding(start = 24.dp)) + Spacer(modifier = Modifier.height(12.dp)) + HorizontalDivider(color = black5, modifier = Modifier.fillMaxWidth()) + } } @Composable -private fun CarModeView(orderInfo: OrderInfo?) { - Column(modifier = Modifier - .fillMaxWidth() - .padding(vertical = 12.dp)) { - Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically - ) { - AsyncImage( - model = R.drawable.sv_warn_red, - contentDescription = null, - modifier = Modifier.size(16.dp) - ) - Spacer(modifier = Modifier.width(8.dp)) - Text( - text = "车型 ${orderInfo?.carModel}", - color = Color.Black, - fontSize = 15.sp, - fontWeight = FontWeight.Medium - ) - if (orderInfo?.linkToDocs == true) { - Spacer(modifier = Modifier.width(12.dp)) - Text( - text = "点击查看相关资料", - color = Color(0xFFffa500), - fontSize = 14.sp, - fontWeight = FontWeight.Medium - ) - } - } - Spacer(modifier = Modifier.height(12.dp)) - HorizontalDivider( - color = black5, - modifier = Modifier.fillMaxWidth() - ) - } +private fun CarModeView(orderInfo : OrderInfo?) { + Column(modifier = Modifier + .fillMaxWidth() + .padding(vertical = 12.dp)) { + Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { + AsyncImage(model = R.drawable.sv_warn_red, + contentDescription = null, + modifier = Modifier.size(16.dp)) + Spacer(modifier = Modifier.width(8.dp)) + Text(text = "车型 ${orderInfo?.carModel}", + color = Color.Black, + fontSize = 15.sp, + fontWeight = FontWeight.Medium) + if (orderInfo?.linkToDocs == true) { + Spacer(modifier = Modifier.width(12.dp)) + Text(text = "点击查看相关资料", + color = Color(0xFFffa500), + fontSize = 14.sp, + fontWeight = FontWeight.Medium) + } + } + Spacer(modifier = Modifier.height(12.dp)) + HorizontalDivider(color = black5, modifier = Modifier.fillMaxWidth()) + } } \ No newline at end of file diff --git a/servicing/src/main/java/com/za/ui/servicing/inservice_people_confirm/InServicePeopleConfirmActivity.kt b/servicing/src/main/java/com/za/ui/servicing/inservice_people_confirm/InServicePeopleConfirmActivity.kt index 6ba3ee4..c8d1f8c 100644 --- a/servicing/src/main/java/com/za/ui/servicing/inservice_people_confirm/InServicePeopleConfirmActivity.kt +++ b/servicing/src/main/java/com/za/ui/servicing/inservice_people_confirm/InServicePeopleConfirmActivity.kt @@ -8,6 +8,6 @@ class ServicePeopleConfirmActivity : BaseActivity() { @Composable override fun ContentView() { - ServicePeopleConfirmScreen() + ServicePeopleConfirmScreen(onBack = { this.finish() }) } } diff --git a/servicing/src/main/java/com/za/ui/servicing/inservice_people_confirm/ServicePeopleConfirmScreen.kt b/servicing/src/main/java/com/za/ui/servicing/inservice_people_confirm/ServicePeopleConfirmScreen.kt index 0b62388..8431fa2 100644 --- a/servicing/src/main/java/com/za/ui/servicing/inservice_people_confirm/ServicePeopleConfirmScreen.kt +++ b/servicing/src/main/java/com/za/ui/servicing/inservice_people_confirm/ServicePeopleConfirmScreen.kt @@ -2,6 +2,7 @@ package com.za.ui.servicing.inservice_people_confirm import android.app.Activity import android.content.Intent +import androidx.activity.compose.BackHandler import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.background @@ -37,14 +38,14 @@ import com.za.base.view.CommonDialog import com.za.base.view.HeadView import com.za.common.GlobalData import com.za.common.log.LogUtil -import com.za.ext.finish import com.za.ext.goNextPage import com.za.servicing.R import com.za.ui.camera.ZdCameraXActivity @Composable fun ServicePeopleConfirmScreen(vm : InServicePeopleConfirmVm = viewModel(), - success : () -> Unit = {}) { + success : () -> Unit = {}, + onBack : () -> Unit) { val context = LocalContext.current val uiState = vm.uiState.collectAsStateWithLifecycle() val getResult = @@ -60,6 +61,11 @@ fun ServicePeopleConfirmScreen(vm : InServicePeopleConfirmVm = viewModel(), } } + + BackHandler { + onBack() + } + if (uiState.value.compareResult == true) { vm.updateState(uiState.value.copy(compareResult = null)) if (GlobalData.isMaster) { @@ -93,7 +99,7 @@ fun ServicePeopleConfirmScreen(vm : InServicePeopleConfirmVm = viewModel(), }) } - Scaffold(topBar = { HeadView(title = "身份验证", onBack = { context.finish() }) }) { + Scaffold(topBar = { HeadView(title = "身份验证", onBack = onBack) }) { Column(modifier = Modifier .fillMaxSize() .background(color = Color.White) diff --git a/servicing/src/main/java/com/za/ui/servicing/order_confirm/ConfirmEleVm.kt b/servicing/src/main/java/com/za/ui/servicing/order_confirm/ConfirmEleVm.kt index 321ec14..6dac887 100644 --- a/servicing/src/main/java/com/za/ui/servicing/order_confirm/ConfirmEleVm.kt +++ b/servicing/src/main/java/com/za/ui/servicing/order_confirm/ConfirmEleVm.kt @@ -208,15 +208,16 @@ class ConfirmEleVm : IServicingVm() { return } - if (eleWorkOrderBean.localAcceptCarSignPath.isNullOrBlank() || eleWorkOrderBean.localServicePeopleSignPath.isNullOrBlank()) { - showTipDialog("请先上传签名!") - return - } - if (! getCurrentOrderOfflineTask().isNullOrEmpty()) { uploadOffline() return } + + if (eleWorkOrderBean.localAcceptCarSignPath.isNullOrBlank() || eleWorkOrderBean.localServicePeopleSignPath.isNullOrBlank()) { + showTipDialog("请先上传签名!") + return + } + LoadingManager.showLoading() ZdLocationManager.getSingleLocation(success = { LoadingManager.hideLoading() diff --git a/servicing/src/main/java/com/za/ui/servicing/order_give_up/OrderGiveUpVm.kt b/servicing/src/main/java/com/za/ui/servicing/order_give_up/OrderGiveUpVm.kt index f9e4ce6..43b1bbe 100644 --- a/servicing/src/main/java/com/za/ui/servicing/order_give_up/OrderGiveUpVm.kt +++ b/servicing/src/main/java/com/za/ui/servicing/order_give_up/OrderGiveUpVm.kt @@ -15,6 +15,7 @@ import com.za.bean.request.UpdatePhotoRequest import com.za.bean.request.UploadPhotoBean import com.za.common.GlobalData import com.za.common.log.LogUtil +import com.za.ext.toJson import com.za.net.BaseObserver import com.za.net.CommonMethod import com.za.net.RetrofitHelper @@ -26,323 +27,341 @@ import kotlinx.coroutines.flow.MutableStateFlow import java.io.File class OrderGiveUpVm : BaseVm() { - private val _uiState = MutableStateFlow(UiState()) - val uiState get() = _uiState - override fun updateState(uiState: UiState) { - _uiState.value = uiState - } + private val _uiState = MutableStateFlow(UiState()) + val uiState get() = _uiState + override fun updateState(uiState : UiState) { + _uiState.value = uiState + } - override fun dispatch(action: Action) { - when (action) { - is Action.Init -> init() - is Action.UpdateTask -> { - when (uiState.value.giveUpType) { - 0 -> giveUp() - 1 -> giveUpFromServer() - 2 -> giveUpFromGoPreview() - } - } + override fun dispatch(action : Action) { + when (action) { + is Action.Init -> init() + is Action.UpdateTask -> { + when (uiState.value.giveUpType) { + 0 -> giveUp() + 1 -> giveUpFromServer() + 2 -> giveUpFromGoPreview() + } + } - is Action.UpdateState -> updateState(action.uiState) - is Action.UpdatePhotoTemplate -> updateTemplate() - is Action.UploadSign -> uploadSign(action.signPath) - } - } + is Action.UpdateState -> updateState(action.uiState) + is Action.UpdatePhotoTemplate -> updateTemplate() + is Action.UploadSign -> uploadSign(action.signPath) + } + } - private fun uploadSign(path: String?) { - if (path.isNullOrBlank()) { - ToastUtils.showLong("照片路径为空,请重新签名!") - return - } + private fun uploadSign(path : String?) { + if (path.isNullOrBlank()) { + ToastUtils.showLong("照片路径为空,请重新签名!") + return + } - CommonMethod.uploadImage(File(path), success = { it -> - val eleWorkOrderBean = uiState.value.eleWorkOrderBean - if (eleWorkOrderBean == null) { - updateState(uiState.value.copy(serverServicePeopleSignPath = it)) - } else { - val ele = eleWorkOrderBean.copy(serverServicePeopleSignPath = it, localServicePeopleSignPath = path) - RoomHelper.db?.eleWorkOrderDao()?.update(ele) - updateState(uiState.value.copy(eleWorkOrderBean = ele, serverServicePeopleSignPath = it)) - } - }, failed = { - ToastUtils.showShort("签名上传失败,请重新签名") - }) - } + CommonMethod.uploadImage(File(path), success = { it -> + val eleWorkOrderBean = uiState.value.eleWorkOrderBean + if (eleWorkOrderBean == null) { + updateState(uiState.value.copy(serverServicePeopleSignPath = it)) + } else { + val ele = eleWorkOrderBean.copy(serverServicePeopleSignPath = it, + localServicePeopleSignPath = path) + RoomHelper.db?.eleWorkOrderDao()?.update(ele) + updateState(uiState.value.copy(eleWorkOrderBean = ele, + serverServicePeopleSignPath = it)) + } + }, failed = { + ToastUtils.showShort("签名上传失败,请重新签名") + }) + } - private fun updateTemplate() { - val list = RoomHelper.db?.photoTemplateDao()?.getOrderPhotoTemplateFromTaskNodeAndTaskId(18100, uiState.value.orderInfo?.taskId - ?: 0) - updateState(uiState.value.copy(photoTemplateList = list)) - } + private fun updateTemplate() { + val list = RoomHelper.db?.photoTemplateDao()?.getOrderPhotoTemplateFromTaskNodeAndTaskId( + 18100, + uiState.value.orderInfo?.taskId ?: 0) + updateState(uiState.value.copy(photoTemplateList = list)) + } - private fun giveUpFromServer() { - if (uiState.value.photoTemplateList.isNullOrEmpty()) { - ToastUtils.showShort("作业照片不能为空!") - return - } + private fun giveUpFromServer() { + if (uiState.value.photoTemplateList.isNullOrEmpty()) { + ToastUtils.showShort("作业照片不能为空!") + return + } - //校验必拍照片是否拍摄 - uiState.value.photoTemplateList?.forEach { - if (it.doHaveFilm == 1 && it.photoUploadPath.isNullOrBlank() && it.photoType != 2) { - ToastUtils.showLong("请上传${it.imageTitle}") - return - } - } + //校验必拍照片是否拍摄 + uiState.value.photoTemplateList?.forEach { + if (it.doHaveFilm == 1 && it.photoUploadPath.isNullOrBlank() && it.photoType != 2) { + ToastUtils.showLong("请上传${it.imageTitle}") + return + } + } - LoadingManager.showLoading() - uiState.value.photoTemplateList?.fastForEachIndexed { i, item -> - if (item.photoUploadPath.isNullOrBlank()) { - return@fastForEachIndexed - } - val jsonObject = JSONObject() - jsonObject["realTakePhotoTime"] = item.realTakePhotoTime ?: "" - jsonObject["photoSource"] = item.photoSource - jsonObject["time"] = item.time - jsonObject["lat"] = item.lat - jsonObject["path"] = item.photoUploadPath - jsonObject["lng"] = item.lng - jsonObject["address"] = item.address + LoadingManager.showLoading() + uiState.value.photoTemplateList?.fastForEachIndexed { i, item -> + if (item.photoUploadPath.isNullOrBlank()) { + return@fastForEachIndexed + } + val jsonObject = JSONObject() + jsonObject["realTakePhotoTime"] = item.realTakePhotoTime ?: "" + jsonObject["photoSource"] = item.photoSource + jsonObject["time"] = item.time + jsonObject["lat"] = item.lat + jsonObject["path"] = item.photoUploadPath + jsonObject["lng"] = item.lng + jsonObject["address"] = item.address - val request = UpdatePhotoRequest(taskId = uiState.value.taskId, - taskState = "GIVEUP", - picturePosition = i + 1, - picturePath = item.photoUploadPath, - imgInfo = jsonObject.toJSONString()) + val request = UpdatePhotoRequest(taskId = uiState.value.taskId, + taskState = "GIVEUP", + picturePosition = i + 1, + picturePath = item.photoUploadPath, + imgInfo = jsonObject.toJSONString()) - RetrofitHelper.getDefaultService().addPhoto(request) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : BaseObserver() { - override fun doSuccess(it: UploadPhotoBean?) { - LoadingManager.hideLoading() - } + RetrofitHelper.getDefaultService().addPhoto(request).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : BaseObserver() { + override fun doSuccess(it : UploadPhotoBean?) { + LoadingManager.hideLoading() + } - override fun doFailure(code: Int, msg: String?) { - LoadingManager.hideLoading() - ToastUtils.showLong(msg) - } - }) - } + override fun doFailure(code : Int, msg : String?) { + LoadingManager.hideLoading() + ToastUtils.showLong(msg) + } + }) + } - updateState(uiState.value.copy(orderGiveUpSuccess = true)) - GlobalData.clearOrderCache(uiState.value.orderInfo?.taskId ?: uiState.value.taskId ?: 0) - } + updateState(uiState.value.copy(orderGiveUpSuccess = true)) + GlobalData.clearOrderCache(uiState.value.orderInfo?.taskId ?: uiState.value.taskId ?: 0) + } - private fun giveUpFromGoPreview() { - if (uiState.value.photoTemplateList.isNullOrEmpty()) { - ToastUtils.showShort("作业照片不能为空!") - return - } + private fun giveUpFromGoPreview() { + if (uiState.value.photoTemplateList.isNullOrEmpty()) { + ToastUtils.showShort("作业照片不能为空!") + return + } - //校验必拍照片是否拍摄 - uiState.value.photoTemplateList?.forEach { - if (it.doHaveFilm == 1 && it.photoUploadPath.isNullOrBlank() && it.photoType != 2) { - ToastUtils.showLong("请上传${it.imageTitle}") - return - } - } + //校验必拍照片是否拍摄 + uiState.value.photoTemplateList?.forEach { + if (it.doHaveFilm == 1 && it.photoUploadPath.isNullOrBlank() && it.photoType != 2) { + ToastUtils.showLong("请上传${it.imageTitle}") + return + } + } - val tempPhotoList = arrayListOf() - uiState.value.photoTemplateList?.forEach { item -> - if (item.photoType == 2 || item.photoUploadPath.isNullOrBlank()) { - tempPhotoList.add(null) - } else { - val jsonObject = JSONObject() - jsonObject["realTakePhotoTime"] = item.realTakePhotoTime ?: "" - jsonObject["photoSource"] = item.photoSource - jsonObject["time"] = item.time - jsonObject["lat"] = item.lat - jsonObject["path"] = item.photoUploadPath - jsonObject["lng"] = item.lng - jsonObject["address"] = item.address - tempPhotoList.add(jsonObject.toJSONString()) - } - } + val tempPhotoList = arrayListOf() + uiState.value.photoTemplateList?.forEach { item -> + if (item.photoType == 2 || item.photoUploadPath.isNullOrBlank()) { + tempPhotoList.add(null) + } else { + val jsonObject = JSONObject() + jsonObject["realTakePhotoTime"] = item.realTakePhotoTime ?: "" + jsonObject["photoSource"] = item.photoSource + jsonObject["time"] = item.time + jsonObject["lat"] = item.lat + jsonObject["path"] = item.photoUploadPath + jsonObject["lng"] = item.lng + jsonObject["address"] = item.address + tempPhotoList.add(jsonObject.toJSONString()) + } + } - LoadingManager.showLoading() - ZdLocationManager.getSingleLocation(isNeedAddress = true,success = { - LoadingManager.hideLoading() - val taskRequest = GiveUpTaskRequest( - taskId = GlobalData.currentOrder?.taskId, - userId = GlobalData.driverInfoBean?.userId, - vehicleId = GlobalData.driverInfoBean?.vehicleId, - lat = it.latitude, - address = it.address, - pushGiveUpFlag = 1, - lng = it.longitude, - templatePhotoInfoList = tempPhotoList.toList()) - doGiveUpTask(request = taskRequest) - }, failed = { - LoadingManager.hideLoading() - ToastUtils.showShort(it) - }) - } + LoadingManager.showLoading() + ZdLocationManager.getSingleLocation(isNeedAddress = true, success = { + LoadingManager.hideLoading() + val taskRequest = GiveUpTaskRequest(taskId = GlobalData.currentOrder?.taskId, + userId = GlobalData.driverInfoBean?.userId, + vehicleId = GlobalData.driverInfoBean?.vehicleId, + lat = it.latitude, + address = it.address, + pushGiveUpFlag = 1, + lng = it.longitude, + templatePhotoInfoList = tempPhotoList.toList()) + doGiveUpTask(request = taskRequest) + }, failed = { + LoadingManager.hideLoading() + ToastUtils.showShort(it) + }) + } - private fun giveUp() { - uploadEleWorkOrder { - if (uiState.value.photoTemplateList.isNullOrEmpty()) { - ToastUtils.showShort("作业照片不能为空!") - return@uploadEleWorkOrder - } + private fun giveUp() { + uploadEleWorkOrder { + if (uiState.value.photoTemplateList.isNullOrEmpty()) { + ToastUtils.showShort("作业照片不能为空!") + return@uploadEleWorkOrder + } - //校验必拍照片是否拍摄 - uiState.value.photoTemplateList?.forEach { - if (it.doHaveFilm == 1 && it.photoUploadPath.isNullOrBlank() && it.photoType != 2) { - ToastUtils.showLong("请上传${it.imageTitle}") - return@uploadEleWorkOrder - } - } + //校验必拍照片是否拍摄 + uiState.value.photoTemplateList?.forEach { + if (it.doHaveFilm == 1 && it.photoUploadPath.isNullOrBlank() && it.photoType != 2) { + ToastUtils.showLong("请上传${it.imageTitle}") + return@uploadEleWorkOrder + } + } - val tempPhotoList = arrayListOf() - uiState.value.photoTemplateList?.forEach { item -> - if (item.photoType == 2 || item.photoUploadPath.isNullOrBlank()) { - tempPhotoList.add(null) - } else { - val jsonObject = JSONObject() - jsonObject["realTakePhotoTime"] = item.realTakePhotoTime ?: "" - jsonObject["photoSource"] = item.photoSource - jsonObject["time"] = item.time - jsonObject["lat"] = item.lat - jsonObject["path"] = item.photoUploadPath - jsonObject["lng"] = item.lng - jsonObject["address"] = item.address - tempPhotoList.add(jsonObject.toJSONString()) - } - } + val tempPhotoList = arrayListOf() + uiState.value.photoTemplateList?.forEach { item -> + if (item.photoType == 2 || item.photoUploadPath.isNullOrBlank()) { + tempPhotoList.add(null) + } else { + val jsonObject = JSONObject() + jsonObject["realTakePhotoTime"] = item.realTakePhotoTime ?: "" + jsonObject["photoSource"] = item.photoSource + jsonObject["time"] = item.time + jsonObject["lat"] = item.lat + jsonObject["path"] = item.photoUploadPath + jsonObject["lng"] = item.lng + jsonObject["address"] = item.address + tempPhotoList.add(jsonObject.toJSONString()) + } + } - LoadingManager.showLoading() - ZdLocationManager.getSingleLocation(success = { - LoadingManager.hideLoading() - val taskRequest = GiveUpTaskRequest( - taskId = GlobalData.currentOrder?.taskId, - userId = GlobalData.driverInfoBean?.userId, - vehicleId = GlobalData.driverInfoBean?.vehicleId, - lat = it.latitude, - address = it.address, - lng = it.longitude, - templatePhotoInfoList = tempPhotoList.toList()) - doGiveUpTask(request = taskRequest) - }, failed = { - LoadingManager.hideLoading() - ToastUtils.showShort(it) - }) - } - } + LoadingManager.showLoading() + ZdLocationManager.getSingleLocation(success = { + LoadingManager.hideLoading() + val taskRequest = GiveUpTaskRequest(taskId = GlobalData.currentOrder?.taskId, + userId = GlobalData.driverInfoBean?.userId, + vehicleId = GlobalData.driverInfoBean?.vehicleId, + lat = it.latitude, + address = it.address, + lng = it.longitude, + templatePhotoInfoList = tempPhotoList.toList()) + doGiveUpTask(request = taskRequest) + }, failed = { + LoadingManager.hideLoading() + ToastUtils.showShort(it) + }) + } + } - private fun uploadEleWorkOrder(success: () -> Unit) { - val eleWorkOrderBean = uiState.value.eleWorkOrderBean - if (uiState.value.serverServicePeopleSignPath.isNullOrBlank()) { - ToastUtils.showShort("请填写签名") - return - } - LoadingManager.showLoading() - val saveEleOrderRequest = SaveEleOrderRequest( - taskOrderId = uiState.value.orderInfo?.taskId, - userOrderId = uiState.value.orderInfo?.userOrderId, - state = 3, - hasSuccess = eleWorkOrderBean?.isSuccess, - waitstaffSignPath = uiState.value.serverServicePeopleSignPath) - RetrofitHelper.getDefaultService().saveElectronOrder(saveEleOrderRequest) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : BaseObserver() { - override fun doSuccess(it: String?) { - LoadingManager.hideLoading() - if (eleWorkOrderBean != null) { - RoomHelper.db?.eleWorkOrderDao()?.update(eleWorkOrderBean.copy(orderWorkStatus = 3)) - updateState(uiState.value.copy(eleWorkOrderBean = eleWorkOrderBean.copy(orderWorkStatus = 3))) - } - success() - } + private fun uploadEleWorkOrder(success : () -> Unit) { + val eleWorkOrderBean = uiState.value.eleWorkOrderBean + if (uiState.value.serverServicePeopleSignPath.isNullOrBlank()) { + ToastUtils.showShort("请填写签名") + return + } + LoadingManager.showLoading() + val saveEleOrderRequest = SaveEleOrderRequest(taskOrderId = uiState.value.orderInfo?.taskId, + userOrderId = uiState.value.orderInfo?.userOrderId, + state = 3, + hasSuccess = eleWorkOrderBean?.isSuccess, + waitstaffSignPath = uiState.value.serverServicePeopleSignPath) + RetrofitHelper.getDefaultService().saveElectronOrder(saveEleOrderRequest) + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : BaseObserver() { + override fun doSuccess(it : String?) { + LoadingManager.hideLoading() + if (eleWorkOrderBean != null) { + RoomHelper.db?.eleWorkOrderDao() + ?.update(eleWorkOrderBean.copy(orderWorkStatus = 3)) + updateState(uiState.value.copy(eleWorkOrderBean = eleWorkOrderBean.copy( + orderWorkStatus = 3))) + } + success() + } - override fun doFailure(code: Int, msg: String?) { - LoadingManager.hideLoading() - LogUtil.print("订单放弃 失败", msg ?: "") - } - }) - } + override fun doFailure(code : Int, msg : String?) { + LoadingManager.hideLoading() + LogUtil.print("订单放弃 失败", msg ?: "") + } + }) + } - private fun doGiveUpTask(request: GiveUpTaskRequest) { - LoadingManager.showLoading() - RetrofitHelper.getDefaultService().giveUpTask(request) - .subscribeOn(Schedulers.io()) - .observeOn(Schedulers.io()) - .subscribe(object : BaseObserver() { - override fun doSuccess(it: String?) { - LoadingManager.hideLoading() - updateState(uiState.value.copy(orderGiveUpSuccess = true)) - GlobalData.clearOrderCache(uiState.value.orderInfo?.taskId - ?: uiState.value.taskId ?: 0) - } + private fun doGiveUpTask(request : GiveUpTaskRequest) { + LoadingManager.showLoading() + RetrofitHelper.getDefaultService().giveUpTask(request).subscribeOn(Schedulers.io()) + .observeOn(Schedulers.io()).subscribe(object : BaseObserver() { + override fun doSuccess(it : String?) { + LoadingManager.hideLoading() + updateState(uiState.value.copy(orderGiveUpSuccess = true)) + GlobalData.clearOrderCache(uiState.value.orderInfo?.taskId + ?: uiState.value.taskId ?: 0) + } - override fun doFailure(code: Int, msg: String?) { - LoadingManager.hideLoading() - ToastUtils.showLong(msg) - } - }) - } + override fun doFailure(code : Int, msg : String?) { + LoadingManager.hideLoading() + ToastUtils.showLong(msg) + } + }) + } - // TODO("订单放弃的推送需要再加个 userOrderId的参数,否则,无法请求到照片模版") - private fun init() { - if (uiState.value.orderInfo != null) { - val eleWorkOrderBean = RoomHelper.db?.eleWorkOrderDao()?.getEleWorkOrder(uiState.value.orderInfo?.taskId - ?: 0) - val photoTemplateList = RoomHelper.db?.photoTemplateDao() - ?.getOrderPhotoTemplateFromTaskNodeAndTaskId(18100, taskId = uiState.value.orderInfo?.taskId - ?: 0) - if (photoTemplateList.isNullOrEmpty()) { - CommonMethod.fetchPhotoTemplate(uiState.value.orderInfo, - success = { - val data = RoomHelper.db?.photoTemplateDao()?.getOrderPhotoTemplateFromTaskNode(18100, - uiState.value.orderInfo?.userOrderId ?: 0) - updateState(uiState.value.copy(photoTemplateList = data, eleWorkOrderBean = eleWorkOrderBean)) - }, failed = { - ToastUtils.showShort(it) - }) - } else { - updateState(uiState.value.copy(photoTemplateList = photoTemplateList, eleWorkOrderBean = eleWorkOrderBean)) - } - return - } + // TODO("订单放弃的推送需要再加个 userOrderId的参数,否则,无法请求到照片模版") + private fun init() { + if (uiState.value.orderInfo != null) { + val eleWorkOrderBean = RoomHelper.db?.eleWorkOrderDao() + ?.getEleWorkOrder(uiState.value.orderInfo?.taskId ?: 0) + val photoTemplateList = RoomHelper.db?.photoTemplateDao() + ?.getOrderPhotoTemplateFromTaskNodeAndTaskId(18100, + taskId = uiState.value.orderInfo?.taskId ?: 0) + if (photoTemplateList.isNullOrEmpty()) { + CommonMethod.fetchPhotoTemplate(uiState.value.orderInfo, success = { + val data = RoomHelper.db?.photoTemplateDao()?.getOrderPhotoTemplateFromTaskNode( + 18100, + uiState.value.orderInfo?.userOrderId ?: 0) - val eleWorkOrderBean = RoomHelper.db?.eleWorkOrderDao()?.getEleWorkOrder(uiState.value.orderInfo?.taskId - ?: 0) - val photoTemplateList = RoomHelper.db?.photoTemplateDao() - ?.getOrderPhotoTemplateFromTaskNodeAndTaskId(18100, taskId = uiState.value.orderInfo?.taskId - ?: 0) - if (photoTemplateList.isNullOrEmpty()) { - CommonMethod.fetchPhotoTemplate(uiState.value.orderInfo, - success = { - val data = RoomHelper.db?.photoTemplateDao()?.getOrderPhotoTemplateFromTaskNodeAndTaskId(18100, - uiState.value.taskId ?: 0) - updateState(uiState.value.copy(photoTemplateList = data, eleWorkOrderBean = eleWorkOrderBean)) - }, failed = { - ToastUtils.showShort(it) - }) - } else { - updateState(uiState.value.copy(photoTemplateList = photoTemplateList, eleWorkOrderBean = eleWorkOrderBean)) - } + updateState(uiState.value.copy(photoTemplateList = handlerData(data), + eleWorkOrderBean = eleWorkOrderBean)) + }, failed = { + ToastUtils.showShort(it) + }) + } else { + updateState(uiState.value.copy(photoTemplateList = handlerData(photoTemplateList), + eleWorkOrderBean = eleWorkOrderBean)) + } - } + LogUtil.print("订单放弃", "photoTemplateList==${photoTemplateList?.toJson()}") + return + } + val eleWorkOrderBean = + RoomHelper.db?.eleWorkOrderDao()?.getEleWorkOrder(uiState.value.orderInfo?.taskId ?: 0) + val photoTemplateList = RoomHelper.db?.photoTemplateDao() + ?.getOrderPhotoTemplateFromTaskNodeAndTaskId(18100, + taskId = uiState.value.orderInfo?.taskId ?: 0) + if (photoTemplateList.isNullOrEmpty()) { + CommonMethod.fetchPhotoTemplate(uiState.value.orderInfo, success = { + val data = RoomHelper.db?.photoTemplateDao() + ?.getOrderPhotoTemplateFromTaskNodeAndTaskId(18100, uiState.value.taskId ?: 0) + updateState(uiState.value.copy(photoTemplateList = handlerData(data), + eleWorkOrderBean = eleWorkOrderBean)) + }, failed = { + ToastUtils.showShort(it) + }) + } else { + updateState(uiState.value.copy(photoTemplateList = handlerData(photoTemplateList), + eleWorkOrderBean = eleWorkOrderBean)) + } - sealed class Action { - data object Init : Action() - data object UpdateTask : Action() - data class UploadSign(val signPath: String?) : Action() - data class UpdatePhotoTemplate(val photoTemplateInfo: PhotoTemplateInfo) : Action() - data class UpdateState(val uiState: UiState) : Action() - } + LogUtil.print("订单放弃", "photoTemplateList==${photoTemplateList?.toJson()}") - data class UiState( - val orderInfo: OrderInfo? = null, - val taskId: Int? = null, - val giveUpType: Int? = null, - val serverServicePeopleSignPath: String? = null, - val orderGiveUpSuccess: Boolean? = null, - val isGoNextPageDialog: Boolean? = null, - val eleWorkOrderBean: EleWorkOrderBean? = null, - val photoTemplateList: List? = null) + } + + private fun handlerData(originDta : List?) : List { + val list = arrayListOf() + originDta?.forEach { + if (it.showPingAnGiveUpPhoto == 1) { + if (uiState.value.orderInfo?.taskState == "VERIFY" || uiState.value.orderInfo?.taskState == "EXAMINE") { + list.add(it) + } + } else { + list.add(it) + } + } + return list + } + + sealed class Action { + data object Init : Action() + data object UpdateTask : Action() + data class UploadSign(val signPath : String?) : Action() + data class UpdatePhotoTemplate(val photoTemplateInfo : PhotoTemplateInfo) : Action() + data class UpdateState(val uiState : UiState) : Action() + } + + data class UiState(val orderInfo : OrderInfo? = null, + val taskId : Int? = null, + val giveUpType : Int? = null, + val serverServicePeopleSignPath : String? = null, + val orderGiveUpSuccess : Boolean? = null, + val isGoNextPageDialog : Boolean? = null, + val eleWorkOrderBean : EleWorkOrderBean? = null, + val photoTemplateList : List? = null) } \ No newline at end of file diff --git a/servicing/src/main/java/com/za/ui/servicing/view/InServicingBottomView.kt b/servicing/src/main/java/com/za/ui/servicing/view/InServicingBottomView.kt index 9fd7cd8..cacf1e7 100644 --- a/servicing/src/main/java/com/za/ui/servicing/view/InServicingBottomView.kt +++ b/servicing/src/main/java/com/za/ui/servicing/view/InServicingBottomView.kt @@ -22,6 +22,7 @@ import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.ui.AbsoluteAlignment import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -227,7 +228,11 @@ fun InServicingHeadView(title : String, actions = { Box(modifier = Modifier .size(39.dp) - .clickable { showBottomSheetDialog.value = true } + .clickable { + OrderRequirementsActivity.goOrderRequirementsActivity(context, + orderInfo, + type = Const.InServiceSettingType.ORDER_DETAIL) + } .padding(10.dp), contentAlignment = Alignment.Center) { AsyncImage(model = R.drawable.sv_setting, contentDescription = "", @@ -239,6 +244,75 @@ fun InServicingHeadView(title : String, } } +@Composable +fun ServiceOperation(orderInfo : OrderInfo?) { + val context = LocalContext.current + val showNavigationDialog = remember { mutableStateOf(false) } + val showCallPhoneDialog = remember { mutableStateOf(false) } + val showCallServicePhoneDialog = remember { mutableStateOf(false) } + + if (showNavigationDialog.value) { + StartNavigationView(orderInfo = orderInfo, dismiss = { showNavigationDialog.value = false }) + } + + if (showCallPhoneDialog.value) { + CommonDialog(cancelText = "取消", + confirmText = "确定", + title = "是否联系客户?", + cancelEnable = true, + cancel = { + showCallPhoneDialog.value = false + }, + dismiss = { showCallPhoneDialog.value = false }, + confirm = { + showCallPhoneDialog.value = false + context.callPhone(orderInfo?.customerPhone) + context.finish() + }) + } + + if (showCallServicePhoneDialog.value) { + CommonDialog(cancelText = "取消", + confirmText = "确定", + title = "是否联系中道客服?", + cancelEnable = true, + cancel = { + showCallServicePhoneDialog.value = false + }, + dismiss = { showCallServicePhoneDialog.value = false }, + confirm = { + showCallServicePhoneDialog.value = false + context.callPhone(orderInfo?.hotline) + context.finish() + }) + } + + Column(modifier = Modifier + .fillMaxWidth() + .padding(10.dp), + horizontalAlignment = AbsoluteAlignment.Right, + verticalArrangement = Arrangement.Top) { + Spacer(modifier = Modifier.height(2.dp)) + AsyncImage(model = R.drawable.sv_service_phone, + contentDescription = "", + modifier = Modifier + .size(46.dp) + .clickable { showCallServicePhoneDialog.value = true }) + Spacer(modifier = Modifier.height(2.dp)) + AsyncImage(model = R.drawable.sv_customer, + contentDescription = "", + modifier = Modifier + .size(46.dp) + .clickable { showCallPhoneDialog.value = true }) + Spacer(modifier = Modifier.height(2.dp)) + AsyncImage(model = R.drawable.sv_navigation, + contentDescription = "", + modifier = Modifier + .size(46.dp) + .clickable { showNavigationDialog.value = true }) + } +} + @Composable fun StartNavigationView(orderInfo : OrderInfo?, dismiss : () -> Unit) { val context = LocalContext.current diff --git a/servicing/src/main/java/com/za/ui/servicing/wait_to_start/WaitToStartActivity.kt b/servicing/src/main/java/com/za/ui/servicing/wait_to_start/WaitToStartActivity.kt index 5592ce0..f6cd63b 100644 --- a/servicing/src/main/java/com/za/ui/servicing/wait_to_start/WaitToStartActivity.kt +++ b/servicing/src/main/java/com/za/ui/servicing/wait_to_start/WaitToStartActivity.kt @@ -32,6 +32,7 @@ import androidx.compose.material3.rememberStandardBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.remember +import androidx.compose.ui.AbsoluteAlignment import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha @@ -69,6 +70,7 @@ import com.za.ext.navigationActivity import com.za.servicing.R import com.za.ui.servicing.inservice_people_confirm.ServicePeopleConfirmActivity import com.za.ui.servicing.view.InServicingHeadView +import com.za.ui.servicing.view.ServiceOperation class WaitToStartActivity : BaseActivity() { @@ -334,9 +336,7 @@ fun WaitToStartScreen(vm : WaitToStartVm = viewModel()) { Box(modifier = Modifier .fillMaxSize() .padding(paddingValues)) { - AndroidView(modifier = Modifier - .fillMaxSize() - .padding(bottom = 20.dp), factory = { + AndroidView(modifier = Modifier.fillMaxSize(), factory = { AMapLocationClient.updatePrivacyShow(context, true, true) AMapLocationClient.updatePrivacyAgree(context, true) mapView.apply { @@ -389,7 +389,7 @@ fun WaitToStartScreen(vm : WaitToStartVm = viewModel()) { if (order.distLat != null && order.distLat != 0.0 && order.distLng != null && order.distLng != 0.0 && GlobalData.currentLocation != null) { mapView.map.addMarker(MarkerOptions().position(LatLng(order.distLat !!, order.distLng !!)).title("目的地") - .icon(BitmapDescriptorFactory.fromResource(R.mipmap.sv_dist_map)) + .icon(ImageUtil.vectorToBitmap(context, R.drawable.sv_map_dist)) .anchor(0.5f, 0.5f)) } } @@ -425,7 +425,8 @@ fun WaitToStartScreen(vm : WaitToStartVm = viewModel()) { } } }) + + ServiceOperation(orderInfo = uiState.value.orderInfo) } } } - diff --git a/servicing/src/main/java/com/za/ui/servicing/wait_to_start/WaitToStartVm.kt b/servicing/src/main/java/com/za/ui/servicing/wait_to_start/WaitToStartVm.kt index bc046a5..92bcb55 100644 --- a/servicing/src/main/java/com/za/ui/servicing/wait_to_start/WaitToStartVm.kt +++ b/servicing/src/main/java/com/za/ui/servicing/wait_to_start/WaitToStartVm.kt @@ -10,6 +10,7 @@ import com.amap.api.services.route.DriveRouteResult import com.amap.api.services.route.RideRouteResult import com.amap.api.services.route.RouteSearch import com.amap.api.services.route.WalkRouteResult +import com.blankj.utilcode.util.ActivityUtils import com.blankj.utilcode.util.ToastUtils import com.za.base.IServicingVm import com.za.base.view.LoadingManager @@ -18,6 +19,7 @@ import com.za.bean.request.UpdateTaskBean import com.za.bean.request.UpdateTaskRequest import com.za.common.GlobalData import com.za.common.log.LogUtil +import com.za.common.util.ImageUtil import com.za.ext.toJson import com.za.net.CommonMethod import com.za.service.location.ZdLocationManager @@ -106,9 +108,9 @@ class WaitToStartVm : IServicingVm( val destMarker = MarkerOptions().position(LatLng(orderInfo.distLat !!, orderInfo.distLng !!)) - .title(orderInfo.distAddress).snippet("目的地") - .icon(BitmapDescriptorFactory.fromResource(R.mipmap.sv_dist_map)) - .anchor(0.5f, 0.5f).zIndex(2f).visible(true) + .title(orderInfo.distAddress).snippet("目的地").icon(ImageUtil.vectorToBitmap( + ActivityUtils.getTopActivity(), + R.drawable.sv_map_dist)).anchor(0.5f, 0.5f).zIndex(2f).visible(true) markers.add(destMarker) } @@ -169,17 +171,16 @@ class WaitToStartVm : IServicingVm( private var timerJob : Job? = null - private fun startTimer() { -// timerJob?.cancel() -// timerJob = viewModelScope.launch { -// while (isActive) { // 计算从当前位置到目标点的距离和到达时间 -// val (distance, arrivalTime) = calculateRemainingDistance() -// _uiState.update { -// it.copy(remainingDistance = distance, estimatedArrivalTime = arrivalTime) -// } -// delay(1000) // 每秒更新一次 -// } -// } + private fun startTimer() { // timerJob?.cancel() + // timerJob = viewModelScope.launch { + // while (isActive) { // 计算从当前位置到目标点的距离和到达时间 + // val (distance, arrivalTime) = calculateRemainingDistance() + // _uiState.update { + // it.copy(remainingDistance = distance, estimatedArrivalTime = arrivalTime) + // } + // delay(1000) // 每秒更新一次 + // } + // } } private fun calculateRemainingDistance() : Pair { diff --git a/servicing/src/main/res/drawable/sv_customer.xml b/servicing/src/main/res/drawable/sv_customer.xml new file mode 100644 index 0000000..eb490f8 --- /dev/null +++ b/servicing/src/main/res/drawable/sv_customer.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/servicing/src/main/res/drawable/sv_map_dist.xml b/servicing/src/main/res/drawable/sv_map_dist.xml new file mode 100644 index 0000000..caf7526 --- /dev/null +++ b/servicing/src/main/res/drawable/sv_map_dist.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/servicing/src/main/res/drawable/sv_navigation.xml b/servicing/src/main/res/drawable/sv_navigation.xml index ddea9a7..f49499b 100644 --- a/servicing/src/main/res/drawable/sv_navigation.xml +++ b/servicing/src/main/res/drawable/sv_navigation.xml @@ -1,9 +1,30 @@ + android:width="46dp" + android:height="46dp" + android:viewportWidth="46" + android:viewportHeight="46"> + android:pathData="m9,3h28c3.324,0 6,2.676 6,6v28c0,3.324 -2.676,6 -6,6L9,43c-3.324,0 -6,-2.676 -6,-6v-28c0,-3.324 2.676,-6 6,-6z" + android:strokeWidth="1" + android:fillColor="#000000" + android:fillType="evenOdd" + android:strokeColor="#00000000"/> + + + diff --git a/servicing/src/main/res/drawable/sv_order_report.xml b/servicing/src/main/res/drawable/sv_order_report.xml new file mode 100644 index 0000000..ba10c56 --- /dev/null +++ b/servicing/src/main/res/drawable/sv_order_report.xml @@ -0,0 +1,48 @@ + + + + + + + + + diff --git a/servicing/src/main/res/drawable/sv_service_phone.xml b/servicing/src/main/res/drawable/sv_service_phone.xml new file mode 100644 index 0000000..e373e6e --- /dev/null +++ b/servicing/src/main/res/drawable/sv_service_phone.xml @@ -0,0 +1,36 @@ + + + + + + + diff --git a/servicing/src/main/res/layout-land/sign_activity_grid_paint.xml b/servicing/src/main/res/layout-land/sign_activity_grid_paint.xml index 0e350a4..fa0535e 100644 --- a/servicing/src/main/res/layout-land/sign_activity_grid_paint.xml +++ b/servicing/src/main/res/layout-land/sign_activity_grid_paint.xml @@ -1,6 +1,7 @@ diff --git a/servicing/src/main/res/layout/floating_view_layout.xml b/servicing/src/main/res/layout/floating_view_layout.xml index 3a1296a..bdbc57d 100644 --- a/servicing/src/main/res/layout/floating_view_layout.xml +++ b/servicing/src/main/res/layout/floating_view_layout.xml @@ -8,5 +8,5 @@ android:id="@+id/floating_image" android:layout_width="64dp" android:layout_height="64dp" - android:src="@mipmap/ic_customer" /> + android:src="@drawable/sv_order_report" /> \ No newline at end of file diff --git a/servicing/src/main/res/layout/sign_activity_grid_paint.xml b/servicing/src/main/res/layout/sign_activity_grid_paint.xml index 4ae6067..120f168 100644 --- a/servicing/src/main/res/layout/sign_activity_grid_paint.xml +++ b/servicing/src/main/res/layout/sign_activity_grid_paint.xml @@ -2,9 +2,10 @@ @@ -46,7 +47,7 @@ android:layout_height="wrap_content" android:layout_margin="5dp" android:gravity="center" - android:text="请务必规范书写,否则造成的损失由您承担" + android:text="请务必逐字正楷填写您的名字" android:textColor="@color/red" android:textSize="15.dp" android:textStyle="bold" /> @@ -55,7 +56,6 @@ android:id="@+id/bottom" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_alignParentBottom="true" android:layout_margin="10dp" android:background="@drawable/sign_bg_shape" android:gravity="center_horizontal" @@ -72,8 +72,8 @@ android:id="@+id/circle_container" android:layout_width="@dimen/sign_tool_icon_size" android:layout_height="@dimen/sign_tool_icon_size" - android:visibility="gone" - android:layout_weight="1"> + android:layout_weight="1" + android:visibility="gone"> #0cba02 #f9d403 #027de9 - #0c53ab + #FF3D4B7C #f5f5f5 #7fffffff