feat: 初始化项目结构和基本功能

- 创建项目根目录和主要子模块
- 添加基本的 Activity 和布局文件
- 实现简单的导航和电话拨打功能
- 添加相机和图像处理相关代码
- 创建网络请求和数据加密工具类
- 设置 AndroidManifest 文件和权限
This commit is contained in:
songzhiling
2025-04-11 11:52:07 +08:00
parent 74ce8fc526
commit 91305ab9d1
386 changed files with 36517 additions and 34 deletions

48
.gitignore vendored
View File

@ -1,35 +1,15 @@
# ---> Android
# Gradle files
.gradle/
build/
# Local configuration file (sdk path, etc)
local.properties
# Log/OS Files
*.log
# Android Studio generated files and folders
captures/
.externalNativeBuild/
.cxx/
*.apk
output.json
# IntelliJ
*.iml
.idea/
misc.xml
deploymentTargetDropDown.xml
render.experimental.xml
# Keystore files
*.jks
*.keystore
# Google Services (e.g. APIs or Firebase)
google-services.json
# Android Profiling
*.hprof
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties

3
.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

6
.idea/AndroidProjectSystem.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AndroidProjectSystem">
<option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
</component>
</project>

7
.idea/MarsCodeWorkspaceAppSettings.xml generated Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="com.codeverse.userSettings.MarscodeWorkspaceAppSettingsState">
<option name="ckgOperationStatus" value="SUCCESS" />
<option name="progress" value="0.6296296" />
</component>
</project>

6
.idea/compiler.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="21" />
</component>
</project>

10
.idea/deploymentTargetSelector.xml generated Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
</selectionStates>
</component>
</project>

20
.idea/gradle.xml generated Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
<option value="$PROJECT_DIR$/servicing" />
</set>
</option>
</GradleProjectSettings>
</option>
</component>
</project>

View File

@ -0,0 +1,61 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="ComposePreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="ComposePreviewMustBeTopLevelFunction" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="ComposePreviewNeedsComposableAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="ComposePreviewNotSupportedInUnitTestFiles" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="GlancePreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="GlancePreviewMustBeTopLevelFunction" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="GlancePreviewNeedsComposableAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="GlancePreviewNotSupportedInUnitTestFiles" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewAnnotationInFunctionWithParameters" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewApiLevelMustBeValid" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewDeviceShouldUseNewSpec" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewFontScaleMustBeGreaterThanZero" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewMultipleParameterProviders" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewParameterProviderOnFirstParameter" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewPickerAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
</profile>
</component>

6
.idea/kotlinc.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="KotlinJpsPluginSettings">
<option name="version" value="1.9.25" />
</component>
</project>

10
.idea/migrations.xml generated Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</component>
</project>

9
.idea/misc.xml generated Normal file
View File

@ -0,0 +1,9 @@
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

17
.idea/runConfigurations.xml generated Normal file
View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
<option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
<option value="com.intellij.execution.junit.PatternConfigurationProducer" />
<option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
<option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
<option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
</set>
</option>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

1
app/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/build

150
app/build.gradle Normal file
View File

@ -0,0 +1,150 @@
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.jetbrains.kotlin.android)
id 'com.google.devtools.ksp'
}
android {
namespace 'com.za.sdk.demo'
compileSdk 35
defaultConfig {
applicationId "com.za.sdk.demo"
minSdk 24
targetSdk 35
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
manifestPlaceholders = [
JPUSH_PKGNAME : "com.za.sdk.demo",
JPUSH_APPKEY : "a87e46d05e9f095a2b47a304", //JPush 上注册的包名对应的 Appkey.e6c51448340caba93fd418
JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可.
XIAOMI_APPID : "MI-2882303761518149120",
XIAOMI_APPKEY : "MI-5381814934120",//MI-小米的APPKEY
HUAWEI_APPID : "appid=100923923",//appid=华为的APPID"
OPPO_APPKEY : "OP-c8ce8eafcd3940ceb85c1ccbee8863c7",//OP-oppo的APPKEY
OPPO_APPID : "OP-30136992",//OP-oppo的APPID
OPPO_APPSECRET: "OP-25e2baa85b7946b1b365af515515c42d",//OP-oppo的APPSECRET
VIVO_APPKEY : "cfd443e2a1757cf537361588c988a12a",//vivo的APPKEY
VIVO_APPID : "105470845",//vivo的APPID
]
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = '11'
}
composeOptions {
kotlinCompilerExtensionVersion '1.5.15'
}
buildFeatures {
compose true
}
sourceSets {
main {
jniLibs.srcDirs = ["libs"]
}
}
}
dependencies {
implementation project(':servicing')
// implementation 'io.github.szl9:zd_servicing:1.0.1.5'
// implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
// implementation files('libs/zd_servicing-1.0.1.5.aar')
// implementation 'io.github.szl9:zd_servicing:1.0.1.9'
//
// implementation libs.androidx.core.ktx
// implementation libs.androidx.appcompat
// implementation libs.material
// implementation libs.androidx.lifecycle.viewmodel.compose
// implementation libs.androidx.lifecycle.runtime.ktx
// implementation libs.androidx.activity.compose
// implementation platform(libs.androidx.compose.bom)
// implementation libs.androidx.ui
// implementation libs.androidx.ui.graphics
// implementation libs.androidx.ui.tooling.preview
// implementation libs.androidx.material3
// implementation libs.androidx.work.runtime.ktx
// implementation libs.androidx.exifinterface
//
// testImplementation libs.junit
// androidTestImplementation libs.androidx.junit
// androidTestImplementation libs.androidx.espresso.core
// androidTestImplementation platform(libs.androidx.compose.bom)
// androidTestImplementation libs.androidx.ui.test.junit4
// debugImplementation libs.androidx.ui.tooling
// debugImplementation libs.androidx.ui.test.manifest
//
// implementation libs.coil.compose
// implementation libs.coil.gif
//
// implementation libs.permissionx
// implementation libs.utilcodex
//
// implementation libs.crashreport
//
// // 高德地图
// implementation libs.xdmap
// implementation libs.location
// implementation libs.search
//
// // JPush
// implementation libs.jpush
// implementation libs.jcore
// implementation libs.gson
//
// // 网络
// implementation libs.retrofit
// implementation libs.converter.gson
// implementation libs.adapter.rxjava3
// implementation libs.rxjava
// implementation libs.rxandroid
// implementation libs.logging.interceptor
// implementation libs.fastjson
//
// // 本地数据
// implementation libs.room.runtime
// annotationProcessor libs.room.compiler
// ksp libs.room.compiler
// implementation libs.mmkv
//
// // 7z
// implementation libs.xz
// implementation libs.commons.compress
//
// implementation libs.core
// implementation libs.tbssdk
//
// // CameraX
// implementation libs.androidx.camera.core
// implementation libs.androidx.camera.camera2
// implementation libs.androidx.camera.lifecycle
// implementation libs.androidx.camera.view
// implementation libs.androidx.camera.extensions
//
// implementation libs.glide
// annotationProcessor libs.compiler
//
// implementation libs.org.eclipse.paho.client.mqttv3
// implementation libs.org.eclipse.paho.android.service
}

21
app/proguard-rules.pro vendored Normal file
View File

@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@ -0,0 +1,23 @@
package com.za.sdk.demo
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() { // Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("com.za.sdk.demo", appContext.packageName)
}
}

View File

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:name=".MyApplication"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Zd_sdk_demo"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true"
android:theme="@style/Theme.Dealer">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ActionActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.Zd_sdk_demo">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- 定义你的URL Scheme -->
<data
android:host="app"
android:scheme="zd.assist" />
</intent-filter>
<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
</application>
</manifest>

View File

@ -0,0 +1,54 @@
package com.za.sdk.demo
import android.content.Intent
import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import com.za.base.view.CommonButton
import com.za.common.log.LogUtil
import com.za.sdk.demo.ui.theme.Zd_sdk_demoTheme
import com.za.ui.main.ServiceLauncherActivity
class ActionActivity : ComponentActivity() {
override fun onCreate(savedInstanceState : Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
Zd_sdk_demoTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
Box(modifier = Modifier
.fillMaxSize()
.padding(innerPadding),
contentAlignment = Alignment.Center) {
CommonButton(text = "跳转到服务页") {
val name = intent.data?.getQueryParameter("driverName")
val phone = intent.data?.getQueryParameter("driverPhone")
val taskCode = intent.data?.getQueryParameter("taskCode")
val vehicleName = intent.data?.getQueryParameter("rescueVehicle")
LogUtil.print("参数",
"name:$name,phone:$phone,taskCode:$taskCode,vehicleName:$vehicleName")
Log.e("ActionActivity",
"name:$name,phone:$phone,taskCode:$taskCode,vehicleName:$vehicleName")
val intent =
Intent(this@ActionActivity, ServiceLauncherActivity::class.java)
intent.putExtra("driverName", name)
intent.putExtra("driverPhone", phone)
intent.putExtra("taskCode", taskCode)
intent.putExtra("rescueVehicle", vehicleName)
startActivity(intent)
}
}
}
}
}
}
}

View File

@ -0,0 +1,42 @@
package com.za.sdk.demo
import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.core.net.toUri
import com.za.sdk.demo.ui.theme.Zd_sdk_demoTheme
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState : Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
Zd_sdk_demoTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
Box(modifier = Modifier
.fillMaxSize()
.clickable {
val uri =
"zd.assist://app?taskCode=ZD250407100237&driverName=宋志领&driverPhone=17630035658&rescueVehicle=沪88888".toUri()
val intent = Intent(Intent.ACTION_VIEW, uri)
startActivity(intent)
}
.padding(innerPadding), contentAlignment = Alignment.Center) {
Text("我是别的APP我要打开服务页")
}
}
}
}
}
}

View File

@ -0,0 +1,11 @@
package com.za.sdk.demo
import android.app.Application
import com.za.common.ZDManager
class MyApplication : Application(){
override fun onCreate() {
super.onCreate()
ZDManager.init(this)
}
}

View File

@ -0,0 +1,11 @@
package com.za.sdk.demo.ui.theme
import androidx.compose.ui.graphics.Color
val Purple80 = Color(0xFFD0BCFF)
val PurpleGrey80 = Color(0xFFCCC2DC)
val Pink80 = Color(0xFFEFB8C8)
val Purple40 = Color(0xFF6650a4)
val PurpleGrey40 = Color(0xFF625b71)
val Pink40 = Color(0xFF7D5260)

View File

@ -0,0 +1,44 @@
package com.za.sdk.demo.ui.theme
import android.app.Activity
import android.os.Build
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.dynamicDarkColorScheme
import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
private val DarkColorScheme =
darkColorScheme(primary = Purple80, secondary = PurpleGrey80, tertiary = Pink80)
private val LightColorScheme =
lightColorScheme(primary = Purple40, secondary = PurpleGrey40, tertiary = Pink40
/* Other default colors to override
background = Color(0xFFFFFBFE),
surface = Color(0xFFFFFBFE),
onPrimary = Color.White,
onSecondary = Color.White,
onTertiary = Color.White,
onBackground = Color(0xFF1C1B1F),
onSurface = Color(0xFF1C1B1F),
*/)
@Composable
fun Zd_sdk_demoTheme(darkTheme : Boolean = isSystemInDarkTheme(), // Dynamic color is available on Android 12+
dynamicColor : Boolean = true, content : @Composable () -> Unit) {
val colorScheme = when {
dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
val context = LocalContext.current
if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
}
darkTheme -> DarkColorScheme
else -> LightColorScheme
}
MaterialTheme(colorScheme = colorScheme, typography = Typography, content = content)
}

View File

@ -0,0 +1,29 @@
package com.za.sdk.demo.ui.theme
import androidx.compose.material3.Typography
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.sp
// Set of Material typography styles to start with
val Typography = Typography(bodyLarge = TextStyle(fontFamily = FontFamily.Default,
fontWeight = FontWeight.Normal,
fontSize = 16.sp,
lineHeight = 24.sp,
letterSpacing = 0.5.sp)/* Other default text styles to override
titleLarge = TextStyle(
fontFamily = FontFamily.Default,
fontWeight = FontWeight.Normal,
fontSize = 22.sp,
lineHeight = 28.sp,
letterSpacing = 0.sp
),
labelSmall = TextStyle(
fontFamily = FontFamily.Default,
fontWeight = FontWeight.Medium,
fontSize = 11.sp,
lineHeight = 16.sp,
letterSpacing = 0.5.sp
)
*/)

View File

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>

View File

@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 982 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
</resources>

View File

@ -0,0 +1,4 @@
<resources>
<string name="app_name">zd_sdk_demo</string>
<string name="title_activity_action">ActionActivity</string>
</resources>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.Zd_sdk_demo" parent="android:Theme.Material.Light.NoActionBar" />
</resources>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?><!--
Sample backup rules file; uncomment and customize as necessary.
See https://developer.android.com/guide/topics/data/autobackup
for details.
Note: This file is ignored for devices older than API 31
See https://developer.android.com/about/versions/12/backup-restore
-->
<full-backup-content>
<!--
<include domain="sharedpref" path="."/>
<exclude domain="sharedpref" path="device.xml"/>
-->
</full-backup-content>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?><!--
Sample data extraction rules file; uncomment and customize as necessary.
See https://developer.android.com/about/versions/12/backup-restore#xml-changes
for details.
-->
<data-extraction-rules>
<cloud-backup>
<!-- TODO: Use <include> and <exclude> to control what is backed up.
<include .../>
<exclude .../>
-->
</cloud-backup>
<!--
<device-transfer>
<include .../>
<exclude .../>
</device-transfer>
-->
</data-extraction-rules>

View File

