1. StarCloudAPI.verifyPickupCode 解析 B660 回傳的 product_id(數字且可能為 JSON null,改用 optInt 避免 optString 把 null 轉成 "null" 字串),PickupVerificationCallback.onSuccess 新增 productId 參數。 2. FontendPickupCodeDialog.onSuccess 依回傳分流:有 product_id(綁商品碼)→ getSlotDataByPid 取代表貨道 + allocateBuyStructures 自挑可出貨道(已濾 count>0 && !lock && !expired,壞一條自動換同商品下一條);無 product_id(舊綁貨道碼)→ 沿用原 slot_no 路徑,向後相容。 3. 綁商品碼若挑不到可出貨道(全缺貨/鎖定/過期)→ 提示缺貨並取消。 4. 升 verPatch 26→29(S9XYU OTA:versionName 21_02_29、versionCode 210229)。
171 lines
6.3 KiB
Groovy
171 lines
6.3 KiB
Groovy
plugins {
|
||
alias(libs.plugins.android.application)
|
||
alias(libs.plugins.kotlin.android)
|
||
}
|
||
|
||
// =========================================================================
|
||
// 核心版號與自動連動定義
|
||
// 每次發佈新版本給機台時,只需遞增 verPatch (修補版號)。
|
||
// 螢幕尺寸 (verMajor) 已改為下方依據編譯 Flavor (S12XYU / S9XYU) 自動動態判定,
|
||
// 避免不同尺寸機台間版本號產生衝突。
|
||
// =========================================================================
|
||
def verMinor = 2
|
||
def verPatch = 29
|
||
|
||
|
||
|
||
android {
|
||
namespace 'com.unibuy.smartdevice'
|
||
compileSdk 35
|
||
|
||
defaultConfig {
|
||
applicationId "com.unibuy.smartdevice"
|
||
minSdk 21
|
||
targetSdk 34
|
||
// 預設以 10 吋進行基礎 Sync 估算,實際打包會由下方 applicationVariants 動態覆寫
|
||
versionCode 10 * 10000 + verMinor * 100 + verPatch
|
||
versionName "10_0${verMinor}_${verPatch}_R"
|
||
|
||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||
}
|
||
|
||
// =====================================================================
|
||
// 單維度 Flavor:hardware(硬體規格 / IPC 世代)
|
||
// 客戶專案(購買流程)已收斂為執行期 shopping_mode(雲端 B014 下發),不再用 flavor 分家。
|
||
// hardware 維度決定螢幕尺寸、minSdk(安卓版本)與 COM port(見 ComPort.getFilepath)。
|
||
// =====================================================================
|
||
flavorDimensions "hardware"
|
||
|
||
productFlavors {
|
||
S12XYU {
|
||
dimension "hardware"
|
||
}
|
||
|
||
S9XYU {
|
||
dimension "hardware"
|
||
minSdk 28
|
||
}
|
||
}
|
||
|
||
// =====================================================================
|
||
// 共用簽章金鑰(OTA 鐵律)
|
||
// 現場機台的 App 全部以這把 key 簽章;OTA 覆蓋安裝要求新舊 APK 簽章一致,
|
||
// 否則 INSTALL_FAILED_UPDATE_INCOMPATIBLE。過去依賴各電腦自動生成的
|
||
// ~/.android/debug.keystore(每台不同)→ 換電腦編就無法 OTA。
|
||
// 改為指向 repo 內固定 keystore,任何電腦 / compiler-apk / release-apk 皆共用同一把。
|
||
// 指紋 SHA1: 23:57:65:A1:AA:86:21:5C:78:A7:20:4C:AB:5B:38:B7:A2:93:5C:8F
|
||
// =====================================================================
|
||
signingConfigs {
|
||
debug {
|
||
storeFile file("signing/taiwanstar.keystore")
|
||
storePassword "android"
|
||
keyAlias "androiddebugkey"
|
||
keyPassword "android"
|
||
}
|
||
}
|
||
|
||
buildTypes {
|
||
release {
|
||
minifyEnabled false
|
||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||
signingConfig signingConfigs.debug
|
||
}
|
||
}
|
||
|
||
// 自定義打包檔案名稱與動態版本號計算
|
||
// 遵循公司命名規範:來源_安卓號_主板號_機器系列_專案名稱_螢幕大小_次版號_修補版號_環境
|
||
applicationVariants.all { variant ->
|
||
def hardware = variant.productFlavors[0].name // hardware dimension(唯一維度)
|
||
def buildType = variant.buildType.name
|
||
|
||
// 根據硬體規格自動動態判定螢幕吋數 (verMajor) 與版號
|
||
def verMajor = 10
|
||
def calculatedMinor = verMinor // 預設套用全域次版號
|
||
def calculatedPatch = verPatch // 預設套用全域修補版號
|
||
|
||
if (hardware == "S9XYU") {
|
||
verMajor = 21 // 21.5 吋
|
||
|
||
// 【預留擴充】若中國醫安卓 9 機台未來需要獨立的發版節奏,可直接在此單獨覆寫:
|
||
// calculatedMinor = 1
|
||
// calculatedPatch = 6
|
||
} else if (hardware == "S12XYU") {
|
||
verMajor = 10 // 10 吋
|
||
}
|
||
|
||
// 環境後綴:release → R(正式)、debug → D(測試),供現場一眼辨識 APK 來源
|
||
def envSuffix = (buildType == "release") ? "R" : "D"
|
||
|
||
// 動態重算並覆寫此 Variant 的版本號,避免互相污染
|
||
def calculatedVersionCode = verMajor * 10000 + calculatedMinor * 100 + calculatedPatch
|
||
def calculatedVersionName = "${verMajor}_0${calculatedMinor}_${calculatedPatch}_${envSuffix}"
|
||
|
||
|
||
variant.outputs.each { output ->
|
||
output.versionCodeOverride = calculatedVersionCode
|
||
output.versionNameOverride = calculatedVersionName
|
||
|
||
// 將 hardware flavor 名稱展開為公司規範格式 S12XYU → S_12_XY_U
|
||
def hwFormatted = hardware
|
||
.replaceAll(/^([A-Z])(\d+)([A-Z]+)([A-Z])$/, '$1_$2_$3_$4')
|
||
|
||
// 輸出範例:app-S_12_XY_U-10_08_8_R-release.apk(依硬體分版,購買流程由雲端 shopping_mode 決定)
|
||
output.outputFileName = "app-${hwFormatted}-${calculatedVersionName}-${buildType}.apk"
|
||
}
|
||
}
|
||
|
||
|
||
|
||
compileOptions {
|
||
sourceCompatibility JavaVersion.VERSION_11
|
||
targetCompatibility JavaVersion.VERSION_11
|
||
}
|
||
|
||
kotlinOptions {
|
||
jvmTarget = '11'
|
||
}
|
||
|
||
buildFeatures {
|
||
viewBinding true
|
||
buildConfig true
|
||
}
|
||
|
||
packaging {
|
||
resources {
|
||
excludes += ['META-INF/INDEX.LIST', 'META-INF/io.netty.versions.properties']
|
||
}
|
||
}
|
||
}
|
||
|
||
dependencies {
|
||
implementation libs.appcompat
|
||
implementation libs.material
|
||
implementation libs.activity
|
||
implementation libs.constraintlayout
|
||
implementation libs.work.runtime
|
||
testImplementation libs.junit
|
||
androidTestImplementation libs.ext.junit
|
||
androidTestImplementation libs.espresso.core
|
||
|
||
annotationProcessor libs.compiler
|
||
implementation libs.usb.serial.for.android
|
||
implementation libs.android.serialport
|
||
implementation libs.glide
|
||
implementation libs.media3.exoplayer
|
||
implementation libs.media3.ui
|
||
implementation libs.tsnackBar
|
||
|
||
implementation 'com.blankj:utilcodex:1.31.1'
|
||
implementation 'com.hivemq:hivemq-mqtt-client:1.3.3'
|
||
implementation 'io.netty:netty-codec-http:4.1.94.Final'
|
||
implementation 'io.netty:netty-handler:4.1.94.Final'
|
||
implementation 'com.google.code.gson:gson:2.10.1'
|
||
|
||
// Kotlin / MVVM(basic 模式的多品項購物車)
|
||
implementation libs.kotlin.stdlib
|
||
implementation libs.lifecycle.viewmodel.ktx
|
||
implementation libs.lifecycle.livedata.ktx
|
||
implementation libs.lifecycle.runtime.ktx
|
||
implementation libs.brvah
|
||
}
|