diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 28afd2a..5bc90d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -52,6 +52,7 @@ + diff --git a/app/src/main/java/com/sw/inbound/GlobalData.kt b/app/src/main/java/com/sw/inbound/GlobalData.kt index d2c800f..6eb08ca 100644 --- a/app/src/main/java/com/sw/inbound/GlobalData.kt +++ b/app/src/main/java/com/sw/inbound/GlobalData.kt @@ -43,7 +43,8 @@ object GlobalData { /** * 具体业务baseurl */ - var appBaseUrl: String = "http://192.168.1.201:14801" + //var appBaseUrl: String = "http://192.168.1.201:14801" + var appBaseUrl: String = "http://dev.yixiong-tech.com:8081" /** * 设备id diff --git a/app/src/main/java/com/sw/inbound/activity/FoodCollectionActivity.kt b/app/src/main/java/com/sw/inbound/activity/FoodCollectionActivity.kt new file mode 100644 index 0000000..8d23025 --- /dev/null +++ b/app/src/main/java/com/sw/inbound/activity/FoodCollectionActivity.kt @@ -0,0 +1,364 @@ +package com.sw.inbound.activity + +import android.annotation.SuppressLint +import android.graphics.Bitmap +import android.net.Uri +import android.os.Bundle +import android.widget.Toast +import androidx.activity.ComponentActivity +import androidx.activity.viewModels +import androidx.camera.view.PreviewView +import androidx.core.view.updateLayoutParams +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import com.sw.inbound.R +import com.sw.inbound.adapter.FoodCollectionAdapter +import com.sw.inbound.adapter.GoodsSearchAdapter +import com.sw.inbound.databinding.ActivityFoodCollectionBinding +import com.sw.inbound.databinding.LayoutCameraPreviewBinding +import com.sw.inbound.databinding.LayoutEmptySearchBinding +import com.sw.inbound.dialog.Loading +import com.sw.inbound.model.response.SearchGoodsInfo +import com.sw.inbound.objbox.Food +import com.sw.inbound.objbox.FoodCollectionBean +import com.sw.inbound.objbox.FoodModule +import com.sw.inbound.objbox.ObjectBox +import com.sw.inbound.utils.BitmapCropper +import com.sw.inbound.utils.BitmapSaver +import com.sw.inbound.utils.CameraUtils +import com.sw.inbound.utils.ImageUtil +import com.sw.inbound.utils.ext.addOnActionSearchListener +import com.sw.inbound.utils.ext.clickWithDebounce +import com.sw.inbound.utils.ext.dp +import com.sw.inbound.utils.ext.hideKeyboard +import com.sw.inbound.utils.ext.toast +import com.sw.inbound.viewmodel.ReceiptViewModel +import dagger.hilt.android.AndroidEntryPoint +import io.objectbox.Box +import io.objectbox.kotlin.boxFor +import kotlinx.coroutines.runBlocking +import timber.log.Timber + +@AndroidEntryPoint +class FoodCollectionActivity : ComponentActivity() { + + private val TAG = "FoodCollectionActivity" + private var selectedFoodName: String = "" + + private var box: Box? = null + private val collectList: MutableList = mutableListOf( + FoodCollectionBean(isShowCamera = true), + FoodCollectionBean(isShowCamera = true), + FoodCollectionBean(isShowCamera = true), + FoodCollectionBean(isShowCamera = true), + FoodCollectionBean(isShowCamera = true), + FoodCollectionBean(isShowCamera = true) + ) + private lateinit var binding: ActivityFoodCollectionBinding + private lateinit var previewView: PreviewView + + val viewModel: ReceiptViewModel by viewModels() + val PAGE_SIZE = 30 + private val cameraUtils: CameraUtils by lazy { + CameraUtils(this) + } + private val collectionAdapter: FoodCollectionAdapter by lazy { + FoodCollectionAdapter(collectList).apply { +// setOnItemClickListener { _, _, position -> +// if (collectList[position].isShowCamera) { +// takePhoto() +// } +// } + addOnItemChildClickListener(R.id.ivDelete) { _, _, position -> + collectList[position].let { + it.bitmap = null + it.isFinish = false + it.isShowCamera = true + } + collectionAdapter.notifyItemChanged(position) +// if (position == collectList.size - 1) { +// +// return@addOnItemChildClickListener +// } +// collectList.removeAt(position) +// adapter.notifyItemRemoved(position) +// adapter.notifyItemRangeChanged(position, collectList.size) + } + } + } + + override fun onResume() { + super.onResume() + cameraUtils.bind() + } + + override fun onPause() { + super.onPause() + cameraUtils.unbind() + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityFoodCollectionBinding.inflate(layoutInflater) + setContentView(binding.root) + cameraUtils.initCamera() + val previewBinding = + LayoutCameraPreviewBinding.inflate(layoutInflater, binding.flCameraPreview) + previewView = previewBinding.previewView.also { + it.updateLayoutParams { + width = 420.dp + height = 420.dp + } + } + cameraUtils.setPreviewController(previewView) + binding.btnBack.setOnClickListener { finish() } + binding.rvFoodCollection.let { + it.layoutManager = GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false) + it.adapter = collectionAdapter + } + + binding.ivGoodsSearch.setOnClickListener { searchGoods() } + binding.etGoodsInput.let { v -> + v.addOnActionSearchListener { + searchGoods() + } + } + + binding.btnSave.setOnClickListener { + if (clickIndex == -1) { + Toast.makeText(this, "请选择物品名称", Toast.LENGTH_SHORT).show() + return@setOnClickListener + } + val count = collectList.count {it.bitmap!=null} + if (count == 0) { + Toast.makeText(this, "请拍摄物品照片", Toast.LENGTH_SHORT).show() + return@setOnClickListener + } + vectorThread() + } + binding.btnTakePhoto.clickWithDebounce { + takePhoto() + } + binding.btnAddDefault.clickWithDebounce { + Thread{ + FoodModule.initDefFoodData(this) { + runOnUiThread { + toast("添加完成") + } + } + }.start() + } + binding.btnRemoveDefault.clickWithDebounce { + if (box == null) { + box = ObjectBox.boxStore.boxFor(Food::class) + } + val list = box?.all?.filter { it.foodIdx == FoodModule.DEFAULT_FOOD_INDEX } + if (list.isNullOrEmpty()) { + toast("不存在默认数据") + return@clickWithDebounce + } + box?.removeByIds(list!!.map { it.id }) + toast("移除完成") + } + binding.btnClearData.setOnClickListener { clearData() } + binding.rvSearch.let { + it.layoutManager = GridLayoutManager(this, 2, LinearLayoutManager.VERTICAL, false) + it.adapter = searchAdapter + } + binding.refreshLayout.let { + it.setEnableRefresh(true) + it.setEnableLoadMore(false) + it.setOnRefreshListener { + pageNo = 1 + searchGoods() + } + it.setOnLoadMoreListener { + searchGoods() + } + } + loadEmptyView() + } + + private var pageNo = 1 + private var clickIndex = -1 + + private val searchGoodsList: MutableList = mutableListOf() + private val searchAdapter by lazy { + GoodsSearchAdapter(searchGoodsList).apply { + isStateViewEnable = true + setOnItemClickListener { adapter, view, position -> + clickIndex = position + if (list[position].isSelected) { + return@setOnItemClickListener + } + list.forEach { item -> + item.isSelected = false + } + list[position].isSelected = true + notifyDataSetChanged() + } + } + } + + private fun finishRefresh() { + binding.refreshLayout.let { + if (pageNo == 1) { + it.finishRefresh(500) + } else { + it.finishLoadMore(500) + } + } + } + + @SuppressLint("NotifyDataSetChanged") + private fun takePhoto() { + val count = collectList.count { it.bitmap != null } + if (count == 6) { + toast("每次只允许保存6条数据") + return + } + cameraUtils.takePhoto(cameraCallback) + } + + @SuppressLint("NotifyDataSetChanged") + private fun clearData() { + collectList.forEach { + it.bitmap = null + it.isShowCamera = true + it.isFinish = false + } + collectionAdapter.notifyDataSetChanged() + + clickIndex = -1 + binding.etGoodsInput.setText("") + searchGoodsList.clear() + searchAdapter.notifyDataSetChanged() + loadEmptyView() + } + + private val cameraCallback:(Uri) -> Unit = { uri-> + val index = collectList.indexOfFirst { it.bitmap == null } + if (index == -1) { + toast("每次只允许保存6条数据") + rerurn@cameraCallback + } + ImageUtil.uriToBitmap(this, uri)?.let { bitmap -> + val cropBitmap = BitmapCropper.cropCenter( + original = bitmap, + targetWidth = 1000, targetHeight = 1300, + offsetX = 30, offsetY = 100 + ) + val file = BitmapSaver.saveToAppFilesDir( + cropBitmap, this, "IMG_CROP_${System.currentTimeMillis()}.jpg" + ) + Timber.d("${this.javaClass.simpleName}-searchFood-裁剪bitmap保存文件路径:${file?.absolutePath}") + + collectList[index].let { + it.bitmap = cropBitmap + it.isShowCamera = false + } + collectionAdapter.notifyItemChanged(index) +// if (collectList.size < 6) { +// collectList.add(collectList.size - 1, FoodCollectionBean(bitmap = cropBitmap)) +// } else { +// collectList[collectList.size - 1] = FoodCollectionBean(bitmap = cropBitmap) +// } +// adapter.notifyDataSetChanged() + } + } + + private fun vectorThread() { + Loading.show(this) + Thread { + collectList.filter { it.bitmap != null } + .forEachIndexed { index, it -> + image2VectorTask(it.bitmap!!, index) + } + runOnUiThread { + window.decorView.postDelayed({ + Loading.dismiss() + toast("保存成功") + }, 1000) + } + }.start() + } + + private fun image2VectorTask(bitmap: Bitmap, position: Int) { + if (box == null) { + box = ObjectBox.boxStore.boxFor(Food::class) + } + val imageVector = FoodModule.bitmap2FloatArray(bitmap) + box?.put(Food(name = searchGoodsList[clickIndex].goodsName, foodIdx = 0, foodVector = imageVector)) + collectList[position].let { + it.imageVector = imageVector + it.isFinish = true + } + runOnUiThread { + collectionAdapter.notifyItemChanged(position) + } + } + + @SuppressLint("NotifyDataSetChanged") + private fun searchGoods() { + val searchName = binding.etGoodsInput.text.toString().trim() + if (searchName.isBlank()) { + toast("请输入物品名称") + finishRefresh() + return + } + searchGoods( + searchName = searchName, + pageNo = pageNo + ) { records -> + finishRefresh() + binding.etGoodsInput.hideKeyboard() + if (pageNo == 1) { + searchGoodsList.clear() + } + searchGoodsList.addAll(records) + if (searchGoodsList.isEmpty()) { + loadEmptyView() + return@searchGoods + } + val enableLoadMore = records.size >= PAGE_SIZE + binding.refreshLayout.setEnableLoadMore(enableLoadMore) + if (enableLoadMore) { + pageNo++ + } + binding.rvSearch.layoutManager = + GridLayoutManager(this, 2, GridLayoutManager.VERTICAL, false) + searchAdapter.notifyDataSetChanged() + } + } + + private var emptyBinding: LayoutEmptySearchBinding? = null + private fun loadEmptyView() { + binding.rvSearch.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) + if (emptyBinding == null) { + emptyBinding = LayoutEmptySearchBinding.inflate(layoutInflater, binding.rvSearch, false) + } + emptyBinding?.root?.let { layout -> + layout.setOnClickListener { layout.hideKeyboard() } + searchAdapter.stateView = layout + } + } + fun searchGoods( + searchName: String, + pageNo: Int, + pageSize: Int = PAGE_SIZE, + callback: (List) -> Unit + ) { + runBlocking { + val records = viewModel.searchGoodsInfoList2( + goodsName = searchName, + pageNo = pageNo, + pageSize = pageSize + ) + runOnUiThread { + callback(records) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/sw/inbound/activity/GoodsListActivity.kt b/app/src/main/java/com/sw/inbound/activity/GoodsListActivity.kt index 4c4fff9..235efbf 100644 --- a/app/src/main/java/com/sw/inbound/activity/GoodsListActivity.kt +++ b/app/src/main/java/com/sw/inbound/activity/GoodsListActivity.kt @@ -114,12 +114,23 @@ abstract class GoodsListActivity : ComponentActivity() { dropdownPopup?.showAsDropDown(v) } binding.tvPurchaseNo.setOnClickListener { + isShowRecognizeDialog = false GoodsRecognizeDialog( context = this, list = mutableListOf() ) { GoodsSearchDialog(this).show() - }.show() + }.apply { + setOnDismissListener { + isShowRecognizeDialog = true + } + setOnShowListener { + isShowRecognizeDialog = false + } + if (isFinishing.not() && isDestroyed.not()) { + show() + } + } } binding.tvUserName.text = GlobalData.deviceId binding.tvUserName.gone() @@ -183,7 +194,7 @@ abstract class GoodsListActivity : ComponentActivity() { } } - private var isShowRecognizeDialog = true + var isShowRecognizeDialog = true private fun searchFood(uri: Uri) { ImageUtil.uriToBitmap(this, uri)?.let { bitmap -> val newBmp = BitmapCropper.cropCenter( @@ -214,7 +225,11 @@ abstract class GoodsListActivity : ComponentActivity() { } } - private fun handleGoodsResult(goodsList: List, file: File?, name: String) { + private fun handleGoodsResult( + goodsList: List, + file: File?, + name: String + ) { runOnUiThread { if (goodsRecognizeDialog?.isShowing == true) { isShowRecognizeDialog = false @@ -276,12 +291,18 @@ abstract class GoodsListActivity : ComponentActivity() { //isCameraReady = false } - fun Double?.plus2(value:Double?):Double { - return (this?:0.0) + (value?:0.0) + fun Double?.plus2(value: Double?): Double { + return (this ?: 0.0) + (value ?: 0.0) } fun addGoods(goods: GoodsInfo) { - val item = goodsList.firstOrNull {it.goodId == goods.goodId} + if (!isReceiptPage) { + goods.isSelected = true + goodsList.add(goods) + binding.rvGoodsList.adapter?.notifyItemInserted(goodsList.size - 1) + return + } + val item = goodsList.firstOrNull { it.goodId == goods.goodId } if (item == null) { goods.isSelected = true goodsList.add(goods) @@ -291,12 +312,12 @@ abstract class GoodsListActivity : ComponentActivity() { item.isSelected = true val finalNum = item.receivedNum.plus2(goods.receivedNum) val finalAmount = item.recUnitPriceTaxIn.plus2(goods.recUnitPriceTaxIn) - val finalPrice = if(finalAmount == 0.toDouble() || finalNum == 0.toDouble()) 0.toDouble() else finalAmount/finalNum + val finalPrice = + if (finalAmount == 0.toDouble() || finalNum == 0.toDouble()) 0.toDouble() else finalAmount / finalNum item.run { receivedNum = finalNum - receiveCountAll = finalAmount recUnitPriceTaxIn = goods.recUnitPriceTaxIn - receivePriceIn = finalPrice.toSafeDouble() + recPriceInItem = finalPrice.toSafeDouble() goodsWeight = goods.goodsWeight } binding.rvGoodsList.adapter?.notifyItemChanged(goodsList.indexOf(item)) @@ -376,20 +397,18 @@ abstract class GoodsListActivity : ComponentActivity() { toast("请选择仓库") return } - val submitData = goodsList.filter { it.isSelected }.also { - it.forEach { goodsInfo -> - goodsInfo.warehouseId = binding.tvWareHouse.tag.toString() - goodsInfo.warehouseName = binding.tvWareHouse.text.toString() - } + goodsList.forEach { goodsInfo -> + goodsInfo.warehouseId = binding.tvWareHouse.tag.toString() + goodsInfo.warehouseName = binding.tvWareHouse.text.toString() } - if (submitData.isEmpty()) { + if (goodsList.isEmpty()) { toast("请选择收货物品") return } val uploadInfo = UploadInfo( id = id, supplierId = supplierId, - receiveGoodsInfos = submitData + receiveGoodsInfos = goodsList ) Timber.tag("SelfProcurementActivity") .d("receiptSubmit确认收货提交数据:${uploadInfo.toJsonString()}") @@ -413,9 +432,9 @@ abstract class GoodsListActivity : ComponentActivity() { goodsId = it.goodId ?: "", goodsName = it.goodName, kcUnitId = it.kcUnitId, - goodsCount = it.receiveCount ?: 0.0, - goodsUnitPrice = it.recUnitPriceTaxIn ?: 0.0, - goodsPrice = it.recPriceExItem ?: 0.0, + goodsCount = it.goodsCount ?: 0.0, + goodsUnitPrice = it.goodsUnitPrice ?: 0.0, + goodsPrice = it.goodsPrice ?: 0.0, //goodPurId = it.goodsPurId, warehouseId = binding.tvWareHouse.tag.toString(), buyToInventoryValue = it.consumeValue ?: "" diff --git a/app/src/main/java/com/sw/inbound/activity/ReceiptActivity.kt b/app/src/main/java/com/sw/inbound/activity/ReceiptActivity.kt index 08db23b..83c7320 100644 --- a/app/src/main/java/com/sw/inbound/activity/ReceiptActivity.kt +++ b/app/src/main/java/com/sw/inbound/activity/ReceiptActivity.kt @@ -50,6 +50,9 @@ class ReceiptActivity : GoodsListActivity() { } binding.tvPurchaseNo.text = "采购单号:${detail.purCode}" val list = detail.receiveGoodsInfoList + list.forEach { goodsInfo -> + goodsInfo.recUnitPriceTaxIn2 = goodsInfo.recUnitPriceTaxIn + } goodsList.addAll(list) adapter.notifyDataSetChanged() val confirmOrderCount = list.count { it.isAdjusted } diff --git a/app/src/main/java/com/sw/inbound/adapter/FoodCollectionAdapter.kt b/app/src/main/java/com/sw/inbound/adapter/FoodCollectionAdapter.kt new file mode 100644 index 0000000..a49ea57 --- /dev/null +++ b/app/src/main/java/com/sw/inbound/adapter/FoodCollectionAdapter.kt @@ -0,0 +1,47 @@ +package com.sw.inbound.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import coil.load +import com.chad.library.adapter4.BaseQuickAdapter +import com.chad.library.adapter4.viewholder.QuickViewHolder +import com.sw.inbound.R +import com.sw.inbound.databinding.ListItemFoodCollectionBinding +import com.sw.inbound.objbox.FoodCollectionBean +import kotlin.let +import kotlin.run + +class FoodCollectionAdapter (var list: MutableList) : + BaseQuickAdapter(list) { + + inner class VH(var binding: ListItemFoodCollectionBinding) : QuickViewHolder(binding.root) + + override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH { + val inflater = LayoutInflater.from(context) + val binding = ListItemFoodCollectionBinding.inflate(inflater, parent, false) + return VH(binding) + } + + override fun onBindViewHolder(holder: VH, position: Int, item: FoodCollectionBean?) { + val binding = holder.binding + item?.let { + binding.ivFinish.visibility = if (it.isFinish) View.VISIBLE else View.GONE + binding.ivDelete.visibility = if (it.isShowCamera) View.GONE else View.VISIBLE + binding.imageView.run { + if (it.isShowCamera) { + scaleType = ImageView.ScaleType.CENTER + setImageResource(R.mipmap.ic_camera256) + } else { + scaleType = ImageView.ScaleType.FIT_CENTER + //setImageURI(it.imageUri) + //load(it.bitmap) + setImageBitmap(it.bitmap!!) + } + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/sw/inbound/adapter/ReceiptGoodsAdapter.kt b/app/src/main/java/com/sw/inbound/adapter/ReceiptGoodsAdapter.kt index 9a2195f..8ba1f37 100644 --- a/app/src/main/java/com/sw/inbound/adapter/ReceiptGoodsAdapter.kt +++ b/app/src/main/java/com/sw/inbound/adapter/ReceiptGoodsAdapter.kt @@ -12,7 +12,6 @@ import com.chad.library.adapter4.viewholder.QuickViewHolder import com.sw.inbound.R import com.sw.inbound.databinding.ListItemReceiptGoodsBinding import com.sw.inbound.ext.toSafeDouble -import com.sw.inbound.model.bean.ReceiptGoodsInfo import com.sw.inbound.model.response.GoodsInfo import com.sw.inbound.utils.ext.dp import com.sw.inbound.utils.ext.gone @@ -51,7 +50,7 @@ class ReceiptGoodsAdapter(var list: MutableList) : tvGoodsName.text = item.goodName.ifNullOrBlank("-") tvProcurementUnit.text = item.unitName.ifNullOrBlank("-") tvProcurementCount.text = item.receiveCount.ifNullOrZero("-") - tvProcurementPrice.text = item.recUnitPriceTaxIn.toSafeDouble(2).ifNullOrZero("-") + tvProcurementPrice.text = item.recUnitPriceTaxIn2.toSafeDouble(2).ifNullOrZero("-") tvProcurementAmount.text = item.recPriceExItem.toSafeDouble(2).ifNullOrZero("-") tvReceiptCount.text = item.receivedNum.toSafeDouble(2).ifNullOrZero("-") tvGoodsWeight.text = item.goodsWeight?.toDouble().toSafeDouble(2).ifNullOrZero("-") diff --git a/app/src/main/java/com/sw/inbound/adapter/SelfProcurementAdapter.kt b/app/src/main/java/com/sw/inbound/adapter/SelfProcurementAdapter.kt index 5522ae1..925b790 100644 --- a/app/src/main/java/com/sw/inbound/adapter/SelfProcurementAdapter.kt +++ b/app/src/main/java/com/sw/inbound/adapter/SelfProcurementAdapter.kt @@ -10,10 +10,12 @@ import androidx.recyclerview.widget.RecyclerView import com.chad.library.adapter4.BaseQuickAdapter import com.chad.library.adapter4.viewholder.QuickViewHolder import com.sw.inbound.databinding.ListItemSelfProcurementBinding +import com.sw.inbound.ext.toSafeDouble import com.sw.inbound.model.response.GoodsInfo import com.sw.inbound.utils.ext.dp import com.sw.inbound.utils.ext.gone import com.sw.inbound.utils.ext.ifNullOrBlank +import com.sw.inbound.utils.ext.ifNullOrZero import com.sw.inbound.utils.ext.setShapeDrawable import com.sw.inbound.utils.ext.visible @@ -46,9 +48,9 @@ class SelfProcurementAdapter(var list: MutableList) : ) tvGoodsName.text = item.goodName.ifNullOrBlank("-") tvProcurementUnit.text = item.unitName.ifNullOrBlank("-") - tvProcurementCount.text = item.receiveCountStr.ifNullOrBlank("-") - tvProcurementPrice.text = item.recUnitPriceTaxInStr.ifNullOrBlank("-") - tvProcurementAmount.text = item.recPriceExItemStr.ifNullOrBlank("-") + tvProcurementCount.text = item.goodsCount.ifNullOrZero("-") + tvProcurementPrice.text = item.goodsUnitPrice.toSafeDouble(2).ifNullOrZero("-") + tvProcurementAmount.text = item.goodsPrice.toSafeDouble(2).ifNullOrZero("-") tvState.gone() ivState.visible() diff --git a/app/src/main/java/com/sw/inbound/dialog/GoodsRecognizeDialog.kt b/app/src/main/java/com/sw/inbound/dialog/GoodsRecognizeDialog.kt index 56378e8..07bda60 100644 --- a/app/src/main/java/com/sw/inbound/dialog/GoodsRecognizeDialog.kt +++ b/app/src/main/java/com/sw/inbound/dialog/GoodsRecognizeDialog.kt @@ -75,6 +75,7 @@ class GoodsRecognizeDialog( } binding.btnAgainRecognize.setOnClickListener { dismiss() + activity?.isShowRecognizeDialog = true activity?.recognizeFood() } } diff --git a/app/src/main/java/com/sw/inbound/dialog/GoodsStoreDialog.kt b/app/src/main/java/com/sw/inbound/dialog/GoodsStoreDialog.kt index 53eec23..c3b3636 100644 --- a/app/src/main/java/com/sw/inbound/dialog/GoodsStoreDialog.kt +++ b/app/src/main/java/com/sw/inbound/dialog/GoodsStoreDialog.kt @@ -185,6 +185,13 @@ class GoodsStoreDialog( context.toast("请录入入库单价") return } + if (realWeight <= 0) { + context.toast("物品重量需大于0") + return + } + val count = countText.toDoubleOrNull() + val price = priceText.toDoubleOrNull() + val totalPrice = amountText.toDoubleOrNull() confirmBlock( GoodsInfo( goodId = goods.id, @@ -193,11 +200,15 @@ class GoodsStoreDialog( //goodsPurId = binding.tvProcurementUnit.tag.toString(), kcUnitId = binding.tvProcurementUnit.tag.toString(), unitName = unit, - receivedNum = countText.toDoubleOrNull(), - recUnitPriceTaxIn = priceText.toDoubleOrNull(), - receivePriceIn = amountText.toDoubleOrNull(), + receivedNum = count, + recUnitPriceTaxIn = price, + recPriceInItem = totalPrice, goodsWeight = realWeight.toBigDecimal(), - isLocalGoods = true + isLocalGoods = true, + + goodsCount = count, + goodsUnitPrice = price, + goodsPrice = totalPrice, ) ) dismiss() diff --git a/app/src/main/java/com/sw/inbound/dialog/LoadingDialog.kt b/app/src/main/java/com/sw/inbound/dialog/LoadingDialog.kt new file mode 100644 index 0000000..444ca18 --- /dev/null +++ b/app/src/main/java/com/sw/inbound/dialog/LoadingDialog.kt @@ -0,0 +1,148 @@ +package com.sw.inbound.dialog + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.view.LayoutInflater +import android.view.WindowManager +import androidx.core.graphics.drawable.toDrawable +import com.sw.inbound.R +import com.sw.inbound.databinding.DialogLoadingBinding + +object Loading { + + private var dialog: LoadingDialog? = null + + fun show(context: Context) { + try { + if (dialog?.isShowing == true) { + dialog?.dismiss() + } + + if (dialog == null) { + dialog = LoadingDialog(context) + } + dialog?.show() + } catch (e: Exception) { + e.printStackTrace() + } + } + + fun dismiss() { + try { + dialog?.let { + if (it.isShowing) { + it.dismiss() + } + } + dialog = null + } catch (e: Exception) { + e.printStackTrace() + } + } + +} + +class LoadingDialog( + context: Context, + message: String = "加载中……", + private var onDismiss: () -> Unit = {} +) : Dialog(context, R.style.LoadingDialog) { + init { + val binding = DialogLoadingBinding.inflate(LayoutInflater.from(context)) + binding.tvMessage.text = message + setContentView(binding.root) + setCancelable(true) + window?.run { + setBackgroundDrawable(Color.TRANSPARENT.toDrawable()) + setFlags( + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + ); + } + setOnDismissListener { + onDismiss() + } + } +} + +//class LoadingDialog3( +// private val activity: Activity, +// private val message: String = "加载中……", +// private val onDismiss: () -> Unit = {} +//) : DialogFragment() { +// +// override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { +// return SafeDialog( +// activity = activity, +// themeResId = R.style.ToastDialogTheme, +// ).apply { +// val binding = DialogLoadingBinding.inflate(LayoutInflater.from(context)) +// binding.tvMessage.text = message +// setContentView(binding.root) +// setCancelable(true) +// window?.run { +// setBackgroundDrawable(Color.TRANSPARENT.toDrawable()) +// setFlags( +// WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, +// WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE +// ); +// } +// setOnDismissListener { +// onDismiss() +// } +// } +// } +// +// override fun dismiss() { +// super.dismiss() +// } +// +// override fun show(manager: FragmentManager, tag: String?) { +// runCatching { +// super.show(manager, tag) +// Handler(Looper.getMainLooper()).postDelayed({ +// super.dismiss() +// }, 800) +// }.onFailure { +// it.printStackTrace() +// } +// } +// +//} + +//class LoadingDialog( +// private val activity: Activity, +// private val message: String = "加载中……", +// private val onDismiss: () -> Unit = {} +//) : SafeDialog( +// activity = activity, +// themeResId = R.style.ToastDialogTheme, +//) { +// +// override fun onCreate(savedInstanceState: Bundle?) { +// super.onCreate(savedInstanceState) +// val binding = DialogLoadingBinding.inflate(LayoutInflater.from(context)) +// binding.tvMessage.text = message +// setContentView(binding.root) +// setCancelable(true) +// window?.run { +// setBackgroundDrawable(Color.TRANSPARENT.toDrawable()) +// setFlags( +// WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, +// WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE +// ); +// } +// setOnDismissListener { +// onDismiss() +// } +// } +// +// fun show(manager: FragmentManager, tag: String?) { +// show() +// Handler(Looper.getMainLooper()).postDelayed({ +// super.dismiss() +// }, 800) +// } +// +//} diff --git a/app/src/main/java/com/sw/inbound/model/bean/DataBean.kt b/app/src/main/java/com/sw/inbound/model/bean/DataBean.kt deleted file mode 100644 index a462ee6..0000000 --- a/app/src/main/java/com/sw/inbound/model/bean/DataBean.kt +++ /dev/null @@ -1,48 +0,0 @@ -package com.sw.inbound.model.bean - -data class ReceiptGoodsInfo( - var goodsId: String? = "", - var goodsName: String? = "", - var procurementUnit: String? = "", - var procurementCount: Int? = 0, - var procurementPrice: Double? = 0.0, - var procurementAmount: Double? = 0.0, - var receiptCount: Int? = 0, - var goodsWeight: Int? = 0, - var goodsState: String? = "", - var isSelected: Boolean = false, - var isLocalGoods: Boolean = false -) - -//data class DropdownInfo( -// var id: String, -// var name: String -//) - -//data class RecognizeResult( -// var name: String? = null, -// var image: String? = null, -// var isSelected: Boolean = false -//) - -//data class GoodsSearchInfo( -// var id: String? = null, -// var name: String? = null, -// var isSelected: Boolean = false -//) - -data class OperateBean( - var obj: Any? = null, - var typeList: MutableList = mutableListOf(), - var isSelected: Boolean = false, - var isLocalGoods: Boolean = false, - var isReceiptPage: Boolean = true -) - -data class OperateType( - var value: String = "", - var width: Int = 0, - var textColor: String = "#FF999999", - var isBoldFont: Boolean = false, - var isShowIcon: Boolean = false -) \ No newline at end of file diff --git a/app/src/main/java/com/sw/inbound/model/response/GoodsInfo.kt b/app/src/main/java/com/sw/inbound/model/response/GoodsInfo.kt index ccc9e69..7fd91ef 100644 --- a/app/src/main/java/com/sw/inbound/model/response/GoodsInfo.kt +++ b/app/src/main/java/com/sw/inbound/model/response/GoodsInfo.kt @@ -29,6 +29,7 @@ data class GoodsInfo( * 单价 */ var recUnitPriceTaxIn: Double? = null, + var recUnitPriceTaxIn2: Double? = null, // 单价 界面显示 var recUnitPriceTaxInTemp: String = "", @@ -103,7 +104,10 @@ data class GoodsInfo( var isLocalGoods: Boolean = false, var kcUnitId: String?="", - var receivePriceIn:Double?=null + var recPriceInItem:Double?=null, + var goodsCount:Double?=null, + var goodsUnitPrice:Double?=null, + var goodsPrice:Double?=null //-------------------------------------------------------- ) : Parcelable, BaseBean() { diff --git a/app/src/main/java/com/sw/inbound/network/interceptor/RequestInterceptor.kt b/app/src/main/java/com/sw/inbound/network/interceptor/RequestInterceptor.kt index b9f46dc..53b2c1a 100644 --- a/app/src/main/java/com/sw/inbound/network/interceptor/RequestInterceptor.kt +++ b/app/src/main/java/com/sw/inbound/network/interceptor/RequestInterceptor.kt @@ -19,6 +19,7 @@ class RequestInterceptor : Interceptor { .header("deviceId", GlobalData.deviceId) .header("X-DEVICE-CODE", GlobalData.deviceId) .header("x-access-token", GlobalData.appToken) + .header("authorization", "57ee87183f2a4fa59683ec9ef41c8f5d") // .header("Authorization", "Bearer ${getToken()}") // .header("x-access-token", getToken()) diff --git a/app/src/main/java/com/sw/inbound/objbox/DataBean.kt b/app/src/main/java/com/sw/inbound/objbox/DataBean.kt index 87443eb..ff03ab1 100644 --- a/app/src/main/java/com/sw/inbound/objbox/DataBean.kt +++ b/app/src/main/java/com/sw/inbound/objbox/DataBean.kt @@ -16,3 +16,50 @@ data class FoodCollectionBean( var isShowCamera: Boolean = false, var isFinish:Boolean = false ) + +data class ReceiptGoodsInfo( + var goodsId: String? = "", + var goodsName: String? = "", + var procurementUnit: String? = "", + var procurementCount: Int? = 0, + var procurementPrice: Double? = 0.0, + var procurementAmount: Double? = 0.0, + var receiptCount: Int? = 0, + var goodsWeight: Int? = 0, + var goodsState: String? = "", + var isSelected: Boolean = false, + var isLocalGoods: Boolean = false +) + +//data class DropdownInfo( +// var id: String, +// var name: String +//) + +//data class RecognizeResult( +// var name: String? = null, +// var image: String? = null, +// var isSelected: Boolean = false +//) + +//data class GoodsSearchInfo( +// var id: String? = null, +// var name: String? = null, +// var isSelected: Boolean = false +//) + +data class OperateBean( + var obj: Any? = null, + var typeList: MutableList = mutableListOf(), + var isSelected: Boolean = false, + var isLocalGoods: Boolean = false, + var isReceiptPage: Boolean = true +) + +data class OperateType( + var value: String = "", + var width: Int = 0, + var textColor: String = "#FF999999", + var isBoldFont: Boolean = false, + var isShowIcon: Boolean = false +) diff --git a/app/src/main/java/com/sw/inbound/objbox/FoodModule.kt b/app/src/main/java/com/sw/inbound/objbox/FoodModule.kt index c208d53..489da9f 100644 --- a/app/src/main/java/com/sw/inbound/objbox/FoodModule.kt +++ b/app/src/main/java/com/sw/inbound/objbox/FoodModule.kt @@ -28,17 +28,18 @@ object FoodModule { private lateinit var classInfo: FoodClassInfo val NO_MEAN_RGB = floatArrayOf(0.0f, 0.0f, 0.0f) val NO_STD_RGB = floatArrayOf(1.0f, 1.0f, 1.0f) + val DEFAULT_FOOD_INDEX = -1 fun init(context: Context) { Thread { module_mobile = Module.load(copyAssetToCache(context, "best_embedding_model_mobile.pt")) box = ObjectBox.boxStore.boxFor(Food::class) - if (box.all.isNotEmpty()) { - box.removeAll() - } - if (box.all.isEmpty()) { - initFoodData(context) - } + //if (box.all.isNotEmpty()) { + // box.removeAll() + //} + //if (box.all.isEmpty()) { + // initDefFoodData(context) + //} }.start() } @@ -100,10 +101,10 @@ object FoodModule { } - private fun initFoodData(context: Context) { - if (box.all.isNotEmpty()) { - return - } + fun initDefFoodData(context: Context, action:()-> Unit={}) { + //if (box.all.isNotEmpty()) { + // return + //} val embeddingsJson = AssetsTool.readAssetsFile(context, "data/embeddings.json") val labelsJson = AssetsTool.readAssetsFile(context, "data/labels.json") val classInfoJson = AssetsTool.readAssetsFile(context, "data/class_info.json") @@ -119,8 +120,9 @@ object FoodModule { val classIdx = labelsList[index] val foodName = foodMap["$classIdx"] val array = floatList.toFloatArray() - box.put(Food(name = foodName, foodVector = array, foodIdx = index)) + box.put(Food(name = foodName, foodVector = array, foodIdx = DEFAULT_FOOD_INDEX)) } + action() } 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 630dbe9..da4dc75 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 @@ -151,17 +151,17 @@ fun PurchaseOrderScreen( contentPadding = PaddingValues(16.dp), horizontalArrangement = Arrangement.spacedBy(30.dp) ) { - items(items = products, key = { it!!.id?:"" }) { - PurchaseOrderItem(it!!) { - navController.navigate( - Screen.ReceiptProduct.createRoute( - it.id, - it.supplierId - ) - ) + items(items = products, key = { it!!.id?:"" }) { product -> + PurchaseOrderItem(product!!) { +// navController.navigate( +// Screen.ReceiptProduct.createRoute( +// it.id, +// it.supplierId +// ) +// ) navController.context.startActivity { - putExtra(GoodsListActivity.ID,it!!.id) - putExtra(GoodsListActivity.SUPPLIER_ID,it.supplierId) + putExtra(GoodsListActivity.ID,product!!.id) + putExtra(GoodsListActivity.SUPPLIER_ID,product.supplierId) putExtra(GoodsListActivity.IS_RECEIPT_PAGE,true) putExtra(GoodsListActivity.IS_NEW_RECEIPT,false) } diff --git a/app/src/main/java/com/sw/inbound/ui/weight/TopTitleBar.kt b/app/src/main/java/com/sw/inbound/ui/weight/TopTitleBar.kt index 92bd45b..1994788 100644 --- a/app/src/main/java/com/sw/inbound/ui/weight/TopTitleBar.kt +++ b/app/src/main/java/com/sw/inbound/ui/weight/TopTitleBar.kt @@ -1,5 +1,6 @@ package com.sw.inbound.ui.weight +import android.content.Intent import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image import androidx.compose.foundation.clickable @@ -12,6 +13,8 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -28,11 +31,14 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.sw.inbound.MyApp import com.sw.inbound.R +import com.sw.inbound.activity.FoodCollectionActivity import com.sw.inbound.ext.medium import com.sw.inbound.model.response.User import com.sw.inbound.ui.theme.AppTypography import com.sw.inbound.utils.DateTimeUtils +import com.sw.inbound.utils.ext.startActivity import kotlinx.coroutines.delay @@ -77,9 +83,20 @@ fun TopTitleBar( color = colorResource(R.color.title), fontSize = 36.sp ), - modifier = Modifier.weight(1f) + modifier = Modifier.wrapContentSize() + .clickable(onClick = { + MyApp.instance?.run { + startActivity( + Intent(this, FoodCollectionActivity::class.java).apply{ + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + ) + } + }) ) + Spacer(modifier = Modifier.weight(1f)) + if (user != null) { Row( verticalAlignment = Alignment.CenterVertically, diff --git a/app/src/main/java/com/sw/inbound/utils/CameraUtils.kt b/app/src/main/java/com/sw/inbound/utils/CameraUtils.kt index fe43eb0..9f823d4 100644 --- a/app/src/main/java/com/sw/inbound/utils/CameraUtils.kt +++ b/app/src/main/java/com/sw/inbound/utils/CameraUtils.kt @@ -1,17 +1,18 @@ package com.sw.inbound.utils import android.net.Uri +import androidx.activity.ComponentActivity import androidx.camera.core.CameraSelector import androidx.camera.view.CameraController import androidx.camera.view.LifecycleCameraController import androidx.camera.view.PreviewView -import com.sw.inbound.activity.GoodsListActivity -class CameraUtils(private var activity: GoodsListActivity) { +class CameraUtils(private var activity: ComponentActivity) { private var cameraController: LifecycleCameraController? = null private var photoCaptureHelper: PhotoCaptureHelper? = null -// private var isCameraReady = false + + // private var isCameraReady = false fun takePhoto(callback: (Uri) -> Unit) { cameraController?.let { if (photoCaptureHelper == null) { @@ -69,6 +70,7 @@ class CameraUtils(private var activity: GoodsListActivity) { fun bind() { cameraController?.bindToLifecycle(activity) } + fun unbind() { cameraController?.unbind() } diff --git a/app/src/main/java/com/sw/inbound/viewmodel/ReceiptViewModel.kt b/app/src/main/java/com/sw/inbound/viewmodel/ReceiptViewModel.kt index 00a008f..57c8a53 100644 --- a/app/src/main/java/com/sw/inbound/viewmodel/ReceiptViewModel.kt +++ b/app/src/main/java/com/sw/inbound/viewmodel/ReceiptViewModel.kt @@ -1,31 +1,14 @@ package com.sw.inbound.viewmodel import android.net.Uri -import android.util.Log -import androidx.lifecycle.viewModelScope -import com.sw.inbound.ext.toFormattedString -import com.sw.inbound.ext.toSafeBigDecimal -import com.sw.inbound.ext.toSafeDouble -import com.sw.inbound.ext.toSafeFloat import com.sw.inbound.model.request.GoodsAddParam import com.sw.inbound.model.request.PurchaseWarehouseParam import com.sw.inbound.model.request.UploadInfo -import com.sw.inbound.model.response.DictType -import com.sw.inbound.model.response.GoodsInfo import com.sw.inbound.model.response.PurchaseInfo import com.sw.inbound.model.response.SearchGoodsInfo import com.sw.inbound.repository.RemoteRepository -import com.sw.inbound.utils.ToastUtils import com.sw.inbound.utils.ext.toJsonString import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.flow.update -import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject @@ -37,72 +20,72 @@ class ReceiptViewModel @Inject constructor( private val repository: RemoteRepository ) : BaseViewModel(repository) { // 调整状态 - private val _adjustState = MutableStateFlow(true) - val adjustState: StateFlow = _adjustState +// private val _adjustState = MutableStateFlow(true) +// val adjustState: StateFlow = _adjustState +// +// private val _showReceiptDialog = MutableStateFlow(false) +// val showReceiptDialog: StateFlow = _showReceiptDialog +// +// // 当前要收货的供应商 +// private val _currentPurchaseInfo = MutableStateFlow(null) +// val currentPurchaseInfo: StateFlow = _currentPurchaseInfo +// +// private val _orders = MutableStateFlow>(emptyList()) +// val orders: StateFlow> = _orders.asStateFlow() - private val _showReceiptDialog = MutableStateFlow(false) - val showReceiptDialog: StateFlow = _showReceiptDialog +// fun initOrders() { +// _orders.value = _currentPurchaseInfo.value?.receiveGoodsInfoList ?: emptyList() +// } +// +// // 已调整列表 +// val adjustedOrders: StateFlow> = _orders +// .map { orders -> orders.filter { it.isAdjusted } } +// .stateIn(viewModelScope, SharingStarted.Lazily, emptyList()) +// +// // 未调整列表 +// val unadjustedOrders: StateFlow> = _orders +// .map { orders -> orders.filter { !it.isAdjusted } } +// .stateIn(viewModelScope, SharingStarted.Lazily, emptyList()) +// +// // 选中的商品 +// private val _selectedItem = MutableStateFlow(null) +// val selectedItem: StateFlow = _selectedItem +// +// // 收货请求结果 +// private val _receiptResult = MutableStateFlow(false) +// val receiptResult: StateFlow = _receiptResult +// +// // 物品数量 是否由用户输入 +// private val _countUserInput = MutableStateFlow(false) +// private val _priceUserInput = MutableStateFlow(false) +// private val _amountUserInput = MutableStateFlow(false) - // 当前要收货的供应商 - private val _currentPurchaseInfo = MutableStateFlow(null) - val currentPurchaseInfo: StateFlow = _currentPurchaseInfo - - private val _orders = MutableStateFlow>(emptyList()) - val orders: StateFlow> = _orders.asStateFlow() - - fun initOrders() { - _orders.value = _currentPurchaseInfo.value?.receiveGoodsInfoList ?: emptyList() - } - - // 已调整列表 - val adjustedOrders: StateFlow> = _orders - .map { orders -> orders.filter { it.isAdjusted } } - .stateIn(viewModelScope, SharingStarted.Lazily, emptyList()) - - // 未调整列表 - val unadjustedOrders: StateFlow> = _orders - .map { orders -> orders.filter { !it.isAdjusted } } - .stateIn(viewModelScope, SharingStarted.Lazily, emptyList()) - - // 选中的商品 - private val _selectedItem = MutableStateFlow(null) - val selectedItem: StateFlow = _selectedItem - - // 收货请求结果 - private val _receiptResult = MutableStateFlow(false) - val receiptResult: StateFlow = _receiptResult - - // 物品数量 是否由用户输入 - private val _countUserInput = MutableStateFlow(false) - private val _priceUserInput = MutableStateFlow(false) - private val _amountUserInput = MutableStateFlow(false) - - /** - * 更新调整状态 - * @param isAdjustState true 已调整 false 未调整 - */ - fun updateAdjustState(isAdjustState: Boolean) { - _adjustState.value = isAdjustState - } - - fun StateFlow>.getValidOrders(): List { - return this.value.filter { it.goodId != null } - } - - /** - * 更新收货提示弹窗 - */ - fun updateReceiptDialog(showDialog: Boolean) { - if (_orders.getValidOrders().isEmpty()) { - ToastUtils.showToast("订单为空或包含异常数据") - return - } -// if (!unadjustedOrders.value.isEmpty()) { -// ToastUtils.showToast("请先确认物品信息") +// /** +// * 更新调整状态 +// * @param isAdjustState true 已调整 false 未调整 +// */ +// fun updateAdjustState(isAdjustState: Boolean) { +// _adjustState.value = isAdjustState +// } +// +// fun StateFlow>.getValidOrders(): List { +// return this.value.filter { it.goodId != null } +// } +// +// /** +// * 更新收货提示弹窗 +// */ +// fun updateReceiptDialog(showDialog: Boolean) { +// if (_orders.getValidOrders().isEmpty()) { +// ToastUtils.showToast("订单为空或包含异常数据") // return // } - _showReceiptDialog.value = showDialog - } +//// if (!unadjustedOrders.value.isEmpty()) { +//// ToastUtils.showToast("请先确认物品信息") +//// return +//// } +// _showReceiptDialog.value = showDialog +// } // fun updateSelectedItemWithSwitch(purchaseOrder: GoodsInfo?) { // viewModelScope.launch { @@ -159,48 +142,48 @@ class ReceiptViewModel @Inject constructor( val response = repository.getReceiveDetail(id) if (parseResponse(response)) { action(response.result) - _currentPurchaseInfo.value = response.result - initOrders() +// _currentPurchaseInfo.value = response.result +// initOrders() } } } - /** - * 更新当前供应商信息 - */ - fun updateCurrentPurchaseInfo(purchaseInfo: PurchaseInfo?) { - _currentPurchaseInfo.value = purchaseInfo - } - - // 添加订单 - fun addPurchaseItem(purchaseOrder: GoodsInfo) { - _orders.update { currentList -> - // 当已经添加过则忽略 - if (currentList.any { it.goodId == purchaseOrder.goodId }) { - currentList - } else { - currentList + purchaseOrder - } - } - } - - // 更新订单 - fun updatePurchaseItem(purchaseOrder: GoodsInfo) { - _orders.update { currentList -> - currentList.map { order -> - if (order.id == purchaseOrder.id) purchaseOrder else order - } - } - } - - /** - * 有异常的订单数量 - */ - fun hasWrongCount(): Boolean { - return _orders.value.any { - it.receiveCount != it.receivedNum - } - } +// /** +// * 更新当前供应商信息 +// */ +// fun updateCurrentPurchaseInfo(purchaseInfo: PurchaseInfo?) { +// _currentPurchaseInfo.value = purchaseInfo +// } +// +// // 添加订单 +// fun addPurchaseItem(purchaseOrder: GoodsInfo) { +// _orders.update { currentList -> +// // 当已经添加过则忽略 +// if (currentList.any { it.goodId == purchaseOrder.goodId }) { +// currentList +// } else { +// currentList + purchaseOrder +// } +// } +// } +// +// // 更新订单 +// fun updatePurchaseItem(purchaseOrder: GoodsInfo) { +// _orders.update { currentList -> +// currentList.map { order -> +// if (order.id == purchaseOrder.id) purchaseOrder else order +// } +// } +// } +// +// /** +// * 有异常的订单数量 +// */ +// fun hasWrongCount(): Boolean { +// return _orders.value.any { +// it.receiveCount != it.receivedNum +// } +// } /** * 更新所有商品仓库 @@ -223,31 +206,31 @@ class ReceiptViewModel @Inject constructor( // } // } - // 清空列表 - fun clearPurchaseOrders() { - _orders.value = emptyList() - } - - /** - * 更新数量输入状态 - */ - fun updateCountInputState(boolean: Boolean) { - _countUserInput.value = boolean - } - - /** - * 更新单价输入状态 - */ - fun updatePriceInputState(boolean: Boolean) { - _priceUserInput.value = boolean - } - - /** - * 更新金额输入状态 - */ - fun updateAmountInputState(boolean: Boolean) { - _amountUserInput.value = boolean - } +// // 清空列表 +// fun clearPurchaseOrders() { +// _orders.value = emptyList() +// } +// +// /** +// * 更新数量输入状态 +// */ +// fun updateCountInputState(boolean: Boolean) { +// _countUserInput.value = boolean +// } +// +// /** +// * 更新单价输入状态 +// */ +// fun updatePriceInputState(boolean: Boolean) { +// _priceUserInput.value = boolean +// } +// +// /** +// * 更新金额输入状态 +// */ +// fun updateAmountInputState(boolean: Boolean) { +// _amountUserInput.value = boolean +// } //private var weightCallback: ((Int) -> Unit)? = null //fun readWeight(callback: (Int) -> Unit) { @@ -318,25 +301,25 @@ class ReceiptViewModel @Inject constructor( // } } - fun partialReceipt(uploadInfo: UploadInfo) { - launchWithLoading { - val response = repository.partialReceipt(uploadInfo) - if (parseResponse(response)) { - ToastUtils.showToast("部分收货成功") - _receiptResult.value = true - } - } - } - - fun confirmReceipt(uploadInfo: UploadInfo) { - launchWithLoading { - val response = repository.confirmReceipt(uploadInfo) - if (parseResponse(response)) { - ToastUtils.showToast("收货成功") - _receiptResult.value = true - } - } - } +// fun partialReceipt(uploadInfo: UploadInfo) { +// launchWithLoading { +// val response = repository.partialReceipt(uploadInfo) +// if (parseResponse(response)) { +// ToastUtils.showToast("部分收货成功") +// _receiptResult.value = true +// } +// } +// } +// +// fun confirmReceipt(uploadInfo: UploadInfo) { +// launchWithLoading { +// val response = repository.confirmReceipt(uploadInfo) +// if (parseResponse(response)) { +// ToastUtils.showToast("收货成功") +// _receiptResult.value = true +// } +// } +// } fun confirmReceipt(uploadInfo: UploadInfo, callback: (Boolean) -> Unit) { launchWithLoading { diff --git a/app/src/main/res/drawable/bg_gray.xml b/app/src/main/res/drawable/bg_gray.xml new file mode 100644 index 0000000..e5df3c9 --- /dev/null +++ b/app/src/main/res/drawable/bg_gray.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_dialog.xml b/app/src/main/res/drawable/shape_dialog.xml new file mode 100644 index 0000000..c7e4546 --- /dev/null +++ b/app/src/main/res/drawable/shape_dialog.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_food_collection.xml b/app/src/main/res/layout/activity_food_collection.xml new file mode 100644 index 0000000..8ec622c --- /dev/null +++ b/app/src/main/res/layout/activity_food_collection.xml @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_loading.xml b/app/src/main/res/layout/dialog_loading.xml new file mode 100644 index 0000000..67410fa --- /dev/null +++ b/app/src/main/res/layout/dialog_loading.xml @@ -0,0 +1,28 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/list_item_food_collection.xml b/app/src/main/res/layout/list_item_food_collection.xml new file mode 100644 index 0000000..2567322 --- /dev/null +++ b/app/src/main/res/layout/list_item_food_collection.xml @@ -0,0 +1,32 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/list_item_goods_search.xml b/app/src/main/res/layout/list_item_goods_search.xml index 75378d8..34e46b5 100644 --- a/app/src/main/res/layout/list_item_goods_search.xml +++ b/app/src/main/res/layout/list_item_goods_search.xml @@ -16,6 +16,7 @@ android:textColor="#ff666666" android:textSize="30sp" android:maxLines="1" + android:layout_marginHorizontal="10dp" android:ellipsize="end" android:textStyle="bold" /> \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/ic_back.png b/app/src/main/res/mipmap-xxhdpi/ic_back.png new file mode 100644 index 0000000..d7692eb Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_back.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_camera256.png b/app/src/main/res/mipmap-xxhdpi/ic_camera256.png new file mode 100644 index 0000000..cc72a98 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_camera256.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_delete_red.png b/app/src/main/res/mipmap-xxhdpi/ic_delete_red.png new file mode 100644 index 0000000..ff00640 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_delete_red.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_finish.png b/app/src/main/res/mipmap-xxhdpi/ic_finish.png new file mode 100644 index 0000000..7f433bf Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_finish.png differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 975a495..bb7bf82 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -17,5 +17,6 @@ #D9E3F9 #141428 #96A0AA + #F6F6F6 \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 24709a0..9814017 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,9 +1,10 @@ - + + + \ No newline at end of file