refactor(servicing): 重构司机信息获取逻辑

- 更新 Api 定义,将 GeneralInfo 请求的返回类型改为 DriverInfoBean- 重构 GlobalData 类,使用 GlobalLocalData 类封装本地数据操作
- 优化 ConfirmEleScreen组件,增加 ConfirmEleCheckBoxItem复用组件
- 调整签名视图的字体大小- 移除 VerifyOrderActivity 中的冗余代码
- 更新 ZDManager 中的 MMKV 初始化逻辑
This commit is contained in:
songzhiling
2025-04-23 10:02:11 +08:00
parent f0f6810efd
commit c606ed95cd
11 changed files with 195 additions and 273 deletions

View File

@ -27,7 +27,7 @@ class MainActivity : ComponentActivity() {
.fillMaxSize() .fillMaxSize()
.clickable { .clickable {
val uri = val uri =
"zd.assist://app?taskCode=ZD250417100404&driverName=宋志领&driverPhone=17630035658&rescueVehicle=沪88888".toUri() "zd.assist://app?taskCode=ZD250422100056&driverName=宋志领&driverPhone=17630035658&rescueVehicle=沪88888".toUri()
val intent = Intent(Intent.ACTION_VIEW, uri) val intent = Intent(Intent.ACTION_VIEW, uri)
startActivity(intent) startActivity(intent)
} }

View File

@ -3,6 +3,8 @@ plugins {
alias(libs.plugins.jetbrains.kotlin.android) alias(libs.plugins.jetbrains.kotlin.android)
id 'com.google.devtools.ksp' id 'com.google.devtools.ksp'
id 'maven-publish' id 'maven-publish'
// kotlin 序列化注解
id 'kotlin-parcelize'
} }
android { android {

View File

@ -9,7 +9,7 @@ import com.za.common.log.LogUtil
import com.za.room.RoomHelper import com.za.room.RoomHelper
import com.za.room.db.user.DriverInfoBean import com.za.room.db.user.DriverInfoBean
object GlobalData { object GlobalData : GlobalLocalData() {
lateinit var application : Application lateinit var application : Application
private val mmkv : MMKV by lazy { MMKV.defaultMMKV() } private val mmkv : MMKV by lazy { MMKV.defaultMMKV() }
var activityCount : Int = 0 var activityCount : Int = 0
@ -45,26 +45,21 @@ object GlobalData {
//新订单是否已经被处理 //新订单是否已经被处理
var isHandlerNewOrder : Boolean? = false var isHandlerNewOrder : Boolean? = false
private val lock = Any() var driverInfoBean : DriverInfoBean? = null
var driverInfoBean : DriverInfoBean?
get() { get() {
synchronized(lock) { if (field == null) {
val driverInfoBean = field = localDriverInfoBean
mmkv.decodeParcelable("driverInfoBean", DriverInfoBean::class.java)
LogUtil.print("driverInfo get", "driverInfoBean = $driverInfoBean")
return driverInfoBean
} }
LogUtil.print("get driverInfoBean", "获取司机信息: $field")
return field
} }
set(value) { set(value) {
synchronized(lock) { localDriverInfoBean = value
mmkv.encode("driverInfoBean", value) field = value
if (value != null) { LogUtil.print("set driverInfoBean", "司机信息: $field")
lastLoginBean = value
}
LogUtil.print("driverInfo set", "driverInfoBean = $value")
}
} }
var lastLoginBean : DriverInfoBean? = null var lastLoginBean : DriverInfoBean? = null
get() { get() {
val driverInfoBean = mmkv.decodeParcelable("lastLoginBean", DriverInfoBean::class.java) val driverInfoBean = mmkv.decodeParcelable("lastLoginBean", DriverInfoBean::class.java)
@ -85,17 +80,16 @@ object GlobalData {
field = value field = value
} }
var currentOrder : OrderInfo? = null var currentOrder : OrderInfo? = null
get() { get() {
return mmkv.decodeParcelable("currentOrder", OrderInfo::class.java) if (field == null) {
field = localCurrentOrder
}
return field
} }
set(value) { set(value) {
mmkv.encode("currentOrder", value) localCurrentOrder = value
if (RoomHelper.db?.orderDao()?.getCurrentOrder() == null && value != null) {
RoomHelper.db?.orderDao()?.insertOrder(value)
} else if (value != null) {
RoomHelper.db?.orderDao()?.update(value)
}
field = value field = value
} }
@ -133,5 +127,4 @@ object GlobalData {
fun clearOrderCache(taskId : Int) { fun clearOrderCache(taskId : Int) {
RoomHelper.clearOrderFromTaskCode(taskId = taskId) RoomHelper.clearOrderFromTaskCode(taskId = taskId)
} }
} }

View File

@ -0,0 +1,49 @@
package com.za.common
import com.tencent.mmkv.MMKV
import com.za.bean.db.order.OrderInfo
import com.za.common.GlobalData.lastLoginBean
import com.za.common.log.LogUtil
import com.za.room.RoomHelper
import com.za.room.db.user.DriverInfoBean
open class GlobalLocalData {
var localDriverInfoBean : DriverInfoBean?
get() {
return try {
val driverInfo = MMKV.defaultMMKV()
.decodeParcelable("driverInfoBean", DriverInfoBean::class.java)
LogUtil.print("local_driverInfoBean", "获取司机信息: $driverInfo")
driverInfo
} catch (e : Exception) {
LogUtil.print("local_driverInfoBean", "获取司机信息失败: ${e.message}")
null
}
}
set(value) {
try {
MMKV.defaultMMKV().encode("driverInfoBean", value)
if (value != null) {
lastLoginBean = value
}
LogUtil.print("set local_driverInfoBean", "保存司机信息: $value")
} catch (e : Exception) {
LogUtil.print("set local_driverInfoBean", "保存司机信息失败: ${e.message}")
}
}
var localCurrentOrder : OrderInfo? = null
get() {
return MMKV.defaultMMKV().decodeParcelable("currentOrder", OrderInfo::class.java)
}
set(value) {
MMKV.defaultMMKV().encode("currentOrder", value)
if (RoomHelper.db?.orderDao()?.getCurrentOrder() == null && value != null) {
RoomHelper.db?.orderDao()?.insertOrder(value)
} else if (value != null) {
RoomHelper.db?.orderDao()?.update(value)
}
field = value
}
}

View File

@ -23,8 +23,7 @@ object ZDManager {
AppConfig.crm1() AppConfig.crm1()
} }
GlobalData.application = application // 在 Application 中初始化 MMKV所有进程共享同一存储路径 GlobalData.application = application // 在 Application 中初始化 MMKV所有进程共享同一存储路径
val rootDir = application.filesDir.absolutePath + "/mmkv" MMKV.initialize(application)
MMKV.initialize(application, rootDir)
Bugly.init(application, "6972a6b56d", true) Bugly.init(application, "6972a6b56d", true)
LogUtil.init(application) LogUtil.init(application)
RoomHelper.init(application) RoomHelper.init(application)

View File

@ -80,6 +80,7 @@ import com.za.bean.request.VehicleRepairPointMatcherListRequest
import com.za.bean.request.VerifyCodeRequest import com.za.bean.request.VerifyCodeRequest
import com.za.bean.request.VerifyCodeResponse import com.za.bean.request.VerifyCodeResponse
import com.za.call.ContactRecordRequest import com.za.call.ContactRecordRequest
import com.za.room.db.user.DriverInfoBean
import com.za.water_marker.bean.MyWaterMarkerTemplateBean import com.za.water_marker.bean.MyWaterMarkerTemplateBean
import com.za.water_marker.bean.WaterMarkerRequestBean import com.za.water_marker.bean.WaterMarkerRequestBean
import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Observable
@ -100,7 +101,7 @@ interface ApiService {
fun newUpdateVehicleState(@Body info : UpdateVehicleStateRequest) : Observable<BaseResponse<String>> fun newUpdateVehicleState(@Body info : UpdateVehicleStateRequest) : Observable<BaseResponse<String>>
@POST("/driverApp/v2/user/generalInfo") @POST("/driverApp/v2/user/generalInfo")
fun generalInfo(@Body info : GeneralInfoRequest) : Observable<BaseResponse<GeneralInfo>> fun generalInfo(@Body info : GeneralInfoRequest) : Observable<BaseResponse<DriverInfoBean>>
@POST("/driverApp/base/appVersion") @POST("/driverApp/base/appVersion")
fun getUpdate(@Body versionRequest : UpdateVersionRequest) : Observable<BaseResponse<UpdateVersionBean>> fun getUpdate(@Body versionRequest : UpdateVersionRequest) : Observable<BaseResponse<UpdateVersionBean>>

View File

@ -5,7 +5,6 @@ import android.graphics.BitmapFactory
import com.blankj.utilcode.util.ActivityUtils import com.blankj.utilcode.util.ActivityUtils
import com.blankj.utilcode.util.ImageUtils import com.blankj.utilcode.util.ImageUtils
import com.za.base.Const import com.za.base.Const
import com.za.bean.GeneralInfo
import com.za.bean.ImageBean import com.za.bean.ImageBean
import com.za.bean.JpushBean import com.za.bean.JpushBean
import com.za.bean.NewOrderRequestBean import com.za.bean.NewOrderRequestBean
@ -118,7 +117,7 @@ object CommonMethod {
private var lastFetchGenerateInfoTime : Long = 0L private var lastFetchGenerateInfoTime : Long = 0L
fun getGenerateInfo(vehicleId : Int? = null, fun getGenerateInfo(vehicleId : Int? = null,
userId : Int? = null, userId : Int? = null,
success : (GeneralInfo) -> Unit = {}, success : (DriverInfoBean) -> Unit = {},
failed : (String?) -> Unit = {}) { failed : (String?) -> Unit = {}) {
val generalInfoRequest = val generalInfoRequest =
GeneralInfoRequest(vehicleId = vehicleId ?: GlobalData.driverInfoBean?.vehicleId, GeneralInfoRequest(vehicleId = vehicleId ?: GlobalData.driverInfoBean?.vehicleId,
@ -126,52 +125,20 @@ object CommonMethod {
deviceId = DeviceUtil.getAndroidId(ActivityUtils.getTopActivity())) deviceId = DeviceUtil.getAndroidId(ActivityUtils.getTopActivity()))
RetrofitHelper.getDefaultService().generalInfo(generalInfoRequest) RetrofitHelper.getDefaultService().generalInfo(generalInfoRequest)
.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(object : BaseObserver<GeneralInfo>() { .subscribe(object : BaseObserver<DriverInfoBean>() {
override fun doSuccess(it : GeneralInfo?) { override fun doSuccess(it : DriverInfoBean?) {
if (it == null) { if (it == null) {
failed("获取车辆信息失败") failed("获取车辆信息失败")
LogUtil.print("getGenerateInfo", "获取车辆信息失败") LogUtil.print("getGenerateInfo", "获取车辆信息失败")
return return
} }
if (GlobalData.driverInfoBean != null && (System.currentTimeMillis() - lastFetchGenerateInfoTime < 1000 * 10)) { if (GlobalData.driverInfoBean != null && (System.currentTimeMillis() - lastFetchGenerateInfoTime < 1000 * 10)) {
LogUtil.print("getGenerateInfo", "获取车辆信息成功但是时间间隔小于10秒不更新车辆信息") LogUtil.print("getGenerateInfo",
"获取车辆信息成功但是时间间隔小于10秒不更新车辆信息")
success(it) success(it)
return return
} }
if (GlobalData.driverInfoBean == null) { GlobalData.driverInfoBean=it
GlobalData.driverInfoBean = DriverInfoBean(vehicleId = it.vehicleId,
vehicleName = it.vehicleName,
userName = it.userName,
loginLogId = it.loginLogId,
userPhone = it.userPhone,
plateNumber = it.plateNumber,
vehicleState = it.vehicleState,
supplierType = it.supplierType,
userPortrait = it.userPortrait,
userId = it.userId,
supplierId = it.supplierId,
deviceId = it.deviceId,
supplierName = it.supplierName,
authStatus = it.authStatus,
serviceList = it.serviceList?.toString())
} else {
GlobalData.driverInfoBean =
GlobalData.driverInfoBean?.copy(vehicleId = it.vehicleId,
vehicleName = it.vehicleName,
userName = it.userName,
userPhone = it.userPhone,
plateNumber = it.plateNumber,
vehicleState = it.vehicleState,
supplierType = it.supplierType,
userPortrait = it.userPortrait,
userId = it.userId,
loginLogId = it.loginLogId,
supplierId = it.supplierId,
deviceId = it.deviceId,
supplierName = it.supplierName,
authStatus = it.authStatus,
serviceList = it.serviceList?.toString())
}
lastFetchGenerateInfoTime = System.currentTimeMillis() lastFetchGenerateInfoTime = System.currentTimeMillis()
LogUtil.print("GlobalData.driverInfoBean", LogUtil.print("GlobalData.driverInfoBean",
"${GlobalData.driverInfoBean?.toJson()}}") "${GlobalData.driverInfoBean?.toJson()}}")

View File

@ -1,8 +1,9 @@
package com.za.room.db.user package com.za.room.db.user
import android.os.Parcel
import android.os.Parcelable import android.os.Parcelable
import kotlinx.parcelize.Parcelize
@Parcelize
data class DriverInfoBean( data class DriverInfoBean(
val userId : Int? = null, //用户id val userId : Int? = null, //用户id
val userName : String? = null, //用户姓名 val userName : String? = null, //用户姓名
@ -14,7 +15,7 @@ data class DriverInfoBean(
val supplierName : String? = null, //经销商名称 val supplierName : String? = null, //经销商名称
val supplierType : Int? = null, //经销商类型 1子公司 2供应商 val supplierType : Int? = null, //经销商类型 1子公司 2供应商
val loginLogId : Int? = null, val loginLogId : Int? = null,
val serviceList : String? = null, //车辆服务列表 val serviceList : List<String>? = null, //车辆服务列表
val assistUserCode : String? = null, val assistUserCode : String? = null,
val authStatus : Int? = null, // 0 未认证 1 已认证 val authStatus : Int? = null, // 0 未认证 1 已认证
val vehicleId : Int? = null, val vehicleId : Int? = null,
@ -22,59 +23,4 @@ data class DriverInfoBean(
val vehicleState : Int? = null, //车辆状态 0 空闲 1 忙碌 val vehicleState : Int? = null, //车辆状态 0 空闲 1 忙碌
val plateNumber : String? = null, //车牌号 val plateNumber : String? = null, //车牌号
val deviceId : String? = null, val deviceId : String? = null,
) : Parcelable { ) : Parcelable
constructor(parcel : Parcel) : this(parcel.readValue(Int::class.java.classLoader) as? Int,
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readValue(Int::class.java.classLoader) as? Int,
parcel.readString(),
parcel.readValue(Int::class.java.classLoader) as? Int,
parcel.readValue(Int::class.java.classLoader) as? Int,
parcel.readString(),
parcel.readString(),
parcel.readValue(Int::class.java.classLoader) as? Int,
parcel.readValue(Int::class.java.classLoader) as? Int,
parcel.readString(),
parcel.readValue(Int::class.java.classLoader) as? Int,
parcel.readString(),
parcel.readString()) {
}
override fun writeToParcel(parcel : Parcel, flags : Int) {
parcel.writeValue(userId)
parcel.writeString(userName)
parcel.writeString(userPhone)
parcel.writeString(userPortrait)
parcel.writeString(rongyunToken)
parcel.writeString(logTime)
parcel.writeValue(supplierId)
parcel.writeString(supplierName)
parcel.writeValue(supplierType)
parcel.writeValue(loginLogId)
parcel.writeString(serviceList)
parcel.writeString(assistUserCode)
parcel.writeValue(authStatus)
parcel.writeValue(vehicleId)
parcel.writeString(vehicleName)
parcel.writeValue(vehicleState)
parcel.writeString(plateNumber)
parcel.writeString(deviceId)
}
override fun describeContents() : Int {
return 0
}
companion object CREATOR : Parcelable.Creator<DriverInfoBean> {
override fun createFromParcel(parcel : Parcel) : DriverInfoBean {
return DriverInfoBean(parcel)
}
override fun newArray(size : Int) : Array<DriverInfoBean?> {
return arrayOfNulls(size)
}
}
}

View File

@ -4,12 +4,12 @@ import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.basicMarquee import androidx.compose.foundation.basicMarquee
import androidx.compose.foundation.border import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
@ -24,14 +24,19 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Checkbox
import androidx.compose.material3.CheckboxDefaults
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.OutlinedTextFieldDefaults import androidx.compose.material3.OutlinedTextFieldDefaults
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.VerticalDivider
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
@ -39,6 +44,7 @@ import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
@ -48,7 +54,9 @@ import com.blankj.utilcode.util.FileUtils
import com.blankj.utilcode.util.TimeUtils import com.blankj.utilcode.util.TimeUtils
import com.blankj.utilcode.util.ToastUtils import com.blankj.utilcode.util.ToastUtils
import com.za.base.Const import com.za.base.Const
import com.za.base.theme.black10
import com.za.base.theme.black65 import com.za.base.theme.black65
import com.za.base.theme.buttonBgColor
import com.za.base.theme.headBgColor import com.za.base.theme.headBgColor
import com.za.base.view.CommonButton import com.za.base.view.CommonButton
import com.za.base.view.CommonDialog import com.za.base.view.CommonDialog
@ -65,6 +73,7 @@ import com.za.ui.view.SignatureView
import java.io.File import java.io.File
import kotlin.math.ceil import kotlin.math.ceil
@Preview
@Composable @Composable
fun ConfirmEleScreen(vm : ConfirmEleVm = viewModel()) { fun ConfirmEleScreen(vm : ConfirmEleVm = viewModel()) {
val context = LocalContext.current val context = LocalContext.current
@ -133,12 +142,14 @@ fun ConfirmEleScreen(vm : ConfirmEleVm = viewModel()) {
confirm = { confirm = {
if (uiState.value.eleWorkOrderBean?.localServicePeopleSignPath.isNullOrEmpty()) { if (uiState.value.eleWorkOrderBean?.localServicePeopleSignPath.isNullOrEmpty()) {
ToastUtils.showShort("请先进行签名") ToastUtils.showShort("请先进行签名")
vm.dispatch(ConfirmEleVm.Action.UpdateState(uiState.value.copy(showServicePeopleSignDialog = false))) vm.dispatch(ConfirmEleVm.Action.UpdateState(uiState.value.copy(
showServicePeopleSignDialog = false)))
return@CommonDialog return@CommonDialog
} }
File(uiState.value.eleWorkOrderBean?.localServicePeopleSignPath ?: "").copyTo(File( File(uiState.value.eleWorkOrderBean?.localServicePeopleSignPath ?: "").copyTo(File(
AppFileManager.getDriverSignPath(context)), true) AppFileManager.getDriverSignPath(context)), true)
vm.dispatch(ConfirmEleVm.Action.UpdateState(uiState.value.copy(showServicePeopleSignDialog = false))) vm.dispatch(ConfirmEleVm.Action.UpdateState(uiState.value.copy(
showServicePeopleSignDialog = false)))
}) })
} }
@ -162,9 +173,8 @@ fun ConfirmEleScreen(vm : ConfirmEleVm = viewModel()) {
Column(modifier = Modifier Column(modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.background(Color.White) .background(Color.White)
.padding(horizontal = 16.dp, vertical = 10.dp)) { .padding(horizontal = 16.dp)) {
Row(verticalAlignment = Alignment.CenterVertically, Row(verticalAlignment = Alignment.CenterVertically) {
modifier = Modifier.padding(bottom = 8.dp)) {
Text(text = "*", Text(text = "*",
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
color = Color.Red, color = Color.Red,
@ -174,46 +184,23 @@ fun ConfirmEleScreen(vm : ConfirmEleVm = viewModel()) {
fontWeight = FontWeight.Medium, fontWeight = FontWeight.Medium,
color = Color.Black, color = Color.Black,
fontSize = 15.sp) fontSize = 15.sp)
}
Row(modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(24.dp)) {
Box(modifier = Modifier Spacer(modifier = Modifier.width(15.dp))
.weight(1f) ConfirmEleCheckBoxItem(modifier = Modifier.fillMaxWidth(),
.clickable { confirmText = "成功",
cancelText = "失败",
confirmValue = uiState.value.eleWorkOrderBean?.isSuccess == 1,
cancelValue = uiState.value.eleWorkOrderBean?.isSuccess == 2,
confirmCheckedChange = {
vm.dispatch(ConfirmEleVm.Action.UpdateServiceSuccessState(1)) vm.dispatch(ConfirmEleVm.Action.UpdateServiceSuccessState(1))
} },
.border(width = 1.dp, cancelCheckedChange = {
color = Color.Gray,
shape = RoundedCornerShape(2.dp))
.background(color = headBgColor.takeIf { uiState.value.eleWorkOrderBean?.isSuccess == 1 }
?: Color.White, shape = RoundedCornerShape(2.dp))
.padding(vertical = 5.dp), contentAlignment = Alignment.Center) {
Text("成功",
fontSize = 14.sp,
fontWeight = FontWeight.SemiBold,
color = Color.White.takeIf { uiState.value.eleWorkOrderBean?.isSuccess == 1 }
?: Color.Black)
}
Box(modifier = Modifier
.weight(1f)
.clickable {
vm.dispatch(ConfirmEleVm.Action.UpdateServiceSuccessState(2)) vm.dispatch(ConfirmEleVm.Action.UpdateServiceSuccessState(2))
} })
.border(width = 1.dp,
color = Color.Gray,
shape = RoundedCornerShape(2.dp))
.background(color = headBgColor.takeIf { uiState.value.eleWorkOrderBean?.isSuccess == 2 }
?: Color.White, shape = RoundedCornerShape(2.dp))
.padding(vertical = 5.dp), contentAlignment = Alignment.Center) {
Text("失败",
fontSize = 14.sp,
fontWeight = FontWeight.SemiBold,
color = Color.White.takeIf { uiState.value.eleWorkOrderBean?.isSuccess == 2 }
?: Color.Black)
}
} }
HorizontalDivider(modifier = Modifier.padding(vertical = 8.dp),
color = black10)
} }
} }
@ -223,9 +210,8 @@ fun ConfirmEleScreen(vm : ConfirmEleVm = viewModel()) {
Column(modifier = Modifier Column(modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.background(Color.White) .background(Color.White)
.padding(horizontal = 16.dp, vertical = 10.dp)) { .padding(horizontal = 16.dp)) {
Row(verticalAlignment = Alignment.CenterVertically, Row(verticalAlignment = Alignment.CenterVertically) {
modifier = Modifier.padding(bottom = 8.dp)) {
Text(text = "*", Text(text = "*",
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
color = Color.Red, color = Color.Red,
@ -235,56 +221,35 @@ fun ConfirmEleScreen(vm : ConfirmEleVm = viewModel()) {
fontWeight = FontWeight.Medium, fontWeight = FontWeight.Medium,
color = Color.Black, color = Color.Black,
fontSize = 15.sp) fontSize = 15.sp)
}
Row(modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(24.dp)) {
Box(modifier = Modifier Spacer(modifier = Modifier.width(15.dp))
.weight(1f) ConfirmEleCheckBoxItem(modifier = Modifier.fillMaxWidth(),
.clickable { confirmText = "更换",
cancelText = "不更换",
confirmValue = uiState.value.eleWorkOrderBean?.changeBattery == true,
cancelValue = uiState.value.eleWorkOrderBean?.changeBattery == false,
confirmCheckedChange = {
vm.dispatch(ConfirmEleVm.Action.IsChangeBattery(true)) vm.dispatch(ConfirmEleVm.Action.IsChangeBattery(true))
} },
.border(width = 1.dp, cancelCheckedChange = {
color = Color.Gray,
shape = RoundedCornerShape(2.dp))
.background(color = headBgColor.takeIf { uiState.value.eleWorkOrderBean?.changeBattery == true }
?: Color.White, shape = RoundedCornerShape(2.dp))
.padding(vertical = 5.dp), contentAlignment = Alignment.Center) {
Text("更换",
fontSize = 14.sp,
fontWeight = FontWeight.SemiBold,
color = Color.White.takeIf { uiState.value.eleWorkOrderBean?.changeBattery == true }
?: Color.Black)
}
Box(modifier = Modifier
.weight(1f)
.clickable {
vm.dispatch(ConfirmEleVm.Action.IsChangeBattery(false)) vm.dispatch(ConfirmEleVm.Action.IsChangeBattery(false))
} })
.border(width = 1.dp,
color = Color.Gray,
shape = RoundedCornerShape(2.dp))
.background(color = headBgColor.takeIf { uiState.value.eleWorkOrderBean?.changeBattery == false }
?: Color.White, shape = RoundedCornerShape(2.dp))
.padding(vertical = 5.dp), contentAlignment = Alignment.Center) {
Text("不更换",
fontSize = 14.sp,
fontWeight = FontWeight.SemiBold,
color = Color.White.takeIf { uiState.value.eleWorkOrderBean?.changeBattery == false }
?: Color.Black)
}
} }
HorizontalDivider(modifier = Modifier.padding(vertical = 8.dp),
color = black10)
} }
} }
if (uiState.value.orderInfo?.flowType == Const.TUO_CHE) { if (uiState.value.orderInfo?.flowType == Const.TUO_CHE) {
Column(modifier = Modifier Column(modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.height(86.dp)
.background(Color.White) .background(Color.White)
.padding(horizontal = 16.dp, vertical = 10.dp)) { .padding(horizontal = 16.dp)) {
Spacer(modifier = Modifier.height(10.dp))
Row(verticalAlignment = Alignment.CenterVertically, Row(verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.padding(bottom = 8.dp)) { modifier = Modifier.fillMaxHeight().fillMaxWidth()) {
Text(text = "*", Text(text = "*",
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
color = Color.Red, color = Color.Red,
@ -294,75 +259,49 @@ fun ConfirmEleScreen(vm : ConfirmEleVm = viewModel()) {
fontWeight = FontWeight.Medium, fontWeight = FontWeight.Medium,
color = Color.Black, color = Color.Black,
fontSize = 15.sp) fontSize = 15.sp)
}
Row(modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(24.dp)) {
Box(modifier = Modifier Spacer(modifier = Modifier.width(5.dp))
.weight(1f) ConfirmEleCheckBoxItem(confirmText = "",
.clickable { cancelText = "",
confirmValue = uiState.value.isAddSmallWheel == true,
cancelValue = uiState.value.isAddSmallWheel == false,
confirmCheckedChange = {
vm.dispatch(ConfirmEleVm.Action.UpdateState(uiState.value.copy( vm.dispatch(ConfirmEleVm.Action.UpdateState(uiState.value.copy(
isAddSmallWheel = true))) isAddSmallWheel = true)))
} },
.border(width = 1.dp, cancelCheckedChange = {
color = Color.Gray,
shape = RoundedCornerShape(2.dp))
.background(color = headBgColor.takeIf { uiState.value.isAddSmallWheel == true }
?: Color.White, shape = RoundedCornerShape(2.dp))
.padding(vertical = 5.dp), contentAlignment = Alignment.Center) {
Text("",
fontSize = 14.sp,
fontWeight = FontWeight.SemiBold,
color = Color.White.takeIf { uiState.value.isAddSmallWheel == true }
?: Color.Black)
}
Box(modifier = Modifier
.weight(1f)
.clickable {
vm.dispatch(ConfirmEleVm.Action.UpdateState(uiState.value.copy( vm.dispatch(ConfirmEleVm.Action.UpdateState(uiState.value.copy(
isAddSmallWheel = false))) isAddSmallWheel = false)))
} })
.border(width = 1.dp,
color = Color.Gray, AnimatedVisibility(uiState.value.isAddSmallWheel == true,
shape = RoundedCornerShape(2.dp)) modifier = Modifier.fillMaxWidth()) {
.background(color = headBgColor.takeIf { uiState.value.isAddSmallWheel == false } OutlinedTextField(
?: Color.White, shape = RoundedCornerShape(2.dp)) value = "${uiState.value.wheelNum ?: ""}",
.padding(vertical = 5.dp), contentAlignment = Alignment.Center) { onValueChange = { wheel ->
Text("", if ((wheel.toIntOrNull() ?: 0) > 4) {
fontSize = 14.sp, ToastUtils.showShort("小轮个数不能超过4个")
fontWeight = FontWeight.SemiBold, return@OutlinedTextField
color = Color.White.takeIf { uiState.value.isAddSmallWheel == false } }
?: Color.Black) vm.dispatch(ConfirmEleVm.Action.UpdateState(uiState.value.copy(
wheelNum = wheel.toIntOrNull())))
},
label = { Text("小轮个数", fontSize = 10.sp) },
modifier = Modifier
.fillMaxWidth()
.height(67.dp),
maxLines = 1,
keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Number),
textStyle = TextStyle.Default.copy(fontSize = 16.sp,
color = Color.Black),
shape = RoundedCornerShape(6.dp),
colors = OutlinedTextFieldDefaults.colors(focusedBorderColor = headBgColor,
unfocusedBorderColor = Color.Gray.copy(alpha = 0.5f),
focusedLabelColor = headBgColor,
unfocusedLabelColor = Color.Gray),
)
} }
} }
Spacer(Modifier.height(5.dp))
AnimatedVisibility(uiState.value.isAddSmallWheel == true) {
OutlinedTextField(
value = "${uiState.value.wheelNum ?: ""}",
onValueChange = { wheel ->
if ((wheel.toIntOrNull() ?: 0) > 4) {
ToastUtils.showShort("小轮个数不能超过4个")
return@OutlinedTextField
}
vm.dispatch(ConfirmEleVm.Action.UpdateState(uiState.value.copy(
wheelNum = wheel.toIntOrNull())))
},
label = { Text("小轮个数") },
modifier = Modifier.fillMaxWidth(),
maxLines = 1,
keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Number),
textStyle = TextStyle.Default.copy(fontSize = 16.sp,
color = Color.Black),
shape = RoundedCornerShape(6.dp),
colors = OutlinedTextFieldDefaults.colors(focusedBorderColor = headBgColor,
unfocusedBorderColor = Color.Gray.copy(alpha = 0.5f),
focusedLabelColor = headBgColor,
unfocusedLabelColor = Color.Gray),
)
}
} }
} }
@ -669,3 +608,32 @@ private fun EleWorkOrderDetailView(eleWorkOrderBean : EleWorkOrderBean?,
} }
} }
} }
@Composable
private fun ConfirmEleCheckBoxItem(modifier : Modifier = Modifier,
confirmText : String,
cancelText : String,
confirmValue : Boolean,
cancelValue : Boolean,
confirmCheckedChange : (Boolean) -> Unit,
cancelCheckedChange : (Boolean) -> Unit) {
Row(modifier = modifier
.height(30.dp)
.background(color = Color.White),
verticalAlignment = Alignment.CenterVertically) {
Text(confirmText, color = Color.Black, fontWeight = FontWeight.SemiBold, fontSize = 15.sp)
Checkbox(checked = confirmValue, onCheckedChange = {
confirmCheckedChange(it)
})
VerticalDivider(modifier = Modifier
.padding(horizontal = 5.dp, vertical = 5.dp)
.alpha(0.5f))
Text(cancelText, color = Color.Black, fontWeight = FontWeight.SemiBold, fontSize = 15.sp)
Checkbox(checked = cancelValue, onCheckedChange = {
cancelCheckedChange(it)
}, colors = CheckboxDefaults.colors().copy(checkedBoxColor = buttonBgColor))
}
}

View File

@ -277,9 +277,6 @@ private fun VerifyTipView(arriveRemind: String, arriveRemindUrl: String) {
} }
HorizontalDivider(modifier = Modifier.alpha(0.2f)) HorizontalDivider(modifier = Modifier.alpha(0.2f))
Spacer(modifier = Modifier.height(10.dp))
Text(text = arriveRemindUrl, fontWeight = FontWeight.Medium, fontSize = 16.sp, color = Color.Blue)
Spacer(modifier = Modifier.height(10.dp)) Spacer(modifier = Modifier.height(10.dp))
if (arriveRemindUrl.endsWith("png") if (arriveRemindUrl.endsWith("png")
|| arriveRemindUrl.endsWith("jpg") || arriveRemindUrl.endsWith("jpg")

View File

@ -46,7 +46,7 @@ fun SignatureView(modifier: Modifier = Modifier, success: (String?) -> Unit, ser
val intent = Intent(context, GridPaintActivity::class.java) val intent = Intent(context, GridPaintActivity::class.java)
intent.putExtra("background", android.graphics.Color.WHITE) intent.putExtra("background", android.graphics.Color.WHITE)
intent.putExtra("crop", true) intent.putExtra("crop", true)
intent.putExtra("fontSize", 50) //手写字体大小 intent.putExtra("fontSize", 30) //手写字体大小
intent.putExtra("format", PenConfig.FORMAT_PNG) intent.putExtra("format", PenConfig.FORMAT_PNG)
intent.putExtra("lineLength", 10) //每行显示字数(超出屏幕支持横向滚动) intent.putExtra("lineLength", 10) //每行显示字数(超出屏幕支持横向滚动)
signatureLauncher.launch(intent) signatureLauncher.launch(intent)