diff --git a/servicing/src/main/AndroidManifest.xml b/servicing/src/main/AndroidManifest.xml index dfc38de..7343874 100644 --- a/servicing/src/main/AndroidManifest.xml +++ b/servicing/src/main/AndroidManifest.xml @@ -4,7 +4,7 @@ @@ -243,7 +243,10 @@ - + \ No newline at end of file diff --git a/servicing/src/main/java/com/za/base/AppConfig.kt b/servicing/src/main/java/com/za/base/AppConfig.kt index 3e8b17f..d0bec27 100644 --- a/servicing/src/main/java/com/za/base/AppConfig.kt +++ b/servicing/src/main/java/com/za/base/AppConfig.kt @@ -78,9 +78,9 @@ object AppConfig { */ fun getTrainUrl(keyWord: String = ""): String { if (keyWord.isEmpty()) { - return TRAIN_URL + "?token=${GlobalData.token}&driverId=${GlobalData.driverInfo?.userId}" + return TRAIN_URL + "?token=${GlobalData.token}&driverId=${GlobalData.driverInfoBean?.userId}" } - return TRAIN_URL + "?token=${GlobalData.token}&driverId=${GlobalData.driverInfo?.userId}&keyword=$keyWord" + return TRAIN_URL + "?token=${GlobalData.token}&driverId=${GlobalData.driverInfoBean?.userId}&keyword=$keyWord" } /** @@ -91,8 +91,8 @@ object AppConfig { */ fun getDocmentUrl(keyWord: String = ""): String { if (keyWord.isEmpty()) { - return DOCMENT_URL + "?token=${GlobalData.token}&driverId=${GlobalData.driverInfo?.userId}" + return DOCMENT_URL + "?token=${GlobalData.token}&driverId=${GlobalData.driverInfoBean?.userId}" } - return DOCMENT_URL + "?token=${GlobalData.token}&driverId=${GlobalData.driverInfo?.userId}&keyword=$keyWord" + return DOCMENT_URL + "?token=${GlobalData.token}&driverId=${GlobalData.driverInfoBean?.userId}&keyword=$keyWord" } } \ No newline at end of file diff --git a/servicing/src/main/java/com/za/bean/DriverInfo.kt b/servicing/src/main/java/com/za/bean/DriverInfo.kt index fb5e6f3..bad7878 100644 --- a/servicing/src/main/java/com/za/bean/DriverInfo.kt +++ b/servicing/src/main/java/com/za/bean/DriverInfo.kt @@ -12,64 +12,14 @@ data class DriverInfo( var userName : String? = null, //用户姓名 var userPhone : String? = null, //用户手机号 var callphone : String? = null, - var supplierId : String? = null, //经销商id + var supplierId : Int? = null, //经销商id var supplierName : String? = null, //经销商名称 var supplierType : Int? = null, //经销商类型 1子公司 2供应商 var loginLogId : Int? = null, var serviceList : List? = null, //车辆服务列表 var assistUserCode : String? = null, val authStatus : Int? = null, // 0 未认证 1 已认证 -) : Parcelable { - constructor(parcel : Parcel) : this(parcel.readString(), - parcel.readString(), - parcel.readString(), - parcel.readString(), - 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.readValue(Int::class.java.classLoader) as? Int, - parcel.createStringArrayList(), - parcel.readString(), - parcel.readValue(Int::class.java.classLoader) as? Int) { - } - - override fun writeToParcel(parcel : Parcel, flags : Int) { - parcel.writeString(userPortrait) - parcel.writeString(token) - parcel.writeString(rongyunToken) - parcel.writeString(logTime) - parcel.writeValue(userId) - parcel.writeString(userName) - parcel.writeString(userPhone) - parcel.writeString(callphone) - parcel.writeString(supplierId) - parcel.writeString(supplierName) - parcel.writeValue(supplierType) - parcel.writeValue(loginLogId) - parcel.writeStringList(serviceList) - parcel.writeString(assistUserCode) - parcel.writeValue(authStatus) - } - - override fun describeContents() : Int { - return 0 - } - - companion object CREATOR : Parcelable.Creator { - override fun createFromParcel(parcel : Parcel) : DriverInfo { - return DriverInfo(parcel) - } - - override fun newArray(size : Int) : Array { - return arrayOfNulls(size) - } - } - -} +) data class GeneralInfo( var userId : Int? = null, //用户id @@ -213,4 +163,57 @@ data class LoginWithTaskBean(val supplierName : String? = null, val serviceList : List? = null, val jobNumber : String? = null, val vehicleId : Int? = null, - val supplierType : Int? = null) \ No newline at end of file + val supplierType : Int? = null) + +data class AppNewDriverInfoDTO(val userId : Int? = null, + val userName : String? = null, + val userPhone : String? = null, + val supplierCode : String? = null, + val appLoginCode : String? = null, + val supplierId : Int? = null, + val supplierName : String? = null, + val supplierType : Int? = null, + val authStatus : Int? = null, + val tiedVehicle : VehicleInfo? = null, //绑定的车辆,如果该服务商下面绑定的有车辆,则返回绑定车辆信息 + val loginTime : String? = null) : Parcelable { + constructor(parcel : Parcel) : this(parcel.readValue(Int::class.java.classLoader) as? Int, + 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.readParcelable(VehicleInfo::class.java.classLoader), + parcel.readString()) { + } + + override fun writeToParcel(parcel : Parcel, flags : Int) { + parcel.writeValue(userId) + parcel.writeString(userName) + parcel.writeString(userPhone) + parcel.writeString(supplierCode) + parcel.writeString(appLoginCode) + parcel.writeValue(supplierId) + parcel.writeString(supplierName) + parcel.writeValue(supplierType) + parcel.writeValue(authStatus) + parcel.writeParcelable(tiedVehicle, flags) + parcel.writeString(loginTime) + } + + override fun describeContents() : Int { + return 0 + } + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel : Parcel) : AppNewDriverInfoDTO { + return AppNewDriverInfoDTO(parcel) + } + + override fun newArray(size : Int) : Array { + return arrayOfNulls(size) + } + } +} diff --git a/servicing/src/main/java/com/za/bean/VehicleInfo.kt b/servicing/src/main/java/com/za/bean/VehicleInfo.kt index 8287afe..f929439 100644 --- a/servicing/src/main/java/com/za/bean/VehicleInfo.kt +++ b/servicing/src/main/java/com/za/bean/VehicleInfo.kt @@ -4,53 +4,83 @@ import android.os.Parcel import android.os.Parcelable data class VehicleInfo( - var vehicleId: Int? = null, //车辆id - var vehicleName: String? = null,//车辆名称(车牌号) - var userName: String? = null, //当前用车司机姓名(工号) - var userPhone: String? = null, //当前用车司机电话 - var status: Int? = null, //车辆状态 0 不在线 1 在线 - val plateNumber: String? = null, //车牌号 - var vehicleState: Int? = null, //车辆是否空闲 0 空闲 1 忙碌 2置忙 8维修 - var terminalId: Long? = null, //车辆高德tid - var exitMileage: Int? = null, //上次退出公里数 - var supplierType: Int? = null, //经销商类型 + var vehicleId : Int? = null, //车辆id + var vehicleName : String? = null, //车辆名称(车牌号) + var userName : String? = null, //当前用车司机姓名(工号) + var userPhone : String? = null, //当前用车司机电话 + var status : Int? = null, //车辆状态 0 不在线 1 在线 + val plateNumber : String? = null, //车牌号 + var vehicleState : Int? = null, //车辆是否空闲 0 空闲 1 忙碌 2置忙 8维修 + var terminalId : Long? = null, //车辆高德tid + var exitMileage : Int? = null, //上次退出公里数 + var supplierType : Int? = null, //经销商类型 ) : Parcelable { - constructor(parcel : Parcel) : this(parcel.readValue(Int::class.java.classLoader) as? Int, - 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(Long::class.java.classLoader) as? Long, - parcel.readValue(Int::class.java.classLoader) as? Int, - parcel.readValue(Int::class.java.classLoader) as? Int) { - } + constructor(parcel : Parcel) : this(parcel.readValue(Int::class.java.classLoader) as? Int, + 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(Long::class.java.classLoader) as? Long, + parcel.readValue(Int::class.java.classLoader) as? Int, + parcel.readValue(Int::class.java.classLoader) as? Int) { + } - override fun writeToParcel(parcel : Parcel, flags : Int) { - parcel.writeValue(vehicleId) - parcel.writeString(vehicleName) - parcel.writeString(userName) - parcel.writeString(userPhone) - parcel.writeValue(status) - parcel.writeString(plateNumber) - parcel.writeValue(vehicleState) - parcel.writeValue(terminalId) - parcel.writeValue(exitMileage) - parcel.writeValue(supplierType) - } + override fun writeToParcel(parcel : Parcel, flags : Int) { + parcel.writeValue(vehicleId) + parcel.writeString(vehicleName) + parcel.writeString(userName) + parcel.writeString(userPhone) + parcel.writeValue(status) + parcel.writeString(plateNumber) + parcel.writeValue(vehicleState) + parcel.writeValue(terminalId) + parcel.writeValue(exitMileage) + parcel.writeValue(supplierType) + } - override fun describeContents() : Int { - return 0 - } + override fun describeContents() : Int { + return 0 + } - companion object CREATOR : Parcelable.Creator { - override fun createFromParcel(parcel : Parcel) : VehicleInfo { - return VehicleInfo(parcel) - } + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel : Parcel) : VehicleInfo { + return VehicleInfo(parcel) + } - override fun newArray(size : Int) : Array { - return arrayOfNulls(size) - } - } + override fun newArray(size : Int) : Array { + return arrayOfNulls(size) + } + } +} + + +data class LastLoginBean(val phone : String? = null, + val supplierId : Int? = null, + val vehicleId : Int?):Parcelable { + constructor(parcel : Parcel) : this(parcel.readString(), + parcel.readValue(Int::class.java.classLoader) as? Int, + parcel.readValue(Int::class.java.classLoader) as? Int) { + } + + override fun writeToParcel(parcel : Parcel, flags : Int) { + parcel.writeString(phone) + parcel.writeValue(supplierId) + parcel.writeValue(vehicleId) + } + + override fun describeContents() : Int { + return 0 + } + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel : Parcel) : LastLoginBean { + return LastLoginBean(parcel) + } + + override fun newArray(size : Int) : Array { + return arrayOfNulls(size) + } + } } \ No newline at end of file diff --git a/servicing/src/main/java/com/za/bean/request/AppNewOrderVoiceRequest.kt b/servicing/src/main/java/com/za/bean/request/AppNewOrderVoiceRequest.kt new file mode 100644 index 0000000..2ddffe1 --- /dev/null +++ b/servicing/src/main/java/com/za/bean/request/AppNewOrderVoiceRequest.kt @@ -0,0 +1,3 @@ +package com.za.bean.request + +data class AppNewOrderVoiceRequest(var voiceWords : String? = null) diff --git a/servicing/src/main/java/com/za/common/GlobalData.kt b/servicing/src/main/java/com/za/common/GlobalData.kt index 6fe1e0c..2d0975e 100644 --- a/servicing/src/main/java/com/za/common/GlobalData.kt +++ b/servicing/src/main/java/com/za/common/GlobalData.kt @@ -4,10 +4,9 @@ import android.app.Application import com.amap.api.location.AMapLocation import com.blankj.utilcode.util.AppUtils import com.tencent.mmkv.MMKV -import com.za.bean.DriverInfo -import com.za.bean.VehicleInfo import com.za.bean.db.order.OrderInfo import com.za.room.RoomHelper +import com.za.room.db.user.DriverInfoBean object GlobalData { lateinit var application : Application @@ -16,20 +15,19 @@ object GlobalData { var token : String? = null get() { - return MMKV.defaultMMKV().decodeString("TOKEN", null) + return MMKV.defaultMMKV().decodeString("ZD_TOKEN", null) } set(value) { - MMKV.defaultMMKV().encode("TOKEN", value) + MMKV.defaultMMKV().encode("ZD_TOKEN", value) field = value } - //记录上次登录的手机号 - var lastLoginPhone : String? = null + var regid : String? = null get() { - return MMKV.defaultMMKV().decodeString("lastLoginPhone", null) + return MMKV.defaultMMKV().decodeString("regid", null) } set(value) { - MMKV.defaultMMKV().encode("lastLoginPhone", value) + MMKV.defaultMMKV().encode("regid", value) field = value } @@ -42,25 +40,19 @@ object GlobalData { field = value } - var driverInfo : DriverInfo? = null + //新订单是否已经被处理 + var isHandlerNewOrder : Boolean? = false + + var driverInfoBean : DriverInfoBean? = null get() { - return MMKV.defaultMMKV().decodeParcelable("driverInfo", DriverInfo::class.java) + val driverInfoBean = RoomHelper.db?.driverInfoDao()?.getDriverInfoFromUserId() + field = driverInfoBean + return driverInfoBean } set(value) { - MMKV.defaultMMKV().encode("driverInfo", value) - field = value + RoomHelper.db?.driverInfoDao()?.updateDriverInfo(value) } - var vehicleInfo : VehicleInfo? = null - get() { - return MMKV.defaultMMKV().decodeParcelable("vehicleInfo", VehicleInfo::class.java) - } - set(value) { - MMKV.defaultMMKV().encode("vehicleInfo", value) - field = value - } - - var currentOrder : OrderInfo? = null get() { return MMKV.defaultMMKV().decodeParcelable("currentOrder", OrderInfo::class.java) @@ -77,11 +69,10 @@ object GlobalData { var currentLocation : AMapLocation? = null get() { - return MMKV.defaultMMKV().decodeParcelable("currentLocation", AMapLocation::class.java) + return field } set(value) { value?.time = System.currentTimeMillis() - MMKV.defaultMMKV().encode("currentLocation", value) field = value } @@ -97,8 +88,6 @@ object GlobalData { fun clearUserCache() { token = null aesKey = null - driverInfo = null - vehicleInfo = null currentLocation = null loginTime = null } diff --git a/servicing/src/main/java/com/za/common/ZDManager.kt b/servicing/src/main/java/com/za/common/ZDManager.kt index 26d911f..762e140 100644 --- a/servicing/src/main/java/com/za/common/ZDManager.kt +++ b/servicing/src/main/java/com/za/common/ZDManager.kt @@ -3,7 +3,6 @@ package com.za.common import android.app.Application import com.tencent.bugly.Bugly import com.tencent.mmkv.MMKV -import com.tencent.mmkv.MMKVLogLevel import com.za.base.AppConfig import com.za.common.log.LogUtil import com.za.room.RoomHelper @@ -11,6 +10,7 @@ import com.za.service.location.ZdLocationManager object ZDManager { lateinit var application : Application + fun init(application : Application, isRelease : Boolean = false) { this.application = application thirdSdkInit(isRelease) @@ -22,11 +22,12 @@ object ZDManager { } else { AppConfig.crm1() } - GlobalData.application = application - MMKV.initialize(application, MMKVLogLevel.LevelInfo) + GlobalData.application = application // 在 Application 中初始化 MMKV,所有进程共享同一存储路径 + val rootDir = application.filesDir.absolutePath + "/mmkv" + MMKV.initialize(application, rootDir) Bugly.init(application, "6972a6b56d", true) LogUtil.init(application) RoomHelper.init(application) ZdLocationManager.init(application) } -} \ No newline at end of file +} diff --git a/servicing/src/main/java/com/za/common/log/LogUtil.kt b/servicing/src/main/java/com/za/common/log/LogUtil.kt index 610efd6..75c3b0e 100644 --- a/servicing/src/main/java/com/za/common/log/LogUtil.kt +++ b/servicing/src/main/java/com/za/common/log/LogUtil.kt @@ -15,7 +15,6 @@ import com.blankj.utilcode.util.FileUtils import com.blankj.utilcode.util.TimeUtils import com.za.common.GlobalData import com.za.common.util.AppFileManager -import com.za.servicing.BuildConfig import io.reactivex.rxjava3.schedulers.Schedulers import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -40,278 +39,272 @@ import java.util.concurrent.atomic.AtomicBoolean import kotlin.concurrent.thread object LogUtil { - private var context: Application? = null - private var logDestinationPath: String? = null - private var orderLogDirPath: String? = null - private var normalLogDirPath: String? = null - private val coroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob()) - private val logBuffer = StringBuilder() - private val isWriting = AtomicBoolean(false) - - fun init(context: Application) { - this.context = context - - logDestinationPath = AppFileManager.getLogPath(context).also { path -> - createDirectoryIfNotExists(path) - orderLogDirPath = "$path${File.separator}order_log".also { createDirectoryIfNotExists(it) } - normalLogDirPath = "$path${File.separator}normal_log".also { createDirectoryIfNotExists(it) } - } + private var context : Application? = null + private var logDestinationPath : String? = null + private var orderLogDirPath : String? = null + private var normalLogDirPath : String? = null + private val coroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob()) + private val logBuffer = StringBuilder() + private val isWriting = AtomicBoolean(false) - initializeWorkManager(context) - } + fun init(context : Application) { + this.context = context - private fun createDirectoryIfNotExists(path: String) { - File(path).apply { if (!exists()) mkdir() } - } + logDestinationPath = AppFileManager.getLogPath(context).also { path -> + createDirectoryIfNotExists(path) + orderLogDirPath = + "$path${File.separator}order_log".also { createDirectoryIfNotExists(it) } + normalLogDirPath = + "$path${File.separator}normal_log".also { createDirectoryIfNotExists(it) } + } - private fun initializeWorkManager(context: Application) { - if (!WorkManager.isInitialized()) { - WorkManager.initialize(context, Configuration.Builder() - .setMinimumLoggingLevel(Log.INFO) - .build()) - } + initializeWorkManager(context) + } - WorkManager.getInstance(context).apply { - cancelAllWorkByTag("logWorkRequest") - enqueue(PeriodicWorkRequest.Builder(LogTask::class.java, 20, TimeUnit.MINUTES) - .addTag("logWorkRequest") - .build()) - } - } + private fun createDirectoryIfNotExists(path : String) { + File(path).apply { if (! exists()) mkdir() } + } - fun print(tag: String, content: String) { - val time = getCurrentTime() - val logEntry = "$time---$tag---$content\n" - - if (BuildConfig.DEBUG) { - Log.e("normal", "$tag---$content") - } - - synchronized(logBuffer) { - logBuffer.append(logEntry) - } - - if (logBuffer.length > 4096) { - coroutineScope.launch { - flushBuffer() - } - } - } + private fun initializeWorkManager(context : Application) { + if (! WorkManager.isInitialized()) { + WorkManager.initialize(context, + Configuration.Builder().setMinimumLoggingLevel(Log.INFO).build()) + } - fun print(tag: String, throwable: Throwable) { - val content = StringWriter() - val printWriter = PrintWriter(content) - throwable.printStackTrace(printWriter) - print(tag, content.toString()) - } + WorkManager.getInstance(context).apply { + cancelAllWorkByTag("logWorkRequest") + enqueue(PeriodicWorkRequest.Builder(LogTask::class.java, 20, TimeUnit.MINUTES) + .addTag("logWorkRequest").build()) + } + } - private suspend fun flushBuffer() = withContext(Dispatchers.IO) { - if (!isWriting.compareAndSet(false, true)) return@withContext + fun print(tag : String, content : String) { + val time = getCurrentTime() + val logEntry = "$time---$tag---$content\n" + Log.e("normal", "$tag---$content") + synchronized(logBuffer) { + logBuffer.append(logEntry) + } - val logContent: String - synchronized(logBuffer) { - if (logBuffer.isEmpty()) { - isWriting.set(false) - return@withContext - } - logContent = logBuffer.toString() - logBuffer.clear() - } + if (logBuffer.length > 4096) { + coroutineScope.launch { + flushBuffer() + } + } + } - try { - val fileName = "normal_log.txt" - val logFile = File("$normalLogDirPath${File.separator}$fileName") + fun print(tag : String, throwable : Throwable) { + val content = StringWriter() + val printWriter = PrintWriter(content) + throwable.printStackTrace(printWriter) + print(tag, content.toString()) + } - logFile.parentFile?.mkdirs() + private suspend fun flushBuffer() = withContext(Dispatchers.IO) { + if (! isWriting.compareAndSet(false, true)) return@withContext - if (!logFile.exists()) { - logFile.createNewFile() - addLogHead(logFile, getCurrentTime()) - } + val logContent : String + synchronized(logBuffer) { + if (logBuffer.isEmpty()) { + isWriting.set(false) + return@withContext + } + logContent = logBuffer.toString() + logBuffer.clear() + } - BufferedWriter(FileWriter(logFile, true)).use { writer -> - writer.write(logContent) - writer.flush() - } + try { + val fileName = "normal_log.txt" + val logFile = File("$normalLogDirPath${File.separator}$fileName") - if (logFile.length() >= 8 * MemoryConstants.MB) { - rotateLogFile(logFile) - } - } catch (e: IOException) { - Log.e("LogUtil", "Error in flushBuffer: ${e.message}") - } catch (e: Exception) { - Log.e("LogUtil", "Error in flushBuffer: ${e.message}") - } finally { - isWriting.set(false) - } - } + logFile.parentFile?.mkdirs() - private fun rotateLogFile(file: File) { - if (!file.exists()) return - - val newFileName = buildString { - append(AppUtils.getAppVersionCode()) - append("_") - append(GlobalData.vehicleInfo?.vehicleName ?: "unknown") - append("_") - append(GlobalData.driverInfo?.userName ?: "unknown") - append("_") - append(TimeUtils.getNowString()) - append(".txt") - } - - val newFile = File("$normalLogDirPath${File.separator}$newFileName") - - try { - if (file.renameTo(newFile)) { - compressAndUploadLog(newFile) - // 创建新的日志文件 - file.createNewFile() - addLogHead(file, getCurrentTime()) - } else { - print("LogUtil", "Failed to rename log file") - } - } catch (e: Exception) { - print("LogUtil", "Error during log rotation: ${e.message}") - } - } + if (! logFile.exists()) { + logFile.createNewFile() + addLogHead(logFile, getCurrentTime()) + } - private fun compressAndUploadLog(logFile: File) = coroutineScope.launch { - try { - val compressedFile = File("${logFile.absolutePath}.7z") - compress(logFile, compressedFile.absolutePath) - upload(logFile, compressedFile) - } catch (e: Exception) { - print("LogUtil", e.toString()) - } - } + BufferedWriter(FileWriter(logFile, true)).use { writer -> + writer.write(logContent) + writer.flush() + } - private fun deleteLog(file: File) { - try { - FileUtils.delete(file.absolutePath) - } catch (e: Exception) { - e.printStackTrace() - } - } + if (logFile.length() >= 8 * MemoryConstants.MB) { + rotateLogFile(logFile) + } + } catch (e : IOException) { + Log.e("LogUtil", "Error in flushBuffer: ${e.message}") + } catch (e : Exception) { + Log.e("LogUtil", "Error in flushBuffer: ${e.message}") + } finally { + isWriting.set(false) + } + } - fun updateNormalLog() { - thread { - if (GlobalData.token.isNullOrBlank()) { - return@thread - } - val fileName = "normal_log.txt" - val file = File("$normalLogDirPath${File.separator}$fileName") - val reName = "${AppUtils.getAppVersionCode()}_${GlobalData.vehicleInfo?.vehicleName}_${GlobalData.driverInfo?.userName}_${TimeUtils.getNowString()}.txt" - val reNamePath = "$normalLogDirPath${File.separator}$reName" - file.renameTo(File(reNamePath)) - normalLogDirPath?.let { it -> - File(it).listFiles()?.forEach { - if (it.length() / MemoryConstants.MB >= 10) { - deleteLog(it) - return@thread - } - if (it.exists() && !it.name.contains("normal_log")) { - if (it.name.contains("7z")) { - upload(null, desFile = it) - } else { - val zipNamePath = it.absolutePath + ".7z" - val zipFile = File(zipNamePath) - if (!zipFile.exists()) { - try { - zipFile.createNewFile() - } catch (e: IOException) { - e.printStackTrace() - } - } - compress(it, zipNamePath) - } - } - } - } - } - } + private fun rotateLogFile(file : File) { + if (! file.exists()) return - private fun compress(srcFile: File, desFilePath: String) { - try { - val out = XZCompressorOutputStream(FileOutputStream(desFilePath)) - addToArchiveCompression(out, srcFile, File(desFilePath)) - } catch (e: Exception) { - e.printStackTrace() - } - } + val newFileName = buildString { + append(AppUtils.getAppVersionCode()) + append("_") + append(GlobalData.driverInfoBean?.vehicleName ?: "unknown") + append("_") + append(GlobalData.driverInfoBean?.userName ?: "unknown") + append("_") + append(TimeUtils.getNowString()) + append(".txt") + } - private fun addToArchiveCompression( - sevenZOutputFile: XZCompressorOutputStream, - srcFile: File, desFile: File - ) { - if (srcFile.isFile) { - var inputStream: FileInputStream? = null - try { - inputStream = FileInputStream(srcFile) - val b = ByteArray(2048) - var count: Int - while (inputStream.read(b).also { count = it } != -1) { - sevenZOutputFile.write(b, 0, count) - } - sevenZOutputFile.close() - inputStream.close() - upload(srcFile, desFile) - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - sevenZOutputFile.close() - inputStream!!.close() - } catch (e: Exception) { - e.printStackTrace() - } - } - } - } + val newFile = File("$normalLogDirPath${File.separator}$newFileName") - private fun upload(srcFile: File?, desFile: File) { - val requestBody: RequestBody = desFile.asRequestBody("multipart/form-data".toMediaType()) - val part = MultipartBody.Part.createFormData("file", desFile.name, requestBody) + try { + if (file.renameTo(newFile)) { + compressAndUploadLog(newFile) // 创建新的日志文件 + file.createNewFile() + addLogHead(file, getCurrentTime()) + } else { + print("LogUtil", "Failed to rename log file") + } + } catch (e : Exception) { + print("LogUtil", "Error during log rotation: ${e.message}") + } + } - val disposable = LogRetrofitHelper.getDefaultService() - .uploadLog(part, desFile.name, "rescue-app") - .subscribeOn(Schedulers.io()) - .subscribe({ it -> - if (it.code == 200) { - deleteLog(desFile) - } - srcFile?.let { - deleteLog(it) - } - }, { - }, {}) - } + private fun compressAndUploadLog(logFile : File) = coroutineScope.launch { + try { + val compressedFile = File("${logFile.absolutePath}.7z") + compress(logFile, compressedFile.absolutePath) + upload(logFile, compressedFile) + } catch (e : Exception) { + print("LogUtil", e.toString()) + } + } - private fun addLogHead(file: File, time: String) { - file.appendBytes("${time}---应用版本---${AppUtils.getAppVersionName()}".toByteArray()) - file.appendBytes("\n".toByteArray()) - file.appendBytes("$time---系统版本---Android${DeviceUtils.getSDKVersionName()} ${DeviceUtils.getSDKVersionCode()}".toByteArray()) - file.appendBytes("\n".toByteArray()) - file.appendBytes("$time---ROM---${DeviceUtils.getManufacturer()} ${DeviceUtils.getModel()}".toByteArray()) - file.appendBytes("\n".toByteArray()) - file.appendBytes("$time---build---${AppUtils.getAppVersionCode()}".toByteArray()) - file.appendBytes("\n".toByteArray()) - file.appendBytes("$time---APP名称---中道救援-司机端".toByteArray()) - file.appendBytes("\n".toByteArray()) - file.appendBytes("$time---车辆名称---${GlobalData.vehicleInfo?.vehicleName}".toByteArray()) - file.appendBytes("\n".toByteArray()) - file.appendBytes("$time---司机名称---${GlobalData.driverInfo?.userName ?: GlobalData.vehicleInfo?.userName}".toByteArray()) - file.appendBytes("\n".toByteArray()) - } + private fun deleteLog(file : File) { + try { + FileUtils.delete(file.absolutePath) + } catch (e : Exception) { + e.printStackTrace() + } + } - private fun getCurrentTime(): String { - return TimeUtils.millis2String(System.currentTimeMillis(), "yyyy/MM/dd HH:mm:ss.SSS") - } + fun updateNormalLog() { + thread { + if (GlobalData.token.isNullOrBlank()) { + return@thread + } + val fileName = "normal_log.txt" + val file = File("$normalLogDirPath${File.separator}$fileName") + val reName = + "${AppUtils.getAppVersionCode()}_${GlobalData.driverInfoBean?.vehicleName}_${GlobalData.driverInfoBean?.userName}_${TimeUtils.getNowString()}.txt" + val reNamePath = "$normalLogDirPath${File.separator}$reName" + file.renameTo(File(reNamePath)) + normalLogDirPath?.let { it -> + File(it).listFiles()?.forEach { + if (it.length() / MemoryConstants.MB >= 10) { + deleteLog(it) + return@thread + } + if (it.exists() && ! it.name.contains("normal_log")) { + if (it.name.contains("7z")) { + upload(null, desFile = it) + } else { + val zipNamePath = it.absolutePath + ".7z" + val zipFile = File(zipNamePath) + if (! zipFile.exists()) { + try { + zipFile.createNewFile() + } catch (e : IOException) { + e.printStackTrace() + } + } + compress(it, zipNamePath) + } + } + } + } + } + } - class LogTask(appContext: Context, workerParams: WorkerParameters) : Worker(appContext, workerParams) { - override fun doWork(): Result { - updateNormalLog() - return Result.success() - } - } + private fun compress(srcFile : File, desFilePath : String) { + try { + val out = XZCompressorOutputStream(FileOutputStream(desFilePath)) + addToArchiveCompression(out, srcFile, File(desFilePath)) + } catch (e : Exception) { + e.printStackTrace() + } + } + + private fun addToArchiveCompression(sevenZOutputFile : XZCompressorOutputStream, + srcFile : File, + desFile : File) { + if (srcFile.isFile) { + var inputStream : FileInputStream? = null + try { + inputStream = FileInputStream(srcFile) + val b = ByteArray(2048) + var count : Int + while (inputStream.read(b).also { count = it } != - 1) { + sevenZOutputFile.write(b, 0, count) + } + sevenZOutputFile.close() + inputStream.close() + upload(srcFile, desFile) + } catch (e : Exception) { + e.printStackTrace() + } finally { + try { + sevenZOutputFile.close() + inputStream !!.close() + } catch (e : Exception) { + e.printStackTrace() + } + } + } + } + + private fun upload(srcFile : File?, desFile : File) { + val requestBody : RequestBody = desFile.asRequestBody("multipart/form-data".toMediaType()) + val part = MultipartBody.Part.createFormData("file", desFile.name, requestBody) + + val disposable = + LogRetrofitHelper.getDefaultService().uploadLog(part, desFile.name, "rescue-app") + .subscribeOn(Schedulers.io()).subscribe({ it -> + if (it.code == 200) { + deleteLog(desFile) + } + srcFile?.let { + deleteLog(it) + } + }, {}, {}) + } + + private fun addLogHead(file : File, time : String) { + file.appendBytes("${time}---应用版本---${AppUtils.getAppVersionName()}".toByteArray()) + file.appendBytes("\n".toByteArray()) + file.appendBytes("$time---系统版本---Android${DeviceUtils.getSDKVersionName()} ${DeviceUtils.getSDKVersionCode()}".toByteArray()) + file.appendBytes("\n".toByteArray()) + file.appendBytes("$time---ROM---${DeviceUtils.getManufacturer()} ${DeviceUtils.getModel()}".toByteArray()) + file.appendBytes("\n".toByteArray()) + file.appendBytes("$time---build---${AppUtils.getAppVersionCode()}".toByteArray()) + file.appendBytes("\n".toByteArray()) + file.appendBytes("$time---APP名称---中道救援-司机端".toByteArray()) + file.appendBytes("\n".toByteArray()) + file.appendBytes("$time---车辆名称---${GlobalData.driverInfoBean?.vehicleName}".toByteArray()) + file.appendBytes("\n".toByteArray()) + file.appendBytes("$time---司机名称---${GlobalData.driverInfoBean?.userName ?: GlobalData.driverInfoBean?.userName}".toByteArray()) + file.appendBytes("\n".toByteArray()) + } + + private fun getCurrentTime() : String { + return TimeUtils.millis2String(System.currentTimeMillis(), "yyyy/MM/dd HH:mm:ss.SSS") + } + + class LogTask(appContext : Context, workerParams : WorkerParameters) : + Worker(appContext, workerParams) { + override fun doWork() : Result { + updateNormalLog() + return Result.success() + } + } } \ No newline at end of file diff --git a/servicing/src/main/java/com/za/ext/ContextExt.kt b/servicing/src/main/java/com/za/ext/ContextExt.kt index 273087d..9bc740f 100644 --- a/servicing/src/main/java/com/za/ext/ContextExt.kt +++ b/servicing/src/main/java/com/za/ext/ContextExt.kt @@ -8,6 +8,7 @@ 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 com.blankj.utilcode.util.ToastUtils import com.za.call.CallLogManager import com.za.call.ContactRecordBean diff --git a/servicing/src/main/java/com/za/ext/OrderInfoExt.kt b/servicing/src/main/java/com/za/ext/OrderInfoExt.kt index d7590ec..835ca5a 100644 --- a/servicing/src/main/java/com/za/ext/OrderInfoExt.kt +++ b/servicing/src/main/java/com/za/ext/OrderInfoExt.kt @@ -26,26 +26,35 @@ fun Any?.toJson() : String? { return JSON.toJSON(this).toString() } -fun OrderInfo.goStatusPage(context : Context) { +fun OrderInfo.goStatusPage(context : Context, isFinishActivity : Boolean? = true) { when (this.taskState) { //等待发车 "START" -> { if (! RoomHelper.db?.photoTemplateDao() ?.getOrderPhotoTemplateFromTaskNode(10100, userOrderId ?: 0).isNullOrEmpty() ) { - context.navigationActivity(DeparturePhotoActivity::class.java) + context.navigationActivity(DeparturePhotoActivity::class.java, + isFinish = isFinishActivity) return } - context.navigationActivity(WaitToStartActivity::class.java) + context.navigationActivity(WaitToStartActivity::class.java, isFinish = isFinishActivity) } - "GOTO" -> context.navigationActivity(GoAccidentSiteActivity::class.java) //验证服务资格 - "VERIFY" -> context.navigationActivity(VerifyOrderActivity::class.java) //检查车辆 - "EXAMINE" -> context.navigationActivity(CheckVehicleActivity::class.java) //作业中 - "OPERATION" -> context.navigationActivity(InOperationActivity::class.java) //前往目的地 - "SENDTO" -> context.navigationActivity(GoToDestinationActivity::class.java) //目的地照片 - "DESTPHOTO" -> context.navigationActivity(DestinationPhotoActivity::class.java) //结算中 - "SETTLEMENT" -> context.navigationActivity(OrderConfirmActivity::class.java) //任务结束 - "FINISH" -> context.navigationActivity(WaitToStartActivity::class.java) + "GOTO" -> context.navigationActivity(GoAccidentSiteActivity::class.java, + isFinish = isFinishActivity) //验证服务资格 + "VERIFY" -> context.navigationActivity(VerifyOrderActivity::class.java, + isFinish = isFinishActivity) //检查车辆 + "EXAMINE" -> context.navigationActivity(CheckVehicleActivity::class.java, + isFinish = isFinishActivity) //作业中 + "OPERATION" -> context.navigationActivity(InOperationActivity::class.java, + isFinish = isFinishActivity) //前往目的地 + "SENDTO" -> context.navigationActivity(GoToDestinationActivity::class.java, + isFinish = isFinishActivity) //目的地照片 + "DESTPHOTO" -> context.navigationActivity(DestinationPhotoActivity::class.java, + isFinish = isFinishActivity) //结算中 + "SETTLEMENT" -> context.navigationActivity(OrderConfirmActivity::class.java, + isFinish = isFinishActivity) //任务结束 + "FINISH" -> context.navigationActivity(WaitToStartActivity::class.java, + isFinish = isFinishActivity) } } @@ -61,25 +70,34 @@ fun OrderInfo.getNextStatus() : String? { return flowStr } -fun goNextPage(status : String?, context : Context) { +fun goNextPage(status : String?, context : Context, isFinishActivity : Boolean? = true) { when (status) { //等待发车 "START" -> { if (! RoomHelper.db?.photoTemplateDao()?.getOrderPhotoTemplateFromTaskNode(10100, GlobalData.currentOrder?.userOrderId ?: 0).isNullOrEmpty() ) { - context.navigationActivity(DeparturePhotoActivity::class.java) + context.navigationActivity(DeparturePhotoActivity::class.java, + isFinish = isFinishActivity) return } - context.navigationActivity(WaitToStartActivity::class.java) + context.navigationActivity(WaitToStartActivity::class.java, isFinish = isFinishActivity) } //前往事发地 - "GOTO" -> context.navigationActivity(GoAccidentSiteActivity::class.java) //验证服务资格 - "VERIFY" -> context.navigationActivity(VerifyOrderActivity::class.java) //检查车辆 - "EXAMINE" -> context.navigationActivity(CheckVehicleActivity::class.java) //作业中 - "OPERATION" -> context.navigationActivity(InOperationActivity::class.java) //前往目的地 - "SENDTO" -> context.navigationActivity(GoToDestinationActivity::class.java) //目的地照片 - "DESTPHOTO" -> context.navigationActivity(DestinationPhotoActivity::class.java) //结算中 - "SETTLEMENT" -> context.navigationActivity(OrderConfirmActivity::class.java) //任务结束 - "FINISH" -> context.navigationActivity(WaitToStartActivity::class.java) + "GOTO" -> context.navigationActivity(GoAccidentSiteActivity::class.java, + isFinish = isFinishActivity) //验证服务资格 + "VERIFY" -> context.navigationActivity(VerifyOrderActivity::class.java, + isFinish = isFinishActivity) //检查车辆 + "EXAMINE" -> context.navigationActivity(CheckVehicleActivity::class.java, + isFinish = isFinishActivity) //作业中 + "OPERATION" -> context.navigationActivity(InOperationActivity::class.java, + isFinish = true) //前往目的地 + "SENDTO" -> context.navigationActivity(GoToDestinationActivity::class.java, + isFinish = isFinishActivity) //目的地照片 + "DESTPHOTO" -> context.navigationActivity(DestinationPhotoActivity::class.java, + isFinish = isFinishActivity) //结算中 + "SETTLEMENT" -> context.navigationActivity(OrderConfirmActivity::class.java, + isFinish = isFinishActivity) //任务结束 + "FINISH" -> context.navigationActivity(WaitToStartActivity::class.java, + isFinish = isFinishActivity) } } diff --git a/servicing/src/main/java/com/za/net/ApiService.kt b/servicing/src/main/java/com/za/net/ApiService.kt index c9df094..a957800 100644 --- a/servicing/src/main/java/com/za/net/ApiService.kt +++ b/servicing/src/main/java/com/za/net/ApiService.kt @@ -1,5 +1,6 @@ package com.za.net +import com.za.bean.AppNewDriverInfoDTO import com.za.bean.BaseResponse import com.za.bean.BatteryCostQueryBean import com.za.bean.BatteryCostQueryRequest @@ -30,6 +31,7 @@ import com.za.bean.VehicleInfo import com.za.bean.db.order.OrderInfo import com.za.bean.db.order.PhotoTemplateInfo import com.za.bean.request.AcceptOrderRequest +import com.za.bean.request.AppNewOrderVoiceRequest import com.za.bean.request.CustomerPaymentCreateBean import com.za.bean.request.CustomerPaymentCreateRequest import com.za.bean.request.DriverFaceCompareBean @@ -114,6 +116,10 @@ interface ApiService { @POST("/driverApp/task/login") fun login(@Body info : LoginRequest) : Observable> + //获取该手机号下面服务商列表 + @POST("/driverApp/supplier/getDriverListInfo") + fun getDriverListInfo(@Body info : VerifyCodeRequest) : Observable>> + @POST("/driverApp/task/loginWithTask") fun loginWithTask(@Body loginWithTaskRequest : LoginWithTaskRequest) : Observable> @@ -262,4 +268,7 @@ interface ApiService { //获取车辆维修历史 @POST("/driverApp/supplier/v2/vehicleMaintenanceList") fun vehicleMaintenanceList(@Body info : FetchVehicleMaintenanceSubmitHistoryRequestBean) : Observable>> + + @POST("driverApp/base/getVoiceUrl") + fun getVoiceUrl(@Body info : AppNewOrderVoiceRequest) : Observable> } \ No newline at end of file diff --git a/servicing/src/main/java/com/za/net/CommonMethod.kt b/servicing/src/main/java/com/za/net/CommonMethod.kt index 48a42bf..db375c7 100644 --- a/servicing/src/main/java/com/za/net/CommonMethod.kt +++ b/servicing/src/main/java/com/za/net/CommonMethod.kt @@ -5,12 +5,10 @@ import android.graphics.BitmapFactory import com.blankj.utilcode.util.ActivityUtils import com.blankj.utilcode.util.ImageUtils import com.za.base.Const -import com.za.bean.DriverInfo import com.za.bean.GeneralInfo import com.za.bean.ImageBean import com.za.bean.JpushBean import com.za.bean.NewOrderRequestBean -import com.za.bean.VehicleInfo import com.za.bean.db.ele.EleCarDamagePhotoBean import com.za.bean.db.ele.EleWorkOrderBean import com.za.bean.db.order.OrderInfo @@ -120,8 +118,8 @@ object CommonMethod { success : (GeneralInfo) -> Unit = {}, failed : (String?) -> Unit = {}) { val generalInfoRequest = - GeneralInfoRequest(vehicleId = vehicleId ?: GlobalData.vehicleInfo?.vehicleId, - driverId = userId ?: GlobalData.driverInfo?.userId, + GeneralInfoRequest(vehicleId = vehicleId ?: GlobalData.driverInfoBean?.vehicleId, + driverId = userId ?: GlobalData.driverInfoBean?.userId, deviceId = DeviceUtil.getAndroidId(ActivityUtils.getTopActivity())) RetrofitHelper.getDefaultService().generalInfo(generalInfoRequest) .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) @@ -129,51 +127,27 @@ object CommonMethod { override fun doSuccess(it : GeneralInfo?) { if (it == null) { failed("获取车辆信息失败") + LogUtil.print("getGenerateInfo", "获取车辆信息失败") return } - if (GlobalData.vehicleInfo == null) { - GlobalData.vehicleInfo = VehicleInfo(vehicleId = it.vehicleId, - vehicleName = it.vehicleName, - userName = it.userName, - userPhone = it.userPhone, - status = it.vehicleState, - plateNumber = it.plateNumber, - vehicleState = it.vehicleState, - supplierType = it.supplierType) - } else { - GlobalData.vehicleInfo = - GlobalData.vehicleInfo?.copy(vehicleId = it.vehicleId, - vehicleName = it.vehicleName, - userName = it.userName, - userPhone = it.userPhone, - status = it.vehicleState, - plateNumber = it.plateNumber, - vehicleState = it.vehicleState, - supplierType = it.supplierType) - } + val driverInfoBean = GlobalData.driverInfoBean + GlobalData.driverInfoBean = 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, + supplierId = it.supplierId, + deviceId = it.deviceId, + supplierName = it.supplierName, + authStatus = it.authStatus, + serviceList = it.serviceList?.toString()) - if (GlobalData.driverInfo == null) { - GlobalData.driverInfo = DriverInfo(userPortrait = it.userPortrait, - userName = it.userName, - userId = it.userId, - userPhone = it.userPhone, - supplierId = it.supplierId.toString(), - supplierName = it.supplierName, - authStatus = it.authStatus, - supplierType = it.supplierType, - serviceList = it.serviceList) - } else { - GlobalData.driverInfo = - GlobalData.driverInfo?.copy(userPortrait = it.userPortrait, - userName = it.userName, - userId = it.userId, - userPhone = it.userPhone, - supplierId = it.supplierId.toString(), - supplierName = it.supplierName, - authStatus = it.authStatus, - supplierType = it.supplierType, - serviceList = it.serviceList) - } + LogUtil.print("GlobalData.driverInfoBean", + "${GlobalData.driverInfoBean?.toJson()}}") success(it) } @@ -187,7 +161,7 @@ object CommonMethod { } fun getNewOrder(context : Context) { - val newOrderRequestBean = NewOrderRequestBean(GlobalData.vehicleInfo?.vehicleId) + val newOrderRequestBean = NewOrderRequestBean(GlobalData.driverInfoBean?.vehicleId) RetrofitHelper.getDefaultService().getNewOrder(newOrderRequestBean) .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe(object : BaseObserver() { @@ -229,7 +203,7 @@ object CommonMethod { success : (OrderInfo?, List?) -> Unit, failed : (String?) -> Unit) { RetrofitHelper.getDefaultService() - .queryOrderList(OrderListRequest(vehicleId = GlobalData.vehicleInfo?.vehicleId, + .queryOrderList(OrderListRequest(vehicleId = GlobalData.driverInfoBean?.vehicleId, deviceId = DeviceUtil.getAndroidId(ActivityUtils.getTopActivity()))) .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe(object : BaseObserver?>() { @@ -246,33 +220,6 @@ object CommonMethod { val waitServiceOrders = it.filter { it.isCurrent == false } if (inServicingOrder == null) { - context?.let { context -> - val order = it[0] - NewOrderActivity.goNewOrderActivity(context, - jpushBean = JpushBean(taskId = order.taskId, - taskCode = order.taskCode, - customerName = order.customerName, - customerPhone = order.customerPhone, - carBrand = order.carBrand, - carModel = order.carModel, - carNo = order.carNo, - taskState = order.taskState, - address = order.address, - addressProperty = order.addressProperty, - hotline = order.hotline, - expectArriveTime = order.expectArriveTime, - serviceTypeName = order.serviceTypeName, - dispatchTime = order.dispatchTime, - lat = order.lat, - lng = order.lng, - distLat = order.distLat, - distLng = order.distLng, - importantTip = order.importantTip, - hasReplaceBatteryCapable = order.hasReplaceBatteryCapable, - distAddress = order.distAddress, - distAddressRemark = order.distAddressRemark, - addressRemark = order.addressRemark)) - } success(null, waitServiceOrders) return } diff --git a/servicing/src/main/java/com/za/net/RetrofitHelper.kt b/servicing/src/main/java/com/za/net/RetrofitHelper.kt index 03b4bf1..53a0ec2 100644 --- a/servicing/src/main/java/com/za/net/RetrofitHelper.kt +++ b/servicing/src/main/java/com/za/net/RetrofitHelper.kt @@ -2,6 +2,7 @@ package com.za.net import android.util.Log import com.za.base.AppConfig +import com.za.common.log.LogUtil import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit @@ -12,72 +13,55 @@ import java.net.URLDecoder import java.util.concurrent.TimeUnit object RetrofitHelper { - private var retrofit: Retrofit? = null - private var apiService: ApiService? = null - private val loggerInterceptor = HttpLoggingInterceptor { - try { + private var retrofit : Retrofit? = null + private var apiService : ApiService? = null + private val loggerInterceptor = HttpLoggingInterceptor { + try { - if (it.contains("image/*") || it.contains("form-data; name=\"file\"") - || it.startsWith("Content-Type") - || it.startsWith("Content-Length") - || it.startsWith("Server") - || it.startsWith("Date") - || it.startsWith("Transfer-Encoding") - || it.startsWith("Connection") - || it.startsWith("X-") - || it.startsWith("token") - || it.startsWith("Cache-Control") - || it.startsWith("Expires") - || it.startsWith("Accept") - || it.startsWith("Vary") - || it.isEmpty() - || it.startsWith("Pragma") - ) { - return@HttpLoggingInterceptor - } + if (it.contains("image/*") || it.contains("form-data; name=\"file\"") || it.startsWith("Content-Type") || it.startsWith( + "Content-Length") || it.startsWith("Server") || it.startsWith("Date") || it.startsWith( + "Transfer-Encoding") || it.startsWith("Connection") || it.startsWith("X-") || it.startsWith( + "token") || it.startsWith("Cache-Control") || it.startsWith("Expires") || it.startsWith( + "Accept") || it.startsWith("Vary") || it.isEmpty() || it.startsWith("Pragma") + ) { + return@HttpLoggingInterceptor + } - if (it.contains("name=\"file\"; filename")) { - return@HttpLoggingInterceptor - } - Log.e( - "--network--", - URLDecoder.decode(it.replace(Regex("%(?![0-9a-fA-F]{2})"), ""), "utf-8") - ) - } catch (e: UnsupportedEncodingException) { - e.printStackTrace() - } + if (it.contains("name=\"file\"; filename")) { + return@HttpLoggingInterceptor + } + LogUtil.print("--network--", + URLDecoder.decode(it.replace(Regex("%(?![0-9a-fA-F]{2})"), ""), "utf-8")) + } catch (e : UnsupportedEncodingException) { + e.printStackTrace() + } - }.setLevel(HttpLoggingInterceptor.Level.BODY) + }.setLevel(HttpLoggingInterceptor.Level.BODY) - fun getDefaultService(): ApiService { - return if (apiService == null) { - apiService = getDefaultRetrofit().create(ApiService::class.java) - apiService!! - } else { - apiService!! - } - } + fun getDefaultService() : ApiService { + return if (apiService == null) { + apiService = getDefaultRetrofit().create(ApiService::class.java) + apiService !! + } else { + apiService !! + } + } - private fun getDefaultRetrofit(): Retrofit { - return if (retrofit == null) { - retrofit = Retrofit.Builder().baseUrl(AppConfig.BASE_URL) - .addConverterFactory(GsonConverterFactory.create()) - .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) - .client(getOkHttpClient()) - .build() - retrofit!! - } else { - retrofit!! - } - } + private fun getDefaultRetrofit() : Retrofit { + return if (retrofit == null) { + retrofit = Retrofit.Builder().baseUrl(AppConfig.BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(RxJava3CallAdapterFactory.create()).client(getOkHttpClient()) + .build() + retrofit !! + } else { + retrofit !! + } + } - private fun getOkHttpClient(): OkHttpClient { - return OkHttpClient.Builder() - .connectTimeout(30, TimeUnit.SECONDS) - .writeTimeout(60, TimeUnit.SECONDS) - .readTimeout(60, TimeUnit.SECONDS) - .addInterceptor(RequestEncryptInterceptor()) - .addInterceptor(loggerInterceptor) - .build() - } + private fun getOkHttpClient() : OkHttpClient { + return OkHttpClient.Builder().connectTimeout(30, TimeUnit.SECONDS) + .writeTimeout(60, TimeUnit.SECONDS).readTimeout(60, TimeUnit.SECONDS) + .addInterceptor(RequestEncryptInterceptor()).addInterceptor(loggerInterceptor).build() + } } \ No newline at end of file diff --git a/servicing/src/main/java/com/za/offline/OfflineManager.kt b/servicing/src/main/java/com/za/offline/OfflineManager.kt index 2a0aa08..cf707cb 100644 --- a/servicing/src/main/java/com/za/offline/OfflineManager.kt +++ b/servicing/src/main/java/com/za/offline/OfflineManager.kt @@ -176,7 +176,7 @@ object OfflineManager { lng = offlineUpdateTaskBean.imageLng.toDouble(), address = it, time = offlineUpdateTaskBean.time, - driverName = GlobalData.driverInfo?.userName, + driverName = GlobalData.driverInfoBean?.userName, taskCode = offlineUpdateTaskBean.taskCode) val offlineTemp = offlineUpdateTaskBean.copy(imageAddress = it) file = File(PhotoMarkerManager.addPhotoMarker(ActivityUtils.getTopActivity(), diff --git a/servicing/src/main/java/com/za/room/RoomHelper.kt b/servicing/src/main/java/com/za/room/RoomHelper.kt index e45863a..02ae83d 100644 --- a/servicing/src/main/java/com/za/room/RoomHelper.kt +++ b/servicing/src/main/java/com/za/room/RoomHelper.kt @@ -11,7 +11,7 @@ import com.za.room.db.GlobalRoom @SuppressLint("StaticFieldLeak") object RoomHelper { - const val VERSION: Int = 35 + const val VERSION: Int = 37 private lateinit var mContext: Context var db: GlobalRoom? = null diff --git a/servicing/src/main/java/com/za/room/db/GlobalRoom.kt b/servicing/src/main/java/com/za/room/db/GlobalRoom.kt index 8abe972..ade2c22 100644 --- a/servicing/src/main/java/com/za/room/db/GlobalRoom.kt +++ b/servicing/src/main/java/com/za/room/db/GlobalRoom.kt @@ -2,7 +2,6 @@ package com.za.room.db import androidx.room.Database import androidx.room.RoomDatabase -import androidx.room.TypeConverters import com.za.bean.db.ChangeBatteryPhoto import com.za.bean.db.NewPhotoTemplateBean import com.za.bean.db.ele.EleCarDamagePhotoBean @@ -11,7 +10,6 @@ import com.za.bean.db.order.OrderInfo import com.za.bean.db.order.PhotoTemplateInfo import com.za.bean.db.water_marker.WaterMarkerItemBean import com.za.bean.db.water_marker.WaterMarkerTemplateBean -import com.za.offline.InspectionConverter import com.za.offline.OfflineDao import com.za.offline.OfflineUpdateTaskBean import com.za.room.RoomHelper @@ -20,30 +18,32 @@ import com.za.room.db.ele_work.EleWorkOrderDao import com.za.room.db.order.ChangeBatteryDao import com.za.room.db.order.OrderDao import com.za.room.db.order.PhotoTemplateDao +import com.za.room.db.user.DriverInfoBean +import com.za.room.db.user.DriverInfoDao +import com.za.room.db.user.LocalResourceBean +import com.za.room.db.user.LocalResourceDao import com.za.room.db.water_marker.WaterMarkerDao -@Database(entities = [EleWorkOrderBean::class, - EleCarDamagePhotoBean::class, - WaterMarkerTemplateBean::class, - WaterMarkerItemBean::class, - ChangeBatteryPhoto::class, - NewPhotoTemplateBean::class, - OrderInfo::class, - OfflineUpdateTaskBean::class, - PhotoTemplateInfo::class], version = RoomHelper.VERSION, exportSchema = false) +@Database(entities = [EleWorkOrderBean::class, EleCarDamagePhotoBean::class, LocalResourceBean::class, WaterMarkerTemplateBean::class, WaterMarkerItemBean::class, ChangeBatteryPhoto::class, NewPhotoTemplateBean::class, OrderInfo::class, OfflineUpdateTaskBean::class, DriverInfoBean::class, PhotoTemplateInfo::class], + version = RoomHelper.VERSION, + exportSchema = false) abstract class GlobalRoom : RoomDatabase() { - abstract fun eleWorkOrderDao(): EleWorkOrderDao + abstract fun eleWorkOrderDao() : EleWorkOrderDao - abstract fun eleCarDamagePhotoDao(): EleCarDamagePhotoDao + abstract fun eleCarDamagePhotoDao() : EleCarDamagePhotoDao - abstract fun waterMarkerDao(): WaterMarkerDao + abstract fun waterMarkerDao() : WaterMarkerDao - abstract fun changeBatteryDao(): ChangeBatteryDao + abstract fun changeBatteryDao() : ChangeBatteryDao - abstract fun orderDao(): OrderDao + abstract fun orderDao() : OrderDao - abstract fun photoTemplateDao(): PhotoTemplateDao + abstract fun photoTemplateDao() : PhotoTemplateDao - abstract fun offlineTaskDao(): OfflineDao + abstract fun offlineTaskDao() : OfflineDao + + abstract fun driverInfoDao() : DriverInfoDao + + abstract fun localResourceDao() : LocalResourceDao } diff --git a/servicing/src/main/java/com/za/room/db/user/DriverInfoBean.kt b/servicing/src/main/java/com/za/room/db/user/DriverInfoBean.kt new file mode 100644 index 0000000..a0726cf --- /dev/null +++ b/servicing/src/main/java/com/za/room/db/user/DriverInfoBean.kt @@ -0,0 +1,26 @@ +package com.za.room.db.user + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "driver_info") +data class DriverInfoBean( + @PrimaryKey(autoGenerate = false) val userId : Int? = null, //用户id + val userName : String? = null, //用户姓名 + val userPhone : String? = null, //用户手机号 + val userPortrait : String? = null, //用户头像 + val rongyunToken : String? = null, + val logTime : String? = null, + val supplierId : Int? = null, //经销商id + val supplierName : String? = null, //经销商名称 + val supplierType : Int? = null, //经销商类型 1子公司 2供应商 + val loginLogId : Int? = null, + val serviceList : String? = null, //车辆服务列表 + val assistUserCode : String? = null, + val authStatus : Int? = null, // 0 未认证 1 已认证 + val vehicleId : Int? = null, + val vehicleName : String? = null, + val vehicleState : Int? = null, //车辆状态 0 空闲 1 忙碌 + val plateNumber : String? = null, //车牌号 + val deviceId : String? = null, +) \ No newline at end of file diff --git a/servicing/src/main/java/com/za/room/db/user/DriverInfoDao.kt b/servicing/src/main/java/com/za/room/db/user/DriverInfoDao.kt new file mode 100644 index 0000000..6845c7a --- /dev/null +++ b/servicing/src/main/java/com/za/room/db/user/DriverInfoDao.kt @@ -0,0 +1,40 @@ +package com.za.room.db.user + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import androidx.room.Transaction +import androidx.room.Update +import com.za.common.log.LogUtil + +@Dao +interface DriverInfoDao { + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insert(driverInfoBean : DriverInfoBean) + + @Query("SELECT * FROM driver_info") + fun getDriverInfoFromUserId() : DriverInfoBean? + + + @Query("DELETE FROM driver_info") + fun deleteAll() + + @Update(onConflict = OnConflictStrategy.REPLACE) + fun update(driverInfoBean : DriverInfoBean) + + @Transaction + fun updateDriverInfo(driverInfoBean : DriverInfoBean?) { + if (driverInfoBean == null) { + LogUtil.print("DriverInfoDao", "updateDriverInfo driverInfoBean is null") + return + } + val driverInfo = getDriverInfoFromUserId() + if (driverInfo != null && driverInfo.userId == driverInfoBean.userId) { + update(driverInfoBean) + return + } + deleteAll() + insert(driverInfoBean) + } +} \ No newline at end of file diff --git a/servicing/src/main/java/com/za/room/db/user/LocalResourceBean.kt b/servicing/src/main/java/com/za/room/db/user/LocalResourceBean.kt new file mode 100644 index 0000000..79b4a0a --- /dev/null +++ b/servicing/src/main/java/com/za/room/db/user/LocalResourceBean.kt @@ -0,0 +1,10 @@ +package com.za.room.db.user + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "local_resource_bean") +data class LocalResourceBean(@PrimaryKey val resourceName : String, + val resourceType : Int = 0, + val resourceUrl : String? = null, + val resourceDescription : String? = null) \ No newline at end of file diff --git a/servicing/src/main/java/com/za/room/db/user/LocalResourceDao.kt b/servicing/src/main/java/com/za/room/db/user/LocalResourceDao.kt new file mode 100644 index 0000000..6635a1a --- /dev/null +++ b/servicing/src/main/java/com/za/room/db/user/LocalResourceDao.kt @@ -0,0 +1,32 @@ +package com.za.room.db.user + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.Query +import androidx.room.Update + + +@Dao +interface LocalResourceDao { + @Insert + fun insert(localResourceBean : LocalResourceBean) + + @Update + fun update(localResourceBean : LocalResourceBean) + + @Delete + fun delete(localResourceBean : LocalResourceBean) + + @get:Query("SELECT * FROM local_resource_bean") + val allLocalResources : List? + + @Query("SELECT * FROM local_resource_bean WHERE resourceName = :resourceName") + fun getLocalResourceByName(resourceName : String?) : LocalResourceBean? + + @Query("SELECT * FROM local_resource_bean WHERE resourceType = :resourceType") + fun getLocalResourcesByType(resourceType : Int) : List? + + @Query("DELETE FROM local_resource_bean") + fun deleteAllLocalResources() +} diff --git a/servicing/src/main/java/com/za/service/jpush/JPushReceiver.kt b/servicing/src/main/java/com/za/service/jpush/JPushReceiver.kt index 500b616..e3678b7 100644 --- a/servicing/src/main/java/com/za/service/jpush/JPushReceiver.kt +++ b/servicing/src/main/java/com/za/service/jpush/JPushReceiver.kt @@ -4,6 +4,7 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import cn.jpush.android.api.JPushInterface +import com.za.common.GlobalData import com.za.common.log.LogUtil import com.za.service.ServiceManager @@ -11,28 +12,33 @@ import com.za.service.ServiceManager * Created by zhangj on 2019/4/4. */ class JPushReceiver : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - val bundle = intent.extras - LogUtil.print("JpushMessage ", "onReceive==" + "action:" + intent.action) - if (intent.action == null || bundle == null) { return } - when (intent.action) { - JPushInterface.ACTION_REGISTRATION_ID -> { - val regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID) - LogUtil.print("JpushMessage ", "Registration successful: $regId") - } + override fun onReceive(context : Context, intent : Intent) { + val bundle = intent.extras + LogUtil.print("JpushMessage ", "onReceive==" + "action:" + intent.action) + if (intent.action == null || bundle == null) { + return + } + when (intent.action) { + JPushInterface.ACTION_REGISTRATION_ID -> { + val regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID) + GlobalData.regid = regId + LogUtil.print("JpushMessage ", "Registration successful: $regId") + } - JPushInterface.ACTION_MESSAGE_RECEIVED -> { - val msg = bundle.getString(JPushInterface.EXTRA_MESSAGE) - if (msg.isNullOrBlank()) { return } - ServiceManager.handlerPushMsg(msg) - } + JPushInterface.ACTION_MESSAGE_RECEIVED -> { + val msg = bundle.getString(JPushInterface.EXTRA_MESSAGE) + if (msg.isNullOrBlank()) { + return + } + ServiceManager.handlerPushMsg(msg) + } - JPushInterface.ACTION_NOTIFICATION_RECEIVED -> { - val title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE) - LogUtil.print("JPushReceiver:", "ACTION_NOTIFICATION_RECEIVED title: $title") - } + JPushInterface.ACTION_NOTIFICATION_RECEIVED -> { + val title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE) + LogUtil.print("JPushReceiver:", "ACTION_NOTIFICATION_RECEIVED title: $title") + } - else -> {} - } - } + else -> {} + } + } } diff --git a/servicing/src/main/java/com/za/service/location/ZdLocationManager.kt b/servicing/src/main/java/com/za/service/location/ZdLocationManager.kt index 5b589cc..adc7136 100644 --- a/servicing/src/main/java/com/za/service/location/ZdLocationManager.kt +++ b/servicing/src/main/java/com/za/service/location/ZdLocationManager.kt @@ -123,8 +123,8 @@ object ZdLocationManager : AMapLocationListener { val request = UploadGpsRequest().apply { lat = location.latitude lng = location.longitude - userId = GlobalData.driverInfo?.userId - vehicleId = GlobalData.vehicleInfo?.vehicleId + userId = GlobalData.driverInfoBean?.userId + vehicleId = GlobalData.driverInfoBean?.vehicleId working = GlobalData.currentOrder != null direction = location.bearing.toDouble() speed = location.speed.toDouble() diff --git a/servicing/src/main/java/com/za/ui/h5/CommonH5Activity.kt b/servicing/src/main/java/com/za/ui/h5/CommonH5Activity.kt index 3b0d58c..6e577b7 100644 --- a/servicing/src/main/java/com/za/ui/h5/CommonH5Activity.kt +++ b/servicing/src/main/java/com/za/ui/h5/CommonH5Activity.kt @@ -103,8 +103,8 @@ class CommonH5Activity : BaseActivity() { append("/training/training.html") append("?id=").append(articleId) append("&source=driverApp") - append("&driverId=").append(GlobalData.driverInfo?.userId) - append("&userId=").append(GlobalData.driverInfo?.userId) + append("&driverId=").append(GlobalData.driverInfoBean?.userId) + append("&userId=").append(GlobalData.driverInfoBean?.userId) } override fun onDestroy() { diff --git a/servicing/src/main/java/com/za/ui/main/ServiceLauncherActivity.kt b/servicing/src/main/java/com/za/ui/main/ServiceLauncherActivity.kt index 0d6f962..a4469f8 100644 --- a/servicing/src/main/java/com/za/ui/main/ServiceLauncherActivity.kt +++ b/servicing/src/main/java/com/za/ui/main/ServiceLauncherActivity.kt @@ -170,7 +170,6 @@ class ServiceLauncherActivity : BaseActivity() { private fun navigateToNextScreen() { if (GlobalData.isMaster) { GlobalData.currentOrder?.goStatusPage(this) - finish() return } val driverName = intent.getStringExtra("driverName") diff --git a/servicing/src/main/java/com/za/ui/main/ServicingMainActivity.kt b/servicing/src/main/java/com/za/ui/main/ServicingMainActivity.kt index a05f35d..9ef1a56 100644 --- a/servicing/src/main/java/com/za/ui/main/ServicingMainActivity.kt +++ b/servicing/src/main/java/com/za/ui/main/ServicingMainActivity.kt @@ -81,7 +81,6 @@ private fun ServicingMainScreen(jobCode : String? = null, } } else { GlobalData.currentOrder?.goStatusPage(ActivityUtils.getTopActivity()) - context.finish() } } 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 a13d33b..cb0dbaa 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 @@ -86,9 +86,15 @@ class NewOrderActivity : BaseActivity() { } else { intent.getSerializableExtra("jpushBean") } + GlobalData.isHandlerNewOrder = false AcceptOrderScreen(jpushBean = jpushBean as JpushBean) } + override fun onStop() { + super.onStop() + GlobalData.isHandlerNewOrder = true + } + companion object { fun goNewOrderActivity(context : Context, jpushBean : JpushBean) { val intent = Intent(context, NewOrderActivity::class.java) @@ -196,24 +202,24 @@ private fun AcceptOrderScreen(jpushBean : JpushBean?, vm : NewOrderVm = viewMode topBar = { HeadViewNotBack(title = "新订单") }, sheetContent = { Column(modifier = Modifier - .fillMaxWidth() - .wrapContentHeight() - .background(Color.White) - .verticalScroll(rememberScrollState())) { // 滑动指示器 + .fillMaxWidth() + .wrapContentHeight() + .background(Color.White) + .verticalScroll(rememberScrollState())) { // 滑动指示器 Box(modifier = Modifier - .fillMaxWidth() - .padding(vertical = 8.dp) - .background(Color.White), contentAlignment = Alignment.Center) { + .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))) + .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), + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 12.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically) { Text(text = uiState.value.jpushBean?.serviceTypeName ?: "", @@ -230,8 +236,8 @@ private fun AcceptOrderScreen(jpushBean : JpushBean?, vm : NewOrderVm = viewMode // 添加距离和时间信息 Row(modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 12.dp), + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 12.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically) { Text(text = "预计到达: ${uiState.value.estimatedArrivalTime}", @@ -244,13 +250,13 @@ private fun AcceptOrderScreen(jpushBean : JpushBean?, vm : NewOrderVm = viewMode } HorizontalDivider(modifier = Modifier - .fillMaxWidth() - .alpha(0.1f)) + .fillMaxWidth() + .alpha(0.1f)) // 订单信息 Column(modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 12.dp)) { // 订单标签 + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 12.dp)) { // 订单标签 Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(8.dp)) { @@ -338,13 +344,13 @@ private fun AcceptOrderScreen(jpushBean : JpushBean?, vm : NewOrderVm = viewMode // 修改按钮状态 Row(modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 16.dp), + .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), + .weight(1f) + .height(44.dp), colors = ButtonDefaults.buttonColors(containerColor = Color.White, contentColor = Color(0xFF666666)), border = BorderStroke(1.dp, Color(0xFFE5E5E5)), @@ -355,8 +361,8 @@ private fun AcceptOrderScreen(jpushBean : JpushBean?, vm : NewOrderVm = viewMode // 接单按钮 Button(onClick = { vm.dispatch(NewOrderVm.Action.AcceptOrder) }, modifier = Modifier - .weight(1f) - .height(44.dp), + .weight(1f) + .height(44.dp), colors = ButtonDefaults.buttonColors(containerColor = headBgColor), shape = RoundedCornerShape(8.dp)) { Text(text = "接单", @@ -375,8 +381,8 @@ private fun AcceptOrderScreen(jpushBean : JpushBean?, vm : NewOrderVm = viewMode sheetDragHandle = null, sheetSwipeEnabled = true) { paddingValues -> Box(modifier = Modifier - .fillMaxSize() - .padding(paddingValues)) { + .fillMaxSize() + .padding(paddingValues)) { AndroidView(modifier = Modifier.fillMaxSize(), factory = { AMapLocationClient.updatePrivacyShow(context, true, true) AMapLocationClient.updatePrivacyAgree(context, true) @@ -423,7 +429,7 @@ private fun AcceptOrderScreen(jpushBean : JpushBean?, vm : NewOrderVm = viewMode // 添加当前位置标记 currentLocation?.let { mapView.map.addMarker(MarkerOptions().position(it).title("当前位置") - .icon(ImageUtil.vectorToBitmap(context,R.drawable.ic_current_location)) + .icon(ImageUtil.vectorToBitmap(context, R.drawable.ic_current_location)) .anchor(0.5f, 0.5f).visible(true)) allPoints.add(it) } @@ -477,14 +483,14 @@ private fun AcceptOrderScreen(jpushBean : JpushBean?, vm : NewOrderVm = viewMode private fun OrderItemView(jpushBean : JpushBean?, remainingTime : Int = 50) { val context = LocalContext.current Column(modifier = Modifier - .fillMaxWidth() - .background(color = Color.White) - .padding(bottom = 16.dp)) { // 订单类型和倒计时 + .fillMaxWidth() + .background(color = Color.White) + .padding(bottom = 16.dp)) { // 订单类型和倒计时 Row(modifier = Modifier - .fillMaxWidth() - .background(brush = Brush.verticalGradient(colors = arrayListOf(Color(0xFFFFEDE3), - Color.White))) - .padding(horizontal = 16.dp, vertical = 12.dp), + .fillMaxWidth() + .background(brush = Brush.verticalGradient(colors = arrayListOf(Color(0xFFFFEDE3), + Color.White))) + .padding(horizontal = 16.dp, vertical = 12.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically) { Text(text = jpushBean?.serviceTypeName ?: "", @@ -498,19 +504,19 @@ private fun OrderItemView(jpushBean : JpushBean?, remainingTime : Int = 50) { } HorizontalDivider(modifier = Modifier - .padding(horizontal = 16.dp) - .alpha(0.08f)) + .padding(horizontal = 16.dp) + .alpha(0.08f)) // 订单标签 Row(modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 12.dp), + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 12.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically) { Row(verticalAlignment = Alignment.CenterVertically) { Box(modifier = Modifier - .background(Color(0xFF9BA1B2), RoundedCornerShape(4.dp)) - .padding(horizontal = 6.dp, vertical = 2.dp)) { + .background(Color(0xFF9BA1B2), RoundedCornerShape(4.dp)) + .padding(horizontal = 6.dp, vertical = 2.dp)) { Text(text = "月结", color = Color.White, fontSize = 12.sp) } Spacer(modifier = Modifier.width(8.dp)) @@ -524,9 +530,9 @@ private fun OrderItemView(jpushBean : JpushBean?, remainingTime : Int = 50) { // 订单号 Row(modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp) - .clickable { jpushBean?.taskCode?.copy(context) }, + .fillMaxWidth() + .padding(horizontal = 16.dp) + .clickable { jpushBean?.taskCode?.copy(context) }, verticalAlignment = Alignment.CenterVertically) { Text(text = "单号", color = Color(0xFF999999), fontSize = 13.sp) Spacer(modifier = Modifier.width(8.dp)) @@ -544,8 +550,8 @@ private fun OrderItemView(jpushBean : JpushBean?, remainingTime : Int = 50) { // 救援地址 Row(modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp), + .fillMaxWidth() + .padding(horizontal = 16.dp), verticalAlignment = Alignment.Top) { AsyncImage(model = R.drawable.sv_rescuing, contentDescription = "rescue", @@ -561,12 +567,12 @@ private fun OrderItemView(jpushBean : JpushBean?, remainingTime : Int = 50) { if (! jpushBean?.distAddress.isNullOrBlank()) { Spacer(modifier = Modifier.height(16.dp)) HorizontalDivider(modifier = Modifier - .padding(horizontal = 24.dp) - .alpha(0.1f)) + .padding(horizontal = 24.dp) + .alpha(0.1f)) Spacer(modifier = Modifier.height(16.dp)) Row(modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp), + .fillMaxWidth() + .padding(horizontal = 16.dp), verticalAlignment = Alignment.Top) { AsyncImage(model = R.drawable.sv_dist, contentDescription = "destination", diff --git a/servicing/src/main/java/com/za/ui/new_order/NewOrderVm.kt b/servicing/src/main/java/com/za/ui/new_order/NewOrderVm.kt index 27fa400..8c55297 100644 --- a/servicing/src/main/java/com/za/ui/new_order/NewOrderVm.kt +++ b/servicing/src/main/java/com/za/ui/new_order/NewOrderVm.kt @@ -93,8 +93,8 @@ class NewOrderVm : BaseVm() { val orderInfo = uiState.value.jpushBean val acceptOrderRequest = AcceptOrderRequest() acceptOrderRequest.taskId = orderInfo?.taskId - acceptOrderRequest.vehicleId = GlobalData.vehicleInfo?.vehicleId - acceptOrderRequest.userId = GlobalData.driverInfo?.userId + acceptOrderRequest.vehicleId = GlobalData.driverInfoBean?.vehicleId + acceptOrderRequest.userId = GlobalData.driverInfoBean?.userId acceptOrderRequest.taskCode = orderInfo?.taskCode acceptOrderRequest.deviceId = DeviceUtil.getAndroidId(ActivityUtils.getTopActivity()) acceptOrderRequest.lat = it.latitude @@ -123,9 +123,9 @@ class NewOrderVm : BaseVm() { private fun refuseOrder() { LoadingManager.showLoading() RetrofitHelper.getDefaultService().refuseOrder(RefuseOrderRequest(taskId = uiState.value.jpushBean?.taskId, - vehicleId = GlobalData.vehicleInfo?.vehicleId, + vehicleId = GlobalData.driverInfoBean?.vehicleId, taskCode = uiState.value.jpushBean?.taskCode, - userId = GlobalData.driverInfo?.userId)) + userId = GlobalData.driverInfoBean?.userId)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : BaseObserver() { @@ -147,7 +147,7 @@ class NewOrderVm : BaseVm() { timerJob?.cancel() timerJob = viewModelScope.launch { try { - var timeLeft = 50 + var timeLeft = 120 while (timeLeft > 0 && isActive) { delay(1000) timeLeft-- diff --git a/servicing/src/main/java/com/za/ui/servicing/InServicingPhotoView.kt b/servicing/src/main/java/com/za/ui/servicing/InServicingPhotoView.kt index c4fd9b8..f884f10 100644 --- a/servicing/src/main/java/com/za/ui/servicing/InServicingPhotoView.kt +++ b/servicing/src/main/java/com/za/ui/servicing/InServicingPhotoView.kt @@ -108,7 +108,7 @@ private fun handlerInServicingPhoto( lng = localPhotoTemplateInfo.lng?.toDouble(), address = localPhotoTemplateInfo.address, time = localPhotoTemplateInfo.time, - driverName = GlobalData.driverInfo?.userName, + driverName = GlobalData.driverInfoBean?.userName, taskCode = localPhotoTemplateInfo.taskCode) File(PhotoMarkerManager.addPhotoMarker(context = context, photoMarkerInfo)) } else { @@ -188,7 +188,7 @@ private fun handlerChangeBatteryPhoto(context : Context, lng = localPhotoTemplateInfo.lng?.toDouble(), address = localPhotoTemplateInfo.address, time = localPhotoTemplateInfo.time, - driverName = GlobalData.driverInfo?.userName, + driverName = GlobalData.driverInfoBean?.userName, taskCode = localPhotoTemplateInfo.taskCode) File(PhotoMarkerManager.addPhotoMarker(context = context, photoMarkerInfo)) } else { @@ -270,7 +270,7 @@ private fun handlerNormalPhoto(context : Context, lng = localPhotoTemplateInfo.lng?.toDouble(), address = localPhotoTemplateInfo.address, time = localPhotoTemplateInfo.time, - driverName = GlobalData.driverInfo?.userName, + driverName = GlobalData.driverInfoBean?.userName, taskCode = localPhotoTemplateInfo.taskCode) File(PhotoMarkerManager.addPhotoMarker(context = context, photoMarkerInfo)) } else { diff --git a/servicing/src/main/java/com/za/ui/servicing/check_vehicle/CheckVehicleActivity.kt b/servicing/src/main/java/com/za/ui/servicing/check_vehicle/CheckVehicleActivity.kt index 8872771..af01b20 100644 --- a/servicing/src/main/java/com/za/ui/servicing/check_vehicle/CheckVehicleActivity.kt +++ b/servicing/src/main/java/com/za/ui/servicing/check_vehicle/CheckVehicleActivity.kt @@ -42,7 +42,6 @@ fun CheckVehicleScreen(vm: CheckVehicleVm = viewModel()) { if (uiState.value.goNextPage != null) { goNextPage(uiState.value.goNextPage?.nextState, context) - context.finish() } if (uiState.value.isGoNextPageDialog == true) { diff --git a/servicing/src/main/java/com/za/ui/servicing/check_vehicle/CheckVehicleVm.kt b/servicing/src/main/java/com/za/ui/servicing/check_vehicle/CheckVehicleVm.kt index d149d37..5a91533 100644 --- a/servicing/src/main/java/com/za/ui/servicing/check_vehicle/CheckVehicleVm.kt +++ b/servicing/src/main/java/com/za/ui/servicing/check_vehicle/CheckVehicleVm.kt @@ -97,8 +97,8 @@ class CheckVehicleVm : IServicingVm) { val taskRequest = UpdateTaskRequest(type = "CHECK_VEHICLE", taskId = getCurrentOrder()?.taskId, - userId = GlobalData.driverInfo?.userId, - vehicleId = GlobalData.vehicleInfo?.vehicleId, + userId = GlobalData.driverInfoBean?.userId, + vehicleId = GlobalData.driverInfoBean?.vehicleId, currentState = "EXAMINE", offlineMode = 0, operateTime = System.currentTimeMillis().toString(), @@ -197,8 +197,8 @@ class CheckVehicleVm : IServicingVm) { val taskRequest = UpdateTaskRequest(type = "DEST_PHOTO", taskId = GlobalData.currentOrder?.taskId, - userId = GlobalData.driverInfo?.userId, + userId = GlobalData.driverInfoBean?.userId, flowType = GlobalData.currentOrder?.flowType, - vehicleId = GlobalData.vehicleInfo?.vehicleId, + vehicleId = GlobalData.driverInfoBean?.vehicleId, currentState = "DESTPHOTO", offlineMode = 0, operateTime = System.currentTimeMillis().toString(), @@ -198,9 +198,9 @@ class DestinationPhotoVm : IServicingVm( private fun doUploadOfflineTask(it: AMapLocation?, tempPhotoList: ArrayList) { val taskRequest = UpdateTaskRequest(type = "OPERATION", taskId = GlobalData.currentOrder?.taskId, - userId = GlobalData.driverInfo?.userId, + userId = GlobalData.driverInfoBean?.userId, flowType = GlobalData.currentOrder?.flowType, - vehicleId = GlobalData.vehicleInfo?.vehicleId, + vehicleId = GlobalData.driverInfoBean?.vehicleId, currentState = "OPERATION", offlineMode = 0, operateTime = System.currentTimeMillis().toString(), @@ -202,9 +202,9 @@ class InOperationVm : IServicingVm( LoadingManager.hideLoading() val taskRequest = UpdateTaskRequest(type = "OPERATION", taskId = GlobalData.currentOrder?.taskId, - userId = GlobalData.driverInfo?.userId, + userId = GlobalData.driverInfoBean?.userId, flowType = GlobalData.currentOrder?.flowType, - vehicleId = GlobalData.vehicleInfo?.vehicleId, + vehicleId = GlobalData.driverInfoBean?.vehicleId, currentState = "OPERATION", offlineMode = 0, operateTime = System.currentTimeMillis().toString(), diff --git a/servicing/src/main/java/com/za/ui/servicing/order_confirm/ChangeBatteryScreen.kt b/servicing/src/main/java/com/za/ui/servicing/order_confirm/ChangeBatteryScreen.kt index ef94ad0..19a3537 100644 --- a/servicing/src/main/java/com/za/ui/servicing/order_confirm/ChangeBatteryScreen.kt +++ b/servicing/src/main/java/com/za/ui/servicing/order_confirm/ChangeBatteryScreen.kt @@ -42,7 +42,6 @@ fun ChangeBatteryScreen(vm: ChangeBatteryVm = viewModel()) { if (uiState.value.goNextPage != null) { uiState.value.orderInfo?.goStatusPage(context) - context.finish() } Scaffold(topBar = { diff --git a/servicing/src/main/java/com/za/ui/servicing/order_confirm/ConfirmEleScreen.kt b/servicing/src/main/java/com/za/ui/servicing/order_confirm/ConfirmEleScreen.kt index 9fb8445..c2b0f2c 100644 --- a/servicing/src/main/java/com/za/ui/servicing/order_confirm/ConfirmEleScreen.kt +++ b/servicing/src/main/java/com/za/ui/servicing/order_confirm/ConfirmEleScreen.kt @@ -78,10 +78,8 @@ fun ConfirmEleScreen(vm : ConfirmEleVm = viewModel()) { } } - if (uiState.value.goNextPage != null) { goNextPage(uiState.value.goNextPage?.nextState, context) - context.finish() } if (uiState.value.isGoNextPageDialog == true) { diff --git a/servicing/src/main/java/com/za/ui/servicing/order_confirm/ConfirmH5SuccessScreen.kt b/servicing/src/main/java/com/za/ui/servicing/order_confirm/ConfirmH5SuccessScreen.kt index 5235393..485784c 100644 --- a/servicing/src/main/java/com/za/ui/servicing/order_confirm/ConfirmH5SuccessScreen.kt +++ b/servicing/src/main/java/com/za/ui/servicing/order_confirm/ConfirmH5SuccessScreen.kt @@ -48,7 +48,6 @@ import com.za.base.view.CommonDialog import com.za.base.view.HeadView import com.za.base.view.LoadingState import com.za.common.log.LogUtil -import com.za.ext.finish import com.za.ext.getEleOrderH5Url import com.za.ext.goStatusPage import com.za.servicing.R @@ -115,7 +114,6 @@ fun ConfirmH5SuccessScreen(vm : ConfirmH5SuccessVm = viewModel()) { if (uiState.value.goNextPage == true) { uiState.value.orderInfo?.goStatusPage(context) - context.finish() } if (uiState.value.showSignDialog != null) { diff --git a/servicing/src/main/java/com/za/ui/servicing/order_confirm/input_money/InputMoneyActivity.kt b/servicing/src/main/java/com/za/ui/servicing/order_confirm/input_money/InputMoneyActivity.kt index f52a4df..00fa581 100644 --- a/servicing/src/main/java/com/za/ui/servicing/order_confirm/input_money/InputMoneyActivity.kt +++ b/servicing/src/main/java/com/za/ui/servicing/order_confirm/input_money/InputMoneyActivity.kt @@ -82,401 +82,339 @@ val primaryColor = Color(0xFF3B82F6) val gradientColors = listOf(Color(0xFF3B82F6), Color(0xFF60A5FA)) class InputMoneyActivity : BaseActivity() { - @Composable - override fun ContentView() { - InputMoneyScreen(userOrderId = intent.getIntExtra("userOrderId", 0), taskId = intent.getIntExtra("taskId", 0)) - } + @Composable + override fun ContentView() { + InputMoneyScreen(userOrderId = intent.getIntExtra("userOrderId", 0), + taskId = intent.getIntExtra("taskId", 0)) + } - companion object { - fun goInputMoney(context: Context, userOrderId: Int, taskId: Int) { - context.startActivity(Intent(context, InputMoneyActivity::class.java).apply { - putExtra("userOrderId", userOrderId) - putExtra("taskId", taskId) - }) - } - } + companion object { + fun goInputMoney(context : Context, userOrderId : Int, taskId : Int) { + context.startActivity(Intent(context, InputMoneyActivity::class.java).apply { + putExtra("userOrderId", userOrderId) + putExtra("taskId", taskId) + }) + } + } } @Preview(showBackground = true) @Composable fun PreviewInputMoneyScreen() { - InputMoneyScreen(userOrderId = 1, taskId = 1) + InputMoneyScreen(userOrderId = 1, taskId = 1) } @Composable -fun InputMoneyScreen(userOrderId: Int, taskId: Int, - vm: InputMoneyVm = viewModel()) { - val context = LocalContext.current - val uiState = vm.uiState.collectAsStateWithLifecycle() - var showSuccessDialog by remember { mutableStateOf(false) } +fun InputMoneyScreen(userOrderId : Int, taskId : Int, vm : InputMoneyVm = viewModel()) { + val context = LocalContext.current + val uiState = vm.uiState.collectAsStateWithLifecycle() + var showSuccessDialog by remember { mutableStateOf(false) } - val lifecycleOwner = LocalLifecycleOwner.current - DisposableEffect(key1 = lifecycleOwner) { - val observer = LifecycleEventObserver { _, event -> - if (event == Lifecycle.Event.ON_RESUME) { - vm.dispatch(action = InputMoneyVm.Action.Init(userOrderId, taskId)) - } - } - lifecycleOwner.lifecycle.addObserver(observer) - onDispose { - lifecycleOwner.lifecycle.removeObserver(observer) - } - } + val lifecycleOwner = LocalLifecycleOwner.current + DisposableEffect(key1 = lifecycleOwner) { + val observer = LifecycleEventObserver { _, event -> + if (event == Lifecycle.Event.ON_RESUME) { + vm.dispatch(action = InputMoneyVm.Action.Init(userOrderId, taskId)) + } + } + lifecycleOwner.lifecycle.addObserver(observer) + onDispose { + lifecycleOwner.lifecycle.removeObserver(observer) + } + } - if (showSuccessDialog) { - SuccessDialog( - amount = "${uiState.value.paymentInfoBean?.amount ?: 0.00}", - onDismiss = { - showSuccessDialog = false - context.finish() - } - ) - } + if (showSuccessDialog) { + SuccessDialog(amount = "${uiState.value.paymentInfoBean?.amount ?: 0.00}", onDismiss = { + showSuccessDialog = false + context.finish() + }) + } - if (uiState.value.payState == 3) { - CommonDialog(title = "收款成功", message = "收款成功", cancelEnable = false, - confirm = { - goNextPage(GlobalData.currentOrder?.taskState, context) - context.finish() - }, dismiss = { - goNextPage(GlobalData.currentOrder?.taskState, context) - context.finish() - }) - } + if (uiState.value.payState == 3) { + CommonDialog(title = "收款成功", message = "收款成功", cancelEnable = false, confirm = { + goNextPage(GlobalData.currentOrder?.taskState, context) + }, dismiss = { + goNextPage(GlobalData.currentOrder?.taskState, context) + }) + } - Scaffold( - topBar = { HeadView(title = "客户收款", onBack = { context.finish() }) }, - bottomBar = { - Surface( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp), - tonalElevation = 8.dp, - shadowElevation = 8.dp, - color = backgroundColor, - shape = RoundedCornerShape(24.dp) - ) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp), - horizontalArrangement = Arrangement.spacedBy(12.dp) - ) { - Button( - onClick = { - goNextPage(GlobalData.currentOrder?.taskState, context) - context.finish() - }, - modifier = Modifier - .weight(1f) - .height(48.dp) - .animateContentSize(), - shape = RoundedCornerShape(24.dp), - colors = ButtonDefaults.buttonColors( - containerColor = Color(0xFF64748B), - contentColor = Color.White - ), - elevation = ButtonDefaults.buttonElevation(4.dp), - interactionSource = remember { MutableInteractionSource() } - ) { - Text("无须收款", fontSize = 12.sp, fontWeight = FontWeight.Medium) - } + Scaffold(topBar = { HeadView(title = "客户收款", onBack = { context.finish() }) }, bottomBar = { + Surface(modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + tonalElevation = 8.dp, + shadowElevation = 8.dp, + color = backgroundColor, + shape = RoundedCornerShape(24.dp)) { + Row(modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + horizontalArrangement = Arrangement.spacedBy(12.dp)) { + Button(onClick = { + goNextPage(GlobalData.currentOrder?.taskState, context) + }, + modifier = Modifier + .weight(1f) + .height(48.dp) + .animateContentSize(), + shape = RoundedCornerShape(24.dp), + colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF64748B), + contentColor = Color.White), + elevation = ButtonDefaults.buttonElevation(4.dp), + interactionSource = remember { MutableInteractionSource() }) { + Text("无须收款", fontSize = 12.sp, fontWeight = FontWeight.Medium) + } - Button( - onClick = { - if (uiState.value.receiveMoney == null || uiState.value.receiveMoney == 0f) { - ToastUtils.showLong("请输入收款金额") - return@Button - } - if (uiState.value.isOnSite == 2 && uiState.value.userPhone.isNullOrEmpty()) { - ToastUtils.showLong("请输入客户手机号") - return@Button - } - vm.dispatch(InputMoneyVm.Action.Save) - }, - modifier = Modifier - .fillMaxWidth() - .height(48.dp) - .weight(1f), - shape = RoundedCornerShape(24.dp), - colors = ButtonDefaults.buttonColors( - containerColor = primaryColor - ), - elevation = ButtonDefaults.buttonElevation(4.dp) - ) { - Text("发送短信链接".takeIf { uiState.value.isOnSite != 1 } - ?: "生成收款二维码", fontSize = 12.sp, fontWeight = FontWeight.Medium) - } - } - } - }, - containerColor = backgroundColor - ) { - Column( - modifier = Modifier - .fillMaxSize() - .padding(it) - .verticalScroll(rememberScrollState()) - .padding(16.dp) - ) { - Column(modifier = Modifier.fillMaxWidth(), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Spacer(modifier = Modifier.height(12.dp)) - Text("收款金额", - color = Color.Gray, - fontSize = 18.sp, - fontWeight = FontWeight.Medium, - modifier = Modifier.padding(bottom = 16.dp) - ) + Button(onClick = { + if (uiState.value.receiveMoney == null || uiState.value.receiveMoney == 0f) { + ToastUtils.showLong("请输入收款金额") + return@Button + } + if (uiState.value.isOnSite == 2 && uiState.value.userPhone.isNullOrEmpty()) { + ToastUtils.showLong("请输入客户手机号") + return@Button + } + vm.dispatch(InputMoneyVm.Action.Save) + }, + modifier = Modifier + .fillMaxWidth() + .height(48.dp) + .weight(1f), + shape = RoundedCornerShape(24.dp), + colors = ButtonDefaults.buttonColors(containerColor = primaryColor), + elevation = ButtonDefaults.buttonElevation(4.dp)) { + Text("发送短信链接".takeIf { uiState.value.isOnSite != 1 } ?: "生成收款二维码", + fontSize = 12.sp, + fontWeight = FontWeight.Medium) + } + } + } + }, containerColor = backgroundColor) { + Column(modifier = Modifier + .fillMaxSize() + .padding(it) + .verticalScroll(rememberScrollState()) + .padding(16.dp)) { + Column(modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally) { + Spacer(modifier = Modifier.height(12.dp)) + Text("收款金额", + color = Color.Gray, + fontSize = 18.sp, + fontWeight = FontWeight.Medium, + modifier = Modifier.padding(bottom = 16.dp)) - OutlinedTextField( - value = uiState.value.receiveMoneyText ?: "", - onValueChange = { newValue -> - vm.updateState(uiState.value.copy(receiveMoney = newValue.toFloatOrNull(), receiveMoneyText = newValue)) - }, - modifier = Modifier.fillMaxWidth(), - keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Decimal), - prefix = { Text("¥") }, - shape = RoundedCornerShape(12.dp), - colors = OutlinedTextFieldDefaults.colors( - focusedBorderColor = primaryColor, - unfocusedBorderColor = Color.Gray.copy(alpha = 0.5f), - focusedLabelColor = primaryColor, - unfocusedLabelColor = Color.Gray - ) - ) - } + OutlinedTextField(value = uiState.value.receiveMoneyText ?: "", + onValueChange = { newValue -> + vm.updateState(uiState.value.copy(receiveMoney = newValue.toFloatOrNull(), + receiveMoneyText = newValue)) + }, + modifier = Modifier.fillMaxWidth(), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Decimal), + prefix = { Text("¥") }, + shape = RoundedCornerShape(12.dp), + colors = OutlinedTextFieldDefaults.colors(focusedBorderColor = primaryColor, + unfocusedBorderColor = Color.Gray.copy(alpha = 0.5f), + focusedLabelColor = primaryColor, + unfocusedLabelColor = Color.Gray)) + } - Spacer(modifier = Modifier.height(15.dp)) - // Action Buttons - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.spacedBy(16.dp) - ) { - Row( - modifier = if (uiState.value.isOnSite == 1) { - Modifier - .weight(1f) - .background( - brush = Brush.linearGradient(gradientColors), - shape = RoundedCornerShape(12.dp) - ) - .padding(vertical = 16.dp) - } else { - Modifier - .weight(1f) - .noDoubleClick { vm.dispatch(InputMoneyVm.Action.ChangeOnSite(1)) } - .border(1.dp, Color.Gray.copy(alpha = 0.5f), RoundedCornerShape(12.dp)) - .padding(vertical = 16.dp) - }, - horizontalArrangement = Arrangement.Center, - verticalAlignment = Alignment.CenterVertically - ) { - if (uiState.value.isOnSite == 1) { - Icon(imageVector = Icons.Default.LocationOn, contentDescription = null, tint = Color.White) - Text(text = "在现场", color = Color.White) - } else { - Icon(imageVector = Icons.Default.LocationOn, contentDescription = null, tint = Color.Gray) - Text(text = "在现场", color = Color.Gray) - } - } + Spacer(modifier = Modifier.height(15.dp)) // Action Buttons + Row(modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(16.dp)) { + Row(modifier = if (uiState.value.isOnSite == 1) { + Modifier + .weight(1f) + .background(brush = Brush.linearGradient(gradientColors), + shape = RoundedCornerShape(12.dp)) + .padding(vertical = 16.dp) + } else { + Modifier + .weight(1f) + .noDoubleClick { vm.dispatch(InputMoneyVm.Action.ChangeOnSite(1)) } + .border(1.dp, Color.Gray.copy(alpha = 0.5f), RoundedCornerShape(12.dp)) + .padding(vertical = 16.dp) + }, + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically) { + if (uiState.value.isOnSite == 1) { + Icon(imageVector = Icons.Default.LocationOn, + contentDescription = null, + tint = Color.White) + Text(text = "在现场", color = Color.White) + } else { + Icon(imageVector = Icons.Default.LocationOn, + contentDescription = null, + tint = Color.Gray) + Text(text = "在现场", color = Color.Gray) + } + } - Row( - modifier = if (uiState.value.isOnSite == 2) { - Modifier - .weight(1f) - .background(color = primaryColor, shape = RoundedCornerShape(3.dp)) - .padding(vertical = 15.dp) - } else { - Modifier - .weight(1f) - .noDoubleClick { - vm.dispatch(InputMoneyVm.Action.ChangeOnSite(2)) - } - .border(1.dp, color = Color.Gray, shape = RoundedCornerShape(3.dp)) - .padding(vertical = 15.dp) - }, - horizontalArrangement = Arrangement.Center - ) { - if (uiState.value.isOnSite == 2) { - Icon(imageVector = Icons.Default.Notifications, contentDescription = null, tint = Color.White) - Text(text = "不在现场", color = Color.White) - } else { - Icon(imageVector = Icons.Default.Notifications, contentDescription = null, tint = Color.Gray) - Text(text = "不在现场", color = Color.Gray) - } - } - } + Row(modifier = if (uiState.value.isOnSite == 2) { + Modifier + .weight(1f) + .background(color = primaryColor, shape = RoundedCornerShape(3.dp)) + .padding(vertical = 15.dp) + } else { + Modifier + .weight(1f) + .noDoubleClick { + vm.dispatch(InputMoneyVm.Action.ChangeOnSite(2)) + } + .border(1.dp, color = Color.Gray, shape = RoundedCornerShape(3.dp)) + .padding(vertical = 15.dp) + }, horizontalArrangement = Arrangement.Center) { + if (uiState.value.isOnSite == 2) { + Icon(imageVector = Icons.Default.Notifications, + contentDescription = null, + tint = Color.White) + Text(text = "不在现场", color = Color.White) + } else { + Icon(imageVector = Icons.Default.Notifications, + contentDescription = null, + tint = Color.Gray) + Text(text = "不在现场", color = Color.Gray) + } + } + } - AnimatedVisibility(visible = uiState.value.isOnSite == 1) { - QRCodeSection(uiState.value.qrCode - ?: "", createPayment = { vm.dispatch(InputMoneyVm.Action.CreatePaymentInfo) }) - } + AnimatedVisibility(visible = uiState.value.isOnSite == 1) { + QRCodeSection(uiState.value.qrCode ?: "", + createPayment = { vm.dispatch(InputMoneyVm.Action.CreatePaymentInfo) }) + } - AnimatedVisibility(visible = uiState.value.isOnSite == 2) { - Box(modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 10.dp, vertical = 15.dp)) { - OutlinedTextField( - value = uiState.value.userPhone ?: "", - keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Phone), - onValueChange = { vm.updateState(uiState.value.copy(userPhone = it)) }, - label = { Text("请输入客户手机号") }, - leadingIcon = { - Icon( - imageVector = Icons.Rounded.Phone, - contentDescription = null, - tint = primaryColor - ) - }, - modifier = Modifier.fillMaxWidth(), - shape = RoundedCornerShape(12.dp), - colors = OutlinedTextFieldDefaults.colors( - focusedBorderColor = primaryColor, - unfocusedBorderColor = Color.Gray, - focusedLabelColor = primaryColor, - unfocusedLabelColor = Color.Gray), - singleLine = true - ) - } - } + AnimatedVisibility(visible = uiState.value.isOnSite == 2) { + Box(modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 10.dp, vertical = 15.dp)) { + OutlinedTextField(value = uiState.value.userPhone ?: "", + keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Phone), + onValueChange = { vm.updateState(uiState.value.copy(userPhone = it)) }, + label = { Text("请输入客户手机号") }, + leadingIcon = { + Icon(imageVector = Icons.Rounded.Phone, + contentDescription = null, + tint = primaryColor) + }, + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(12.dp), + colors = OutlinedTextFieldDefaults.colors(focusedBorderColor = primaryColor, + unfocusedBorderColor = Color.Gray, + focusedLabelColor = primaryColor, + unfocusedLabelColor = Color.Gray), + singleLine = true) + } + } - if (uiState.value.payState == 1) { - Column { - Spacer(modifier = Modifier.height(15.dp)) - CountdownRing { vm.updateState(uiState.value.copy(payState = 4, qrCode = null, qrCodeOutTime = true)) } - } - } - } - } + if (uiState.value.payState == 1) { + Column { + Spacer(modifier = Modifier.height(15.dp)) + CountdownRing { + vm.updateState(uiState.value.copy(payState = 4, + qrCode = null, + qrCodeOutTime = true)) + } + } + } + } + } } @Composable -private fun QRCodeSection(qrCode: String? = null, isOutTime: Boolean? = null, createPayment: () -> Unit = {}) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(12.dp), - horizontalAlignment = Alignment.CenterHorizontally - ) { - if (!qrCode.isNullOrEmpty()) { - Surface(modifier = Modifier - .size(200.dp) - .border(2.dp, primaryColor.copy(alpha = 0.1f), RoundedCornerShape(16.dp)), - color = backgroundColor, - shape = RoundedCornerShape(16.dp) - ) { - Box(modifier = Modifier - .fillMaxSize() - .padding(16.dp), - contentAlignment = Alignment.Center - ) { - AsyncImage( - model = qrCode, - contentDescription = null, - modifier = Modifier.fillMaxSize(0.8f) - ) - } - } - Spacer(modifier = Modifier.height(16.dp)) - Text( - "请顾客扫码支付", - color = Color.Gray, - fontSize = 16.sp, - fontWeight = FontWeight.Medium - ) - } +private fun QRCodeSection(qrCode : String? = null, + isOutTime : Boolean? = null, + createPayment : () -> Unit = {}) { + Column(modifier = Modifier + .fillMaxWidth() + .padding(12.dp), + horizontalAlignment = Alignment.CenterHorizontally) { + if (! qrCode.isNullOrEmpty()) { + Surface(modifier = Modifier + .size(200.dp) + .border(2.dp, primaryColor.copy(alpha = 0.1f), RoundedCornerShape(16.dp)), + color = backgroundColor, + shape = RoundedCornerShape(16.dp)) { + Box(modifier = Modifier + .fillMaxSize() + .padding(16.dp), + contentAlignment = Alignment.Center) { + AsyncImage(model = qrCode, + contentDescription = null, + modifier = Modifier.fillMaxSize(0.8f)) + } + } + Spacer(modifier = Modifier.height(16.dp)) + Text("请顾客扫码支付", + color = Color.Gray, + fontSize = 16.sp, + fontWeight = FontWeight.Medium) + } - if (isOutTime == true) { - LoadError(message = "收款码失效", onRetry = { createPayment() }) - } + if (isOutTime == true) { + LoadError(message = "收款码失效", onRetry = { createPayment() }) + } - } + } } @Composable -private fun CountdownRing(outTime: () -> Unit) { - var countdown by remember { mutableIntStateOf(5 * 60) } - val progress by animateFloatAsState( - targetValue = (countdown / 5 * 60) * 360f, - animationSpec = remember { androidx.compose.animation.core.tween(1000) } - ) +private fun CountdownRing(outTime : () -> Unit) { + var countdown by remember { mutableIntStateOf(5 * 60) } + val progress by animateFloatAsState(targetValue = (countdown / 5 * 60) * 360f, + animationSpec = remember { androidx.compose.animation.core.tween(1000) }) - LaunchedEffect(Unit) { - while (countdown > 0) { - delay(1000) - countdown-- - if (countdown == 0) { - outTime() - } - } - } + LaunchedEffect(Unit) { + while (countdown > 0) { + delay(1000) + countdown -- + if (countdown == 0) { + outTime() + } + } + } - Box(modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) { - Box(modifier = Modifier.size(50.dp), contentAlignment = Alignment.Center) { - Canvas(modifier = Modifier.fillMaxSize()) { - drawArc( - brush = Brush.sweepGradient( - 0f to primaryColor, - 1f to Color.LightGray - ), - startAngle = -90f, - sweepAngle = progress, - useCenter = false, - style = Stroke(width = 8.dp.toPx(), cap = StrokeCap.Round) - ) - } - Surface( - color = Color.White, - shape = CircleShape, - modifier = Modifier.size(50.dp)) {} - Text( - text = countdown.toString(), - fontSize = 20.sp, - color = black90, - fontWeight = FontWeight.Medium - ) - } - } + Box(modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) { + Box(modifier = Modifier.size(50.dp), contentAlignment = Alignment.Center) { + Canvas(modifier = Modifier.fillMaxSize()) { + drawArc(brush = Brush.sweepGradient(0f to primaryColor, 1f to Color.LightGray), + startAngle = - 90f, + sweepAngle = progress, + useCenter = false, + style = Stroke(width = 8.dp.toPx(), cap = StrokeCap.Round)) + } + Surface(color = Color.White, shape = CircleShape, modifier = Modifier.size(50.dp)) {} + Text(text = countdown.toString(), + fontSize = 20.sp, + color = black90, + fontWeight = FontWeight.Medium) + } + } } @Composable -private fun SuccessDialog(amount: String, onDismiss: () -> Unit) { - Dialog(onDismissRequest = onDismiss) { - Surface( - shape = RoundedCornerShape(16.dp), - color = Color.White - ) { - Column( - modifier = Modifier.padding(24.dp), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Box( - modifier = Modifier - .size(64.dp) - .background(primaryColor.copy(alpha = 0.1f), CircleShape) - .clip(CircleShape), - contentAlignment = Alignment.Center - ) { - Icon( - Icons.Default.Check, - contentDescription = null, - tint = primaryColor, - modifier = Modifier.size(32.dp) - ) - } - Spacer(modifier = Modifier.height(16.dp)) - Text("收款成功", fontWeight = FontWeight.Medium, fontSize = 18.sp) - Text("已收款 ¥$amount", color = Color.Gray, fontSize = 14.sp) - Spacer(modifier = Modifier.height(16.dp)) - Button( - onClick = onDismiss, - modifier = Modifier.fillMaxWidth() - ) { - Text("完成") - } - } - } - } +private fun SuccessDialog(amount : String, onDismiss : () -> Unit) { + Dialog(onDismissRequest = onDismiss) { + Surface(shape = RoundedCornerShape(16.dp), color = Color.White) { + Column(modifier = Modifier.padding(24.dp), + horizontalAlignment = Alignment.CenterHorizontally) { + Box(modifier = Modifier + .size(64.dp) + .background(primaryColor.copy(alpha = 0.1f), CircleShape) + .clip(CircleShape), + contentAlignment = Alignment.Center) { + Icon(Icons.Default.Check, + contentDescription = null, + tint = primaryColor, + modifier = Modifier.size(32.dp)) + } + Spacer(modifier = Modifier.height(16.dp)) + Text("收款成功", fontWeight = FontWeight.Medium, fontSize = 18.sp) + Text("已收款 ¥$amount", color = Color.Gray, fontSize = 14.sp) + Spacer(modifier = Modifier.height(16.dp)) + Button(onClick = onDismiss, modifier = Modifier.fillMaxWidth()) { + Text("完成") + } + } + } + } } diff --git a/servicing/src/main/java/com/za/ui/servicing/order_confirm/real_order_confirm/OrderConfirmScreen.kt b/servicing/src/main/java/com/za/ui/servicing/order_confirm/real_order_confirm/OrderConfirmScreen.kt index f48d0f7..e4f3c6d 100644 --- a/servicing/src/main/java/com/za/ui/servicing/order_confirm/real_order_confirm/OrderConfirmScreen.kt +++ b/servicing/src/main/java/com/za/ui/servicing/order_confirm/real_order_confirm/OrderConfirmScreen.kt @@ -133,7 +133,7 @@ fun BaseFeeView(flowType : Int, .fillMaxWidth() .padding(vertical = 5.dp), color = black5) - if (GlobalData.driverInfo?.supplierType == Const.CHILD_COMPANY) { + if (GlobalData.driverInfoBean?.supplierType == Const.CHILD_COMPANY) { Spacer(modifier = Modifier.height(5.dp)) OrderConfirmEditView(title = "起步价", value = "${startPrice ?: ""}", onValueChanged = { dispatch(OrderConfirmVm.Action.UpdateStartPrice(it.toIntOrNull() ?: 0)) @@ -204,7 +204,7 @@ fun AuxiliaryFeeView(dilemmaFee : Int?, color = black5, thickness = 0.5.dp) - if (GlobalData.driverInfo?.supplierType == Const.CHILD_COMPANY) { + if (GlobalData.driverInfoBean?.supplierType == Const.CHILD_COMPANY) { Column(modifier = Modifier .fillMaxWidth() .padding(bottom = 12.dp), diff --git a/servicing/src/main/java/com/za/ui/servicing/order_confirm/real_order_confirm/OrderConfirmVm.kt b/servicing/src/main/java/com/za/ui/servicing/order_confirm/real_order_confirm/OrderConfirmVm.kt index 105adaa..32c80c1 100644 --- a/servicing/src/main/java/com/za/ui/servicing/order_confirm/real_order_confirm/OrderConfirmVm.kt +++ b/servicing/src/main/java/com/za/ui/servicing/order_confirm/real_order_confirm/OrderConfirmVm.kt @@ -82,7 +82,7 @@ class OrderConfirmVm : IServicingVm() { LoadingManager.hideLoading() val taskRequest = GiveUpTaskRequest( taskId = GlobalData.currentOrder?.taskId, - userId = GlobalData.driverInfo?.userId, - vehicleId = GlobalData.vehicleInfo?.vehicleId, + userId = GlobalData.driverInfoBean?.userId, + vehicleId = GlobalData.driverInfoBean?.vehicleId, lat = it.latitude, address = it.address, pushGiveUpFlag = 1, @@ -215,8 +215,8 @@ class OrderGiveUpVm : BaseVm() { LoadingManager.hideLoading() val taskRequest = GiveUpTaskRequest( taskId = GlobalData.currentOrder?.taskId, - userId = GlobalData.driverInfo?.userId, - vehicleId = GlobalData.vehicleInfo?.vehicleId, + userId = GlobalData.driverInfoBean?.userId, + vehicleId = GlobalData.driverInfoBean?.vehicleId, lat = it.latitude, address = it.address, lng = it.longitude, diff --git a/servicing/src/main/java/com/za/ui/servicing/verify/VerifyOrderActivity.kt b/servicing/src/main/java/com/za/ui/servicing/verify/VerifyOrderActivity.kt index 034268d..d233cb9 100644 --- a/servicing/src/main/java/com/za/ui/servicing/verify/VerifyOrderActivity.kt +++ b/servicing/src/main/java/com/za/ui/servicing/verify/VerifyOrderActivity.kt @@ -80,7 +80,6 @@ fun VerifyOrderScreen(vm: VerifyOrderVm = viewModel()) { if (uiState.value.goNextPage != null) { goNextPage(uiState.value.goNextPage?.nextState, context) - context.finish() } if (uiState.value.showCallPhoneDialog == true) { diff --git a/servicing/src/main/java/com/za/ui/servicing/verify/VerifyOrderVm.kt b/servicing/src/main/java/com/za/ui/servicing/verify/VerifyOrderVm.kt index a1f6b91..338e69f 100644 --- a/servicing/src/main/java/com/za/ui/servicing/verify/VerifyOrderVm.kt +++ b/servicing/src/main/java/com/za/ui/servicing/verify/VerifyOrderVm.kt @@ -59,8 +59,8 @@ class VerifyOrderVm : IServicingVm( val temp = UpdateTaskRequest( type = "VERIFY", taskId = GlobalData.currentOrder?.taskId, - userId = GlobalData.driverInfo?.userId, - vehicleId = GlobalData.vehicleInfo?.vehicleId, + userId = GlobalData.driverInfoBean?.userId, + vehicleId = GlobalData.driverInfoBean?.vehicleId, currentState = GlobalData.currentOrder?.taskState, offlineMode = 0, newCarCode = if (uiState.value.orderInfo?.verifyType == 5) { @@ -113,8 +113,8 @@ class VerifyOrderVm : IServicingVm( val taskRequest = UpdateTaskRequest( type = "VERIFY", taskId = GlobalData.currentOrder?.taskId, - userId = GlobalData.driverInfo?.userId, - vehicleId = GlobalData.vehicleInfo?.vehicleId, + userId = GlobalData.driverInfoBean?.userId, + vehicleId = GlobalData.driverInfoBean?.vehicleId, currentState = GlobalData.currentOrder?.taskState, offlineMode = 0, newCarCode = if (uiState.value.orderInfo?.verifyType == 5) { 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 90e44b5..86e753c 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 @@ -115,7 +115,6 @@ fun WaitToStartScreen(vm: WaitToStartVm = viewModel()) { if (uiState.value.goNextPage != null) { goNextPage(uiState.value.goNextPage?.nextState, context) - context.finish() } if (uiState.value.isGoNextPageDialog == true) { @@ -188,7 +187,7 @@ fun WaitToStartScreen(vm: WaitToStartVm = viewModel()) { Text( text = if (uiState.value.remainingDistance > 0) - "总里程: %.1fkm".format(uiState.value.remainingDistance / 1000f) + "距离救援地: %.1fkm".format(uiState.value.remainingDistance / 1000f) else "计算中...", color = Color(0xFFFF4D4F), 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 7e140e9..65f7c87 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 @@ -30,244 +30,211 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import java.text.SimpleDateFormat -import java.util.Locale import java.util.Calendar +import java.util.Locale class WaitToStartVm : 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.UpdateTask -> updateTask() - is Action.UpdateState -> updateState(action.uiState) - is Action.StartTimer -> startTimer() - is Action.UpdateTimer -> updateTimer() - } - } + override fun dispatch(action : Action) { + when (action) { + is Action.Init -> init() + is Action.UpdateTask -> updateTask() + is Action.UpdateState -> updateState(action.uiState) + is Action.StartTimer -> startTimer() + is Action.UpdateTimer -> updateTimer() + } + } - private fun updateTask() { - LoadingManager.showLoading() - ZdLocationManager.getSingleLocation(success = { - LoadingManager.hideLoading() - val taskRequest = UpdateTaskRequest( - type = "START", - taskId = getCurrentOrder()?.taskId, - userId = GlobalData.driverInfo?.userId, - vehicleId = GlobalData.vehicleInfo?.vehicleId, - currentState = getCurrentOrder()?.taskState, - offlineMode = 0, - operateTime = System.currentTimeMillis().toString(), - lat = it.latitude, - lng = it.longitude) - doUploadTask(request = taskRequest) - }, failed = { - LoadingManager.hideLoading() - ToastUtils.showShort(it) - }) - } + private fun updateTask() { + LoadingManager.showLoading() + ZdLocationManager.getSingleLocation(success = { + LoadingManager.hideLoading() + val taskRequest = UpdateTaskRequest(type = "START", + taskId = getCurrentOrder()?.taskId, + userId = GlobalData.driverInfoBean?.userId, + vehicleId = GlobalData.driverInfoBean?.vehicleId, + currentState = getCurrentOrder()?.taskState, + offlineMode = 0, + operateTime = System.currentTimeMillis().toString(), + lat = it.latitude, + lng = it.longitude) + doUploadTask(request = taskRequest) + }, failed = { + LoadingManager.hideLoading() + ToastUtils.showShort(it) + }) + } - private fun doUploadTask(request: UpdateTaskRequest) { - LoadingManager.showLoading() - CommonMethod.updateTask(request, success = { data -> - LoadingManager.hideLoading() - updateOrder(getCurrentOrder()?.copy(taskState = data?.nextState)) - updateState(uiState.value.copy(goNextPage = data, orderInfo = getCurrentOrder())) - }, failed = { msg, _ -> - LoadingManager.hideLoading() - ToastUtils.showShort(msg) - LogUtil.print("$tag doUploadTask", "状态更新失败==${request.toJson()} msg==$msg") - }) - } + private fun doUploadTask(request : UpdateTaskRequest) { + LoadingManager.showLoading() + CommonMethod.updateTask(request, success = { data -> + LoadingManager.hideLoading() + updateOrder(getCurrentOrder()?.copy(taskState = data?.nextState)) + updateState(uiState.value.copy(goNextPage = data, orderInfo = getCurrentOrder())) + }, failed = { msg, _ -> + LoadingManager.hideLoading() + ToastUtils.showShort(msg) + LogUtil.print("$tag doUploadTask", "状态更新失败==${request.toJson()} msg==$msg") + }) + } - private fun init() { - val order = getCurrentOrder() - updateState(uiState = uiState.value.copy(orderInfo = order)) - buildMarkers(order) - searchDrivingRoute(order) - dispatch(Action.StartTimer) - } + private fun init() { + val order = getCurrentOrder() + updateState(uiState = uiState.value.copy(orderInfo = order)) + buildMarkers(order) + searchDrivingRoute(order) + dispatch(Action.StartTimer) + } - private fun buildMarkers(orderInfo: OrderInfo?) { - val markers = arrayListOf() + private fun buildMarkers(orderInfo : OrderInfo?) { + val markers = arrayListOf() - // 添加救援地点标记 - if (orderInfo?.lat != null && orderInfo.lat != 0.0 && - orderInfo.lng != null && orderInfo.lng != 0.0 - ) { + // 添加救援地点标记 + if (orderInfo?.lat != null && orderInfo.lat != 0.0 && orderInfo.lng != null && orderInfo.lng != 0.0) { - val startMarker = MarkerOptions() - .position(LatLng(orderInfo.lat!!, orderInfo.lng!!)) - .title(orderInfo.address) - .snippet("救援地点") - .icon(BitmapDescriptorFactory.fromResource(R.mipmap.sv_rescuing_map)) - .anchor(0.5f, 0.5f) - .zIndex(2f) - .visible(true) + val startMarker = MarkerOptions().position(LatLng(orderInfo.lat !!, orderInfo.lng !!)) + .title(orderInfo.address).snippet("救援地点") + .icon(BitmapDescriptorFactory.fromResource(R.mipmap.sv_rescuing_map)) + .anchor(0.5f, 0.5f).zIndex(2f).visible(true) - markers.add(startMarker) - } + markers.add(startMarker) + } - // 添加目的地标记 - if (orderInfo?.distLat != null && orderInfo.distLat != 0.0 && - orderInfo.distLng != null && orderInfo.distLng != 0.0 - ) { + // 添加目的地标记 + if (orderInfo?.distLat != null && orderInfo.distLat != 0.0 && orderInfo.distLng != null && orderInfo.distLng != 0.0) { - 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) + 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) - markers.add(destMarker) - } + markers.add(destMarker) + } - updateState(uiState.value.copy(markers = markers)) - } + updateState(uiState.value.copy(markers = markers)) + } - private fun searchDrivingRoute(orderInfo: OrderInfo?) { - // 如果没有当前位置,则不进行路径规划 - if (GlobalData.currentLocation == null) return + private fun searchDrivingRoute(orderInfo : OrderInfo?) { // 如果没有当前位置,则不进行路径规划 + if (GlobalData.currentLocation == null) return - val startPoint = LatLonPoint( - GlobalData.currentLocation?.latitude ?: 0.0, - GlobalData.currentLocation?.longitude ?: 0.0 - ) + val startPoint = LatLonPoint(GlobalData.currentLocation?.latitude ?: 0.0, + GlobalData.currentLocation?.longitude ?: 0.0) - // 确定终点:如果有目的地,否则用救援地点 - val endPoint = when { - // 优先使用目的地 - orderInfo?.distLat != null && orderInfo.distLat != 0.0 && - orderInfo.distLng != null && orderInfo.distLng != 0.0 -> { - LatLonPoint(orderInfo.distLat!!, orderInfo.distLng!!) - } - // 其次使用救援地点 - orderInfo?.lat != null && orderInfo.lat != 0.0 && - orderInfo.lng != null && orderInfo.lng != 0.0 -> { - LatLonPoint(orderInfo.lat!!, orderInfo.lng!!) - } + // 获取救援地点坐标 + val rescuePoint = + if (orderInfo?.lat != null && orderInfo.lat != 0.0 && orderInfo.lng != null && orderInfo.lng != 0.0) { + LatLonPoint(orderInfo.lat !!, orderInfo.lng !!) + } else null - else -> null - } + // 如果没有救援地点,则不进行规划 + if (rescuePoint == null) { + LogUtil.print("searchDrivingRoute", "没有有效的终点") + return + } - if (endPoint == null) return + // 使用 Application Context + RouteSearch(GlobalData.application).apply { + setRouteSearchListener(object : RouteSearch.OnRouteSearchListener { + override fun onDriveRouteSearched(result : DriveRouteResult?, errorCode : Int) { + if (errorCode == 1000 && result != null && result.paths.isNotEmpty()) { + val path = result.paths[0] + val points = path.steps.flatMap { step -> + step.polyline.map { LatLng(it.latitude, it.longitude) } + } + updateState(uiState.value.copy(routePoints = points)) + } else { + LogUtil.print("searchDrivingRoute", "路径规划失败: errorCode=$errorCode") + } + } - val fromAndTo = RouteSearch.FromAndTo(startPoint, endPoint) - val query = RouteSearch.DriveRouteQuery(fromAndTo, RouteSearch.DrivingDefault, null, null, "") + override fun onBusRouteSearched(p0 : BusRouteResult?, p1 : Int) {} + override fun onWalkRouteSearched(p0 : WalkRouteResult?, p1 : Int) {} + override fun onRideRouteSearched(p0 : RideRouteResult?, p1 : Int) {} + }) - // 使用 Application Context - RouteSearch(GlobalData.application).apply { - setRouteSearchListener(object : RouteSearch.OnRouteSearchListener { - override fun onDriveRouteSearched(result: DriveRouteResult?, errorCode: Int) { - if (errorCode == 1000 && result != null && result.paths.isNotEmpty()) { - val path = result.paths[0] - val points = path.steps.flatMap { step -> - step.polyline.map { LatLng(it.latitude, it.longitude) } - } - updateState(uiState.value.copy(routePoints = points)) - } else { - LogUtil.print("searchDrivingRoute", "路径规划失败: errorCode=$errorCode") - } - } + val fromAndTo = RouteSearch.FromAndTo(startPoint, rescuePoint) + val query = + RouteSearch.DriveRouteQuery(fromAndTo, RouteSearch.DrivingDefault, null, null, "") + calculateDriveRouteAsyn(query) + } + } - override fun onBusRouteSearched(p0: BusRouteResult?, p1: Int) {} - override fun onWalkRouteSearched(p0: WalkRouteResult?, p1: Int) {} - override fun onRideRouteSearched(p0: RideRouteResult?, p1: Int) {} - }) - calculateDriveRouteAsyn(query) - } - } + private var timerJob : Job? = null - 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 { + val currentLocation = GlobalData.currentLocation ?: return Pair(0f, "") + val orderInfo = _uiState.value.orderInfo ?: return Pair(0f, "") - private fun calculateRemainingDistance(): Pair { - val currentLocation = GlobalData.currentLocation ?: return Pair(0f, "") - val orderInfo = _uiState.value.orderInfo ?: return Pair(0f, "") + // 计算到救援地点的距离 + val rescueDistance = if (orderInfo.lat != null && orderInfo.lng != null) { + AMapUtils.calculateLineDistance(LatLng(currentLocation.latitude, + currentLocation.longitude), LatLng(orderInfo.lat !!, orderInfo.lng !!)) + } else 0f - // 计算到救援地点的距离 - val rescueDistance = if (orderInfo.lat != null && orderInfo.lng != null) { - AMapUtils.calculateLineDistance( - LatLng(currentLocation.latitude, currentLocation.longitude), - LatLng(orderInfo.lat!!, orderInfo.lng!!) - ) - } else 0f + // 计算到目的地的距离 + val destDistance = if (orderInfo.distLat != null && orderInfo.distLng != null) { + AMapUtils.calculateLineDistance(LatLng(currentLocation.latitude, + currentLocation.longitude), LatLng(orderInfo.distLat !!, orderInfo.distLng !!)) + } else 0f - // 计算到目的地的距离 - val destDistance = if (orderInfo.distLat != null && orderInfo.distLng != null) { - AMapUtils.calculateLineDistance( - LatLng(currentLocation.latitude, currentLocation.longitude), - LatLng(orderInfo.distLat!!, orderInfo.distLng!!) - ) - } else 0f + // 取较短的距离 + val shortestDistance = minOf(rescueDistance.takeIf { it > 0f } ?: Float.MAX_VALUE, + destDistance.takeIf { it > 0f } ?: Float.MAX_VALUE) - // 取较短的距离 - val shortestDistance = minOf( - rescueDistance.takeIf { it > 0f } ?: Float.MAX_VALUE, - destDistance.takeIf { it > 0f } ?: Float.MAX_VALUE - ) + if (shortestDistance == Float.MAX_VALUE) { + return Pair(0f, "") + } - if (shortestDistance == Float.MAX_VALUE) { - return Pair(0f, "") - } + // 计算预计到达时间(假设平均速度40km/h) + val timeInSeconds = ((shortestDistance / 1000.0 * 60.0 / 40.0) * 60).toInt() + val calendar = Calendar.getInstance() + calendar.add(Calendar.SECOND, timeInSeconds) + val arrivalTime = SimpleDateFormat("HH:mm", Locale.getDefault()).format(calendar.time) - // 计算预计到达时间(假设平均速度40km/h) - val timeInSeconds = ((shortestDistance / 1000.0 * 60.0 / 40.0) * 60).toInt() - val calendar = Calendar.getInstance() - calendar.add(Calendar.SECOND, timeInSeconds) - val arrivalTime = SimpleDateFormat("HH:mm", Locale.getDefault()).format(calendar.time) + return Pair(shortestDistance, arrivalTime) + } - return Pair(shortestDistance, arrivalTime) - } + private fun updateTimer() { // 在这里处理倒计时更新逻辑 + } - private fun updateTimer() { - // 在这里处理倒计时更新逻辑 - } + override fun onCleared() { + super.onCleared() + timerJob?.cancel() + } - override fun onCleared() { - super.onCleared() - timerJob?.cancel() - } + sealed class Action { + data object Init : Action() + data object UpdateTask : Action() + data class UpdateState(val uiState : UiState) : Action() + data object StartTimer : Action() + data object UpdateTimer : Action() + } - sealed class Action { - data object Init : Action() - data object UpdateTask : Action() - data class UpdateState(val uiState: UiState) : Action() - data object StartTimer : Action() - data object UpdateTimer : Action() - } - - data class UiState( - val orderInfo: OrderInfo? = null, - val showCallPhoneDialog: Boolean? = false, - val markers: ArrayList? = null, - val goNextPage: UpdateTaskBean? = null, - val isGoNextPageDialog: Boolean? = null, - val routePoints: List? = null, - val remainingDistance: Float = 0f, - val estimatedArrivalTime: String = "" - ) + data class UiState(val orderInfo : OrderInfo? = null, + val showCallPhoneDialog : Boolean? = false, + val markers : ArrayList? = null, + val goNextPage : UpdateTaskBean? = null, + val isGoNextPageDialog : Boolean? = null, + val routePoints : List? = null, + val remainingDistance : Float = 0f, + val estimatedArrivalTime : String = "") } \ No newline at end of file