Author SHA1 Message Date
lvmeng 795deae228 优化 2026-02-09 16:28:30 +08:00
lvmeng 873ae95c0b 优化 2026-02-06 17:31:52 +08:00
lvmeng a4f3f9527c 优化 2026-02-05 15:06:45 +08:00
lvmeng eaa1b1eb00 新接口调试 2026-01-30 18:01:07 +08:00
lvmeng a4905e7226 新接口调试 2026-01-29 18:51:42 +08:00
51 changed files with 1758 additions and 1787 deletions
+2 -2
View File
@@ -4,10 +4,10 @@
<selectionStates> <selectionStates>
<SelectionState runConfigName="app"> <SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" /> <option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2025-09-10T07:28:30.961571900Z"> <DropdownSelection timestamp="2026-01-28T08:24:39.059017600Z">
<Target type="DEFAULT_BOOT"> <Target type="DEFAULT_BOOT">
<handle> <handle>
<DeviceId pluginId="Default" identifier="serial=192.168.1.21:5555;connection=bc7af9a5" /> <DeviceId pluginId="Default" identifier="serial=192.168.1.80:5555;connection=d6ad651e" />
</handle> </handle>
</Target> </Target>
</DropdownSelection> </DropdownSelection>
+4 -2
View File
@@ -87,9 +87,11 @@ dependencies {
androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(libs.androidx.espresso.core)
implementation("com.squareup.okhttp3:okhttp:4.9.1")
implementation("com.google.code.gson:gson:2.10.1") implementation("com.google.code.gson:gson:2.10.1")
// implementation("com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30") implementation("com.squareup.okhttp3:okhttp:4.9.1")
implementation("com.squareup.okhttp3:logging-interceptor:4.9.1")
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
implementation("io.github.cymchad:BaseRecyclerViewAdapterHelper4:4.1.2") implementation("io.github.cymchad:BaseRecyclerViewAdapterHelper4:4.1.2")
Binary file not shown.
@@ -9,7 +9,6 @@ import com.chad.library.adapter4.viewholder.QuickViewHolder
import com.shuwei.dish.match.R import com.shuwei.dish.match.R
import com.shuwei.dish.match.entity.FoodRecord import com.shuwei.dish.match.entity.FoodRecord
import com.shuwei.dish.match.databinding.ListItemDishBinding import com.shuwei.dish.match.databinding.ListItemDishBinding
import com.shuwei.dish.match.utils.ext.gone
import com.shuwei.dish.match.utils.ext.visible import com.shuwei.dish.match.utils.ext.visible
import java.text.DecimalFormat import java.text.DecimalFormat
@@ -28,9 +27,9 @@ class SamplingAdapter(list: MutableList<FoodRecord>) :
holder.binding.run { holder.binding.run {
val isCooking = item!!.isCooking val isCooking = item!!.isCooking
clBlock.setBackgroundResource(R.drawable.shape_white_fb_15_corners) clBlock.setBackgroundResource(R.drawable.shape_white_fb_15_corners)
val totalWeight = item!!.totalWeight ?: 0.toDouble() val totalWeight = item.totalWeight ?: 0.toDouble()
tvDishName.run { tvDishName.run {
text = item!!.foodName text = (item.foodName?:"").ifBlank { "--" }
setTextColor( setTextColor(
ContextCompat.getColor( ContextCompat.getColor(
holder.itemView.context, holder.itemView.context,
@@ -41,11 +40,16 @@ class SamplingAdapter(list: MutableList<FoodRecord>) :
tvDishCount.visible() tvDishCount.visible()
if (isCooking) { if (isCooking) {
tvDishCount.text = "制作统计:-kg" tvDishCount.text = "制作统计:-kg"
tvShowState.text = "烹饪中" tvShowState.text = "烹饪中"
} else { } else {
val useWeight = if (totalWeight > 0.toDouble()) totalWeight else (item.foodWeight ?: 0.toDouble()) val realTotalWeight = if (totalWeight > 0.toDouble()) totalWeight else (item.foodWeight
tvDishCount.text = "累计统计:${df.format(useWeight / 1000.0F)}kg(${item.count}次)" ?: 0.toDouble())
tvShowState.text = "${df.format((item.foodWeight ?: 0.toDouble()) / 1000.0F)}kg" val showTotalWeight =
if (realTotalWeight == 0.toDouble()) "-" else df.format(realTotalWeight / 1000.0F)
tvDishCount.text = "累计统计:${showTotalWeight}kg(${item.count ?: "-"}次)"
val foodWeight = item.foodWeight ?: 0.toDouble()
val showFoodWeight = if (foodWeight == 0.toDouble()) "-" else df.format(foodWeight / 1000.0F)
tvShowState.text = "${showFoodWeight}kg"
} }
} }
} }
@@ -1,134 +0,0 @@
//package com.shuwei.dish.match.adapter
//
//import android.annotation.SuppressLint
//import android.widget.TextView
//import androidx.recyclerview.widget.GridLayoutManager
//import androidx.recyclerview.widget.RecyclerView
//import com.shuwei.dish.match.base.BaseActivity
//import com.shuwei.dish.match.dialog.BottomDialog2
//import com.shuwei.dish.match.entity.SeasoningEntity
//import com.shuwei.dish.match.ui.DeviceSettingActivity
//import com.shuwei.dish.match.ui.SubmitDishActivity
//import com.shuwei.dish.match.utils.DataUtil
//
//object SeasoningCellTool {
// private val TAG = "SeasoningCellTool"
//
// private val list = mutableListOf<SeasoningEntity>()
// private lateinit var activity: BaseActivity
// private var pageType: Int = 0
//
// @SuppressLint("StaticFieldLeak")
// private lateinit var cellAdapter: TextCellAdapter
//
// @SuppressLint("NotifyDataSetChanged")
// fun loadData(
// activity: BaseActivity,
// initList: MutableList<SeasoningEntity>? = null,
// recyclerView: RecyclerView,
// tvCell: TextView,
// pageType: Int = 0
// ) {
// this.activity = activity
// this.pageType = pageType
// list.clear()
// val tempList = buildData(initList, pageType)
// list.addAll(tempList)
// recyclerView.run {
// if (adapter == null) {
// layoutManager = GridLayoutManager(
// activity,
// 3,
// GridLayoutManager.VERTICAL,
// false
// )
// cellAdapter = TextCellAdapter(list).apply {
// onCellClick = { position ->
// val currentAddress = DataUtil.getWeighAddressArray().get(position)
// BottomDialog2(
// weighIndex = position,
// weighAddress = currentAddress,
// clickName = list[position].goodsName
// ).show(activity) { item ->
// list[position].let { current ->
// syncItem(current, item)
// //3-调料
// current.materialType = 3
// current.sort = position
// }
// notifyItemChanged(position)
// if (position == 14) {
// syncItem(list[10], list[14])
// syncItem(list[11], list[14])
// syncItem(list[13], list[14])
// TextCellAdapter.loadCell(tvCell, list[14])
// notifyItemChanged(10)
// notifyItemChanged(11)
// notifyItemChanged(13)
// notifyItemChanged(14)
// }
// if (activity is DeviceSettingActivity) {
// //activity.list = list
// activity.saveSeasoning(list[position])
// }
// }
// }
// }
// adapter = cellAdapter
// } else {
// cellAdapter.notifyDataSetChanged()
// }
// if (activity is SubmitDishActivity) {
// activity.updateSeasoningList(list)
// }
// }
// if (pageType == 1) {
// tvCell.setOnClickListener {
// cellAdapter.onCellClick?.invoke(14)
// }
// }
// TextCellAdapter.loadCell(tvCell, list[list.size - 1])
// }
//
// private fun buildData(
// initList: MutableList<SeasoningEntity>?,
// pageType: Int = 0
// ): MutableList<SeasoningEntity> {
// val list = mutableListOf<SeasoningEntity>()
// repeat(15) {
// list.add(SeasoningEntity().apply { this.pageType = pageType })
// }
// if (initList.isNullOrEmpty().not()) {
// initList.forEach {
// if (it.sort < list.size) {
// list[it.sort] = it.apply { this.pageType = pageType }
// }
// }
// var lastItem = initList.firstOrNull { it.sort == 14 }
// lastItem = lastItem ?: list[list.size - 1]
// list[10] = lastItem
// list[11] = lastItem
// list[13] = lastItem
// }
// return list
// }
//
// private fun syncItem(item: SeasoningEntity, newItem: SeasoningEntity) {
// item.run {
// goodsId = newItem.goodsId
// goodsName = newItem.goodsName
// goodsOrRelationCode = newItem.goodsOrRelationCode
// relateionType = newItem.relateionType
// materialType = newItem.materialType
// allEdible = newItem.allEdible
// useWeight = newItem.useWeight
// popularName = newItem.popularName
// canteenId = newItem.canteenId
// relateionType_dictText = newItem.relateionType_dictText
//
// foodId = newItem.foodId
// sort = newItem.sort
// }
// }
//
//}
@@ -4,7 +4,6 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.util.Log
import android.view.View import android.view.View
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.ImageView import android.widget.ImageView
@@ -12,25 +11,25 @@ import android.widget.TextView
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.shuwei.dish.match.R import com.shuwei.dish.match.R
import com.shuwei.dish.match.databinding.ActivityBaseBinding import com.shuwei.dish.match.databinding.ActivityBaseBinding
import com.shuwei.dish.match.dialog.Loading import com.shuwei.dish.match.dialog.Loading
import com.shuwei.dish.match.http.HttpUtil import com.shuwei.dish.match.entity.CookFoodGoodsEntity
import com.shuwei.dish.match.http.UrlConfig import com.shuwei.dish.match.entity.SeasoningEntity
import com.shuwei.dish.match.ui.HomeActivity.Companion.TAG import com.shuwei.dish.match.net.NetViewModel
import com.shuwei.dish.match.ui.InitActivity import com.shuwei.dish.match.ui.InitActivity
import com.shuwei.dish.match.utils.ActivityManager import com.shuwei.dish.match.utils.ActivityManager
import com.shuwei.dish.match.utils.ext.gone import com.shuwei.dish.match.utils.ext.gone
import com.shuwei.dish.match.utils.ext.invisible import com.shuwei.dish.match.utils.ext.invisible
import com.shuwei.dish.match.utils.ext.put
import com.shuwei.dish.match.utils.ext.toast
import com.shuwei.dish.match.utils.ext.visible import com.shuwei.dish.match.utils.ext.visible
import java.time.LocalDateTime import java.time.LocalDateTime
import java.time.ZoneId import java.time.ZoneId
import java.time.format.DateTimeFormatter import java.time.format.DateTimeFormatter
import java.util.Locale import java.util.Locale
import kotlin.getValue
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
open class BaseActivity : AppCompatActivity() { open class BaseActivity : AppCompatActivity() {
@@ -95,7 +94,8 @@ open class BaseActivity : AppCompatActivity() {
fun statusBarDarkFont(enable: Boolean) { fun statusBarDarkFont(enable: Boolean) {
//window.decorView.systemUiVisibility = if (enable) View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR else 0 //window.decorView.systemUiVisibility = if (enable) View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR else 0
val color = ContextCompat.getColor(this, val color = ContextCompat.getColor(
this,
if (enable) R.color.black else R.color.white if (enable) R.color.black else R.color.white
) )
binding.tvLeftTime.setTextColor(color) binding.tvLeftTime.setTextColor(color)
@@ -172,9 +172,25 @@ open class BaseActivity : AppCompatActivity() {
fun delayDismissLoading() { fun delayDismissLoading() {
window.decorView.postDelayed({ window.decorView.postDelayed({
Loading.dismiss() Loading.dismiss()
},500) }, 500)
} }
val netViewModel: NetViewModel by viewModels()
fun queryGoodsList(
param: MutableMap<String, Any>,
onSuccess: (MutableList<CookFoodGoodsEntity>?) -> Unit,
onFailure: (String, String) -> Unit
) {
netViewModel.queryGoodsList(param, onSuccess, onFailure)
}
fun querySeasoningList(
param: MutableMap<String, Any>,
onSuccess: (MutableList<SeasoningEntity>?) -> Unit,
onFailure: (String, String) -> Unit
) {
netViewModel.querySeasoningList(param, onSuccess, onFailure)
}
} }
@@ -5,8 +5,11 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.IntentFilter import android.content.IntentFilter
import android.content.SharedPreferences import android.content.SharedPreferences
import android.util.Log
import com.shuwei.dish.match.R import com.shuwei.dish.match.R
import com.shuwei.dish.match.db.DatabaseProvider import com.shuwei.dish.match.db.DatabaseProvider
import com.shuwei.dish.match.ui.InitActivity.Companion.TAG
import com.shuwei.dish.match.utils.AppUtil
import com.shuwei.dish.match.utils.BootReceiver import com.shuwei.dish.match.utils.BootReceiver
@@ -17,7 +20,10 @@ class BaseApp : Application() {
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
instance = this instance = this
val deviceId = AppUtil.getUDID(this)
Log.d(TAG, "onCreate: deviceId=$deviceId")
GlobalData.deviceId = deviceId
// GlobalData.deviceId = "39a7abdd06b3c7ab"
val filter = IntentFilter(Intent.ACTION_BOOT_COMPLETED) val filter = IntentFilter(Intent.ACTION_BOOT_COMPLETED)
registerReceiver(BootReceiver(), filter) registerReceiver(BootReceiver(), filter)
} }
@@ -26,10 +32,10 @@ class BaseApp : Application() {
// const val canteenId = "1678234139391512577" // const val canteenId = "1678234139391512577"
var canteenId = "0" var canteenId = "0"
var configUrl = "" // var configUrl = ""
var token: String? = null // var token: String? = null
var deviceId: String? = null // var deviceId: String? = null
var appVersion: String = "1" var appVersion: String = "1"
@Volatile @Volatile
private var sharedPref: SharedPreferences? = null private var sharedPref: SharedPreferences? = null
@@ -0,0 +1,22 @@
package com.shuwei.dish.match.base
object GlobalData {
var appBaseUrl: String = "https://dev.yixiong-tech.com:8081"
/**
* 设备id
*/
var deviceId: String = ""
var appId = "Hkz1rBk6PZXbS8KwKr67K2eZtsz8bRoMHLg64bUdgCZj"
var sdkKey = "AabXs3sHM8UhhE7oCGf4LVMLrdkGb1nJNksbjjTdVt7k"
}
/**
*
*/
object GlobalKey {
const val KEY_EQUIPMENT_INFO = "equipmentInfo"
const val KEY_TOKEN = "tokenKey"
const val KEY_USER_INFO = "userInfoKey"
const val KEY_USER_NAME = "userNameKey"
}
@@ -3,7 +3,7 @@ package com.shuwei.dish.match.dialog
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.util.Log import android.text.Editable
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import androidx.core.view.isEmpty import androidx.core.view.isEmpty
@@ -15,23 +15,17 @@ import com.shuwei.dish.match.R
import com.shuwei.dish.match.adapter.GoodsInfoSearchAdapter import com.shuwei.dish.match.adapter.GoodsInfoSearchAdapter
import com.shuwei.dish.match.base.BaseActivity import com.shuwei.dish.match.base.BaseActivity
import com.shuwei.dish.match.base.BaseApp import com.shuwei.dish.match.base.BaseApp
import com.shuwei.dish.match.databinding.DialogBottomSheetBinding import com.shuwei.dish.match.databinding.DialogFoodSearchBinding
import com.shuwei.dish.match.entity.CookFoodGoodsEntity import com.shuwei.dish.match.entity.CookFoodGoodsEntity
import com.shuwei.dish.match.entity.GoodsRecordBean
import com.shuwei.dish.match.http.HttpUtil
import com.shuwei.dish.match.http.UrlConfig
import com.shuwei.dish.match.utils.KeyboardUtil import com.shuwei.dish.match.utils.KeyboardUtil
import com.shuwei.dish.match.utils.ext.addOnActionSearchListener import com.shuwei.dish.match.utils.ext.addOnActionSearchListener
import com.shuwei.dish.match.utils.ext.toJsonString
import com.shuwei.dish.match.utils.ext.toObject
import com.shuwei.dish.match.utils.ext.toast import com.shuwei.dish.match.utils.ext.toast
/** /**
* @param goodsType 1-调料0-食材 * 食材搜索弹窗
*/ */
class BottomDialog( class FoodSearchDialog(
private var goodsType: Int = 1, private var defGoodsName: String? = null
private var defGoodsName:String? = null
) { ) {
companion object { companion object {
const val TAG = "BottomDialog" const val TAG = "BottomDialog"
@@ -39,8 +33,8 @@ class BottomDialog(
private var list = mutableListOf<CookFoodGoodsEntity>() private var list = mutableListOf<CookFoodGoodsEntity>()
private lateinit var binding: DialogBottomSheetBinding private lateinit var binding: DialogFoodSearchBinding
private lateinit var goodsInfoSearchAdapter: GoodsInfoSearchAdapter private lateinit var searchAdapter: GoodsInfoSearchAdapter
private var goodsName: String? = null private var goodsName: String? = null
private var activity: BaseActivity? = null private var activity: BaseActivity? = null
@@ -50,11 +44,30 @@ class BottomDialog(
//直接使用BottomSheetDialog //直接使用BottomSheetDialog
var dialog: BottomSheetDialog? = null var dialog: BottomSheetDialog? = null
val inflater = LayoutInflater.from(activity) val inflater = LayoutInflater.from(activity)
binding = DialogBottomSheetBinding.inflate(inflater) binding = DialogFoodSearchBinding.inflate(inflater)
dialog = BottomSheetDialog(activity, R.style.BottomSheet).apply {
binding.tvSheetName.text = if (goodsType == 1) "调料检索" else "食材检索" setContentView(binding.root)
binding.etSheetInput.hint = if (goodsType == 1) "输入调料名称" else "输入食材名称或速记码" setCancelable(true)
goodsInfoSearchAdapter = GoodsInfoSearchAdapter(list).apply { behavior.skipCollapsed = false // 跳过折叠状态
// behavior.peekHeight = 880.dp
// window?.setLayout(-1, 880.dp)
show()
setOnDismissListener {
activity.hideStatusBar()
}
binding.etSheetInput.requestFocus()
}
binding.tvSheetName.text = "食材检索"
binding.etSheetInput.run {
hint = "输入食材名称或速记码"
addTextChangedListener(afterTextChanged = { it: Editable? ->
if (it.isNullOrBlank()) {
list.clear()
searchAdapter.notifyDataSetChanged()
}
})
}
searchAdapter = GoodsInfoSearchAdapter(list).apply {
setOnItemClickListener { _, _, position -> setOnItemClickListener { _, _, position ->
list[position].isClicked = true list[position].isClicked = true
notifyItemChanged(position) notifyItemChanged(position)
@@ -66,7 +79,7 @@ class BottomDialog(
} }
binding.recyclerView.run { binding.recyclerView.run {
layoutManager = GridLayoutManager(activity, 2, GridLayoutManager.VERTICAL, false) layoutManager = GridLayoutManager(activity, 2, GridLayoutManager.VERTICAL, false)
adapter = goodsInfoSearchAdapter adapter = searchAdapter
addOnScrollListener(object : RecyclerView.OnScrollListener() { addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(rv: RecyclerView, newState: Int) { override fun onScrollStateChanged(rv: RecyclerView, newState: Int) {
super.onScrollStateChanged(rv, newState); super.onScrollStateChanged(rv, newState);
@@ -80,17 +93,6 @@ class BottomDialog(
} }
}) })
} }
dialog = BottomSheetDialog(activity, R.style.BottomSheet).apply {
setContentView(binding.root)
setCancelable(true)
behavior.skipCollapsed = false // 跳过折叠状态
// behavior.peekHeight = 880.dp
// window?.setLayout(-1, 880.dp)
show()
setOnDismissListener {
activity.hideStatusBar()
}
}
binding.refreshLayout.setOnRefreshListener { binding.refreshLayout.setOnRefreshListener {
pageNo = 1 pageNo = 1
getGoodsList() getGoodsList()
@@ -136,65 +138,107 @@ class BottomDialog(
} }
private var pageNo = 1 private var pageNo = 1
private val pageSize = 120 private val pageSize = 50
/** /**
*/ */
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
private fun getGoodsList() { private fun getGoodsList() {
// val pathSegmentList = UrlConfig.QUERY_GOODS_LIST.split(delimiters = arrayOf("/"), limit = 1) // val pathSegmentList = UrlConfig.QUERY_GOODS_LIST.split(delimiters = arrayOf("/"), limit = 1)
val queryParams = mutableMapOf( // val queryParams = mutableMapOf(
"goodsType" to "$goodsType", // "goodsType" to "0",
"canteenId" to BaseApp.canteenId, // "canteenId" to BaseApp.canteenId,
"pageNo" to "$pageNo", // "pageNo" to "$pageNo",
"pageSize" to "$pageSize" // "pageSize" to "$pageSize"
// )
// if (goodsName.isNullOrBlank().not()) {
// queryParams.put("name", goodsName!!)
// }
// val sb = StringBuilder().apply {
// append(UrlConfig.QUERY_GOODS_LIST)
// append("?")
// queryParams.forEach { (key, value) ->
// append("$key=$value&")
// }
// }
// sb.deleteCharAt(sb.length - 1)
// Log.d(TAG, "getGoodsList: url = $sb")
// HttpUtil.get(
// url = sb.toString(),
// doSuccess = {
// val json = it.toJsonString()
// Log.d(TAG, "getGoodsList: json=$json")
// val recordBean: GoodsRecordBean? = json.toObject<GoodsRecordBean>()
// if (recordBean == null || recordBean.records.isNullOrEmpty()) {
// activity?.toast("暂未搜索到食材信息")
// return@get
// }
// val records = recordBean.records
// if (pageNo == 1) {
// list.clear()
// }
// list.addAll(records!!)
// searchAdapter.notifyDataSetChanged()
// if (pageNo == 1) {
// binding.refreshLayout.finishRefresh(1200)
// } else {
// binding.refreshLayout.finishLoadMore(1200)
// }
// val isLoadMoreEnable = records.size >= pageSize
// binding.refreshLayout.setEnableLoadMore(isLoadMoreEnable)
// if (isLoadMoreEnable) {
// pageNo++
// }
// }, doFailure = { code, msg ->
// activity?.toast(msg)
// if (pageNo == 1) {
// binding.refreshLayout.finishRefresh(1200)
// } else {
// binding.refreshLayout.finishLoadMore(1200)
// }
// })
val param = mutableMapOf<String, Any>(
"goodsType" to "0",
"placeId" to BaseApp.canteenId,
"pageNum" to pageNo,
"pageSize" to pageSize
) )
if (goodsName.isNullOrBlank().not()) { if (goodsName.isNullOrBlank().not()) {
queryParams.put("name", goodsName!!) param.put("goodsName", goodsName!!)
} }
val sb = StringBuilder().apply { activity?.queryGoodsList(param = param, onSuccess = {
append(UrlConfig.QUERY_GOODS_LIST) loadGoodsList(it)
append("?") }, onFailure = { code, msg ->
queryParams.forEach { (key, value) -> activity?.toast(msg)
append("$key=$value&") finishRefresh()
} })
}
private fun finishRefresh() {
if (pageNo == 1) {
binding.refreshLayout.finishRefresh()
} else {
binding.refreshLayout.finishLoadMore()
}
}
@SuppressLint("NotifyDataSetChanged")
private fun loadGoodsList(records: MutableList<CookFoodGoodsEntity>?) {
finishRefresh()
if (records.isNullOrEmpty()) {
activity?.toast("暂未搜索到食材信息")
return
}
if (pageNo == 1) {
list.clear()
}
list.addAll(records)
searchAdapter.notifyDataSetChanged()
val isLoadMoreEnable = records.size >= pageSize
binding.refreshLayout.setEnableLoadMore(isLoadMoreEnable)
if (isLoadMoreEnable) {
pageNo++
} }
sb.deleteCharAt(sb.length - 1)
Log.d(TAG, "getGoodsList: url = $sb")
HttpUtil.get(
url = sb.toString(),
doSuccess = {
val json = it.toJsonString()
Log.d(TAG, "getGoodsList: json=$json")
val recordBean: GoodsRecordBean? = json.toObject<GoodsRecordBean>()
if (recordBean == null || recordBean.records.isNullOrEmpty()) {
activity?.toast(if (goodsType == 1) "暂未搜索到调料信息" else "暂未搜索到食材信息")
return@get
}
val records = recordBean.records
if (pageNo == 1) {
list.clear()
}
list.addAll(records!!)
goodsInfoSearchAdapter.notifyDataSetChanged()
if (pageNo == 1) {
binding.refreshLayout.finishRefresh(1200)
} else {
binding.refreshLayout.finishLoadMore(1200)
}
val isLoadMoreEnable = records.size >= pageSize
binding.refreshLayout.setEnableLoadMore(isLoadMoreEnable)
if (isLoadMoreEnable) {
pageNo++
}
}, doFailure = { code, msg ->
activity?.toast(msg)
if (pageNo == 1) {
binding.refreshLayout.finishRefresh(1200)
} else {
binding.refreshLayout.finishLoadMore(1200)
}
})
} }
} }
@@ -4,14 +4,18 @@ import android.annotation.SuppressLint
import android.graphics.Typeface import android.graphics.Typeface
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.text.Editable
import android.text.SpannableStringBuilder import android.text.SpannableStringBuilder
import android.text.style.AbsoluteSizeSpan import android.text.style.AbsoluteSizeSpan
import android.text.style.ForegroundColorSpan import android.text.style.ForegroundColorSpan
import android.text.style.LineHeightSpan import android.text.style.LineHeightSpan
import android.text.style.StyleSpan import android.text.style.StyleSpan
import android.util.Log import android.util.Log
import android.view.Gravity
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.core.graphics.toColorInt import androidx.core.graphics.toColorInt
import androidx.core.view.isEmpty import androidx.core.view.isEmpty
import androidx.core.widget.addTextChangedListener import androidx.core.widget.addTextChangedListener
@@ -22,11 +26,8 @@ import com.shuwei.dish.match.R
import com.shuwei.dish.match.adapter.SeasoningSearchAdapter import com.shuwei.dish.match.adapter.SeasoningSearchAdapter
import com.shuwei.dish.match.base.BaseActivity import com.shuwei.dish.match.base.BaseActivity
import com.shuwei.dish.match.base.BaseApp import com.shuwei.dish.match.base.BaseApp
import com.shuwei.dish.match.databinding.DialogBottomSheet2Binding import com.shuwei.dish.match.databinding.DialogSeasoningSearchBinding
import com.shuwei.dish.match.entity.SeasoningEntity import com.shuwei.dish.match.entity.SeasoningEntity
import com.shuwei.dish.match.entity.SeasoningRecordBean
import com.shuwei.dish.match.http.HttpUtil
import com.shuwei.dish.match.http.UrlConfig
import com.shuwei.dish.match.utils.KeyboardUtil import com.shuwei.dish.match.utils.KeyboardUtil
import com.shuwei.dish.match.utils.WeightUtil import com.shuwei.dish.match.utils.WeightUtil
import com.shuwei.dish.match.utils.ext.addOnActionSearchListener import com.shuwei.dish.match.utils.ext.addOnActionSearchListener
@@ -34,15 +35,12 @@ import com.shuwei.dish.match.utils.ext.appendText
import com.shuwei.dish.match.utils.ext.buildSpannableString import com.shuwei.dish.match.utils.ext.buildSpannableString
import com.shuwei.dish.match.utils.ext.dp import com.shuwei.dish.match.utils.ext.dp
import com.shuwei.dish.match.utils.ext.roundedDecimalPlace import com.shuwei.dish.match.utils.ext.roundedDecimalPlace
import com.shuwei.dish.match.utils.ext.roundedOneDecimalPlace
import com.shuwei.dish.match.utils.ext.toJsonString
import com.shuwei.dish.match.utils.ext.toObject
import com.shuwei.dish.match.utils.ext.toast import com.shuwei.dish.match.utils.ext.toast
/** /**
* @param goodsType 1-调料0-食材 * 调料搜索弹窗
*/ */
class BottomDialog2( class SeasoningSearchDialog(
private var weighIndex: Int, private var weighIndex: Int,
private var weighAddress: Int, private var weighAddress: Int,
private var clickName: String? = null private var clickName: String? = null
@@ -51,10 +49,9 @@ class BottomDialog2(
const val TAG = "BottomDialog2" const val TAG = "BottomDialog2"
} }
private val goodsType: Int = 1
private var list = mutableListOf<SeasoningEntity>() private var list = mutableListOf<SeasoningEntity>()
private lateinit var binding: DialogBottomSheet2Binding private lateinit var binding: DialogSeasoningSearchBinding
private lateinit var searchAdapter: SeasoningSearchAdapter private lateinit var searchAdapter: SeasoningSearchAdapter
private var goodsName: String? = null private var goodsName: String? = null
@@ -65,10 +62,17 @@ class BottomDialog2(
//直接使用BottomSheetDialog //直接使用BottomSheetDialog
var dialog: BottomSheetDialog? = null var dialog: BottomSheetDialog? = null
val inflater = LayoutInflater.from(activity) val inflater = LayoutInflater.from(activity)
binding = DialogBottomSheet2Binding.inflate(inflater) binding = DialogSeasoningSearchBinding.inflate(inflater)
//binding.tvSheetName.text = if (goodsType == 1) "调料检索" else "食材检索" binding.etSheetInput.run {
binding.etSheetInput.hint = if (goodsType == 1) "输入调料名称" else "输入食材名称或速记码" hint = "输入调料名称"
addTextChangedListener(afterTextChanged = { it: Editable? ->
if (it.isNullOrBlank()) {
list.clear()
searchAdapter.notifyDataSetChanged()
}
})
}
searchAdapter = SeasoningSearchAdapter(list).apply { searchAdapter = SeasoningSearchAdapter(list).apply {
setOnItemClickListener { _, _, position -> setOnItemClickListener { _, _, position ->
list[position].isClicked = true list[position].isClicked = true
@@ -99,12 +103,45 @@ class BottomDialog2(
setContentView(binding.root) setContentView(binding.root)
setCancelable(true) setCancelable(true)
behavior.skipCollapsed = false // 跳过折叠状态 behavior.skipCollapsed = false // 跳过折叠状态
// behavior.peekHeight = 880.dp //// behavior.peekHeight = 880.dp
// window?.setLayout(-1, 880.dp) //// window?.setLayout(-1, 880.dp)
// window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN)
//or WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN
//or WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING // 禁用额外平移
window?.setGravity(Gravity.BOTTOM)
window?.setLayout(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
window?.setWindowAnimations(R.style.DialogSoftInputAnimation)
window?.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
show() show()
// val onGlobalLayoutListener = ViewTreeObserver.OnGlobalLayoutListener {
// val r = Rect()
// binding.root.getWindowVisibleDisplayFrame(r)
// val screenHeight = binding.root.rootView.height
// val keyboardHeight = screenHeight - r.bottom
//
// // 软键盘弹出(高度>200dp
// if (keyboardHeight > 200.dp) {
// // 调整 Dialog 底部边距,避开软键盘
// val layoutParams = binding.root.layoutParams as ViewGroup.MarginLayoutParams
//// layoutParams.bottomMargin = keyboardHeight
// layoutParams.bottomMargin = 200.dp
// binding.root.layoutParams = layoutParams
// } else {
// // 软键盘收起,恢复边距
// val layoutParams = binding.root.layoutParams as ViewGroup.MarginLayoutParams
// layoutParams.bottomMargin = 0
// binding.root.layoutParams = layoutParams
// }
// }
setOnDismissListener { setOnDismissListener {
activity.hideStatusBar() activity.hideStatusBar()
// binding.root.viewTreeObserver.removeOnGlobalLayoutListener(onGlobalLayoutListener)
} }
// binding.root.viewTreeObserver.addOnGlobalLayoutListener(onGlobalLayoutListener)
} }
binding.refreshLayout.setOnRefreshListener { binding.refreshLayout.setOnRefreshListener {
pageNo = 1 pageNo = 1
@@ -130,6 +167,7 @@ class BottomDialog2(
} }
} }
binding.refreshLayout.setEnableRefresh(false) binding.refreshLayout.setEnableRefresh(false)
binding.refreshLayout.setEnableLoadMore(false)
binding.tvClear.setOnClickListener { binding.tvClear.setOnClickListener {
Log.d(TAG, "show: weighAddress=$weighAddress") Log.d(TAG, "show: weighAddress=$weighAddress")
WeightUtil.tareTwo(weighAddress) WeightUtil.tareTwo(weighAddress)
@@ -138,7 +176,7 @@ class BottomDialog2(
// WeightUtil.tareTwo(num+1) // WeightUtil.tareTwo(num+1)
// } // }
} }
WeightUtil.addWeightListener ( WeightUtil.addWeightListener(
weightKey = TAG, weightKey = TAG,
getWeight = { address, state, weight -> getWeight = { address, state, weight ->
if (weighAddress == address) { if (weighAddress == address) {
@@ -167,71 +205,119 @@ class BottomDialog2(
private var currentWeight = 0.toDouble() private var currentWeight = 0.toDouble()
private var pageNo = 1 private var pageNo = 1
private val pageSize = 120 private val pageSize = 50
/** /**
*/ */
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
private fun getGoodsList() { private fun getGoodsList() {
val queryParams = mutableMapOf( // val queryParams = mutableMapOf(
"goodsType" to "$goodsType", // "goodsType" to "1",
"canteenId" to BaseApp.canteenId, // "canteenId" to BaseApp.canteenId,
"pageNo" to "$pageNo", // "pageNo" to "$pageNo",
"pageSize" to "$pageSize" // "pageSize" to "$pageSize"
// )
// if (goodsName.isNullOrBlank().not()) {
// queryParams.put("name", goodsName!!)
// }
// val sb = StringBuilder().apply {
// append(UrlConfig.QUERY_GOODS_LIST)
// append("?")
// queryParams.forEach { (key, value) ->
// append("$key=$value&")
// }
// }
// sb.deleteCharAt(sb.length - 1)
// Log.d(TAG, "getGoodsList: url = $sb")
// HttpUtil.get(
// url = sb.toString(),
// doSuccess = {
// val json = it.toJsonString()
// Log.d(TAG, "getGoodsList: json=$json")
// val recordBean: SeasoningRecordBean? = json.toObject<SeasoningRecordBean>()
// if (recordBean == null || recordBean.records.isNullOrEmpty()) {
// activity?.toast( "暂未搜索到调料信息")
// return@get
// }
// val records = recordBean.records
// if (pageNo == 1) {
// list.clear()
// }
// list.addAll(records!!)
// searchAdapter.notifyDataSetChanged()
// if (pageNo == 1) {
// binding.refreshLayout.finishRefresh(1200)
// } else {
// binding.refreshLayout.finishLoadMore(1200)
// }
// val isLoadMoreEnable = records.size >= pageSize
// binding.refreshLayout.setEnableLoadMore(isLoadMoreEnable)
// if (isLoadMoreEnable) {
// pageNo++
// }
// }, doFailure = { code, msg ->
// activity?.toast(msg)
// if (pageNo == 1) {
// binding.refreshLayout.finishRefresh(1200)
// } else {
// binding.refreshLayout.finishLoadMore(1200)
// }
// })
val param = mutableMapOf<String, Any>(
"goodsType" to "1",
"placeId" to BaseApp.canteenId,
"pageNum" to pageNo,
"pageSize" to pageSize
) )
if (goodsName.isNullOrBlank().not()) { if (goodsName.isNullOrBlank().not()) {
queryParams.put("name", goodsName!!) param.put("goodsName", goodsName!!)
} }
val sb = StringBuilder().apply { activity?.querySeasoningList(
append(UrlConfig.QUERY_GOODS_LIST) param = param,
append("?") onSuccess = {
queryParams.forEach { (key, value) -> loadGoodsList(it)
append("$key=$value&") },
} onFailure = { code, msg ->
}
sb.deleteCharAt(sb.length - 1)
Log.d(TAG, "getGoodsList: url = $sb")
HttpUtil.get(
url = sb.toString(),
doSuccess = {
val json = it.toJsonString()
Log.d(TAG, "getGoodsList: json=$json")
val recordBean: SeasoningRecordBean? = json.toObject<SeasoningRecordBean>()
if (recordBean == null || recordBean.records.isNullOrEmpty()) {
activity?.toast(if (goodsType == 1) "暂未搜索到调料信息" else "暂未搜索到食材信息")
return@get
}
val records = recordBean.records
if (pageNo == 1) {
list.clear()
}
list.addAll(records!!)
searchAdapter.notifyDataSetChanged()
if (pageNo == 1) {
binding.refreshLayout.finishRefresh(1200)
} else {
binding.refreshLayout.finishLoadMore(1200)
}
val isLoadMoreEnable = records.size >= pageSize
binding.refreshLayout.setEnableLoadMore(isLoadMoreEnable)
if (isLoadMoreEnable) {
pageNo++
}
}, doFailure = { code, msg ->
activity?.toast(msg) activity?.toast(msg)
if (pageNo == 1) { finishRefresh()
binding.refreshLayout.finishRefresh(1200) }
} else { )
binding.refreshLayout.finishLoadMore(1200) }
}
}) @SuppressLint("NotifyDataSetChanged")
private fun loadGoodsList(records: MutableList<SeasoningEntity>?) {
finishRefresh()
if (records.isNullOrEmpty()) {
activity?.toast("暂未搜索到调料信息")
return
}
if (pageNo == 1) {
list.clear()
}
list.addAll(records)
searchAdapter.notifyDataSetChanged()
val isLoadMoreEnable = records.size >= pageSize
binding.refreshLayout.setEnableLoadMore(isLoadMoreEnable)
if (isLoadMoreEnable) {
pageNo++
}
}
private fun finishRefresh() {
if (pageNo == 1) {
binding.refreshLayout.finishRefresh()
} else {
binding.refreshLayout.finishLoadMore()
}
} }
fun getTextSpan(weight: Double): SpannableStringBuilder { fun getTextSpan(weight: Double): SpannableStringBuilder {
var topWeight = "$weight" var topWeight = "$weight"
var bottomUnit = "" var bottomUnit = ""
if (weight >= 1000) { if (weight >= 1000) {
topWeight = "${(weight/1000).roundedDecimalPlace(3)}" topWeight = "${(weight / 1000).roundedDecimalPlace(3)}"
bottomUnit = "千克" bottomUnit = "千克"
} }
return buildSpannableString { return buildSpannableString {
@@ -23,6 +23,10 @@ data class CookFoodEntity(
) : BaseEntity { ) : BaseEntity {
@Ignore @Ignore
var stFoodInfoConstituteList: MutableList<CookFoodGoodsEntity>? = null var stFoodInfoConstituteList: MutableList<CookFoodGoodsEntity>? = null
@Ignore
var matchingConstituteInfoList: MutableList<CookFoodGoodsEntity>? = null
@Ignore
var foodConstituteList: MutableList<CookFoodGoodsEntity>? = null
constructor() : this(foodId = "") // 必需的空构造 constructor() : this(foodId = "") // 必需的空构造
} }
@@ -43,10 +43,14 @@ class CookFoodGoodsEntity(
*/ */
var materialType: Int = 0, var materialType: Int = 0,
// /**
// * 物品 是否全部可食:1-全部可食,0-部分可食,默认全部
// */
// var allEdible: Int = 1,
/** /**
* 物品 是否全部可食:1-全部可食,0-部分可食,默认全部 * 物品 是否全部可食:true-全部可食,false-部分可食,默认全部
*/ */
var allEdible: Int = 1, var allEdible: Boolean = true,
/** /**
* 物品 用料重量 * 物品 用料重量
@@ -78,4 +82,8 @@ class CookFoodGoodsEntity(
@Ignore @Ignore
var isClicked: Boolean = false var isClicked: Boolean = false
//true-原始数据,false-非原始数据
@Ignore
var isOriginalData: Boolean = true
} }
@@ -13,7 +13,8 @@ data class FoodRecord(
var cookMode: Int = 0, var cookMode: Int = 0,
//1-早餐,2-午餐,3-晚餐 //1-早餐,2-午餐,3-晚餐
var dinnerType: String = "0", var dinnerType: String = "0",
//true-原始数据,false-非原始数据
var isOriginalData: Boolean = true,
var sort: Int = 0 var sort: Int = 0
) : Serializable ) : Serializable
@@ -36,11 +36,14 @@ data class SeasoningEntity(
*/ */
var materialType: Int = 3, var materialType: Int = 3,
// /**
// * 物品 是否全部可食:1-全部可食,0-部分可食,默认全部
// */
// var allEdible: Int = 1,
/** /**
* 物品 是否全部可食:1-全部可食,0-部分可食,默认全部 * 物品 是否全部可食:true-全部可食,false-部分可食,默认全部
*/ */
var allEdible: Int = 1, var allEdible: Boolean = true,
/** /**
* 物品 用料重量 * 物品 用料重量
*/ */
@@ -54,9 +57,9 @@ data class SeasoningEntity(
var sort: Int = 9999, var sort: Int = 9999,
/** /**
* isDel表示数据是否已删除,1-已删除,为无效数据,0-正常使用,有效数据 * isDel表示数据是否已删除,1-已删除,为无效数据,0-正常使用,有效数据
*/ */
var isDel: Int = 0, var isDel: Int = 0,
var createTime: String = DateTimeUtil.formatDateTime(LocalDateTime.now()) var createTime: String = DateTimeUtil.formatDateTime(LocalDateTime.now())
) : BaseEntity { ) : BaseEntity {
@Ignore @Ignore
@@ -1,70 +1,70 @@
package com.shuwei.dish.match.http //package com.shuwei.dish.match.http
//
import android.annotation.SuppressLint //import android.annotation.SuppressLint
import android.util.Log //import android.util.Log
import okhttp3.Call //import okhttp3.Call
import okhttp3.Interceptor //import okhttp3.Interceptor
import okhttp3.OkHttpClient //import okhttp3.OkHttpClient
import okhttp3.Request //import okhttp3.Request
import okhttp3.Response //import okhttp3.Response
import java.util.concurrent.TimeUnit //import java.util.concurrent.TimeUnit
//
import javax.net.ssl.* //import javax.net.ssl.*
import java.security.SecureRandom //import java.security.SecureRandom
import java.security.cert.X509Certificate //import java.security.cert.X509Certificate
//
class HttpClient private constructor() { //class HttpClient private constructor() {
private val client: OkHttpClient by lazy { // private val client: OkHttpClient by lazy {
OkHttpClient.Builder() // OkHttpClient.Builder()
.apply { // .apply {
connectTimeout(15, TimeUnit.SECONDS) // connectTimeout(15, TimeUnit.SECONDS)
readTimeout(30, TimeUnit.SECONDS) // readTimeout(30, TimeUnit.SECONDS)
writeTimeout(15, TimeUnit.SECONDS) // writeTimeout(15, TimeUnit.SECONDS)
sslSocketFactory(createSSLSocketFactory(), TrustAllCerts()) // sslSocketFactory(createSSLSocketFactory(), TrustAllCerts())
hostnameVerifier { _, _ -> true } // hostnameVerifier { _, _ -> true }
//if (BuildConfig.Debug) { // //if (BuildConfig.Debug) {
addInterceptor(LoggingInterceptor()) // addInterceptor(LoggingInterceptor())
// } // // }
} // }
.build() // .build()
} // }
//
companion object { // companion object {
val instance by lazy { HttpClient() } // val instance by lazy { HttpClient() }
} // }
//
fun newCall(request: Request): Call = client.newCall(request) // fun newCall(request: Request): Call = client.newCall(request)
//
inner class LoggingInterceptor : Interceptor { // inner class LoggingInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response { // override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request() // val request = chain.request()
// 打印请求日志 // // 打印请求日志
Log.d("OkHttp", "--> ${request.method} ${request.url}") // Log.d("OkHttp", "--> ${request.method} ${request.url}")
//
val response = chain.proceed(request) // val response = chain.proceed(request)
// 打印响应日志 // // 打印响应日志
Log.d("OkHttp", "<-- ${response.code} ${response.request.url}") // Log.d("OkHttp", "<-- ${response.code} ${response.request.url}")
//
return response // return response
} // }
} // }
//
// 信任所有证书的TrustManager实现 // // 信任所有证书的TrustManager实现
@SuppressLint("CustomX509TrustManager") // @SuppressLint("CustomX509TrustManager")
class TrustAllCerts : X509TrustManager { // class TrustAllCerts : X509TrustManager {
@SuppressLint("TrustAllX509TrustManager") // @SuppressLint("TrustAllX509TrustManager")
override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {} // override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {}
@SuppressLint("TrustAllX509TrustManager") // @SuppressLint("TrustAllX509TrustManager")
override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {} // override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {}
override fun getAcceptedIssuers(): Array<X509Certificate> = arrayOf() // override fun getAcceptedIssuers(): Array<X509Certificate> = arrayOf()
} // }
//
// 创建信任所有证书的SSLSocketFactory // // 创建信任所有证书的SSLSocketFactory
fun createSSLSocketFactory(): SSLSocketFactory { // fun createSSLSocketFactory(): SSLSocketFactory {
val sslContext = SSLContext.getInstance("TLS").apply { // val sslContext = SSLContext.getInstance("TLS").apply {
init(null, arrayOf(TrustAllCerts()), SecureRandom()) // init(null, arrayOf(TrustAllCerts()), SecureRandom())
} // }
return sslContext.socketFactory // return sslContext.socketFactory
} // }
//
} //}
@@ -1,199 +1,199 @@
package com.shuwei.dish.match.http //package com.shuwei.dish.match.http
import android.os.Handler
import android.os.Looper
import android.util.Log
import com.google.gson.reflect.TypeToken
import com.shuwei.dish.match.base.BaseApp
import com.shuwei.dish.match.base.BaseReq
import com.shuwei.dish.match.utils.SpTool
import com.shuwei.dish.match.utils.ext.toType
import okhttp3.Call
import okhttp3.Callback
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import java.io.IOException
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit
object HttpUtil {
var loopGetToken = true
fun runMainThread(action: () -> Unit) {
Handler(Looper.getMainLooper()).post {
action()
}
}
// GET请求(HTTPS
fun get(
url: String,
header: Map<String, String>?=null,
doSuccess: (data: Any) -> Unit,
doFailure: (code: Int?, msg: String?) -> Unit
) {
val request = Request.Builder()
.url(if (url.isHttpApi()) url else UrlConfig.BASE_URL + url)
.apply {
if (header != null) {
header.forEach {
addHeader(it.key, it.value)
}
} else {
val token = getToken()
if (token.isNotBlank()) {
addHeader("X-Access-Token", token)
}
}
}
.get()
.build()
HttpClient.instance.newCall(request).enqueue(CallbackImpl(doSuccess, doFailure))
}
// //
//import android.os.Handler
//import android.os.Looper
//import android.util.Log
//import com.google.gson.reflect.TypeToken
//import com.shuwei.dish.match.base.BaseApp
//import com.shuwei.dish.match.base.BaseReq
//import com.shuwei.dish.match.utils.SpTool
//import com.shuwei.dish.match.utils.ext.toType
//import okhttp3.Call
//import okhttp3.Callback
//import okhttp3.MediaType.Companion.toMediaTypeOrNull
//import okhttp3.Request
//import okhttp3.RequestBody.Companion.toRequestBody
//import okhttp3.Response
//import java.io.IOException
//import java.util.concurrent.Executors
//import java.util.concurrent.TimeUnit
//
//
//object HttpUtil {
//
// var loopGetToken = true
//
// fun runMainThread(action: () -> Unit) {
// Handler(Looper.getMainLooper()).post {
// action()
// }
// }
//
// // GET请求(HTTPS
// fun get( // fun get(
// isHttps: Boolean = false, // url: String,
// host: String = "vip.shuziweidao.com", // header: Map<String, String>?=null,
// pathSegmentList: List<String>,
// queryParams: Map<String, String>,
// doSuccess: (data: Any) -> Unit, // doSuccess: (data: Any) -> Unit,
// doFailure: (code: Int?, msg: String?) -> Unit // doFailure: (code: Int?, msg: String?) -> Unit
// ) { // ) {
// val token = getToken()
// val url = HttpUrl.Builder()
// .scheme(if (isHttps) "https" else "http")
// .host(host)
// .apply {
// pathSegmentList.forEach { addPathSegment(it) }
// queryParams.forEach { (key, value) -> addQueryParameter(key, value) }
// }
// .build()
// val request = Request.Builder() // val request = Request.Builder()
// .url(url) // .url(if (url.isHttpApi()) url else UrlConfig.BASE_URL + url)
// .apply { // .apply {
// if (token.isNotBlank()) { // if (header != null) {
// addHeader("Authorization", token) // header.forEach {
// addHeader(it.key, it.value)
// }
// } else {
// val token = getToken()
// if (token.isNotBlank()) {
// addHeader("X-Access-Token", token)
// }
// } // }
// } // }
// .get() // .get()
// .build() // .build()
// HttpClient.instance.newCall(request).enqueue(CallbackImpl(doSuccess, doFailure)) // HttpClient.instance.newCall(request).enqueue(CallbackImpl(doSuccess, doFailure))
// } // }
////
// POST表单(HTTPS //// fun get(
// fun postForm(url: String, params: Map<String, String>, callback: Callback) { //// isHttps: Boolean = false,
// val formBody = FormBody.Builder().apply { //// host: String = "vip.shuziweidao.com",
// params.forEach { (k, v) -> add(k, v) } //// pathSegmentList: List<String>,
// }.build() //// queryParams: Map<String, String>,
//// doSuccess: (data: Any) -> Unit,
//// doFailure: (code: Int?, msg: String?) -> Unit
//// ) {
//// val token = getToken()
//// val url = HttpUrl.Builder()
//// .scheme(if (isHttps) "https" else "http")
//// .host(host)
//// .apply {
//// pathSegmentList.forEach { addPathSegment(it) }
//// queryParams.forEach { (key, value) -> addQueryParameter(key, value) }
//// }
//// .build()
//// val request = Request.Builder()
//// .url(url)
//// .apply {
//// if (token.isNotBlank()) {
//// addHeader("Authorization", token)
//// }
//// }
//// .get()
//// .build()
//// HttpClient.instance.newCall(request).enqueue(CallbackImpl(doSuccess, doFailure))
//// }
// //
// // POST表单(HTTPS
//// fun postForm(url: String, params: Map<String, String>, callback: Callback) {
//// val formBody = FormBody.Builder().apply {
//// params.forEach { (k, v) -> add(k, v) }
//// }.build()
////
//// Request.Builder()
//// .url(url)
//// .post(formBody)
//// .build().let { HttpClient.instance.newCall(it).enqueue(callback) }
//// }
//
// // POST JSONHTTPS
// fun postJson(
// url: String,
// json: String,
// doSuccess: (data: Any) -> Unit,
// doFailure: (code: Int?, msg: String?) -> Unit
// ) {
// val body = json
// .toRequestBody("application/json; charset=utf-8".toMediaTypeOrNull())
// val token = getToken()
// Request.Builder() // Request.Builder()
// .url(url) // .url(if (url.isHttpApi()) url else UrlConfig.BASE_URL + url)
// .post(formBody) // .apply {
// .build().let { HttpClient.instance.newCall(it).enqueue(callback) } // if (token.isNotBlank()) {
// addHeader("X-Access-Token", token)
// }
// }
// .post(body)
// .build()
// .let { HttpClient.instance.newCall(it).enqueue(CallbackImpl(doSuccess, doFailure)) }
// } // }
//
// POST JSONHTTPS //
fun postJson( // val executor = Executors.newSingleThreadScheduledExecutor()
url: String, // var getTokenIsRunning = false
json: String, // private fun exeTokenThread() {
doSuccess: (data: Any) -> Unit, // if (getTokenIsRunning.not()) {
doFailure: (code: Int?, msg: String?) -> Unit // executor.scheduleWithFixedDelay(
) { // task, 0, 1, TimeUnit.MINUTES
val body = json // )
.toRequestBody("application/json; charset=utf-8".toMediaTypeOrNull()) // getTokenIsRunning = true
val token = getToken() // }
Request.Builder() // }
.url(if (url.isHttpApi()) url else UrlConfig.BASE_URL + url) //
.apply { // val task = Runnable {
if (token.isNotBlank()) { // if (BaseApp.token.isNullOrBlank()) {
addHeader("X-Access-Token", token) // getAppToken()
} // } else {
} // executor.shutdown()
.post(body) // }
.build() // }
.let { HttpClient.instance.newCall(it).enqueue(CallbackImpl(doSuccess, doFailure)) } //
} // fun getToken() = SpTool.getString(SpTool.TOKEN)
////BaseApp.instance?.token ?:""
////BaseApp.getSharedPref()?.getString("token", "") ?: ""
val executor = Executors.newSingleThreadScheduledExecutor() //
var getTokenIsRunning = false // fun getAppToken() {
private fun exeTokenThread() { // val url = "${UrlConfig.GET_TOKEN}?qrcodeId=${SpTool.getString(SpTool.DEVICE_ID)}"
if (getTokenIsRunning.not()) { //// Log.d(TAG, "getToken: url = $url")
executor.scheduleWithFixedDelay( // get(url = url, doSuccess = {
task, 0, 1, TimeUnit.MINUTES // SpTool.put(SpTool.TOKEN, it)
) // BaseApp.token = it.toString()
getTokenIsRunning = true // }) { code, msg ->
} // //toast(msg)
} // }
// }
val task = Runnable { //
if (BaseApp.token.isNullOrBlank()) { // class CallbackImpl(
getAppToken() // private val doSuccess: (data: Any) -> Unit,
} else { // private val doFailure: (code: Int?, msg: String?) -> Unit
executor.shutdown() // ) :
} // Callback {
} // override fun onFailure(call: Call, e: IOException) {
// runMainThread {
fun getToken() = SpTool.getString(SpTool.TOKEN) // e.printStackTrace()
//BaseApp.instance?.token ?:"" // doFailure(-1, "服务异常,${e.message}")
//BaseApp.getSharedPref()?.getString("token", "") ?: "" // }
// }
fun getAppToken() { //
val url = "${UrlConfig.GET_TOKEN}?qrcodeId=${SpTool.getString(SpTool.DEVICE_ID)}" // override fun onResponse(call: Call, response: Response) {
// Log.d(TAG, "getToken: url = $url") // val respData = response.body?.string()
get(url = url, doSuccess = { // runMainThread {
SpTool.put(SpTool.TOKEN, it) // Log.d("HttpUtil", respData ?: "")
BaseApp.token = it.toString() // runCatching {
}) { code, msg -> // val typeToken = object : TypeToken<BaseReq<Any>>() {}
//toast(msg) // val baseReq = respData?.toType<BaseReq<Any>>(typeToken = typeToken)
} // if (baseReq == null) {
} // doFailure(-1, "查询数据失败")
// return@runCatching
class CallbackImpl( // }
private val doSuccess: (data: Any) -> Unit, // if (baseReq.code != 200) {
private val doFailure: (code: Int?, msg: String?) -> Unit // doFailure(baseReq.code, baseReq.message)
) : // //baseReq.code == 500 ||
Callback { // if (baseReq.code == 401 && loopGetToken) {
override fun onFailure(call: Call, e: IOException) { // exeTokenThread()
runMainThread { // }
e.printStackTrace() // return@runCatching
doFailure(-1, "服务异常,${e.message}") // }
} // doSuccess(baseReq.result ?: "")
} // }.onFailure {
// it.printStackTrace()
override fun onResponse(call: Call, response: Response) { // doFailure(-1, "解析异常")
val respData = response.body?.string() // }
runMainThread { // }
Log.d("HttpUtil", respData ?: "") // }
runCatching { //
val typeToken = object : TypeToken<BaseReq<Any>>() {} // }
val baseReq = respData?.toType<BaseReq<Any>>(typeToken = typeToken) //
if (baseReq == null) { //}
doFailure(-1, "查询数据失败") //
return@runCatching //fun String.isHttpApi() = this.startsWith("http://") || this.startsWith("https://")
}
if (baseReq.code != 200) {
doFailure(baseReq.code, baseReq.message)
//baseReq.code == 500 ||
if (baseReq.code == 401 && loopGetToken) {
exeTokenThread()
}
return@runCatching
}
doSuccess(baseReq.result ?: "")
}.onFailure {
it.printStackTrace()
doFailure(-1, "解析异常")
}
}
}
}
}
fun String.isHttpApi() = this.startsWith("http://") || this.startsWith("https://")
@@ -1,36 +1,37 @@
package com.shuwei.dish.match.http package com.shuwei.dish.match.http
import com.shuwei.dish.match.base.BaseApp //import com.shuwei.dish.match.base.BaseApp
object UrlConfig { object UrlConfig {
private const val DEVICE_BASE_URL = "http://device.shuziweidao.com:8889" // private const val DEVICE_BASE_URL = "http://device.shuziweidao.com:8889"
/** // /**
* device获取token // * device获取token
*/ // */
const val DEVICE_TOKEN = "${DEVICE_BASE_URL}/sys/getEquipmentToken" // const val DEVICE_TOKEN = "${DEVICE_BASE_URL}/sys/getEquipmentToken"
/** // /**
*获取配置信息 // *获取配置信息
*/ // */
const val DEVICE_CONFIG = "${DEVICE_BASE_URL}/equipment/stEquipment/queryByEquipmentCode" // const val DEVICE_CONFIG = "${DEVICE_BASE_URL}/equipment/stEquipment/queryByEquipmentCode"
// const val BASE_URL = "http://vip.shuziweidao.com/shuwei-zhct" // const val BASE_URL = "http://vip.shuziweidao.com/shuwei-zhct"
// const val DISH_DETAIL = "$BASE_URL/scales/goodsUseList?foodId={foodId}&foodWeight={foodWeight}" // const val DISH_DETAIL = "$BASE_URL/scales/goodsUseList?foodId={foodId}&foodWeight={foodWeight}"
// const val DISH_LIST = "$BASE_URL/scales/getRestInfoFoods?eaId=99&type=0&foodName" // const val DISH_LIST = "$BASE_URL/scales/getRestInfoFoods?eaId=99&type=0&foodName"
// const val BASE_URL = "http://192.168.1.207:9102" // const val BASE_URL = "http://192.168.1.207:9102"
const val BASE_URL = "https://yyjk.shuziweidao.com/gateway" // const val BASE_URL = "https://yyjk.shuziweidao.com/gateway"
const val BASE_URL = "https://yyjk.shuziweidao.com/gateway/"
// const val DISH_LIST = "$BASE_URL/scales/getRestInfoFoods?eaId=99&type=0&foodName" // const val DISH_LIST = "$BASE_URL/scales/getRestInfoFoods?eaId=99&type=0&foodName"
var DISH_DETAIL = "${BaseApp.configUrl}/food/stFoodInfoMatching/queryById" // var DISH_DETAIL = "${BaseApp.configUrl}/food/stFoodInfoMatching/queryById"
//
// "$BASE_URL/scales/generateToken?deviceId=1111111111111111111111111111" // // "$BASE_URL/scales/generateToken?deviceId=1111111111111111111111111111"
//
var GET_TOKEN = "${BaseApp.configUrl}/restaurant/equipment/stEquipment/getEquipmentToken" // var GET_TOKEN = "${BaseApp.configUrl}/restaurant/equipment/stEquipment/getEquipmentToken"
var SUBMIT_DISH = "${BaseApp.configUrl}/food/stFoodInfoMatching/saveoredit" // var SUBMIT_DISH = "${BaseApp.configUrl}/food/stFoodInfoMatching/saveoredit"
//
var QUERY_GOODS_LIST = "${BaseApp.configUrl}/food/stFoodInfoMatching/queryGoodsInfoList" // var QUERY_GOODS_LIST = "${BaseApp.configUrl}/food/stFoodInfoMatching/queryGoodsInfoList"
var QUERY_FOOD_LIST = "${BaseApp.configUrl}/food/stFoodInfoMatching/list" // var QUERY_FOOD_LIST = "${BaseApp.configUrl}/food/stFoodInfoMatching/list"
var SAMPLING_LIST = "${BaseApp.configUrl}/food/stFoodInfoMatching/queryHistorical/goodsInfoList" // var SAMPLING_LIST = "${BaseApp.configUrl}/food/stFoodInfoMatching/queryHistorical/goodsInfoList"
} }
@@ -0,0 +1,118 @@
package com.shuwei.dish.match.net
import com.shuwei.dish.match.utils.ext.toJsonString
import com.shuwei.dish.match.utils.ext.toObject
import com.shuwei.dish.match.utils.ext.toType
import org.apache.http.conn.ConnectTimeoutException
import retrofit2.HttpException
import java.io.IOException
import java.net.SocketTimeoutException
import java.net.UnknownHostException
///**
// * 通用网络请求封装,统一处理异常
// * @param onRequest 实际的 Retrofit 接口请求
// * @param onSuccess 成功回调
// * @param onFailure 自定义错误回调(可选,不传则用默认提示)
// */
//suspend fun <T> apiRequest(
// onRequest: suspend () -> T,
// onSuccess: (T) -> Unit,
// onFailure: ((ApiException) -> Unit)? = null
//) {
// try {
// // 执行实际的网络请求
// val result = onRequest()
// onSuccess(result)
// } catch (e: Exception) {
// val apiException = getApiException(e)
// // 优先执行自定义错误回调,没有则用默认提示
// if (onFailure != null) {
// onFailure(apiException)
// } else {
// // 默认的错误提示(可根据 ErrorType 定制)
// val tip = apiException.errorMsg
// // 切换到UI线程弹提示(用 MainScope 确保在主线程)
// MainScope().launch {
// BaseApp.instance?.toast(tip)
// }
// }
// }
//}
/**
* 通用网络请求封装,统一处理异常
* @param onRequest 实际的 Retrofit 接口请求
* @param onSuccess 成功回调
* @param onFailure 自定义错误回调(可选,不传则用默认提示)
*/
suspend fun <T> request(
onRequest: suspend () -> ApiResponse<T>,
onSuccess: (T) -> Unit,
onFailure: (String, String) -> Unit
) {
var response: ApiResponse<T>?
try {
// 执行实际的网络请求
response = onRequest()
} catch (e: Exception) {
val apiException = getApiException(e)
onFailure("-1", apiException.errorMsg)
return
}
if (response?.isSuccess() == true) {
onSuccess(response.data as T)
} else {
onFailure(response?.code ?: "-1", response?.msg ?: "")
}
}
data class CodeMsg(
var code: String? = null,
var msg: String? = null
)
fun getApiException(e: Exception): ApiException {
// 捕获各类网络异常并转换为自定义异常
return when (e) {
is HttpException -> httpException2ApiException(e)
is UnknownHostException -> ApiException(
ErrorType.NETWORK_ERROR,
errorMsg = "网络未连接,请检查网络"
)
is SocketTimeoutException -> ApiException(
ErrorType.TIMEOUT_ERROR,
errorMsg = "请求超时,请稍后重试"
)
is ConnectTimeoutException -> ApiException(
ErrorType.TIMEOUT_ERROR,
errorMsg = "连接超时,请检查网络"
)
is IOException -> ApiException(
ErrorType.NETWORK_ERROR,
errorMsg = "网络异常:${e.message ?: "未知IO错误"}"
)
is ApiException -> e
else -> ApiException(
ErrorType.UNKNOWN_ERROR,
errorMsg = "未知错误:${e.message ?: "未知"}",
throwable = e
)
}
}
fun httpException2ApiException(e: HttpException): ApiException {
val body = e.response()?.errorBody()?.string()
val codeMsg: CodeMsg? = body?.toObject<CodeMsg>()
return ApiException(
ErrorType.NETWORK_ERROR,
errorMsg = codeMsg?.msg ?: ""
)
}
@@ -0,0 +1,113 @@
package com.shuwei.dish.match.net
import com.shuwei.dish.match.base.GlobalData
import com.shuwei.dish.match.entity.CookFoodEntity
import com.shuwei.dish.match.entity.CookFoodGoodsEntity
import com.shuwei.dish.match.entity.FoodRecord
import com.shuwei.dish.match.entity.SeasoningEntity
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.Query
import retrofit2.http.Url
interface ApiService {
/**
* 查询菜品详情
*/
@GET
suspend fun getFoodDetail(
@Url url: String = "${GlobalData.appBaseUrl}/terminal/neglect/matching/app/getConstituteByFoodId",
@Query("foodId") foodId: String
): ApiResponse<CookFoodEntity?>
/**
* 提交制作菜品
*/
@POST
suspend fun submitCookFood(
@Url url: String = "${GlobalData.appBaseUrl}/terminal/neglect/matching/app/saveConstitute",
@Body param: CookFoodEntity
): ApiResponse<Any?>
/**
* 搜索菜品
*/
@POST
suspend fun searchFoodList(
@Url url:String = "${GlobalData.appBaseUrl}/terminal/neglect/matching/app/queryPageList",
@Body param: MutableMap<String, Any>
): ApiResponse<MutableList<FoodRecord>?>
/**
* 采样数据
*/
@POST
suspend fun getSamplingList(
@Url url:String = "${GlobalData.appBaseUrl}/terminal/neglect/matching/app/queryHistoryGoodsInfoList",
@Body param: MutableMap<String, Any>
): ApiResponse<MutableList<FoodRecord>?>
/**
* 物品信息
*/
@POST
suspend fun queryGoodsList(
@Url url:String = "${GlobalData.appBaseUrl}/terminal/neglect/matching/app/queryGoodsInfoList",
@Body param: MutableMap<String, Any>
): ApiResponse<MutableList<CookFoodGoodsEntity>?>
/**
* 调料信息
*/
@POST
suspend fun querySeasoningList(
@Url url:String = "${GlobalData.appBaseUrl}/terminal/neglect/matching/app/queryGoodsInfoList",
@Body param: MutableMap<String, Any>
): ApiResponse<MutableList<SeasoningEntity>?>
// /**
// *获取配置信息
// */
// @GET("/equipment/stEquipment/queryByEquipmentCode")
// suspend fun getDeviceInfo(
// @Query("equipmentCode") equipmentCode: String,
// @Query("appVersion") appVersion: String = App.appVersion
// ): ApiResponse<DeviceConfigInfo>
//
// @GET
// suspend fun getAccessToken(
// @Url url: String = UrlConfig.GET_ACCESS_TOKEN,
// @Query("qrcodeId") qrcodeId: String
// ): ApiResponse<String?>
//
// @GET
// suspend fun getShelfList(
// @Url url: String = UrlConfig.GET_SHELF_LIST,
// @Query("deviceId") deviceId: String
// ): ApiResponse<ShelfResult>
//
// @GET
// suspend fun getGoodsList(
// @Url url: String = UrlConfig.GET_GOODS_LIST,
// @Query("canteenId") canteenId: String = "0",
// @Query("goodsName") goodsName: String? = null,
// @Query("pageNo") pageNo: Int = 1,
// @Query("pageSize") pageSize: Int = 50
// ): ApiResponse<MutableList<GoodsModel>?>
//
// @POST
// suspend fun saveShelfGoodsList(
// @Url url: String = UrlConfig.SAVE_SHELF_GOODS_LIST,
// @Body body: ShelfBody
// ): ApiResponse<Any?>
}
@@ -0,0 +1,19 @@
package com.shuwei.dish.match.net
// 1. 网络异常类型枚举
enum class ErrorType {
NETWORK_ERROR, // 网络错误(无网)
TIMEOUT_ERROR, // 超时
SERVER_ERROR, // 服务器错误(5xx
CLIENT_ERROR, // 客户端错误(4xx
PARSE_ERROR, // 数据解析错误
UNKNOWN_ERROR // 未知错误
}
// 2. 自定义网络异常类
class ApiException(
val errorType: ErrorType,
val errorCode: Int = -1,
val errorMsg: String,
val throwable: Throwable? = null
) : Exception(errorMsg, throwable)
@@ -0,0 +1,40 @@
//package com.shuwei.dish.match.net
//
//import android.annotation.SuppressLint
//import okhttp3.Interceptor
//import okhttp3.Response
//import org.apache.http.conn.ConnectTimeoutException
//import java.io.IOException
//import java.net.SocketTimeoutException
//import java.net.UnknownHostException
//
//class ExceptionInterceptor : Interceptor {
// @SuppressLint("SuspiciousIndentation")
// override fun intercept(chain: Interceptor.Chain): Response {
// val request = chain.request()
// try {
// val response = chain.proceed(request)
// // 拦截 HTTP 状态码异常(4xx/5xx
// if (!response.isSuccessful) {
// val e = ApiException(
// errorType = if (response.code >= 500) ErrorType.SERVER_ERROR else ErrorType.CLIENT_ERROR,
// errorCode = response.code,
// errorMsg = "HTTP错误:${response.code}"
// )
// throw e
// }
// return response
// } catch (e: Exception) {
// // 捕获各类网络异常并转换为自定义异常
// val apiException = when (e) {
// is UnknownHostException -> ApiException(ErrorType.NETWORK_ERROR, errorMsg = "网络未连接,请检查网络")
// is SocketTimeoutException -> ApiException(ErrorType.TIMEOUT_ERROR, errorMsg = "请求超时,请稍后重试")
// is ConnectTimeoutException -> ApiException(ErrorType.TIMEOUT_ERROR, errorMsg = "连接超时,请检查网络")
// is IOException -> ApiException(ErrorType.NETWORK_ERROR, errorMsg = "网络异常:${e.message ?: "未知IO错误"}")
// is ApiException -> e // 已转换的异常直接抛出
// else -> ApiException(ErrorType.UNKNOWN_ERROR, errorMsg = "未知错误:${e.message ?: "未知"}", throwable = e)
// }
// throw apiException
// }
// }
//}
@@ -0,0 +1,80 @@
package com.shuwei.dish.match.net
import android.annotation.SuppressLint
import android.util.Log
import com.shuwei.dish.match.http.UrlConfig
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit
import javax.net.ssl.*
import java.security.SecureRandom
import java.security.cert.X509Certificate
import kotlin.apply
import kotlin.jvm.java
val apiService: ApiService = Retrofit.Builder()
.baseUrl(UrlConfig.BASE_URL)
// .baseUrl(UrlConfig.DEVICE_BASE_URL)
.client(HttpManager.instance.client)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(ApiService::class.java)
//val apiService2: ApiService2 = Retrofit.Builder()
// .baseUrl(UrlConfig.BASE_URL)
//// .baseUrl(UrlConfig.DEVICE_BASE_URL)
// .client(HttpManager.instance.client)
// .addConverterFactory(GsonConverterFactory.create())
// .build()
// .create(ApiService2::class.java)
class HttpManager private constructor() {
val client: OkHttpClient by lazy {
OkHttpClient.Builder()
.apply {
connectTimeout(15, TimeUnit.SECONDS)
readTimeout(30, TimeUnit.SECONDS)
writeTimeout(15, TimeUnit.SECONDS)
sslSocketFactory(createSSLSocketFactory(), TrustAllCerts())
hostnameVerifier { _, _ -> true }
addNetworkInterceptor(HttpLoggingInterceptor(logger = {
Log.d("HttpManager", "okhttp logger ==>${it}")
}).also {
it.level = HttpLoggingInterceptor.Level.BODY
})
addInterceptor(RequestInterceptor())
// addInterceptor(ExceptionInterceptor())
}
.build()
}
companion object {
val instance by lazy { HttpManager() }
}
// 信任所有证书的TrustManager实现
@SuppressLint("CustomX509TrustManager")
class TrustAllCerts : X509TrustManager {
@SuppressLint("TrustAllX509TrustManager")
override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {
}
@SuppressLint("TrustAllX509TrustManager")
override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {
}
override fun getAcceptedIssuers(): Array<X509Certificate> = arrayOf()
}
// 创建信任所有证书的SSLSocketFactory
fun createSSLSocketFactory(): SSLSocketFactory {
val sslContext = SSLContext.getInstance("TLS").apply {
init(null, arrayOf(TrustAllCerts()), SecureRandom())
}
return sslContext.socketFactory
}
}
@@ -0,0 +1,111 @@
package com.shuwei.dish.match.net
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.shuwei.dish.match.entity.CookFoodEntity
import com.shuwei.dish.match.entity.CookFoodGoodsEntity
import com.shuwei.dish.match.entity.FoodRecord
import com.shuwei.dish.match.entity.SeasoningEntity
import kotlinx.coroutines.launch
class NetViewModel : ViewModel() {
fun submitCookFood(
entity: CookFoodEntity,
onSuccess: (Any?) -> Unit,
onFailure: (String, String) -> Unit
) {
viewModelScope.launch {
request(
onRequest = {
apiService.submitCookFood(param = entity)
},
onSuccess = onSuccess,
onFailure = onFailure
)
}
}
fun getFoodDetail(
foodId: String,
onSuccess: (CookFoodEntity?) -> Unit,
onFailure: (String, String) -> Unit
) {
viewModelScope.launch {
request(
onRequest = {
apiService.getFoodDetail(foodId = foodId)
},
onSuccess = onSuccess,
onFailure = onFailure
)
}
}
fun searchFoodList(
param: MutableMap<String, Any>,
onSuccess: (MutableList<FoodRecord>?) -> Unit,
onFailure: (String, String) -> Unit
) {
viewModelScope.launch {
request(
onRequest = {
apiService.searchFoodList(param = param)
},
onSuccess = onSuccess,
onFailure = onFailure
)
}
}
fun getSamplingList(
param: MutableMap<String, Any>,
onSuccess: (MutableList<FoodRecord>?) -> Unit,
onFailure: (String, String) -> Unit
) {
viewModelScope.launch {
request(
onRequest = {
apiService.getSamplingList(param = param)
},
onSuccess = onSuccess,
onFailure = onFailure
)
}
}
fun queryGoodsList(
param: MutableMap<String, Any>,
onSuccess: (MutableList<CookFoodGoodsEntity>?) -> Unit,
onFailure: (String, String) -> Unit
) {
viewModelScope.launch {
request(
onRequest = {
apiService.queryGoodsList(param = param)
},
onSuccess = onSuccess,
onFailure = onFailure
)
}
}
fun querySeasoningList(
param: MutableMap<String, Any>,
onSuccess: (MutableList<SeasoningEntity>?) -> Unit,
onFailure: (String, String) -> Unit
) {
viewModelScope.launch {
request(
onRequest = {
apiService.querySeasoningList(param = param)
},
onSuccess = onSuccess,
onFailure = onFailure
)
}
}
}
@@ -0,0 +1,22 @@
package com.shuwei.dish.match.net
import com.shuwei.dish.match.base.GlobalData
import okhttp3.Interceptor
import okhttp3.Response
/**
* 请求拦截器
*/
class RequestInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val originalRequest = chain.request()
val requestBuilder = originalRequest.newBuilder()
.header("X-Access-Token", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjYW50ZWVuSWQiOiJiZTE1NDgzMS0zNDY2LTNiYTItYTJlYS01NzY1MmM5MTlmZWQiLCJ0eXBlIjoiNCIsInVzZXJJZCI6IjAwMDAwMDAwMDAwMDAwMDAwMDEifQ.sN40cOC-O5WQFrF4IDUs8fFlkNdUKLbJt_rHyTsgYYM")
.header("X-DEVICE-CODE", GlobalData.deviceId)
.header("authorization", "57ee87183f2a4fa59683ec9ef41c8f5d")
val newRequest = requestBuilder.build()
return chain.proceed(newRequest)
}
}
@@ -0,0 +1,9 @@
package com.shuwei.dish.match.net
data class ApiResponse<T>(
val code: String,
val msg: String? = "",
val data: T? = null
) {
fun isSuccess() = code == "00000"
}
@@ -9,9 +9,7 @@ import android.text.style.LineHeightSpan
import android.text.style.StyleSpan import android.text.style.StyleSpan
import android.util.Log import android.util.Log
import android.util.SparseArray import android.util.SparseArray
import android.util.SparseIntArray
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.TextView
import androidx.core.graphics.toColorInt import androidx.core.graphics.toColorInt
import androidx.core.view.forEach import androidx.core.view.forEach
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
@@ -34,10 +32,9 @@ import com.shuwei.dish.match.utils.ext.toast
import com.shuwei.dish.match.utils.ext.visible import com.shuwei.dish.match.utils.ext.visible
import com.shuwei.dish.match.viewmodel.AppViewModel import com.shuwei.dish.match.viewmodel.AppViewModel
import com.shuwei.dish.match.viewmodel.factory.AppFactory import com.shuwei.dish.match.viewmodel.factory.AppFactory
import com.shuwei.dish.match.R
import com.shuwei.dish.match.adapter.TextCellAdapter import com.shuwei.dish.match.adapter.TextCellAdapter
import com.shuwei.dish.match.databinding.ActivityDeviceConfigBinding import com.shuwei.dish.match.databinding.ActivityDeviceConfigBinding
import com.shuwei.dish.match.dialog.BottomDialog2 import com.shuwei.dish.match.dialog.SeasoningSearchDialog
import com.shuwei.dish.match.utils.SpTool import com.shuwei.dish.match.utils.SpTool
import com.shuwei.dish.match.utils.ext.clickWithDebounce import com.shuwei.dish.match.utils.ext.clickWithDebounce
import com.shuwei.dish.match.utils.ext.gone import com.shuwei.dish.match.utils.ext.gone
@@ -46,7 +43,7 @@ class DeviceConfigActivity : BaseActivity() {
companion object { companion object {
const val TAG = "DeviceSettingActivity" const val TAG = "DeviceConfigActivity"
const val COOK_MODE = "cookMode" const val COOK_MODE = "cookMode"
@@ -123,7 +120,9 @@ class DeviceConfigActivity : BaseActivity() {
binding.rbModeSampling.isChecked = false binding.rbModeSampling.isChecked = false
loadCookSpan(isClicked = true) loadCookSpan(isClicked = true)
loadSamplingSpan() loadSamplingSpan()
startActivity<SelectDishActivity> { } startActivity<SelectDishActivity> {
putExtra(SelectDishActivity.IS_CONFIG_PAGE, true)
}
finish() finish()
} }
binding.rbModeSampling.setOnClickListener { binding.rbModeSampling.setOnClickListener {
@@ -132,7 +131,8 @@ class DeviceConfigActivity : BaseActivity() {
binding.rbModeSampling.isChecked = true binding.rbModeSampling.isChecked = true
loadCookSpan() loadCookSpan()
loadSamplingSpan(isClicked = true) loadSamplingSpan(isClicked = true)
startActivity<SamplingListActivity> { } startActivity<SamplingListActivity> {
putExtra(SamplingListActivity.IS_CONFIG_PAGE, true) }
finish() finish()
} }
addWeighListener() addWeighListener()
@@ -250,7 +250,7 @@ class DeviceConfigActivity : BaseActivity() {
private fun clickGridItem(sort: Int, entity: SeasoningEntity) { private fun clickGridItem(sort: Int, entity: SeasoningEntity) {
val currentAddress = AddressUtil.getWeighAddressArray().get(sort) val currentAddress = AddressUtil.getWeighAddressArray().get(sort)
// val seasoningEntity = list.first{it.sort == sort} // val seasoningEntity = list.first{it.sort == sort}
BottomDialog2( SeasoningSearchDialog(
weighIndex = sort, weighIndex = sort,
weighAddress = currentAddress, weighAddress = currentAddress,
clickName = entity.goodsName clickName = entity.goodsName
@@ -5,7 +5,9 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.View import android.view.View
import androidx.activity.viewModels
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.shuwei.dish.match.R import com.shuwei.dish.match.R
import com.shuwei.dish.match.adapter.DishPartAdapter import com.shuwei.dish.match.adapter.DishPartAdapter
@@ -14,13 +16,15 @@ import com.shuwei.dish.match.base.BaseApp
import com.shuwei.dish.match.databinding.ActivityDishSamplingBinding import com.shuwei.dish.match.databinding.ActivityDishSamplingBinding
import com.shuwei.dish.match.databinding.LayoutFoodRemindBinding import com.shuwei.dish.match.databinding.LayoutFoodRemindBinding
import com.shuwei.dish.match.db.AppRepository import com.shuwei.dish.match.db.AppRepository
import com.shuwei.dish.match.dialog.BottomDialog import com.shuwei.dish.match.dialog.FoodSearchDialog
import com.shuwei.dish.match.dialog.CommonDialog import com.shuwei.dish.match.dialog.CommonDialog
import com.shuwei.dish.match.entity.CookFoodEntity import com.shuwei.dish.match.entity.CookFoodEntity
import com.shuwei.dish.match.entity.CookFoodGoodsEntity import com.shuwei.dish.match.entity.CookFoodGoodsEntity
import com.shuwei.dish.match.entity.FoodRecord import com.shuwei.dish.match.entity.FoodRecord
import com.shuwei.dish.match.net.NetViewModel
import com.shuwei.dish.match.utils.AddressUtil import com.shuwei.dish.match.utils.AddressUtil
import com.shuwei.dish.match.utils.KeyboardUtil import com.shuwei.dish.match.utils.KeyboardUtil
import com.shuwei.dish.match.utils.SwipeCallback
import com.shuwei.dish.match.utils.WeightUtil import com.shuwei.dish.match.utils.WeightUtil
import com.shuwei.dish.match.utils.ext.addOnActionSearchListener import com.shuwei.dish.match.utils.ext.addOnActionSearchListener
import com.shuwei.dish.match.utils.ext.clickWithDebounce import com.shuwei.dish.match.utils.ext.clickWithDebounce
@@ -165,6 +169,13 @@ class DishSamplingActivity : BaseActivity() {
layoutManager = layoutManager =
LinearLayoutManager(this@DishSamplingActivity, LinearLayoutManager.VERTICAL, false) LinearLayoutManager(this@DishSamplingActivity, LinearLayoutManager.VERTICAL, false)
adapter = dishAdapter adapter = dishAdapter
val itemTouchHelper = ItemTouchHelper(SwipeCallback(dishAdapter) { position ->
list.removeAt(position)
dishAdapter.notifyItemRemoved(position)
dishAdapter.notifyItemRangeChanged(position, list.size - position)
toast("已删除")
})
itemTouchHelper.attachToRecyclerView(this)
} }
binding.etInputDishType.addOnActionSearchListener { binding.etInputDishType.addOnActionSearchListener {
searchDishType() searchDishType()
@@ -266,7 +277,7 @@ class DishSamplingActivity : BaseActivity() {
private fun searchDishType() { private fun searchDishType() {
val inputText = binding.etInputDishType.text.toString().trim() val inputText = binding.etInputDishType.text.toString().trim()
BottomDialog(goodsType = 0, defGoodsName = inputText).show(this@DishSamplingActivity) { item -> FoodSearchDialog(defGoodsName = inputText).show(this@DishSamplingActivity) { item ->
val filterResult = list.firstOrNull { it.goodsName == item.goodsName } val filterResult = list.firstOrNull { it.goodsName == item.goodsName }
if (filterResult != null) { if (filterResult != null) {
toast("不允许重复添加同一食材") toast("不允许重复添加同一食材")
@@ -283,6 +294,7 @@ class DishSamplingActivity : BaseActivity() {
relateionType = item.relateionType ?: 0 relateionType = item.relateionType ?: 0
goodsOrRelationCode = item.goodsOrRelationCode goodsOrRelationCode = item.goodsOrRelationCode
isNewDishType = true
// TODO: 待定 // TODO: 待定
//allEdible = item.allEdible //allEdible = item.allEdible
} }
@@ -11,17 +11,11 @@ import com.shuwei.dish.match.base.BaseActivity
import com.shuwei.dish.match.base.BaseApp import com.shuwei.dish.match.base.BaseApp
import com.shuwei.dish.match.databinding.ActivityFoodSearchBinding import com.shuwei.dish.match.databinding.ActivityFoodSearchBinding
import com.shuwei.dish.match.databinding.LayoutEmptyViewBinding import com.shuwei.dish.match.databinding.LayoutEmptyViewBinding
import com.shuwei.dish.match.entity.FoodRecord import com.shuwei.dish.match.entity.FoodRecord
import com.shuwei.dish.match.entity.FoodRecordBean
import com.shuwei.dish.match.http.HttpUtil
import com.shuwei.dish.match.http.UrlConfig
import com.shuwei.dish.match.utils.KeyboardUtil import com.shuwei.dish.match.utils.KeyboardUtil
import com.shuwei.dish.match.utils.ext.addOnActionSearchListener import com.shuwei.dish.match.utils.ext.addOnActionSearchListener
import com.shuwei.dish.match.utils.ext.gone import com.shuwei.dish.match.utils.ext.gone
import com.shuwei.dish.match.utils.ext.startActivity import com.shuwei.dish.match.utils.ext.startActivity
import com.shuwei.dish.match.utils.ext.toJsonString
import com.shuwei.dish.match.utils.ext.toObject
import com.shuwei.dish.match.utils.ext.toast import com.shuwei.dish.match.utils.ext.toast
import com.shuwei.dish.match.utils.ext.visible import com.shuwei.dish.match.utils.ext.visible
import java.io.Serializable import java.io.Serializable
@@ -40,7 +34,7 @@ class FoodSearchActivity : BaseActivity() {
private var list: MutableList<FoodRecord> = mutableListOf() private var list: MutableList<FoodRecord> = mutableListOf()
private var pageType = 0 private var pageType = 0
private var dinnerType = "0" private var dinnerType = "1"
private val recordAdapter by lazy { private val recordAdapter by lazy {
FoodRecordAdapter(list).apply { FoodRecordAdapter(list).apply {
isStateViewEnable = true isStateViewEnable = true
@@ -68,7 +62,7 @@ class FoodSearchActivity : BaseActivity() {
binding = ActivityFoodSearchBinding.inflate(layoutInflater) binding = ActivityFoodSearchBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
pageType = intent.getIntExtra(PAGE_TYPE, 0) pageType = intent.getIntExtra(PAGE_TYPE, 0)
dinnerType = intent.getStringExtra(DINNER_TYPE)?:"0" dinnerType = intent.getStringExtra(DINNER_TYPE) ?: "0"
setHeaderBackground() setHeaderBackground()
foodName = intent.getStringExtra(FOOD_NAME) foodName = intent.getStringExtra(FOOD_NAME)
binding.etInputDish.setText(foodName) binding.etInputDish.setText(foodName)
@@ -134,7 +128,7 @@ class FoodSearchActivity : BaseActivity() {
} }
private var pageNo = 1 private var pageNo = 1
private var pageSize = 100 private var pageSize = 10
fun getDinnerTypeText(): String { fun getDinnerTypeText(): String {
return when (dinnerType) { return when (dinnerType) {
"1" -> "早餐" "1" -> "早餐"
@@ -143,53 +137,95 @@ class FoodSearchActivity : BaseActivity() {
else -> "早餐" else -> "早餐"
} }
} }
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
private fun queryListInfo(input: String) { private fun queryListInfo(input: String) {
showLoading() showLoading()
val map = mutableMapOf( // val map = mutableMapOf(
// "foodName" to input.trim(),
// "pageNo" to "$pageNo",
// "pageSize" to "$pageSize",
// "canteenId" to BaseApp.canteenId
// "dinnerType" to getDinnerTypeText()
// )
// val sb = StringBuilder(UrlConfig.QUERY_FOOD_LIST).apply {
// append("?")
// map.forEach { (key, value) -> append("$key=$value&") }
// }
// sb.deleteCharAt(sb.length - 1)
// HttpUtil.get(
// url = sb.toString(),
// doSuccess = {
// delayDismissLoading()
// finishRefresh()
// binding.refreshLayout.run {
// setEnableRefresh(true)
// }
// val json = it.toJsonString()
// val recordBean: FoodRecordBean? = json.toObject<FoodRecordBean>()
// if (recordBean == null || recordBean.records.isNullOrEmpty()) {
//// toast("暂未搜索到相关菜品信息")
// if (pageNo == 1) {
// loadEmptyView()
// }
// return@get
// }
// val records = recordBean.records
// if (pageNo == 1) {
// list.clear()
// }
// list.addAll(records!!)
// recordAdapter.notifyDataSetChanged()
// val isLoadMoreEnable = records.size >= pageSize
// binding.refreshLayout.setEnableLoadMore(isLoadMoreEnable)
// if (isLoadMoreEnable) {
// pageNo++
// }
// },
// doFailure = { code, msg ->
// binding.refreshLayout.run {
// setEnableRefresh(true)
// }
// toast(msg)
// delayDismissLoading()
// finishRefresh()
// if (pageNo == 1) {
// loadEmptyView()
// }
// }
// )
val map = mutableMapOf<String, Any>(
"foodName" to input.trim(), "foodName" to input.trim(),
"pageNo" to "$pageNo", "pageNum" to pageNo,
"pageSize" to "$pageSize", "pageSize" to pageSize,
"canteenId" to BaseApp.canteenId "placeId" to BaseApp.canteenId,
"dinnerType" to getDinnerTypeText()
) )
if (dinnerType.toInt() > 0) { netViewModel.searchFoodList(
map["dinnerType"] = getDinnerTypeText() param = map,
} onSuccess = {
val sb = StringBuilder(UrlConfig.QUERY_FOOD_LIST).apply {
append("?")
map.forEach { (key, value) -> append("$key=$value&") }
}
sb.deleteCharAt(sb.length - 1)
HttpUtil.get(
url = sb.toString(),
doSuccess = {
delayDismissLoading() delayDismissLoading()
finishRefresh() finishRefresh()
binding.refreshLayout.run { binding.refreshLayout.setEnableRefresh(true)
setEnableRefresh(true) if (it.isNullOrEmpty()) {
}
val json = it.toJsonString()
val recordBean: FoodRecordBean? = json.toObject<FoodRecordBean>()
if (recordBean == null || recordBean.records.isNullOrEmpty()) {
// toast("暂未搜索到相关菜品信息") // toast("暂未搜索到相关菜品信息")
if (pageNo == 1) { if (pageNo == 1) {
loadEmptyView() loadEmptyView()
} }
return@get return@searchFoodList
} }
val records = recordBean.records
if (pageNo == 1) { if (pageNo == 1) {
list.clear() list.clear()
} }
list.addAll(records!!) list.addAll(it)
recordAdapter.notifyDataSetChanged() recordAdapter.notifyDataSetChanged()
val isLoadMoreEnable = records.size >= pageSize val isLoadMoreEnable = it.size >= pageSize
binding.refreshLayout.setEnableLoadMore(isLoadMoreEnable) binding.refreshLayout.setEnableLoadMore(isLoadMoreEnable)
if (isLoadMoreEnable) { if (isLoadMoreEnable) {
pageNo++ pageNo++
} }
}, }, onFailure = { code, msg ->
doFailure = { code, msg ->
binding.refreshLayout.run { binding.refreshLayout.run {
setEnableRefresh(true) setEnableRefresh(true)
} }
@@ -199,9 +235,9 @@ class FoodSearchActivity : BaseActivity() {
if (pageNo == 1) { if (pageNo == 1) {
loadEmptyView() loadEmptyView()
} }
} })
)
} }
private fun finishRefresh() { private fun finishRefresh() {
if (pageNo == 1) { if (pageNo == 1) {
binding.refreshLayout.finishRefresh(1200) binding.refreshLayout.finishRefresh(1200)
@@ -211,12 +247,17 @@ class FoodSearchActivity : BaseActivity() {
} }
private var emptyViewBinding: LayoutEmptyViewBinding? = null private var emptyViewBinding: LayoutEmptyViewBinding? = null
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
private fun loadEmptyView() { private fun loadEmptyView() {
list.clear() list.clear()
recordAdapter.notifyDataSetChanged() recordAdapter.notifyDataSetChanged()
if (emptyViewBinding == null) { if (emptyViewBinding == null) {
emptyViewBinding = LayoutEmptyViewBinding.inflate(LayoutInflater.from(this), binding.rvDishSearchList, false) emptyViewBinding = LayoutEmptyViewBinding.inflate(
LayoutInflater.from(this),
binding.rvDishSearchList,
false
)
} }
emptyViewBinding!!.tvContent.text = "暂无数据" emptyViewBinding!!.tvContent.text = "暂无数据"
emptyViewBinding!!.tvSubContent.text = "可以尝试换个名称重新搜索" emptyViewBinding!!.tvSubContent.text = "可以尝试换个名称重新搜索"
@@ -11,9 +11,7 @@ import com.shuwei.dish.match.base.BaseApp
import com.shuwei.dish.match.databinding.ActivityHomeBinding import com.shuwei.dish.match.databinding.ActivityHomeBinding
import com.shuwei.dish.match.db.AppRepository import com.shuwei.dish.match.db.AppRepository
import com.shuwei.dish.match.entity.HomeModeBean import com.shuwei.dish.match.entity.HomeModeBean
import com.shuwei.dish.match.http.HttpUtil
import com.shuwei.dish.match.utils.SpTool import com.shuwei.dish.match.utils.SpTool
import com.shuwei.dish.match.utils.WeightUtil
import com.shuwei.dish.match.utils.ext.startActivity import com.shuwei.dish.match.utils.ext.startActivity
import com.shuwei.dish.match.utils.ext.toast import com.shuwei.dish.match.utils.ext.toast
import com.shuwei.dish.match.viewmodel.AppViewModel import com.shuwei.dish.match.viewmodel.AppViewModel
@@ -3,32 +3,25 @@ package com.shuwei.dish.match.ui
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.os.Bundle import android.os.Bundle
import android.provider.Settings import android.provider.Settings
import android.util.Log
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.shuwei.dish.match.base.BaseActivity import com.shuwei.dish.match.base.BaseActivity
import com.shuwei.dish.match.base.BaseApp import com.shuwei.dish.match.base.BaseApp
import com.shuwei.dish.match.databinding.ActivityInitBinding import com.shuwei.dish.match.databinding.ActivityInitBinding
import com.shuwei.dish.match.db.AppRepository import com.shuwei.dish.match.db.AppRepository
import com.shuwei.dish.match.http.HttpUtil
import com.shuwei.dish.match.http.UrlConfig import com.shuwei.dish.match.http.UrlConfig
import com.shuwei.dish.match.utils.AppUtil import com.shuwei.dish.match.utils.AppUtil
import com.shuwei.dish.match.utils.QRCodeUtil import com.shuwei.dish.match.utils.QRCodeUtil
import com.shuwei.dish.match.utils.SpTool import com.shuwei.dish.match.utils.SpTool
import com.shuwei.dish.match.utils.WeightUtil import com.shuwei.dish.match.utils.WeightUtil
import com.shuwei.dish.match.utils.ext.dp import com.shuwei.dish.match.utils.ext.dp
import com.shuwei.dish.match.utils.ext.invisible
import com.shuwei.dish.match.utils.ext.startActivity import com.shuwei.dish.match.utils.ext.startActivity
import com.shuwei.dish.match.utils.ext.toJsonString
import com.shuwei.dish.match.utils.ext.toObject import com.shuwei.dish.match.utils.ext.toObject
import com.shuwei.dish.match.utils.ext.toast
import com.shuwei.dish.match.utils.ext.visible
import com.shuwei.dish.match.viewmodel.AppViewModel import com.shuwei.dish.match.viewmodel.AppViewModel
import com.shuwei.dish.match.viewmodel.factory.AppFactory import com.shuwei.dish.match.viewmodel.factory.AppFactory
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlin.toString
class InitActivity : BaseActivity() { class InitActivity : BaseActivity() {
companion object { companion object {
@@ -51,12 +44,11 @@ class InitActivity : BaseActivity() {
BaseApp.appVersion = AppUtil.getAppVersionCode(this).toString() BaseApp.appVersion = AppUtil.getAppVersionCode(this).toString()
// 获取 ANDROID_ID // 获取 ANDROID_ID
var androidId = // var androidId = Settings.Secure.getString(contentResolver, Settings.Secure.ANDROID_ID)
Settings.Secure.getString(contentResolver, Settings.Secure.ANDROID_ID) // androidId = "39a7abdd06b3c7ab"
androidId = "39a7abdd06b3c7ab" // BaseApp.deviceId = androidId
BaseApp.deviceId = androidId // SpTool.put(SpTool.DEVICE_ID, androidId)
SpTool.put(SpTool.DEVICE_ID, androidId) // BaseApp.configUrl = UrlConfig.BASE_URL
BaseApp.configUrl = UrlConfig.BASE_URL
BaseApp.canteenId = "0" BaseApp.canteenId = "0"
// // TODO: 以上保存deviceId用于临时使用,后续改为下面注释方式 // // TODO: 以上保存deviceId用于临时使用,后续改为下面注释方式
@@ -79,16 +71,16 @@ class InitActivity : BaseActivity() {
// return // return
// } // }
binding.ivQrCode.invisible() // binding.ivQrCode.invisible()
binding.btnInit.invisible() // binding.btnInit.invisible()
initViewModel() initViewModel()
WeightUtil.init() WeightUtil.init()
WeightUtil.getWeight() WeightUtil.getWeight()
WeightUtil.startContinuousRead() WeightUtil.startContinuousRead()
HttpUtil.getAppToken() // HttpUtil.getAppToken()
HttpUtil.loopGetToken = true // HttpUtil.loopGetToken = true
countDown() countDown()
} }
@@ -157,67 +149,71 @@ class InitActivity : BaseActivity() {
} }
} }
private fun initConfig() { // private fun initConfig() {
binding.ivQrCode.setImageBitmap( // binding.ivQrCode.setImageBitmap(
QRCodeUtil.generateQRCode( // QRCodeUtil.generateQRCode(
content = BaseApp.deviceId?:"", // content = BaseApp.deviceId ?: "",
size = 200.dp // size = 200.dp
) // )
) // )
binding.btnInit.setOnClickListener { // binding.btnInit.setOnClickListener {
HttpUtil.loopGetToken = false //// HttpUtil.loopGetToken = false
getDeviceConfig() //// getDeviceConfig()
} // }
} // }
private fun getDeviceConfig() { // private fun getDeviceConfig() {
val tokenUrl = "${UrlConfig.DEVICE_TOKEN}?qrcodeId=${BaseApp.deviceId}&appVersion=${BaseApp.appVersion}" // val tokenUrl =
HttpUtil.get(url = tokenUrl, doSuccess = { token -> // "${UrlConfig.DEVICE_TOKEN}?qrcodeId=${BaseApp.deviceId}&appVersion=${BaseApp.appVersion}"
Log.d(TAG, "initConfig: $token") // HttpUtil.get(url = tokenUrl, doSuccess = { token ->
getConfig(token.toString()) // Log.d(TAG, "initConfig: $token")
}, doFailure = { code, msg -> // getConfig(token.toString())
Log.d(TAG, "initConfig: $code,$msg") // }, doFailure = { code, msg ->
}) // Log.d(TAG, "initConfig: $code,$msg")
} // })
private fun getConfig(token: String) { // }
val deviceConfigUrl = "${UrlConfig.DEVICE_CONFIG}?equipmentCode=${BaseApp.deviceId}&&appVersion=${BaseApp.appVersion}"
HttpUtil.get(url = deviceConfigUrl, header = mutableMapOf( // private fun getConfig(token: String) {
"X-Access-Token" to token // val deviceConfigUrl =
), doSuccess = { // "${UrlConfig.DEVICE_CONFIG}?equipmentCode=${BaseApp.deviceId}&&appVersion=${BaseApp.appVersion}"
Log.d(TAG, "getDeviceConfig: $it") // HttpUtil.get(
val data = it.toJsonString() // url = deviceConfigUrl, header = mutableMapOf(
val checkResult = checkConfigData(data) // "X-Access-Token" to token
if (checkResult.not()) { // ), doSuccess = {
toast("初始化设备失败,请稍后重试") // Log.d(TAG, "getDeviceConfig: $it")
return@get // val data = it.toJsonString()
} // val checkResult = checkConfigData(data)
HttpUtil.loopGetToken = true // if (checkResult.not()) {
SpTool.put(SpTool.DEVICE_CONFIG_CACHE, data) // toast("初始化设备失败,请稍后重试")
startActivity<HomeActivity>() // return@get
// finish() // }
}, doFailure = { code, msg -> // HttpUtil.loopGetToken = true
Log.d(TAG, "getDeviceConfig: $code,$msg") // SpTool.put(SpTool.DEVICE_CONFIG_CACHE, data)
toast("初始化设备失败,请稍后重试,code=${code},msg=${msg}") // startActivity<HomeActivity>()
}) //// finish()
} // }, doFailure = { code, msg ->
// Log.d(TAG, "getDeviceConfig: $code,$msg")
// toast("初始化设备失败,请稍后重试,code=${code},msg=${msg}")
// })
// }
data class DeviceConfigBean( data class DeviceConfigBean(
var appPackageUrl:String? = null, var appPackageUrl: String? = null,
var canteenId:String? = null var canteenId: String? = null
) )
private fun checkConfigData(data: String): Boolean { // private fun checkConfigData(data: String): Boolean {
if (data.isBlank()) { // if (data.isBlank()) {
return false // return false
} // }
val config = data.toObject<DeviceConfigBean?>() // val config = data.toObject<DeviceConfigBean?>()
if (config == null) { // if (config == null) {
return false // return false
} // }
BaseApp.configUrl = config.appPackageUrl?:"" // BaseApp.configUrl = config.appPackageUrl ?: ""
BaseApp.canteenId = config.canteenId?:"" // BaseApp.canteenId = config.canteenId ?: ""
return true // return true
} // }
override fun onDestroy() { override fun onDestroy() {
WeightUtil.stopContinuousRead() WeightUtil.stopContinuousRead()
@@ -1,10 +1,10 @@
package com.shuwei.dish.match.ui package com.shuwei.dish.match.ui
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Typeface import android.graphics.Typeface
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import androidx.activity.viewModels
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.shuwei.dish.match.R import com.shuwei.dish.match.R
@@ -12,13 +12,12 @@ import com.shuwei.dish.match.adapter.DishPartAdapter
import com.shuwei.dish.match.base.BaseActivity import com.shuwei.dish.match.base.BaseActivity
import com.shuwei.dish.match.databinding.ActivityPrepareCookBinding import com.shuwei.dish.match.databinding.ActivityPrepareCookBinding
import com.shuwei.dish.match.databinding.LayoutFoodRemindBinding import com.shuwei.dish.match.databinding.LayoutFoodRemindBinding
import com.shuwei.dish.match.dialog.BottomDialog import com.shuwei.dish.match.dialog.FoodSearchDialog
import com.shuwei.dish.match.dialog.CommonDialog import com.shuwei.dish.match.dialog.CommonDialog
import com.shuwei.dish.match.entity.CookFoodEntity import com.shuwei.dish.match.entity.CookFoodEntity
import com.shuwei.dish.match.entity.CookFoodGoodsEntity import com.shuwei.dish.match.entity.CookFoodGoodsEntity
import com.shuwei.dish.match.entity.FoodRecord import com.shuwei.dish.match.entity.FoodRecord
import com.shuwei.dish.match.http.HttpUtil import com.shuwei.dish.match.net.NetViewModel
import com.shuwei.dish.match.http.UrlConfig
import com.shuwei.dish.match.utils.AddressUtil import com.shuwei.dish.match.utils.AddressUtil
import com.shuwei.dish.match.utils.SwipeCallback import com.shuwei.dish.match.utils.SwipeCallback
import com.shuwei.dish.match.utils.WeightUtil import com.shuwei.dish.match.utils.WeightUtil
@@ -26,10 +25,10 @@ import com.shuwei.dish.match.utils.ext.clickWithDebounce
import com.shuwei.dish.match.utils.ext.gone import com.shuwei.dish.match.utils.ext.gone
import com.shuwei.dish.match.utils.ext.startActivity import com.shuwei.dish.match.utils.ext.startActivity
import com.shuwei.dish.match.utils.ext.toJsonString import com.shuwei.dish.match.utils.ext.toJsonString
import com.shuwei.dish.match.utils.ext.toObject
import com.shuwei.dish.match.utils.ext.toast import com.shuwei.dish.match.utils.ext.toast
import com.shuwei.dish.match.utils.ext.visible import com.shuwei.dish.match.utils.ext.visible
import java.io.Serializable import java.io.Serializable
import kotlin.getValue
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
class PrepareCookActivity : BaseActivity() { class PrepareCookActivity : BaseActivity() {
@@ -69,6 +68,9 @@ class PrepareCookActivity : BaseActivity() {
food = intent.extras?.getSerializable(FOOD_ITEM) as FoodRecord? food = intent.extras?.getSerializable(FOOD_ITEM) as FoodRecord?
binding.tvDishName.text = food?.foodName ?: "" binding.tvDishName.text = food?.foodName ?: ""
addViewClickListener() addViewClickListener()
initRecyclerView()
getDishDetail() getDishDetail()
} }
@@ -84,55 +86,18 @@ class PrepareCookActivity : BaseActivity() {
binding.ivWeightClear.setOnClickListener { binding.ivWeightClear.setOnClickListener {
WeightUtil.tareTwo(AddressUtil.ONE) WeightUtil.tareTwo(AddressUtil.ONE)
} }
binding.ivWeightAdd.setOnClickListener { binding.ivWeightAdd.setOnClickListener { addWeight() }
if (clickIndex == -1) { binding.tvAddFood.clickWithDebounce { addFood() }
toast("请选择菜品构成")
return@setOnClickListener
}
val clickItem = list[clickIndex]
clickItem.run {
if (isNewDishType && materialType != 1 && materialType != 2) {
toast("请选择主辅材类型")
return@setOnClickListener
}
}
val weight = binding.tvDishPartWeight.text.toString().toDouble()
if (weight <= 0.toDouble()) {
toast("食材用量需要大于0")
return@setOnClickListener
}
Log.d(TAG, "addViewClickListener->useRealWeight=$weight")
clickItem.run {
useWeight = weight.toDouble()
isSetFinished = true
dishPartAdapter.notifyItemChanged(clickIndex)
}
}
binding.tvAddFood.clickWithDebounce {
BottomDialog(goodsType = 0).show(this) { item ->
val filterResult = list.firstOrNull { it.goodsId == item.goodsId }
if (filterResult != null) {
toast("不允许重复添加同一食材")
return@show
}
list.add(CookFoodGoodsEntity().apply {
goodsId = item.goodsId
goodsName = item.goodsName
// materialType =
isNewDishType = true
})
onItemClick(list.size - 1)
}
}
binding.btnCook.clickWithDebounce { binding.btnCook.clickWithDebounce {
val count = list.count { it.isSetFinished.not() } val count = list.count { it.isSetFinished.not() }
if (count > 0) { if (count > 0) {
showRemindDialog() showRemindDialog()
return@clickWithDebounce return@clickWithDebounce
} }
goToSubmit() openSubmitPage()
} }
binding.rgCook.setOnCheckedChangeListener { group, checkedId -> binding.rgCook.setOnCheckedChangeListener { group, checkedId ->
if (clickIndex < 0 || clickIndex >= list.size) return@setOnCheckedChangeListener
val tempType = val tempType =
if (checkedId == R.id.rbDishTypeFirst) 1 else if (checkedId == R.id.rbDishTypeSecond) 2 else -1 if (checkedId == R.id.rbDishTypeFirst) 1 else if (checkedId == R.id.rbDishTypeSecond) 2 else -1
list[clickIndex].materialType = tempType list[clickIndex].materialType = tempType
@@ -143,14 +108,58 @@ class PrepareCookActivity : BaseActivity() {
} }
} }
private fun goToSubmit() { private fun addWeight() {
if (clickIndex == -1) {
toast("请选择菜品构成")
return
}
val clickItem = list[clickIndex]
clickItem.run {
if (isNewDishType && materialType != 1 && materialType != 2) {
toast("请选择主辅材类型")
return
}
}
val weight = binding.tvDishPartWeight.text.toString().toDouble()
if (weight <= 0.toDouble()) {
toast("食材用量需要大于0")
return
}
Log.d(TAG, "addViewClickListener->useRealWeight=$weight")
clickItem.run {
useWeight = weight
isOriginalData = false
isSetFinished = true
dishPartAdapter.notifyItemChanged(clickIndex)
}
}
private fun addFood() {
FoodSearchDialog().show(this) { item ->
val filterResult = list.firstOrNull { it.goodsId == item.goodsId }
if (filterResult != null) {
toast("不允许重复添加同一食材")
return@show
}
list.add(CookFoodGoodsEntity().apply {
goodsId = item.goodsId
goodsName = item.goodsName
// materialType =
isNewDishType = true
isOriginalData = false
})
onItemClick(list.size - 1)
binding.rvDishPartList.smoothScrollToPosition(list.size - 1)
}
}
private fun openSubmitPage() {
getGoodsList() getGoodsList()
if (goodsList.isNullOrEmpty()) { if (goodsList.isNullOrEmpty()) {
toast("菜品构成信息未设置") toast("菜品构成信息")
return return
} }
Log.d(TAG, "goToSubmit: goodsList:${goodsList?.toJsonString()}") Log.d(TAG, "goToSubmit: goodsList:${goodsList?.toJsonString()}")
// startActivity<SubmitDishActivity> {
startActivity<SubmitFoodActivity> { startActivity<SubmitFoodActivity> {
putExtra(SubmitFoodActivity.GOODS_LIST, goodsList as Serializable) putExtra(SubmitFoodActivity.GOODS_LIST, goodsList as Serializable)
putExtra(SubmitFoodActivity.FOOD_ITEM, food as Serializable) putExtra(SubmitFoodActivity.FOOD_ITEM, food as Serializable)
@@ -161,19 +170,17 @@ class PrepareCookActivity : BaseActivity() {
if (goodsList == null) { if (goodsList == null) {
goodsList = mutableListOf() goodsList = mutableListOf()
} }
list.forEach { list.filter { it.isSetFinished }.forEach {
if (it.isSetFinished) { goodsList?.add(CookFoodGoodsEntity().apply {
goodsList?.add(CookFoodGoodsEntity().apply { foodId = food!!.foodId
foodId = food!!.foodId goodsId = it.goodsId
goodsId = it.goodsId relateionType = it.relateionType
relateionType = it.relateionType allEdible = it.allEdible
allEdible = it.allEdible goodsName = it.goodsName
goodsName = it.goodsName materialType = it.materialType
materialType = it.materialType useWeight = it.useWeight ?: 0.toDouble()
useWeight = it.useWeight ?: 0.toDouble() goodsOrRelationCode = it.goodsOrRelationCode
goodsOrRelationCode = it.goodsOrRelationCode })
})
}
} }
} }
@@ -185,7 +192,7 @@ class PrepareCookActivity : BaseActivity() {
rightText = "确认无误" rightText = "确认无误"
onLeftClick = { dismiss() } onLeftClick = { dismiss() }
onRightClick = { onRightClick = {
goToSubmit() openSubmitPage()
dismiss() dismiss()
} }
onDismiss = { hideStatusBar() } onDismiss = { hideStatusBar() }
@@ -194,38 +201,52 @@ class PrepareCookActivity : BaseActivity() {
private fun getDishDetail() { private fun getDishDetail() {
//649 // //649
val url = "${UrlConfig.DISH_DETAIL}?foodId=${food?.foodId}" // val url = "${UrlConfig.DISH_DETAIL}?foodId=${food?.foodId}"
HttpUtil.get( // HttpUtil.get(
url = url, // url = url,
doSuccess = { // doSuccess = {
val json = it.toJsonString() // val json = it.toJsonString()
Log.d(TAG, "getDishDetail: json:$json") // Log.d(TAG, "getDishDetail: json:$json")
val detail: CookFoodEntity? = json.toObject<CookFoodEntity>() // val detail: CookFoodEntity? = json.toObject<CookFoodEntity>()
// if (detail == null) {
// toast("查询菜品信息为空")
// return@get
// }
// loadDishDetail(detail)
// }) { code, msg ->
// toast(msg)
// }
netViewModel.getFoodDetail(
food?.foodId ?: "",
onSuccess = { detail ->
if (detail == null) { if (detail == null) {
toast("查询菜品信息为空") toast("查询菜品信息为空")
return@get return@getFoodDetail
} }
loadDishDetail(detail) loadDishDetail(detail)
}) { code, msg -> }, onFailure = { code, msg ->
toast(msg) toast(msg)
} })
} }
private fun loadDishDetail(detail: CookFoodEntity) { private fun loadDishDetail(detail: CookFoodEntity) {
val voList = detail.stFoodInfoConstituteList // val voList = detail.stFoodInfoConstituteList
val voList = detail.foodConstituteList
if (voList.isNullOrEmpty()) { if (voList.isNullOrEmpty()) {
return return
} }
//筛选出主材和辅材 //筛选出主材和辅材
val tempDate = voList.filter { it.materialType == 1 || it.materialType == 2 } val tempData = voList.filter { it.materialType == 1 || it.materialType == 2 }
.apply { .apply {
forEach { it.useWeight = 0.toDouble() } forEach { it.useWeight = 0.toDouble() }
} }
list.clear() list.clear()
list.addAll(tempDate)
firstReqSize = list.size firstReqSize = list.size
initRecyclerView() list.addAll(tempData)
dishPartAdapter.notifyDataSetChanged()
} }
private var firstReqSize = 0 private var firstReqSize = 0
@@ -245,8 +266,26 @@ class PrepareCookActivity : BaseActivity() {
text = it.goodsName text = it.goodsName
setTypeface(typeface, Typeface.BOLD) setTypeface(typeface, Typeface.BOLD)
} }
binding.tvDishType.text =
if (it.materialType == 1) "主材" else if (it.materialType == 2) "辅材" else "" var materialType: String
when (it.materialType) {
1 -> {
materialType = "主材"
binding.rgCook.check(R.id.rbDishTypeFirst)
}
2 -> {
materialType = "辅材"
binding.rgCook.check(R.id.rbDishTypeSecond)
}
else -> {
materialType = ""
binding.rgCook.clearCheck()
}
}
binding.tvDishType.text = materialType
list.forEach { bean -> bean.isItemClicked = false } list.forEach { bean -> bean.isItemClicked = false }
it.isItemClicked = true it.isItemClicked = true
dishPartAdapter.notifyDataSetChanged() dishPartAdapter.notifyDataSetChanged()
@@ -279,6 +318,9 @@ class PrepareCookActivity : BaseActivity() {
dishPartAdapter.notifyItemRemoved(position) dishPartAdapter.notifyItemRemoved(position)
dishPartAdapter.notifyItemRangeChanged(position, list.size - position) dishPartAdapter.notifyItemRangeChanged(position, list.size - position)
toast("已删除") toast("已删除")
if (list.isEmpty()) {
binding.tvDishShowName.text = ""
}
}) })
itemTouchHelper.attachToRecyclerView(this) itemTouchHelper.attachToRecyclerView(this)
} }
@@ -288,17 +330,23 @@ class PrepareCookActivity : BaseActivity() {
@SuppressLint("GestureBackNavigation") @SuppressLint("GestureBackNavigation")
@Deprecated("Deprecated in Java") @Deprecated("Deprecated in Java")
override fun onBackPressed() { override fun onBackPressed() {
if (list.size > firstReqSize) { val count = list.count { !it.isOriginalData }
//说明有新增的食材 if (count > 0) {
saveDataRemindDialog() //说明有新增或者设置重量
return
}
val filterResult = list.firstOrNull { (it.useWeight ?: 0.toDouble()) > 0.toDouble() }
if (filterResult != null) {
//说明有称重的数据
saveDataRemindDialog() saveDataRemindDialog()
return return
} }
// if (list.size > firstReqSize) {
// //说明有新增的食材
// saveDataRemindDialog()
// return
// }
// val filterResult = list.firstOrNull { (it.useWeight ?: 0.toDouble()) > 0.toDouble() }
// if (filterResult != null) {
// //说明有称重的数据
// saveDataRemindDialog()
// return
// }
super.onBackPressed() super.onBackPressed()
} }
@@ -3,9 +3,7 @@ package com.shuwei.dish.match.ui
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.MotionEvent
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
@@ -19,15 +17,10 @@ import com.shuwei.dish.match.db.AppRepository
import com.shuwei.dish.match.dialog.DialogTool import com.shuwei.dish.match.dialog.DialogTool
import com.shuwei.dish.match.entity.CookFoodEntity import com.shuwei.dish.match.entity.CookFoodEntity
import com.shuwei.dish.match.entity.FoodRecord import com.shuwei.dish.match.entity.FoodRecord
import com.shuwei.dish.match.entity.FoodRecordBean
import com.shuwei.dish.match.http.HttpUtil
import com.shuwei.dish.match.http.UrlConfig
import com.shuwei.dish.match.utils.DateTimeUtil import com.shuwei.dish.match.utils.DateTimeUtil
import com.shuwei.dish.match.utils.SwipeCallback import com.shuwei.dish.match.utils.SwipeCallback
import com.shuwei.dish.match.utils.ext.gone import com.shuwei.dish.match.utils.ext.gone
import com.shuwei.dish.match.utils.ext.startActivity import com.shuwei.dish.match.utils.ext.startActivity
import com.shuwei.dish.match.utils.ext.toJsonString
import com.shuwei.dish.match.utils.ext.toObject
import com.shuwei.dish.match.utils.ext.toast import com.shuwei.dish.match.utils.ext.toast
import com.shuwei.dish.match.utils.ext.visible import com.shuwei.dish.match.utils.ext.visible
import com.shuwei.dish.match.viewmodel.AppViewModel import com.shuwei.dish.match.viewmodel.AppViewModel
@@ -41,6 +34,7 @@ class SamplingListActivity : BaseActivity() {
companion object { companion object {
private const val TAG = "SamplingListActivity" private const val TAG = "SamplingListActivity"
const val IS_COOKING = "isCooking" const val IS_COOKING = "isCooking"
const val IS_CONFIG_PAGE = "isConfigPage"
} }
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@@ -80,10 +74,8 @@ class SamplingListActivity : BaseActivity() {
private fun initViewModel() { private fun initViewModel() {
val db = BaseApp.instance!!.database val db = BaseApp.instance!!.database
val factory = val factory = AppFactory(AppRepository(db.appDao()))
AppFactory(AppRepository(db.appDao())) appViewModel = ViewModelProvider(this, factory)[AppViewModel::class.java]
appViewModel =
ViewModelProvider(this, factory)[AppViewModel::class.java]
} }
fun getCookFoodList(action: (MutableList<CookFoodEntity>?) -> Unit) { fun getCookFoodList(action: (MutableList<CookFoodEntity>?) -> Unit) {
@@ -96,6 +88,10 @@ class SamplingListActivity : BaseActivity() {
override fun onNewIntent(intent: Intent?) { override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent) super.onNewIntent(intent)
val isConfigPage = intent?.getBooleanExtra(IS_CONFIG_PAGE, false) ?: false
if (isConfigPage) {
return
}
val isCooking = intent?.getBooleanExtra(IS_COOKING, false) ?: false val isCooking = intent?.getBooleanExtra(IS_COOKING, false) ?: false
//toast("isCooking=$isCooking") //toast("isCooking=$isCooking")
refreshPage(isCooking) refreshPage(isCooking)
@@ -121,14 +117,13 @@ class SamplingListActivity : BaseActivity() {
} }
} }
private fun onItemClick(position:Int) { private fun onItemClick(position: Int) {
val item = list[position] val item = list[position]
if (item.isCooking) { if (item.isCooking) {
//烹饪中,跳到称熟重页面 //烹饪中,跳到称熟重页面
startActivity<SubmitFoodActivity> { startActivity<SubmitFoodActivity> {
putExtra( putExtra(
SubmitFoodActivity.FOOD_ITEM, SubmitFoodActivity.FOOD_ITEM, item as Serializable
item as Serializable
) )
} }
return return
@@ -166,7 +161,7 @@ class SamplingListActivity : BaseActivity() {
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
private fun addViewListener() { private fun addViewListener() {
binding.btnAddSampling.setOnClickListener { binding.btnAddSampling.setOnClickListener {
judgeDeviceConfig{ judgeDeviceConfig {
startActivity<DishSamplingActivity>() startActivity<DishSamplingActivity>()
} }
} }
@@ -204,33 +199,53 @@ class SamplingListActivity : BaseActivity() {
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
fun getSamplingList() { fun getSamplingList() {
showLoading() showLoading()
val map = mapOf( // val map = mapOf(
// "foodName" to input, //// "foodName" to input,
"pageNo" to "$pageNo", // "pageNo" to "$pageNo",
"pageSize" to "$pageSize", // "pageSize" to "$pageSize",
"canteenId" to BaseApp.canteenId // "canteenId" to BaseApp.canteenId
) // )
val sb = StringBuilder(UrlConfig.SAMPLING_LIST).apply { // val sb = StringBuilder(UrlConfig.SAMPLING_LIST).apply {
append("?") // append("?")
map.forEach { (key, value) -> append("$key=$value&") } // map.forEach { (key, value) -> append("$key=$value&") }
} // }
sb.deleteCharAt(sb.length - 1) // sb.deleteCharAt(sb.length - 1)
HttpUtil.get( // HttpUtil.get(
url = sb.toString(), // url = sb.toString(),
doSuccess = { // doSuccess = {
// loadDishList(it)
// }, doFailure = { code, msg ->
// binding.refreshLayout.run {
// setEnableRefresh(true)
// }
// toast(msg)
// finishRefresh()
// binding.refreshLayout.setEnableRefresh(true)
// delayDismissLoading()
// if (pageNo == 1) {
// loadEmptyView()
// }
// })
netViewModel.getSamplingList(
param = mutableMapOf(
"pageNum" to pageNo,
"pageSize" to pageSize,
"placeId" to BaseApp.canteenId
),
onSuccess = {
loadDishList(it) loadDishList(it)
}, doFailure = { code, msg -> },
binding.refreshLayout.run { onFailure = { code, msg ->
setEnableRefresh(true) binding.refreshLayout.setEnableRefresh(true)
}
toast(msg) toast(msg)
finishRefresh() finishRefresh()
binding.refreshLayout.setEnableRefresh(true)
delayDismissLoading() delayDismissLoading()
if (pageNo == 1) { if (pageNo == 1) {
loadEmptyView() loadEmptyView()
} }
}) }
)
} }
private fun finishRefresh() { private fun finishRefresh() {
@@ -249,9 +264,7 @@ class SamplingListActivity : BaseActivity() {
dishAdapter.notifyDataSetChanged() dishAdapter.notifyDataSetChanged()
if (emptyViewBinding == null) { if (emptyViewBinding == null) {
emptyViewBinding = LayoutEmptyViewBinding.inflate( emptyViewBinding = LayoutEmptyViewBinding.inflate(
LayoutInflater.from(this), LayoutInflater.from(this), binding.rvSamplingList, false
binding.rvSamplingList,
false
) )
} }
emptyViewBinding!!.tvContent.text = "暂无数据" emptyViewBinding!!.tvContent.text = "暂无数据"
@@ -302,8 +315,7 @@ class SamplingListActivity : BaseActivity() {
} }
val tempList = mutableListOf<FoodRecord>() val tempList = mutableListOf<FoodRecord>()
cookFoodEntities cookFoodEntities.sortedByDescending { DateTimeUtil.convert(dateStr = it.createTime) }
.sortedByDescending { DateTimeUtil.convert(dateStr = it.createTime) }
.forEach { entity -> .forEach { entity ->
tempList.add(FoodRecord().apply { tempList.add(FoodRecord().apply {
foodId = entity.foodId foodId = entity.foodId
@@ -332,26 +344,21 @@ class SamplingListActivity : BaseActivity() {
} }
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
private fun loadDishList(data: Any) { private fun loadDishList(records: MutableList<FoodRecord>?) {
binding.refreshLayout.run { binding.refreshLayout.setEnableRefresh(true)
setEnableRefresh(true)
}
delayDismissLoading() delayDismissLoading()
finishRefresh() finishRefresh()
val json = data.toJsonString() if (records.isNullOrEmpty()) {
val recordBean: FoodRecordBean? = json.toObject<FoodRecordBean>()
if (recordBean == null || recordBean.records.isNullOrEmpty()) {
//toast("暂未搜索到相关菜品信息") //toast("暂未搜索到相关菜品信息")
if (pageNo == 1) { if (pageNo == 1) {
loadEmptyView() loadEmptyView()
} }
return return
} }
val records = recordBean.records
if (pageNo == 1) { if (pageNo == 1) {
list.clear() list.clear()
} }
list.addAll(records!!) list.addAll(records)
dishAdapter.notifyDataSetChanged() dishAdapter.notifyDataSetChanged()
val isLoadMoreEnable = records.size >= pageSize val isLoadMoreEnable = records.size >= pageSize
binding.refreshLayout.setEnableLoadMore(isLoadMoreEnable) binding.refreshLayout.setEnableLoadMore(isLoadMoreEnable)
@@ -363,7 +370,7 @@ class SamplingListActivity : BaseActivity() {
private var configFinished = false private var configFinished = false
fun judgeDeviceConfig(block:()-> Unit) { fun judgeDeviceConfig(block: () -> Unit) {
if (configFinished) { if (configFinished) {
block() block()
return return
@@ -390,8 +397,7 @@ class SamplingListActivity : BaseActivity() {
startActivity<DeviceConfigActivity> { startActivity<DeviceConfigActivity> {
putExtra(DeviceConfigActivity.COOK_MODE, 2) putExtra(DeviceConfigActivity.COOK_MODE, 2)
} }
} })
)
} }
private var isVisible = false private var isVisible = false
@@ -1,10 +1,9 @@
package com.shuwei.dish.match.ui package com.shuwei.dish.match.ui
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Dialog
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment import androidx.activity.viewModels
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import com.shuwei.dish.match.R import com.shuwei.dish.match.R
import com.shuwei.dish.match.base.BaseActivity import com.shuwei.dish.match.base.BaseActivity
@@ -13,6 +12,9 @@ import com.shuwei.dish.match.databinding.ActivitySelectDishBinding
import com.shuwei.dish.match.db.AppRepository import com.shuwei.dish.match.db.AppRepository
import com.shuwei.dish.match.dialog.DialogTool import com.shuwei.dish.match.dialog.DialogTool
import com.shuwei.dish.match.entity.CookFoodEntity import com.shuwei.dish.match.entity.CookFoodEntity
import com.shuwei.dish.match.entity.FoodRecord
import com.shuwei.dish.match.entity.FoodRecordBean
import com.shuwei.dish.match.net.NetViewModel
import com.shuwei.dish.match.ui.fragment.DishListFragment import com.shuwei.dish.match.ui.fragment.DishListFragment
import com.shuwei.dish.match.utils.KeyboardUtil import com.shuwei.dish.match.utils.KeyboardUtil
import com.shuwei.dish.match.utils.ext.addOnActionSearchListener import com.shuwei.dish.match.utils.ext.addOnActionSearchListener
@@ -22,12 +24,14 @@ import com.shuwei.dish.match.utils.ext.toast
import com.shuwei.dish.match.utils.ext.visible import com.shuwei.dish.match.utils.ext.visible
import com.shuwei.dish.match.viewmodel.AppViewModel import com.shuwei.dish.match.viewmodel.AppViewModel
import com.shuwei.dish.match.viewmodel.factory.AppFactory import com.shuwei.dish.match.viewmodel.factory.AppFactory
import kotlin.getValue
class SelectDishActivity : BaseActivity() { class SelectDishActivity : BaseActivity() {
companion object { companion object {
const val IS_COOKING = "isCooking" const val IS_COOKING = "isCooking"
const val DINNER_TYPE = "dinnerType" const val DINNER_TYPE = "dinnerType"
const val IS_CONFIG_PAGE = "isConfigPage"
} }
private lateinit var binding: ActivitySelectDishBinding private lateinit var binding: ActivitySelectDishBinding
@@ -69,10 +73,8 @@ class SelectDishActivity : BaseActivity() {
private fun initViewModel() { private fun initViewModel() {
val db = BaseApp.instance!!.database val db = BaseApp.instance!!.database
val factory = val factory = AppFactory(AppRepository(db.appDao()))
AppFactory(AppRepository(db.appDao())) appViewModel = ViewModelProvider(this, factory)[AppViewModel::class.java]
appViewModel =
ViewModelProvider(this, factory)[AppViewModel::class.java]
} }
fun getCookFoodList(action: (MutableList<CookFoodEntity>?) -> Unit) { fun getCookFoodList(action: (MutableList<CookFoodEntity>?) -> Unit) {
@@ -168,6 +170,10 @@ class SelectDishActivity : BaseActivity() {
override fun onNewIntent(intent: Intent?) { override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent) super.onNewIntent(intent)
runCatching { runCatching {
val isConfigPage = intent?.getBooleanExtra(IS_CONFIG_PAGE, false) ?: false
if (isConfigPage) {
return
}
val isCooking = intent?.getBooleanExtra(IS_COOKING, false) ?: false val isCooking = intent?.getBooleanExtra(IS_COOKING, false) ?: false
val lastDinnerType = intent?.getStringExtra(DINNER_TYPE) ?: "0" val lastDinnerType = intent?.getStringExtra(DINNER_TYPE) ?: "0"
if (lastDinnerType == "1" || lastDinnerType == "2" || lastDinnerType == "3") { if (lastDinnerType == "1" || lastDinnerType == "2" || lastDinnerType == "3") {
@@ -202,4 +208,16 @@ class SelectDishActivity : BaseActivity() {
isVisible = false isVisible = false
} }
public fun getFoodList(
param: MutableMap<String, Any>,
onSuccess: (MutableList<FoodRecord>?) -> Unit,
onFailure: (String, String) -> Unit
) {
netViewModel.searchFoodList(
param = param,
onSuccess = onSuccess,
onFailure = onFailure
)
}
} }
@@ -6,7 +6,7 @@ import android.util.Log
import android.util.SparseArray import android.util.SparseArray
import android.util.SparseIntArray import android.util.SparseIntArray
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.TextView import androidx.activity.viewModels
import androidx.core.util.forEach import androidx.core.util.forEach
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
@@ -21,8 +21,7 @@ import com.shuwei.dish.match.entity.CookFoodEntity
import com.shuwei.dish.match.entity.CookFoodGoodsEntity import com.shuwei.dish.match.entity.CookFoodGoodsEntity
import com.shuwei.dish.match.entity.FoodRecord import com.shuwei.dish.match.entity.FoodRecord
import com.shuwei.dish.match.entity.SeasoningEntity import com.shuwei.dish.match.entity.SeasoningEntity
import com.shuwei.dish.match.http.HttpUtil import com.shuwei.dish.match.net.NetViewModel
import com.shuwei.dish.match.http.UrlConfig
import com.shuwei.dish.match.utils.AddressUtil import com.shuwei.dish.match.utils.AddressUtil
import com.shuwei.dish.match.utils.WeightUtil import com.shuwei.dish.match.utils.WeightUtil
import com.shuwei.dish.match.utils.ext.clickWithDebounce import com.shuwei.dish.match.utils.ext.clickWithDebounce
@@ -35,12 +34,13 @@ import com.shuwei.dish.match.utils.ext.toast
import com.shuwei.dish.match.utils.ext.visible import com.shuwei.dish.match.utils.ext.visible
import com.shuwei.dish.match.viewmodel.AppViewModel import com.shuwei.dish.match.viewmodel.AppViewModel
import com.shuwei.dish.match.viewmodel.factory.AppFactory import com.shuwei.dish.match.viewmodel.factory.AppFactory
import kotlin.getValue
@SuppressLint("UseSparseArrays") @SuppressLint("UseSparseArrays")
class SubmitFoodActivity : BaseActivity() { class SubmitFoodActivity : BaseActivity() {
companion object { companion object {
const val TAG = "SubmitDishActivity" const val TAG = "SubmitFoodActivity"
const val FOOD_ITEM = "foodItem" const val FOOD_ITEM = "foodItem"
const val GOODS_LIST = "goodsList" const val GOODS_LIST = "goodsList"
} }
@@ -98,7 +98,10 @@ class SubmitFoodActivity : BaseActivity() {
} }
private fun loadSeasoningFromLocal() { private fun loadSeasoningFromLocal() {
appViewModel.getCookFoodGoodsList(foodId = food!!.foodId!!, cookMode = food!!.cookMode) { it -> appViewModel.getCookFoodGoodsList(
foodId = food!!.foodId!!,
cookMode = food!!.cookMode
) { it ->
goodsList = mutableListOf() goodsList = mutableListOf()
val goodsIdList = mutableListOf<String>() val goodsIdList = mutableListOf<String>()
//设置主辅材数据 //设置主辅材数据
@@ -175,33 +178,34 @@ class SubmitFoodActivity : BaseActivity() {
WeightUtil.addWeightListener( WeightUtil.addWeightListener(
weightKey = TAG, weightKey = TAG,
getWeight = { address, state, weight -> getWeight = { address, state, weight ->
if (address == AddressUtil.TWO) { if (address == AddressUtil.TWO) {
cookFoodEntity.foodWeight = weight.toDouble() cookFoodEntity.foodWeight = weight.toDouble()
binding.tvTotalWeight.text = "${weight / 1000f}" binding.tvTotalWeight.text = "${weight / 1000f}"
} }
val firstWeight = firstGoodsArray.get(address, null) val firstWeight = firstGoodsArray.get(address, null)
if (firstWeight == null) { if (firstWeight == null) {
//未设置数据 //未设置数据
if (state != WeightUtil.STATE_STABLE) { if (state != WeightUtil.STATE_STABLE) {
//首次记录数据需要稳定数据 //首次记录数据需要稳定数据
return@addWeightListener
}
firstGoodsArray.put(address, weight)
return@addWeightListener return@addWeightListener
} }
firstGoodsArray.put(address, weight) var realUseWeight = firstWeight - weight
return@addWeightListener realUseWeight = if (realUseWeight > 0) realUseWeight else 0.0
} seasoningArray.put(address, realUseWeight.toDouble())
var realUseWeight = firstWeight - weight
realUseWeight = if (realUseWeight > 0) realUseWeight else 0.0
seasoningArray.put(address, realUseWeight.toDouble())
// refreshSeasoningWeight() // refreshSeasoningWeight()
val item = seasoningItems.firstOrNull { address == addressArray[it.sort]} val item = seasoningItems.firstOrNull { address == addressArray[it.sort] }
item?.let { item?.let {
val lastWeight = seasoningArray.get(address) ?: 0.toDouble() val lastWeight = seasoningArray.get(address) ?: 0.toDouble()
it.useWeight = (lastWeight + getCookingSeasoning(address)).roundedOneDecimalPlace() it.useWeight =
updateGridData(it) (lastWeight + getCookingSeasoning(address)).roundedOneDecimalPlace()
} updateGridData(it)
}) }
})
} }
// private fun refreshSeasoningWeight() { // private fun refreshSeasoningWeight() {
@@ -217,17 +221,18 @@ class SubmitFoodActivity : BaseActivity() {
// setGridData(seasoningItems) // setGridData(seasoningItems)
// } // }
private fun updateGridData(entity:SeasoningEntity) { private fun updateGridData(entity: SeasoningEntity) {
val gridLayout = binding.include.root val gridLayout = binding.include.root
val tag = entity.sort.toString() val tag = entity.sort.toString()
val frameLayout = gridLayout.findViewWithTag<FrameLayout>(tag) val frameLayout = gridLayout.findViewWithTag<FrameLayout>(tag)
TextCellAdapter.loadLayout(frameLayout , entity) TextCellAdapter.loadLayout(frameLayout, entity)
} }
private fun getCookingSeasoning(address: Int): Double { private fun getCookingSeasoning(address: Int): Double {
if (isCooking.not()) return 0.toDouble() if (isCooking.not()) return 0.toDouble()
if (seasoningItems.isEmpty()) return 0.toDouble() if (seasoningItems.isEmpty()) return 0.toDouble()
val weight = seasoningCookingItems?.get(weightRelateArray2.get(address))?.useWeight ?: 0.toDouble() val weight =
seasoningCookingItems?.get(weightRelateArray2.get(address))?.useWeight ?: 0.toDouble()
return weight return weight
} }
@@ -260,12 +265,12 @@ class SubmitFoodActivity : BaseActivity() {
return return
} }
val realSeasoningData = seasoningItems val realSeasoningData = seasoningItems
//(binding.rvSeasoning.adapter as TextCellAdapter).list //(binding.rvSeasoning.adapter as TextCellAdapter).list
if (realSeasoningData.isEmpty() && !isCooking) { if (realSeasoningData.isEmpty() && !isCooking) {
toast("未获取到调料信息") toast("未获取到调料信息")
return return
} }
if (realSeasoningData.isNotEmpty()&&realSeasoningData[0].goodsId.isNullOrBlank()) { if (realSeasoningData.isNotEmpty() && realSeasoningData[0].goodsId.isNullOrBlank()) {
toast("还未设置调料信息,请去设置页面操作") toast("还未设置调料信息,请去设置页面操作")
return return
} }
@@ -316,7 +321,7 @@ class SubmitFoodActivity : BaseActivity() {
toast("未获取到调料信息") toast("未获取到调料信息")
return return
} }
if (realSeasoningData.isNotEmpty()&&realSeasoningData[0].goodsId.isNullOrBlank()) { if (realSeasoningData.isNotEmpty() && realSeasoningData[0].goodsId.isNullOrBlank()) {
toast("还未设置调料信息,请去设置页面操作") toast("还未设置调料信息,请去设置页面操作")
return return
} }
@@ -335,8 +340,9 @@ class SubmitFoodActivity : BaseActivity() {
} }
cookFoodEntity.let { cookFoodEntity.let {
it.stFoodInfoConstituteList = this@SubmitFoodActivity.goodsList // it.stFoodInfoConstituteList = this@SubmitFoodActivity.goodsList
it.dinnerType = when(it.dinnerType) { it.matchingConstituteInfoList = this@SubmitFoodActivity.goodsList
it.dinnerType = when (it.dinnerType) {
"1" -> "早餐" "1" -> "早餐"
"2" -> "午餐" "2" -> "午餐"
"3" -> "晚餐" "3" -> "晚餐"
@@ -352,14 +358,24 @@ class SubmitFoodActivity : BaseActivity() {
} }
val json = cookFoodEntity.toJsonString() val json = cookFoodEntity.toJsonString()
Log.d(TAG, "submit: json=$json") Log.d(TAG, "submit: json=$json")
HttpUtil.postJson( // HttpUtil.postJson(
url = UrlConfig.SUBMIT_DISH, // url = UrlConfig.SUBMIT_DISH,
json = json, // json = json,
doSuccess = { // doSuccess = {
Log.d(TAG, "submit: postJson=$it") // Log.d(TAG, "submit: postJson=$it")
// submitSuccess(isSamplingData)
// }, doFailure = { code, msg ->
// Log.d(TAG, "submit: postJson:code=$code,msg=$msg")
// toast(msg)
// dismissLoading()
// })
netViewModel.submitCookFood(
entity = cookFoodEntity,
onSuccess = {
submitSuccess(isSamplingData) submitSuccess(isSamplingData)
}, doFailure = { code, msg -> },
Log.d(TAG, "submit: postJson:code=$code,msg=$msg") onFailure = { code, msg ->
toast(msg) toast(msg)
dismissLoading() dismissLoading()
}) })
@@ -417,7 +433,7 @@ class SubmitFoodActivity : BaseActivity() {
} }
private var seasoningItems = mutableListOf<SeasoningEntity>() private var seasoningItems = mutableListOf<SeasoningEntity>()
private var seasoningCookingItems: List<SeasoningEntity> ?= null private var seasoningCookingItems: List<SeasoningEntity>? = null
private fun loadTextCell(list: MutableList<SeasoningEntity>) { private fun loadTextCell(list: MutableList<SeasoningEntity>) {
seasoningItems.clear() seasoningItems.clear()
seasoningItems.addAll(list) seasoningItems.addAll(list)
@@ -434,8 +450,8 @@ class SubmitFoodActivity : BaseActivity() {
} }
private fun initConfigData() { private fun initConfigData() {
repeat(12) {num-> repeat(12) { num ->
val firstOne = seasoningItems.firstOrNull {it.sort == num} val firstOne = seasoningItems.firstOrNull { it.sort == num }
if (firstOne == null) { if (firstOne == null) {
seasoningItems.add(SeasoningEntity().also { it.sort = num }) seasoningItems.add(SeasoningEntity().also { it.sort = num })
} }
@@ -13,18 +13,12 @@ import com.shuwei.dish.match.base.BaseApp
import com.shuwei.dish.match.base.BaseFragment import com.shuwei.dish.match.base.BaseFragment
import com.shuwei.dish.match.databinding.FragmentDishListBinding import com.shuwei.dish.match.databinding.FragmentDishListBinding
import com.shuwei.dish.match.databinding.LayoutEmptyViewBinding import com.shuwei.dish.match.databinding.LayoutEmptyViewBinding
import com.shuwei.dish.match.entity.FoodRecord import com.shuwei.dish.match.entity.FoodRecord
import com.shuwei.dish.match.entity.FoodRecordBean
import com.shuwei.dish.match.http.HttpUtil
import com.shuwei.dish.match.http.UrlConfig
import com.shuwei.dish.match.ui.PrepareCookActivity import com.shuwei.dish.match.ui.PrepareCookActivity
import com.shuwei.dish.match.ui.SelectDishActivity import com.shuwei.dish.match.ui.SelectDishActivity
import com.shuwei.dish.match.ui.SubmitFoodActivity import com.shuwei.dish.match.ui.SubmitFoodActivity
import com.shuwei.dish.match.utils.SwipeCallback import com.shuwei.dish.match.utils.SwipeCallback
import com.shuwei.dish.match.utils.ext.startActivity import com.shuwei.dish.match.utils.ext.startActivity
import com.shuwei.dish.match.utils.ext.toJsonString
import com.shuwei.dish.match.utils.ext.toObject
import com.shuwei.dish.match.utils.ext.toast import com.shuwei.dish.match.utils.ext.toast
import java.io.Serializable import java.io.Serializable
@@ -90,13 +84,13 @@ class DishListFragment : BaseFragment<FragmentDishListBinding>() {
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup? container: ViewGroup?
): FragmentDishListBinding { ): FragmentDishListBinding {
return FragmentDishListBinding.inflate(inflater, container, false) return FragmentDishListBinding.inflate(inflater, container, false)
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
activity = requireActivity() as SelectDishActivity activity = requireActivity() as SelectDishActivity
dinnerType = arguments?.getString(DINNER_TYPE, "0")?:"0" dinnerType = arguments?.getString(DINNER_TYPE, "0") ?: "0"
binding.rvDishList.run { binding.rvDishList.run {
layoutManager = layoutManager =
LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false) LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
@@ -119,6 +113,7 @@ class DishListFragment : BaseFragment<FragmentDishListBinding>() {
pageNo = 1 pageNo = 1
activity.showLoading() activity.showLoading()
getDishList() getDishList()
binding.refreshLayout.setEnableRefresh(true)
} }
private fun addViewListener() { private fun addViewListener() {
@@ -134,6 +129,7 @@ class DishListFragment : BaseFragment<FragmentDishListBinding>() {
} }
} }
} }
fun getDishList(pageNo: Int, dinnerType: String) { fun getDishList(pageNo: Int, dinnerType: String) {
this.pageNo = pageNo this.pageNo = pageNo
this.dinnerType = dinnerType this.dinnerType = dinnerType
@@ -153,40 +149,71 @@ class DishListFragment : BaseFragment<FragmentDishListBinding>() {
@Suppress("unchecked_cast") @Suppress("unchecked_cast")
fun getDishList() { fun getDishList() {
activity.showLoading() activity.showLoading()
val map = mapOf( activity.getFoodList(
// "foodName" to input, param = mutableMapOf(
"dinnerType" to getDinnerTypeText(), "pageNum" to pageNo,
"pageNo" to "$pageNo", "pageSize" to pageSize,
"pageSize" to "$pageSize", "placeId" to BaseApp.canteenId,
"canteenId" to BaseApp.canteenId "dinnerType" to getDinnerTypeText()
) ),
val sb = StringBuilder(UrlConfig.QUERY_FOOD_LIST).apply { onSuccess = { records ->
append("?") activity.delayDismissLoading()
map.forEach { (key, value) -> append("$key=$value&") } finishRefresh()
} loadDishList(records)
sb.deleteCharAt(sb.length - 1) },
HttpUtil.get( onFailure = { code, msg ->
url = sb.toString(), if (isAdded.not()) {
doSuccess = { return@getFoodList
loadDishList(it)
}, doFailure = { code, msg ->
try {
if (isAdded.not()) {
return@get
}
binding.refreshLayout.run {
setEnableRefresh(true)
}
toast(msg)
finishRefresh()
if (pageNo == 1) {
loadEmptyView()
}
activity.delayDismissLoading()
} catch (e: Exception) {
e.printStackTrace()
} }
}) toast(msg)
finishRefresh()
if (pageNo == 1) {
loadEmptyView()
}
activity.delayDismissLoading()
}
)
// val map = mapOf(
//// "foodName" to input,
// "dinnerType" to getDinnerTypeText(),
// "pageNo" to "$pageNo",
// "pageSize" to "$pageSize",
// "canteenId" to BaseApp.canteenId
// )
// val sb = StringBuilder(UrlConfig.QUERY_FOOD_LIST).apply {
// append("?")
// map.forEach { (key, value) -> append("$key=$value&") }
// }
// sb.deleteCharAt(sb.length - 1)
// HttpUtil.get(
// url = sb.toString(),
// doSuccess = { data ->
// binding.refreshLayout.run {
// setEnableRefresh(true)
// }
// activity.delayDismissLoading()
// finishRefresh()
// val json = data.toJsonString()
// val recordBean: FoodRecordBean? = json.toObject<FoodRecordBean>()
// loadDishList(recordBean)
// }, doFailure = { code, msg ->
// try {
// if (isAdded.not()) {
// return@get
// }
// binding.refreshLayout.run {
// setEnableRefresh(true)
// }
// toast(msg)
// finishRefresh()
// if (pageNo == 1) {
// loadEmptyView()
// }
// activity.delayDismissLoading()
// } catch (e: Exception) {
// e.printStackTrace()
// }
// })
} }
private var emptyViewBinding: LayoutEmptyViewBinding? = null private var emptyViewBinding: LayoutEmptyViewBinding? = null
@@ -194,6 +221,8 @@ class DishListFragment : BaseFragment<FragmentDishListBinding>() {
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
private fun loadEmptyView() { private fun loadEmptyView() {
try { try {
binding.refreshLayout.setEnableRefresh(true)
binding.refreshLayout.setEnableLoadMore(false)
list.clear() list.clear()
dishAdapter.notifyDataSetChanged() dishAdapter.notifyDataSetChanged()
if (emptyViewBinding == null) { if (emptyViewBinding == null) {
@@ -233,7 +262,7 @@ class DishListFragment : BaseFragment<FragmentDishListBinding>() {
if (food != null) { if (food != null) {
food.isCooking = true food.isCooking = true
food.sort = index food.sort = index
food.dinnerType = entity.dinnerType?:"0" food.dinnerType = entity.dinnerType ?: "0"
tempList.add(food) tempList.add(food)
} else { } else {
//当前查询到的list不包括本地数据id,可能数据在很多页以后了,暂时只能直接构造数据 //当前查询到的list不包括本地数据id,可能数据在很多页以后了,暂时只能直接构造数据
@@ -242,7 +271,7 @@ class DishListFragment : BaseFragment<FragmentDishListBinding>() {
foodId = entity.foodId, foodId = entity.foodId,
foodName = entity.foodName, foodName = entity.foodName,
sort = index, sort = index,
dinnerType = entity.dinnerType?:"0", dinnerType = entity.dinnerType ?: "0",
isCooking = true isCooking = true
) )
) )
@@ -255,30 +284,22 @@ class DishListFragment : BaseFragment<FragmentDishListBinding>() {
} }
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
private fun loadDishList(data: Any) { private fun loadDishList(records: MutableList<FoodRecord>?) {
try { try {
if (isAdded.not()) { if (isAdded.not()) {
return return
} }
binding.refreshLayout.run { if (records.isNullOrEmpty()) {
setEnableRefresh(true)
}
activity.delayDismissLoading()
finishRefresh()
val json = data.toJsonString()
val recordBean: FoodRecordBean? = json.toObject<FoodRecordBean>()
if (recordBean == null || recordBean.records.isNullOrEmpty()) {
//toast("暂未搜索到相关菜品信息") //toast("暂未搜索到相关菜品信息")
if (pageNo == 1) { if (pageNo == 1) {
loadEmptyView() loadEmptyView()
} }
return return
} }
val records = recordBean.records
if (pageNo == 1) { if (pageNo == 1) {
list.clear() list.clear()
} }
list.addAll(records!!) list.addAll(records)
dishAdapter.notifyDataSetChanged() dishAdapter.notifyDataSetChanged()
val isLoadMoreEnable = records.size >= pageSize val isLoadMoreEnable = records.size >= pageSize
binding.refreshLayout.setEnableLoadMore(isLoadMoreEnable) binding.refreshLayout.setEnableLoadMore(isLoadMoreEnable)
@@ -69,7 +69,8 @@ object WeightUtil {
fun tareTwo(address: Int) { fun tareTwo(address: Int) {
try { try {
Weigher2.tareTwo(address) //Weigher2.tareTwo(address)
Weigher2.zeroTwo(address)
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
} }
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#f0aaf0"/>
<size android:width="2dp" android:height="100dp"/>
</shape>
@@ -1,216 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:background="@drawable/bg_other_page">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:background="@drawable/shape_white_30_corners"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="106dp"
android:paddingStart="30dp"
android:paddingEnd="30dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:text="菜品模式设置"
android:textStyle="bold"
android:textColor="@color/black"
android:textSize="28sp" />
<TextView
android:id="@+id/tvSetting"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|center_vertical"
android:text="配置终端默认模式"
android:textColor="@color/gray_b4"
android:textSize="28sp" />
</FrameLayout>
<com.google.android.material.divider.MaterialDivider
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:background="@color/gray_eb" />
<LinearLayout
android:id="@+id/modeRadioGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<RadioButton
android:id="@+id/rbModeCook"
android:layout_width="match_parent"
android:layout_height="190dp"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:background="@color/white"
android:button="@null"
android:drawableEnd="@drawable/mode_select"
android:textSize="36sp"
tools:text="制作模式" />
<com.google.android.material.divider.MaterialDivider
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:background="@color/gray_eb" />
<RadioButton
android:id="@+id/rbModeSampling"
android:layout_width="match_parent"
android:layout_height="190dp"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:background="@color/white"
android:button="@null"
android:drawableEnd="@drawable/mode_select"
android:textSize="36sp"
tools:text="采样模式" />
</LinearLayout>
<com.google.android.material.divider.MaterialDivider
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:background="@color/gray_eb" />
<RadioButton
android:id="@+id/rbModeQuality"
android:layout_width="match_parent"
android:layout_height="190dp"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:button="@null"
android:drawableEnd="@drawable/ic_dish_disable"
android:enabled="false"
android:textColor="@color/gray_b4"
android:textSize="36sp"
tools:text="品控模式" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:background="@drawable/shape_white_30_corners"
android:orientation="vertical"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:text="@string/seasoning_setting"
android:textColor="@color/black666"
android:textSize="28sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:layout_marginEnd="15dp"
android:text="@string/seasoning_setting2"
android:textColor="@color/gray_b4"
android:textSize="28sp" />
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvSeasoning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:layout_marginStart="23dp"
android:layout_marginEnd="22dp"
android:overScrollMode="never"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="3"
tools:itemCount="15"
tools:listitem="@layout/list_item_cell" />
<TextView
android:id="@+id/tvRightBottomCell"
android:layout_width="467dp"
android:layout_height="255dp"
android:layout_gravity="bottom|end"
android:layout_marginEnd="30dp"
android:layout_marginBottom="8dp"
android:background="@drawable/selector_text_cell"
android:gravity="center"
android:textColor="@color/black"
android:textSize="28sp"
android:textStyle="bold"
tools:text="食盐" />
</FrameLayout>
</LinearLayout>
<!-- <LinearLayout-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="match_parent"-->
<!-- android:layout_marginStart="30dp"-->
<!-- android:layout_marginTop="10dp"-->
<!-- android:layout_marginEnd="30dp"-->
<!-- android:layout_marginBottom="30dp"-->
<!-- android:gravity="bottom"-->
<!-- android:orientation="horizontal">-->
<!-- <TextView-->
<!-- android:id="@+id/btnCancel"-->
<!-- android:layout_width="0dp"-->
<!-- android:layout_height="90dp"-->
<!-- android:layout_weight="1"-->
<!-- android:background="@drawable/ripple_effect_light"-->
<!-- android:gravity="center"-->
<!-- android:text="取消"-->
<!-- android:textColor="@color/dish_green"-->
<!-- android:textSize="32sp"-->
<!-- android:textStyle="bold"-->
<!-- tools:ignore="HardcodedText" />-->
<!-- <TextView-->
<!-- android:id="@+id/btnConfirm"-->
<!-- android:layout_width="0dp"-->
<!-- android:layout_height="90dp"-->
<!-- android:layout_marginStart="30dp"-->
<!-- android:layout_weight="1"-->
<!-- android:background="@drawable/ripple_effect_green"-->
<!-- android:gravity="center"-->
<!-- android:text="确定"-->
<!-- android:textColor="@color/white"-->
<!-- android:textSize="32sp"-->
<!-- android:textStyle="bold"-->
<!-- tools:ignore="HardcodedText" />-->
<!-- </LinearLayout>-->
</LinearLayout>
@@ -243,7 +243,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_marginStart="30dp" android:layout_marginStart="30dp"
android:layout_marginTop="30dp" android:layout_marginTop="0dp"
android:layout_marginEnd="30dp" android:layout_marginEnd="30dp"
android:layout_weight="1" android:layout_weight="1"
android:background="@drawable/shape_white_30_corners" android:background="@drawable/shape_white_30_corners"
@@ -262,15 +262,16 @@
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvDishPartList" android:id="@+id/rvDishPartList"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:layout_marginBottom="20dp" android:layout_marginBottom="20dp"
android:overScrollMode="never" android:overScrollMode="never"
tools:itemCount="3" tools:itemCount="3"
tools:listitem="@layout/list_item_dish_cook" /> tools:listitem="@layout/list_item_dish_cook"
android:scrollbars="vertical"/>
</LinearLayout> </LinearLayout>
<TextView <androidx.appcompat.widget.AppCompatButton
android:id="@+id/btnCook" android:id="@+id/btnCook"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="90dp" android:layout_height="90dp"
@@ -280,9 +281,10 @@
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="32sp" android:textSize="32sp"
android:textStyle="bold" android:textStyle="bold"
android:background="@drawable/ripple_effect_green" android:background="@drawable/shape_green_bg"
android:clickable="true" /> android:clickable="true" />
<!-- android:background="@drawable/ripple_effect_green"-->
<!-- android:background="@drawable/shape_green_bg"--> <!-- android:background="@drawable/shape_green_bg"-->
<!-- android:background="?attr/selectableItemBackground"--> <!-- android:background="?attr/selectableItemBackground"-->
<!-- android:clickable="true"--> <!-- android:clickable="true"-->
+3 -2
View File
@@ -31,7 +31,7 @@
android:textSize="30sp" android:textSize="30sp"
android:textStyle="bold" android:textStyle="bold"
tools:ignore="HardcodedText" tools:ignore="HardcodedText"
android:visibility="visible"/> android:visibility="invisible"/>
<Space <Space
android:layout_width="wrap_content" android:layout_width="wrap_content"
@@ -45,6 +45,7 @@
android:layout_gravity="center_horizontal|bottom" android:layout_gravity="center_horizontal|bottom"
android:layout_marginBottom="50dp" android:layout_marginBottom="50dp"
tools:src="@mipmap/ic_logo1024" tools:src="@mipmap/ic_logo1024"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription"
android:visibility="invisible"/>
</LinearLayout> </LinearLayout>
@@ -204,7 +204,7 @@
android:layout_marginTop="39dp" android:layout_marginTop="39dp"
android:layout_marginBottom="39dp" android:layout_marginBottom="39dp"
android:text="@string/dish_weight_set_remind" android:text="@string/dish_weight_set_remind"
android:textColor="@color/dish_green" android:textColor="@color/black999"
android:textSize="26sp" /> android:textSize="26sp" />
</LinearLayout> </LinearLayout>
@@ -253,35 +253,26 @@
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvDishPartList" android:id="@+id/rvDishPartList"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:layout_marginBottom="20dp" android:layout_marginBottom="20dp"
android:overScrollMode="never" android:overScrollMode="never"
tools:itemCount="3" tools:itemCount="3"
tools:listitem="@layout/list_item_dish_cook" /> tools:listitem="@layout/list_item_dish_cook"
android:scrollbars="vertical" />
</LinearLayout> </LinearLayout>
<!-- <com.google.android.material.button.MaterialButton--> <androidx.appcompat.widget.AppCompatButton
<!-- android:id="@+id/btnCook"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="90dp"-->
<!-- android:layout_margin="30dp"-->
<!-- android:text="@string/goCooking"-->
<!-- android:textSize="32sp"-->
<!-- android:backgroundTint="@null"-->
<!-- style="@style/CookButtonStyle"-->
<!-- android:textStyle="bold"/>-->
<TextView
android:id="@+id/btnCook" android:id="@+id/btnCook"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="90dp" android:layout_height="90dp"
android:layout_margin="30dp" android:layout_margin="30dp"
android:background="@drawable/ripple_effect_green" android:background="@drawable/shape_green_bg"
android:gravity="center" android:gravity="center"
android:text="@string/goCooking" android:text="@string/goCooking"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="32sp" android:textSize="32sp"
android:textStyle="bold" /> android:textStyle="bold" />
<!-- android:background="@drawable/ripple_effect_green"-->
</LinearLayout> </LinearLayout>
@@ -90,16 +90,17 @@
</com.scwang.smart.refresh.layout.SmartRefreshLayout> </com.scwang.smart.refresh.layout.SmartRefreshLayout>
</LinearLayout> </LinearLayout>
<TextView <androidx.appcompat.widget.AppCompatButton
android:id="@+id/btnAddSampling" android:id="@+id/btnAddSampling"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="90dp" android:layout_height="90dp"
android:layout_margin="30dp" android:layout_margin="30dp"
android:background="@drawable/ripple_effect_green" android:background="@drawable/shape_green_bg"
android:gravity="center" android:gravity="center"
android:text="@string/add_sampling" android:text="@string/add_sampling"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="32sp" android:textSize="32sp"
android:textStyle="bold" /> android:textStyle="bold" />
<!-- android:background="@drawable/ripple_effect_green"-->
</LinearLayout> </LinearLayout>
@@ -1,173 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:background="@drawable/bg_other_page">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:background="@drawable/shape_white_30_corners"
android:orientation="vertical">
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:text="@string/seasoning"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:textColor="@color/black666"
android:textSize="28sp" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvSeasoning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:layout_marginStart="23dp"
android:layout_marginEnd="22dp"
android:overScrollMode="never"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="3"
tools:itemCount="15"
tools:listitem="@layout/list_item_cell" />
<TextView
android:id="@+id/tvRightBottomCell"
android:layout_width="467dp"
android:layout_height="255dp"
android:layout_gravity="bottom|end"
android:layout_marginEnd="30dp"
android:layout_marginBottom="8dp"
android:background="@drawable/shape_white_fb_15_corners2"
android:gravity="center"
android:textColor="@color/black"
android:textSize="28sp"
android:textStyle="bold"
tools:text="食盐" />
</FrameLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginStart="30dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="30dp"
android:background="@drawable/shape_white_30_corners"
android:orientation="vertical"
android:paddingStart="30dp"
android:paddingEnd="30dp">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="120dp"
android:layout_height="80dp"
android:layout_gravity="start"
android:layout_marginStart="30dp"
android:layout_marginTop="30dp"
android:gravity="center"
android:text="熟重"
android:textColor="@color/black666"
android:textSize="28sp" />
<TextView
android:id="@+id/btnWeightClear"
android:layout_width="120dp"
android:layout_height="80dp"
android:layout_gravity="end"
android:layout_marginTop="30dp"
android:layout_marginEnd="30dp"
android:background="@drawable/shape_green_stroke"
android:gravity="center"
android:text="清零"
android:textColor="@color/dish_green"
android:textSize="28sp" />
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/tvTotalWeight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:includeFontPadding="false"
android:text="0.00"
android:textColor="@color/black"
android:textSize="90sp" />
<TextView
android:id="@+id/tvWeightUnit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:includeFontPadding="false"
android:text="千克"
android:textColor="@color/black999"
android:textSize="32sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="30dp"
android:layout_marginTop="40dp"
android:layout_marginEnd="30dp"
android:layout_marginBottom="30dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/btnCook"
android:layout_width="0dp"
android:layout_height="90dp"
android:layout_weight="1"
android:gravity="center"
android:text="制作"
android:background="@drawable/ripple_effect_light"
android:textColor="@color/dish_green"
android:textSize="32sp"
android:textStyle="bold" />
<!-- android:background="@drawable/shape_green_stroke"-->
<TextView
android:id="@+id/btnSubmit"
android:layout_width="0dp"
android:layout_height="90dp"
android:layout_marginStart="30dp"
android:layout_weight="1"
android:background="@drawable/ripple_effect_green"
android:gravity="center"
android:text="提交"
android:textColor="@color/white"
android:textSize="32sp"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>
@@ -20,28 +20,28 @@
android:id="@+id/tvTitle" android:id="@+id/tvTitle"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:text="@string/seasoning"
android:layout_marginStart="30dp" android:layout_marginStart="30dp"
android:layout_marginTop="40dp"
android:layout_marginEnd="30dp" android:layout_marginEnd="30dp"
android:text="@string/seasoning"
android:textColor="@color/black666" android:textColor="@color/black666"
android:textSize="28sp" /> android:textSize="28sp" />
<include <include
android:id="@+id/include" android:id="@+id/include"
layout="@layout/layout_grid"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content" />
layout="@layout/layout_grid"/>
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginStart="30dp" android:layout_marginStart="30dp"
android:layout_marginTop="30dp" android:layout_marginTop="30dp"
android:layout_marginEnd="30dp" android:layout_marginEnd="30dp"
android:layout_weight="1"
android:background="@drawable/shape_white_30_corners" android:background="@drawable/shape_white_30_corners"
android:orientation="vertical" android:orientation="vertical"
android:paddingStart="30dp" android:paddingStart="30dp"
@@ -106,38 +106,41 @@
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="30dp"
android:layout_marginTop="40dp"
android:layout_marginEnd="30dp"
android:layout_marginBottom="30dp"
android:gravity="center_vertical" android:gravity="center_vertical"
android:orientation="horizontal"> android:orientation="horizontal">
<TextView <androidx.appcompat.widget.AppCompatButton
android:id="@+id/btnCook" android:id="@+id/btnCook"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="90dp" android:layout_height="90dp"
android:layout_marginStart="30dp"
android:layout_marginTop="40dp"
android:layout_marginBottom="30dp"
android:layout_weight="1" android:layout_weight="1"
android:background="@drawable/shape_green_stroke"
android:gravity="center" android:gravity="center"
android:text="制作" android:text="制作"
android:background="@drawable/ripple_effect_light"
android:textColor="@color/dish_green" android:textColor="@color/dish_green"
android:textSize="32sp" android:textSize="32sp"
android:textStyle="bold" /> android:textStyle="bold" />
<!-- android:background="@drawable/shape_green_stroke"--> <!-- android:background="@drawable/ripple_effect_light"-->
<TextView <androidx.appcompat.widget.AppCompatButton
android:id="@+id/btnSubmit" android:id="@+id/btnSubmit"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="90dp" android:layout_height="90dp"
android:layout_marginStart="30dp" android:layout_marginStart="30dp"
android:layout_marginTop="40dp"
android:layout_marginEnd="30dp"
android:layout_marginBottom="30dp"
android:layout_weight="1" android:layout_weight="1"
android:background="@drawable/ripple_effect_green" android:background="@drawable/shape_green_bg"
android:gravity="center" android:gravity="center"
android:text="提交" android:text="提交"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="32sp" android:textSize="32sp"
android:textStyle="bold" /> android:textStyle="bold" />
<!-- android:background="@drawable/ripple_effect_green"-->
</LinearLayout> </LinearLayout>
@@ -5,6 +5,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center_horizontal" android:gravity="center_horizontal"
tools:background="@color/white"
android:orientation="vertical"> android:orientation="vertical">
<View <View
@@ -67,6 +68,7 @@
android:id="@+id/refreshLayout" android:id="@+id/refreshLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginTop="10dp"
app:srlEnableOverScrollDrag="false"> app:srlEnableOverScrollDrag="false">
<com.scwang.smart.refresh.header.ClassicsHeader <com.scwang.smart.refresh.header.ClassicsHeader
@@ -76,12 +78,13 @@
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView" android:id="@+id/recyclerView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:layout_marginStart="45dp" android:layout_marginStart="45dp"
android:layout_marginTop="35dp" android:layout_marginTop="15dp"
android:layout_marginEnd="45dp" android:layout_marginEnd="45dp"
android:layout_marginBottom="150dp" android:layout_marginBottom="15dp"
android:nestedScrollingEnabled="true" android:nestedScrollingEnabled="true"
android:minHeight="380dp"
android:overScrollMode="never" android:overScrollMode="never"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="2" app:spanCount="2"
@@ -5,6 +5,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center_horizontal" android:gravity="center_horizontal"
tools:background="@color/white"
android:orientation="vertical"> android:orientation="vertical">
<View <View
@@ -47,12 +48,10 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="top|end" android:layout_gravity="top|end"
android:text="清零" android:text="清零"
android:paddingStart="30dp" android:paddingHorizontal="30dp"
android:paddingEnd="30dp"
android:layout_marginTop="15dp" android:layout_marginTop="15dp"
android:layout_marginEnd="15dp" android:layout_marginEnd="15dp"
android:paddingTop="16dp" android:paddingVertical="16dp"
android:paddingBottom="16dp"
android:background="@drawable/ripple_effect_green" android:background="@drawable/ripple_effect_green"
android:textColor="@color/white_f6" android:textColor="@color/white_f6"
android:textSize="30sp" android:textSize="30sp"
@@ -102,7 +101,7 @@
android:id="@+id/refreshLayout" android:id="@+id/refreshLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginTop="25dp" android:layout_marginTop="10dp"
app:srlEnableOverScrollDrag="false"> app:srlEnableOverScrollDrag="false">
<com.scwang.smart.refresh.header.ClassicsHeader <com.scwang.smart.refresh.header.ClassicsHeader
@@ -112,10 +111,12 @@
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView" android:id="@+id/recyclerView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:layout_marginStart="45dp" android:layout_marginStart="45dp"
android:layout_marginEnd="45dp" android:layout_marginEnd="45dp"
android:layout_marginBottom="50dp" android:layout_marginTop="15dp"
android:layout_marginBottom="15dp"
android:minHeight="380dp"
android:nestedScrollingEnabled="true" android:nestedScrollingEnabled="true"
android:overScrollMode="never" android:overScrollMode="never"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
@@ -1,281 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:background="@drawable/bg_other_page">
<LinearLayout
android:id="@+id/llSearchBar"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_margin="30dp"
android:background="@drawable/shape_white_30_corners"
android:gravity="center_vertical"
android:orientation="horizontal">
<EditText
android:id="@+id/etInputDish"
android:layout_width="0dp"
android:layout_height="80dp"
android:layout_marginStart="28dp"
android:layout_weight="1"
android:autofillHints=""
android:background="@color/white"
android:gravity="center"
android:hint="@string/dish_search_hint"
android:inputType="text"
android:imeOptions="actionSearch"
android:paddingStart="3dp"
android:paddingEnd="3dp"
android:textColor="@color/black333"
android:textColorHint="@color/gray_c8"
android:textSize="40sp"
tools:ignore="TextFields" />
<ImageView
android:id="@+id/ivDishSearch"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
android:paddingStart="10dp"
android:paddingEnd="10dp"
android:src="@drawable/ic_search_gray"
tools:ignore="ContentDescription" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:layout_marginBottom="30dp"
android:background="@drawable/shape_white_30_corners"
android:gravity="center_vertical"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="113dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:layout_weight="1"
android:text="@string/dish_name"
android:textColor="@color/black666"
android:textSize="28sp" />
<TextView
android:id="@+id/tvInputDishType"
android:layout_width="wrap_content"
android:layout_height="80dp"
android:background="@color/white"
android:gravity="center_vertical|end"
android:hint="@string/dish_search_hint2"
android:textColor="@color/black333"
android:textColorHint="@color/gray_c8"
android:textSize="28sp"
android:maxLines="1"
android:ellipsize="end"
android:drawablePadding="30dp"
android:paddingEnd="30dp"
android:paddingStart="30dp"
app:drawableEndCompat="@drawable/ic_search_green" />
<!-- <ImageView-->
<!-- android:id="@+id/ivDishTypeSearch"-->
<!-- android:layout_width="62dp"-->
<!-- android:layout_height="62dp"-->
<!-- android:layout_marginStart="15dp"-->
<!-- android:layout_marginEnd="15dp"-->
<!-- android:paddingStart="15dp"-->
<!-- android:paddingEnd="15dp"-->
<!-- android:src="@drawable/ic_search_green"-->
<!-- tools:ignore="ContentDescription" />-->
</LinearLayout>
<com.google.android.material.divider.MaterialDivider
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:background="@color/gray_eb" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="113dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:text="@string/dish_from_type"
android:textColor="@color/black666"
android:textSize="28sp" />
<RadioGroup
android:id="@+id/rgSampling"
android:layout_width="match_parent"
android:layout_height="80dp"
android:gravity="center_vertical|end"
android:orientation="horizontal">
<RadioButton
android:id="@+id/rbDishTypeFirst"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="30dp"
android:background="@color/white"
android:button="@null"
android:drawableStart="@drawable/selector_dish_type"
android:drawablePadding="30dp"
android:gravity="center"
android:paddingStart="30dp"
android:paddingEnd="30dp"
android:text="@string/dish_type_first"
android:textColor="@color/dish_type_font"
android:textSize="30sp"
android:textStyle="bold" />
<RadioButton
android:id="@+id/rbDishTypeSecond"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="30dp"
android:background="@color/white"
android:button="@null"
android:checked="false"
android:drawableStart="@drawable/selector_dish_type"
android:drawablePadding="30dp"
android:gravity="center"
android:paddingStart="30dp"
android:paddingEnd="30dp"
android:text="@string/dish_type_second"
android:textColor="@color/dish_type_font"
android:textSize="30sp"
android:textStyle="bold" />
</RadioGroup>
</LinearLayout>
<com.google.android.material.divider.MaterialDivider
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:background="@color/gray_eb" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="170dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:text="@string/dish_part_weight_remind"
android:textColor="@color/black666"
android:textSize="28sp" />
<TextView
android:id="@+id/tvDishPartWeight"
android:layout_width="0dp"
android:layout_height="100dp"
android:layout_marginStart="30dp"
android:layout_weight="1"
android:autofillHints=""
android:background="@drawable/shape_white_f6_10_corners"
android:gravity="center"
android:hint="-"
android:maxLines="1"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:text=""
android:textColor="@color/dish_green"
android:textColorHint="@color/gray_d6"
android:textSize="60sp"
tools:ignore="HardcodedText" />
<ImageView
android:id="@+id/ivWeightClear"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_marginStart="30dp"
android:src="@drawable/ic_weight_clear"
tools:ignore="ContentDescription" />
<ImageView
android:id="@+id/ivWeightAdd"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:src="@drawable/ic_weight_add"
tools:ignore="ContentDescription" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginStart="30dp"
android:layout_marginTop="30dp"
android:layout_marginEnd="30dp"
android:layout_weight="1"
android:background="@drawable/shape_white_30_corners"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="30dp"
android:layout_marginTop="40dp"
android:layout_marginBottom="40dp"
android:text="@string/dish_composition"
android:textColor="@color/black666"
android:textSize="28sp" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvDishPartList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:overScrollMode="never"
tools:itemCount="3"
tools:listitem="@layout/list_item_dish_cook" />
</LinearLayout>
<TextView
android:id="@+id/btnCook"
android:layout_width="match_parent"
android:layout_height="90dp"
android:layout_margin="30dp"
android:gravity="center"
android:text="@string/goCooking"
android:textColor="@color/white"
android:textSize="32sp"
android:textStyle="bold"
android:background="@drawable/ripple_effect_green"
android:clickable="true" />
<!-- android:background="@drawable/shape_green_bg"-->
<!-- android:background="?attr/selectableItemBackground"-->
<!-- android:clickable="true"-->
</LinearLayout>
@@ -1,105 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:background="@drawable/bg_other_page">
<!-- <RadioGroup-->
<!-- android:id="@+id/dishRadioGroup"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="88dp"-->
<!-- android:layout_marginTop="15dp"-->
<!-- android:orientation="horizontal">-->
<!-- <RadioButton-->
<!-- android:id="@+id/rbCooking"-->
<!-- android:layout_width="0dp"-->
<!-- android:layout_height="match_parent"-->
<!-- android:layout_marginStart="30dp"-->
<!-- android:layout_weight="1"-->
<!-- android:background="@drawable/breakfast_bg"-->
<!-- android:button="@null"-->
<!-- android:checked="true"-->
<!-- android:gravity="center"-->
<!-- android:text="@string/rb_sampling_cooking"-->
<!-- android:textColor="@color/breakfast_font"-->
<!-- android:textSize="30sp"-->
<!-- android:textStyle="bold" />-->
<!-- <RadioButton-->
<!-- android:id="@+id/rbFinished"-->
<!-- android:layout_width="0dp"-->
<!-- android:layout_height="match_parent"-->
<!-- android:layout_marginStart="9dp"-->
<!-- android:layout_marginEnd="30dp"-->
<!-- android:layout_weight="1"-->
<!-- android:background="@drawable/breakfast_bg"-->
<!-- android:button="@null"-->
<!-- android:checked="false"-->
<!-- android:gravity="center"-->
<!-- android:text="@string/rb_sampling_finished"-->
<!-- android:textColor="@color/breakfast_font"-->
<!-- android:textSize="30sp"-->
<!-- android:textStyle="bold" />-->
<!-- </RadioGroup>-->
<!-- <LinearLayout-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="0dp"-->
<!-- android:layout_weight="1"-->
<!-- android:orientation="vertical"-->
<!-- android:layout_marginTop="30dp"-->
<!-- android:layout_marginStart="30dp"-->
<!-- android:layout_marginEnd="30dp"-->
<!-- android:background="@drawable/shape_white_30_corners">-->
<!-- <TextView-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:text="@string/dish_list"-->
<!-- android:textColor="@color/black666"-->
<!-- android:textSize="28sp"-->
<!-- android:visibility="gone"/>-->
<!-- <com.scwang.smart.refresh.layout-sw800dp.SmartRefreshLayout-->
<!-- android:id="@+id/refreshLayout"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="match_parent"-->
<!-- android:layout_marginTop="8dp"-->
<!-- android:layout_marginBottom="7dp">-->
<!-- <com.scwang.smart.refresh.header.ClassicsHeader-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content" />-->
<!-- <androidx.recyclerview.widget.RecyclerView-->
<!-- android:id="@+id/rvSamplingList"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="match_parent"-->
<!-- android:overScrollMode="never"-->
<!-- tools:listitem="@layout-sw800dp/list_item_dish" />-->
<!-- <com.scwang.smart.refresh.footer.ClassicsFooter-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content" />-->
<!-- </com.scwang.smart.refresh.layout-sw800dp.SmartRefreshLayout>-->
<!-- </LinearLayout>-->
<!-- <TextView-->
<!-- android:id="@+id/btnAddSampling"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="90dp"-->
<!-- android:layout_margin="30dp"-->
<!-- android:background="@drawable/ripple_effect_green"-->
<!-- android:gravity="center"-->
<!-- android:text="@string/add_sampling"-->
<!-- android:textColor="@color/white"-->
<!-- android:textSize="32sp"-->
<!-- android:textStyle="bold" />-->
</LinearLayout>
@@ -1,30 +1,32 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center" android:gravity="center"
android:orientation="vertical"> android:orientation="vertical"
tools:background="@color/white">
<TextView <TextView
android:id="@+id/tvDialogTitle" android:id="@+id/tvDialogTitle"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="60dp"
android:text="@string/food_remind_01" android:text="@string/food_remind_01"
android:textColor="@color/black" android:textColor="@color/black"
android:textSize="36sp" android:textSize="36sp"
android:layout_marginTop="60dp"
android:textStyle="bold" /> android:textStyle="bold" />
<TextView <TextView
android:id="@+id/tvDialogContent" android:id="@+id/tvDialogContent"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:layout_marginStart="20dp" android:layout_marginStart="20dp"
android:gravity="center_horizontal" android:layout_marginTop="25dp"
android:layout_marginEnd="20dp" android:layout_marginEnd="20dp"
android:layout_marginBottom="60dp"
android:gravity="center_horizontal"
android:text="@string/food_remind_02" android:text="@string/food_remind_02"
android:textColor="@color/black999" android:textColor="@color/black999"
android:layout_marginBottom="60dp"
android:textSize="26sp" /> android:textSize="26sp" />
</LinearLayout> </LinearLayout>
+1
View File
@@ -8,6 +8,7 @@
android:paddingTop="30dp" android:paddingTop="30dp"
android:paddingEnd="22dp" android:paddingEnd="22dp"
android:paddingBottom="20dp" android:paddingBottom="20dp"
tools:background="@color/white"
app:columnCount="3" app:columnCount="3"
app:orientation="vertical" app:orientation="vertical"
app:rowCount="5" app:rowCount="5"
+4 -1
View File
@@ -41,5 +41,8 @@
<item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsFloating">true</item> <item name="android:windowIsFloating">true</item>
</style> </style>
<style name="DialogSoftInputAnimation">
<item name="android:windowEnterAnimation">@android:anim/fade_in</item>
<item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
</resources> </resources>