diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/HomeActivity.kt b/app/src/main/java/com/shuwei/intelligent/shelves/HomeActivity.kt index df653f0..02241a0 100644 --- a/app/src/main/java/com/shuwei/intelligent/shelves/HomeActivity.kt +++ b/app/src/main/java/com/shuwei/intelligent/shelves/HomeActivity.kt @@ -13,7 +13,6 @@ import androidx.activity.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle -import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.GridLayoutManager import com.chad.library.adapter4.util.setOnDebouncedItemClick @@ -37,7 +36,6 @@ 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.delay import kotlinx.coroutines.launch import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe @@ -74,6 +72,10 @@ class HomeActivity : BaseActivity() { val weightArray = SparseArray() var shelfIndex = 0 // public fun getRealWeight():Double = weightArray[shelfIndex]?:0.0 + // 温度 + var showTemperatureC = "" + // 湿度 + var showHumidity = "0" } private lateinit var binding: ActivityHomeBinding @@ -134,6 +136,9 @@ class HomeActivity : BaseActivity() { var androidId = Settings.Secure.getString(contentResolver, Settings.Secure.ANDROID_ID) // androidId = "d0e7a2d5f25c775c" Log.d(TAG, "onCreate: androidId=${androidId}") + if (androidId == "65e1012638f78260" || androidId == "40f89e91ee40611d") { + androidId = "d0e7a2d5f25c775c" + } App.getInstance().deviceId = androidId //"53babf69-0d2f-3875-a649-f2e12f80ad4c1" @@ -258,7 +263,10 @@ class HomeActivity : BaseActivity() { // Log.d(TAG, "receiveSerialPortData:心跳08: $data") // heartBeat(data) // } - + "0202" -> { + //开关锁反馈 + lockFeedback(data) + } "0302" -> { //获取设备状态 getDeviceInfo(data) @@ -268,6 +276,34 @@ class HomeActivity : BaseActivity() { } } + private var fixedDataBody = "" + + private fun lockFeedback(data: String) { + runCatching { + val fixedDataBodyEndIndex = data.length - FOOTER.length + val fixedDataBodyStartIndex = HEADER.length + "0202".length + 42 + fixedDataBody = data.substring(fixedDataBodyStartIndex, fixedDataBodyEndIndex) + + val lockNo = if (list[shelfIndex].deviceNo in 1..5) "01" else "02" + val lockOneState = data.substring(HEADER.length + 4, HEADER.length + 6) + if (lockOneState == "00") { + //锁1关 + lifecycleScope.launch { + SerialPortManager.send("${HEADER}0202${lockNo}${FOOTER}") + } + } + val lockTwoState = data.substring(HEADER.length + 6, HEADER.length + 8) + if (lockTwoState == "00") { + //锁2关 + lifecycleScope.launch { + SerialPortManager.send("${HEADER}0202${lockNo}${FOOTER}") + } + } + }.onFailure { + it.printStackTrace() + } + } + private fun heartBeat(data: String) { runCatching { if (data.length < 200) { @@ -285,11 +321,11 @@ class HomeActivity : BaseActivity() { val temperatureHex = data.substring(temperatureStartIndex, temperatureEndIndex) val temperature = hexToDec(temperatureHex) val tempC = f2C(temperature.toDouble()) - val showTemp = "%.1f".format(tempC) + showTemperatureC = "%.1f".format(tempC) val percent = 10 * list.count { it.goodsName.isNullOrBlank().not() } - updateLeftStatus("1-1冷藏柜 ${showTemp}°C / ${percent}%") + updateLeftStatus("1-1冷藏柜 ${showTemperatureC}°C / ${percent}%") }.onFailure { it.printStackTrace() } @@ -349,11 +385,11 @@ class HomeActivity : BaseActivity() { val temperatureHex = data.substring(temperatureStartIndex, temperatureEndIndex) val temperature = hexToDec(temperatureHex) val tempC = f2C(temperature.toDouble()) - val showTemp = "%.1f".format(tempC) + showTemperatureC = "%.1f".format(tempC) val percent = 10 * list.count { it.goodsName.isNullOrBlank().not() } - updateLeftStatus("1-1冷藏柜 ${showTemp}°C / ${percent}%") + updateLeftStatus("1-1冷藏柜 ${showTemperatureC}°C / ${percent}%") getWeightInfo( start = weightStartIndex, @@ -396,7 +432,9 @@ class HomeActivity : BaseActivity() { goodsId = model.goodsId goodsName = model.goodsName weight = model.weight - createTime = model.createTime + if (model.createTime.isNullOrBlank().not()) { + createTime = model.createTime + } } notifyItemChanged(position) } diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/ShelfActivity.kt b/app/src/main/java/com/shuwei/intelligent/shelves/ShelfActivity.kt index d24ea82..89c0be7 100644 --- a/app/src/main/java/com/shuwei/intelligent/shelves/ShelfActivity.kt +++ b/app/src/main/java/com/shuwei/intelligent/shelves/ShelfActivity.kt @@ -1,16 +1,12 @@ package com.shuwei.intelligent.shelves import android.annotation.SuppressLint -import android.content.BroadcastReceiver -import android.content.Context import android.content.Intent -import android.content.IntentFilter import android.os.Bundle import android.os.Handler import android.os.Looper import android.util.Log import android.widget.LinearLayout -import android.widget.TextView import androidx.activity.viewModels import androidx.core.view.updateLayoutParams import androidx.core.widget.addTextChangedListener @@ -109,7 +105,7 @@ class ShelfActivity : BaseActivity() { getGoodsList() KeyboardUtil.hideKeyboard(context, this) } - addTextChangedListener(afterTextChanged = {editable -> + addTextChangedListener(afterTextChanged = { editable -> if (editable.isNullOrBlank()) { pageNo = 1 getGoodsList() @@ -122,12 +118,14 @@ class ShelfActivity : BaseActivity() { toast("请选择食材") return@clickWithDebounce } + val currentGoodsId = list[clickIndex].goodsId ?: "" val data = ShelfModel( shelfName = shelfModel?.shelfName, - goodsId = list[clickIndex].goodsId ?: "", + goodsId = currentGoodsId, goodsName = list[clickIndex].goodsName, weight = realWeight / 1000.0, - createTime = DateTimeUtil.formatDateTime(dateTime = Date()) + overdueDay = list[clickIndex].overdueDay, + createTime = if (shelfModel?.goodsId == currentGoodsId) null else DateTimeUtil.formatDateTime(dateTime = Date()) ) val intent = Intent().apply { putExtra(SHELF_MODEL, data) @@ -152,7 +150,7 @@ class ShelfActivity : BaseActivity() { SerialPortManager.send(DEVICE_INFO_CMD) Loading.show(this@ShelfActivity) - v.postDelayed({Loading.dismiss()}, 5000) + v.postDelayed({ Loading.dismiss() }, 5000) } KeyboardUtil.hideKeyboard(v.context, v) } @@ -173,7 +171,7 @@ class ShelfActivity : BaseActivity() { } // registerReceiver(receiver, IntentFilter(RECEIVER_DEVICE_INFO + shelfModel?.deviceNo)) - + binding.ivBack?.setOnClickListener { finish() } binding.refreshLayout.let { it.setEnableRefresh(true) it.setEnableLoadMore(false) @@ -232,10 +230,31 @@ class ShelfActivity : BaseActivity() { } return } + var firstOne:GoodsModel?=null if (pageNo == 1) { + if (shelfModel?.goodsId.isNullOrBlank().not()) { + firstOne = list.firstOrNull { it.goodsId == shelfModel?.goodsId } + if (firstOne == null) { + firstOne = GoodsModel( + goodsId = shelfModel?.goodsId, + goodsName = shelfModel?.goodsName, + isClicked = true + ) + } + } list.clear() } val records = data.result.records + if (pageNo == 1) { + firstOne?.let { one -> + val filterResult = records.firstOrNull{one.goodsId == it.goodsId } + if (filterResult != null) { + records.remove(filterResult) + } + clickIndex = 0 + list.add(one) + } + } list.addAll(records) val enableLoadMore = records.size >= PAGE_SIZE binding.refreshLayout.setEnableLoadMore(enableLoadMore) @@ -334,7 +353,7 @@ class ShelfActivity : BaseActivity() { } it.ivEmptyIcon.setImageResource(R.drawable.ic_empty_gray) it.ivEmptyIcon.updateLayoutParams { - val swDpValue = resources?.configuration?.smallestScreenWidthDp?:0 + val swDpValue = resources?.configuration?.smallestScreenWidthDp ?: 0 width = if (swDpValue > 600) 200.dp else 120.dp } } @@ -346,7 +365,7 @@ class ShelfActivity : BaseActivity() { @Subscribe(threadMode = ThreadMode.MAIN) public fun receiveWeightEvent(event: SendWeightEvent) { - if (event.shelfNo == (shelfModel?.deviceNo?:0)) { + if (event.shelfNo == (shelfModel?.deviceNo ?: 0)) { binding.tvFoodWeight.text = "${event.weight}克" } } diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/adapter/ShelfAdapter.kt b/app/src/main/java/com/shuwei/intelligent/shelves/adapter/ShelfAdapter.kt index d530788..f47098f 100644 --- a/app/src/main/java/com/shuwei/intelligent/shelves/adapter/ShelfAdapter.kt +++ b/app/src/main/java/com/shuwei/intelligent/shelves/adapter/ShelfAdapter.kt @@ -10,6 +10,10 @@ import com.chad.library.adapter4.viewholder.QuickViewHolder import com.shuwei.intelligent.shelves.R import com.shuwei.intelligent.shelves.databinding.ListItemShelfBinding import com.shuwei.intelligent.shelves.model.ShelfModel +import com.shuwei.intelligent.shelves.utils.DateTimeUtil +import com.shuwei.intelligent.shelves.utils.ext.gone +import com.shuwei.intelligent.shelves.utils.ext.visible +import java.util.Date class ShelfAdapter(list: MutableList) : BaseQuickAdapter(list) { @@ -22,14 +26,42 @@ class ShelfAdapter(list: MutableList) : return VH(binding) } + private fun stringToDate(createTime: String?): Date? { + if (createTime.isNullOrBlank()) { + return null + } + return DateTimeUtil.stringToDate(createTime) + } + override fun onBindViewHolder(holder: VH, position: Int, item: ShelfModel?) { val shelfNo = item!!.deviceNo - item.shelfName = "货架-${if (shelfNo < 10) "0${shelfNo}" else "$shelfNo" }" + item.shelfName = "货架-${if (shelfNo < 10) "0${shelfNo}" else "$shelfNo"}" val weight = item.weight ?: 0.toDouble() val binding = holder.binding + if (item.overdueDay.isNullOrBlank()) { + binding.ivStaleFood.gone() + } else { + runCatching { + val shelfDate = stringToDate(item.createTime) + if (shelfDate == null) { + binding.ivStaleFood.gone() + } else { + val days = item.overdueDay!!.toInt() + val resultDate = DateTimeUtil.addDays(shelfDate, days) + if (resultDate.before(Date())) { + binding.ivStaleFood.visible() + } else { + binding.ivStaleFood.gone() + } + } + }.onFailure { + binding.ivStaleFood.gone() + } + } + //?.setImageResource() binding.tvFoodWeight.run { setTextColor(getColor(R.color.food_weight_orange)) - val showWeight = if(weight == 0.toDouble()) "0" else "%.3f".format(weight) + val showWeight = if (weight == 0.toDouble()) "0" else "%.3f".format(weight) text = "${showWeight}千克" } //val isBlankShelf = weight <= 0 diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/model/GoodsModel.kt b/app/src/main/java/com/shuwei/intelligent/shelves/model/GoodsModel.kt index 8f51f90..f6d9f3d 100644 --- a/app/src/main/java/com/shuwei/intelligent/shelves/model/GoodsModel.kt +++ b/app/src/main/java/com/shuwei/intelligent/shelves/model/GoodsModel.kt @@ -5,5 +5,6 @@ import java.io.Serializable data class GoodsModel( var goodsId: String? = null, var goodsName: String? = null, + var overdueDay: String? = null, var isClicked: Boolean = false ) : Serializable \ No newline at end of file diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/model/ShelfModel.kt b/app/src/main/java/com/shuwei/intelligent/shelves/model/ShelfModel.kt index cecdaf3..f70759c 100644 --- a/app/src/main/java/com/shuwei/intelligent/shelves/model/ShelfModel.kt +++ b/app/src/main/java/com/shuwei/intelligent/shelves/model/ShelfModel.kt @@ -10,5 +10,8 @@ data class ShelfModel( var goodsName: String? = null, var deviceId: String? = null, var weight: Double? = null, - var createTime: String? = null + var createTime: String? = null, + var overdueDay: String? = null, + var temperature: String? = null, + var humidity: String = "0", ) : Serializable \ No newline at end of file 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 505114a..ed75037 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 @@ -23,8 +23,8 @@ class NetViewModel : ViewModel() { private val _getShelfListUiState = MutableStateFlow(UiState.Initial) val getShelfListUiState: StateFlow = _getShelfListUiState - private val _saveShelfGoodsListUiState = MutableStateFlow(UiState.Initial) - val saveShelfGoodsListUiState: StateFlow = _saveShelfGoodsListUiState +// private val _saveShelfGoodsListUiState = MutableStateFlow(UiState.Initial) +// val saveShelfGoodsListUiState: StateFlow = _saveShelfGoodsListUiState private val _getGoodsListUiState = MutableStateFlow(UiState.Initial) val getGoodsListUiState: StateFlow = _getGoodsListUiState @@ -64,21 +64,21 @@ class NetViewModel : ViewModel() { } } - fun saveShelfGoodsList(body: ShelfBody) { - viewModelScope.launch { - _saveShelfGoodsListUiState.value = UiState.Loading - runCatching { - val response = apiService.saveShelfGoodsList(body) - if (response.success) { - _saveShelfGoodsListUiState.value = UiState.Success(response) - } else { - _saveShelfGoodsListUiState.value = UiState.Error(response.message ?: "请求失败") - } - }.onFailure { - _saveShelfGoodsListUiState.value = UiState.Error(it.message ?: "请求异常") - } - } - } +// fun saveShelfGoodsList(body: ShelfBody) { +// viewModelScope.launch { +// _saveShelfGoodsListUiState.value = UiState.Loading +// runCatching { +// val response = apiService.saveShelfGoodsList(body) +// if (response.success) { +// _saveShelfGoodsListUiState.value = UiState.Success(response) +// } else { +// _saveShelfGoodsListUiState.value = UiState.Error(response.message ?: "请求失败") +// } +// }.onFailure { +// _saveShelfGoodsListUiState.value = UiState.Error(it.message ?: "请求异常") +// } +// } +// } fun getGoodsList( canteenId: String = "", diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/net/UrlConfig.kt b/app/src/main/java/com/shuwei/intelligent/shelves/net/UrlConfig.kt index 0b3d373..be54a1a 100644 --- a/app/src/main/java/com/shuwei/intelligent/shelves/net/UrlConfig.kt +++ b/app/src/main/java/com/shuwei/intelligent/shelves/net/UrlConfig.kt @@ -2,8 +2,8 @@ package com.shuwei.intelligent.shelves.net object UrlConfig { - //const val BASE_URL = "http://192.168.1.7:9002" - const val BASE_URL = "https://yyjk.shuziweidao.com/gateway/" + const val BASE_URL = "http://192.168.1.3:9002" +// const val BASE_URL = "https://yyjk.shuziweidao.com/gateway/" const val GET_ACCESS_TOKEN = "restaurant/equipment/stEquipment/getEquipmentToken" const val GET_SHELF_LIST = "inventory/smartShelves/app/getShelvesListByDeviceId" const val GET_GOODS_LIST = "inventory/smartShelves/app/getGoodsPageList" 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 c1390f7..89fae70 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 @@ -38,6 +38,10 @@ class SyncTask(appContext: Context, workerParams: WorkerParameters) : val list = HomeActivity.list Log.d(TAG, "performSync: list:${list.toJsonString()}") val submitList = list.sortedBy { it.deviceNo } + submitList.forEach { + it.temperature = HomeActivity.showTemperatureC + it.humidity = HomeActivity.showHumidity + } val body = ShelfBody().also { it.deviceId = App.getInstance().deviceId it.canteenId = App.getInstance().canteenId diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/utils/DateTimeUtil.kt b/app/src/main/java/com/shuwei/intelligent/shelves/utils/DateTimeUtil.kt index 20aa2e5..b20ca77 100644 --- a/app/src/main/java/com/shuwei/intelligent/shelves/utils/DateTimeUtil.kt +++ b/app/src/main/java/com/shuwei/intelligent/shelves/utils/DateTimeUtil.kt @@ -1,9 +1,11 @@ package com.shuwei.intelligent.shelves.utils +import androidx.annotation.NonNull import java.text.SimpleDateFormat import java.time.LocalDateTime import java.time.ZoneId import java.time.format.DateTimeFormatter +import java.util.Calendar import java.util.Date import java.util.Locale @@ -19,6 +21,19 @@ object DateTimeUtil { return sdf.format(dateTime) } + fun stringToDate(dateText: String, pattern: String = YYYY_MM_DD_HH_MM_SS): Date? { + val sdf = SimpleDateFormat(pattern, Locale.CHINA) + return sdf.parse(dateText) + } + + fun addDays(date: Date, days: Int): Date { + val calendar = Calendar.getInstance().apply { + time = date + add(Calendar.DAY_OF_MONTH, days) + } + return calendar.time + } + // fun convert(dateStr: String, pattern: String = YYYY_MM_DD_HH_MM_SS): Date { // val formatter = DateTimeFormatter.ofPattern(pattern) // val ldt = LocalDateTime.parse(dateStr, formatter) diff --git a/app/src/main/res/drawable-xxxhdpi/ic_back_512.png b/app/src/main/res/drawable-xxxhdpi/ic_back_512.png new file mode 100644 index 0000000..ec64f7c Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_back_512.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_stale_food_512.png b/app/src/main/res/drawable-xxxhdpi/ic_stale_food_512.png new file mode 100644 index 0000000..8f39830 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_stale_food_512.png differ diff --git a/app/src/main/res/layout-sw360dp/activity_shelf.xml b/app/src/main/res/layout-sw360dp/activity_shelf.xml index 6bd2afe..0f6e58c 100644 --- a/app/src/main/res/layout-sw360dp/activity_shelf.xml +++ b/app/src/main/res/layout-sw360dp/activity_shelf.xml @@ -35,10 +35,10 @@ android:layout_width="wrap_content" android:layout_height="30dp" android:layout_marginTop="12dp" + android:fontFamily="sans-serif-medium" android:gravity="center" android:textColor="@color/bg_page" android:textSize="15sp" - android:fontFamily="sans-serif-medium" tools:text="货架 - 03" /> + + @@ -143,24 +153,24 @@ android:layout_height="36dp" android:layout_marginEnd="12dp" android:background="@null" + android:fontFamily="sans-serif-medium" android:hint="输入食材名称" - android:maxLines="1" - android:inputType="text" - android:text="" android:imeOptions="actionSearch" - android:textColor="@color/food_name_black" + android:inputType="text" + android:maxLines="1" android:paddingStart="1dp" android:paddingEnd="1dp" + android:text="" + android:textColor="@color/food_name_black" android:textColorHint="#B4BEC8" - android:fontFamily="sans-serif-medium" android:textSize="15sp" tools:ignore="Autofill,HardcodedText,TextFields" /> + tools:itemCount="10" + tools:listitem="@layout/list_item_search" /> + android:visibility="gone" /> - + diff --git a/app/src/main/res/layout-sw360dp/list_item_shelf.xml b/app/src/main/res/layout-sw360dp/list_item_shelf.xml index ff79b9a..a4434c7 100644 --- a/app/src/main/res/layout-sw360dp/list_item_shelf.xml +++ b/app/src/main/res/layout-sw360dp/list_item_shelf.xml @@ -75,5 +75,13 @@ tools:text="-" /> + \ No newline at end of file diff --git a/app/src/main/res/layout-sw600dp/activity_shelf.xml b/app/src/main/res/layout-sw600dp/activity_shelf.xml index 1cab528..2884982 100644 --- a/app/src/main/res/layout-sw600dp/activity_shelf.xml +++ b/app/src/main/res/layout-sw600dp/activity_shelf.xml @@ -100,6 +100,16 @@ app:elevation="0dp" tools:ignore="HardcodedText" /> + + @@ -210,7 +220,7 @@ android:layout_marginTop="24dp" android:layout_marginEnd="48dp" android:layout_marginStart="48dp" - android:layout_marginBottom="48dp" + android:layout_marginBottom="24dp" android:backgroundTint="@color/bg_page" android:ellipsize="end" android:insetTop="0dp" diff --git a/app/src/main/res/layout-sw600dp/list_item_shelf.xml b/app/src/main/res/layout-sw600dp/list_item_shelf.xml index 3945ebb..63b1f7f 100644 --- a/app/src/main/res/layout-sw600dp/list_item_shelf.xml +++ b/app/src/main/res/layout-sw600dp/list_item_shelf.xml @@ -75,5 +75,13 @@ tools:text="-" /> + \ No newline at end of file diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml index cb88015..1564dab 100644 --- a/app/src/main/res/xml/network_security_config.xml +++ b/app/src/main/res/xml/network_security_config.xml @@ -1,6 +1,7 @@ + 192.168.1.3 192.168.1.7