Commit df5f03e0 authored by jiangjiantao's avatar jiangjiantao

一期开发完成

parent 569947bb
...@@ -7,18 +7,32 @@ android { ...@@ -7,18 +7,32 @@ android {
compileSdkVersion 31 compileSdkVersion 31
buildToolsVersion "30.0.3" buildToolsVersion "30.0.3"
signingConfigs {
myConfig {
keyAlias 'fastcashier'
keyPassword '123456'
storeFile file('../fastcashier.jks')
storePassword '123456'
}
}
defaultConfig { defaultConfig {
applicationId "com.miya.fastcashier" applicationId "com.miya.fastcashier"
minSdkVersion 16 minSdkVersion 16
targetSdkVersion 31 targetSdkVersion 31
versionCode 1 versionCode 2
versionName "1.0" versionName "2.0"
multiDexEnabled true multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }
buildTypes { buildTypes {
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
release { release {
signingConfig signingConfigs.myConfig
minifyEnabled false minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
} }
...@@ -50,6 +64,7 @@ dependencies { ...@@ -50,6 +64,7 @@ dependencies {
implementation 'com.rengwuxian.materialedittext:library:2.1.4' implementation 'com.rengwuxian.materialedittext:library:2.1.4'
implementation 'com.github.GrenderG:Toasty:1.5.2' implementation 'com.github.GrenderG:Toasty:1.5.2'
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation files('libs/Pay-Platform.jar')
testImplementation 'junit:junit:4.+' testImplementation 'junit:junit:4.+'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation('com.squareup.retrofit2:converter-simplexml:2.9.0') { implementation('com.squareup.retrofit2:converter-simplexml:2.9.0') {
...@@ -65,4 +80,5 @@ dependencies { ...@@ -65,4 +80,5 @@ dependencies {
implementation 'com.tencent:mmkv:1.2.12' implementation 'com.tencent:mmkv:1.2.12'
implementation 'com.github.ybq:Android-SpinKit:1.4.0' implementation 'com.github.ybq:Android-SpinKit:1.4.0'
implementation 'com.github.d-max:spots-dialog:1.1@aar' implementation 'com.github.d-max:spots-dialog:1.1@aar'
implementation 'com.elvishew:xlog:1.10.1'
} }
\ No newline at end of file
...@@ -46,6 +46,9 @@ ...@@ -46,6 +46,9 @@
<activity <activity
android:name=".ui.RefundActivity" android:name=".ui.RefundActivity"
android:theme="@style/Theme.MiYaFastCashier.Dark" /> android:theme="@style/Theme.MiYaFastCashier.Dark" />
<activity
android:name=".ui.PayActivity"
android:theme="@style/Theme.MiYaFastCashier.Dark" />
</application> </application>
</manifest> </manifest>
\ No newline at end of file
...@@ -4,10 +4,23 @@ import android.app.Activity ...@@ -4,10 +4,23 @@ import android.app.Activity
import android.app.Application import android.app.Application
import android.content.Context import android.content.Context
import android.os.Bundle import android.os.Bundle
import android.util.Log
import androidx.multidex.MultiDexApplication import androidx.multidex.MultiDexApplication
import com.elvishew.xlog.LogConfiguration
import com.elvishew.xlog.LogLevel
import com.elvishew.xlog.XLog
import com.elvishew.xlog.printer.AndroidPrinter
import com.elvishew.xlog.printer.ConsolePrinter
import com.elvishew.xlog.printer.Printer
import com.elvishew.xlog.printer.file.FilePrinter
import com.elvishew.xlog.printer.file.backup.NeverBackupStrategy
import com.elvishew.xlog.printer.file.naming.DateFileNameGenerator
import com.miya.fastcashier.utils.DateUtils
import com.miya.print.PrinterManager import com.miya.print.PrinterManager
import com.sdy.miya.moblie.component.pay.core.utils.PayLogFileUtils
import com.tencent.mmkv.MMKV import com.tencent.mmkv.MMKV
import java.io.File
import java.util.*
class BaseApplication : MultiDexApplication() { class BaseApplication : MultiDexApplication() {
override fun onCreate() { override fun onCreate() {
...@@ -16,20 +29,74 @@ class BaseApplication : MultiDexApplication() { ...@@ -16,20 +29,74 @@ class BaseApplication : MultiDexApplication() {
PrinterManager.getInstance().init(this) PrinterManager.getInstance().init(this)
//屏幕适配 //屏幕适配
screenAdapt() screenAdapt()
MMKV.initialize(this); MMKV.initialize(this)
//日志
logConfig()
}
private fun logConfig(){
XLog.init(LogLevel.ALL);
val config = LogConfiguration.Builder()
.logLevel(
if (BuildConfig.DEBUG) LogLevel.ALL // 指定日志级别,低于该级别的日志将不会被打印,默认为 LogLevel.ALL
else LogLevel.NONE
)
.enableThreadInfo() // 允许打印线程信息,默认禁止
.build()
val androidPrinter: Printer = AndroidPrinter(true) // 通过 android.util.Log 打印日志的打印器
val consolePrinter: Printer = ConsolePrinter() // 通过 System.out 打印日志到控制台的打印器
val filePrinter: Printer = FilePrinter.Builder(
applicationContext.getExternalFilesDir(null)!!
.absolutePath
+ File.separator + "log"
) // 指定保存日志文件的路径
.fileNameGenerator(DateFileNameGenerator()) // 指定日志文件名生成器,默认为 ChangelessFileNameGenerator("log")
.backupStrategy(NeverBackupStrategy()) // 指定日志文件备份策略,默认为 FileSizeBackupStrategy(1024 * 1024)
.build()
XLog.init( // 初始化 XLog
config, // 指定日志配置,如果不指定,会默认使用 new LogConfiguration.Builder().build()
androidPrinter, // 添加任意多的打印器。如果没有添加任何打印器,会默认使用 AndroidPrinter(Android)/ConsolePrinter(java)
consolePrinter,
filePrinter
)
//支付日志文件夹
PayLogFileUtils.initLogPath(applicationContext.getExternalFilesDir(null)!!
.absolutePath
+ File.separator + "payLog")
} }
private fun screenAdapt() { private fun screenAdapt() {
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks { registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
setDensity(activity, this@BaseApplication) setDensity(activity, this@BaseApplication)
XLog.d(DateUtils.format18(Date())+" onActivityCreated")
}
override fun onActivityStarted(activity: Activity) {
XLog.d(DateUtils.format18(Date())+" onActivityStarted")
}
override fun onActivityResumed(activity: Activity) {
XLog.d(DateUtils.format18(Date())+" onActivityResumed")
}
override fun onActivityPaused(activity: Activity) {
XLog.d(DateUtils.format18(Date())+" onActivityPaused")
}
override fun onActivityStopped(activity: Activity) {
XLog.d(DateUtils.format18(Date())+" onActivityStopped")
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
XLog.d(DateUtils.format18(Date())+" onActivitySaveInstanceState")
}
override fun onActivityDestroyed(activity: Activity) {
XLog.d(DateUtils.format18(Date())+" onActivityDestroyed")
} }
override fun onActivityStarted(activity: Activity) {}
override fun onActivityResumed(activity: Activity) {}
override fun onActivityPaused(activity: Activity) {}
override fun onActivityStopped(activity: Activity) {}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
override fun onActivityDestroyed(activity: Activity) {}
}) })
} }
......
...@@ -2,14 +2,17 @@ package com.miya.fastcashier.repository ...@@ -2,14 +2,17 @@ package com.miya.fastcashier.repository
import android.text.TextUtils import android.text.TextUtils
import androidx.annotation.WorkerThread import androidx.annotation.WorkerThread
import com.blankj.utilcode.util.LogUtils
import com.miya.fastcashier.service.AccountService import com.miya.fastcashier.service.AccountService
import com.miya.fastcashier.utils.DateUtils
import com.sdy.miya.moblie.component.pay.core.constance.AppTagConstance import com.sdy.miya.moblie.component.pay.core.constance.AppTagConstance
import com.sdy.miya.moblie.component.pay.core.result.MiYaMobilePayResult import com.sdy.miya.moblie.component.pay.core.result.MiYaMobilePayResult
import com.sdy.miya.moblie.component.pay.core.result.ResultBuilder import com.sdy.miya.moblie.component.pay.core.result.ResultBuilder
import com.sdy.miya.moblie.component.pay.platform.MiYaPlatformPayService import com.sdy.miya.moblie.component.pay.platform.MiYaPlatformPayService
import com.sdy.miya.moblie.component.pay.platform.bean.PayServiceResponse import com.sdy.miya.moblie.component.pay.platform.bean.PayServiceResponse
import java.lang.Exception import java.lang.Exception
import java.util.HashMap import java.text.SimpleDateFormat
import java.util.*
/** /**
* 提供支付、退款的功能 * 提供支付、退款的功能
...@@ -20,39 +23,28 @@ object PayRepository { ...@@ -20,39 +23,28 @@ object PayRepository {
* 支付功能 * 支付功能
*/ */
@WorkerThread @WorkerThread
fun pay(params: Map<String, String>): PayServiceResponse { fun pay(orderNo:String,payPrice:String,token:String,payType:String): PayServiceResponse {
if (params == null) {
throw RuntimeException("MiyaPayServiceComponent startPay params is null") val shopInfo = AccountService.getAccountInfo()?.shopInfo
}
val baseUrl = params["baseUrl"] val baseUrl = shopInfo?.miyaPayPlatformUrl;
val payPrice = params["payPrice"] val signKey = shopInfo?.miyaPayPlatformSignKey
val saasid = shopInfo?.saasid
val payType = params["payType"] val marketid = shopInfo?.storeId
val token = params["token"] val posId = shopInfo?.posId
val goodsDetail = params["goodsDetail"] val cashierCode = shopInfo?.operatorId
val signKey = params["signKey"] val version = "1.5"
val saasid = params["saasid"]
val marketid = params["marketid"] checkNotNull(baseUrl) { "startPay baseUrl is null" }
val posId = params["posId"] checkNotNull(payPrice) { "startPay payPrice is null" }
val cashierCode = params["cashierCode"] checkNotNull(payType) { "startPay payType is null" }
val version = params["version"] checkNotNull(signKey) { "startPay signKey is null" }
val orderNo = params["orderNo"] checkNotNull(saasid) { "startPay saasid is null" }
val memberPhone = params["memberPhone"] checkNotNull(marketid) { " startPay marketid is null" }
checkNotNull(posId) { " startPay posId is null" }
var terminalParams = params["terminalParams"] checkNotNull(cashierCode) { " startPay cashierCode is null" }
val paymentInfoShowMessage = params["paymentInfoShowMessage"] checkNotNull(version) { " startPay version is null" }
checkNotNull(orderNo) { " startPay oderNo is null" }
checkNotNull(baseUrl) { "MiyaPayServiceComponent startPay baseUrl is null" }
checkNotNull(payPrice) { "MiyaPayServiceComponent startPay payPrice is null" }
checkNotNull(payType) { "MiyaPayServiceComponent startPay payType is null" }
checkNotNull(goodsDetail) { "MiyaPayServiceComponent startPay goodsDetail is null" }
checkNotNull(signKey) { "MiyaPayServiceComponent startPay signKey is null" }
checkNotNull(saasid) { "MiyaPayServiceComponent startPay saasid is null" }
checkNotNull(marketid) { "MiyaPayServiceComponent startPay marketid is null" }
checkNotNull(posId) { "MiyaPayServiceComponent startPay posId is null" }
checkNotNull(cashierCode) { "MiyaPayServiceComponent startPay cashierCode is null" }
checkNotNull(version) { "MiyaPayServiceComponent startPay version is null" }
checkNotNull(orderNo) { "MiyaPayServiceComponent startPay oderNo is null" }
val paramsMap: MutableMap<String, Any?> = HashMap(14, 1.0f) val paramsMap: MutableMap<String, Any?> = HashMap(14, 1.0f)
paramsMap["baseUrl"] = baseUrl paramsMap["baseUrl"] = baseUrl
...@@ -63,7 +55,6 @@ object PayRepository { ...@@ -63,7 +55,6 @@ object PayRepository {
paramsMap["cashierCode"] = cashierCode paramsMap["cashierCode"] = cashierCode
paramsMap["version"] = version paramsMap["version"] = version
paramsMap["token"] = token paramsMap["token"] = token
paramsMap["goodsDetail"] = goodsDetail
paramsMap["payPrice"] = payPrice paramsMap["payPrice"] = payPrice
paramsMap["payType"] = payType paramsMap["payType"] = payType
paramsMap["orderNo"] = orderNo paramsMap["orderNo"] = orderNo
...@@ -165,8 +156,6 @@ object PayRepository { ...@@ -165,8 +156,6 @@ object PayRepository {
checkNotNull(signKey) { "signKey is null" } checkNotNull(signKey) { "signKey is null" }
checkNotNull(saasid) { "saasid is null" } checkNotNull(saasid) { "saasid is null" }
checkNotNull(marketid) { "marketid is null" } checkNotNull(marketid) { "marketid is null" }
// checkNotNull(posId) { "posId is null" }
// checkNotNull(cashierCode) { "cashierCode is null" }
checkNotNull(orderNo) { "orderNo is null" } checkNotNull(orderNo) { "orderNo is null" }
val paramsMap: MutableMap<String, Any?> = HashMap(14, 1.0f) val paramsMap: MutableMap<String, Any?> = HashMap(14, 1.0f)
...@@ -180,6 +169,14 @@ object PayRepository { ...@@ -180,6 +169,14 @@ object PayRepository {
paramsMap["payPrice"] = payPrice paramsMap["payPrice"] = payPrice
paramsMap["payType"] = payType paramsMap["payType"] = payType
paramsMap["orderNo"] = orderNo paramsMap["orderNo"] = orderNo
paramsMap["startTime"] = DateUtils.format18(Date())
var date = Date()
val calendar = Calendar.getInstance()
calendar.time = date;
//过期时间设置为超过2个小时即为过期
calendar.add(Calendar.HOUR_OF_DAY,2);
date = calendar.time;
paramsMap["expireTime"] = DateUtils.format18(date)
try { try {
val miYaMobilePayResult = val miYaMobilePayResult =
......
...@@ -32,12 +32,12 @@ import com.tencent.mmkv.MMKV ...@@ -32,12 +32,12 @@ import com.tencent.mmkv.MMKV
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import java.util.* import java.util.*
import kotlin.concurrent.timerTask
/*** /***
* 支付宝付款码 * 支付宝付款码
*/ */
class AliPayCodeActivity : AppCompatActivity() { class AliPayCodeActivity : AppCompatActivity() {
private lateinit var viewModel: PayViewModel private lateinit var viewModel: PayViewModel
private lateinit var binding: ActivityAliPayCodeBinding private lateinit var binding: ActivityAliPayCodeBinding
...@@ -98,7 +98,6 @@ class AliPayCodeActivity : AppCompatActivity() { ...@@ -98,7 +98,6 @@ class AliPayCodeActivity : AppCompatActivity() {
} }
} }
}) })
} }
override fun onStop() { override fun onStop() {
......
...@@ -78,7 +78,7 @@ class LoginActivity : AppCompatActivity() { ...@@ -78,7 +78,7 @@ class LoginActivity : AppCompatActivity() {
if (loginState.usernameError != null) { if (loginState.usernameError != null) {
username.error = getString(loginState.usernameError) username.error = getString(loginState.usernameError)
} }
if (loginState.passwordError != null) { if (loginState.passwordError != null && !TextUtils.isEmpty(password.text)) {
password.error = getString(loginState.passwordError) password.error = getString(loginState.passwordError)
} }
}) })
......
package com.miya.fastcashier.ui
import android.content.Intent
import android.os.Bundle
import android.view.KeyEvent
import android.widget.Toast
import androidx.lifecycle.ViewModelProvider
import com.miya.fastcashier.databinding.ActivityPayBinding
import com.miya.fastcashier.databinding.ActivityRefundBinding
import com.miya.fastcashier.ui.dialog.MessageDialog
import com.miya.fastcashier.ui.dialog.NumberManualDialog
import com.miya.fastcashier.ui.dialog.NumberManualDialog.NumberInputListener
import com.miya.fastcashier.ui.dialog.RefundInfoDialog
import com.miya.fastcashier.utils.CenterToasty
import com.miya.fastcashier.utils.DateUtils
import com.miya.fastcashier.utils.ScanGunKeyEventHelper
import com.miya.fastcashier.utils.clickWithTrigger
import com.miya.fastcashier.viewmodel.PayViewModel
import com.sdy.miya.moblie.component.pay.platform.bean.PayServiceResponse
import com.tencent.mmkv.MMKV
import java.util.*
class PayActivity : BaseActivity() {
private lateinit var viewModel: PayViewModel
private lateinit var binding: ActivityPayBinding
private var scanGunKeyEventHelper: ScanGunKeyEventHelper = ScanGunKeyEventHelper()
private lateinit var price:String
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val kv = MMKV.defaultMMKV()
binding = ActivityPayBinding.inflate(layoutInflater)
setContentView(binding.root)
viewModel = ViewModelProvider(this).get(PayViewModel::class.java)
price = intent.getStringExtra("price").toString()
val tvPayPrice = binding.tvPayPrice
tvPayPrice.text = "¥${price.toDouble()}"
viewModel.payResultLiveData.observe(this, { payResult ->
dismissProgressDialog()
payResult.onFailure {
it.message?.let { it1 -> CenterToasty.error(this, it1,Toast.LENGTH_LONG).show() }
}
payResult.onSuccess {
//自增流水
val today = DateUtils.format8(Date())
var no = kv.getInt(today,0);
kv.putInt(DateUtils.format8(Date()),++no)
val intent = Intent()
intent.setClass(this@PayActivity, PayResultActivity::class.java)
intent.putExtra("payServiceResponse",it)
startActivity(intent)
}
})
val tvBack = binding.tvBack
val ivBack = binding.ivBack
tvBack.clickWithTrigger { finish() }
ivBack.clickWithTrigger { finish() }
scanGunKeyEventHelper.setOnBarCodeCatchListener {
showProgressDialog("正在支付..")
viewModel.pay(price,it)
}
}
override fun dispatchKeyEvent(event: KeyEvent?): Boolean {
scanGunKeyEventHelper.analysisKeyEvent(event)
return super.dispatchKeyEvent(event)
}
}
\ No newline at end of file
...@@ -35,11 +35,21 @@ class PriceInputActivity : BaseActivity() { ...@@ -35,11 +35,21 @@ class PriceInputActivity : BaseActivity() {
val tvBack = binding.tvBack val tvBack = binding.tvBack
val ivBack = binding.ivBack val ivBack = binding.ivBack
val etPrice = binding.etPrice val etPrice = binding.etPrice
// val loading = binding.loading
val numKeyboard = binding.numKeyboard val numKeyboard = binding.numKeyboard
tvScanPayCode.clickWithTrigger { tvScanPayCode.clickWithTrigger {
CenterToasty.normal(this, "暂时不支持此功能", Toast.LENGTH_SHORT).show();
val price = etPrice.text
if(TextUtils.isEmpty(price)){
CenterToasty.error(this,"请输入金额!",Toast.LENGTH_LONG).show()
return@clickWithTrigger
}
val intent = Intent()
intent.setClass(this@PriceInputActivity, PayActivity::class.java)
intent.putExtra("price", price)
startActivity(intent)
} }
tvGeneratePayCode.clickWithTrigger { tvGeneratePayCode.clickWithTrigger {
...@@ -49,7 +59,6 @@ class PriceInputActivity : BaseActivity() { ...@@ -49,7 +59,6 @@ class PriceInputActivity : BaseActivity() {
GeneratePayCodeClickListener { GeneratePayCodeClickListener {
override fun choose(payType: String) { override fun choose(payType: String) {
showProgressDialog("生成付款码") showProgressDialog("生成付款码")
// loading.visibility = View.VISIBLE
viewModel.generatePayCode(etPrice.text.toString(),payType) viewModel.generatePayCode(etPrice.text.toString(),payType)
} }
}) })
...@@ -80,7 +89,7 @@ class PriceInputActivity : BaseActivity() { ...@@ -80,7 +89,7 @@ class PriceInputActivity : BaseActivity() {
currentCode += "." currentCode += "."
etPrice.setText(currentCode) etPrice.setText(currentCode)
} else { } else {
CenterToasty.error(this, "金额格式有误!", Toast.LENGTH_LONG).show() CenterToasty.error(this, "金额格式有误!", Toast.LENGTH_SHORT).show()
} }
} }
else -> { else -> {
...@@ -90,23 +99,23 @@ class PriceInputActivity : BaseActivity() { ...@@ -90,23 +99,23 @@ class PriceInputActivity : BaseActivity() {
currentCode.substring(currentCode.indexOf("."), currentCode.length - 1) currentCode.substring(currentCode.indexOf("."), currentCode.length - 1)
if (tmp.length < 2) { if (tmp.length < 2) {
if (BigDecimal(currentCode + it).compareTo(BigDecimal.ZERO) == 0 && tmp.length == 1) { if (BigDecimal(currentCode + it).compareTo(BigDecimal.ZERO) == 0 && tmp.length == 1) {
CenterToasty.error(this, "金额不能为0!", Toast.LENGTH_LONG).show() CenterToasty.error(this, "金额不能为0!", Toast.LENGTH_SHORT).show()
} else { } else {
currentCode += it currentCode += it
etPrice.setText(currentCode) etPrice.text = currentCode
} }
} else { } else {
CenterToasty.error(this, "金额最多设置2位小数!", Toast.LENGTH_LONG).show() CenterToasty.error(this, "金额最多设置2位小数!", Toast.LENGTH_SHORT).show()
} }
} else { } else {
if (currentCode.startsWith("0") && currentCode.length == 1 && it == 0) { if (currentCode.startsWith("0") && currentCode.length == 1 && it == 0) {
CenterToasty.error(this, "第二位不能输入0!", Toast.LENGTH_LONG).show() CenterToasty.error(this, "第二位不能输入0!", Toast.LENGTH_SHORT).show()
} else { } else {
if (BigDecimal(currentCode + it).compareTo(BigDecimal("99999")) == 1) { if (BigDecimal(currentCode + it).compareTo(BigDecimal("99999")) == 1) {
CenterToasty.error(this, "金额不能超过99999!", Toast.LENGTH_LONG).show() CenterToasty.error(this, "金额不能超过99999!", Toast.LENGTH_SHORT).show()
} else { } else {
currentCode += it currentCode += it
etPrice.setText(currentCode) etPrice.text = currentCode
} }
} }
} }
...@@ -116,7 +125,6 @@ class PriceInputActivity : BaseActivity() { ...@@ -116,7 +125,6 @@ class PriceInputActivity : BaseActivity() {
viewModel.payServiceResponseLiveData.observe(this, { result -> viewModel.payServiceResponseLiveData.observe(this, { result ->
dismissProgressDialog() dismissProgressDialog()
// loading.visibility = View.GONE
result.getOrElse { result.getOrElse {
it.message?.let { it1 -> CenterToasty.error(this, it1, Toast.LENGTH_LONG).show() } it.message?.let { it1 -> CenterToasty.error(this, it1, Toast.LENGTH_LONG).show() }
......
...@@ -25,7 +25,7 @@ import java.math.BigDecimal ...@@ -25,7 +25,7 @@ import java.math.BigDecimal
class NumberManualDialog(context: Context, ) : Dialog(context) { class NumberManualDialog(context: Context, ) : Dialog(context) {
private lateinit var ivClose: ImageView private lateinit var ivClose: ImageView
private lateinit var etNumber: MaterialEditText private lateinit var etNumber: TextView
private lateinit var tvErrInfo: TextView private lateinit var tvErrInfo: TextView
private lateinit var numKeyboard: NumKeyboard private lateinit var numKeyboard: NumKeyboard
private lateinit var numInputFinish: Button private lateinit var numInputFinish: Button
......
...@@ -7,12 +7,14 @@ import androidx.lifecycle.viewModelScope ...@@ -7,12 +7,14 @@ import androidx.lifecycle.viewModelScope
import com.alibaba.fastjson.JSON import com.alibaba.fastjson.JSON
import com.blankj.utilcode.util.LogUtils import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.NumberUtils import com.blankj.utilcode.util.NumberUtils
import com.elvishew.xlog.XLog
import com.miya.fastcashier.beans.LoginRequest import com.miya.fastcashier.beans.LoginRequest
import com.miya.fastcashier.beans.SelfCashierAccountInfo import com.miya.fastcashier.beans.SelfCashierAccountInfo
import com.miya.fastcashier.repository.PayRepository import com.miya.fastcashier.repository.PayRepository
import com.miya.fastcashier.service.AccountService import com.miya.fastcashier.service.AccountService
import com.miya.fastcashier.service.LoginService import com.miya.fastcashier.service.LoginService
import com.miya.fastcashier.service.PrintService import com.miya.fastcashier.service.PrintService
import com.miya.fastcashier.utils.DateUtils
import com.sdy.miya.moblie.component.pay.core.error.ParamInvalidException import com.sdy.miya.moblie.component.pay.core.error.ParamInvalidException
import com.sdy.miya.moblie.component.pay.platform.bean.MiyaOrderRefundResponse import com.sdy.miya.moblie.component.pay.platform.bean.MiyaOrderRefundResponse
import com.sdy.miya.moblie.component.pay.platform.bean.PayServiceResponse import com.sdy.miya.moblie.component.pay.platform.bean.PayServiceResponse
...@@ -29,9 +31,8 @@ class PayViewModel : ViewModel() { ...@@ -29,9 +31,8 @@ class PayViewModel : ViewModel() {
val payServiceResponseLiveData: MutableLiveData<Result<PayServiceResponse>> = MutableLiveData() val payServiceResponseLiveData: MutableLiveData<Result<PayServiceResponse>> = MutableLiveData()
val payResultLiveData: MutableLiveData<Result<PayServiceResponse>> = MutableLiveData() val payResultLiveData: MutableLiveData<Result<PayServiceResponse>> = MutableLiveData()
fun refund(payServiceResponse: PayServiceResponse) { fun refund(payServiceResponse: PayServiceResponse) {
XLog.d("开始退款:${JSON.toJSONString(payServiceResponse)}")
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
//退款 //退款
var refundPayServiceResponse: PayServiceResponse? = null var refundPayServiceResponse: PayServiceResponse? = null
...@@ -43,12 +44,15 @@ class PayViewModel : ViewModel() { ...@@ -43,12 +44,15 @@ class PayViewModel : ViewModel() {
refundParams["refundPrice"] = payServiceResponse.tradPrice; refundParams["refundPrice"] = payServiceResponse.tradPrice;
refundPayServiceResponse = PayRepository.refundByOrderNo(refundParams) refundPayServiceResponse = PayRepository.refundByOrderNo(refundParams)
refundLiveData.postValue(Result.success(refundPayServiceResponse)) refundLiveData.postValue(Result.success(refundPayServiceResponse))
XLog.d("退款成功:${JSON.toJSONString(refundPayServiceResponse)}")
} catch (e: Exception) { } catch (e: Exception) {
XLog.d("退款异常:${e.message}")
refundLiveData.postValue(Result.failure(e)) refundLiveData.postValue(Result.failure(e))
} }
//退款打印 //退款打印
try { try {
XLog.d("开始退款打印")
AccountService.getAccountInfo() AccountService.getAccountInfo()
?.let { refundPayServiceResponse?.let { it1 -> ?.let { refundPayServiceResponse?.let { it1 ->
PrintService.refundPrint(it, PrintService.refundPrint(it,
...@@ -56,6 +60,7 @@ class PayViewModel : ViewModel() { ...@@ -56,6 +60,7 @@ class PayViewModel : ViewModel() {
) )
} } } }
}catch (e: Exception){ }catch (e: Exception){
XLog.d("退款打印异常${e.message}")
refundLiveData.postValue(Result.failure(e)) refundLiveData.postValue(Result.failure(e))
} }
...@@ -69,6 +74,7 @@ class PayViewModel : ViewModel() { ...@@ -69,6 +74,7 @@ class PayViewModel : ViewModel() {
* price 传进来要是分,整数 * price 传进来要是分,整数
*/ */
fun generatePayCode(price: String, payType: String) { fun generatePayCode(price: String, payType: String) {
XLog.d("开始生成主扫码")
if (TextUtils.isEmpty(price)) { if (TextUtils.isEmpty(price)) {
payServiceResponseLiveData.value = Result.failure(ParamInvalidException("请输入金额!")) payServiceResponseLiveData.value = Result.failure(ParamInvalidException("请输入金额!"))
return return
...@@ -83,15 +89,16 @@ class PayViewModel : ViewModel() { ...@@ -83,15 +89,16 @@ class PayViewModel : ViewModel() {
} }
val sassid = AccountService.getAccountInfo()?.shopInfo?.saasid val sassid = AccountService.getAccountInfo()?.shopInfo?.saasid
// val storeId = AccountService.getAccountInfo()?.shopInfo?.storeId
val orderNo = sassid + System.currentTimeMillis() val orderNo = sassid + System.currentTimeMillis()
XLog.d("主扫码订单号${orderNo}")
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
try { try {
val payServiceResponse = PayRepository.generatePayCode(orderNo, priceFen, payType) val payServiceResponse = PayRepository.generatePayCode(orderNo, priceFen, payType)
LogUtils.e("生成付款码:${JSON.toJSONString(payServiceResponse)}")
payServiceResponseLiveData.postValue(Result.success(payServiceResponse)) payServiceResponseLiveData.postValue(Result.success(payServiceResponse))
XLog.d("生成付款码成功${JSON.toJSONString(payServiceResponse)}")
} catch (e: Exception) { } catch (e: Exception) {
XLog.d("生成付款码异常${e.message}")
payServiceResponseLiveData.postValue(Result.failure(e)) payServiceResponseLiveData.postValue(Result.failure(e))
} }
} }
...@@ -105,12 +112,13 @@ class PayViewModel : ViewModel() { ...@@ -105,12 +112,13 @@ class PayViewModel : ViewModel() {
payResultJob = viewModelScope.launch(Dispatchers.IO) { payResultJob = viewModelScope.launch(Dispatchers.IO) {
while (isActive) { while (isActive) {
try { try {
LogUtils.e("支付查询订单号:${payServiceResponse.shopTradeNo}") XLog.d("支付查询订单号:${payServiceResponse.shopTradeNo}")
val payServiceResponseResult = PayRepository.payResultQuery(payServiceResponse.shopTradeNo) val payServiceResponseResult = PayRepository.payResultQuery(payServiceResponse.shopTradeNo)
LogUtils.e("支付查询结果:${JSON.toJSONString(payServiceResponseResult)}") XLog.d("支付查询结果:${JSON.toJSONString(payServiceResponseResult)}")
payResultLiveData.postValue(Result.success(payServiceResponseResult)) payResultLiveData.postValue(Result.success(payServiceResponseResult))
break break
} catch (e: Exception) { } catch (e: Exception) {
XLog.d("支付查询异常:${e.message}")
e.printStackTrace() e.printStackTrace()
payResultLiveData.postValue(Result.failure(e)) payResultLiveData.postValue(Result.failure(e))
Thread.sleep(5000) Thread.sleep(5000)
...@@ -126,14 +134,57 @@ class PayViewModel : ViewModel() { ...@@ -126,14 +134,57 @@ class PayViewModel : ViewModel() {
fun payResultQuery(orderNo: String) { fun payResultQuery(orderNo: String) {
viewModelScope.launch(Dispatchers.IO){ viewModelScope.launch(Dispatchers.IO){
try { try {
LogUtils.e("退款支付查询订单号:${orderNo}") XLog.d("开始退款支付查询:${orderNo}")
val payServiceResponseResult = PayRepository.payResultQuery(orderNo) val payServiceResponseResult = PayRepository.payResultQuery(orderNo)
LogUtils.e("退款支付查询结果:${JSON.toJSONString(payServiceResponseResult)}") XLog.d("退款支付查询成功:${JSON.toJSONString(payServiceResponseResult)}")
payResultLiveData.postValue(Result.success(payServiceResponseResult)) payResultLiveData.postValue(Result.success(payServiceResponseResult))
} catch (e: Exception) { } catch (e: Exception) {
XLog.d("退款支付查询异常:${e.message}")
payResultLiveData.postValue(Result.failure(e)) payResultLiveData.postValue(Result.failure(e))
} }
} }
} }
/**
* 金额是元,首先要转成分
*/
fun pay(price:String,payCode:String){
XLog.d("被扫开始")
if (TextUtils.isEmpty(price)) {
payResultLiveData.value = Result.failure(ParamInvalidException("请输入金额!"))
return
}
if (TextUtils.isEmpty(payCode)) {
payResultLiveData.value = Result.failure(ParamInvalidException("付款码为空!"))
return
}
val priceFen: String
try {
priceFen = price.toDouble().times(100).toInt().toString()
} catch (e: java.lang.Exception) {
payResultLiveData.value = Result.failure(ParamInvalidException("金额有误!"))
return
}
val sassid = AccountService.getAccountInfo()?.shopInfo?.saasid
val orderNo = sassid + System.currentTimeMillis()
XLog.d("被扫参数 orderNo = ${orderNo} price = ${priceFen} payCode = ${payCode}" )
viewModelScope.launch(Dispatchers.IO) {
try {
//0代表不分类别付款
val payServiceResponse = PayRepository.pay(orderNo, priceFen,payCode, "0")
payResultLiveData.postValue(Result.success(payServiceResponse))
XLog.d("被扫支付成功${JSON.toJSONString(payServiceResponse)}" )
} catch (e: Exception) {
payResultLiveData.postValue(Result.failure(e))
XLog.d("被扫支付异常${JSON.toJSONString(e.message)}" )
}
}
}
} }
\ No newline at end of file
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
android:background="@color/blue" android:background="@color/blue"
android:focusable="true" android:focusable="true"
android:focusableInTouchMode="true" android:focusableInTouchMode="true"
android:keepScreenOn="true"
tools:context=".ui.PriceInputActivity"> tools:context=".ui.PriceInputActivity">
<TextView <TextView
...@@ -92,7 +93,7 @@ ...@@ -92,7 +93,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="44dp" android:layout_marginBottom="44dp"
android:textColor="#878E9D" android:textColor="#878E9D"
android:text="请在1分钟内扫描二维码付款" android:text="请在2个小时内扫描二维码付款"
android:textSize="24sp"/> android:textSize="24sp"/>
<ImageView <ImageView
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary"
android:focusable="true"
android:focusableInTouchMode="true"
tools:context=".ui.PriceInputActivity">
<TextView
android:id="@+id/tvBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="60dp"
android:layout_marginLeft="60dp"
android:layout_marginTop="32dp"
android:text="@string/back"
android:textColor="@color/white"
android:textSize="24sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/ivBack"
android:layout_width="24dp"
android:layout_height="48dp"
android:contentDescription="@string/back"
android:padding="6dp"
android:src="@mipmap/ic_left_arrow"
app:layout_constraintBottom_toBottomOf="@+id/tvBack"
app:layout_constraintEnd_toStartOf="@+id/tvBack"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/tvBack" />
<ImageView
android:layout_width="195dp"
android:layout_height="20dp"
android:layout_marginEnd="32dp"
android:layout_marginRight="32dp"
android:src="@mipmap/ic_logo_white"
app:layout_constraintBottom_toBottomOf="@+id/tvBack"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/tvBack" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="87dp"
android:background="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/tvScanGuide"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="148dp"
android:text="请长按唤起红外扫描订单条码"
android:textColor="#141C30"
android:textSize="36sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tvPayPriceHint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="281dp"
android:text="收款金额"
android:textColor="#141C30"
android:layout_marginEnd="5dp"
android:textSize="32sp"
app:layout_constraintEnd_toStartOf="@+id/guideline"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginRight="5dp" />
<TextView
android:id="@+id/tvPayPrice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="273dp"
android:text="¥98.5"
android:textColor="#141C30"
android:layout_marginStart="5dp"
android:textSize="48sp"
android:textStyle="bold"
app:layout_constraintStart_toEndOf="@id/guideline"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginLeft="5dp" />
<ImageView
android:layout_width="541dp"
android:layout_height="386dp"
android:layout_marginTop="46dp"
android:src="@mipmap/app_refund_code_scan_guide"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvPayPrice" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="360dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -81,13 +81,13 @@ ...@@ -81,13 +81,13 @@
android:background="#89889A" android:background="#89889A"
android:layout_marginLeft="32dp" /> android:layout_marginLeft="32dp" />
<com.rengwuxian.materialedittext.MaterialEditText <TextView
android:id="@+id/etPrice" android:id="@+id/etPrice"
android:layout_width="591dp" android:layout_width="591dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:hint="输入收款金额" android:hint="输入收款金额"
app:met_textColorHint="#89889A" android:textColor="@color/white"
app:met_textColor="@color/white" android:textColorHint="#89889A"
android:textAlignment="textEnd" android:textAlignment="textEnd"
android:textSize="47sp" android:textSize="47sp"
android:paddingTop="5dp" android:paddingTop="5dp"
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
android:id="@+id/cPayCodeBg" android:id="@+id/cPayCodeBg"
android:background="@color/green" android:background="@color/green"
android:focusable="true" android:focusable="true"
android:keepScreenOn="true"
android:focusableInTouchMode="true" android:focusableInTouchMode="true"
tools:context=".ui.PriceInputActivity"> tools:context=".ui.PriceInputActivity">
...@@ -92,7 +93,7 @@ ...@@ -92,7 +93,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="44dp" android:layout_marginBottom="44dp"
android:textColor="#878E9D" android:textColor="#878E9D"
android:text="请在1分钟内扫描二维码付款" android:text="请在2个小时内扫描二维码付款"
android:textSize="24sp"/> android:textSize="24sp"/>
<ImageView <ImageView
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
android:layout_marginRight="38dp" /> android:layout_marginRight="38dp" />
<com.rengwuxian.materialedittext.MaterialEditText <TextView
android:id="@+id/etNumber" android:id="@+id/etNumber"
android:layout_width="510dp" android:layout_width="510dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
...@@ -40,14 +40,26 @@ ...@@ -40,14 +40,26 @@
android:layout_marginStart="46dp" android:layout_marginStart="46dp"
android:layout_marginEnd="46dp" android:layout_marginEnd="46dp"
android:hint="请输入" android:hint="请输入"
android:textColorHint="#C8C7CC"
android:gravity="center_horizontal" android:gravity="center_horizontal"
android:textSize="36sp" android:textSize="36sp"
android:inputType="textEmailAddress" android:textColor="#141C30"
android:selectAllOnFocus="true" android:selectAllOnFocus="true"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_width="match_parent"
android:layout_height="1dp"
app:layout_constraintStart_toStartOf="@+id/numKeyboard"
app:layout_constraintEnd_toEndOf="@+id/numKeyboard"
android:layout_marginTop="12dp"
android:layout_marginLeft="105dp"
android:layout_marginRight="105dp"
android:background="#E6E9EF"
app:layout_constraintTop_toBottomOf="@+id/etNumber"/>
<TextView <TextView
android:id="@+id/tvErrInfo" android:id="@+id/tvErrInfo"
android:layout_width="wrap_content" android:layout_width="wrap_content"
......
File added
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment