From: kaixiang.xia Date: Wed, 9 Sep 2020 01:55:42 +0000 (+0800) Subject: Merge tag '1.0.25' into develop X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=5652a7b01bd8b0aa4530de1302e2ba0a0c789bb6;p=epayment%2Ffood_payapi.git Merge tag '1.0.25' into develop 积分模块 --- 5652a7b01bd8b0aa4530de1302e2ba0a0c789bb6 diff --cc payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java index 7a17aec3,c8035356..1ab688d7 --- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java +++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java @@@ -24,18 -26,12 +24,28 @@@ public interface UserProxy @PostMapping("/api/user/testmsg") ApiResponse testmsg(); + @PostMapping("/api/user/biz_init") + CardBizResponse bizInit(@RequestBody CardBizParam param); + + @PostMapping("/api/user/biz_confirm") + CardBizResponse bizConfirm(@RequestBody CardBizParam param); + + @PostMapping("/api/user/biz_refund_init") + CardBizResponse bizRefundInit(@RequestBody CardBizRefundParam param); + + @PostMapping("/api/user/biz_refund") + CardBizResponse bizRefund(String refno); + + @RequestMapping(value = "/api/user/biz_query", method = RequestMethod.GET) + CardBizResponse bizQuery(@RequestParam("refno") String refno); ++ + @PostMapping("/api/user/userTask") + ApiResponse userTask(); + + @PostMapping("/api/user/getTask") + ApiResponse getTPointsTaskNoPage(); + + @PostMapping("/api/user/getUserPoints") + ApiResponse getUserPoints(@RequestBody UserPointsParam param); ++ } diff --cc payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt index baa1e34e,94b077b4..6fd04a46 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt @@@ -1,43 -1,36 +1,50 @@@ package com.supwisdom.dlpay.api.controller +import com.supwisdom.dlpay.api.TransactionBuilder import com.supwisdom.dlpay.api.bean.* +import com.supwisdom.dlpay.api.bean.groups.ConfirmAction +import com.supwisdom.dlpay.api.bean.groups.InitAction import com.supwisdom.dlpay.api.exception.RequestParamCheckException -import com.supwisdom.dlpay.api.service.CardService -import com.supwisdom.dlpay.api.service.KafkaSendMsgService -import com.supwisdom.dlpay.api.service.UserService +import com.supwisdom.dlpay.api.service.* +import com.supwisdom.dlpay.exception.TransactionCheckException import com.supwisdom.dlpay.exception.TransactionException -import com.supwisdom.dlpay.exception.TransactionProcessException import com.supwisdom.dlpay.framework.ResponseBodyBuilder -import com.supwisdom.dlpay.framework.service.CommonService +import com.supwisdom.dlpay.framework.tenant.TenantContext +import com.supwisdom.dlpay.framework.util.Subject +import com.supwisdom.dlpay.framework.util.TradeCode +import com.supwisdom.dlpay.framework.util.TradeDict import com.supwisdom.dlpay.framework.util.TradeErrorCode + import com.supwisdom.dlpay.system.bean.LevelBean + import com.supwisdom.dlpay.system.service.PointsService import org.springframework.beans.factory.annotation.Autowired import org.springframework.http.ResponseEntity +import org.springframework.validation.annotation.Validated import org.springframework.web.bind.annotation.* import java.net.URLDecoder -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse +import javax.validation.Valid +import kotlin.math.roundToInt @RestController @RequestMapping("/api/user") class UserAPIController { @Autowired private lateinit var useService: UserService + + @Autowired + private lateinit var accountUtilServcie: AccountUtilServcie ++ @Autowired private lateinit var cardService: CardService ++ @Autowired private lateinit var kafkaSendMsgService: KafkaSendMsgService + + @Autowired + private lateinit var pointsService: PointsService + + @Autowired + private lateinit var transactionService: TransactionServiceProxy + @PostMapping("/open") fun openAccount(@RequestBody param: OpenUserParam): ResponseEntity { @@@ -169,204 -162,37 +176,240 @@@ .success("ok")) } + @PostMapping("/biz_init") + fun userBizInit(@RequestBody @Validated(InitAction::class) request: CardBizParam): ResponseEntity { + val builder = TransactionBuilder().apply { + setTransInfo(request.transdate, request.transtime, TradeCode.TRANSCODE_CARD_BIZ, "balance") + setOutTransInfo(request.operid, request.operSeqno) + dtltype = "cardservice" + } + val transDesc = arrayListOf() + transDesc.add(request.summary) + val result = CardBizResponse() + + val user = useService.findAccountByUserid(request.userid, null) + ?: return ResponseBodyBuilder.failEntity(result, + TradeErrorCode.ACCOUNT_NOT_EXISTS, + "用户ID ${request.userid} 不存在") + + if (user.transStatus != TradeDict.STATUS_NORMAL) { + return ResponseBodyBuilder.failEntity(result, + TradeErrorCode.ACCOUNT_NOT_EXISTS, + "用户ID ${request.userid} 状态异常") + } + + val capitalSubj = accountUtilServcie.readSubject(request.capitalSubjno) + + builder.person(user).apply { + setAmount(request.totalAmount / 100.0, TradeDict.TRADE_FLAG_IN) + setOpposite(capitalSubj.subjno, capitalSubj.subjname) + } + + + val depositAmount = request.totalAmount - request.cost - request.cashPledge - request.charge + + when (request.inOrOut) { + TradeDict.TRADE_FLAG_IN -> { + request.totalAmount != 0 + } + TradeDict.TRADE_FLAG_OUT -> { + request.totalAmount != 0 + } + else -> false + }.takeIf { + !it + }?.apply { + return ResponseBodyBuilder.failEntity(result, + TradeErrorCode.INPUT_DATA_ERROR, "资金方案向错误或交易金额有误") + } + if (request.totalAmount != 0) { + if (request.inOrOut == TradeDict.TRADE_FLAG_IN) { + if (depositAmount != 0) { + builder.addDebitCreditRecord(capitalSubj.subjno, capitalSubj.subjno, + user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT, request.totalAmount / 100.0, request.summary) + transDesc.add("充值 %.2f 元".format(depositAmount / 100.0)) + } + if (request.cost != 0) { + val subject = accountUtilServcie.readSubject(Subject.SUBJNO_CARD_COST) + builder.addDebitCreditRecord(user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT, + subject.subjno, subject.subjno, request.cost / 100.0, + request.summary) + transDesc.add("收%s %.2f 元".format(subject.subjname, request.cost / 100.0)) + } + if (request.cashPledge != 0) { + val subject = accountUtilServcie.readSubject(Subject.SUBJNO_FOREGIFT) + builder.addDebitCreditRecord(user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT, + subject.subjno, subject.subjno, request.cashPledge / 100.0, + request.summary) + transDesc.add("收%s %.2f 元".format(subject.subjname, request.cashPledge / 100.0)) + } + if (request.charge != 0) { + val subject = accountUtilServcie.readSubject(Subject.SUBJNO_SERVICEFEE_DEFAULT) + builder.addDebitCreditRecord(user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT, + subject.subjno, subject.subjno, request.charge / 100.0, + request.summary) + transDesc.add("收%s %.2f 元".format(subject.subjname, request.charge / 100.0)) + } + } else { + if (depositAmount != 0) { + builder.addDebitCreditRecord(user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT, + capitalSubj.subjno, capitalSubj.subjno, request.totalAmount / 100.0, request.summary) + transDesc.add("退余额 %.2f 元".format(depositAmount / 100.0)) + } + if (request.cost != 0) { + val subject = accountUtilServcie.readSubject(Subject.SUBJNO_CARD_COST) + builder.addDebitCreditRecord(subject.subjno, subject.subjno, + user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT, + request.cost / 100.0, request.summary) + transDesc.add("退%s %.2f 元".format(subject.subjname, request.cost / 100.0)) + } + if (request.cashPledge != 0) { + val subject = accountUtilServcie.readSubject(Subject.SUBJNO_FOREGIFT) + builder.addDebitCreditRecord(subject.subjno, subject.subjno, + user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT, + request.cashPledge / 100.0, request.summary) + transDesc.add("退%s %.2f 元".format(subject.subjname, request.cashPledge / 100.0)) + } + if (request.charge != 0) { + val subject = accountUtilServcie.readSubject(Subject.SUBJNO_SERVICEFEE_DEFAULT) + builder.addDebitCreditRecord(subject.subjno, subject.subjno, + user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT, + request.charge / 100.0, request.summary) + transDesc.add("退%s %.2f 元".format(subject.subjname, request.charge / 100.0)) + } + } + } + builder.description = transDesc.joinToString(";") + val transaction = transactionService.init(builder) + + result.apply { + accdate = transaction.accdate + refno = transaction.refno + description = builder.description + transStatus = transaction.status + } + return ResponseBodyBuilder.successEntity(result, "${request.summary}初始化成功") + } + + @PostMapping("/biz_confirm") + fun userBizConfirm(@RequestBody @Validated(ConfirmAction::class) request: CardBizParam): ResponseEntity { + val transaction = transactionService.success(request.refno) + val response = CardBizResponse().apply { + accdate = transaction.accdate + refno = transaction.refno + description = transaction.personDtl.transdesc + accountBal = (transaction.personDtl.aftbal * 100).roundToInt() + transStatus = transaction.status + } + return ResponseBodyBuilder.successEntity(response, "${request.summary}确认成功") + } + + @PostMapping("/biz_refund_init") + fun userBizRefundInit(@RequestBody @Validated(InitAction::class) request: CardBizRefundParam): ResponseEntity { + val result = CardBizResponse() + val originTrans = transactionService.findTransactionByRefno(request.originRefno) + ?: return ResponseBodyBuilder.failEntity(result, TradeErrorCode.TRANSACTION_NOT_EXISTS, + "退款原交易参考号不存在") + if (originTrans.tenantid != TenantContext.getTenantSchema()) { + return ResponseBodyBuilder.failEntity(result, TradeErrorCode.INPUT_DATA_ERROR, + "退款交易参考号租户错误") + } + + if (!originTrans.person) { + return ResponseBodyBuilder.failEntity(result, TradeErrorCode.INPUT_DATA_ERROR, + "指定交易流水没有个人交易明细,无法退款") + } + + val builder = TransactionBuilder().apply { + this.setTransInfo(request.transdate, request.transtime, TradeCode.TRANSCODE_CARD_BIZ, + "balance") + this.setOutTransInfo(request.operid, request.operSeqno) + } + val transaction = builder.refundInit(request.originRefno, request.totalAmount / 100.0, + transactionService) + + result.apply { + refno = transaction.refno + accdate = transaction.accdate + transStatus = transaction.status + if (transaction.person) { + description = transaction.personDtl.transdesc + } + } + return ResponseBodyBuilder.successEntity(result, "初始化成功") + } + + @PostMapping("/biz_refund") + fun userBizRefund(refno: String): ResponseEntity { + val result = CardBizResponse() + val transaction = transactionService.success(refno) + result.apply { + this.refno = transaction.refno + accdate = transaction.accdate + transStatus = transaction.status + if (transaction.person) { + description = transaction.personDtl.transdesc + accountBal = (transaction.personDtl.aftbal * 100.0).roundToInt() + } + } + return ResponseBodyBuilder.failEntity(result, TradeErrorCode.INPUT_DATA_ERROR, "未实现") + } + + @GetMapping("/biz_query") + fun userBizQuery(refno: String): ResponseEntity { + val transaction = transactionService.findTransactionByRefno(refno) + ?: throw TransactionCheckException(TradeErrorCode.TRANSACTION_NOT_EXISTS + , "交易不存在") + val result = CardBizResponse() + if (transaction.tenantid != TenantContext.getTenantSchema()) { + return ResponseBodyBuilder.failEntity(result, TradeErrorCode.INPUT_DATA_ERROR, + "非本租户交易参考号") + } + result.apply { + this.refno = transaction.refno + accdate = transaction.accdate + if (transaction.person) { + description = transaction.personDtl.transdesc + accountBal = (transaction.personDtl.aftbal * 100.0).roundToInt() + } + transStatus = transaction.status + } + return ResponseBodyBuilder.successEntity(result) + } - } ++ + @PostMapping("/userTask") + fun userTask(@RequestBody param: UserTaskParam): ResponseEntity { + val ret = pointsService.finishTask(param.userid, param.taskid) - return if(ret.get("code")==200){ ++ return if (ret.get("code") == 200) { + ResponseEntity.ok(ResponseBodyBuilder.create() + .success("ok")) - }else{ ++ } else { + ResponseEntity.ok(ResponseBodyBuilder.create() + .fail(500, ret.get("msg") as String)) + } + } ++ + @PostMapping("/getTask") + fun getTPointsTaskNoPage(): ResponseEntity { + val ret = pointsService.getTPointsTaskNoPage() - return if(ret.get("code")==200){ ++ return if (ret.get("code") == 200) { + ResponseEntity.ok(ResponseBodyBuilder.create().data("ret", ret.get("dataList")!!) + .success("ok")) - }else{ ++ } else { + ResponseEntity.ok(ResponseBodyBuilder.create() + .fail(500, ret.get("msg") as String)) + } + } ++ + @PostMapping("/getUserPoints") + fun getUserPoints(@RequestBody param: UserPointsParam): ResponseEntity { + var lev = LevelBean() + lev.name = param.name + lev.idno = param.idno + lev.pageNo = param.pageNo + lev.pageSize = param.pageSize + val ret = pointsService.getTPointsByname(lev); - return ResponseEntity.ok(ResponseBodyBuilder.create().data("page", ret!!) - .success("ok")) ++ return ResponseEntity.ok(ResponseBodyBuilder.create().data("page", ret!!) ++ .success("ok")) + } + } diff --cc payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt index 2e0ff912,dbb56813..33e9f2f1 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt @@@ -68,8 -65,12 +69,12 @@@ class TransactionServiceProxy private lateinit var shopAccBalanceAsyncTask: ShopAccBalanceAsyncTask @Autowired - private lateinit var kafkaSendMsgService: KafkaSendMsgService + private lateinit var transactionMainDao: TransactionMainDao + @Autowired + private lateinit var pointsService: PointsService + + fun init(builder: TransactionBuilder): TTransactionMain { try { @@@ -104,11 -105,19 +109,22 @@@ } if (it.person && !it.personDtl.userid.isNullOrEmpty()) { - kafkaSendMsgService.sendJpushMessage(it.personDtl.userid, "交易提醒", "你有一笔${it.personDtl.amount}元的支出,点击查看详情", it.refno, mutableMapOf(), it.tenantid) + kafkaSendMsgService.sendJpushMessage(it.personDtl.userid, + "交易提醒", + "你有一笔${it.personDtl.amount}元的支出,点击查看详情", + it.refno, mutableMapOf(), it.tenantid) } + if(-it.personDtl.amount>=0) { + //支付成功 进行积分处理 + pointsService.singleHandlePoints(it.personDtl.userid, -it.personDtl.amount, refno); + pointsService.dayHandlePoints(it.personDtl.userid, refno); + pointsService.monthHandlePoints(it.personDtl.userid, refno); + // pointsService.pointsOutdate(); + pointsService.pointsCompensate(); + }else { + //退款之后进行积分处理 + pointsService.refundHandlePoints(it.personDtl.userid, it.reverseRefno); + } } } @@@ -144,7 -153,4 +160,8 @@@ } } + fun findTransactionByRefno(refno: String): TTransactionMain? { + return transactionMainDao.findByRefno(refno) + } ++ }