@ -0,0 +1,17 @@
package com.za.sdk.demo
import org.junit.Test
import org.junit.Assert.*
/**
* Example local unit test, which will execute on the development machine (host).
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
class ExampleUnitTest {
@Test
fun addition_isCorrect() {
assertEquals(4, 2 + 2)
}
}

7
build.gradle Normal file
View File

@ -0,0 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
alias(libs.plugins.android.application) apply false
alias(libs.plugins.jetbrains.kotlin.android) apply false
alias(libs.plugins.android.library) apply false
id("com.google.devtools.ksp") version "1.9.0-1.0.13" apply false
}

23
gradle.properties Normal file
View File

@ -0,0 +1,23 @@
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. For more details, visit
# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official
# Enables namespacing of each library's R class so that its R class includes only the
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true

111
gradle/libs.versions.toml Normal file
View File

@ -0,0 +1,111 @@
[versions]
cameraCore = "1.4.1"
coilCompose = "2.6.0"
commonsCompress = "1.23.0"
compiler = "4.14.2"
converterGson = "2.9.0"
core = "3.5.3"
crashreport = "4.0.4"
faceDetection = "16.1.7"
fastjson = "1.2.69"
glide = "4.16.0"
gson = "2.11.0"
jcore = "3.3.2"
jpush = "4.8.1"
location = "5.6.1"
loggingInterceptor = "4.11.0"
mmkv = "2.0.2"
orgEclipsePahoAndroidService = "1.1.1"
orgEclipsePahoClientMqttv3 = "1.2.5"
permissionx = "1.8.0"
retrofit = "2.9.0"
roomRuntimeVersion = "2.6.1"
roomCompilerVersion = "2.6.1"
agp = "8.2.2"
kotlin = "1.9.25"
coreKtx = "1.15.0"
junit = "4.13.2"
junitVersion = "1.2.1"
espressoCore = "3.6.1"
lifecycleRuntimeKtx = "2.8.7"
activityCompose = "1.10.0"
composeBom = "2025.01.01"
material3="1.3.1"
appcompat = "1.7.0"
material = "1.12.0"
rxandroid = "3.0.2"
rxjava = "3.1.7"
search = "7.3.0"
tbssdk = "44286"
uiGraphics = "1.7.7"
uiTooling = "1.7.7"
uiToolingPreview = "1.7.7"
uiVersion = "1.7.7"
utilcodex = "1.31.1"
workRuntimeKtx = "2.10.0"
xdmap = "8.1.0"
activity = "1.10.0"
xz = "1.9"
exifinterface = "1.3.7"
[libraries]
adapter-rxjava3 = { module = "com.squareup.retrofit2:adapter-rxjava3", version.ref = "converterGson" }
androidx-camera-camera2 = { module = "androidx.camera:camera-camera2", version.ref = "cameraCore" }
androidx-camera-core = { module = "androidx.camera:camera-core", version.ref = "cameraCore" }
androidx-camera-extensions = { module = "androidx.camera:camera-extensions", version.ref = "cameraCore" }
androidx-camera-lifecycle = { module = "androidx.camera:camera-lifecycle", version.ref = "cameraCore" }
androidx-camera-view = { module = "androidx.camera:camera-view", version.ref = "cameraCore" }
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycleRuntimeKtx" }
androidx-material3 = { module = "androidx.compose.material3:material3", version.ref = "material3" }
androidx-ui = { module = "androidx.compose.ui:ui", version.ref = "uiVersion" }
androidx-ui-graphics = { module = "androidx.compose.ui:ui-graphics", version.ref = "uiGraphics" }
androidx-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4", version.ref = "uiGraphics" }
androidx-ui-test-manifest = { module = "androidx.compose.ui:ui-test-manifest", version.ref = "uiGraphics" }
androidx-ui-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "uiTooling" }
androidx-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview", version.ref = "uiToolingPreview" }
androidx-work-runtime-ktx = { module = "androidx.work:work-runtime-ktx", version.ref = "workRuntimeKtx" }
coil-compose = { module = "io.coil-kt:coil-compose", version.ref = "coilCompose" }
coil-gif = { module = "io.coil-kt:coil-gif", version.ref = "coilCompose" }
commons-compress = { module = "org.apache.commons:commons-compress", version.ref = "commonsCompress" }
compiler = { module = "com.github.bumptech.glide:compiler", version.ref = "compiler" }
converter-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "converterGson" }
core = { module = "com.google.zxing:core", version.ref = "core" }
crashreport = { module = "com.tencent.bugly:crashreport", version.ref = "crashreport" }
face-detection = { module = "com.google.mlkit:face-detection", version.ref = "faceDetection" }
fastjson = { module = "com.alibaba:fastjson", version.ref = "fastjson" }
glide = { module = "com.github.bumptech.glide:glide", version.ref = "glide" }
gson = { module = "com.google.code.gson:gson", version.ref = "gson" }
jcore = { module = "cn.jiguang.sdk:jcore", version.ref = "jcore" }
jpush = { module = "cn.jiguang.sdk:jpush", version.ref = "jpush" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" }
androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" }
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" }
location = { module = "com.amap.api:location", version.ref = "location" }
logging-interceptor = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "loggingInterceptor" }
mmkv = { module = "com.tencent:mmkv", version.ref = "mmkv" }
org-eclipse-paho-android-service = { module = "org.eclipse.paho:org.eclipse.paho.android.service", version.ref = "orgEclipsePahoAndroidService" }
org-eclipse-paho-client-mqttv3 = { module = "org.eclipse.paho:org.eclipse.paho.client.mqttv3", version.ref = "orgEclipsePahoClientMqttv3" }
permissionx = { module = "com.guolindev.permissionx:permissionx", version.ref = "permissionx" }
retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" }
room-compiler = { module = "androidx.room:room-compiler", version.ref = "roomCompilerVersion" }
room-runtime = { module = "androidx.room:room-runtime", version.ref = "roomRuntimeVersion" }
androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
rxandroid = { module = "io.reactivex.rxjava3:rxandroid", version.ref = "rxandroid" }
rxjava = { module = "io.reactivex.rxjava3:rxjava", version.ref = "rxjava" }
search = { module = "com.amap.api:search", version.ref = "search" }
tbssdk = { module = "com.tencent.tbs:tbssdk", version.ref = "tbssdk" }
utilcodex = { module = "com.blankj:utilcodex", version.ref = "utilcodex" }
xdmap = { module = "com.amap.api:3dmap", version.ref = "xdmap" }
androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" }
xz = { module = "org.tukaani:xz", version.ref = "xz" }
androidx-exifinterface = { group = "androidx.exifinterface", name = "exifinterface", version.ref = "exifinterface" }
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
android-library = { id = "com.android.library", version.ref = "agp" }
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }

BIN
gradle/wrapper/gradle-wrapper.jar vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,6 @@
#Mon Apr 07 09:26:24 CST 2025
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

185
gradlew vendored Normal file
View File

@ -0,0 +1,185 @@
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"

89
gradlew.bat vendored Normal file
View File

@ -0,0 +1,89 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

1
servicing/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/build

221
servicing/build.gradle Normal file
View File

@ -0,0 +1,221 @@
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.jetbrains.kotlin.android)
id 'com.google.devtools.ksp'
id 'maven-publish'
}
android {
namespace 'com.za.servicing'
compileSdk 35
defaultConfig {
minSdk 23
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
vectorDrawables {
useSupportLibrary true
}
manifestPlaceholders = [
JPUSH_PKGNAME : "${applicationId}",
JPUSH_APPKEY : "a87e46d05e9f095a2b47a304", //JPush 上注册的包名对应的 Appkey.e6c51448340caba93fd418
JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可.
XIAOMI_APPID : "MI-2882303761518149120",
XIAOMI_APPKEY : "MI-5381814934120",//MI-小米的APPKEY
HUAWEI_APPID : "appid=100923923",//appid=华为的APPID"
OPPO_APPKEY : "OP-c8ce8eafcd3940ceb85c1ccbee8863c7",//OP-oppo的APPKEY
OPPO_APPID : "OP-30136992",//OP-oppo的APPID
OPPO_APPSECRET: "OP-25e2baa85b7946b1b365af515515c42d",//OP-oppo的APPSECRET
VIVO_APPKEY : "cfd443e2a1757cf537361588c988a12a",//vivo的APPKEY
VIVO_APPID : "105470845",//vivo的APPID
]
}
buildTypes {
release {
// minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = '11'
}
buildFeatures {
compose true
buildConfig true // 生成 BuildConfig
resValues true // 允许资源值生成
}
composeOptions {
kotlinCompilerExtensionVersion '1.5.15'
}
packaging {
resources {
excludes += '/META-INF/{AL2.0,LGPL2.1}'
}
}
publishing {
singleVariant("release") {
withSourcesJar()
}
}
}
publishing {
publications {
release(MavenPublication) {
groupId = 'io.github.szl9'
artifactId = 'zd_servicing'
version = "1.0.1.9"
pom {
packaging = "aar"
name.set("zd_servicing")
description.set("zd_servicing: Library for Android Application")
url.set("https://github.com/szl9/4dbki6r4uv.git")
inceptionYear.set("2024")
licenses {
license {
name.set("MIT License")
url.set("https://opensource.org/licenses/MIT")
}
}
developers {
developer {
id.set("zd")
name.set("zd szl")
email.set("17630035658@163.com")
}
}
scm {
connection.set("scm:git@github.com:szl9/4dbki6r4uv.git")
developerConnection.set("scm:git@github.com:szl9/4dbki6r4uv.git")
url.set("https://github.com/szl9/4dbki6r4uv.git")
}
}
// 将 afterEvaluate 移到 publications 块内
afterEvaluate {
from components.release
// 将依赖项处理放在这里
pom.withXml {
def root = asNode()
def dependenciesNode = root.dependencies ? root.dependencies[0] : root.appendNode('dependencies')
configurations.api.allDependencies.each { dep ->
try {
if (dep.group != null && dep.name != null && dep.version != null) {
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', dep.group)
dependencyNode.appendNode('artifactId', dep.name)
dependencyNode.appendNode('version', dep.version)
dependencyNode.appendNode('scope', 'compile')
}
}
catch (Exception e) {
logger.warn("Failed to add dependency ${dep} to POM", e)
}
}
}
}
}
}
repositories {
maven {
name = 'zd_servicing'
url = layout.buildDirectory.dir("zd_servicing")
}
}
}
tasks.register('generateRepo', Zip) {
def publishTask = tasks.named('publishReleasePublicationToZd_servicingRepository')
from publishTask.map { it.getRepository().getUrl() }
into 'zd_servicing'
archiveFileName.set('zd_servicing.zip')
}
dependencies {
api libs.androidx.core.ktx
api libs.androidx.appcompat
api libs.material
api libs.androidx.lifecycle.viewmodel.compose
api libs.androidx.lifecycle.runtime.ktx
api libs.androidx.activity.compose
api platform(libs.androidx.compose.bom)
api libs.androidx.ui
api libs.androidx.ui.graphics
api libs.androidx.ui.tooling.preview
api libs.androidx.material3
api libs.androidx.work.runtime.ktx
api libs.androidx.exifinterface
testApi libs.junit
androidTestApi libs.androidx.junit
androidTestApi libs.androidx.espresso.core
androidTestApi platform(libs.androidx.compose.bom)
androidTestApi libs.androidx.ui.test.junit4
debugApi libs.androidx.ui.tooling
debugApi libs.androidx.ui.test.manifest
api libs.coil.compose
api libs.coil.gif
api libs.permissionx
api libs.utilcodex
api libs.crashreport
// 高德地图
api libs.xdmap
api libs.location
api libs.search
// // JPush
api libs.jpush
api libs.jcore
api libs.gson
// 网络
api libs.retrofit
api libs.converter.gson
api libs.adapter.rxjava3
api libs.rxjava
api libs.rxandroid
api libs.logging.interceptor
api libs.fastjson
// 本地数据
api libs.room.runtime
annotationProcessor libs.room.compiler
ksp libs.room.compiler
api libs.mmkv
// 7z
api libs.xz
api libs.commons.compress
api libs.core
api libs.tbssdk
// CameraX
api libs.androidx.camera.core
api libs.androidx.camera.camera2
api libs.androidx.camera.lifecycle
api libs.androidx.camera.view
api libs.androidx.camera.extensions
api libs.glide
annotationProcessor libs.compiler
api libs.org.eclipse.paho.client.mqttv3
api libs.org.eclipse.paho.android.service
}

View File

203
servicing/proguard-rules.pro vendored Normal file
View File

@ -0,0 +1,203 @@
# 保留行号用于调试
-keepattributes SourceFile,LineNumberTable
-renamesourcefileattribute SourceFile
# 保留基本属性
-keepattributes Signature
-keepattributes *Annotation*
-keepattributes Exceptions
-keepattributes InnerClasses
# 保留R文件
-keepclassmembers class **.R$* {
public static <fields>;
}
# 保留servicing模块中的所有model类
-keep class com.za.servicing.model.** { *; }
# 保留servicing模块中的所有接口
-keep interface com.za.servicing.** { *; }
# 保留servicing模块中的所有枚举
-keepclassmembers enum com.za.servicing.** { *; }
# 保留Parcelable实现类
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
# 保留Serializable实现类
-keepnames class * implements java.io.Serializable
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# 保留WebView相关
-keepclassmembers class * extends android.webkit.WebViewClient {
public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.WebViewClient {
public void *(android.webkit.WebView, java.lang.String);
}
# 保留native方法
-keepclasseswithmembernames class * {
native <methods>;
}
# 保留View的getter和setter
-keepclassmembers public class * extends android.view.View {
void set*(***); *** get*();
}
# Coil图片加载库
-keep class coil.** { *; }
-dontwarn coil.**
# PermissionX权限库
-keep class com.permissionx.guolindev.** { *; }
# 高德地图相关
-keep class com.amap.api.**{*;}
-keep class com.autonavi.**{*;}
-keep class com.loc.**{*;}
-dontwarn com.amap.api.**
-dontwarn com.autonavi.**
-dontwarn com.loc.**
# JPush相关
-dontoptimize
-dontpreverify
-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }
-dontwarn cn.jcore.**
-keep class cn.jcore.** { *; }
# Retrofit网络库
-keepattributes Signature
-keepattributes Exceptions
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepclasseswithmembers class * {
@retrofit2.http.* <methods>;
}
# OkHttp
-dontwarn okhttp3.**
-dontwarn okio.**
-keep class okhttp3.** { *; }
-keep class okio.** { *; }
# RxJava
-dontwarn io.reactivex.**
-keep class io.reactivex.** { *; }
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
long producerIndex;
long consumerIndex;
}
#blankJ
-dontwarn com.blankj.utilcode.**
-keepclassmembers class * {
@com.blankj.utilcode.util.BusUtils$Bus <methods>;
}
-keep public class * extends com.blankj.utilcode.util.ApiUtils$BaseApi
-keep,allowobfuscation @interface com.blankj.utilcode.util.ApiUtils$Api
-keep @com.blankj.utilcode.util.ApiUtils$Api class *
#mmkv
-renamesourcefileattribute SourceFile
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,EnclosingMethod
-keep public class * {
public protected *;
}
# Preserve all .class method names.
-keepclassmembernames class * {
java.lang.Class class$(java.lang.String);
java.lang.Class class$(java.lang.String, boolean);
}
# Preserve all native method names and the names of their classes.
-keepclasseswithmembernames class * {
native <methods>;
}
# Preserve the special static methods that are required in all enumeration
# classes.
-keepclassmembers class * extends java.lang.Enum {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# Gson
-keep class com.google.gson.** { *; }
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
# Kotlin相关
-keep class kotlin.** { *; }
-keep class kotlin.Metadata { *; }
-dontwarn kotlin.**
-keepclassmembers class **$WhenMappings {
<fields>;
}
-keepclassmembers class kotlin.Metadata {
public <methods>;
}
# Kotlin协程
-keepclassmembernames class kotlinx.** {
volatile <fields>;
}
-keepclassmembers class * {
@kotlin.coroutines.jvm.internal.DebugMetadata *;
@kotlin.coroutines.jvm.internal.SuspendLambda *;
}
-keep class kotlinx.coroutines.** { *; }
-dontwarn kotlinx.coroutines.**
# Kotlin反射
-keep class kotlin.reflect.** { *; }
-dontwarn kotlin.reflect.**
# 保留Kotlin数据类
-keepclassmembers class ** {
public ** component*();
public ** copy(...);
}
# 保留Kotlin数据类的toString/hashCode/equals方法
-keepclassmembers class ** {
public java.lang.String toString();
public int hashCode();
public boolean equals(java.lang.Object);
}
-dontwarn java.lang.invoke.StringConcatFactory

View File

@ -0,0 +1,24 @@
package com.za.servicing
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("com.za.servicing.test", appContext.packageName)
}
}

View File

@ -0,0 +1,249 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-sdk tools:overrideLibrary="androidx.camera.view,androidx.camera:camera-camera2,androidx.camera.camera2,androidx.camera.lifecycle,androidx.camera.core" />
<permission
android:name="${applicationId}.permission.JPUSH_MESSAGE"
android:protectionLevel="signature" /> <!-- 位置相关权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <!-- 存储相关权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <!-- 网络相关权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 蓝牙相关权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!-- 电话相关权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
<uses-permission
android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"
tools:ignore="ProtectedPermissions" /> <!-- 系统相关权限 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.REORDER_TASKS" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission
android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <!-- 多媒体相关权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.FLASHLIGHT" /> <!-- 硬件特性声明 -->
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false" />
<uses-feature
android:name="android.hardware.telephony"
android:required="false" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <!-- Intent queries for Android 11+ -->
<queries package="${applicationId}">
<intent>
<action android:name="android.media.action.IMAGE_CAPTURE" />
</intent>
<intent>
<action android:name="android.media.action.ACTION_VIDEO_CAPTURE" />
</intent>
</queries>
<queries>
<intent>
<action android:name="android.intent.action.OPEN_DOCUMENT" />
<data android:mimeType="image/*" />
</intent>
</queries>
<application>
<activity
android:name="com.za.ui.main.ServiceLauncherActivity"
android:exported="true"
android:theme="@style/Theme.Dealer">
</activity>
<activity
android:name="com.za.ui.main.ServicingMainActivity"
android:exported="false"
android:theme="@style/Theme.Dealer" />
<activity
android:name="com.za.ui.servicing.departure_photo.DeparturePhotoActivity"
android:exported="false"
android:theme="@style/Theme.Dealer" />
<activity
android:name="com.za.ui.servicing.order_confirm.input_money.InputMoneyActivity"
android:exported="false"
android:theme="@style/Theme.Dealer" />
<activity
android:name="com.za.ui.servicing.order_confirm.modify_money.ModifyMoneyActivity"
android:exported="false"
android:theme="@style/Theme.Dealer" />
<activity
android:name="com.za.ui.new_order.NewOrderActivity"
android:exported="false"
android:theme="@style/Theme.Dealer" />
<activity
android:name="com.za.ui.servicing.order_confirm.real_order_confirm.RealOrderConfirmActivity"
android:exported="false"
android:theme="@style/Theme.Dealer" />
<activity
android:name="com.za.ui.servicing.order_confirm.receive_money.ReceiveMoneyActivity"
android:exported="false"
android:theme="@style/Theme.Dealer" />
<activity
android:name="com.za.ui.map_search.MapSearchActivity"
android:exported="false" />
<service
android:name="com.za.ui.order_report.ReportFloatingManager"
android:enabled="true"
android:exported="false" />
<activity
android:name="com.za.ui.order_report.HistoryReportActivity"
android:exported="false"
android:screenOrientation="portrait" />
<activity
android:name="com.za.ui.order_report.OrderReportActivity"
android:exported="false"
android:screenOrientation="portrait" />
<activity
android:name="com.za.ui.h5.CommonH5Activity"
android:exported="false"
android:launchMode="singleInstance"
android:theme="@style/Theme.Dealer" />
<activity
android:name="com.za.ui.servicing.order_give_up.OrderGiveUpActivity"
android:exported="false"
android:theme="@style/Theme.Dealer" />
<activity
android:name="com.za.ui.servicing.in_servicing_setting.OrderRequirementsActivity"
android:exported="false"
android:theme="@style/Theme.Dealer" />
<activity
android:name="com.za.ui.servicing.order_confirm.OrderConfirmActivity"
android:exported="false"
android:theme="@style/Theme.Dealer" />
<activity
android:name="com.za.ui.servicing.destination_photo.DestinationPhotoActivity"
android:exported="false"
android:theme="@style/Theme.Dealer" />
<activity
android:name="com.za.ui.servicing.go_to_destination.GoToDestinationActivity"
android:exported="false"
android:theme="@style/Theme.Dealer" />
<activity
android:name="com.za.signature.GridPaintActivity"
android:exported="false" />
<activity
android:name="com.za.ui.servicing.operation.InOperationActivity"
android:exported="false"
android:label="@string/title_activity_in_operation"
android:theme="@style/Theme.Dealer" />
<activity
android:name="com.za.ui.camera.ZdCameraXActivity"
android:exported="false"
android:screenOrientation="portrait">
<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
<activity
android:name="com.za.ui.servicing.check_vehicle.CheckVehicleActivity"
android:exported="false"
android:theme="@style/Theme.Dealer" />
<activity
android:name="com.za.ui.servicing.verify.VerifyOrderActivity"
android:exported="false"
android:theme="@style/Theme.Dealer" />
<activity
android:name="com.za.ui.servicing.go_accident.GoAccidentSiteActivity"
android:exported="false"
android:theme="@style/Theme.Dealer" />
<activity
android:name="com.za.ui.servicing.wait_to_start.WaitToStartActivity"
android:exported="false"
android:theme="@style/Theme.Dealer" />
<service
android:name="cn.jpush.android.service.PushService"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="cn.jpush.android.intent.REGISTER" />
<action android:name="cn.jpush.android.intent.REPORT" />
<action android:name="cn.jpush.android.intent.PushService" />
<action android:name="cn.jpush.android.intent.PUSH_TIME" />
</intent-filter>
</service>
<receiver
android:name="com.za.service.jpush.JPushReceiver"
android:enabled="true"
android:exported="true"
tools:node="replace">
<intent-filter>
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_ACTION" />
<action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED_ACTION" />
<action android:name="cn.jpush.android.intent.CONNECTION" />
<action android:name="android.intent.action.USER_PRESENT" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
<category android:name="${applicationId}" />
</intent-filter>
<intent-filter android:priority="1000">
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />
<!-- Required 显示通知栏 -->
<category android:name="${applicationId}" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.USER_PRESENT" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
<!-- Optional -->
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
<receiver
android:name="com.za.service.jpush.MyJPushMessageReceiver"
android:exported="true">
<intent-filter>
<action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_ACTION" />
<action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED_ACTION" />
<action android:name="cn.jpush.android.intent.CONNECTION" />
<action android:name="android.intent.action.USER_PRESENT" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<category android:name="${applicationId}" />
</intent-filter>
</receiver>
</application>
</manifest>

Binary file not shown.

View File

@ -0,0 +1,98 @@
package com.za.base
import com.za.common.GlobalData
object AppConfig {
var isRelease = false
// API 相关地址
lateinit var BASE_URL: String // API 主地址
lateinit var IMG_BASE_URL: String // 图片服务器地址
lateinit var Resource_URL: String // 资源服务器地址
// H5 相关地址
lateinit var TRAIN_URL: String // 培训文档地址
lateinit var DOCMENT_URL: String // 中道资料地址
/**
* 正式环境配置
*/
fun release() {
isRelease = true
// API 配置
BASE_URL = "https://api.sinoassist.com"
IMG_BASE_URL = "https://api.sinoassist.com"
Resource_URL = "https://www.sinoassist.com/res"
// H5 配置
TRAIN_URL = "https://www.sinoassist.com/h5/supplier/dispatch/diverTrainDocment"
DOCMENT_URL = "https://www.sinoassist.com/h5/supplier/dispatch/docmentList"
}
/**
* 审核环境配置
*/
fun review() {
isRelease = true
// API 配置
BASE_URL = "http://interface.review.sino-assist.com"
IMG_BASE_URL = "http://interface.review.sino-assist.com"
Resource_URL = "https://www.sinoassist.com/res"
}
/**
* CRM1 环境配置
*/
fun crm1() {
isRelease = false
// API 配置
BASE_URL = "https://api1.sino-assist.com"
IMG_BASE_URL = "https://api1.sino-assist.com"
Resource_URL = "https://crm1.sino-assist.com/res"
// H5 配置
TRAIN_URL = "https://crm1.sino-assist.com/h5/supplier/dispatch/diverTrainDocment"
DOCMENT_URL = "https://crm1.sino-assist.com/h5/supplier/dispatch/docmentList"
}
/**
* CRM2 环境配置
*/
fun crm2() {
isRelease = false
// API 配置
BASE_URL = "https://api2.sino-assist.com"
IMG_BASE_URL = "https://api2.sino-assist.com"
Resource_URL = "https://crm2.sino-assist.com/res"
}
/**
* 获取培训文档完整地址
* @param driverId 司机ID
* @param keyword 关键字
* @return 完整的培训文档URL
*/
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.driverInfo?.userId}&keyword=$keyWord"
}
/**
* 获取中道资料完整地址
* @param driverId 司机ID
* @param keyword 关键字
* @return 完整的中道资料URL
*/
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.driverInfo?.userId}&keyword=$keyWord"
}
}

