diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/activity/HomeActivity.kt b/app/src/main/java/com/shuwei/intelligent/shelves/activity/HomeActivity.kt index f3cd8fe..37c8996 100644 --- a/app/src/main/java/com/shuwei/intelligent/shelves/activity/HomeActivity.kt +++ b/app/src/main/java/com/shuwei/intelligent/shelves/activity/HomeActivity.kt @@ -32,8 +32,6 @@ import com.shuwei.intelligent.shelves.net.RespData import com.shuwei.intelligent.shelves.net.UiState import com.shuwei.intelligent.shelves.net.apiService import com.shuwei.intelligent.shelves.serial.SerialPortManager -import com.shuwei.intelligent.shelves.task.SyncTask -import com.shuwei.intelligent.shelves.task.TaskManager import com.shuwei.intelligent.shelves.utils.HexUtils import com.shuwei.intelligent.shelves.utils.IntervalExecutor import com.shuwei.intelligent.shelves.utils.binaryToHex @@ -42,9 +40,8 @@ import com.shuwei.intelligent.shelves.utils.ext.gone import com.shuwei.intelligent.shelves.utils.ext.toJsonString import com.shuwei.intelligent.shelves.utils.ext.toast import com.shuwei.intelligent.shelves.utils.ext.visible -import com.shuwei.intelligent.shelves.utils.f2C import com.shuwei.intelligent.shelves.utils.hexToBinary -import com.shuwei.intelligent.shelves.utils.hexToDec +import kotlinx.coroutines.Job import kotlinx.coroutines.launch import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe @@ -85,7 +82,8 @@ class HomeActivity : BaseActivity() { //410激活码 // const val ACTIVE_CMD = "${HEADER}000281C5D70A7D42894EA17650F5D0BB516838E7863C9ABD766C38958AFF0F3C062D${FOOTER}" //1楼餐厅 - const val ACTIVE_CMD = "${HEADER}000281C5D70A7D428B44A57454F5DACA241938938B4B9CBD73673E9C8E7FC0C4992D${FOOTER}" + const val ACTIVE_CMD = + "${HEADER}000281C5D70A7D428B44A57454F5DACA241938938B4B9CBD73673E9C8E7FC0C4992D${FOOTER}" //华氏温度单位 const val F_TEMP_CMD = "${HEADER}0F01390000${FOOTER}" @@ -174,7 +172,8 @@ class HomeActivity : BaseActivity() { // TaskManager.startTask() - startTask() + saveGoodsTask() + overdueTask() // var androidId = Settings.Secure.getString(contentResolver, Settings.Secure.ANDROID_ID) //// androidId = "d0e7a2d5f25c775c" @@ -598,7 +597,9 @@ class HomeActivity : BaseActivity() { lifecycleScope.launch { SerialPortManager.close() } - TaskManager.cancelTask() +// TaskManager.cancelTask() + saveTaskJob?.cancel() + overdueTaskJob?.cancel() EventBus.getDefault().unregister(this) super.onDestroy() } @@ -736,15 +737,44 @@ class HomeActivity : BaseActivity() { shelfAdapter.notifyItemChanged(list.indexOf(item)) } - private val intervalExecutor by lazy { IntervalExecutor() } + private val taskExecutor by lazy { IntervalExecutor() } + private var saveTaskJob: Job?=null - private fun startTask() { - intervalExecutor.startIntervalTaskWithInitialDelay(2*1000L,2*1000L) { + /** + * 保存定时任务 + */ + private fun saveGoodsTask() { + saveTaskJob = taskExecutor.startIntervalTaskWithInitialDelay(1 * 60 * 1000L, 5 * 60 * 1000L) { saveShelfGoodsList() } } - private suspend fun saveShelfGoodsList() { + private var overdueTaskJob: Job?=null + + /** + * 过期时间定时任务 + */ + private fun overdueTask() { + overdueTaskJob = taskExecutor.startIntervalTaskWithInitialDelay(5 * 1000L, 10 * 1000L) { + updateOverdueState() + } + } + + private fun updateOverdueState() { + viewModel.updateOverdueState { state, items -> + if (items.isNullOrEmpty()) return@updateOverdueState + list.forEachIndexed { index, model -> + //接口过期状态变化后更新状态 + if (items[index].overdue != model.overdue) { + model.overdue = items[index].overdue + shelfAdapter.notifyItemChanged(index) + log("更新编号为${model.deviceNo}物品:${model.goodsName}的过期状态:${model.overdue}") + } + } + } + } + + private fun saveShelfGoodsList() { log("performSync: list:${list.toJsonString()}") val submitList = list.sortedBy { it.deviceNo } submitList.forEach { @@ -764,14 +794,8 @@ class HomeActivity : BaseActivity() { it.goodsList = submitList } log("performSync: body:${body.toJsonString()}") - try { - val resp = apiService.saveShelfGoodsList(body = body) - log("performSync: resp:${resp.toJsonString()}") - } catch (e: Exception) { - e.printStackTrace() - } + viewModel.saveShelfGoodsList(body) } - } \ No newline at end of file diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/activity/ShelfActivity.kt b/app/src/main/java/com/shuwei/intelligent/shelves/activity/ShelfActivity.kt index 9564974..db3d4d1 100644 --- a/app/src/main/java/com/shuwei/intelligent/shelves/activity/ShelfActivity.kt +++ b/app/src/main/java/com/shuwei/intelligent/shelves/activity/ShelfActivity.kt @@ -30,7 +30,6 @@ import com.shuwei.intelligent.shelves.net.Loading import com.shuwei.intelligent.shelves.net.NetViewModel import com.shuwei.intelligent.shelves.net.RespData import com.shuwei.intelligent.shelves.net.UiState -import com.shuwei.intelligent.shelves.task.TaskManager import com.shuwei.intelligent.shelves.utils.DateTimeUtil import com.shuwei.intelligent.shelves.utils.KeyboardUtil import com.shuwei.intelligent.shelves.utils.ext.addOnActionSearchListener @@ -176,7 +175,7 @@ class ShelfActivity : BaseActivity() { } getGoodsList() - TaskManager.startDeviceTask() +// TaskManager.startDeviceTask() } private fun finishRefresh() { @@ -281,7 +280,7 @@ class ShelfActivity : BaseActivity() { override fun onDestroy() { // unregisterReceiver(receiver) EventBus.getDefault().unregister(this) - TaskManager.cancelDeviceTask() +// TaskManager.cancelDeviceTask() super.onDestroy() } diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/net/NetViewModel.kt b/app/src/main/java/com/shuwei/intelligent/shelves/net/NetViewModel.kt index 5d72b1f..1457bda 100644 --- a/app/src/main/java/com/shuwei/intelligent/shelves/net/NetViewModel.kt +++ b/app/src/main/java/com/shuwei/intelligent/shelves/net/NetViewModel.kt @@ -1,10 +1,13 @@ package com.shuwei.intelligent.shelves.net +import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.shuwei.intelligent.shelves.App import com.shuwei.intelligent.shelves.model.ShelfBody +import com.shuwei.intelligent.shelves.model.ShelfModel import com.shuwei.intelligent.shelves.net.HttpManager.Companion.instance +import com.shuwei.intelligent.shelves.utils.ext.toJsonString import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch @@ -105,6 +108,21 @@ class NetViewModel : ViewModel() { } } + fun updateOverdueState(block:(Boolean, List?)-> Unit) { + viewModelScope.launch { + runCatching { + val response = apiService.getShelfList(deviceId = App.deviceId) + if (response.isSuccess()) { + block(true, response.data?.containerGoodsList) + } else { + block(false, emptyList()) + } + }.onFailure { + block(false, null) + } + } + } + // fun saveShelfGoodsList(body: ShelfBody) { // viewModelScope.launch { // _saveShelfGoodsListUiState.value = UiState.Loading @@ -150,4 +168,17 @@ class NetViewModel : ViewModel() { } } + fun saveShelfGoodsList(body: ShelfBody) { + viewModelScope.launch { + runCatching { + val resp = apiService.saveShelfGoodsList(body = body) + Log.d("NetViewModel", "saveShelfGoodsList,performSync: resp:${resp.toJsonString()}") + }.onFailure { + it.printStackTrace() + Log.d("NetViewModel", "saveShelfGoodsList异常:${it.message}") + } + } + + } + } diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/task/SyncDeviceTask.kt b/app/src/main/java/com/shuwei/intelligent/shelves/task/SyncDeviceTask.kt index 6049f3e..8ffe599 100644 --- a/app/src/main/java/com/shuwei/intelligent/shelves/task/SyncDeviceTask.kt +++ b/app/src/main/java/com/shuwei/intelligent/shelves/task/SyncDeviceTask.kt @@ -1,32 +1,32 @@ -package com.shuwei.intelligent.shelves.task - -import android.content.Context -import android.util.Log -import androidx.work.CoroutineWorker -import androidx.work.WorkerParameters -import com.shuwei.intelligent.shelves.activity.HomeActivity -import com.shuwei.intelligent.shelves.serial.SerialPortManager - -class SyncDeviceTask(appContext: Context, workerParams: WorkerParameters) : - CoroutineWorker(appContext, workerParams) { - - companion object { - private const val TAG = "SyncDeviceTask" - } - - override suspend fun doWork(): Result { - return try { - // 执行后台任务逻辑 - Log.d(TAG, "doWork: ----------SyncDeviceTask----------") - SerialPortManager.send(HomeActivity.DEVICE_INFO_CMD) - - TaskManager.startDeviceTask() - - Result.success() - } catch (e: Exception) { - e.printStackTrace() - Result.retry() - } - } - -} \ No newline at end of file +//package com.shuwei.intelligent.shelves.task +// +//import android.content.Context +//import android.util.Log +//import androidx.work.CoroutineWorker +//import androidx.work.WorkerParameters +//import com.shuwei.intelligent.shelves.activity.HomeActivity +//import com.shuwei.intelligent.shelves.serial.SerialPortManager +// +//class SyncDeviceTask(appContext: Context, workerParams: WorkerParameters) : +// CoroutineWorker(appContext, workerParams) { +// +// companion object { +// private const val TAG = "SyncDeviceTask" +// } +// +// override suspend fun doWork(): Result { +// return try { +// // 执行后台任务逻辑 +// Log.d(TAG, "doWork: ----------SyncDeviceTask----------") +// SerialPortManager.send(HomeActivity.DEVICE_INFO_CMD) +// +// TaskManager.startDeviceTask() +// +// Result.success() +// } catch (e: Exception) { +// e.printStackTrace() +// Result.retry() +// } +// } +// +//} \ No newline at end of file diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/task/SyncTask.kt b/app/src/main/java/com/shuwei/intelligent/shelves/task/SyncTask.kt index 6f3af60..2a3a808 100644 --- a/app/src/main/java/com/shuwei/intelligent/shelves/task/SyncTask.kt +++ b/app/src/main/java/com/shuwei/intelligent/shelves/task/SyncTask.kt @@ -1,67 +1,67 @@ -package com.shuwei.intelligent.shelves.task - -import android.content.Context -import android.util.Log -import androidx.work.CoroutineWorker -import androidx.work.WorkerParameters -import com.shuwei.intelligent.shelves.App -import com.shuwei.intelligent.shelves.activity.HomeActivity -import com.shuwei.intelligent.shelves.model.ShelfBody -import com.shuwei.intelligent.shelves.net.apiService -import com.shuwei.intelligent.shelves.utils.ext.toJsonString -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext - -class SyncTask(appContext: Context, workerParams: WorkerParameters) : - CoroutineWorker(appContext, workerParams) { - - companion object { - private const val TAG = "SyncTask" - } - - override suspend fun doWork(): Result { - return try { - // 执行后台任务逻辑 - performSync() - - TaskManager.startTask() - - Result.success() - } catch (e: Exception) { - e.printStackTrace() - Result.retry() - } - } - - private suspend fun performSync() { - withContext(Dispatchers.IO) { - val list = HomeActivity.list - Log.d(TAG, "performSync: list:${list.toJsonString()}") - val submitList = list.sortedBy { it.deviceNo } - submitList.forEach { - if (it.goodsId.isNullOrBlank()) { - it.weight = it.weightBak - } - } +//package com.shuwei.intelligent.shelves.task +// +//import android.content.Context +//import android.util.Log +//import androidx.work.CoroutineWorker +//import androidx.work.WorkerParameters +//import com.shuwei.intelligent.shelves.App +//import com.shuwei.intelligent.shelves.activity.HomeActivity +//import com.shuwei.intelligent.shelves.model.ShelfBody +//import com.shuwei.intelligent.shelves.net.apiService +//import com.shuwei.intelligent.shelves.utils.ext.toJsonString +//import kotlinx.coroutines.Dispatchers +//import kotlinx.coroutines.withContext +// +//class SyncTask(appContext: Context, workerParams: WorkerParameters) : +// CoroutineWorker(appContext, workerParams) { +// +// companion object { +// private const val TAG = "SyncTask" +// } +// +// override suspend fun doWork(): Result { +// return try { +// // 执行后台任务逻辑 +// performSync() +// +// TaskManager.startTask() +// +// Result.success() +// } catch (e: Exception) { +// e.printStackTrace() +// Result.retry() +// } +// } +// +// private suspend fun performSync() { +// withContext(Dispatchers.IO) { +// val list = HomeActivity.list +// Log.d(TAG, "performSync: list:${list.toJsonString()}") +// val submitList = list.sortedBy { it.deviceNo } // submitList.forEach { +// if (it.goodsId.isNullOrBlank()) { +// it.weight = it.weightBak +// } +// } +//// submitList.forEach { +//// it.temperature = HomeActivity.showTemperatureC +//// it.humidity = HomeActivity.showHumidity +//// } +// val body = ShelfBody().also { +// it.deviceId = App.deviceId +// it.canteenId = App.canteenId // it.temperature = HomeActivity.showTemperatureC // it.humidity = HomeActivity.showHumidity +// it.goodsList = submitList // } - val body = ShelfBody().also { - it.deviceId = App.deviceId - it.canteenId = App.canteenId - it.temperature = HomeActivity.showTemperatureC - it.humidity = HomeActivity.showHumidity - it.goodsList = submitList - } - Log.d(TAG, "performSync: body:${body.toJsonString()}") - try { - val resp = apiService.saveShelfGoodsList(body = body) - Log.d(TAG, "performSync: resp:${resp.toJsonString()}") - } catch (e: Exception) { - e.printStackTrace() - } - } - } - -} \ No newline at end of file +// Log.d(TAG, "performSync: body:${body.toJsonString()}") +// try { +// val resp = apiService.saveShelfGoodsList(body = body) +// Log.d(TAG, "performSync: resp:${resp.toJsonString()}") +// } catch (e: Exception) { +// e.printStackTrace() +// } +// } +// } +// +//} \ No newline at end of file diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/task/TaskManager.kt b/app/src/main/java/com/shuwei/intelligent/shelves/task/TaskManager.kt index 34aeeb0..3e4a086 100644 --- a/app/src/main/java/com/shuwei/intelligent/shelves/task/TaskManager.kt +++ b/app/src/main/java/com/shuwei/intelligent/shelves/task/TaskManager.kt @@ -1,59 +1,59 @@ -package com.shuwei.intelligent.shelves.task - -import androidx.work.ExistingWorkPolicy -import androidx.work.OneTimeWorkRequestBuilder -import androidx.work.WorkManager -import com.shuwei.intelligent.shelves.App -import java.util.concurrent.TimeUnit - -object TaskManager { - const val TASK_NAME = "IntelligentShelvesSyncTask" - const val DEVICE_TASK_NAME = "IntelligentShelvesDeviceTask" - - fun startTask() { - val nextRequest = OneTimeWorkRequestBuilder() - .setInitialDelay(2, TimeUnit.MINUTES) -// .setInitialDelay(30, TimeUnit.SECONDS) -// .setInitialDelay(10, TimeUnit.MINUTES) -// .setInputData(inputData) - .build() - WorkManager.getInstance(App.getInstance()) - .enqueueUniqueWork(TASK_NAME, ExistingWorkPolicy.REPLACE, nextRequest) - -// val constraints = Constraints.Builder() -// .setRequiredNetworkType(NetworkType.CONNECTED) -// .setRequiresBatteryNotLow(true) +//package com.shuwei.intelligent.shelves.task +// +//import androidx.work.ExistingWorkPolicy +//import androidx.work.OneTimeWorkRequestBuilder +//import androidx.work.WorkManager +//import com.shuwei.intelligent.shelves.App +//import java.util.concurrent.TimeUnit +// +//object TaskManager { +// const val TASK_NAME = "IntelligentShelvesSyncTask" +// const val DEVICE_TASK_NAME = "IntelligentShelvesDeviceTask" +// +// fun startTask() { +// val nextRequest = OneTimeWorkRequestBuilder() +// .setInitialDelay(2, TimeUnit.MINUTES) +//// .setInitialDelay(30, TimeUnit.SECONDS) +//// .setInitialDelay(10, TimeUnit.MINUTES) +//// .setInputData(inputData) // .build() -// val syncRequest = PeriodicWorkRequestBuilder( -// 3L, TimeUnit.MINUTES, // 最小间隔15分钟 -// 3L, TimeUnit.MINUTES // 弹性时间窗口 -// ) -// .setConstraints(constraints) +// WorkManager.getInstance(App.getInstance()) +// .enqueueUniqueWork(TASK_NAME, ExistingWorkPolicy.REPLACE, nextRequest) +// +//// val constraints = Constraints.Builder() +//// .setRequiredNetworkType(NetworkType.CONNECTED) +//// .setRequiresBatteryNotLow(true) +//// .build() +//// val syncRequest = PeriodicWorkRequestBuilder( +//// 3L, TimeUnit.MINUTES, // 最小间隔15分钟 +//// 3L, TimeUnit.MINUTES // 弹性时间窗口 +//// ) +//// .setConstraints(constraints) +//// .build() +//// WorkManager.getInstance(App.get()) +//// .enqueueUniquePeriodicWork( +//// TASK_NAME, +//// ExistingPeriodicWorkPolicy.KEEP, +//// syncRequest +//// ) +// } +// +// fun cancelTask() { +// WorkManager.getInstance(App.getInstance()) +// .cancelUniqueWork(TASK_NAME) +// } +// +// fun startDeviceTask() { +// val nextRequest = OneTimeWorkRequestBuilder() +// .setInitialDelay(2, TimeUnit.MINUTES) // .build() -// WorkManager.getInstance(App.get()) -// .enqueueUniquePeriodicWork( -// TASK_NAME, -// ExistingPeriodicWorkPolicy.KEEP, -// syncRequest -// ) - } - - fun cancelTask() { - WorkManager.getInstance(App.getInstance()) - .cancelUniqueWork(TASK_NAME) - } - - fun startDeviceTask() { - val nextRequest = OneTimeWorkRequestBuilder() - .setInitialDelay(2, TimeUnit.MINUTES) - .build() - WorkManager.getInstance(App.getInstance()) - .enqueueUniqueWork(DEVICE_TASK_NAME, ExistingWorkPolicy.REPLACE, nextRequest) - } - - fun cancelDeviceTask() { - WorkManager.getInstance(App.getInstance()) - .cancelUniqueWork(DEVICE_TASK_NAME) - } - -} \ No newline at end of file +// WorkManager.getInstance(App.getInstance()) +// .enqueueUniqueWork(DEVICE_TASK_NAME, ExistingWorkPolicy.REPLACE, nextRequest) +// } +// +// fun cancelDeviceTask() { +// WorkManager.getInstance(App.getInstance()) +// .cancelUniqueWork(DEVICE_TASK_NAME) +// } +// +//} \ No newline at end of file