Compare commits

...

4 Commits
demo ... main

Author SHA1 Message Date
sky121113
abe3ac14c1 Merge branch 'dev' into main for release v21.1.67 2026-06-04 16:29:04 +08:00
sky121113
0637f71e34 [FIX] 優化機台鎖定防護流程與遞增版本號
1. 遞增修補版號 verPatch 至 67 以落實機台 OTA 更新規範。
2. 於 FontendActivity 的 onCreate 流程新增機台鎖定狀態檢查,若鎖定則強制跳轉至 MaintenanceActivity 並清除 Activity 棧。
3. 修正 MqttService 的鎖定命令跳轉旗標,改用 Intent.FLAG_ACTIVITY_CLEAR_TASK 確保舊 Activity 棧被完整清理。
4. 移除 AppUtils 中未使用的 MqttManager 引用。
2026-06-04 16:07:31 +08:00
sky121113
0967f8445e Merge branch 'dev' into main for release 65 2026-06-02 16:01:05 +08:00
sky121113
31a073475e [PROMOTE] 晉升開發分支 dev 至生產分支 main
包含以下主要功能與修復:
1. [FIX] 修正 OTA 連線超時與首頁執行緒併發競態導致 UI 異常問題 (808b9c4)
2. [FEAT] 優化 OTA 靜默安裝邏輯,支援降版本覆蓋安裝 (8768e95)
3. [STYLE] 優化 CMUH 專屬佈局元件比例與樣式排版 (2ea55b9)
4. [FEAT] 新增 CMUH 客製初始畫面跳轉與多處頁面重啟邏輯優化 (7b9b96c)
5. [FIX] 修正中國醫 (CMUH) 領藥異常處理與銷貨流水號關聯 (4c9fb5e)
6. [FIX] 實作半途出貨失敗的 MQTT Finalize 結案回報機制 (b2b6776)
7. [REFACTOR] 優化中國醫(Cmuh)售貨與領藥流程,並重構 API 連線模組 (71a0591)
8. [FEAT] 主控台 UI 全面翻新 (Console UI Overhaul) (984bbe7)
9. [REFACTOR] 重構銷售流程至雙維度 Flavor 架構與版本計算規範 (3409f93)
10. [FEAT] 新增遠端 MQTT 應用程式 OTA 更新功能與雙版號動態計算機制 (e15d020)
2026-06-02 10:52:50 +08:00
6 changed files with 50 additions and 29 deletions

View File

@ -68,8 +68,17 @@ S _ 12 _ XY _ U _ Chengwai _ 10 _ 08 _ 8 _ R
* **`Cmuh`** (中國醫客製):支援 QR Code 掃碼、處方籤醫令離線 AES 解密與解析領藥流程。
2. **`hardware` 維度 (硬體與系統規格區隔)**
* **`S12XYU`**:代表 `S` (來源) + `12` (安卓號) + `XY` (主板號) + `U` (機器系列/機型規格)。
* **`S9XYU`**:代表中國醫現場使用的 Android 9 / 21.5 吋硬體規格;除非明確指定中國醫 10 吋或 `S12XYU`,中國醫 (`Cmuh`) 相關修正與驗證預設必須使用此硬體 flavor。
### 4.2 實體機台 APK 命名鐵律
### 4.2 Flavor 驗證與編譯指令選擇
針對特定客戶或現場問題修改後,必須編譯對應的 Gradle variant不可只用通用 `assembleDebug` 或錯誤硬體 flavor 代替。
* **中國醫現場版 (`Cmuh`) 驗證指令**`./gradlew :app:assembleCmuhS9XYUDebug --no-daemon`
* **晟崴版 (`Chengwai`) 預設驗證指令**`./gradlew :app:assembleChengwaiS12XYUDebug --no-daemon`
* **通用版 (`General`) 預設驗證指令**`./gradlew :app:assembleGeneralS12XYUDebug --no-daemon`
### 4.3 實體機台 APK 命名鐵律
為了符合實體機台 OTA 平台發佈規範,打包輸出的 APK 檔名必須嚴格連動雙維度,並遵循以下格式:
`app-[格式化硬體規格]_[專案名稱]-[版本號]-[BuildType].apk`

View File

@ -24,6 +24,7 @@
- 禁止直接手改成品 `versionCode`/`versionName` 值。
- 版號管理透過 `verMajor`、`verMinor`、`verPatch` 變數。
- OTA 發版時,`versionCode` 必須嚴格遞增。
- 中國醫現場版 (`Cmuh`) 修正預設以 `:app:assembleCmuhS9XYUDebug` 驗證。
## When Rules Conflict

View File

@ -9,7 +9,8 @@ plugins {
//
// =========================================================================
def verMinor = 1
def verPatch = 66
def verPatch = 67
android {

View File

@ -138,7 +138,7 @@ public class MqttService extends Service {
new android.os.Handler(android.os.Looper.getMainLooper()).post(() -> {
Intent lockIntent = new Intent(getApplicationContext(),
com.unibuy.smartdevice.ui.MaintenanceActivity.class);
lockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
lockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(lockIntent);
});
} else if ("unlock".equals(cmd)) {

View File

@ -1,26 +1,23 @@
package com.unibuy.smartdevice.tools;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import com.unibuy.smartdevice.external.mqtt.MqttManager;
import com.unibuy.smartdevice.ui.FontendActivity;
public class AppUtils {
public static void resetApp(Context context) {
Intent intent = new Intent(context, FontendActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(
context, 0, intent, PendingIntent.FLAG_IMMUTABLE);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setExact(AlarmManager.RTC, System.currentTimeMillis() + 500, pendingIntent);
android.os.Process.killProcess(android.os.Process.myPid());
}
}
package com.unibuy.smartdevice.tools;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import com.unibuy.smartdevice.ui.FontendActivity;
public class AppUtils {
public static void resetApp(Context context) {
Intent intent = new Intent(context, FontendActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(
context, 0, intent, PendingIntent.FLAG_IMMUTABLE);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setExact(AlarmManager.RTC, System.currentTimeMillis() + 500, pendingIntent);
android.os.Process.killProcess(android.os.Process.myPid());
}
}

View File

@ -45,6 +45,7 @@ import androidx.fragment.app.FragmentManager;
import com.unibuy.smartdevice.R;
import com.unibuy.smartdevice.controller.DevController;
import com.unibuy.smartdevice.controller.DevXinYuanController;
import com.unibuy.smartdevice.database.SettingsDao;
import com.unibuy.smartdevice.database.SlotsDao;
import com.unibuy.smartdevice.databinding.ActivityFontendBinding;
import com.unibuy.smartdevice.devices.DevNFCPay;
@ -407,6 +408,18 @@ public class FontendActivity extends AppCompatActivityAbstract implements SaleFl
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SettingsDao settingsDao = new SettingsDao(getApplicationContext());
if (settingsDao.isMachineLocked()) {
settingsDao.close();
Intent intent = new Intent(this, MaintenanceActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
finish();
return;
}
settingsDao.close();
// 讀取最後設定語言的設定
// LanguageHelper.applySavedLanguage(this);
binding = ActivityFontendBinding.inflate(getLayoutInflater());