View File

@ -0,0 +1,63 @@
package com.za.base
import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.runtime.Composable
import com.tencent.smtt.sdk.QbSdk
import com.za.base.BaseVm.Companion.showTipDialog
import com.za.base.theme.DealerTheme
import com.za.base.view.CommonDialog
import com.za.base.view.LoadingManager
import com.za.common.log.LogUtil
abstract class BaseActivity : AppCompatActivity() {
protected val TAG by lazy { javaClass.simpleName }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
DealerTheme {
ContentView()
if (LoadingManager.showLoading.value) {
LoadingManager.LoadingView()
}
if (showTipDialog.value != null) {
CommonDialog(message = showTipDialog.value
?: "",
title = "提示",
confirmText = "我已了解",
confirm = { BaseVm.hideTipDialog() },
cancel = { BaseVm.hideTipDialog() },
dismiss = { BaseVm.hideTipDialog() },
cancelEnable = true)
}
}
}
QbSdk.initX5Environment(this.application, object : QbSdk.PreInitCallback {
override fun onCoreInitFinished() {
// 内核初始化完成,可能为系统内核,也可能为系统内核
LogUtil.print("initX5Environment ", "finish")
}
/**
* 预初始化结束
* 由于X5内核体积较大需要依赖网络动态下发所以当内核不存在的时候默认会回调false此时将会使用系统内核代替
* @param isX5 是否使用X5内核
*/
override fun onViewInitFinished(isX5: Boolean) {
LogUtil.print("onViewInitFinished ", "isX5=$isX5")
}
})
}
@Composable
abstract fun ContentView()
}

View File

@ -0,0 +1,27 @@
package com.za.base
import androidx.compose.runtime.mutableStateOf
import androidx.lifecycle.ViewModel
abstract class BaseVm<T, U> : ViewModel() {
val tag: String = javaClass.simpleName
abstract fun updateState(uiState: U)
abstract fun dispatch(action: T)
companion object {
val showTipDialog = mutableStateOf<String?>(null)//提示框
fun showTipDialog(msg: String) {
showTipDialog.value = msg
}
fun hideTipDialog() {
showTipDialog.value = null
}
}
}
sealed class LoadState {
data object Init : LoadState()
data object Success : LoadState()
data object Failed : LoadState()
}

View File

@ -0,0 +1,45 @@
package com.za.base
object Const {
const val Image_Max_length = 1024 * 400L
const val faceFileName = "zd_com.dear"
const val NetWorkException = 999
const val PhotoNormalPath =
"http://file-gk.sinoassist.com:38888/group1/M00/98/94/wKgDd2Uib0OAN0glAAAMOeWcU94810.png?date=2023-10-08"
const val DoubleClickTime = 3000
const val driverSighName : String = "driver_sign.jpg"
//通用的照片水印模板 code
const val NormalWaterMarker = "-1"
const val CHILD_COMPANY = 1 //子公司
const val SMALL_REPAIR = 1 // 小修
const val TUO_CHE = 2
object CarState {
const val FREE = 0 //空闲
const val BUSY = 1 //忙碌
const val ZHI_MANG = 2 //置忙
const val REPAIRING = 8 //维修中
}
object PhotoType {
const val InServicing = 1 //服务中照片
const val HistoryOrder = 2 //历史中照片
const val ChangeBattery = 3 //更换电瓶照片
const val NormalImage = 4 //普通的照片处理
}
object InServiceSettingType {
const val ON_SITE_PHOTO = 0 //现场照片
const val ORDER_REQUIREMENTS = 1 //案件要求
const val ORDER_DETAIL = 2 //案件详情
const val ORDER_GIVE_UP = 3 //订单放弃
}
}

View File

@ -0,0 +1,123 @@
package com.za.base
import com.za.bean.db.ele.EleWorkOrderBean
import com.za.bean.db.order.OrderInfo
import com.za.bean.db.order.PhotoTemplateInfo
import com.za.common.GlobalData
import com.za.common.log.LogUtil
import com.za.ext.getTaskNode
import com.za.ext.toJson
import com.za.net.CommonMethod
import com.za.offline.OfflineManager
import com.za.offline.OfflineUpdateTaskBean
import com.za.room.RoomHelper
abstract class IServicingVm<T, U> : BaseVm<T, U>() {
fun getCurrentOrder() : OrderInfo? =
GlobalData.currentOrder ?: RoomHelper.db?.orderDao()?.getCurrentOrder()
fun updateOrder(orderInfo : OrderInfo?) {
orderInfo?.let { order ->
if (order.isCurrent == true) {
GlobalData.currentOrder = order
}
RoomHelper.db?.orderDao()?.update(order)
LogUtil.print("$tag updateOrder", order.toJson() ?: "")
} ?: LogUtil.print("$tag updateOrder", "order is null")
}
// 使用 Flow 重写获取照片模板的方法
//当前订单的照片模版
fun getCurrentPhotoTemplate(success : (List<PhotoTemplateInfo>?) -> Unit,
failure : (String?) -> Unit = {}) {
val photoTemplateList = RoomHelper.db?.photoTemplateDao()
?.getOrderPhotoTemplateFromTaskNode(getCurrentOrder()?.getTaskNode() ?: 0,
getCurrentOrder()?.userOrderId ?: 0)
if (photoTemplateList.isNullOrEmpty()) {
CommonMethod.fetchPhotoTemplate(GlobalData.currentOrder, success = {
val data = RoomHelper.db?.photoTemplateDao()?.getOrderPhotoTemplateFromTaskNode(
getCurrentOrder()?.getTaskNode() ?: 0,
getCurrentOrder()?.userOrderId ?: 0)
success(data)
}, failed = {
failure(it)
})
} else {
success(photoTemplateList)
}
}
// 使用 Flow 重写获取照片模板的方法
//获取出发前照片模版
fun getDeparturePhotoTemplate(success : (List<PhotoTemplateInfo>?) -> Unit,
failure : (String?) -> Unit = {}) {
val photoTemplateList = RoomHelper.db?.photoTemplateDao()
?.getOrderPhotoTemplateFromTaskNode(10100, getCurrentOrder()?.userOrderId ?: 0)
if (photoTemplateList.isNullOrEmpty()) {
CommonMethod.fetchPhotoTemplate(GlobalData.currentOrder, success = {
val data = RoomHelper.db?.photoTemplateDao()
?.getOrderPhotoTemplateFromTaskNode(10100, getCurrentOrder()?.userOrderId ?: 0)
success(data)
}, failed = {
failure(it)
})
} else {
success(photoTemplateList)
}
}
fun checkIsGoDeparturePhoto() : Boolean {
val list = RoomHelper.db?.photoTemplateDao()
?.getOrderPhotoTemplateFromTaskNode(10100, getCurrentOrder()?.userOrderId ?: 0)
return ! list.isNullOrEmpty()
}
fun updateCurrentEleWorkOrder(eleWorkOrderBean : EleWorkOrderBean) {
RoomHelper.db?.eleWorkOrderDao()?.update(eleWorkOrderBean)
getCurrentOrder()?.let { order ->
val updatedOrder = order.copy(electronOrderState = eleWorkOrderBean.orderWorkStatus,
taskSuccessStatus = if (eleWorkOrderBean.isSuccess == 1) 0 else 1)
updateOrder(updatedOrder)
}
LogUtil.print("$tag updateCurrentEleWorkOrder", eleWorkOrderBean.toJson() ?: "")
}
fun getCurrentOrderOfflineTask() : List<OfflineUpdateTaskBean>? {
return getCurrentOrder()?.taskId?.let { taskId ->
RoomHelper.db?.offlineTaskDao()?.getOfflineTaskFromTaskId(taskId)
}
}
fun clearCurrentOrderOfflineTask() {
getCurrentOrder()?.taskId?.let { taskId ->
RoomHelper.db?.offlineTaskDao()?.deleteOfflineTaskFromTaskId(taskId)
LogUtil.print("$tag clearCurrentOrderOfflineTask", "taskId==$taskId")
}
}
fun getCurrentOrderEleWorkOrder() : EleWorkOrderBean? {
return RoomHelper.db?.eleWorkOrderDao()?.getEleWorkOrder(getCurrentOrder()?.taskId ?: 0)
}
fun insertOfflineTask(offlineUpdateTaskBean : OfflineUpdateTaskBean) {
RoomHelper.db?.offlineTaskDao()?.let { offlineDao ->
val primaryId = offlineUpdateTaskBean.primaryId ?: 0
val existingTask = offlineDao.getOfflineTaskFromPrimaryId(primaryId)
if (existingTask != null) {
offlineDao.update(offlineUpdateTaskBean)
} else {
offlineDao.insertOfflineTask(offlineUpdateTaskBean)
}
offlineUpdateTaskBean.taskId?.let { taskId ->
OfflineManager.start(taskId)
}
LogUtil.print("$tag insertOfflineTask", offlineUpdateTaskBean.toJson() ?: "")
}
}
}

