diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c7bbed9..50ce187 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -58,6 +58,7 @@ + diff --git a/app/src/main/java/com/sw/inbound/activity/PurchaseOrderActivity.kt b/app/src/main/java/com/sw/inbound/activity/PurchaseOrderActivity.kt index 91da46d..d895c92 100644 --- a/app/src/main/java/com/sw/inbound/activity/PurchaseOrderActivity.kt +++ b/app/src/main/java/com/sw/inbound/activity/PurchaseOrderActivity.kt @@ -1,17 +1,91 @@ package com.sw.inbound.activity +import android.annotation.SuppressLint import android.os.Bundle import androidx.activity.ComponentActivity +import androidx.activity.viewModels +import androidx.compose.runtime.collectAsState +import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.LinearLayoutManager +import com.sw.inbound.R +import com.sw.inbound.adapter.PurchaseOrderAdapter +import com.sw.inbound.databinding.ActivityPurchaseOrderBinding +import com.sw.inbound.dialog.Loading +import com.sw.inbound.model.response.SupplierInfo +import com.sw.inbound.utils.ext.clickWithDebounce +import com.sw.inbound.utils.ext.gone +import com.sw.inbound.utils.ext.startActivity +import com.sw.inbound.utils.ext.visible +import com.sw.inbound.viewmodel.PurchaseOrderViewModel import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch /** * 采购单列表 */ @AndroidEntryPoint -class PurchaseOrderActivity : ComponentActivity(){ +class PurchaseOrderActivity : ComponentActivity() { + + private var list = mutableListOf() + private val adapter by lazy { + PurchaseOrderAdapter(list).apply { + setOnItemClickListener { adapter, view, position -> + openReceiptPage(list[position]) + } + addOnItemChildClickListener(R.id.btnReceive) { adapter, view, position -> + openReceiptPage(list[position]) + } + } + } + + private fun openReceiptPage(item: SupplierInfo) { + startActivity { + putExtra(GoodsListActivity.ID, item.id) + putExtra(GoodsListActivity.SUPPLIER_ID, item.supplierId) + putExtra(GoodsListActivity.IS_RECEIPT_PAGE, true) + //putExtra(GoodsListActivity.IS_NEW_RECEIPT, false) + } + } + + private lateinit var binding: ActivityPurchaseOrderBinding + val viewModel: PurchaseOrderViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + binding = ActivityPurchaseOrderBinding.inflate(layoutInflater) + setContentView(binding.root) + binding.rvOrderList.let { + it.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) + it.adapter = adapter + } + binding.btnBack.setOnClickListener { finish() } + binding.btnAddReceipt.clickWithDebounce { + startActivity { + putExtra(GoodsListActivity.IS_RECEIPT_PAGE, false) + } + } + Loading.show(this) + viewModel.getOrderListNew(pageNum = 1, pageSize = 100) { suppliers -> + runOnUiThread { + binding.root.postDelayed({ + Loading.dismiss() + }, 600) + updateSupplierList(suppliers) + } + } + } + + @SuppressLint("NotifyDataSetChanged") + private fun updateSupplierList(suppliers: List?) { + if (suppliers.isNullOrEmpty()) { + binding.rvOrderList.gone() + binding.layoutEmptyView.visible() + return + } + list.addAll(suppliers) + adapter.notifyDataSetChanged() + binding.rvOrderList.visible() + binding.layoutEmptyView.gone() } } \ No newline at end of file diff --git a/app/src/main/java/com/sw/inbound/adapter/PurchaseOrderAdapter.kt b/app/src/main/java/com/sw/inbound/adapter/PurchaseOrderAdapter.kt index 4d696ac..c2c6ba6 100644 --- a/app/src/main/java/com/sw/inbound/adapter/PurchaseOrderAdapter.kt +++ b/app/src/main/java/com/sw/inbound/adapter/PurchaseOrderAdapter.kt @@ -1,29 +1,59 @@ -//package com.sw.inbound.adapter -// -//import android.content.Context -//import android.view.LayoutInflater -//import android.view.ViewGroup -//import com.chad.library.adapter4.BaseQuickAdapter -//import com.chad.library.adapter4.viewholder.QuickViewHolder -//import com.sw.inbound.databinding.ListItemCollectSearchBinding -//import com.sw.inbound.databinding.ListItemPurchaseOrderBinding -//import com.sw.inbound.model.response.SearchGoodsInfo -//import com.sw.inbound.model.response.SupplierInfo -// -////List -//class PurchaseOrderAdapter:BaseQuickAdapter { -// -// inner class VH(var binding: ListItemCollectSearchBinding) : QuickViewHolder(binding.root) -// -// override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH { -// val inflater = LayoutInflater.from(context) -// val binding = ListItemPurchaseOrderBinding.inflate(inflater, parent, false) -// return VH(binding) -// } -// -// override fun onBindViewHolder(holder: VH, position: Int, item: SupplierInfo) { -// -// -// } -// -//} \ No newline at end of file +package com.sw.inbound.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.core.view.updateLayoutParams +import com.chad.library.adapter4.BaseQuickAdapter +import com.chad.library.adapter4.viewholder.QuickViewHolder +import com.sw.inbound.R +import com.sw.inbound.databinding.ListItemPurchaseOrderBinding +import com.sw.inbound.ext.screenSize +import com.sw.inbound.ext.toFormattedString +import com.sw.inbound.model.response.SupplierInfo +import com.sw.inbound.utils.ext.dp +import com.sw.inbound.utils.ext.ifNullOrBlank + + +class PurchaseOrderAdapter(var list:List):BaseQuickAdapter(list) { + + inner class VH(var binding: ListItemPurchaseOrderBinding) : QuickViewHolder(binding.root) + + override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH { + val inflater = LayoutInflater.from(context) + val binding = ListItemPurchaseOrderBinding.inflate(inflater, parent, false) + return VH(binding) + } + + override fun onBindViewHolder(holder: VH, position: Int, item: SupplierInfo?) { + val screenWidth = context.screenSize[0] + holder.itemView.updateLayoutParams { + width = (screenWidth - 2*60.dp) / 3 + } + + val binding = holder.binding + val receiveStatus = item?.receiveStatus?:"" + val (statusColor, statusLabel) = when(receiveStatus) { + 1 -> R.color.red to "待收货" + 2 -> R.color.origin to "已收货" + 3 -> R.color.black to "已关闭" + else -> R.color.black to "未知状态" + } + binding.tvReceiveState.run { + text = statusLabel + setTextColor(ContextCompat.getColor(context, statusColor)) + } + + binding.tvSupplierName.text = item?.supplierName.ifNullOrBlank("-") + binding.tvOrderNo.text = "单号 ${item?.purCode.ifNullOrBlank("-")}" + binding.tvGoodsCount.text = item?.goodCount?.toFormattedString() + binding.tvPurchaseDate.text = item?.purchaseDate.ifNullOrBlank("-") + binding.tvReceiveDate.text = item?.receiveDate.ifNullOrBlank("-") + binding.tvPurchaseMan.text = item?.receiveUser.ifNullOrBlank("-") + binding.btnReceive.text = if (item?.receiveStatus == 4) "部分收货" else "收货" + + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/sw/inbound/ext/OtherExt.kt b/app/src/main/java/com/sw/inbound/ext/OtherExt.kt index 082a1e6..86c4b61 100644 --- a/app/src/main/java/com/sw/inbound/ext/OtherExt.kt +++ b/app/src/main/java/com/sw/inbound/ext/OtherExt.kt @@ -1,10 +1,16 @@ package com.sw.inbound.ext -import android.app.Activity +import android.content.Context import android.util.DisplayMetrics +import android.view.WindowManager -fun Activity.getScreenWidth(): Int { +val Context.screenSize: IntArray + get() { + val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager val displayMetrics = DisplayMetrics() windowManager.defaultDisplay.getMetrics(displayMetrics) - return displayMetrics.widthPixels - } \ No newline at end of file + return intArrayOf( + displayMetrics.widthPixels, + displayMetrics.heightPixels + ) + } diff --git a/app/src/main/java/com/sw/inbound/ui/page/HomeScreen.kt b/app/src/main/java/com/sw/inbound/ui/page/HomeScreen.kt index 850b118..53819e5 100644 --- a/app/src/main/java/com/sw/inbound/ui/page/HomeScreen.kt +++ b/app/src/main/java/com/sw/inbound/ui/page/HomeScreen.kt @@ -26,6 +26,7 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.rememberNavController import com.sw.inbound.R import com.sw.inbound.activity.GoodsListActivity +import com.sw.inbound.activity.PurchaseOrderActivity import com.sw.inbound.activity.SelfProcurementActivity import com.sw.inbound.ui.Screen import com.sw.inbound.ui.weight.TopTitleBar @@ -79,12 +80,13 @@ fun HomeScreen( interactionSource = remember { MutableInteractionSource() }, indication = null ) { - navController.navigate(Screen.PurchaseOrder.route) +// navController.navigate(Screen.PurchaseOrder.route) //navController.context.startActivity { // putExtra(GoodsListActivity.ID, "123123") // putExtra(GoodsListActivity.SUPPLIER_ID, "123123123123") // putExtra(GoodsListActivity.IS_RECEIPT_PAGE, true) //} + navController.context.startActivity() }, painter = painterResource(R.mipmap.ic_order_purchase), contentDescription = "采购单入库" diff --git a/app/src/main/java/com/sw/inbound/ui/page/PurchaseOrderScreen.kt b/app/src/main/java/com/sw/inbound/ui/page/PurchaseOrderScreen.kt index dca299e..ee99165 100644 --- a/app/src/main/java/com/sw/inbound/ui/page/PurchaseOrderScreen.kt +++ b/app/src/main/java/com/sw/inbound/ui/page/PurchaseOrderScreen.kt @@ -135,7 +135,7 @@ fun PurchaseOrderScreen( if (first.value) { return@Box } - if (products.isEmpty()) { + if (products.isNullOrEmpty()) { PurchaseEmptyItem() } else { LazyRow( @@ -144,7 +144,7 @@ fun PurchaseOrderScreen( contentPadding = PaddingValues(16.dp), horizontalArrangement = Arrangement.spacedBy(30.dp) ) { - items(items = products, key = { it!!.id ?: "" }) { product -> + items(items = products!!, key = { it!!.id ?: "" }) { product -> PurchaseOrderItem(product!!) { // navController.navigate( // Screen.ReceiptProduct.createRoute( diff --git a/app/src/main/java/com/sw/inbound/utils/ext/Common.kt b/app/src/main/java/com/sw/inbound/utils/ext/Common.kt index 9272509..981d1b1 100644 --- a/app/src/main/java/com/sw/inbound/utils/ext/Common.kt +++ b/app/src/main/java/com/sw/inbound/utils/ext/Common.kt @@ -171,9 +171,7 @@ fun EditText.addOnActionSearchListener(searchCallback: () -> Unit) { * @param action 点击执行逻辑 */ fun View.clickWithDebounce(delay: Long = 300, action: () -> Unit) { - var job: Job? = null setOnClickListener { - job?.cancel() // 用View的tag存储是否可点击的状态(默认可点击) if (tag as? Boolean ?: true) { tag = false // 标记为不可点击 diff --git a/app/src/main/java/com/sw/inbound/viewmodel/PurchaseOrderViewModel.kt b/app/src/main/java/com/sw/inbound/viewmodel/PurchaseOrderViewModel.kt index db28d4b..bc8e88c 100644 --- a/app/src/main/java/com/sw/inbound/viewmodel/PurchaseOrderViewModel.kt +++ b/app/src/main/java/com/sw/inbound/viewmodel/PurchaseOrderViewModel.kt @@ -21,8 +21,8 @@ class PurchaseOrderViewModel @Inject constructor( /** * 采购订单-供应商列表 */ - private val _supplierList = MutableStateFlow>(emptyList()) - val supplierList: StateFlow> = _supplierList + private val _supplierList = MutableStateFlow?>(emptyList()) + val supplierList: StateFlow?> = _supplierList private val _firstOperate = MutableStateFlow(true) val firstOperate:StateFlow = _firstOperate @@ -33,6 +33,14 @@ class PurchaseOrderViewModel @Inject constructor( /** * 获取采购订单-供应商列表 */ + fun getOrderListNew(pageNum: Int = 1, pageSize: Int = 5, block:(List?)-> Unit) { + launch { + val response = repository.getReceiveList(pageNum, pageSize) + block( + if (parseResponse(response)) response.result else null + ) + } + } fun getOrderList(pageNum: Int = 1, pageSize: Int = 5) { if (pageNum != 1) { launch { @@ -45,7 +53,7 @@ class PurchaseOrderViewModel @Inject constructor( response.result?.let { updateCanLoadMore(it.size >= pageSize) Timber.d("加载更多 canLoadMore =${it.size >= pageSize}") - _supplierList.value = _supplierList.value + it + _supplierList.value = _supplierList.value?.plus(it) } } updateFirstState(false) @@ -54,9 +62,9 @@ class PurchaseOrderViewModel @Inject constructor( launchWithLoading { val response = repository.getReceiveList(pageNum, pageSize) if (parseResponse(response)) { - response.result?.let { - _supplierList.value = it - } + _supplierList.value = response.result ?: emptyList() + } else { + _supplierList.value = null } updateFirstState(false) } diff --git a/app/src/main/res/layout/activity_purchase_order.xml b/app/src/main/res/layout/activity_purchase_order.xml index 6874341..6df1a48 100644 --- a/app/src/main/res/layout/activity_purchase_order.xml +++ b/app/src/main/res/layout/activity_purchase_order.xml @@ -34,8 +34,8 @@ android:textColor="#141428" android:textSize="24sp" android:textStyle="bold" - tools:text="冯厨子" - android:visibility="gone"/> + android:visibility="gone" + tools:text="冯厨子" /> + android:visibility="gone" + tools:ignore="ContentDescription" /> - + android:background="@drawable/bg_white_alpha40_radius6"> + tools:itemCount="8" + tools:listitem="@layout/list_item_purchase_order" /> - + + + + + + + @@ -18,168 +18,227 @@ android:gravity="center_horizontal" android:orientation="vertical"> + + + + + + + android:background="@color/divider" /> + + + + + android:baselineAligned="false" + android:gravity="center_vertical" + android:paddingVertical="0dp"> + android:textStyle="bold" /> + + android:textStyle="bold" /> - + + + + + + + tools:text="部分收货" /> + + + + + tools:text="冯厨子" /> - + + + + android:textSize="30sp" + android:textStyle="bold" /> diff --git a/app/src/main/res/mipmap-xhdpi/ic_empty_data.png b/app/src/main/res/mipmap-xhdpi/ic_empty_data.png new file mode 100644 index 0000000..eee4b80 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_empty_data.png differ