From 405f732502a7f858e4e326e91402a8bd81191352 Mon Sep 17 00:00:00 2001 From: songzhiling <17630035658@163.com> Date: Thu, 29 May 2025 10:29:10 +0800 Subject: [PATCH] =?UTF-8?q?refactor(ui):=20=E9=87=8D=E6=9E=84=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E7=9B=B8=E5=85=B3=E7=95=8C=E9=9D=A2=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 NewOrderItem 组件用于统一订单展示样式 - 优化 GoAccidentSiteActivity、GoToDestinationActivity 和 NewOrderActivity 的界面布局 -移除冗余代码,提高代码复用性 - 调整样式和间距,提升用户体验 --- .../main/java/com/za/sdk/demo/MainActivity.kt | 2 +- gradle/libs.versions.toml | 3 +- servicing/build.gradle | 4 +- .../main/java/com/za/base/view/AppTipsView.kt | 11 +- .../main/java/com/za/call/CallLogManager.kt | 3 + .../src/main/java/com/za/ext/ContextExt.kt | 7 +- .../com/za/ui/new_order/NewOrderActivity.kt | 209 +-------- .../com/za/ui/new_order/NewOrderItemView.kt | 430 ++++++++++++++++++ .../go_accident/GoAccidentSiteActivity.kt | 199 +------- .../servicing/go_accident/GoAccidentSiteVm.kt | 5 - .../GoToDestinationActivity.kt | 179 +------- .../wait_to_start/WaitToStartActivity.kt | 185 +------- .../src/main/res/drawable/sv_new_copy.xml | 14 + .../src/main/res/drawable/sv_order_change.xml | 81 ++++ .../src/main/res/drawable/sv_order_ele.xml | 94 ++++ .../src/main/res/drawable/sv_order_photo.xml | 132 ++++++ .../main/res/drawable/sv_order_reserve.xml | 18 + .../src/main/res/drawable/sv_settle_cash.xml | 18 + .../src/main/res/drawable/sv_settle_month.xml | 18 + .../res/layout/sign_activity_grid_paint.xml | 44 +- 20 files changed, 928 insertions(+), 728 deletions(-) create mode 100644 servicing/src/main/java/com/za/ui/new_order/NewOrderItemView.kt create mode 100644 servicing/src/main/res/drawable/sv_new_copy.xml create mode 100644 servicing/src/main/res/drawable/sv_order_change.xml create mode 100644 servicing/src/main/res/drawable/sv_order_ele.xml create mode 100644 servicing/src/main/res/drawable/sv_order_photo.xml create mode 100644 servicing/src/main/res/drawable/sv_order_reserve.xml create mode 100644 servicing/src/main/res/drawable/sv_settle_cash.xml create mode 100644 servicing/src/main/res/drawable/sv_settle_month.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 55c89f0..6882ca7 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=ZD250521100797&driverName=宋志领&driverPhone=17630035658&rescueVehicle=沪88888".toUri() + "zd.assist://app?taskCode=ZD250521100686&driverName=宋志领&driverPhone=17630035658&rescueVehicle=沪88888".toUri() val intent = Intent(Intent.ACTION_VIEW, uri) startActivity(intent) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a712fe4..d08f376 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -39,7 +39,6 @@ rxjava = "3.1.7" search = "7.3.0" tbssdk = "44286" uiGraphics = "1.7.7" -uiTooling = "1.7.7" uiToolingPreview = "1.7.7" uiVersion = "1.7.7" utilcodex = "1.31.1" @@ -61,7 +60,6 @@ androidx-ui = { module = "androidx.compose.ui:ui", version.ref = "uiVersion" } androidx-ui-graphics = { module = "androidx.compose.ui:ui-graphics", version.ref = "uiGraphics" } androidx-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4", version.ref = "uiGraphics" } androidx-ui-test-manifest = { module = "androidx.compose.ui:ui-test-manifest", version.ref = "uiGraphics" } -androidx-ui-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "uiTooling" } androidx-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview", version.ref = "uiToolingPreview" } androidx-work-runtime-ktx = { module = "androidx.work:work-runtime-ktx", version.ref = "workRuntimeKtx" } coil-compose = { module = "io.coil-kt:coil-compose", version.ref = "coilCompose" } @@ -101,6 +99,7 @@ xdmap = { module = "com.amap.api:3dmap", version.ref = "xdmap" } xz = { module = "org.tukaani:xz", version.ref = "xz" } androidx-exifinterface = { group = "androidx.exifinterface", name = "exifinterface", version.ref = "exifinterface" } face-detection = { module = "com.google.mlkit:face-detection", version.ref = "faceDetection" } +ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling", version.ref = "uiToolingPreview" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } diff --git a/servicing/build.gradle b/servicing/build.gradle index 817b8fe..8b9f67d 100644 --- a/servicing/build.gradle +++ b/servicing/build.gradle @@ -58,7 +58,7 @@ publishing { release(MavenPublication) { groupId = 'io.github.szl9' artifactId = 'zd_servicing' - version = "1.0.1.9.9.120" + version = "1.0.1.9.9.126" pom { packaging = "aar" @@ -149,8 +149,8 @@ dependencies { androidTestApi libs.androidx.espresso.core androidTestApi platform(libs.androidx.compose.bom) androidTestApi libs.androidx.ui.test.junit4 - debugApi libs.androidx.ui.tooling debugApi libs.androidx.ui.test.manifest + debugApi libs.ui.tooling api libs.coil.compose api libs.coil.gif diff --git a/servicing/src/main/java/com/za/base/view/AppTipsView.kt b/servicing/src/main/java/com/za/base/view/AppTipsView.kt index d497b8a..e2779fc 100644 --- a/servicing/src/main/java/com/za/base/view/AppTipsView.kt +++ b/servicing/src/main/java/com/za/base/view/AppTipsView.kt @@ -33,6 +33,7 @@ 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.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.za.base.NetworkRouteSelectionActivity @@ -53,16 +54,16 @@ fun AppTipsView() { when (warnBean) { is NetWarnBean -> { - NetworkWeakView(warnBean as NetWarnBean) + NetworkWeakView() } else -> {} } } - +@Preview @Composable -fun NetworkWeakView(netWarnBean : NetWarnBean) { +fun NetworkWeakView() { val context = LocalContext.current AnimatedVisibility(context !is NetworkRouteSelectionActivity, @@ -97,10 +98,10 @@ fun NetworkWeakView(netWarnBean : NetWarnBean) { Spacer(modifier = Modifier.width(5.dp)) - Text(text = "当前网络异常,可以在线路检测中检测线路并切换!", + Text(text = "检测线路并切换", style = MaterialTheme.typography.bodyMedium, color = Color(0xFF757575), - fontSize = 12.sp) + fontSize = 10.sp) } Box(modifier = Modifier diff --git a/servicing/src/main/java/com/za/call/CallLogManager.kt b/servicing/src/main/java/com/za/call/CallLogManager.kt index 368970c..4694396 100644 --- a/servicing/src/main/java/com/za/call/CallLogManager.kt +++ b/servicing/src/main/java/com/za/call/CallLogManager.kt @@ -30,6 +30,9 @@ object CallLogManager { var phoneCallContactBean : ContactRecordBean? = null fun uploadCallLog(context : Context) { + if (GlobalData.token.isNullOrEmpty()) { + return + } if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED ) { diff --git a/servicing/src/main/java/com/za/ext/ContextExt.kt b/servicing/src/main/java/com/za/ext/ContextExt.kt index 9bc740f..2c35d56 100644 --- a/servicing/src/main/java/com/za/ext/ContextExt.kt +++ b/servicing/src/main/java/com/za/ext/ContextExt.kt @@ -5,10 +5,9 @@ import android.app.Activity import android.content.Context import android.content.Intent import android.content.pm.PackageManager -import android.net.Uri import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat -import com.blankj.utilcode.util.ActivityUtils +import androidx.core.net.toUri import com.blankj.utilcode.util.ToastUtils import com.za.call.CallLogManager import com.za.call.ContactRecordBean @@ -94,6 +93,6 @@ fun Context.callPhone(phone : String?) { taskCode = GlobalData.currentOrder?.taskCode, phone = phone) } - val intentPhone = Intent(Intent.ACTION_DIAL, Uri.parse("tel:$phone")) - ActivityCompat.startActivity(this, intentPhone, null) + val intentPhone = Intent(Intent.ACTION_DIAL, "tel:$phone".toUri()) + this.startActivity(intentPhone) } \ No newline at end of file diff --git a/servicing/src/main/java/com/za/ui/new_order/NewOrderActivity.kt b/servicing/src/main/java/com/za/ui/new_order/NewOrderActivity.kt index 8d28236..231e848 100644 --- a/servicing/src/main/java/com/za/ui/new_order/NewOrderActivity.kt +++ b/servicing/src/main/java/com/za/ui/new_order/NewOrderActivity.kt @@ -5,7 +5,6 @@ import android.content.Intent import android.os.Build import android.os.Handler import android.os.Looper -import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -19,13 +18,8 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.foundation.layout.wrapContentHeight -import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.foundation.verticalScroll import androidx.compose.material3.BottomSheetScaffold -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.SheetValue @@ -62,7 +56,6 @@ import com.amap.api.maps.model.LatLngBounds import com.amap.api.maps.model.MarkerOptions import com.amap.api.maps.model.PolylineOptions import com.za.base.BaseActivity -import com.za.base.theme.headBgColor import com.za.base.view.CommonDialog import com.za.base.view.HeadViewNotBack import com.za.bean.JpushBean @@ -223,196 +216,18 @@ private fun AcceptOrderScreen(jpushBean : JpushBean?, vm : NewOrderVm = viewMode BottomSheetScaffold(scaffoldState = scaffoldState, topBar = { HeadViewNotBack(title = "新订单") }, sheetContent = { - Column(modifier = Modifier - .fillMaxWidth() - .wrapContentHeight() - .background(Color.White) - .verticalScroll(rememberScrollState())) { // 滑动指示器 - Box(modifier = Modifier - .fillMaxWidth() - .padding(vertical = 8.dp) - .background(Color.White), contentAlignment = Alignment.Center) { - Box(modifier = Modifier - .width(32.dp) - .height(4.dp) - .background(color = Color(0xFFE0E0E0), shape = RoundedCornerShape(2.dp))) - } - - // 滑动指示器和订单类型行 - Row(modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 12.dp), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically) { - Text(text = uiState.value.jpushBean?.serviceTypeName ?: "", - fontSize = 18.sp, - fontWeight = FontWeight.Bold, - color = Color.Black) - - // 修改倒计时显示 - Text(text = if (uiState.value.isTimeout) "已超时" else "${uiState.value.remainingTime}S", - color = Color(0xFFFF4D4F), - fontSize = 20.sp, - fontWeight = FontWeight.Bold) - } - - // 添加距离和时间信息 - // 距离和时间信息 - Row(modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 12.dp), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically) { - Text(text = if (uiState.value.estimatedArrivalTime.isNotEmpty()) "预计到达: ${uiState.value.estimatedArrivalTime}" - else "计算中...", color = Color(0xFF666666), fontSize = 14.sp) - - Text(text = if (uiState.value.remainingDistance > 0) "距离救援地: %.1fkm".format( - uiState.value.remainingDistance / 1000f) - else "计算中...", color = Color(0xFFFF4D4F), fontSize = 14.sp) - } - - HorizontalDivider(modifier = Modifier - .fillMaxWidth() - .alpha(0.1f)) - - // 订单信息 - Column(modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 12.dp)) { // 订单标签 - Text(text = uiState.value.jpushBean?.serviceTypeName ?: "", - fontSize = 18.sp, - fontWeight = FontWeight.Bold, - color = Color.Black) - - Spacer(modifier = Modifier.height(8.dp)) - - // 订单标签 - Row(verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(8.dp)) { - Box(modifier = Modifier - .background(Color(0xFF9BA1B2), RoundedCornerShape(4.dp)) - .padding(horizontal = 6.dp, vertical = 2.dp)) { - Text(text = "月结".takeIf { uiState.value.jpushBean?.settleType == 1 } - ?: "现金", color = Color.White, fontSize = 12.sp) - } - - Text(text = uiState.value.jpushBean?.orderSource ?: "", - color = Color.Black, - fontSize = 12.sp) - - Text(text = uiState.value.jpushBean?.addressProperty ?: "", - color = Color(0xFFFD8205), - fontSize = 12.sp, - fontWeight = FontWeight.Medium) - } - - Spacer(modifier = Modifier.height(12.dp)) - - // 订单号 - Row(verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.clickable { - uiState.value.jpushBean?.taskCode?.copy(context) - }) { - Text(text = "单号", color = Color(0xFF999999), fontSize = 13.sp) - - Spacer(modifier = Modifier.width(8.dp)) - - Text(text = uiState.value.jpushBean?.taskCode ?: "", - color = Color(0xFF666666), - fontSize = 14.sp) - - Spacer(modifier = Modifier.width(8.dp)) - - AsyncImage(model = R.drawable.sv_copy, - contentDescription = "copy", - modifier = Modifier.size(16.dp)) - } - - Spacer(modifier = Modifier.height(16.dp)) - - // 地址信息 - Column(verticalArrangement = Arrangement.spacedBy(16.dp)) { // 救援地 - Row(verticalAlignment = Alignment.Top, - modifier = Modifier.clickable { // 点击救援地时移动地图到救援位置 - uiState.value.jpushBean?.let { order -> - if (order.lat != null && order.lat != 0.0 && order.lng != null && order.lng != 0.0) { - mapView.map.animateCamera(CameraUpdateFactory.newLatLngZoom( - LatLng(order.lat !!, order.lng !!), - 16f)) - } - } - }) { - AsyncImage(model = R.drawable.sv_rescuing, - contentDescription = "rescue", - modifier = Modifier.size(16.dp)) - - Spacer(modifier = Modifier.width(8.dp)) - - Text(text = uiState.value.jpushBean?.address ?: "", - color = Color.Black, - fontSize = 15.sp, - fontWeight = FontWeight.Medium) - } - - // 目的地 - if (! uiState.value.jpushBean?.distAddress.isNullOrBlank()) { - Row(verticalAlignment = Alignment.Top, - modifier = Modifier.clickable { // 点击目的地时移动地图到目的地位置 - uiState.value.jpushBean?.let { order -> - if (order.distLat != null && order.distLat != 0.0 && order.distLng != null && order.distLng != 0.0) { - mapView.map.animateCamera(CameraUpdateFactory.newLatLngZoom( - LatLng(order.distLat !!, order.distLng !!), - 16f)) - } - } - }) { - AsyncImage(model = R.drawable.sv_dist, - contentDescription = "destination", - modifier = Modifier.size(16.dp)) - - Spacer(modifier = Modifier.width(8.dp)) - - Text(text = uiState.value.jpushBean?.distAddress ?: "", - color = Color.Black, - fontSize = 15.sp, - fontWeight = FontWeight.Medium) - } - } - } - - Spacer(modifier = Modifier.height(16.dp)) - - // 修改按钮状态 - Row(modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 16.dp), - horizontalArrangement = Arrangement.spacedBy(12.dp)) { // 拒单按钮 - Button(onClick = { vm.dispatch(NewOrderVm.Action.RefuseOrder) }, - modifier = Modifier - .weight(1f) - .height(44.dp), - colors = ButtonDefaults.buttonColors(containerColor = Color.White, - contentColor = Color(0xFF666666)), - border = BorderStroke(1.dp, Color(0xFFE5E5E5)), - shape = RoundedCornerShape(8.dp)) { - Text(text = "拒绝", fontSize = 16.sp, fontWeight = FontWeight.Medium) - } - - // 接单按钮 - Button(onClick = { vm.dispatch(NewOrderVm.Action.ShowTaskNotes) }, - modifier = Modifier - .weight(1f) - .height(44.dp), - colors = ButtonDefaults.buttonColors(containerColor = headBgColor), - shape = RoundedCornerShape(8.dp)) { - Text(text = "接单", - color = Color.White, - fontSize = 16.sp, - fontWeight = FontWeight.Medium) - } - } - } - } + val uiBean = NewOrderItemUIBean(taskCode = uiState.value.jpushBean?.taskCode, + addressProperty = uiState.value.jpushBean?.addressProperty, + address = uiState.value.jpushBean?.address, + distAddress = uiState.value.jpushBean?.distAddress, + serviceTypeName = uiState.value.jpushBean?.serviceTypeName, + orderSource = uiState.value.jpushBean?.orderSource, + settleType = uiState.value.jpushBean?.settleType, + bottomTextString = "接单", + uiType = NewOrderUiType.ACCEPT) + NewOrderItem(uiBean, goAccept = { + vm.dispatch(NewOrderVm.Action.ShowTaskNotes) + }) }, sheetPeekHeight = 180.dp, sheetShape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp), diff --git a/servicing/src/main/java/com/za/ui/new_order/NewOrderItemView.kt b/servicing/src/main/java/com/za/ui/new_order/NewOrderItemView.kt new file mode 100644 index 0000000..ca68b3f --- /dev/null +++ b/servicing/src/main/java/com/za/ui/new_order/NewOrderItemView.kt @@ -0,0 +1,430 @@ +package com.za.ui.new_order + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +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.Spacer +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.KeyboardArrowRight +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.material3.VerticalDivider +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import coil.compose.AsyncImage +import com.za.base.theme.bgColor +import com.za.base.theme.black50 +import com.za.base.theme.black90 +import com.za.base.view.CommonButton +import com.za.ext.copy +import com.za.servicing.R + + +object NewOrderUiType { + const val SERVICING = 1 + const val HISTORY = 2 + const val ACCEPT = 3 + const val PENDING = 4 + const val IN_SERVICING_HOME = 5 +} + +data class NewOrderItemUIBean( + val taskCode : String? = null, + val addressProperty : String? = null, + val address : String? = null, + val distAddress : String? = null, + val serviceTypeName : String? = null, + val orderSource : String? = null, + val settleType : Int? = null, + val currentOrderState : String? = null, + val supplierAuditStr : String? = null, //审核状态描述 + val reserveTime : String? = null, //预约时间 + val expectArriveTime : String? = null, //预计到达时间 + val auditFailReason : String? = null, //审核失败原因 + val bottomTextString : String? = null, //底部文字 + val hasReplaceBatteryCapable : Int? = null, //是否具有更换电瓶的能力 + val uiType : Int? = 1, //1 服务中 2 历史订单 3 接单页 4 待服务页 5 进行中首页 +) + +// 1 服务中 2 历史订单 +@Composable +fun NewOrderItem(uiBean : NewOrderItemUIBean?, + goInServicing : () -> Unit = {}, + goHistory : () -> Unit = {}, + goDetail : () -> Unit = {}, + goNextPage : () -> Unit = {}, + goAccept : () -> Unit = {}, + goOrderPhoto : () -> Unit = {}, + goEle : () -> Unit = {}, + goChange : () -> Unit = {}) { + val context = LocalContext.current + val horizontalPadding = 26.dp + Card(modifier = Modifier + .fillMaxWidth() + .clickable { + if (uiBean?.uiType == NewOrderUiType.HISTORY) { + goHistory() + return@clickable + } + if (uiBean?.uiType == NewOrderUiType.IN_SERVICING_HOME || uiBean?.uiType == NewOrderUiType.PENDING) { + goDetail() + return@clickable + } + } + .background(color = bgColor), + colors = CardDefaults.cardColors().copy(containerColor = Color.White), + shape = RoundedCornerShape(8.dp), + border = BorderStroke(width = 0.6.dp, color = Color(0xFFE6E6E6))) { + + NewOrderItemHead(uiBean = uiBean, goInServicing = goInServicing, goChange = goChange) + + if (uiBean?.uiType == NewOrderUiType.HISTORY) { + Spacer(modifier = Modifier.height(15.dp)) + Row(modifier = Modifier + .fillMaxWidth() + .height(20.dp) + .padding(horizontal = horizontalPadding), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Absolute.SpaceBetween) { + Text(text = uiBean?.serviceTypeName ?: "", + color = black90, + fontWeight = FontWeight.SemiBold, + fontSize = 17.sp) + Text(uiBean?.currentOrderState ?: "", + color = Color(0xFFF19028), + fontWeight = FontWeight.Medium, + fontSize = 13.sp) + } + } else { + Spacer(modifier = Modifier.height(15.dp)) + Row(modifier = Modifier + .fillMaxWidth() + .height(20.dp) + .clickable { uiBean?.taskCode.copy(context = context) } + .padding(horizontal = horizontalPadding), + verticalAlignment = Alignment.CenterVertically) { + Text("单号", color = black50, fontWeight = FontWeight.Medium, fontSize = 13.sp) + Spacer(modifier = Modifier.width(10.dp)) + Text(uiBean?.taskCode ?: "", + color = black90, + fontWeight = FontWeight.SemiBold, + fontSize = 16.sp, + modifier = Modifier.wrapContentSize(align = Alignment.Center)) + Spacer(modifier = Modifier.width(10.dp)) + Icon(imageVector = ImageVector.vectorResource(R.drawable.sv_new_copy), + contentDescription = null, + modifier = Modifier.size(13.dp)) + } + } + + Spacer(modifier = Modifier.height(10.dp)) + Row(modifier = Modifier + .fillMaxWidth() + .padding(horizontal = horizontalPadding), + verticalAlignment = Alignment.CenterVertically) { + AsyncImage(model = R.drawable.sv_settle_month.takeIf { uiBean?.settleType == 1 } + ?: R.drawable.sv_settle_cash, + contentDescription = null, + modifier = Modifier.size(31.dp, 16.dp)) + Spacer(modifier = Modifier.width(10.dp)) + Text(uiBean?.orderSource ?: "", + color = Color.Black, + fontWeight = FontWeight.Medium, + fontSize = 12.sp) + Spacer(Modifier.weight(1f)) + Text(uiBean?.addressProperty ?: "", + color = Color.Black, + fontWeight = FontWeight.SemiBold, + fontSize = 14.sp, + modifier = Modifier.wrapContentSize(align = Alignment.Center)) + } + + if (! uiBean?.reserveTime.isNullOrBlank()) { + Spacer(modifier = Modifier.height(4.dp)) + Row(modifier = Modifier + .fillMaxWidth() + .height(20.dp) + .padding(horizontal = horizontalPadding), + verticalAlignment = Alignment.CenterVertically) { + AsyncImage(model = R.drawable.sv_order_reserve, + contentDescription = null, + modifier = Modifier.size(31.dp, 16.dp)) + Spacer(modifier = Modifier.width(10.dp)) + Text(uiBean?.reserveTime ?: "", + color = Color(0xFF354E9E), + fontWeight = FontWeight.Medium, + fontSize = 12.sp) + } + } + + + Spacer(modifier = Modifier.height(10.dp)) + if (uiBean?.distAddress.isNullOrBlank()) { + + Row(modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 18.dp) + .background(color = Color(0x80F8FBFF), shape = RoundedCornerShape(4.dp)) + .border(width = 0.3.dp, color = Color(0xFFD8E4F0), shape = RoundedCornerShape(4.dp)) + .padding(horizontal = 12.dp, vertical = 10.dp), + verticalAlignment = Alignment.CenterVertically) { + + AsyncImage(model = R.drawable.sv_rescuing, + contentDescription = null, + modifier = Modifier.size(16.dp)) + Spacer(modifier = Modifier.width(10.dp)) + Text(uiBean?.address ?: "", + maxLines = 2, + overflow = TextOverflow.Ellipsis, + fontSize = 12.5.sp, + fontWeight = FontWeight.Medium, + color = black90) + } + } else { + Row(modifier = Modifier + .fillMaxWidth() + .height(140.dp) + .padding(horizontal = 18.dp) + .background(color = Color(0x80F8FBFF), shape = RoundedCornerShape(4.dp)) + .border(width = 0.3.dp, color = Color(0xFFD8E4F0), shape = RoundedCornerShape(4.dp)) + .padding(horizontal = 12.dp, vertical = 5.dp)) { + + Column(horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.SpaceAround) { + Spacer(modifier = Modifier.height(10.dp)) + AsyncImage(model = R.drawable.sv_rescuing, + contentDescription = null, + modifier = Modifier.size(16.dp)) + + if (! uiBean?.distAddress.isNullOrBlank()) { + VerticalDivider(modifier = Modifier.weight(1f), color = Color(0xFFC1C1C1)) + + AsyncImage(model = R.drawable.sv_dist, + contentDescription = null, + modifier = Modifier.size(16.dp)) + Spacer(modifier = Modifier.height(10.dp)) + } + + } + + Spacer(modifier = Modifier.width(18.dp)) + + Column(verticalArrangement = Arrangement.SpaceAround, + modifier = Modifier.fillMaxHeight()) { + Text(uiBean?.address ?: "", + maxLines = 2, + overflow = TextOverflow.Ellipsis, + fontSize = 12.5.sp, + fontWeight = FontWeight.Medium, + color = black90) + if (uiBean?.distAddress.isNullOrBlank() == false) { + HorizontalDivider(modifier = Modifier + .alpha(0.1f) + .padding(vertical = 5.dp)) + Text(uiBean?.distAddress ?: "", + maxLines = 2, + overflow = TextOverflow.Ellipsis, + fontSize = 12.5.sp, + fontWeight = FontWeight.Medium, + color = black90) + } + } + } + } + + if (! uiBean?.auditFailReason.isNullOrBlank()) { + Row(modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 18.dp) + .background(color = Color(0xFFFFF7EE), shape = RoundedCornerShape(4.dp)) + .padding(horizontal = 15.dp, vertical = 10.dp), + verticalAlignment = Alignment.CenterVertically) { + Icon(imageVector = ImageVector.vectorResource(R.drawable.sv_warn_yellow), + contentDescription = "", + tint = Color(0xFFFF8F37)) + Spacer(modifier = Modifier.width(7.dp)) + Text(uiBean?.auditFailReason ?: "", + color = Color(0xFFFF8F37), + fontWeight = FontWeight.Medium, + fontSize = 12.sp) + } + } + + if (uiBean?.uiType == NewOrderUiType.HISTORY) { + Spacer(modifier = Modifier.height(10.dp)) + + Row(modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp), + horizontalArrangement = Arrangement.SpaceAround) { + AsyncImage(model = R.drawable.sv_order_photo, + contentDescription = null, + modifier = Modifier + .size(93.dp, 25.dp) + .clickable { goOrderPhoto() }, + contentScale = ContentScale.None) + + AsyncImage(model = R.drawable.sv_order_ele, + contentDescription = null, + modifier = Modifier + .size(93.dp, 25.dp) + .clickable { goEle() }, + contentScale = ContentScale.None) + + if (uiBean.hasReplaceBatteryCapable == 1) { + AsyncImage(model = R.drawable.sv_order_change, + contentDescription = null, + modifier = Modifier + .size(93.dp, 25.dp) + .clickable { + goChange() + }, + contentScale = ContentScale.None) + } + } + } + + + if (uiBean?.uiType == NewOrderUiType.SERVICING || uiBean?.uiType == NewOrderUiType.ACCEPT) { + Spacer(modifier = Modifier.height(10.dp)) + CommonButton(text = uiBean?.bottomTextString ?: "") { + if (uiBean?.uiType == NewOrderUiType.ACCEPT) { + goAccept() + return@CommonButton + } + goNextPage() + } + } + + Spacer(modifier = Modifier.height(20.dp)) + } +} + +@Composable +fun NewOrderItemHead(uiBean : NewOrderItemUIBean?, + goInServicing : () -> Unit = {}, + goChange : () -> Unit = {}) { + when (uiBean?.uiType) { + NewOrderUiType.IN_SERVICING_HOME, NewOrderUiType.PENDING, NewOrderUiType.SERVICING -> { + Row(modifier = Modifier + .fillMaxWidth() + .clickable { + if (uiBean?.uiType == NewOrderUiType.IN_SERVICING_HOME) { + goInServicing() + return@clickable + } + if (uiBean?.uiType == NewOrderUiType.PENDING) { + goChange() + return@clickable + } + } + .padding(horizontal = 5.dp, vertical = 3.dp) + .background(color = Color(0xFFF9FDFF), + shape = RoundedCornerShape(topStart = 5.dp, + topEnd = 5.dp, + bottomStart = 0.dp, + bottomEnd = 0.dp)) + .padding(top = 14.dp, bottom = 8.dp, start = 21.dp, end = 16.dp), + verticalAlignment = Alignment.CenterVertically) { + Text(uiBean.serviceTypeName ?: "", + color = black90, + fontWeight = FontWeight.Medium, + fontSize = 17.sp) + Spacer(Modifier.weight(1f)) + + + if (uiBean?.uiType == NewOrderUiType.SERVICING) { + Text("预计到达:", + color = Color(0xFFF19028), + fontWeight = FontWeight.Medium, + fontSize = 13.sp) + Spacer(modifier = Modifier.width(8.dp)) + Text("${ + uiBean.expectArriveTime?.split(" ")?.get(1) + }", color = Color(0xFFF19028), fontWeight = FontWeight.Medium, fontSize = 13.sp) + } else { + Text(uiBean?.currentOrderState ?: "", + color = Color(0xFFF19028), + fontWeight = FontWeight.Medium, + fontSize = 13.sp) + Spacer(modifier = Modifier.width(8.dp)) + + Icon(Icons.Default.KeyboardArrowRight, + contentDescription = null, + modifier = Modifier.size(13.dp), + tint = Color.Gray) + } + } + } + + NewOrderUiType.HISTORY -> { + Row(modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 5.dp, vertical = 3.dp) + .background(color = Color(0xFFF9FDFF), + shape = RoundedCornerShape(topStart = 5.dp, + topEnd = 5.dp, + bottomStart = 0.dp, + bottomEnd = 0.dp)) + .padding(top = 14.dp, bottom = 8.dp, start = 21.dp, end = 16.dp), + verticalAlignment = Alignment.CenterVertically) { + Text(uiBean?.taskCode ?: "", + color = black90, + fontWeight = FontWeight.Medium, + fontSize = 17.sp) + Spacer(modifier = Modifier.width(9.dp)) + Icon(imageVector = ImageVector.vectorResource(R.drawable.sv_new_copy), + contentDescription = null, + modifier = Modifier.size(13.dp)) + Spacer(Modifier.weight(1f)) + Box(modifier = Modifier + .background(color = Color(0x99FFEBEB), shape = RoundedCornerShape(4.dp)) + .border(width = 0.5.dp, + color = Color(0xFFFFC7B8), + shape = RoundedCornerShape(4.dp)) + .padding(horizontal = 4.dp, vertical = 2.dp)) { + Text(uiBean?.supplierAuditStr ?: "", + color = Color(0xFFFF5656), + fontWeight = FontWeight.Normal, + fontSize = 10.sp, + style = TextStyle.Default.copy()) + } + Spacer(modifier = Modifier.width(8.dp)) + Icon(Icons.Default.KeyboardArrowRight, + contentDescription = null, + modifier = Modifier.size(13.dp), + tint = Color.Gray) + } + } + } + + HorizontalDivider(modifier = Modifier.alpha(0.1f)) +} \ 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 293444e..9c124bc 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 @@ -3,50 +3,28 @@ package com.za.ui.servicing.go_accident import android.os.Bundle import android.os.Handler import android.os.Looper -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -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.Spacer 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.size -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.layout.wrapContentHeight -import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.foundation.verticalScroll import androidx.compose.material3.BottomSheetScaffold -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.SheetValue -import androidx.compose.material3.Text import androidx.compose.material3.rememberBottomSheetScaffoldState import androidx.compose.material3.rememberStandardBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.alpha 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 androidx.compose.ui.viewinterop.AndroidView import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel -import coil.compose.AsyncImage import com.amap.api.location.AMapLocationClient import com.amap.api.maps.CameraUpdateFactory import com.amap.api.maps.MapView @@ -56,14 +34,16 @@ import com.amap.api.maps.model.LatLngBounds import com.amap.api.maps.model.MarkerOptions import com.amap.api.maps.model.PolylineOptions import com.za.base.BaseActivity -import com.za.base.theme.headBgColor import com.za.base.view.CommonDialog import com.za.common.GlobalData import com.za.common.util.ImageUtil -import com.za.ext.copy +import com.za.ext.convertToFlowName import com.za.ext.finish import com.za.ext.goNextPage import com.za.servicing.R +import com.za.ui.new_order.NewOrderItem +import com.za.ui.new_order.NewOrderItemUIBean +import com.za.ui.new_order.NewOrderUiType import com.za.ui.servicing.view.InServicingHeadView import com.za.ui.servicing.view.ServiceOperation @@ -137,163 +117,20 @@ fun GoAccidentSiteScreen(vm : GoAccidentSiteVm = viewModel()) { orderInfo = uiState.value.orderInfo) }, sheetContent = { - Column(modifier = Modifier - .fillMaxWidth() - .wrapContentHeight() - .verticalScroll(rememberScrollState())) { - Box(modifier = Modifier - .fillMaxWidth() - .padding(vertical = 8.dp), - contentAlignment = Alignment.Center) { - Box(modifier = Modifier - .width(32.dp) - .height(4.dp) - .background(color = Color(0xFFE0E0E0), shape = RoundedCornerShape(2.dp))) - } - - Row(modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 12.dp), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically) { - Text(text = if (! uiState.value.estimatedArrivalTime.isNullOrBlank()) "预计到达: ${uiState.value.estimatedArrivalTime}" - else "计算中...", color = Color(0xFF666666), fontSize = 14.sp) - - Text(text = if (uiState.value.remainingDistance > 0) "距离救援地: %.1fkm".format( - uiState.value.remainingDistance / 1000f) - else "计算中...", color = Color(0xFFFF4D4F), fontSize = 14.sp) - } - - HorizontalDivider(modifier = Modifier - .fillMaxWidth() - .alpha(0.1f)) - - Column(modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 12.dp)) { - - Text(text = uiState.value.orderInfo?.serviceTypeName ?: "", - fontSize = 18.sp, - fontWeight = FontWeight.Bold, - color = Color.Black) - - Spacer(modifier = Modifier.height(8.dp)) - - // 订单标签 - Row(verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(8.dp)) { - Box(modifier = Modifier - .background(Color(0xFF9BA1B2), RoundedCornerShape(4.dp)) - .padding(horizontal = 6.dp, vertical = 2.dp)) { - Text(text = "月结".takeIf { uiState.value.orderInfo?.settleType == 1 } - ?: "现金", color = Color.White, fontSize = 12.sp) - } - - Text(text = uiState.value.orderInfo?.orderSource ?: "", - color = Color.Black, - fontSize = 12.sp) - - Text(text = uiState.value.orderInfo?.addressProperty ?: "", - color = Color(0xFFFD8205), - fontSize = 12.sp, - fontWeight = FontWeight.Medium) - } - Spacer(modifier = Modifier.height(12.dp)) - - Row(verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.clickable { - uiState.value.orderInfo?.taskCode?.copy(context) - }) { - Text(text = "单号", color = Color(0xFF999999), fontSize = 13.sp) - - Spacer(modifier = Modifier.width(8.dp)) - - Text(text = uiState.value.orderInfo?.taskCode ?: "", - color = Color(0xFF666666), - fontSize = 14.sp) - - Spacer(modifier = Modifier.width(8.dp)) - - AsyncImage(model = R.drawable.sv_copy, - contentDescription = "copy", - modifier = Modifier.size(16.dp)) - } - - Spacer(modifier = Modifier.height(12.dp)) - - Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { - Row(verticalAlignment = Alignment.Top, - modifier = Modifier - .fillMaxWidth() - .clickable { - uiState.value.orderInfo?.let { order -> - if (order.lat != null && order.lat != 0.0 && order.lng != null && order.lng != 0.0) { - mapView.map.animateCamera(CameraUpdateFactory.newLatLngZoom( - LatLng(order.lat !!, order.lng !!), - 16f)) - } - } - }) { - AsyncImage(model = R.drawable.sv_rescuing, - contentDescription = "rescue", - modifier = Modifier.size(16.dp)) - - Spacer(modifier = Modifier.width(8.dp)) - - Text(text = uiState.value.orderInfo?.address ?: "", - color = Color.Black, - fontSize = 15.sp, - fontWeight = FontWeight.Medium, - modifier = Modifier.weight(1f)) - } - - if (! uiState.value.orderInfo?.distAddress.isNullOrBlank()) { - Row(verticalAlignment = Alignment.Top, - modifier = Modifier - .fillMaxWidth() - .clickable { - uiState.value.orderInfo?.let { order -> - if (order.distLat != null && order.distLat != 0.0 && order.distLng != null && order.distLng != 0.0) { - mapView.map.animateCamera(CameraUpdateFactory.newLatLngZoom( - LatLng(order.distLat !!, order.distLng !!), - 16f)) - } - } - }) { - AsyncImage(model = R.drawable.sv_dist, - contentDescription = "destination", - modifier = Modifier.size(16.dp)) - - Spacer(modifier = Modifier.width(8.dp)) - - Text(text = uiState.value.orderInfo?.distAddress ?: "", - color = Color.Black, - fontSize = 15.sp, - fontWeight = FontWeight.Medium, - modifier = Modifier.weight(1f)) - } - } - } - } - - Button(onClick = { - vm.dispatch(GoAccidentSiteVm.Action.UpdateState(uiState.value.copy( - isGoNextPageDialog = true))) - }, - modifier = Modifier - .fillMaxWidth() - .height(44.dp) - .padding(horizontal = 16.dp), - colors = ButtonDefaults.buttonColors(containerColor = headBgColor), - shape = RoundedCornerShape(8.dp)) { - Text(text = "到达事发地", - color = Color.White, - fontSize = 16.sp, - fontWeight = FontWeight.Medium) - } - - Spacer(modifier = Modifier.height(16.dp)) - } + val uiBean = NewOrderItemUIBean(taskCode = uiState.value.orderInfo?.taskCode, + addressProperty = uiState.value.orderInfo?.addressProperty, + address = uiState.value.orderInfo?.address, + distAddress = uiState.value.orderInfo?.distAddress, + serviceTypeName = uiState.value.orderInfo?.serviceTypeName, + orderSource = uiState.value.orderInfo?.orderSource, + settleType = uiState.value.orderInfo?.settleType, + bottomTextString = "到达事发地", + expectArriveTime = uiState.value.orderInfo?.expectArriveTime, + uiType = NewOrderUiType.SERVICING) + NewOrderItem(uiBean, goNextPage = { + vm.dispatch(GoAccidentSiteVm.Action.UpdateState(uiState.value.copy( + isGoNextPageDialog = true))) + }) }, sheetPeekHeight = 180.dp, sheetShape = RoundedCornerShape(topStart = 12.dp, topEnd = 12.dp), 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 9da2acb..0dc6224 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 @@ -1,6 +1,5 @@ package com.za.ui.servicing.go_accident -import androidx.lifecycle.viewModelScope import com.amap.api.maps.AMapUtils import com.amap.api.maps.model.BitmapDescriptorFactory import com.amap.api.maps.model.LatLng @@ -29,11 +28,7 @@ import com.za.offline.OfflineUpdateTaskBean import com.za.service.location.ZdLocationManager import com.za.servicing.R import kotlinx.coroutines.Job -import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.update -import kotlinx.coroutines.isActive -import kotlinx.coroutines.launch import java.text.SimpleDateFormat import java.util.Calendar import java.util.Date diff --git a/servicing/src/main/java/com/za/ui/servicing/go_to_destination/GoToDestinationActivity.kt b/servicing/src/main/java/com/za/ui/servicing/go_to_destination/GoToDestinationActivity.kt index 135dc0f..3081594 100644 --- a/servicing/src/main/java/com/za/ui/servicing/go_to_destination/GoToDestinationActivity.kt +++ b/servicing/src/main/java/com/za/ui/servicing/go_to_destination/GoToDestinationActivity.kt @@ -67,6 +67,10 @@ import com.za.ext.copy import com.za.ext.finish import com.za.ext.goNextPage import com.za.servicing.R +import com.za.ui.new_order.NewOrderItem +import com.za.ui.new_order.NewOrderItemUIBean +import com.za.ui.new_order.NewOrderUiType +import com.za.ui.new_order.NewOrderVm import com.za.ui.servicing.view.InServicingHeadView import com.za.ui.servicing.view.ServiceOperation @@ -179,168 +183,21 @@ fun GoToDestinationScreen(vm : GoToDestinationVm = viewModel()) { orderInfo = orderInfo) }, sheetContent = { - Column(modifier = Modifier - .fillMaxWidth() - .wrapContentHeight() - .verticalScroll(rememberScrollState())) { // 滑动指示器 - Box(modifier = Modifier - .fillMaxWidth() - .padding(vertical = 8.dp), - contentAlignment = Alignment.Center) { - Box(modifier = Modifier - .width(32.dp) - .height(4.dp) - .background(color = Color(0xFFE0E0E0), shape = RoundedCornerShape(2.dp))) - } + val uiBean = NewOrderItemUIBean(taskCode = uiState.value.orderInfo?.taskCode, + addressProperty = uiState.value.orderInfo?.addressProperty, + address = uiState.value.orderInfo?.address, + distAddress = uiState.value.orderInfo?.distAddress, + serviceTypeName = uiState.value.orderInfo?.serviceTypeName, + orderSource = uiState.value.orderInfo?.orderSource, + settleType = uiState.value.orderInfo?.settleType, + expectArriveTime = uiState.value.orderInfo?.expectArriveTime, + bottomTextString = "到达目的地", + uiType = NewOrderUiType.SERVICING) + NewOrderItem(uiBean, goNextPage = { + vm.dispatch(GoToDestinationVm.Action.UpdateState(uiState.value.copy( + isGoNextPageDialog = true))) + }) - // 距离和时间信息 - Row(modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 12.dp), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically) { - Text(text = if (estimatedTime.isNotEmpty()) "预计到达: $estimatedTime" - else "计算中...", color = Color(0xFF666666), fontSize = 14.sp) - - Text(text = if (remainingDistance > 0) "目的地距离: %.1fkm".format( - remainingDistance / 1000f) - else "计算中...", color = Color(0xFFFF4D4F), fontSize = 14.sp) - } - - // 使用 HorizontalDivider 替代 Box - HorizontalDivider(modifier = Modifier - .fillMaxWidth() - .alpha(0.1f)) - - // 订单信息 - Column(modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 12.dp)) { - Text(text = uiState.value.orderInfo?.serviceTypeName ?: "", - fontSize = 18.sp, - fontWeight = FontWeight.Bold, - color = Color.Black) - Spacer(modifier = Modifier.height(8.dp)) - // 订单标签 - Row(verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(8.dp)) { - Box(modifier = Modifier - .background(Color(0xFF9BA1B2), RoundedCornerShape(4.dp)) - .padding(horizontal = 6.dp, vertical = 2.dp)) { - Text(text = "月结".takeIf { uiState.value.orderInfo?.settleType == 1 } - ?: "现金", color = Color.White, fontSize = 12.sp) - } - - Text(text = uiState.value.orderInfo?.orderSource ?: "", - color = Color.Black, - fontSize = 12.sp) - - Text(text = uiState.value.orderInfo?.addressProperty ?: "", - color = Color(0xFFFD8205), - fontSize = 12.sp, - fontWeight = FontWeight.Medium) - } - - Spacer(modifier = Modifier.height(12.dp)) - - // 订单号 - Row(verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.clickable { - uiState.value.orderInfo?.taskCode?.copy(context) - }) { - Text(text = "单号", color = Color(0xFF999999), fontSize = 13.sp) - - Spacer(modifier = Modifier.width(8.dp)) - - Text(text = uiState.value.orderInfo?.taskCode ?: "", - color = Color(0xFF666666), - fontSize = 14.sp) - - Spacer(modifier = Modifier.width(8.dp)) - - AsyncImage(model = R.drawable.sv_copy, - contentDescription = "copy", - modifier = Modifier.size(16.dp)) - } - - Spacer(modifier = Modifier.height(12.dp)) - - // 地址信息 - Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { // 救援地 - Row(verticalAlignment = Alignment.Top, - modifier = Modifier - .fillMaxWidth() - .clickable { - uiState.value.orderInfo?.let { order -> - if (order.lat != null && order.lat != 0.0 && order.lng != null && order.lng != 0.0) { - mapView.map.animateCamera(CameraUpdateFactory.newLatLngZoom( - LatLng(order.lat !!, order.lng !!), - 16f)) - } - } - }) { - AsyncImage(model = R.drawable.sv_rescuing, - contentDescription = "rescue", - modifier = Modifier.size(16.dp)) - - Spacer(modifier = Modifier.width(8.dp)) - - Text(text = uiState.value.orderInfo?.address ?: "", - color = Color.Black, - fontSize = 15.sp, - fontWeight = FontWeight.Medium, - modifier = Modifier.weight(1f)) - } - - // 目的地 - if (! uiState.value.orderInfo?.distAddress.isNullOrBlank()) { - Row(verticalAlignment = Alignment.Top, - modifier = Modifier - .fillMaxWidth() - .clickable { - uiState.value.orderInfo?.let { order -> - if (order.distLat != null && order.distLat != 0.0 && order.distLng != null && order.distLng != 0.0) { - mapView.map.animateCamera(CameraUpdateFactory.newLatLngZoom( - LatLng(order.distLat !!, order.distLng !!), - 16f)) - } - } - }) { - AsyncImage(model = R.drawable.sv_dist, - contentDescription = "destination", - modifier = Modifier.size(16.dp)) - - Spacer(modifier = Modifier.width(8.dp)) - - Text(text = uiState.value.orderInfo?.distAddress ?: "", - color = Color.Black, - fontSize = 15.sp, - fontWeight = FontWeight.Medium, - modifier = Modifier.weight(1f)) - } - } - } - } - - // 到达按钮 - 移除外层 Column,简化布局 - Button(onClick = { - vm.dispatch(GoToDestinationVm.Action.UpdateState(uiState.value.copy( - isGoNextPageDialog = true))) - }, - modifier = Modifier - .fillMaxWidth() - .height(44.dp) - .padding(horizontal = 16.dp), - colors = ButtonDefaults.buttonColors(containerColor = headBgColor), - shape = RoundedCornerShape(8.dp)) { - Text(text = "到达目的地", - color = Color.White, - fontSize = 16.sp, - fontWeight = FontWeight.Medium) - } - - Spacer(modifier = Modifier.height(16.dp)) - } }, sheetPeekHeight = 180.dp, sheetShape = RoundedCornerShape(topStart = 12.dp, topEnd = 12.dp), 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 f6cd63b..600f041 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 @@ -68,6 +68,10 @@ import com.za.ext.finish import com.za.ext.goNextPage import com.za.ext.navigationActivity import com.za.servicing.R +import com.za.ui.new_order.NewOrderItem +import com.za.ui.new_order.NewOrderItemUIBean +import com.za.ui.new_order.NewOrderUiType +import com.za.ui.servicing.go_to_destination.GoToDestinationVm import com.za.ui.servicing.inservice_people_confirm.ServicePeopleConfirmActivity import com.za.ui.servicing.view.InServicingHeadView import com.za.ui.servicing.view.ServiceOperation @@ -163,170 +167,25 @@ fun WaitToStartScreen(vm : WaitToStartVm = viewModel()) { orderInfo = uiState.value.orderInfo) }, sheetContent = { - Column(modifier = Modifier - .fillMaxWidth() - .wrapContentHeight() - .verticalScroll(rememberScrollState())) { // 滑动指示器 - Box(modifier = Modifier - .fillMaxWidth() - .padding(vertical = 8.dp), - contentAlignment = Alignment.Center) { - Box(modifier = Modifier - .width(32.dp) - .height(4.dp) - .background(color = Color(0xFFE0E0E0), shape = RoundedCornerShape(2.dp))) + + val uiBean = NewOrderItemUIBean(taskCode = uiState.value.orderInfo?.taskCode, + addressProperty = uiState.value.orderInfo?.addressProperty, + address = uiState.value.orderInfo?.address, + distAddress = uiState.value.orderInfo?.distAddress, + serviceTypeName = uiState.value.orderInfo?.serviceTypeName, + orderSource = uiState.value.orderInfo?.orderSource, + settleType = uiState.value.orderInfo?.settleType, + expectArriveTime = uiState.value.orderInfo?.expectArriveTime, + bottomTextString = "发车", + uiType = NewOrderUiType.SERVICING) + NewOrderItem(uiBean, goNextPage = { + if (! GlobalData.isMaster && GlobalData.driverInfoBean != null && GlobalData.driverInfoBean?.authStatus == 1) { + vm.dispatch(WaitToStartVm.Action.UpdateState(uiState.value.copy( + showServicePeopleConfirmDialog = true))) + return@NewOrderItem } - - // 距离和时间信息 - Row(modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 12.dp), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically) { - Text(text = if (uiState.value.estimatedArrivalTime.isNotEmpty()) "预计到达: ${uiState.value.estimatedArrivalTime}" - else "计算中...", color = Color(0xFF666666), fontSize = 14.sp) - - Text(text = if (uiState.value.remainingDistance > 0) "距离救援地: %.1fkm".format( - uiState.value.remainingDistance / 1000f) - else "计算中...", color = Color(0xFFFF4D4F), fontSize = 14.sp) - } - - HorizontalDivider(modifier = Modifier - .fillMaxWidth() - .alpha(0.1f)) - - // 订单信息 - Column(modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 12.dp)) { // 订单类型 - Text(text = uiState.value.orderInfo?.serviceTypeName ?: "", - fontSize = 18.sp, - fontWeight = FontWeight.Bold, - color = Color.Black) - - Spacer(modifier = Modifier.height(8.dp)) - - // 订单标签 - Row(verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(8.dp)) { - Box(modifier = Modifier - .background(Color(0xFF9BA1B2), RoundedCornerShape(4.dp)) - .padding(horizontal = 6.dp, vertical = 2.dp)) { - Text(text = "月结".takeIf { uiState.value.orderInfo?.settleType == 1 } - ?: "现金", color = Color.White, fontSize = 12.sp) - } - - Text(text = uiState.value.orderInfo?.orderSource ?: "", - color = Color.Black, - fontSize = 12.sp) - - Text(text = uiState.value.orderInfo?.addressProperty ?: "", - color = Color(0xFFFD8205), - fontSize = 12.sp, - fontWeight = FontWeight.Medium) - } - - Spacer(modifier = Modifier.height(12.dp)) - - // 订单号 - Row(verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.clickable { - uiState.value.orderInfo?.taskCode?.copy(context) - }) { - Text(text = "单号", color = Color(0xFF999999), fontSize = 13.sp) - - Spacer(modifier = Modifier.width(8.dp)) - - Text(text = uiState.value.orderInfo?.taskCode ?: "", - color = Color(0xFF666666), - fontSize = 14.sp) - - Spacer(modifier = Modifier.width(8.dp)) - - AsyncImage(model = R.drawable.sv_copy, - contentDescription = "copy", - modifier = Modifier.size(16.dp)) - } - - Spacer(modifier = Modifier.height(16.dp)) - - // 地址信息 - Column(verticalArrangement = Arrangement.spacedBy(16.dp)) { // 救援地 - Row(verticalAlignment = Alignment.Top, - modifier = Modifier.clickable { // 点击救援地时移动地图到救援位置 - uiState.value.orderInfo?.let { order -> - if (order.lat != null && order.lat != 0.0 && order.lng != null && order.lng != 0.0) { - mapView.map.animateCamera(CameraUpdateFactory.newLatLngZoom( - LatLng(order.lat !!, order.lng !!), - 16f)) - } - } - }) { - AsyncImage(model = R.drawable.sv_rescuing, - contentDescription = "rescue", - modifier = Modifier.size(16.dp)) - - Spacer(modifier = Modifier.width(8.dp)) - - Text(text = uiState.value.orderInfo?.address ?: "", - color = Color.Black, - fontSize = 15.sp, - fontWeight = FontWeight.Medium) - } - - // 目的地 - if (! uiState.value.orderInfo?.distAddress.isNullOrBlank()) { - Row(verticalAlignment = Alignment.Top, - modifier = Modifier.clickable { // 点击目的地时移动地图到目的地位置 - uiState.value.orderInfo?.let { order -> - if (order.distLat != null && order.distLat != 0.0 && order.distLng != null && order.distLng != 0.0) { - mapView.map.animateCamera(CameraUpdateFactory.newLatLngZoom( - LatLng(order.distLat !!, order.distLng !!), - 16f)) - } - } - }) { - AsyncImage(model = R.drawable.sv_dist, - contentDescription = "destination", - modifier = Modifier.size(16.dp)) - - Spacer(modifier = Modifier.width(8.dp)) - - Text(text = uiState.value.orderInfo?.distAddress ?: "", - color = Color.Black, - fontSize = 15.sp, - fontWeight = FontWeight.Medium) - } - } - } - - Spacer(modifier = Modifier.height(16.dp)) - - // 发车按钮 - Button(onClick = { - if (! GlobalData.isMaster && GlobalData.driverInfoBean != null && GlobalData.driverInfoBean?.authStatus == 1) { - vm.dispatch(WaitToStartVm.Action.UpdateState(uiState.value.copy( - showServicePeopleConfirmDialog = true))) - return@Button - } - vm.dispatch(WaitToStartVm.Action.UpdateState(uiState.value.copy( - isGoNextPageDialog = true))) - }, - modifier = Modifier - .fillMaxWidth() - .height(44.dp) - .padding(horizontal = 16.dp), - colors = ButtonDefaults.buttonColors(containerColor = headBgColor), - shape = RoundedCornerShape(8.dp)) { - Text(text = "发车", - color = Color.White, - fontSize = 16.sp, - fontWeight = FontWeight.Medium) - } - - Spacer(modifier = Modifier.height(16.dp)) - } - } + vm.dispatch(WaitToStartVm.Action.UpdateState(uiState.value.copy(isGoNextPageDialog = true))) + }) }, sheetPeekHeight = 180.dp, sheetShape = RoundedCornerShape(topStart = 12.dp, topEnd = 12.dp), diff --git a/servicing/src/main/res/drawable/sv_new_copy.xml b/servicing/src/main/res/drawable/sv_new_copy.xml new file mode 100644 index 0000000..bfee90d --- /dev/null +++ b/servicing/src/main/res/drawable/sv_new_copy.xml @@ -0,0 +1,14 @@ + + + diff --git a/servicing/src/main/res/drawable/sv_order_change.xml b/servicing/src/main/res/drawable/sv_order_change.xml new file mode 100644 index 0000000..4af7ce3 --- /dev/null +++ b/servicing/src/main/res/drawable/sv_order_change.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/servicing/src/main/res/drawable/sv_order_ele.xml b/servicing/src/main/res/drawable/sv_order_ele.xml new file mode 100644 index 0000000..f63531e --- /dev/null +++ b/servicing/src/main/res/drawable/sv_order_ele.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/servicing/src/main/res/drawable/sv_order_photo.xml b/servicing/src/main/res/drawable/sv_order_photo.xml new file mode 100644 index 0000000..65bec8c --- /dev/null +++ b/servicing/src/main/res/drawable/sv_order_photo.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/servicing/src/main/res/drawable/sv_order_reserve.xml b/servicing/src/main/res/drawable/sv_order_reserve.xml new file mode 100644 index 0000000..312d6b6 --- /dev/null +++ b/servicing/src/main/res/drawable/sv_order_reserve.xml @@ -0,0 +1,18 @@ + + + + diff --git a/servicing/src/main/res/drawable/sv_settle_cash.xml b/servicing/src/main/res/drawable/sv_settle_cash.xml new file mode 100644 index 0000000..ce49af5 --- /dev/null +++ b/servicing/src/main/res/drawable/sv_settle_cash.xml @@ -0,0 +1,18 @@ + + + + diff --git a/servicing/src/main/res/drawable/sv_settle_month.xml b/servicing/src/main/res/drawable/sv_settle_month.xml new file mode 100644 index 0000000..ac36941 --- /dev/null +++ b/servicing/src/main/res/drawable/sv_settle_month.xml @@ -0,0 +1,18 @@ + + + + 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 120f168..0fa3ff8 100644 --- a/servicing/src/main/res/layout/sign_activity_grid_paint.xml +++ b/servicing/src/main/res/layout/sign_activity_grid_paint.xml @@ -41,16 +41,46 @@ - + android:orientation="horizontal"> + + + + + + + +