View File

@ -0,0 +1,37 @@
package com.za.base.theme
import androidx.compose.ui.graphics.Color
val Purple80 = Color(0xFFD0BCFF)
val PurpleGrey80 = Color(0xFFCCC2DC)
val Pink80 = Color(0xFFEFB8C8)
val Purple40 = Color(0xFF6650a4)
val PurpleGrey40 = Color(0xFF625b71)
val Pink40 = Color(0xFF7D5260)
val bgColor = Color(0xFFF4F5F7)
val MainBottomSelectColor = Color(0xFF3D4B7C)
val MainBottomUnSelectColor = Color(0xFFA9AEBD)
//标题颜色
val headBgColor = Color(0xFF3D4B7C)
//标题颜色
val headTitleColor = Color(0xB3FFFFFF)
//按钮背景颜色
val buttonBgColor = Color(0xFF3D4B7C)
val white5 = Color(0x0DFFFFFF)
val white95 = Color(0xF2FFFFFF)
val white80 = Color(0xCCFFFFFF)
val black5 = Color(0x0D000000)
val black10 = Color(0x1A000000)
val black20 = Color(0x33000000)
val black30 = Color(0x4D000000)
val black50 = Color(0x80000000)
val black65 = Color(0xA6000000)
val black90 = Color(0xE6000000)

View File

@ -0,0 +1,7 @@
package com.za.base.theme
import androidx.compose.ui.unit.dp
import com.blankj.utilcode.util.BarUtils
import com.blankj.utilcode.util.ConvertUtils
val headPadding = ConvertUtils.px2dp(BarUtils.getStatusBarHeight().toFloat()/2).dp

View File

@ -0,0 +1,80 @@
package com.za.base.theme
import android.app.Activity
import android.view.ViewGroup
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material.ripple.RippleAlpha
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.LocalRippleConfiguration
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ProvideTextStyle
import androidx.compose.material3.RippleConfiguration
import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.SideEffect
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalView
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updateLayoutParams
private val LightColorScheme = lightColorScheme(
primary = Purple40,
secondary = PurpleGrey40,
tertiary = Pink40,
background = bgColor,
onBackground = bgColor,
)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun DealerTheme(
darkTheme: Boolean = isSystemInDarkTheme(),
content: @Composable () -> Unit
) {
val colorScheme = when {
darkTheme -> LightColorScheme
else -> LightColorScheme
}
val view = LocalView.current
if (!view.isInEditMode) {
SideEffect {
val window = (view.context as Activity).window
window.statusBarColor = Color.Transparent.toArgb()
WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = !darkTheme
WindowCompat.setDecorFitsSystemWindows(window, false)
ViewCompat.setOnApplyWindowInsetsListener(window.decorView.findViewById(android.R.id.content)) { view, windowInsets ->
val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
view as ViewGroup
view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
leftMargin = insets.left
bottomMargin = insets.bottom
rightMargin = insets.right
topMargin = 0
}
WindowInsetsCompat.CONSUMED
}
}
}
MaterialTheme(colorScheme = colorScheme) {
CompositionLocalProvider(LocalRippleConfiguration provides RippleConfiguration(rippleAlpha = RippleAlpha(0f, 0f, 0f, 0f))) {
ProvideTextStyle(value = MaterialTheme.typography.bodyLarge, content = content)
}
}
}
//object NoRippleTheme : RippleTheme {
//
// @Composable
// override fun defaultColor(): Color {
// return Color.Unspecified
// }
//
// @Composable
// override fun rippleAlpha(): RippleAlpha {
// return RippleAlpha(0f, 0f, 0f, 0f)
// }
//}

View File

@ -0,0 +1,33 @@
package com.za.base.theme
import androidx.compose.material3.Typography
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.sp
// Set of Material typography styles to start with
val Typography = Typography(
bodyLarge = TextStyle(
fontFamily = FontFamily.Default,
fontWeight = FontWeight.Normal,
fontSize = 16.sp,
lineHeight = 24.sp,
letterSpacing = 0.5.sp
)
/* Other default text styles to override
titleLarge = TextStyle(
fontFamily = FontFamily.Default,
fontWeight = FontWeight.Normal,
fontSize = 22.sp,
lineHeight = 28.sp,
letterSpacing = 0.sp
),
labelSmall = TextStyle(
fontFamily = FontFamily.Default,
fontWeight = FontWeight.Medium,
fontSize = 11.sp,
lineHeight = 16.sp,
letterSpacing = 0.5.sp
)
*/
)

View File

@ -0,0 +1,33 @@
package com.za.base.view
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.za.base.theme.buttonBgColor
import com.za.base.theme.headBgColor
import com.za.ext.noDoubleClick
@Composable
fun CommonButton(text: String, onClick: () -> Unit) {
Box(modifier = Modifier
.fillMaxWidth()
.noDoubleClick { onClick() }
.padding(horizontal = 60.dp, vertical = 10.dp)
.background(color = buttonBgColor, shape = RoundedCornerShape(4.dp))
.padding(vertical = 12.dp), contentAlignment = Alignment.Center) {
Text(text = text, color = Color.White,
fontSize = 15.sp,
fontWeight = FontWeight.Medium)
}
}

View File

@ -0,0 +1,220 @@
package com.za.base.view
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import coil.compose.AsyncImage
import com.za.base.theme.black90
import com.za.common.util.MapUtil
import com.za.servicing.R
@Composable
fun CommonDialog(
title: String? = null,
confirmText: String = "确定",
confirm: () -> Unit,
content: @Composable () -> Unit = {},
message: String? = null,
cancelText: String? = "取消",
cancelEnable: Boolean = true,
cancel: () -> Unit = {},
dismiss: () -> Unit
) {
Dialog(onDismissRequest = { dismiss() },
properties = DialogProperties(
dismissOnBackPress = cancelEnable,
dismissOnClickOutside = cancelEnable)) {
Box(modifier = Modifier
.background(color = Color.White, shape = RoundedCornerShape(13.dp))) {
Spacer(modifier = Modifier
.fillMaxWidth()
.height(105.dp)
.background(brush = Brush.verticalGradient(colors = arrayListOf(Color(0xFFDAE8FF),
Color(0x00DAE8FF))),
shape = RoundedCornerShape(topStart = 13.dp, topEnd = 13.dp)))
Column(modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 30.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center) {
Spacer(modifier = Modifier.height(35.dp))
Text(text = "$title", fontSize = 16.sp, fontWeight = FontWeight.Medium, color = Color(0xFF2A4054))
Spacer(modifier = Modifier.height(16.dp))
if (message == null) {
content()
} else {
Text(text = message, fontSize = 14.sp, color = Color(0xFF536475))
}
Spacer(modifier = Modifier.height(24.dp))
Box(modifier = Modifier
.width(202.dp)
.clickable { confirm() }
.background(color = Color(0xFF3A58B1), shape = RoundedCornerShape(23.dp))
.padding(vertical = 12.dp), contentAlignment = Alignment.Center) {
Text(text = confirmText, color = Color.White, fontSize = 15.sp, fontWeight = FontWeight.Medium)
}
Spacer(modifier = Modifier.height(20.dp))
if (!cancelText.isNullOrBlank() && cancelEnable) {
Box(modifier = Modifier
.fillMaxWidth()
.clickable { cancel() }, contentAlignment = Alignment.Center) {
Text(text = cancelText, fontSize = 15.sp, fontWeight = FontWeight.Medium, color = black90)
}
}
Spacer(modifier = Modifier.height(10.dp))
}
}
}
}
@Composable
fun ReTakePhotoDialog(
title: String? = null,
confirm: () -> Unit,
againSubmit: () -> Unit,
path: String? = null,
showAgain: Boolean = false,
cancel: () -> Unit = {},
dismiss: () -> Unit
) {
Dialog(onDismissRequest = { dismiss() },
properties = DialogProperties(dismissOnBackPress = true, dismissOnClickOutside = true)) {
Box(modifier = Modifier
.background(color = Color.White, shape = RoundedCornerShape(13.dp))) {
Spacer(modifier = Modifier
.fillMaxWidth()
.height(105.dp)
.background(brush = Brush.verticalGradient(colors = arrayListOf(Color(0xFFDAE8FF),
Color(0x00DAE8FF))),
shape = RoundedCornerShape(topStart = 13.dp, topEnd = 13.dp)))
Column(modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 30.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center) {
Spacer(modifier = Modifier.height(35.dp))
Text(text = "$title", fontSize = 16.sp, fontWeight = FontWeight.Medium, color = Color(0xFF2A4054))
Spacer(modifier = Modifier.height(16.dp))
Box(modifier = Modifier
.fillMaxWidth()
.height(300.dp), contentAlignment = Alignment.Center) {
AsyncImage(model = path,
contentDescription = "",
modifier = Modifier.fillMaxSize(),
contentScale = ContentScale.FillWidth)
}
Spacer(modifier = Modifier.height(24.dp))
Box(modifier = Modifier
.width(202.dp)
.clickable { confirm() }
.background(color = Color(0xFF3A58B1), shape = RoundedCornerShape(23.dp))
.padding(vertical = 12.dp), contentAlignment = Alignment.Center) {
Text(text = "重拍", color = Color.White, fontSize = 15.sp, fontWeight = FontWeight.Medium)
}
if (showAgain) {
Spacer(modifier = Modifier.height(20.dp))
Box(modifier = Modifier
.width(202.dp)
.clickable { againSubmit() }
.background(color = Color.Red, shape = RoundedCornerShape(23.dp))
.padding(vertical = 12.dp), contentAlignment = Alignment.Center) {
Text(text = "再次上传", color = Color.White, fontSize = 15.sp, fontWeight = FontWeight.Medium)
}
}
Spacer(modifier = Modifier.height(20.dp))
Box(modifier = Modifier
.fillMaxWidth()
.clickable { cancel() }, contentAlignment = Alignment.Center) {
Text(text = "取消", fontSize = 15.sp, fontWeight = FontWeight.Medium, color = black90)
}
Spacer(modifier = Modifier.height(10.dp))
}
}
}
}
@Composable
fun ChoiceMapDialog(dismiss: () -> Unit,
lat: Double?,
lng: Double?,
address: String?) {
val context = LocalContext.current
Dialog(onDismissRequest = { dismiss() }) {
Row(modifier = Modifier
.fillMaxWidth()
.height(180.dp)
.background(color = Color.White, shape = RoundedCornerShape(8.dp))
.padding(10.dp), verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceAround) {
if (MapUtil.isGdMapInstalled(context)) {
Column(modifier = Modifier.clickable {
MapUtil.startNavigationGd(context, lat = lat, lng = lng, address = address)
dismiss()
}) {
AsyncImage(model = R.drawable.sv_amap_icon, contentDescription = "", modifier = Modifier.size(60.dp))
Spacer(modifier = Modifier.height(5.dp))
Text(text = "高德地图", color = Color.Black, fontWeight = FontWeight.Medium, fontSize = 14.sp)
}
}
if (MapUtil.isBaiduMapInstalled(context)) {
Column(modifier = Modifier.clickable {
MapUtil.startNavigationBd(context, lat = lat, lng = lng, address = address)
dismiss()
}) {
AsyncImage(model = R.drawable.sv_baidu_icon, contentDescription = "", modifier = Modifier.size(60.dp))
Spacer(modifier = Modifier.height(5.dp))
Text(text = "百度地图", color = Color.Black, fontWeight = FontWeight.Medium, fontSize = 14.sp)
}
}
if (MapUtil.isTencentInstalled(context)) {
Column(modifier = Modifier.clickable {
MapUtil.startNavigationTencent(context, lat = lat, lng = lng, address = address)
dismiss()
}) {
AsyncImage(model = R.drawable.sv_tencent_icon, contentDescription = "", modifier = Modifier.size(60.dp))
Spacer(modifier = Modifier.height(5.dp))
Text(text = "腾讯地图", color = Color.Black, fontWeight = FontWeight.Medium, fontSize = 14.sp)
}
}
}
}
}

View File

@ -0,0 +1,90 @@
package com.za.base.view
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.size
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import coil.compose.AsyncImage
import com.za.servicing.R
@Composable
fun EmptyView(
modifier: Modifier = Modifier,
message: String = "暂无数据",
imageSize: Pair<Int, Int> = Pair(118, 143),
imageRes: Int = R.drawable.sv_emty_data
) {
Column(
modifier = modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
AsyncImage(
model = imageRes,
contentDescription = message,
modifier = Modifier.size(imageSize.first.dp, imageSize.second.dp)
)
Spacer(modifier = Modifier.height(12.dp))
Text(
text = message,
color = Color.Gray,
fontSize = 14.sp,
textAlign = TextAlign.Center
)
}
}
@Composable
fun LoadError(
modifier: Modifier = Modifier,
message: String = "加载出错",
imageSize: Pair<Int, Int> = Pair(118, 143),
onRetry: (() -> Unit)? = null
) {
Column(
modifier = modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
AsyncImage(
model = R.drawable.sv_load_error,
contentDescription = message,
modifier = Modifier.size(imageSize.first.dp, imageSize.second.dp)
)
Spacer(modifier = Modifier.height(12.dp))
Text(
text = message,
color = Color.Gray,
fontSize = 14.sp,
textAlign = TextAlign.Center
)
if (onRetry != null) {
Spacer(modifier = Modifier.height(16.dp))
Text(
text = "点击重试",
color = Color(0xFF1BA8F7),
fontSize = 14.sp,
modifier = Modifier
.align(Alignment.CenterHorizontally)
.clickable { onRetry() }
)
}
}
}

View File

