* */
@PostMapping("/balance/pay")
fun balancePay(@RequestBody param: CitizenCardPayinitParam, authentication: Authentication): ResponseEntity<Any> {
- try {
- if (param.checkParam() && param.checkSign(commonService.getSecretByAppid(authentication.name))) {
- return ResponseEntity.ok(ResponseBodyBuilder.create()
- .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
- }
-
- val person = userService.findPersonByIdentityCheckStatus(param.cardNo)
- if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_BALANCE)) {
- val account = accountUtilServcie.readAccount(person.userid)
- val shopacc = accountUtilServcie.readShopbyShopaccno(param.shopaccno)
+ if(!param.checkSign(commonService.getSecretByAppid(authentication.name))){
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
+ }
- val dtl = TransactionBuilder().apply {
- setTransInfo(param.transdate, param.transtime,
- TradeCode.TRANSCODE_BALANCE_PAY,
- TradeDict.PAYTYPE_BALANCE)
- setOutTransInfo(shopacc.shopaccno, param.billno)
- operator(param.shopaccno, TradeDict.OPERTYPE_SHOP)
- payinfo = "账户余额消费"
- description = "账户余额消费"
- }.person(account).apply {
- setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_OUT)
- opposite = AccountProxy(shopacc)
- }.and().shop(shopacc).apply {
- setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_IN)
- opposite = AccountProxy(account)
- }.and().also { builder ->
- param.feelist?.forEach {
- when (it.feetype) {
- TradeDict.FEETYPE_CONSUME_MEALER -> {
- consumeMealer(param, builder, it, account, shopacc)
- }
- TradeDict.FEETYPE_CONSUME_DISCOUNT -> {
- consumeDiscount(param, builder, it, account, shopacc)
+ val person = userService.findPersonByIdentityCheckStatus(param.cardNo)
+ if(consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_BALANCE)) {
+ val account = accountUtilServcie.readAccount(person.userid)
+ val shopacc = accountUtilServcie.readShopbyShopaccno(param.shopaccno)
+
+ val dtl = TransactionBuilder().apply {
+ setTransInfo(param.transdate, param.transtime,
+ TradeCode.TRANSCODE_BALANCE_PAY,
+ TradeDict.PAYTYPE_BALANCE)
+ setOutTransInfo(shopacc.shopaccno, param.billno)
+ operator(param.shopaccno, TradeDict.OPERTYPE_SHOP)
+ payinfo = param.cardNo //fixme: 卡号或其他唯一信息
+ description = "账户余额消费"
+ }.person(account).apply {
+ setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_OUT)
+ opposite = AccountProxy(shopacc)
+ }.and().shop(shopacc).apply {
+ setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_IN)
+ opposite = AccountProxy(account)
+ }.and().addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc),
+ param.amount / 100.0, "账户余额消费")
+ .also { builder ->
+ param.feelist?.forEach {
+ val feeamt = it.amount / 100.0
+ when (it.feetype) {
+ TradeDict.FEETYPE_CONSUME_MEALER -> {
+ //搭伙费
+ val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_MEALER, TradeDict.PAYTYPE_BALANCE)
+ val subject = accountUtilServcie.readSubject(feetypeConfig.crsubjno) //不同在贷方科目
+ when (Subject.SUBJNO_MACHANT_INCOME == subject.subjno) {
+ true -> builder.addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc), feeamt, feetypeConfig.summary) //商户收
+ false -> builder.addDebitCreditRecord(AccountProxy(account), AccountProxy(subject), feeamt, feetypeConfig.summary) //其他科目
+ }
+ }
+ TradeDict.FEETYPE_CONSUME_DISCOUNT -> {
+ //优惠折扣
+ val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_DISCOUNT, TradeDict.PAYTYPE_BALANCE)
+ val subject = accountUtilServcie.readSubject(feetypeConfig.drsubjno) //不同在借方科目
+ builder.addDebitCreditRecord(AccountProxy(subject), AccountProxy(shopacc), feeamt, feetypeConfig.summary)
+
+ }
+ else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+ "账户余额支付费用清单不支持feetype<${it.feetype}>")
}
- else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
- "支付费率清单不支持feetype<${it.feetype}>")
}
- }
- }.init(transactionService)
+ }.init(transactionService)
- transactionService.success(dtl.refno)
-
- return ResponseEntity.ok(ResponseBodyBuilder.create()
- .data("refno", dtl.refno)
- .data("amount", dtl.personDtl.amount)
- .success("交易成功"))
- }
+ transactionService.success(dtl.refno)
return ResponseEntity.ok(ResponseBodyBuilder.create()
- .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<账户余额>"))
-
- } catch (ex: RequestParamCheckException) {
- return ResponseEntity.ok(ResponseBodyBuilder.create()
- .requestException(ex, "请求参数错误"))
- } catch (et: TransactionException) {
- return ResponseEntity.ok(ResponseBodyBuilder.create()
- .transException(et, "业务处理错误"))
+ .data("refno", dtl.refno)
+ .data("billno", dtl.outTradeNo)
+ .data("amount", dtl.personDtl.amount)
+ .success("交易成功"))
}
+
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<账户余额>"))
}