diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 0076071abaeb1bc1649fe08b5ad9ca4e6e453a86..3981ea9f2154bed72e7d8ae54c1eb34dc7c10a52 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -4,7 +4,7 @@ <component name="GradleSettings"> <option name="linkedExternalProjectsSettings"> <GradleProjectSettings> - <option name="testRunner" value="PLATFORM" /> + <option name="testRunner" value="GRADLE" /> <option name="distributionType" value="DEFAULT_WRAPPED" /> <option name="externalProjectPath" value="$PROJECT_DIR$" /> <option name="gradleHome" value="$USER_HOME$/.gradle/wrapper/dists/gradle-6.1.1-all/cfmwm155h49vnt3hynmlrsdst/gradle-6.1.1" /> diff --git a/.idea/misc.xml b/.idea/misc.xml index 6199cc2a4d0e4fb33e8948257aab3e6a3dc67893..1fa75646b543cbbc55f068b7f5b89006788635e8 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,21 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> + <component name="DesignSurface"> + <option name="filePathToZoomLevelMap"> + <map> + <entry key="..\:/AndroidProject/YPPos/app/src/main/res/drawable/bg_popup_offer_details.xml" value="0.3508682328907048" /> + <entry key="..\:/AndroidProject/YPPos/app/src/main/res/drawable/btn_confirm_bg.xml" value="0.3508682328907048" /> + <entry key="..\:/AndroidProject/YPPos/app/src/main/res/drawable/edit_bg.xml" value="0.3508682328907048" /> + <entry key="..\:/AndroidProject/YPPos/app/src/main/res/layout/activity_login.xml" value="0.16347124117053483" /> + <entry key="..\:/AndroidProject/YPPos/app/src/main/res/layout/activity_main.xml" value="0.16347124117053483" /> + <entry key="..\:/AndroidProject/YPPos/app/src/main/res/layout/activity_register.xml" value="0.16347124117053483" /> + <entry key="..\:/AndroidProject/YPPos/app/src/main/res/layout/popup_cash_pay.xml" value="0.33" /> + <entry key="..\:/AndroidProject/YPPos/app/src/main/res/layout/popup_cash_pay_success.xml" value="0.33" /> + <entry key="..\:/AndroidProject/YPPos/app/src/main/res/layout/popup_order_pay_amount.xml" value="0.16347124117053483" /> + <entry key="..\:/AndroidProject/YPPos/app/src/main/res/layout/popup_pay_success.xml" value="0.16347124117053483" /> + </map> + </option> + </component> <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK"> <output url="file://$PROJECT_DIR$/build/classes" /> </component> diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 797acea53eb091cf5b30518802c3073f544adeed..0000000000000000000000000000000000000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="RunConfigurationProducerService"> - <option name="ignoredProducers"> - <set> - <option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" /> - </set> - </option> - </component> -</project> \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 78f5056370ca3e612c5ad2d673c64ab938f71d54..865229abe8107a74da2ed8d7b549232f6fdf4ec0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.ypsx.yppos" minSdkVersion 21 targetSdkVersion 30 - versionCode 100006 - versionName "1.00.006" + versionCode 100007 + versionName "1.00.007" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index 493ad5a4de6b93c14f4b53b1535fc0aa55e76002..95d26d95338b854e97ae607c60619078b659bdfc 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -10,9 +10,9 @@ { "type": "SINGLE", "filters": [], - "versionCode": 100006, - "versionName": "1.00.006", - "outputFile": "yppos_v100006-1.00.006-release-2021-11-01.apk" + "versionCode": 100007, + "versionName": "1.00.007", + "outputFile": "yppos_v100007-1.00.007-release-2021-11-11.apk" } ] } \ No newline at end of file diff --git a/app/release/yppos_v100006-1.00.006-release-2021-11-01.apk b/app/release/yppos_v100007-1.00.007-release-2021-11-11.apk similarity index 64% rename from app/release/yppos_v100006-1.00.006-release-2021-11-01.apk rename to app/release/yppos_v100007-1.00.007-release-2021-11-11.apk index 00870a897a297cf7a8a64126a457ecee45d736f7..fa100d89cbdf2bfd60e416d1cc8fcaaad26648a8 100644 Binary files a/app/release/yppos_v100006-1.00.006-release-2021-11-01.apk and b/app/release/yppos_v100007-1.00.007-release-2021-11-11.apk differ diff --git a/app/src/main/java/com/ypsx/yppos/http/data/bean/CashPaySuccess.kt b/app/src/main/java/com/ypsx/yppos/http/data/bean/CashPaySuccess.kt new file mode 100644 index 0000000000000000000000000000000000000000..5c54e279a2a697d819646933211f084c3d3aea6c --- /dev/null +++ b/app/src/main/java/com/ypsx/yppos/http/data/bean/CashPaySuccess.kt @@ -0,0 +1,8 @@ +package com.ypsx.yppos.http.data.bean + +data class CashPaySuccess( + var payAmount: Double, + var changeAmount: Double, + var roundPrice: Double, + var orderNo: String +) diff --git a/app/src/main/java/com/ypsx/yppos/http/data/bean/OrderPayment.kt b/app/src/main/java/com/ypsx/yppos/http/data/bean/OrderPayment.kt new file mode 100644 index 0000000000000000000000000000000000000000..f654c8c8d245d3c4265f43b955caf926f88d36a3 --- /dev/null +++ b/app/src/main/java/com/ypsx/yppos/http/data/bean/OrderPayment.kt @@ -0,0 +1,7 @@ +package com.ypsx.yppos.http.data.bean + +data class OrderPayment( + var payMethod: String, + var payTime: String, + var total: Double = 0.00, +) diff --git a/app/src/main/java/com/ypsx/yppos/http/data/bean/UploadOrderResponse.kt b/app/src/main/java/com/ypsx/yppos/http/data/bean/UploadOrderResponse.kt index 0b3cb5b980ebdeb2bded2e9a20d150d4e493813e..e5a19baa232fdc171ff29127ed14ca95d5dbab1a 100644 --- a/app/src/main/java/com/ypsx/yppos/http/data/bean/UploadOrderResponse.kt +++ b/app/src/main/java/com/ypsx/yppos/http/data/bean/UploadOrderResponse.kt @@ -15,5 +15,6 @@ data class UploadOrderResponse( var total:Double, var authCode:String, + var payMethod:String, ) diff --git a/app/src/main/java/com/ypsx/yppos/http/data/entity/PosPayMethod.kt b/app/src/main/java/com/ypsx/yppos/http/data/entity/PosPayMethod.kt index e81b59677017a3da7c1a8979d27137e1ee68c9cb..dd82a88a7d0f23f24a6cb6ef1aebafdacc5dad9e 100644 --- a/app/src/main/java/com/ypsx/yppos/http/data/entity/PosPayMethod.kt +++ b/app/src/main/java/com/ypsx/yppos/http/data/entity/PosPayMethod.kt @@ -4,7 +4,7 @@ enum class PosPayMethod { CARDPAY, //扫ç èšåˆæ”¯ä»˜ CCB_BAR_PAY, - CASHPAY, + CASHPAY,//现金结算 UNIONPAY_POS, //扫ç OFFLINE_QRCODE_PAY, diff --git a/app/src/main/java/com/ypsx/yppos/http/data/request/InsertOrderRequest.kt b/app/src/main/java/com/ypsx/yppos/http/data/request/InsertOrderRequest.kt index 2e6e79cf413ba6c09ea6b3893573bccf8bf3b9cb..3c067dbe4259e83cab2665ac3430bd9e7483137f 100644 --- a/app/src/main/java/com/ypsx/yppos/http/data/request/InsertOrderRequest.kt +++ b/app/src/main/java/com/ypsx/yppos/http/data/request/InsertOrderRequest.kt @@ -2,6 +2,7 @@ package com.ypsx.yppos.http.data.request import com.ypsx.yppos.http.data.bean.InsertOrderProductDTO import com.ypsx.yppos.http.data.bean.OrderActivityResponse +import com.ypsx.yppos.http.data.bean.OrderPayment data class InsertOrderRequest( var activitys: List<OrderActivityResponse>? = null, @@ -19,7 +20,7 @@ data class InsertOrderRequest( var posId: String, var storeId: String, var status: String, - var roundPrice: Double = 0.0, + var roundPrice: Double = 0.0,//èˆåˆ†é‡‘é¢ var remark: String? = null, var products: List<InsertOrderProductDTO>, @@ -33,7 +34,9 @@ data class InsertOrderRequest( // 订å•实际支付的金é¢=totalAmount-discountTotal var payAmount: Double, //æ‰¾é›¶é‡‘é¢ - var changeAmount: Double = 0.0, + var changeAmount: Double = 0.0,//æ‰¾é›¶é‡‘é¢ + var payments: List<OrderPayment>? =null - ) + +) diff --git a/app/src/main/java/com/ypsx/yppos/http/repository/request/HttpRequestManger.kt b/app/src/main/java/com/ypsx/yppos/http/repository/request/HttpRequestManger.kt index 96054a31b4ee44b9eb4e992d116f1451dcc73a45..5f1270ac36d3e20b2c00e6812765372b0a8bf406 100644 --- a/app/src/main/java/com/ypsx/yppos/http/repository/request/HttpRequestManger.kt +++ b/app/src/main/java/com/ypsx/yppos/http/repository/request/HttpRequestManger.kt @@ -31,12 +31,14 @@ class HttpRequestManger { * 申请注册 */ suspend fun applyPos(applyPosMachineRequest: ApplyPosMachineRequest): ApiResponse<PosMachineResponse> { + //æ¸…é™¤æ•°æ® CacheUtil.setUpdateTimeBigger("") CacheUtil.setLoginResponse(null) PosDatabase.clearAllTables() val applyPosData = apiService.applyPos(applyPosMachineRequest) if (applyPosData.isSuccess()) { val id = applyPosData.data + //æ ¹æ®POS机Id查询POS机详情 return apiService.getById(id) } else { //抛出错误异常 @@ -53,6 +55,7 @@ class HttpRequestManger { return if (registerData.isSuccess()) { val posId = registerData.data.id val status = registerData.data.status + //如果在申请ä¸ï¼Œå»¶æ—¶2ç§’ç»§ç»èŽ·å–详情 if (status == PosStatus.APPLY.name) { delay(2000) getById(posId) @@ -63,9 +66,6 @@ class HttpRequestManger { } else { throw AppException(registerData.code, registerData.message) } - //抛出错误异常 -// throw AppException(registerData.code, registerData.message) - } /** @@ -81,17 +81,20 @@ class HttpRequestManger { val loginData = apiService.posLogin(loginRequest) if (loginData.isSuccess()) { val data = loginData.data + //ä¿å˜ç™»å½•ä¿¡æ¯ CacheUtil.setLoginResponse(data) - val posConfigData = apiService.getByPosId(posId) if (posConfigData.isSuccess()) { val configData = posConfigData.data + //ä¿å˜åˆ°æ•°æ®åº“ PosConfigRepository.getInstance().savePosConfig(posId, configData) val askTime = CacheUtil.getUpdateTimeBigger() val currentTime = DateUtil.getTodayDateTime() + //增é‡èŽ·å–商å“ä¿¡æ¯ val productList = apiService.getProductList(storeId, askTime) if (productList.isSuccess()) { PosProductRepository.getInstance().insertAll(productList.data) + //æ›´æ–°æ—¶é—´ CacheUtil.setUpdateTimeBigger(currentTime) return loginData } else { @@ -115,6 +118,7 @@ class HttpRequestManger { payMethod: PosPayMethod ): UploadOrderResponse { val list = arrayListOf(insertOrderRequest) + //ä¸Šä¼ è®¢å• val uploadOrderData = apiService.uploadOrder(list) if (uploadOrderData.isSuccess()) { @@ -123,6 +127,10 @@ class HttpRequestManger { val data = uploadData[0] val success = data.success if (success) { + if (payMethod == PosPayMethod.CASHPAY) { + data.payMethod = payMethod.name + return data + } var cardPayPassword: String? = null if (payMethod == PosPayMethod.CARDPAY) { cardPayPassword = "" @@ -135,10 +143,12 @@ class HttpRequestManger { total = insertOrderRequest.payAmount, cardPayPassword = cardPayPassword ) + //获得对应的支付订å•ç¾å val cashPaySignData = apiService.getCashPaySign(unifiedCashPaySignRequest) if (cashPaySignData.isSuccess()) { data.total = insertOrderRequest.payAmount data.authCode = authCode + data.payMethod = payMethod.name return data } else { throw AppException(cashPaySignData.code, cashPaySignData.getResponseMsg()) @@ -195,6 +205,7 @@ class HttpRequestManger { replyCommand(commandResponse.id) val startTime = System.currentTimeMillis() when (commandResponse.type) { + //ä¸Šä¼ æ—¥å¿—æ–‡ä»¶ PosCommandType.UPLOAD_LOG.name -> { //压缩文件 var todayDate = DateUtil.getTodayDate() @@ -213,13 +224,11 @@ class HttpRequestManger { var millis = System.currentTimeMillis() - currentTimeMillis LogUtils.debugInfo("压缩使用${millis}s") -// zipFile(upLoadUrl,zipUrl) -// zipUrl.dXLog() saveCommand(zipUrl, startTime, commandResponse) -// upload.toString().dXLog() } + //ä¸Šä¼ æ•°æ®åº“ PosCommandType.UPLOAD_DB.name -> { val databasePath = appContext.getDatabasePath(name) val currentTimeMillis = System.currentTimeMillis() diff --git a/app/src/main/java/com/ypsx/yppos/jobs/LogService.kt b/app/src/main/java/com/ypsx/yppos/jobs/LogService.kt index 03eaf1d2d4929d54b118d7835dc060d926859f85..7831ce31515a9a3093037f2ef882d95a0b13aa70 100644 --- a/app/src/main/java/com/ypsx/yppos/jobs/LogService.kt +++ b/app/src/main/java/com/ypsx/yppos/jobs/LogService.kt @@ -70,9 +70,9 @@ class LogService : Service() { private fun createEmptyNotification() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - var channel = NotificationChannel( + val channel = NotificationChannel( "CHANNEL_ID", "CHANNEL_NAME", - NotificationManager.IMPORTANCE_HIGH + NotificationManager.IMPORTANCE_MIN ) val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager manager.createNotificationChannel(channel) diff --git a/app/src/main/java/com/ypsx/yppos/jobs/SyncProductService.kt b/app/src/main/java/com/ypsx/yppos/jobs/SyncProductService.kt index 643b66c0d037723caa197e0ce26bf612ebaf6da2..d848a391725e7f67a5afcd6d7a5d7336cd67b3a4 100644 --- a/app/src/main/java/com/ypsx/yppos/jobs/SyncProductService.kt +++ b/app/src/main/java/com/ypsx/yppos/jobs/SyncProductService.kt @@ -71,7 +71,7 @@ class SyncProductService: Service() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { var channel = NotificationChannel( "CHANNEL_ID", "CHANNEL_NAME", - NotificationManager.IMPORTANCE_HIGH + NotificationManager.IMPORTANCE_MIN ) val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager manager.createNotificationChannel(channel) @@ -79,6 +79,7 @@ class SyncProductService: Service() { Notification.Builder(appContext, "CHANNEL_ID") .setContentTitle("åŽå°æœåŠ¡") .setSmallIcon(R.drawable.icon_yp_logo) + .setOnlyAlertOnce(true) .build() startForeground(1, notification) // startForeground(1, new Notification()); diff --git a/app/src/main/java/com/ypsx/yppos/ui/activity/MainActivity.kt b/app/src/main/java/com/ypsx/yppos/ui/activity/MainActivity.kt index 9bd5de3058eb59eba3110738fbd13f7a725863aa..aa243165e98e96ef6e3a4c63e6465f3ec17033fc 100644 --- a/app/src/main/java/com/ypsx/yppos/ui/activity/MainActivity.kt +++ b/app/src/main/java/com/ypsx/yppos/ui/activity/MainActivity.kt @@ -33,6 +33,8 @@ import com.ypsx.yppos.viewmodel.request.RequestMainViewModel import com.ypsx.yppos.viewmodel.state.MainViewModel import kotlinx.android.synthetic.main.activity_main.* import razerdp.basepopup.BasePopupWindow.* +import java.math.BigDecimal +import java.math.RoundingMode import java.util.* import kotlin.collections.ArrayList import kotlin.system.exitProcess @@ -352,30 +354,60 @@ class MainActivity : BaseActivity<MainViewModel, ActivityMainBinding>(), orderPayAmountPopupWindow.setData(orderNo, payment) orderPayAmountPopupWindow.setPayClick { it -> orderPayAmountPopupWindow.dismiss() - payAmountPopupWindow = PayAmountPopupWindow(this@MainActivity) - payAmountPopupWindow?.showPopupWindow() - payAmountPopupWindow?.setData(it, payment) - payAmountPopupWindow?.onDismissListener = object : - OnDismissListener() { - override fun onDismiss() { - payAmountPopupWindow = null + if (it == PosPayMethod.CASHPAY) { + val cashPayPopupWindow = CashPayPopupWindow(this@MainActivity) + cashPayPopupWindow.showPopupWindow() + cashPayPopupWindow.setData(it, payment) + cashPayPopupWindow.setCashPayClick { payMethod, receivablesMoney, roundMoney, changeMoney, payMoney -> + cashPayPopupWindow.dismiss() + var orderNo = mViewModel.orderNo.get() + var totalAmount = mViewModel.payAmount.get() + var payAmount = mViewModel.payAmount.get() + var promotionOnSaleTotal = mViewModel.discountSpecial.get() + var discountTotal = mViewModel.discountMoney.get() + var data = orderProductAdapter.data + var arrayList = ArrayList<InsertOrderProductDTO>() + arrayList.addAll(data) + arrayList.addAll(posBuyPartsDeleted) + "$realName 付款方å¼ï¼š${payMethod.name} ".dXLog() + requestMainViewModel.createOrder( + orderNo, + totalAmount.toDouble(), + payAmount.toDouble(), + promotionOnSaleTotal.toDouble(), + discountTotal.toDouble(), + arrayList, + payMethod, + "", roundMoney, changeMoney + ) } - } - payAmountPopupWindow?.setKeyEventListener { event -> - scanGunKeyEventHelper?.analysisKeyEvent(event) - return@setKeyEventListener true - } - payAmountPopupWindow?.setFinishClick { - payAmountPopupWindow?.dismiss() - "${realName}支付超时".dXLog() - val messageDialog = MessagePopupWindow(this@MainActivity) - messageDialog.showPopupWindow() - messageDialog.setData("支付超时", "è¯·ç¡®è®¤æ˜¯å¦æ”¯ä»˜æˆåŠŸ", gone = false) - messageDialog.setMessageClick { - messageDialog.dismiss() - mViewModel.resetOrderNo() - productPromotionRequest.orderNo = mViewModel.orderNo.get() - "${realName}点击我知é“了,并é‡ç½®å°ç¥¨å·ï¼š${productPromotionRequest.orderNo}".dXLog() + + } else { + payAmountPopupWindow = PayAmountPopupWindow(this@MainActivity) + payAmountPopupWindow?.showPopupWindow() + payAmountPopupWindow?.setData(it, payment) + payAmountPopupWindow?.onDismissListener = object : + OnDismissListener() { + override fun onDismiss() { + payAmountPopupWindow = null + } + } + payAmountPopupWindow?.setKeyEventListener { event -> + scanGunKeyEventHelper?.analysisKeyEvent(event) + return@setKeyEventListener true + } + payAmountPopupWindow?.setFinishClick { + payAmountPopupWindow?.dismiss() + "${realName}支付超时".dXLog() + val messageDialog = MessagePopupWindow(this@MainActivity) + messageDialog.showPopupWindow() + messageDialog.setData("支付超时", "è¯·ç¡®è®¤æ˜¯å¦æ”¯ä»˜æˆåŠŸ", gone = false) + messageDialog.setMessageClick { + messageDialog.dismiss() + mViewModel.resetOrderNo() + productPromotionRequest.orderNo = mViewModel.orderNo.get() + "${realName}点击我知é“了,并é‡ç½®å°ç¥¨å·ï¼š${productPromotionRequest.orderNo}".dXLog() + } } } } @@ -423,13 +455,10 @@ class MainActivity : BaseActivity<MainViewModel, ActivityMainBinding>(), val orderId = it.data?.orderId val total = it.data?.total var authCode = it.data?.authCode - - if (payAmountPopupWindow != null && payAmountPopupWindow!!.isShowing && payAmountPopupWindow!!.timeIsStart()) { payAmountPopupWindow?.setShowTimer() requestMainViewModel.getStateByOrderId(orderId!!, total!!, authCode!!) } - //支付æˆåŠŸåŽï¼Œ // èŽ·å–æ”¯ä»˜çŠ¶æ€ //获å–订å•详情 è¿›è¡Œæ‰“å° @@ -452,7 +481,10 @@ class MainActivity : BaseActivity<MainViewModel, ActivityMainBinding>(), }) requestMainViewModel.paySuccessState.observe(this, { - payAmountPopupWindow!!.dismiss() + if (payAmountPopupWindow != null) { + payAmountPopupWindow!!.dismiss() + } + if (it.isSuccess) { if (payFailedPopWindow != null) { payFailedPopWindow!!.dismiss() @@ -462,14 +494,7 @@ class MainActivity : BaseActivity<MainViewModel, ActivityMainBinding>(), paySuccessPopWindow!!.setData(it.data!!) paySuccessPopWindow!!.onDismissListener = object : OnDismissListener() { override fun onDismiss() { - mViewModel.resetOrderNo() - mViewModel.resetAmount() - productPromotionRequest.orderNo = mViewModel.orderNo.get() - productPromotionRequest.products.clear() - posBuyPartsDeleted.clear() - mViewModel.recyclerShow.set(false) - orderProductAdapter.data.clear() - orderProductAdapter.notifyDataSetChanged() + paySuccessView() } } } else { @@ -491,6 +516,33 @@ class MainActivity : BaseActivity<MainViewModel, ActivityMainBinding>(), }) } }) + + requestMainViewModel.paySuccessStateCash.observe(this, { + val payAmount = + BigDecimal(it.data!!.payAmount).minus(BigDecimal.valueOf(it.data!!.roundPrice)) + .plus( + BigDecimal.valueOf(it.data!!.changeAmount) + ).setScale(2,RoundingMode.HALF_UP).toString() + val paySuccessPopWindow = CashPaySuccessPopWindow(this) + paySuccessPopWindow.showPopupWindow() + paySuccessPopWindow.setData(payAmount,it.data!!.changeAmount.toString()) + paySuccessPopWindow.onDismissListener = object : OnDismissListener() { + override fun onDismiss() { + paySuccessView() + } + } + }) + } + + private fun paySuccessView() { + mViewModel.resetOrderNo() + mViewModel.resetAmount() + productPromotionRequest.orderNo = mViewModel.orderNo.get() + productPromotionRequest.products.clear() + posBuyPartsDeleted.clear() + mViewModel.recyclerShow.set(false) + orderProductAdapter.data.clear() + orderProductAdapter.notifyDataSetChanged() } diff --git a/app/src/main/java/com/ypsx/yppos/ui/popup/CashPayPopupWindow.kt b/app/src/main/java/com/ypsx/yppos/ui/popup/CashPayPopupWindow.kt new file mode 100644 index 0000000000000000000000000000000000000000..30ecd0fb209b7a522569b938f72b13c5a56f9d2d --- /dev/null +++ b/app/src/main/java/com/ypsx/yppos/ui/popup/CashPayPopupWindow.kt @@ -0,0 +1,131 @@ +package com.ypsx.yppos.ui.popup + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.inputmethod.EditorInfo +import com.ypsx.base.base.appContext +import com.ypsx.base.ext.util.screenWidth +import com.ypsx.base.ext.view.afterTextChange +import com.ypsx.base.util.dXLog +import com.ypsx.yppos.R +import com.ypsx.yppos.databinding.PopupCashPayBinding +import com.ypsx.yppos.http.data.entity.PosPayMethod +import com.ypsx.yppos.utils.CashierInputFilter +import com.ypsx.yppos.utils.toastFailed +import com.ypsx.yppos.viewmodel.state.CashPayViewModel +import razerdp.basepopup.BasePopupWindow +import java.math.BigDecimal +import java.math.RoundingMode + +class CashPayPopupWindow(context: Context) : BasePopupWindow(context) { + lateinit var bind: PopupCashPayBinding + private var roundMoney: Double = 0.0 + lateinit var payMethod: PosPayMethod + + var payAction: (item: PosPayMethod, receivablesMoney: Double, roundMoney: Double, changeMoney: Double, payMoney: Double) -> Unit = + { _: PosPayMethod, _: Double, _: Double, _: Double, _: Double-> } + + init { + setContentView(R.layout.popup_cash_pay) + width = appContext.screenWidth / 4 * 3 + popupGravity = Gravity.CENTER + isOutSideTouchable = false + setOutSideDismiss(false) + + } + + + override fun onViewCreated(contentView: View) { + + // é€å‡ºåº”付金é¢ï¼Œåº”付金é¢å››èˆäº”入到分ä½ï¼ˆè®°å½•èˆåˆ†é‡‘é¢ï¼‰ + bind = PopupCashPayBinding.bind(contentView) + bind.vm = CashPayViewModel() + bind.click = ProxyClick() + setAutoShowKeyboard(bind.textView20, true) + setKeyboardAdaptive(true) + setKeyboardAdaptionMode(bind.textView23, + FLAG_KEYBOARD_ALIGN_TO_ROOT or FLAG_KEYBOARD_ANIMATE_ALIGN + ) + bind.textView20.filters = arrayOf(CashierInputFilter()) + bind.textView20.afterTextChange { + if (it.isEmpty()) { + bind.vm?.changeMoney?.set(0.0) + bind.vm?.change2?.set("Â¥${bind.vm?.changeMoney?.get()}") + } else { + val payMoney: Double? = bind.vm?.receivables?.get() + if (payMoney != null) { + if (payMoney <= it.toDouble()) { + val scale = BigDecimal(it).minus(BigDecimal.valueOf(payMoney)).setScale(1) + bind.vm?.changeMoney?.set(scale.toDouble()) + bind.vm?.change2?.set("Â¥${bind.vm?.changeMoney?.get()}") + }else{ + bind.vm?.changeMoney?.set(0.0) + bind.vm?.change2?.set("Â¥${bind.vm?.changeMoney?.get()}") + } + } + } + } + bind.textView20.setOnEditorActionListener { v, actionId, event -> + if (actionId == EditorInfo.IME_ACTION_DONE) { + ProxyClick().confirm() + return@setOnEditorActionListener true + } + return@setOnEditorActionListener false + } + } + + fun setData(payMethod: PosPayMethod, amount: String) { + this.payMethod = payMethod + val rawData = BigDecimal(amount) + val scale = rawData.setScale(1, RoundingMode.HALF_UP) + roundMoney = (rawData - scale).toDouble() + bind.vm?.receivables?.set(scale.toDouble()) + bind.vm?.receivables2?.set("Â¥$scale") +// bind.vm?.actuallyPaid?.set(scale.toString()) + bind.vm?.changeMoney?.set(0.0) + bind.vm?.change2?.set("Â¥${bind.vm?.changeMoney?.get()}") + "èˆåˆ†é‡‘é¢ï¼š$roundMoney".dXLog() + + + } + + + inner class ProxyClick { + fun close() { + dismiss() + } + + fun confirm() { + val payMoney:String = bind.textView20.text.toString() + val receivables: Double? = bind.vm?.receivables?.get() + val changeMoney:Double? = bind.vm?.changeMoney?.get() + if (payMoney.isEmpty()) { + "应付金é¢ä¸å…许为空ï¼".toastFailed() + return + } + if (receivables != null && changeMoney != null) { + if (receivables > payMoney.toDouble()) { + "实付金é¢ä¸å…许å°äºŽåº”付金é¢".toastFailed() + return + } + "应付金é¢ï¼š$receivables èˆåˆ†é‡‘é¢ï¼š$roundMoney 找零金é¢$changeMoney 实付金é¢ï¼š$payMoney".dXLog() + payAction.invoke( + payMethod, + receivables, + roundMoney, + changeMoney, + payMoney.toDouble() + ) + + } + + + } + + } + + fun setCashPayClick(payAction: (item: PosPayMethod, receivablesMoney: Double, roundMoney: Double, changeMoney: Double, payMoney: Double) -> Unit) { + this.payAction = payAction + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ypsx/yppos/ui/popup/CashPaySuccessPopWindow.kt b/app/src/main/java/com/ypsx/yppos/ui/popup/CashPaySuccessPopWindow.kt new file mode 100644 index 0000000000000000000000000000000000000000..d3331400f7bc583b510946bc49e533a88d0ef0e5 --- /dev/null +++ b/app/src/main/java/com/ypsx/yppos/ui/popup/CashPaySuccessPopWindow.kt @@ -0,0 +1,84 @@ +package com.ypsx.yppos.ui.popup + +import android.app.Activity +import android.content.Context +import android.view.Gravity +import android.view.View +import com.ypsx.base.base.appContext +import com.ypsx.base.ext.util.screenWidth +import com.ypsx.yppos.R +import com.ypsx.yppos.databinding.PopupCashPaySuccessBinding +import com.ypsx.yppos.viewmodel.state.PaySuccessViewModel +import razerdp.basepopup.BasePopupWindow +import java.util.* + + +class CashPaySuccessPopWindow(context: Context) : BasePopupWindow(context) { + lateinit var bind: PopupCashPaySuccessBinding + var timer: Timer? = null + var task: TimerTask? = null + var recLen = 5 + lateinit var activity: Activity + + + + init { + setContentView(R.layout.popup_cash_pay_success) + width = appContext.screenWidth / 4 * 3 + popupGravity = Gravity.CENTER + isOutSideTouchable = false + setOutSideDismiss(false) + + } + + private fun stopTimer() { + if (task != null && timer != null) { + timer?.cancel() + timer?.purge() + timer = null + task = null + } + } + + override fun onViewCreated(contentView: View) { + bind = PopupCashPaySuccessBinding.bind(contentView) + bind.vm = PaySuccessViewModel() + bind.click = ProxyClick() + activity = context + + + timer = Timer() + task = object : TimerTask() { + override fun run() { + recLen-- + if (recLen < 0) { + if (isShowing) { + activity.runOnUiThread { + dismiss() + } + } + stopTimer() + } + } + } + timer?.schedule(task, 1000, 1000); + } + + fun setData(payAmount: String,changeAmount:String) { + bind.vm?.payAmount?.set(payAmount) + bind.vm?.changeAmount?.set(changeAmount) + } + + override fun dismiss() { + super.dismiss() + stopTimer() + } + + + inner class ProxyClick { + fun close() { + dismiss() + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ypsx/yppos/ui/popup/OrderPayAmountPopupWindow.kt b/app/src/main/java/com/ypsx/yppos/ui/popup/OrderPayAmountPopupWindow.kt index 58050f331ff38ec603e26886710b06a16bd24a4e..0878a3f9189b4c960a096f5c95d90d86effa3300 100644 --- a/app/src/main/java/com/ypsx/yppos/ui/popup/OrderPayAmountPopupWindow.kt +++ b/app/src/main/java/com/ypsx/yppos/ui/popup/OrderPayAmountPopupWindow.kt @@ -33,15 +33,27 @@ class OrderPayAmountPopupWindow(context: Context) : BasePopupWindow(context) { bind?.vm = OrderPayAmountViewModel() bind?.click = ProxyClick() - val offline: Boolean = bind?.vm?.scanOffline?.get() == false - val cardPay: Boolean = bind?.vm?.scanCardPay?.get() == false - if (offline && cardPay) { - bind?.rbOffline?.isChecked = true - bind?.rbCardPay?.isChecked = false - } else if (offline && !cardPay) { - bind?.rbOffline?.isChecked = true - } else if (!offline && cardPay) { - bind?.rbCardPay?.isChecked = true +// val offline: Boolean = bind?.vm?.scanOffline?.get() == false +// val cardPay: Boolean = bind?.vm?.scanCardPay?.get() == false +// val cashPay: Boolean = bind?.vm?.scanCashPay?.get() == false + when (bind?.vm?.firstName?.get()) { + PosPayMethod.CCB_BAR_PAY.name, + PosPayMethod.LCSW_BAR_PAY.name -> { + bind?.rbOffline?.isChecked = true + bind?.rbCardPay?.isChecked = false + bind?.rbCash?.isChecked = false + + } + PosPayMethod.CARDPAY.name -> { + bind?.rbOffline?.isChecked = false + bind?.rbCardPay?.isChecked = true + bind?.rbCash?.isChecked = false + } + PosPayMethod.CASHPAY.name -> { + bind?.rbOffline?.isChecked = false + bind?.rbCardPay?.isChecked = false + bind?.rbCash?.isChecked = true + } } } @@ -94,6 +106,7 @@ class OrderPayAmountPopupWindow(context: Context) : BasePopupWindow(context) { } } + R.id.rb_cash->PosPayMethod.CASHPAY R.id.rbCardPay -> PosPayMethod.CARDPAY else -> PosPayMethod.CCB_BAR_PAY } diff --git a/app/src/main/java/com/ypsx/yppos/utils/CashierInputFilter.java b/app/src/main/java/com/ypsx/yppos/utils/CashierInputFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..08aaf2427b32738762ee7799755b362861d43c2d --- /dev/null +++ b/app/src/main/java/com/ypsx/yppos/utils/CashierInputFilter.java @@ -0,0 +1,88 @@ +package com.ypsx.yppos.utils; + +import android.text.InputFilter; +import android.text.Spanned; +import android.text.TextUtils; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class CashierInputFilter implements InputFilter { + Pattern mPattern; + + //è¾“å…¥çš„æœ€å¤§é‡‘é¢ + private static final double MAX_VALUE = 9999.9; + //å°æ•°ç‚¹åŽçš„使•° + private static final int POINTER_LENGTH = 1; + + private static final String POINTER = "."; + + private static final String ZERO = "0"; + + public CashierInputFilter() { + mPattern = Pattern.compile("([0-9]|\\.)*"); + } + /** + * @param source 新输入的å—符串 + * @param start 新输入的å—ç¬¦ä¸²èµ·å§‹ä¸‹æ ‡ï¼Œä¸€èˆ¬ä¸º0 + * @param end 新输入的å—ç¬¦ä¸²ç»ˆç‚¹ä¸‹æ ‡ï¼Œä¸€èˆ¬ä¸ºsource长度-1 + * @param dest è¾“å…¥ä¹‹å‰æ–‡æœ¬æ¡†å†…容 + * @param dstart åŽŸå†…å®¹èµ·å§‹åæ ‡ï¼Œä¸€èˆ¬ä¸º0 + * @param dend åŽŸå†…å®¹ç»ˆç‚¹åæ ‡ï¼Œä¸€èˆ¬ä¸ºdest长度-1 + * @return 输入内容 + */ + @Override + public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { + String sourceText = source.toString(); + String destText = dest.toString(); + + //验è¯åˆ é™¤ç‰æŒ‰é”® + if (TextUtils.isEmpty(sourceText)) { + return ""; + } + + Matcher matcher = mPattern.matcher(source); + //å·²ç»è¾“入尿•°ç‚¹çš„æƒ…况下,åªèƒ½è¾“å…¥æ•°å— + if(destText.contains(POINTER)) { + if (!matcher.matches()) { + return ""; + } else { + if (POINTER.equals(source.toString())) { //åªèƒ½è¾“å…¥ä¸€ä¸ªå°æ•°ç‚¹ + return ""; + } + } + + //验è¯å°æ•°ç‚¹ç²¾åº¦ï¼Œä¿è¯å°æ•°ç‚¹åŽåªèƒ½è¾“å…¥ä¸¤ä½ + int index = destText.indexOf(POINTER); + int length = dend - index; + + if (length > POINTER_LENGTH) { + return dest.subSequence(dstart, dend); + } + } else { + /** + * æ²¡æœ‰è¾“å…¥å°æ•°ç‚¹çš„æƒ…况下,åªèƒ½è¾“入尿•°ç‚¹å’Œæ•°å— + * 1. 首ä½ä¸èƒ½è¾“入尿•°ç‚¹ + * 2. 如果首ä½è¾“å…¥0,则接下æ¥åªèƒ½è¾“入尿•°ç‚¹äº† + */ + if (!matcher.matches()) { + return ""; + } else { + if ((POINTER.equals(source.toString())) && TextUtils.isEmpty(destText)) { //首ä½ä¸èƒ½è¾“入尿•°ç‚¹ + return ""; + } else if (!POINTER.equals(source.toString()) && ZERO.equals(destText)) { //如果首ä½è¾“å…¥0,接下æ¥åªèƒ½è¾“入尿•°ç‚¹ + return ""; + } + } + } + + //验è¯è¾“入金é¢çš„å¤§å° + double sumText = Double.parseDouble(destText + sourceText); + if (sumText > MAX_VALUE) { + return dest.subSequence(dstart, dend); + } + + return dest.subSequence(dstart, dend) + sourceText; + } +} + diff --git a/app/src/main/java/com/ypsx/yppos/utils/PrintUtils.kt b/app/src/main/java/com/ypsx/yppos/utils/PrintUtils.kt index 74fa37d9c4cfe60299d42beab58093502cfea866..b04c4f0db7e1a93641c0d63b4a9c14d3d3b68779 100644 --- a/app/src/main/java/com/ypsx/yppos/utils/PrintUtils.kt +++ b/app/src/main/java/com/ypsx/yppos/utils/PrintUtils.kt @@ -17,6 +17,8 @@ import com.ypsx.yppos.room.entity.PosBuy import com.ypsx.yppos.room.entity.PosBuyPart import com.ypsx.yppos.room.entity.PosBuyPayment import com.ypsx.yppos.room.entity.PosConfig +import java.math.BigDecimal +import java.math.RoundingMode private const val PRNSTS_OK = 0 //OK @@ -239,7 +241,7 @@ object PrintUtils { height += printerManager.drawTextEx( getAmountCenterSpace( - "应付款:${orderResponse.payAmount}", + "应付款:${orderResponse.totalAmount}", "æ•°é‡:${orderResponse.buyNumber}" ), 0, @@ -252,10 +254,14 @@ object PrintUtils { fontStyle, 0 ) - + val minus = BigDecimal.valueOf(orderResponse.totalAmount) + .minus(BigDecimal.valueOf(orderResponse.roundPrice)) + val scale1 = + minus.plus(BigDecimal.valueOf(orderResponse.changeAmount)) + .setScale(2).toDouble() height += printerManager.drawTextEx( getAmountCenterSpace( - "实付款:${orderResponse.payAmount}", + "实付款:${scale1}", "找零金é¢ï¼š${orderResponse.changeAmount}" ), 0, @@ -274,9 +280,9 @@ object PrintUtils { ) var payments = orderResponse.payments var payMethod = "" - var total = "" + var total = orderResponse.totalAmount if (payments.isNotEmpty()) { - total = payments[0].total.toString() + payMethod = when (payments[0].payMethod) { PosPayMethod.CCB_BAR_PAY.name, PosPayMethod.LCSW_BAR_PAY.name -> { "æ‰«ç æ”¯ä»˜" @@ -284,17 +290,22 @@ object PrintUtils { PosPayMethod.CARDPAY.name -> { "ä¼šå‘˜ä½™é¢æ”¯ä»˜" } + PosPayMethod.CASHPAY.name->{ + "现金支付" + } else -> { "" } } + }else{ + payMethod = "现金支付" } height += printerManager.drawTextEx( "付款方å¼ï¼š$payMethod $total", 0, height, 384, -1, fontName, fontSize, 0, fontStyle, 0 ) - + val scale = minus.setScale(2).toDouble() height += printerManager.drawTextEx( - " 实际扣款:${total}", 0, height, 384, -1, fontName, fontSize, 0, fontStyle, 0 + " 实际扣款:${scale}", 0, height, 384, -1, fontName, fontSize, 0, fontStyle, 0 ) height += printerManager.drawTextEx( @@ -710,7 +721,7 @@ object PrintUtils { height += printerManager.drawTextEx( getAmountCenterSpace( - "应付款:${posBuy.payAmount}", + "应付款:${posBuy.totalAmount}", "æ•°é‡:${posBuy.buyNumber}" ), 0, @@ -723,10 +734,14 @@ object PrintUtils { fontStyle, 0 ) - + val minus = BigDecimal.valueOf(posBuy.totalAmount) + .minus(BigDecimal.valueOf(posBuy.roundPrice)) + val scale1 = + minus.plus(BigDecimal.valueOf(posBuy.changeAmount)) + .setScale(2, RoundingMode.HALF_UP).toDouble() height += printerManager.drawTextEx( getAmountCenterSpace( - "实付款:${posBuy.payAmount}", + "实付款:${scale1}", "找零金é¢ï¼š${posBuy.changeAmount}" ), 0, @@ -746,26 +761,30 @@ object PrintUtils { var payMethod = "" var total = "" - if (posBuyPayment != null) { - total = posBuyPayment.total.toString() - payMethod = when (posBuyPayment.payMethod) { + payMethod = if (posBuyPayment == null) { + "现金支付" + } else { + when (posBuyPayment.payMethod) { PosPayMethod.CCB_BAR_PAY.name, PosPayMethod.LCSW_BAR_PAY.name -> { "æ‰«ç æ”¯ä»˜" } PosPayMethod.CARDPAY.name -> { "ä¼šå‘˜ä½™é¢æ”¯ä»˜" } + PosPayMethod.CASHPAY.name -> { + "现金支付" + } else -> { "" } } } height += printerManager.drawTextEx( - "付款方å¼ï¼š$payMethod $total", 0, height, 384, -1, fontName, fontSize, 0, fontStyle, 0 + "付款方å¼ï¼š$payMethod ${posBuy.totalAmount}", 0, height, 384, -1, fontName, fontSize, 0, fontStyle, 0 ) - + val scale = minus.setScale(2).toDouble() height += printerManager.drawTextEx( - " 实际扣款:${total}", 0, height, 384, -1, fontName, fontSize, 0, fontStyle, 0 + " 实际扣款:${scale}", 0, height, 384, -1, fontName, fontSize, 0, fontStyle, 0 ) height += printerManager.drawTextEx( diff --git a/app/src/main/java/com/ypsx/yppos/viewmodel/request/RequestMainViewModel.kt b/app/src/main/java/com/ypsx/yppos/viewmodel/request/RequestMainViewModel.kt index 76ccdd8a6586310b29191ee92cea4058ec6aaa64..892ed65080b866867644339f65114ae93c90573b 100644 --- a/app/src/main/java/com/ypsx/yppos/viewmodel/request/RequestMainViewModel.kt +++ b/app/src/main/java/com/ypsx/yppos/viewmodel/request/RequestMainViewModel.kt @@ -7,7 +7,6 @@ import com.ypsx.base.ext.launch import com.ypsx.base.ext.request import com.ypsx.base.ext.requestNoCheck import com.ypsx.base.ext.util.toJson -import com.ypsx.base.network.AppException import com.ypsx.base.util.dXLog import com.ypsx.yppos.http.apiService import com.ypsx.yppos.http.data.bean.* @@ -44,6 +43,7 @@ class RequestMainViewModel : BaseViewModel() { var payState = MutableLiveData<UpdateUiState<UploadOrderResponse>>() val paySuccessState = MutableLiveData<UpdateUiState<String>>() + val paySuccessStateCash = MutableLiveData<UpdateUiState<CashPaySuccess>>() init { @@ -132,7 +132,7 @@ class RequestMainViewModel : BaseViewModel() { if (posProduct?.style == PosProductStyle.WEIGHT.name) { listNum += 1 - }else if (posProduct?.style == PosProductStyle.SINGLE.name) { + } else if (posProduct?.style == PosProductStyle.SINGLE.name) { listNum += product.quantity.toInt() } val amount: Double = product.price.times(product.quantity) ?: 0.0 @@ -237,11 +237,11 @@ class RequestMainViewModel : BaseViewModel() { } if (posProduct?.style == PosProductStyle.WEIGHT.name) { listNum += 1 - }else if (posProduct?.style == PosProductStyle.SINGLE.name) { + } else if (posProduct?.style == PosProductStyle.SINGLE.name) { listNum += product.quantity.toInt() } var activityInfo = product.activityInfo - var activitys:ArrayList<ActivityInfoDTO> = arrayListOf() + var activitys: ArrayList<ActivityInfoDTO> = arrayListOf() if (activityInfo != null) { activitys.add(activityInfo) } @@ -283,7 +283,7 @@ class RequestMainViewModel : BaseViewModel() { payAmountBean.postValue( PayAmountBean( BigDecimalUtils.forPlus(discountTotal), - BigDecimalUtils.forPlus( payApportionAmount), + BigDecimalUtils.forPlus(payApportionAmount), BigDecimalUtils.forPlus(discountMoney), BigDecimalUtils.forPlus(discountTime), BigDecimalUtils.forPlus(discountSpecial), @@ -305,12 +305,19 @@ class RequestMainViewModel : BaseViewModel() { discountTotal: Double, productList: List<InsertOrderProductDTO>, payMethod: PosPayMethod, - barcode: String + barcode: String, + roundMoney: Double = 0.0, changeMoney: Double = 0.0 ) { + val status = when (payMethod) { + PosPayMethod.CASHPAY -> "FINISHED" + else -> "CREATED" + } val loginResponse = CacheUtil.getLoginResponse() + val dataTime = DateUtil.getTodayDateTime() + val insertOrderRequest = InsertOrderRequest( activitys = orderPromotions, - createTime = DateUtil.getTodayDateTime(), + createTime = dataTime, creatorId = loginResponse!!.loginUser.username ?: "", creatorName = loginResponse.loginUser.realName ?: "", orderNo = orderNo, @@ -319,18 +326,36 @@ class RequestMainViewModel : BaseViewModel() { mobile = "", posId = posConfig?.id ?: "", storeId = posConfig?.storeId ?: "", - status = "CREATED", + status = status, products = productList, totalAmount = totalAmount, promotionOnSaleTotal = promotionOnSaleTotal, discountTotal = discountTotal, payAmount = payAmount, + roundPrice = roundMoney, + changeAmount = changeMoney, + payments = if (payMethod == PosPayMethod.CASHPAY) + arrayListOf( + OrderPayment( + payMethod = payMethod.name, + payTime = dataTime, + total = totalAmount + ) + ) else null + ) requestNoCheck({ HttpRequestCoroutine.createOrder(insertOrderRequest, barcode, payMethod) }, { - val uiState = UpdateUiState(isSuccess = true, it) - payState.postValue(uiState) + if (it.payMethod == PosPayMethod.CASHPAY.name) { + getOrderDetailById(it.orderId, "") + val cashPaySuccess = CashPaySuccess(payAmount, changeMoney, roundMoney, orderNo) + val uiState = UpdateUiState(isSuccess = true, cashPaySuccess) + paySuccessStateCash.postValue(uiState) + } else { + val uiState = UpdateUiState(isSuccess = true, it) + payState.postValue(uiState) + } }, { val uiState = UpdateUiState(isSuccess = false, data = "", it.errorMsg) paySuccessState.postValue(uiState) @@ -393,7 +418,4 @@ class RequestMainViewModel : BaseViewModel() { } - - - } \ No newline at end of file diff --git a/app/src/main/java/com/ypsx/yppos/viewmodel/state/CashPayViewModel.kt b/app/src/main/java/com/ypsx/yppos/viewmodel/state/CashPayViewModel.kt new file mode 100644 index 0000000000000000000000000000000000000000..23db8dfe7079d7f80fd7ec94a2561784668e7c4a --- /dev/null +++ b/app/src/main/java/com/ypsx/yppos/viewmodel/state/CashPayViewModel.kt @@ -0,0 +1,22 @@ +package com.ypsx.yppos.viewmodel.state + +import com.ypsx.base.base.viewmodel.BaseViewModel +import com.ypsx.base.callback.databind.DoubleObservableField +import com.ypsx.base.callback.databind.StringObservableField + +class CashPayViewModel : BaseViewModel() { + + // + var receivables = DoubleObservableField() + var receivables2 = StringObservableField("Â¥" + receivables.get()) + + + var actuallyPaid = StringObservableField() + +//找零借 + var changeMoney = DoubleObservableField(0.0) + + var change2 = StringObservableField("Â¥${changeMoney.get()}") + + +} \ No newline at end of file diff --git a/app/src/main/java/com/ypsx/yppos/viewmodel/state/OrderPayAmountViewModel.kt b/app/src/main/java/com/ypsx/yppos/viewmodel/state/OrderPayAmountViewModel.kt index dfb5883d37ce22e5f75852a5b9d09d7bbb0d43b1..bbeae26718ff33f56857f67de172b534448b2409 100644 --- a/app/src/main/java/com/ypsx/yppos/viewmodel/state/OrderPayAmountViewModel.kt +++ b/app/src/main/java/com/ypsx/yppos/viewmodel/state/OrderPayAmountViewModel.kt @@ -19,8 +19,10 @@ class OrderPayAmountViewModel : BaseViewModel() { var scanOffline = BooleanObservableField(false) var scanCardPay = BooleanObservableField(false) + var scanCashPay = BooleanObservableField(false) var payName = StringObservableField("") + var firstName = StringObservableField("") var offlineVisible = object : ObservableInt(scanOffline) { @@ -33,6 +35,16 @@ class OrderPayAmountViewModel : BaseViewModel() { } } + var cashVisible = object : ObservableInt(scanCashPay) { + override fun get(): Int { + return if (scanCashPay.get()) { + View.VISIBLE + } else { + View.GONE + } + } + } + var cardPayVisible = object : ObservableInt(scanCardPay) { override fun get(): Int { return if (scanCardPay.get()) { @@ -53,13 +65,36 @@ class OrderPayAmountViewModel : BaseViewModel() { for (str in payMethod) { when (str) { PosPayMethod.CCB_BAR_PAY.name, - PosPayMethod.LCSW_BAR_PAY.name->{ + PosPayMethod.LCSW_BAR_PAY.name -> { payName.set(str) scanOffline.set(true) } - PosPayMethod.CARDPAY.name-> scanCardPay.set(true) + PosPayMethod.CARDPAY.name -> scanCardPay.set(true) + PosPayMethod.CASHPAY.name -> scanCashPay.set(true) } } + when { + payMethods.contains(PosPayMethod.CASHPAY.name) -> { + firstName.set(PosPayMethod.CASHPAY.name) + return@launch + } + payMethods.contains(PosPayMethod.CCB_BAR_PAY.name) -> { + firstName.set(PosPayMethod.CCB_BAR_PAY.name) + return@launch + } + payMethods.contains(PosPayMethod.LCSW_BAR_PAY.name) -> { + firstName.set(PosPayMethod.LCSW_BAR_PAY.name) + return@launch + } + payMethods.contains(PosPayMethod.CARDPAY.name) -> { + firstName.set(PosPayMethod.CARDPAY.name) + return@launch + } + + } + + + } } diff --git a/app/src/main/java/com/ypsx/yppos/viewmodel/state/PaySuccessViewModel.kt b/app/src/main/java/com/ypsx/yppos/viewmodel/state/PaySuccessViewModel.kt index b5f93aa423e77059588e16c30ca6c3249b79f8a0..42d1b6786a47a2304f0ea5baf04c821b7a403337 100644 --- a/app/src/main/java/com/ypsx/yppos/viewmodel/state/PaySuccessViewModel.kt +++ b/app/src/main/java/com/ypsx/yppos/viewmodel/state/PaySuccessViewModel.kt @@ -6,6 +6,8 @@ import com.ypsx.base.callback.databind.StringObservableField class PaySuccessViewModel : BaseViewModel() { var amount = StringObservableField() + var payAmount = StringObservableField() + var changeAmount = StringObservableField() diff --git a/app/src/main/res/drawable/btn_confirm_bg.xml b/app/src/main/res/drawable/btn_confirm_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..f57c53a504556cdc50f86c0ec4b1cb3e565800fb --- /dev/null +++ b/app/src/main/res/drawable/btn_confirm_bg.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <solid android:color="#ffa14eff" /> + <corners android:radius="4dp" /> +</shape> \ No newline at end of file diff --git a/app/src/main/res/drawable/edit_bg.xml b/app/src/main/res/drawable/edit_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..4abc6ca80ab7b246bd61d089691137b5ede37297 --- /dev/null +++ b/app/src/main/res/drawable/edit_bg.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <stroke android:width="1dp" android:color="#ffd8d8d8" /> + <corners android:radius="2dp" /> +</shape> \ No newline at end of file diff --git a/app/src/main/res/layout/popup_cash_pay.xml b/app/src/main/res/layout/popup_cash_pay.xml new file mode 100644 index 0000000000000000000000000000000000000000..3d5d62bd5b787a3a60734015ce6d1d5b399c8042 --- /dev/null +++ b/app/src/main/res/layout/popup_cash_pay.xml @@ -0,0 +1,155 @@ +<?xml version="1.0" encoding="utf-8"?> +<layout 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"> + + <data> + + + <variable + name="vm" + type="com.ypsx.yppos.viewmodel.state.CashPayViewModel" /> + <variable + name="click" + type="com.ypsx.yppos.ui.popup.CashPayPopupWindow.ProxyClick" /> + + + </data> + + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/bg_dialog"> + + <TextView + android:id="@+id/tv_title" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:gravity="center" + android:paddingTop="@dimen/dp_10" + android:paddingBottom="@dimen/dp_10" + android:text="@string/cash_pay" + android:textColor="@color/black" + android:textSize="22sp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <ImageView + android:id="@+id/iv_popup_close" + android:layout_width="20dp" + android:layout_height="20dp" + android:layout_marginEnd="15dp" + android:onClick="@{()->click.close()}" + app:layout_constraintBottom_toBottomOf="@+id/tv_title" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:srcCompat="@drawable/ic_popup_close" /> + + <TextView + android:id="@+id/textView18" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:paddingVertical="15dp" + android:paddingStart="20dp" + android:text="应收款:" + android:textColor="#969696" + android:textSize="20sp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/tv_title" /> + + <TextView + android:id="@+id/textView19" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:paddingVertical="15dp" + android:paddingEnd="20dp" + android:text="@{vm.receivables2}" + android:textColor="#FF4400" + android:textSize="20sp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/textView18" + app:layout_constraintTop_toBottomOf="@+id/tv_title" + tools:text="Â¥12.34" /> + + <TextView + android:id="@+id/textView17" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:paddingVertical="15dp" + android:paddingStart="20dp" + android:text="实付款:" + android:textColor="#969696" + android:textSize="20sp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/textView18" /> + + <EditText + android:id="@+id/textView20" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginEnd="20dp" + android:background="@drawable/edit_bg" + android:paddingVertical="15dp" + android:paddingStart="10dp" + android:imeOptions="actionDone" + android:hint="@{String.valueOf(vm.receivables)}" + android:inputType="numberDecimal" + android:digits="0123456789." + android:text="@={vm.actuallyPaid}" + android:textColor="#333333" + android:textColorHint="#999999" + android:textSize="20sp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/textView17" + app:layout_constraintTop_toBottomOf="@+id/textView19" /> + + <TextView + android:id="@+id/textView21" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:paddingVertical="15dp" + android:paddingStart="20dp" + android:text="找零: " + android:textColor="#969696" + android:textSize="20sp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/textView17" /> + + <TextView + android:id="@+id/textView22" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:paddingVertical="15dp" + android:paddingEnd="20dp" + android:maxLength="6" + android:text="@{vm.change2}" + android:textColor="#333333" + android:textSize="20sp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/textView21" + app:layout_constraintTop_toBottomOf="@+id/textView20" + tools:text="123" /> + + <TextView + android:id="@+id/textView23" + android:layout_width="0dp" + android:layout_height="50dp" + android:layout_marginHorizontal="20dp" + android:text="确认" + android:onClick="@{()->click.confirm()}" + android:layout_marginVertical="15dp" + android:background="@drawable/btn_confirm_bg" + android:textColor="@color/white" + android:textSize="20sp" + android:gravity="center" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/textView22" + app:layout_constraintVertical_bias="1.0" /> + + + </androidx.constraintlayout.widget.ConstraintLayout> +</layout> \ No newline at end of file diff --git a/app/src/main/res/layout/popup_cash_pay_success.xml b/app/src/main/res/layout/popup_cash_pay_success.xml new file mode 100644 index 0000000000000000000000000000000000000000..3b43263d43850093cc2d45f9e12525a2e199cea0 --- /dev/null +++ b/app/src/main/res/layout/popup_cash_pay_success.xml @@ -0,0 +1,156 @@ +<?xml version="1.0" encoding="utf-8"?> +<layout 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" + tools:ignore="MissingDefaultResource"> + + <data> + <variable + name="vm" + type="com.ypsx.yppos.viewmodel.state.PaySuccessViewModel" /> + + <variable + name="click" + type="com.ypsx.yppos.ui.popup.CashPaySuccessPopWindow.ProxyClick" /> + + </data> + + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/bg_popup_pay"> + + <androidx.appcompat.widget.AppCompatImageView + android:id="@+id/imageView6" + android:layout_width="70dp" + android:layout_height="70dp" + android:layout_marginTop="25dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:srcCompat="@drawable/ic_pay_success" /> + + <TextView + android:id="@+id/textView3" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="15dp" + android:gravity="center" + android:text="@string/pay_success" + android:textColor="@color/black_333" + android:textSize="18sp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/imageView6" /> + + <LinearLayout + android:id="@+id/linearLayout2" + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_marginTop="5dp" + android:gravity="center_horizontal" + android:orientation="horizontal" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/textView3"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="@color/black_333" + android:textSize="22dp" + android:text="收款:" + /> + + <TextView + android:id="@+id/textView4" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/rmb" + android:textSize="22dp" + android:textColor="@color/red" /> + + <TextView + android:id="@+id/tv_amount" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@{vm.payAmount}" + android:textColor="@color/red" + android:textSize="22dp" + tools:text="112.32" /> + </LinearLayout> + + <LinearLayout + android:id="@+id/linearLayout3" + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_marginTop="5dp" + android:gravity="center_horizontal" + android:orientation="horizontal" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/linearLayout2"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="@color/black_333" + android:textSize="22dp" + android:text="找零:" + /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/rmb" + android:textSize="22dp" + android:textColor="@color/red" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@{vm.changeAmount}" + android:textColor="@color/red" + android:textSize="22dp" + tools:text="12.32" /> + </LinearLayout> + + <TextView + android:id="@+id/textView9" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="14dp" + android:text="5såŽè‡ªåЍ关é—" + android:textColor="@color/colorAccent" + android:textSize="14sp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/linearLayout3" /> + + <View + android:id="@+id/view2" + android:layout_width="0dp" + android:layout_height="0.5dp" + android:layout_marginTop="20dp" + android:background="@color/black_333" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/textView9" /> + + <TextView + android:id="@+id/textView10" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/close" + android:onClick="@{()->click.close()}" + android:textColor="@color/black_333" + android:gravity="center" + android:textSize="18sp" + android:paddingTop="12dp" + android:paddingBottom="12dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/view2" /> + </androidx.constraintlayout.widget.ConstraintLayout> +</layout> \ No newline at end of file diff --git a/app/src/main/res/layout/popup_order_pay_amount.xml b/app/src/main/res/layout/popup_order_pay_amount.xml index 95d567f7ad550ca1c3b4dd0bc316656bd10d51a5..70e964ab61b91cd374c4d7e0770f732c3574141b 100644 --- a/app/src/main/res/layout/popup_order_pay_amount.xml +++ b/app/src/main/res/layout/popup_order_pay_amount.xml @@ -138,6 +138,23 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/constraintLayout4"> + <RadioButton + android:id="@+id/rb_cash" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="5dp" + android:layout_marginBottom="5dp" + android:background="@drawable/bg_pay_amount_check" + android:button="@null" + android:checked="true" + android:drawableEnd="@drawable/bg_pay_amount" + android:paddingStart="15dp" + android:paddingEnd="15dp" + android:text="@string/cash_pay" + android:visibility="@{vm.cashVisible}" + android:textColor="#4D4D4D" + android:textSize="16sp" /> + <RadioButton android:id="@+id/rb_offline" android:layout_width="match_parent" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 31d3e1b0dd4562b39a07d0bf2f98e94d95a5a528..da6f2e938f926829aa018d9b6a2c912655d278bf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -33,6 +33,7 @@ <string name="total_discount_amount">æ€»ä¼˜æƒ é‡‘é¢ï¼š</string> <string name="checkout_counter">æ”¶é“¶å°</string> <string name="order_no">å°ç¥¨æµæ°´å·</string> + <string name="cash_pay">现金</string> <string name="scan_qr_pay">æ‰«ç æ”¯ä»˜</string> <string name="member_balance_pay">会员余é¢</string> <string name="receive_payment_now">ç«‹å³æ”¶æ¬¾</string>