@ -0,0 +1,54 @@
package com.za.base.view
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.systemBarsPadding
import androidx.compose.material3.CenterAlignedTopAppBar
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import coil.compose.AsyncImage
import com.za.base.theme.headBgColor
import com.za.base.theme.headPadding
import com.za.servicing.R
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun HeadView(title: String, onBack: () -> Unit = {}, isCanBack: Boolean = true, action: @Composable () -> Unit = {}) {
CenterAlignedTopAppBar(modifier = Modifier
.fillMaxWidth()
.background(color = headBgColor)
.systemBarsPadding()
.padding(top = 20.dp),
colors = TopAppBarDefaults.centerAlignedTopAppBarColors().copy(containerColor = headBgColor, titleContentColor = Color.White),
title = { Text(text = title, fontSize = 15.sp, fontWeight = FontWeight.Medium) },
navigationIcon = {
if (isCanBack) {
AsyncImage(model = R.drawable.sv_back, contentDescription = "", modifier = Modifier
.size(40.dp)
.clickable { onBack() }
.padding(10.dp))
}
}, actions = { action() })
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun HeadViewNotBack(title: String) {
CenterAlignedTopAppBar(modifier = Modifier
.fillMaxWidth()
.background(color = headBgColor)
.padding(top = headPadding),
colors = TopAppBarDefaults.centerAlignedTopAppBarColors().copy(containerColor = headBgColor, titleContentColor = Color.White),
title = { Text(text = title, fontSize = 15.sp, fontWeight = FontWeight.Medium) },
navigationIcon = {})
}

View File

@ -0,0 +1,46 @@
package com.za.base.view
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.size
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import coil.decode.GifDecoder
import coil.request.ImageRequest
import com.za.servicing.R
object LoadingManager {
val showLoading = mutableStateOf(false)
fun showLoading() {
showLoading.value = true
}
fun hideLoading() {
showLoading.value = false
}
@Composable
fun LoadingView() {
Box(contentAlignment = Alignment.Center, modifier = Modifier.fillMaxSize()) {
AsyncImage(model = ImageRequest.Builder(LocalContext.current)
.data(R.drawable.gif_loading)
.decoderFactory(GifDecoder.Factory())
.build(), contentDescription = "加载中", modifier = Modifier
.size(70.dp)
.align(Alignment.Center))
}
}
}
open class LoadingState {
data object Loading : LoadingState()
data object LoadingFailed : LoadingState()
data object LoadingSuccess : LoadingState()
}

View File

@ -0,0 +1,24 @@
package com.za.bean
/**
* Created by DoggieX on 2017/7/26.
*/
class BaseResponse<T> {
var code: Int = 0
var msg: String? = null
var message: String? = null
var result: T? = null
val isOk: Boolean
get() = code == 0 || code == 200
override fun toString(): String {
return "BaseResponse{" +
"code=" + code +
", msg='" + msg + '\'' +
", message='" + message + '\'' +
", result=" + result +
'}'
}
}

View File

@ -0,0 +1,216 @@
package com.za.bean
import android.os.Parcel
import android.os.Parcelable
data class DriverInfo(
var userPortrait : String? = "", //用户头像
var token : String? = null, //
var rongyunToken : String? = null,
var logTime : String? = null,
var userId : Int? = null, //用户id
var userName : String? = null, //用户姓名
var userPhone : String? = null, //用户手机号
var callphone : String? = null,
var supplierId : String? = null, //经销商id
var supplierName : String? = null, //经销商名称
var supplierType : Int? = null, //经销商类型 1子公司 2供应商
var loginLogId : Int? = null,
var serviceList : List<String>? = 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<DriverInfo> {
override fun createFromParcel(parcel : Parcel) : DriverInfo {
return DriverInfo(parcel)
}
override fun newArray(size : Int) : Array<DriverInfo?> {
return arrayOfNulls(size)
}
}
}
data class GeneralInfo(
var userId : Int? = null, //用户id
val userName : String? = null, //用户名
val userPhone : String? = null,
val userPortrait : String? = null, //大头照
val vehicleId : Int? = null,
val vehicleName : String? = null,
val vehicleState : Int? = null, //车辆状态 0 空闲 1 忙碌
val supplierId : Int? = null,
val supplierName : String? = null,
val supplierType : Int?,
val plateNumber : String? = null, //车牌号
val serviceList : List<String>? = null,
val deviceId : String? = null,
val authStatus : Int? = null, // 0 未认证 1 已认证
)
data class DriverIdentityAuthWebRequest(val vehicleId : Int? = null,
val driverId : Int? = null,
val redirectUrl : String = "https://www.sinoassist.com?esignAppScheme=zd_sinoassist://demo/realBack")
data class DriverIdentityAuthWebBean(val flowId : String? = null,
val shortLink : String? = null,
val url : String? = null)
//public Integer update;//是否强制更新(1:强制更新0非强制更新)
//public String path;//更新路径
//public String newAppVersion;//版本号
//public String description;//版本更新内容
data class UpdateVersionBean(val update : Int? = null,
val path : String? = null,
val newAppVersion : String? = null,
val description : String? = null)
//public String appVersion;//版本号
//public Integer appType = 1;//app类型
data class UpdateVersionRequest(val appVersion : String? = null, val appType : Int? = 1)
// private String jobCode;
// private String phone;
// private String taskCode;
// private String rescueVehicle;
// private String deviceId;
// private String vehicleId;
data class LoginWithTaskRequest(val jobCode : String? = null,
val phone : String? = null,
val taskCode : String? = null,
val rescueVehicle : String? = null,
val deviceId : String? = null,
val vehicleId : String? = null)
//{
// "code": 0,
// "msg": "请求成功",
// "result": {
// "supplierName": "上海安畅",
// "vehicleName": "小小宋车辆(1",
// "supplierId": 1128,
// "userPhone": "17630035658",
// "userName": "宋志领",
// "userId": 4967,
// "token": "c969499d5ac9cbb9da2691ee7533f065",
// "loginLogId": 10267,
// "userPortrait": "http://file.sino-assist.com/group1/M00/04/E1/wKgBzGfZHjCAW8_MAAQsluXYmmc152.jpg?date=2025-03-18",
// "serviceList": [
// "故障--平板拖车",
// "换胎",
// "搭电",
// "抢修",
// "送水",
// "缺汽油",
// "缺机油",
// "事故--平板拖车",
// "困境救援",
// "困境-吊车",
// "困境救援-事故",
// "困境救援-故障",
// "电话技术支持",
// "电话技术解决",
// "派送备用钥匙",
// "待命点间调拨",
// "商品车运输",
// "故障--大型拖车",
// "故障--小型拖车",
// "事故--大型拖车",
// "事故--小型拖车",
// "车辆检测",
// "送防冻液",
// "其他",
// "故障拖车免拖100公里",
// "代验车--取车",
// "代验车--送车",
// "代验车-取件",
// "代验车--送件",
// "应急道路救援",
// "3吨拖车",
// "8吨拖车",
// "25吨拖车",
// "50吨拖车",
// "大力神拖车",
// "代提车-拖车",
// "现场小修--解档",
// "地库救援(不含拖车)",
// "故障拖车免拖50公里",
// "充电拖车-双程",
// "代客充电",
// "充气",
// "移动充电",
// "代验车--现场代办",
// "代验车--快递代办",
// "代验车--取车代办",
// "长途拖车",
// "大板运输",
// "商品车调拨",
// "失车定位",
// "医疗急救",
// "高速救援",
// "代客洗车",
// "代提车-代驾",
// "回程车运输",
// "上门交付",
// "充电拖车-单程"
// ],
// "vehicleId": 327732,
// "supplierType": 1,
// "jobNumber": "宋志领"
// }
//}
data class LoginWithTaskBean(val supplierName : String? = null,
val vehicleName : String? = null,
val supplierId : Int? = null,
val userPhone : String? = null,
val userName : String? = null,
val userId : Int? = null,
val token : String? = null,
val loginLogId : Int? = null,
val userPortrait : String? = null,
val serviceList : List<String>? = null,
val jobNumber : String? = null,
val vehicleId : Int? = null,
val supplierType : Int? = null)

View File

@ -0,0 +1,12 @@
package com.za.bean
data class ImageBean(
var data: String? = null,
var msg: String? = null,
var success: Boolean? = null,
var code: Int? = null) {
fun isOk(): Boolean {
return code == 200
}
}

View File

@ -0,0 +1,329 @@
package com.za.bean
import com.blankj.utilcode.util.EncodeUtils
import com.blankj.utilcode.util.TimeUtils
import com.za.base.AppConfig
import java.io.Serializable
import java.nio.charset.StandardCharsets
data class JpushBean(
val pushType: Int? = null, //0 新任务 1 任务取消 2 任务变更
val taskId: Int? = null,//订单号 "taskId":5313005
val taskCode: String? = null, //订单编码 "taskCode":"ZD20190308009965"
val customerName: String? = null, //客户姓名 "customerName":"越继安"
val customerPhone: String? = null, //客户电话 "customerPhone":"18078815268"
val carBrand: String? = null, //车辆品牌 "carBrand":""
val carModel: String? = null,//车辆型号 "carModel":"秦"
val contract: String? = null, //车辆型号 "carModel":"秦"
val typeDesc: String? = null, //推送的附加消息 revoke 撤回 giveUp放弃 reDispatch改派
val carNo: String? = null, //客户车车牌号 "carNo":"粤AF53918"
val taskState: String? = null, //订单状态 "taskState":"GOTO"
val address: String? = null, //任务地址 "address":"广东省广州市白云区107国道石井凰岗路342号(白云黄石、同德围地区近庆丰兴隆公园)美景大酒店"
val addressProperty: String? = null,//任务地址类型 "addressProperty":"地面"
val hotline: String? = null, //任务地址类型 "addressProperty":"地面"
val schedulingFinalRule: Int? = null, //案件类型 0 传统案件 1 聚合派工
val addressRemark: String? = null,
val distAddress: String? = null, //目的地地址 "distAddress":"广东省广州市白云区雅岗南大道"
val distAddressRemark: String? = null,
val expectArriveTime: String? = null, //预计到达时间 "expectArriveTime":"2019-03-08 05:11:07"
val serviceTypeName: String? = null,//服务类型 "serviceTypeName":"故障--平板拖车"
val dispatchTime: String? = null, //派单时间 "dispatchTime":"2019-03-08 04:26:07"
val lat: Double? = null,
val lng: Double? = null,
val distLat: Double? = null,
val distLng: Double? = null,
val importantTip: String? = null,
val tipContent: String? = null,
val hasReplaceBatteryCapable: Int? = null ,//是否有更换电瓶的能力 1 搭电可以更换电瓶 2搭电不可以更换电瓶 其他的不展示
var voiceType : Int?=null //语音提示类型 1小修单 2拖车单 3困境单
) : Serializable {
fun isNeedCallCustomPhone(): Boolean {
return "210" != customerPhone && "230" != customerPhone
}
}
data class NewOrderRequestBean(val vehicleId: Int? = null)
//历史订单状态
data class HistoryTaskBean(
val taskId: Int? = null, //订单号
val taskCode: String? = null, //订单编码
val userOrderId: Int? = null,
val userOrderCode: String? = null, //只有电子工单历史补传才需要传
val supplierAudit: Int? = null, //审核状态 0待补充 1 待审核 2审核不通过 3 审核通过
val supplierAuditStr: String? = null, //审核状态描述
val missingContent: String? = null, //缺失内容
val auditFailReason: String? = null, //审核失败原因
val customerName: String? = null, //客户姓名
val customerPhone: String? = null, //客户电话
val carBrand: String? = null, //车辆品牌
val carModel: String? = null, //车辆型号
val carNo: String? = null, //客户车车牌号 "
val carVin: String? = null, //客户车Vin码
val taskState: String? = null, //订单状态
val address: String? = null, //任务地址
val addressRemark: String? = null, //事发地地址补充
val addressProperty: String? = null, //任务地址类型
val lat: Double? = null,
val lng: Double? = null,
val distAddress: String? = null, //目的地地址
val distAddressRemark: String? = null, //目的地地址补充
val distLat: Double? = null,
val distLng: Double? = null,
val expectArriveTime: String? = null, //预计到达时间
val serviceTypeName: String? = null, //服务类型
val orderSource: String? = null, //
val flowType: Int? = null, //流程类型 "flowType":2
val settleType: Int? = null, //结算类型 1 月结 2 现金
val supplierId: Int? = null,
val successTime: String? = null, //完成时间 "dispatchTime":"2019-03-08 04:26:07"
val verifyType: Int? = null, //验证类型 "verifyType":1
val verifyValue: String? = null, //验证内容
val holdon: Boolean? = null, //是否被挂起 "holdon":false
val externalCode: String? = null, //流水号
val vehicleName: String? = null,
val traceIdAB: Int? = null,
val mileageAB: Int? = null,
val traceABUrl: String? = null,
val traceIdBC: Int? = null,
val mileageBC: Int? = null,
val mileageCA: Int? = null,
val traceBCUrl: String? = null,
val createTime: String? = null,
val acceptTime: String? = null,
val arriveTime: String? = null,
val arriveDestTime: String? = null,
val giveupTime: String? = null,
val giveupAddress: String? = null,
val giveupLat: Double? = null,
val giveupLng: Double? = null,
val needWaterMarker: Boolean? = null,
val needShowPhoneBrand: Boolean? = null,
val policyNo: String? = null, // 平安拖车责任险 保单号
val electronOrderState: String? = null, //电子工单状态
val hasReplaceBatteryCapable: Int? = null, //是否具有更换电瓶的能力
val hasReplaceBattery: Int = 0 //1已更换过 2有更换能力但没更换过 0无
) : Serializable {
fun getEleOrderH5Url(): String? {
if (electronOrderState == null || electronOrderState != "3") {
return null
}
val paramQuery = (("userOrderId=$userOrderId").toString() + "&userOrderCode=" + taskCode) + "&supplierId=" + userOrderId
return AppConfig.Resource_URL + "/electronicWorkOrder/index.html?" + EncodeUtils.base64Encode2String(paramQuery.toByteArray(StandardCharsets.UTF_8))
}
fun getSettleTypeStr(): String {
return when (settleType) {
1 -> {
"月结"
}
2 -> {
"现金"
}
else -> {
""
}
}
}
}
data class HistoryPhotoTemplates(
/**
* 任务节点
*/
val taskStatus: Int? = null,
/**
* 图片节点名称
*/
val taskStatusString: String? = null,
/**
* 该节点下的所有历史照片信息
*/
val photoList: List<HistoryPhotoTemplateItem>? = null
)
data class HistoryPhotoTemplateItem(
val photoUrl: String? = null,
val tag: String? = null,
val imageTitle: String? = null,
val lon: String? = null,
val lat: String? = null,
val templatePhotoType: Int = 0, //1 照片 2 工单照片
val takePhotoTime: String? = null,
val takeAddress: String? = null,
val uploadStatus: String? = null,
val uploadState: Int? = 0, //0 上传中 1 上传成功 2 上传失败
) {
//获取拍照时间
fun getPhotoTakeTime(taskState: String, historyTaskBean: HistoryTaskBean?): String? {
if (!takePhotoTime.isNullOrBlank()) {
return takePhotoTime
}
return when (taskState) {
"13001", "15001" -> historyTaskBean?.arriveTime
"17001" -> {
if (2 == historyTaskBean?.flowType) {
historyTaskBean.arriveDestTime
} else {
historyTaskBean?.arriveTime
}
}
"18001" -> {
historyTaskBean?.successTime
}
"18100" -> historyTaskBean?.giveupTime
else -> TimeUtils.getNowString()
}
}
fun getPhotoLat(taskState: String, historyTaskBean: HistoryTaskBean?): Double? {
if (!lat.isNullOrBlank()) {
return lat.toDouble()
}
return when (taskState) {
"13001", "15001" -> historyTaskBean?.lat
"17001", "18001" -> {
if (2 == historyTaskBean?.flowType) {
historyTaskBean.distLat
} else {
historyTaskBean?.lat
}
}
"18100" -> historyTaskBean?.giveupLat
else -> null
}
}
fun getPhotoLng(taskState: String, historyTaskBean: HistoryTaskBean?): Double? {
if (!lon.isNullOrBlank()) {
return lon.toDouble()
}
return when (taskState) {
"13001", "15001" -> historyTaskBean?.lng
"17001", "18001" -> {
if (2 == historyTaskBean?.flowType) {
historyTaskBean.distLng
} else {
historyTaskBean?.lng
}
}
"18100" -> historyTaskBean?.giveupLng
else -> null
}
}
fun getPhotoAddress(taskState: String, historyTaskBean: HistoryTaskBean?): String? {
if (!takeAddress?.replace("[", "")?.replace("]", "").isNullOrBlank()) {
return takeAddress
}
return when (taskState) {
"13001", "15001" -> historyTaskBean?.address
"17001", "18001" -> {
if (2 == historyTaskBean?.flowType) {
historyTaskBean.distAddress
} else {
historyTaskBean?.address
}
}
"18100" -> historyTaskBean?.giveupAddress
else -> ""
}
}
}
data class TaskSettlementAndTraceBean(
val settleMap: SettleMapBean? = null,
val traceIdAB: Int? = null,
val mileageAB: Int? = null,
val traceABUrl: String? = null,
val traceIdBC: Int? = null,
val mileageBC: Int? = null,
val mileageCA: Int? = null,
val traceBCUrl: String? = null
)
data class SettleMapBean(
/*————————————子公司——————————*/
val startPrice: Int? = null, //起步价
val unitPrice: Double? = null, //每公里单价
val mileage: Int? = null, //公里数
val basePrice: Double? = null,//基本费用
val roadFee: Int? = null,//路桥费
val assistFee: Int? = null, //辅助总费用
/*———————————————供应商———————————————*/ // public Integer startMileage;//出发段公里数
// public Integer carryMileage;//背车段公里数
// public Integer backMileage;//回程段公里数
val startRoadFee: Int? = null, //出发段过境费
val carryRoadFee: Int? = null, //背车段过境费
val backRoadFee: Int? = null, //回程段过境费
val waitFee: Int? = null,//等候费
val wheelFee: Int? = null,//辅助轮费
val wheelNum: Int? = null, //辅助轮个数
val wheelPrice: Int? = null, //辅助轮单价
val dilemmaFee: Int? = null,//困境费
val basementFee: Int? = null, //其他费用
val totalFee: Double? = null,//费用总计
)
/**
* Created by zhangj on 2019/12/4.
*/
class SettleInfoRequest(
val orderId: Int? = null,
val supplierType: Int? = null,
val startMileage: Int? = null,
val carryMileage: Int? = null,
val backMileage: Int? = null,
val startRoadFee: Int? = null,
val carryRoadFee: Int? = null,
val backRoadFee: Int? = null,
val waitFee: Int? = null,
val settleType: Int? = null,
val wheelFee: Int? = null, //辅助轮费
val wheelNum: Int? = null,
val wheelPrice: Int? = null,
val dilemmaFee: Int? = null, //困境费
val basementFee: Int? = null, //其他费用
val totalFee: Double? = null, //
val startPrice: Int? = null,
val unitPrice: Double? = null,
val mileage: Int? = null,
val basePrice: Double? = null,
val assistFee: Int? = null,
val imgInfo: String? = null,
val imgPath: String? = null,
)
data class AMapTraceBean(
val counts: Int? = null,
val distance: Double? = null,
val time: Long? = null,
val trid: Int? = null,
val points: List<PointsBean>? = null)
data class PointsBean(
val accuracy: Double? = null,
val direction: Double? = null,
val height: Double? = null,
val locatetime: Long? = null,
val location: String? = null,
val speed: Double? = null)

View File

@ -0,0 +1,21 @@
package com.za.bean
data class PaymentInfoBean(
var userOrderId: Int? = null,
val taskOrderId: Int? = null,
val adjustAmount: Int? = null, //调整金额
val startPrice: Int? = null, //起步价
val limitedMileage: Int? = null, //免托公里数
val amount: Float? = null, //收款金额
val unitPrice: Float? = null, //单价 //如果单价为 null 并且payItem 为2 则为超限无单价项目
val mileage: Float? = null, //公里数
val settlementRule: String? = null,//结算规则
val userPhone: String? = null,//客户手机号
val tradeState: Int? = null, //交易状态 交易状态 1 待交易 2交易完成
val isPayment: Boolean? = null, //是否需要进行客户收款
val orderPayDetailId: Int? = null, //订单支付明细ID
val payItem: Int? = null, //支付项目 1.现金项目 2超限项目
val contractSettleRule: Int? = null, //合同结算规则 1系统结算 2一口价结算 其中 一口价的不允许修改金额
val calculateAmount: Float? = null, //计算金额
val askPayment: Boolean? = null, //是否询问是否收款
)

View File

@ -0,0 +1,33 @@
package com.za.bean
data class UploadChangeBatteryRequest(
var userOrderId: Int? = null,
val hasReplaceBattery: Int? = null, //是否更换电瓶 1 更换
val replaceBatteryImgList: List<String>? = null,
val isPayment: Boolean? = null //是否需要付款
)
data class FetchChangeBatteryPhotoRequest(
val userOrderId: Int? = null,
val taskOrderId: Int? = null//是否更换电瓶
)
data class ChangeBatteryResponse(
val userOrderId: Int? = null,
val taskOrderId: Int? = null,
val imageType: Int? = null,//1 开案照片2 医疗救援附件3 开案凭证照片,4议价凭证照片,5电子工单,6换电瓶照片
val imageUrl: String? = null,
val tag: String? = null
)
data class BatteryCostQueryBean(
var isPayment: Boolean? = null,
val userOrderId: Int? = null,
val taskOrderId: Int? = null,
val amount: Float? = null,
val userPhone: String? = null,
val tradeState: Int? = null//交易状态 1 待交易 2 交易完成 6 交易关闭
)
data class BatteryCostQueryRequest(var userOrderId: Int? = null,
val taskOrderId: Int? = null)

View File

@ -0,0 +1,56 @@
package com.za.bean
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, //经销商类型
) : 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) {
}
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
}
companion object CREATOR : Parcelable.Creator<VehicleInfo> {
override fun createFromParcel(parcel : Parcel) : VehicleInfo {
return VehicleInfo(parcel)
}
override fun newArray(size : Int) : Array<VehicleInfo?> {
return arrayOfNulls(size)
}
}
}

View File

@ -0,0 +1,28 @@
package com.za.bean
//public String reportType;//报备类型名称
// public String reportTemplate;//报备内容模板
data class ReportItem(val reportType: String? = null,
val reportTemplate: String? = null)
//提交报备内容
// public String taskId;//关联的任务Id
// public String reportType;//报备类型名称
// public String reportTemplate;//报备内容模板
data class ReportInfoRequest(val taskId: String? = null,
val reportType: String? = null,
val reportTemplate: String? = null)
//报备历史请求
data class ReportHistoryRequest(val taskId: String? = null)
// public String reportType;//报备类型名称
// public String reportTemplate;//报备内容模板
// public String createTime;//备注时间
// public int state;//1 未处理 2 已处理
data class ReportHistoryBean(val reportType: String? = null,
val reportTemplate: String? = null,
val createTime: Long? = null,
val state: Int? = null)

View File

@ -0,0 +1,90 @@
package com.za.bean.db
import androidx.compose.ui.graphics.Color
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "change_battery_photo")
data class ChangeBatteryPhoto(
//图片id
@PrimaryKey(autoGenerate = true)
var id: Long? = null,
// 流程节点
var taskNode: Int? = null,
//图片描述
var imageDescription: String? = null,
//图片标题
var imageTitle: String? = null,
//标签
var tag: String? = null,
// 是否必拍 0 非必拍 1必拍
var doHaveFilm: Int? = null,
//封面地址
var photoUrl: String? = null,
//图片名称
var photoName: String? = null,
//图片类型
var photoType: Int? = null, //1 走单照片 2 工单照片 3更换电瓶照片
//创建日期
var createTime: String? = null,
var numbering: String? = null, //图片编号
var recognizeType: Int? = null, //ocr识别类型 0 无 1车牌号 2车架号
var photoTip: String? = null, //拍摄提示
var photoPath: String? = null, //照片路径
var photoContract: String? = null, //对比照
var photoNum: Int = 1, //对比照
var mustPhoto: Boolean = false, //是否必拍照片
var photoStatus: Int? = null, // 0 未上传 1 准备上传 2 已上传 3 上传失败 4 上传中 5 照片不符合条件 6 照片缺失地址信息 7 ocr车架号识别出错
var uploadedPath: String? = null,
var photoInfo: String? = null,
var index: Int? = null,
var userOrderId: Int? = null,
var taskId: Int? = null,
var taskCode: String? = null) {
fun convertPhotoStatusStr(status: Int): String {
return when (status) {
2 -> "已上传"
3 -> "上传失败"
4 -> "上传中"
5 -> "照片不符合条件"
6 -> "照片缺失地址信息"
7 -> "车架号识别出错"
else -> ""
}
}
fun getPhotoStatusColor(): Color {
return when (this.photoStatus) {
1 -> Color(0xFF2DBBF9)
2 -> Color(0xFF32CD32)
3 -> Color.Red
4 -> Color(0xFF2DBBF9)
5 -> Color.Red
6 -> Color.Red
else -> Color(0xFF2DBBF9)
}
}
}

View File

@ -0,0 +1,271 @@
package com.za.bean.db;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity(tableName = "new_table_photo_template")
public class NewPhotoTemplateBean {
//图片id
@PrimaryKey(autoGenerate = true)
public long id;
// 流程节点
private int taskNode;
//图片描述
private String imageDescription;
//图片标题
private String imageTitle;
//标签
private String tag;
// 是否必拍 0 非必拍 1必拍
private int doHaveFilm;
//封面地址
private String photoUrl;
//图片名称
private String photoName;
//图片类型
private int photoType;//1 走单照片 2 工单照片 3更换电瓶照片
//创建日期
private String createTime;
private String numbering;//图片编号
private Integer recognizeType;//ocr识别类型 0 无 1车牌号 2车架号
private String photoTip = "";//拍摄提示
private String photoPath = "";//照片路径
private String photoContract = "";//对比照
private int photoNum = 1;//对比照
private Boolean mustPhoto = false;//是否必拍照片
private int photoStatus = 0;// 0 未上传 1 准备上传 2 已上传 3 上传失败 4 上传中 5 照片不符合条件 6 照片缺失地址信息 7 ocr车架号识别出错
private String uploadedPath = "";
private String photoInfo;
private int index;
private int userOrderId;
private int taskId;
private String taskCode;
public NewPhotoTemplateBean() {
this.id = System.currentTimeMillis();
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public int getTaskNode() {
return taskNode;
}
public void setTaskNode(int taskNode) {
this.taskNode = taskNode;
}
public String getImageDescription() {
return imageDescription;
}
public void setImageDescription(String imageDescription) {
this.imageDescription = imageDescription;
}
public String getImageTitle() {
return imageTitle;
}
public void setImageTitle(String imageTitle) {
this.imageTitle = imageTitle;
}
public String getTag() {
return tag;
}
public void setTag(String tag) {
this.tag = tag;
}
public int getDoHaveFilm() {
return doHaveFilm;
}
public void setDoHaveFilm(int doHaveFilm) {
this.doHaveFilm = doHaveFilm;
}
public String getPhotoUrl() {
return photoUrl;
}
public void setPhotoUrl(String photoUrl) {
this.photoUrl = photoUrl;
}
public String getPhotoName() {
return photoName;
}
public void setPhotoName(String photoName) {
this.photoName = photoName;
}
public int getPhotoType() {
return photoType;
}
public void setPhotoType(int photoType) {
this.photoType = photoType;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getNumbering() {
return numbering;
}
public void setNumbering(String numbering) {
this.numbering = numbering;
}
public Integer getRecognizeType() {
return recognizeType;
}
public void setRecognizeType(Integer recognizeType) {
this.recognizeType = recognizeType;
}
public String getPhotoTip() {
return photoTip;
}
public void setPhotoTip(String photoTip) {
this.photoTip = photoTip;
}
public String getPhotoPath() {
return photoPath;
}
public void setPhotoPath(String photoPath) {
this.photoPath = photoPath;
}
public String getPhotoContract() {
return photoContract;
}
public void setPhotoContract(String photoContract) {
this.photoContract = photoContract;
}
public int getPhotoNum() {
return photoNum;
}
public void setPhotoNum(int photoNum) {
this.photoNum = photoNum;
}
public Boolean getMustPhoto() {
return mustPhoto;
}
public void setMustPhoto(Boolean mustPhoto) {
this.mustPhoto = mustPhoto;
}
public int getPhotoStatus() {
return photoStatus;
}
public void setPhotoStatus(int photoStatus) {
this.photoStatus = photoStatus;
}
public String getUploadedPath() {
return uploadedPath;
}
public void setUploadedPath(String uploadedPath) {
this.uploadedPath = uploadedPath;
}
public String getPhotoInfo() {
return photoInfo;
}
public void setPhotoInfo(String photoInfo) {
this.photoInfo = photoInfo;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public int getUserOrderId() {
return userOrderId;
}
public void setUserOrderId(int userOrderId) {
this.userOrderId = userOrderId;
}
public int getTaskId() {
return taskId;
}
public void setTaskId(int taskId) {
this.taskId = taskId;
}
public String getTaskCode() {
return taskCode;
}
public void setTaskCode(String taskCode) {
this.taskCode = taskCode;
}
@Override
public String toString() {
return "NewPhotoTemplateBean{" +
"id=" + id +
", taskNode=" + taskNode +
", imageDescription='" + imageDescription + '\'' +
", imageTitle='" + imageTitle + '\'' +
", tag='" + tag + '\'' +
", doHaveFilm=" + doHaveFilm +
", photoUrl='" + photoUrl + '\'' +
", photoName='" + photoName + '\'' +
", photoType=" + photoType +
", createTime='" + createTime + '\'' +
", numbering='" + numbering + '\'' +
", recognizeType=" + recognizeType +
", photoTip='" + photoTip + '\'' +
", photoPath='" + photoPath + '\'' +
", photoContract='" + photoContract + '\'' +
", photoNum=" + photoNum +
", mustPhoto=" + mustPhoto +
", photoStatus=" + photoStatus +
", uploadedPath='" + uploadedPath + '\'' +
", photoInfo='" + photoInfo + '\'' +
", index=" + index +
", userOrderId=" + userOrderId +
", taskId=" + taskId +
", taskCode='" + taskCode + '\'' +
'}';
}
}

View File

@ -0,0 +1,28 @@
package com.za.bean.db.ele
import androidx.room.Entity
import androidx.room.PrimaryKey
import java.io.Serializable
@Entity(tableName = "ele_car_damage_photo")
data class EleCarDamagePhotoBean(
@PrimaryKey(autoGenerate = true)
val id: Long? = null,
val path: String? = null,
val orderId: Int? = null,
val userOrderId: Int? = null,
val isPhoto: Boolean? = null,
val videoThumbnailPath: String? = null,
val uploadStatus: Int? = null,// 1 上传成功 2 正在上传 3上传失败
val serverPath: String? = null,
val index: Int? = null
) : Serializable {
fun getStatusStr(): String {
return when (uploadStatus) {
1 -> "上传成功"
2 -> "正在上传"
3 -> "上传失败"
else -> ""
}
}
}

View File

@ -0,0 +1,26 @@
package com.za.bean.db.ele
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "ele_work_order")
data class EleWorkOrderBean(
@PrimaryKey(autoGenerate = false) val orderId: Int,
val userOrderId: Int? = null,
val date: String? = null, //日期 2023-10-20
val serviceContent: String? = null, //服务须知内容
val orderWorkStatus: Int? = null, //电子工单状态 1车辆损伤照片 2 客户签名页面 3 服务完成 接车人签名和服务人员签名状态
val hasBad: Boolean? = null, //车辆是否有损伤
val carNO: String? = null,//车牌号
val carVin: String? = null,//车架号
val orderType: String? = null, //救援类型
val isSuccess: Int? = null, //服务是否成功 1 成功 其他失败
val localCustomSignPath: String? = null,
val localAcceptCarSignPath: String? = null,//接车人本地路径
val localServicePeopleSignPath: String? = null, //服务人员签名
val serverCustomSignPath: String? = null,
val serverAcceptCarSignPath: String? = null, //远程地址
val serverServicePeopleSignPath: String? = null,
val hasCreatedEleWorkOrderPhoto: Boolean? = null, //是否已经生成电子工单照片
val changeBattery: Boolean? = null //是否更换电瓶
)

View File

@ -0,0 +1,237 @@
package com.za.bean.db.order
import android.os.Parcel
import android.os.Parcelable
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "order_info")
data class OrderInfo(
@PrimaryKey(autoGenerate = false) var taskId: Int? = null, //订单号 "taskId":5313005
var userOrderId: Int? = null, //订单id
var taskCode: String? = null, //订单编码 "taskCode":"ZD20190308009965"
var customerName: String? = null, //客户姓名 "customerName":"越继安"
var customerPhone: String? = null,//客户电话 "customerPhone":"18078815268"
var carBrand: String? = null,//车辆品牌 "carBrand":""
var modelVinNo: String? = null,
var carModel: String? = null, //车辆型号 "carModel":"秦"
var carNo: String? = null, //客户车车牌号 "carNo":"粤AF53918"
var carVin: String? = null,//客户车Vin码 "carVin":"LGXC76C30J0132942"
var taskState: String? = null, //订单状态 "taskState":"GOTO"
var nextState: String? = null,//下一步状态
var electronOrderState: Int? = null, //电子工单状态1检查损伤 2生成车辆检查表签字 3作业完成签字
var address: String? = null, //任务地址 "address":"广东省广州市白云区107国道石井凰岗路342号(白云黄石、同德围地区近庆丰兴隆公园)美景大酒店"
var addressProperty: String? = null, //任务地址类型 "addressProperty":"地面"
var addressRemark: String? = null, //事发地地址补充
var distAddress: String? = null, //目的地地址 "distAddress":"广东省广州市白云区雅岗南大道"
var distAddressRemark: String? = null,//目的地地址补充
var expectArriveTime: String? = null, //预计到达时间 "expectArriveTime":"2019-03-08 05:11:07"
var serviceTypeName: String? = null, //服务类型 "serviceTypeName":"故障--平板拖车"
var orderSource: String? = null, // "orderSource":"中道救援-比亚迪道路救援项目"
var flowType: Int? = null, //流程类型 0 综合服务 1小修 2拖车 3取送件 4在线技术解决 5组合服务 6拖车简化流程 7武汉交管服务
var settleType: Int? = null,//结算类型 1 月结 2 现金
var settleTypeStr: String? = null, //结算类型
var supplierId: Int? = null,
var startTime: String? = null,//发车时间
var operationTime: String? = null, //作业完成时间
var dispatchTime: String? = null,//派单时间 "dispatchTime":"2019-03-08 04:26:07"
var verifyType: Int? = null,//验证类型 "verifyType": 0 跳过验证 1和2 车牌和车架号验证 5 新车验证
var verifyValue: String? = null,//验证内容 "verifyValue":"粤AF53918"
var holdon: Boolean? = null,//是否被挂起 "holdon":false
var isCurrent: Boolean? = null, //是否为正在做的任务
var flow: String? = null, //流程状态 "flow":"START,GOTO,VERIFY,EXAMINE,OPERATION,SENDTO,SETTLEMENT,FINISH"
var externalCode: String? = null, //
var plateNumber: String? = null,
var distaddressProperty: String? = null,
var vehiclePointRemark: String? = null,
var destinationRemark: String? = null,
var lat: Double? = null,
var lng: Double? = null,
var distLat: Double? = null,
var distLng: Double? = null,
var hotline: String? = null,
var createTime: String? = null,
var acceptTime: String? = null,
var arriveTime: String? = null,
var arriveDestTime: String? = null,
var needECDevice: Boolean? = null,
var needDestAddress: Boolean? = null,
var linkToDocs: Boolean? = null,
var linkToDaDianH5: Boolean? = null,
var carFactory: Boolean? = null,
var needWaterMarker: Boolean? = null,
var needShowPhoneBrand: Boolean? = null,
var taskNotes: String? = null, //救援要求
var feeStandard: String? = null, //收费标准
var customerNotes: String? = null, //客户提醒
var otherNotes: String? = null, //特殊提醒
var isNewCar: Boolean? = null, //是否新车
var ECDeviceString: String? = null,//搭电设备照片提示
var customerReportImgs: String? = null, //客户上报照片,多张照片用;分隔
var arriveRemind: String? = null,
var arriveRemindLink: String? = null,
var policyNo: String? = null, // 平安拖车责任险 保单号
var advanceTime: Long? = null,
var importantTip: String? = null,
var hasReplaceBatteryCapable: Int? = null, //是否有更换电瓶的能力 1 搭电可以更换电瓶 2搭电不可以更换电瓶 其他的不展示
var taskSuccessStatus: Int? = null, //作业是否完成 0 完成 1未完成 拖车默认完成
var tyreNumber: Int? = null, //辅助费用
) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readValue(Int::class.java.classLoader) as? Int,
parcel.readValue(Int::class.java.classLoader) as? Int,
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
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.readString(),
parcel.readString(),
parcel.readString(),
parcel.readValue(Int::class.java.classLoader) as? Int,
parcel.readValue(Int::class.java.classLoader) as? Int,
parcel.readString(),
parcel.readValue(Int::class.java.classLoader) as? Int,
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readValue(Int::class.java.classLoader) as? Int,
parcel.readString(),
parcel.readValue(Boolean::class.java.classLoader) as? Boolean,
parcel.readValue(Boolean::class.java.classLoader) as? Boolean,
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readValue(Double::class.java.classLoader) as? Double,
parcel.readValue(Double::class.java.classLoader) as? Double,
parcel.readValue(Double::class.java.classLoader) as? Double,
parcel.readValue(Double::class.java.classLoader) as? Double,
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readValue(Boolean::class.java.classLoader) as? Boolean,
parcel.readValue(Boolean::class.java.classLoader) as? Boolean,
parcel.readValue(Boolean::class.java.classLoader) as? Boolean,
parcel.readValue(Boolean::class.java.classLoader) as? Boolean,
parcel.readValue(Boolean::class.java.classLoader) as? Boolean,
parcel.readValue(Boolean::class.java.classLoader) as? Boolean,
parcel.readValue(Boolean::class.java.classLoader) as? Boolean,
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readValue(Boolean::class.java.classLoader) as? Boolean,
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readValue(Long::class.java.classLoader) as? Long,
parcel.readString(),
parcel.readValue(Int::class.java.classLoader) as? Int,
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(taskId)
parcel.writeValue(userOrderId)
parcel.writeString(taskCode)
parcel.writeString(customerName)
parcel.writeString(customerPhone)
parcel.writeString(carBrand)
parcel.writeString(modelVinNo)
parcel.writeString(carModel)
parcel.writeString(carNo)
parcel.writeString(carVin)
parcel.writeString(taskState)
parcel.writeString(nextState)
parcel.writeValue(electronOrderState)
parcel.writeString(address)
parcel.writeString(addressProperty)
parcel.writeString(addressRemark)
parcel.writeString(distAddress)
parcel.writeString(distAddressRemark)
parcel.writeString(expectArriveTime)
parcel.writeString(serviceTypeName)
parcel.writeString(orderSource)
parcel.writeValue(flowType)
parcel.writeValue(settleType)
parcel.writeString(settleTypeStr)
parcel.writeValue(supplierId)
parcel.writeString(startTime)
parcel.writeString(operationTime)
parcel.writeString(dispatchTime)
parcel.writeValue(verifyType)
parcel.writeString(verifyValue)
parcel.writeValue(holdon)
parcel.writeValue(isCurrent)
parcel.writeString(flow)
parcel.writeString(externalCode)
parcel.writeString(plateNumber)
parcel.writeString(distaddressProperty)
parcel.writeString(vehiclePointRemark)
parcel.writeString(destinationRemark)
parcel.writeValue(lat)
parcel.writeValue(lng)
parcel.writeValue(distLat)
parcel.writeValue(distLng)
parcel.writeString(hotline)
parcel.writeString(createTime)
parcel.writeString(acceptTime)
parcel.writeString(arriveTime)
parcel.writeString(arriveDestTime)
parcel.writeValue(needECDevice)
parcel.writeValue(needDestAddress)
parcel.writeValue(linkToDocs)
parcel.writeValue(linkToDaDianH5)
parcel.writeValue(carFactory)
parcel.writeValue(needWaterMarker)
parcel.writeValue(needShowPhoneBrand)
parcel.writeString(taskNotes)
parcel.writeString(feeStandard)
parcel.writeString(customerNotes)
parcel.writeString(otherNotes)
parcel.writeValue(isNewCar)
parcel.writeString(ECDeviceString)
parcel.writeString(customerReportImgs)
parcel.writeString(arriveRemind)
parcel.writeString(arriveRemindLink)
parcel.writeString(policyNo)
parcel.writeValue(advanceTime)
parcel.writeString(importantTip)
parcel.writeValue(hasReplaceBatteryCapable)
parcel.writeValue(taskSuccessStatus)
parcel.writeValue(tyreNumber)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<OrderInfo> {
override fun createFromParcel(parcel: Parcel): OrderInfo {
return OrderInfo(parcel)
}
override fun newArray(size: Int): Array<OrderInfo?> {
return arrayOfNulls(size)
}
}
}

View File

@ -0,0 +1,67 @@
package com.za.bean.db.order
import androidx.compose.ui.graphics.Color
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "photo_template_bean")
data class PhotoTemplateInfo(
@PrimaryKey(autoGenerate = true) val primaryId: Int? = null,
val id: Int? = null,
val taskNode: Int? = null,
val imageDescription: String? = null,// 图片描述
val imageTitle: String? = null,// 图片标题
val tag: String? = null,// 标签
val doHaveFilm: Int? = null,//是否必拍 0 非必拍 1 必拍
val photoUrl: String? = null,//封面地址
val photoName: String? = null,// 图片名称
val photoType: Int? = null,// 1 照片 2 电子工单
val createTime: String? = null,//创建时间
val numbering: String? = null,// 图片编号
val recognizeType: Int? = null,//orc 识别类型 0 无 1 车牌号 2 车架号
//以下属性非后台返回属性
val userOrderId: Int? = null,
val taskCode: String? = null,
val taskId: Int? = null,
val photoLocalPath: String? = null,//照片未添加水印之前的位置
val photoUploadPath: String? = null,//照片上传服务器之后的路径
val photoLocalWaterMarkerPath: String? = null,//照片水印位置
val photoUploadStatus: Int? = null,// 0 未上传 1 准备上传 2 已上传 3 上传失败 4 上传中 5 照片不符合条件 6 照片缺失地址信息 7 ocr车架号识别出错
val photoUploadStatusStr: String? = null,
var advanceTime: Long? = null,
val needWaterMarker: Boolean? = null,
val needShowPhoneBrand: Boolean? = null,
val myCustomPhotoType: Int? = null,// 1 默认是服务中照片订单图片 2 历史中照片 3.更换电瓶照片 4.普通的照片
// photo info字段
val realTakePhotoTime: String? = null,//真实拍照时间
val photoSource: Int? = null,//1相机 2 相册 3真实位置
val time: String? = null,// 拍照时间
val lat: Float? = null,
val lng: Float? = null,
val address: String? = null,
) {
fun convertPhotoStatusStr(status: Int): String {
return when (status) {
1 -> "准备上传"
2 -> "已上传"
3 -> "上传失败"
4 -> "上传中"
5 -> "照片不符合条件"
6 -> "照片缺失地址信息"
7 -> "车架号识别出错"
else -> ""
}
}
fun getPhotoStatusColor(): Color {
return when (this.photoUploadStatus) {
1 -> Color(0xFF2DBBF9)
2 -> Color(0xFF32CD32)
3 -> Color.Red
4 -> Color(0xFF2DBBF9)
5 -> Color.Red
6 -> Color.Red
else -> Color(0xFF2DBBF9)
}
}
}

View File

@ -0,0 +1,22 @@
package com.za.bean.db.water_marker
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "water_marker_item")
data class WaterMarkerItemBean(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
@ColumnInfo(name = "water_left") var left: Double = 0.0,
@ColumnInfo(name = "water_right") val right: Double = 0.0,
val top: Double = 0.0,
val bottom: Double = 0.0,
val content: String? = null,
val color: String? = null,
val wideFont: String? = null, //高度大于宽度的系数
val highFont: String? = null, //高度大于宽度的系数
val waterTemplateId: Int? = null,
val taskCode: String? = null,
val taskId: Int? = null,
)

View File

@ -0,0 +1,11 @@
package com.za.bean.db.water_marker
import androidx.room.Embedded
import androidx.room.Relation
data class WaterMarkerTemplateAndItemRef(
@Embedded
val waterMarkerTemplateBean: WaterMarkerTemplateBean? = null,
@Relation(parentColumn = "taskCode", entityColumn = "taskCode")
val waterMarkerItemBeanList: List<WaterMarkerItemBean>? = null
)

View File

@ -0,0 +1,14 @@
package com.za.bean.db.water_marker
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "water_template")
data class WaterMarkerTemplateBean(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
val templateId: Int? = null,
val templateName: String? = null,
val taskCode: String? = null,
val taskId: Int? = null,
val updateTime: String? = null)

View File

@ -0,0 +1,17 @@
package com.za.bean.request
data class AcceptOrderRequest(
var userId: Int? = null,
var taskId: Int? = null,
var vehicleId: Int? = null,
var taskCode: String? = null,
var lat: Double? = null,
var lng: Double? = null,
var deviceId: String? = null,
)
data class RefuseOrderRequest(
var userId: Int? = null,
var taskId: Int? = null,
var vehicleId: Int? = null,
var taskCode: String? = null)

View File

@ -0,0 +1,5 @@
package com.za.bean.request
data class DriverFaceCompareRequest(val vehicleId: Int? = null, val driverId: Int? = null, val photoUrl: String? = null)
data class DriverFaceCompareBean(val flowId: Int? = null, val shortLink: String? = null, val url: String? = null)

View File

@ -0,0 +1,34 @@
package com.za.bean.request
data class LoginRequest(
var jobCode: String? = null, //工号
var supplierCode: String? = null, //经销商代码
var phone: String? = null, //密码
var phoneModel: String? = null, //手机机型
var vehicleId: Int? = null, //车辆id
var enterMileage: Int? = null,//上班公里数
var deviceInfo: String? = null, //手机信息
var regId: String? = null, //手机信息
var lat: Double? = null,
var lng: Double? = null,
var deviceId: String? = null,
var dashboardPath: String? = null //里程表照片路径
)
data class PhoneBean(
var versionRelease: String? = null,//系统版本
var model: String? = null,//手机型号
var brand: String? = null,//手机厂商
var appVersion: String? = null,//app版本
)
data class VehicleLogoutRequest(
var vehicleId: Int? = null, //车辆id
var loginLogId: Int? = null ,//用户id
var exitMileage: Int? = null,
)
data class VerifyCodeRequest(val phone : String? = null)
data class VerifyCodeResponse(val verifyCode : String? = null)

View File

@ -0,0 +1,3 @@
package com.za.bean.request
data class UploadPhotoBean(val img: String? = null)

View File

@ -0,0 +1,56 @@
package com.za.bean.request
data class OrderListRequest(
val vehicleId: Int? = null,
val deviceId: String? = null,
)
/**
* 照片模版请求数据
*/
data class PhotoTemplateRequest(val userOrderId: Int? = null)
//照片识别
data class OrderPhotoOcrRecognizeRequest(
val userOrderId: Int? = null,
val recognizeType: Int? = null,
val imgUrl: String? = null,
)
data class TaskFinishRequest(
val userOrderId: Int? = null,
val lat: Double? = null,
val lng: Double? = null,
val operateTime: Long? = null)
data class GiveUpTaskRequest(
val taskId: Int? = null, //任务id
val userId: Int? = null, //用户id
val vehicleId: Int? = null, //车辆id
val lat: Double? = null,
val lng: Double? = null,
val address: String? = null,
val templatePhotoInfoList: List<String?>? = null, //照片数据
val pushGiveUpFlag: Int? = null, //1 是 0否
)
data class UpdatePhotoRequest(
val taskId: Int? = null,
val taskState: String? = null,
val picturePosition: Int? = null, //图片位置
val picturePath: String? = null,//图片路径
val imgInfo: String? = null
)
data class SwitchTaskRequest(val currentTaskId: Int? = null,
val nextTaskId: Int? = null,
val userId: Int? = null,
val vehicleId: Int? = null)
data class HistoryTasksRequest(val userId: Int? = null, val vehicleId: Int? = null)
data class HistoryPhotoTemplateRequest(val taskId: Int? = null)
data class HistoryDetailRequest(val taskId: Int? = null)

View File

@ -0,0 +1,51 @@
package com.za.bean.request
data class PaymentInfoRequest(
var userOrderId: Int? = null,
val taskOrderId: Int? = null)
// private int userOrderId;
// private int taskOrderId;
// private int onSite;//是否在现场 1是 0否
// private Integer orderPayDetailId;//订单支付明细ID
// private String userPhone;//客户号码,客户不在现场时必填
data class CustomerPaymentCreateRequest(val userOrderId: Int? = null,
val taskOrderId: Int? = null,
val onSite: Int? = null,
val orderPayDetailId: Int? = null,
val userPhone: String? = null)
// private int userOrderId;
// private int taskOrderId;
// private Float amount;
// private String payData;//二维码链接
// private String payCode;//付款编号
// private String plateNumber;//车牌号
data class CustomerPaymentCreateBean(val userOrderId: Int? = null,
val taskOrderId: Int? = null,
val amount: Float? = null,
val payData: String? = null,
val payCode: String? = null,
val plateNumber: String? = null)
//private Integer userOrderId;
//private Integer taskOrderId;
//private Float payAmount; //收款金额
//private Float unitPrice;//单价 //如果单价为 null 并且payItem 为2 则为超限无单价项目
//private Float mileage;//公里数
//private Integer orderPayDetailId;//订单支付明细ID
//private String updateRemark;//支付项目 1.现金项目 2超限项目
//private Float calculateAmount;//计算金额
//private Float adjustAmount;//调整金额
//private boolean askPayment;
data class PaymentUpdateRequest(val userOrderId: Int? = null,
val taskOrderId: Int? = null,
val payAmount: Float? = null,
val unitPrice: Float? = null,
val mileage: Float? = null,
val orderPayDetailId: Int? = null,
val updateRemark: String? = null,
val calculateAmount: Float? = null,
val adjustAmount: Float? = null,
val askPayment: Boolean? = null)

View File

@ -0,0 +1,51 @@
package com.za.bean.request
data class SaveEleOrderRequest(
val taskOrderId: Int? = null,
val userOrderId: Int? = null,
val state: Int? = null,
val hasDamage: Int? = null, //是否有算上 1 有
val hasSuccess: Int? = null, // 作业是否完成 1成功 0失败
val customerSignPath: String? = null, //客户签名照片
val recipientSignPath: String? = null, //接车人签名
val waitstaffSignPath: String? = null, //服务人员签名
val damageFileList: List<String?>? = null, //损伤文件列表
val userOrderCode: String? = null, //仅在历史补传电子工单时传
val tyreNumber: Int? = null, //小轮个数
val lng: Double? = null,
val lat: Double? = null,
val isFinish: Boolean = false, //订单是否完成进入历史 true 完成
/**
* 操作时间(时间戳)
*/
val operateTime: String? = null,
/**
* 0 正常上传 1离线补传
*/
val offlineMode: Int? = null)
data class QueryEleOrderRequest(val taskOrderId: Int? = null,
val userOrderId: Int? = null,
val userOrderCode: String? = null)
data class ElectronOrderResponse(val id: Int? = null,
val userOrderId: Int? = null,
val state: Int? = null,
val hasDamage: Int? = null, //1 有损伤 2 无损伤
val hasSuccess: Int? = null,
val customerSignPath: String? = null,
val recipientSignPath: String? = null,
val waitstaffSignPath: String? = null,//
val createTime: String? = null,
val updateTime: String? = null,
val damageFileList: List<String>? = null,
val vinNo: String? = null,
val plateNumberBean: PlateNumberBean? = null,
val serviceId: Int? = null,
val serviceName: String? = null,
val flowId: Int? = null,
val serviceTerm: String? = null)
data class PlateNumberBean(val value: String? = null)

View File

@ -0,0 +1,157 @@
package com.za.bean.request
data class TodayMaintainbean(
val tag: String? = null,//
val tagName: String? = null, //名称
val description: String? = null, //描述
val img: String? = null, //图片地址
)
data class TodayMaintainRequest(val vehicleId: Int? = null)
data class TodayMaintainUploadRequest(
val vehicleId: String? = null,
val driverId: String? = null,
val tag: String? = null,
val tagImage: String? = null,
)
data class RecognizeRefuelOcrRequestBean(
val imageUrl: String? = null,
val address: String? = null,
val longitude: Double? = null,
val latitude: Double? = null,
val vehicleId: Double? = null,
val driverId: Double? = null,
)
data class RecognizeRefuelTicketBean(
var refuelCode: String? = null, //加油卡号
var quantity: Double? = null,//加油量
var amount: Double? = null,//加油金额
var filePath: String? = null,
)
data class RecognizeRefuelTicketRequestBean(
val vehicleId: Int? = null,
val driverId: Int? = null,
val address: String? = null,
val longitude: Double? = null,
val latitude: Double? = null,
val refuelCode: String? = null,
val quantity: Double? = null,
val amount: Double? = null,
val mileage: Double? = null,
val refuelTime: Double? = null,
val receiptPhotoUrls: String? = null,
val anotherPhotoUrls: String? = null,
)
data class RepairHistoryRequestBean(val id: Int? = null,
val driverId: Int? = null,
val vehicleId: Int? = null)
data class VehicleRepairBean(
var id: Int? = null,//维保记录ID
var stage: String? = null, //阶段 //1 维保申请审批中 2,"维保申请不通过" 3,"维保申请通过" 4,"维保完成审批中" 5,"维保完成不通过" 6,"维保完成通过" 9,"维保终止"
var vehicleId: Int? = null,//车辆ID
var vehicleName: String? = null, //车辆名称
var plateNumber: String? = null, //车牌号
var states: Int? = null,//维保状态
var statesStr: String? = null, //维保状态-描述
var address: String? = null, //维修地址
var repairPoint: String? = null, //维修点名称
var vehicleRepairId: Int? = null,//维修点Id
var longitude: Double? = null, //维保地址经度
var latitude: Double? = null, //维保地址纬度
var storePhotoUrls: String? = null, //门店照片
var paymentType: Int? = null,//支付类型 1挂账 2现金
var amount: Double? = null, //维保金额
var mileage: Int? = null,//车辆里程数
var information: String? = null, //维保信息
var maintenancePhotoUrls: String? = null, //维保照片/项目照片
var voucherPhotoUrls: String? = null, //维保清单/凭证照片
var auditRemark: String? = null, //维保审核备注
var createTime: String? = null, //创建时间
var updateTime: String? = null, //修改时间
) {
fun getPayTypeStr(): String {
return when (paymentType) {
1 -> "月结"
2 -> "全包"
3 -> "现金"
4 -> "月结+现金"
else -> ""
}
}
}
//维保提价记录
data class FetchVehicleMaintenanceSubmitHistoryRequestBean(val vehicleId: Int? = null, val driverId: Int? = null, val id: Int? = null)
/**
* 今日保养的请求信息
*/
data class VehicleMaintenanceHistoryBean(
val id: Int? = null,
val stage: String? = null,//阶段 //1 维保申请审批中 2,"维保申请不通过" 3,"维保申请通过" 4,"维保完成审批中" 5,"维保完成不通过" 6,"维保完成通过" 9,"维保终止"
val vehicleId: Int? = null,//车辆ID
val vehicleName: String? = null,//
val plateNumber: String? = null,//车牌号
val states: Int? = null,//维保状态
val statesStr: String? = null,//维保状态-描述
val address: String? = null,//维修地址
val repairPoint: String? = null,//维修点名称
val vehicleRepairId: Int? = null,//维修点Id
val longitude: Double? = null,//维保地址经度
val latitude: Double? = null,//维保地址纬度
val storePhotoUrls: String? = null,//门店照片
val paymentType: Int? = null,//支付类型 1挂账 2现金
val amount: Double? = null,//维保金额
val mileage: Double? = null,//车辆里程数
val information: String? = null,//维保信息
val maintenancePhotoUrls: String? = null,//维保照片/项目照片
val voucherPhotoUrls: String? = null,//维保清单/凭证照片
val auditRemark: String? = null,//维保审核备注
val createTime: String? = null,//创建时间
val updateTime: String? = null//修改时间
)
data class VehicleRepairPointMatcherItem(
val id: Int? = null,
val repairName: String? = null,
val repairLon: Double? = null,
val repairLat: Double? = null,
val repairAddress: String? = null,
val supplierId: Int? = null,
val distance: Double? = null,
val isSelected: Boolean? = false,
)
data class VehicleRepairPointMatcherListRequest(
val vehicleId: Int? = null,
val address: String? = null,
val longitude: Double? = null,
val latitude: Double? = null)
data class VehicleMaintenanceSubmitRequest(
val id: Int? = null,//维保记录ID
val vehicleId: Int? = null,//车辆ID
val driverId: Int? = null,//司机ID
val submitType: Int? = null,//提交类型 1维修开始申请 2维保完成申请
val address: String? = null,//维修地址
val longitude: Double? = null,//维修地址经度
val latitude: Double? = null,//维修地址纬度
val vehicleRepairId: Int? = null,//维修点Id
val storePhotoUrls: String? = null,//门店照片
val paymentType: Int? = null,//支付类型和结算类型
val amount: Double? = null,//维保金额
val mileage: Int? = null,//车辆里程数
val information: String? = null,//维保信息/项目
val maintenancePhotoUrls: String? = null,//维保照片/项目照片
val voucherPhotoUrls: String? = null,//维保清单/凭证照片
val auditRemark: String? = null,//维保审核备注
val remark: String? = null//维保备注
)

View File

@ -0,0 +1,75 @@
package com.za.bean.request
data class UpdateTaskRequest(
val id: Int? = null,
val type: String? = null,
val taskId: Int? = null,
val userId: Int? = null,
val vehicleId: Int? = null,
val currentState: String? = null,
val operateTime: String? = null,
val lat: Double? = null,
val lng: Double? = null,
val address: String? = null,
val offlineMode: Int? = null,
val content: String? = null, //验证输入内容
val newCarCode: String? = null,
val flowType: Int? = null,
val success: Int? = null, //作业是否完成 0 成功 1不成功 拖车默认成功
val templatePhotoInfoList: List<String?>? = null
)
data class UpdateTaskBean(val nextState: String? = null, val address: Long? = null)
data class TaskFinishResponse(
val nextState: String? = null,
val advanceTime: Long? = null,
val electronOrderState: Int? = null,
)
data class UpdateOrderConfirmTaskRequest(
val type: String? = null,
val taskId: Int? = null,
val userId: Int? = null,
val vehicleId: Int? = null,
val currentState: String? = null,
val operateTime: String? = null,
val offlineMode: Int? = null,
val supplierType: Int? = null,
val settleType: Int? = null,
val success: Int? = null,
val lat: Double? = null,
val lng: Double? = null,
val carryMileage:Int?=null,
val startMileage:Int?=null,
//老系统
val wheelFee: Int? = null,
//子公司
val startPrice: Int? = null,
val unitPrice: Double? = null,
val mileage: Int? = null,
val basePrice: Double? = null,
val startRoadFee: Int? = null,
val carryRoadFee: Int? = null,
val waitFee: Int? = null,
val wheelNum: Int? = null,
val wheelPrice: Int? = null,
val dilemmaFee: Int? = null,
val basementFee: Int? = null,
val assistFee: Double? = null,
val totalFee: Double? = null,
val img1: String? = null,
val img2: String? = null,
val img3: String? = null,
val img4: String? = null,
val img1Info: String? = null,
val img2Info: String? = null,
val img3Info: String? = null,
val img4Info: String? = null,
val imgList: List<String>? = null,
val imgInfoList: List<String>? = null,
val templatePhotoInfoList: List<String?>? = null
)

View File

@ -0,0 +1,11 @@
package com.za.bean.request
data class UploadGpsRequest(
var vehicleId: Int? = null,
var userId: Int? = null,
var lat: Double? = null,
var lng: Double? = null,
var speed: Double? = null,
var direction: Double? = null,
var working: Boolean? = false,
)

View File

@ -0,0 +1,19 @@
package com.za.bean.request
//车辆列表请求
data class VehicleListRequest(
val supplierCode: String? = null,
val content: String? = null
)
data class UpdateVehicleStateRequest(
val vehicleId: Int? = null,
val status: Int? = null,
val userId: Int? = null,
)
data class GeneralInfoRequest(
val vehicleId: Int? = null,
val driverId: Int? = null,
val deviceId: String? = null,
)

Some files were not shown because too many files have changed in this diff Show More