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<Any> {
.success("ok"))
}
- }
+ @PostMapping("/biz_init")
+ fun userBizInit(@RequestBody @Validated(InitAction::class) request: CardBizParam): ResponseEntity<Any> {
+ val builder = TransactionBuilder().apply {
+ setTransInfo(request.transdate, request.transtime, TradeCode.TRANSCODE_CARD_BIZ, "balance")
+ setOutTransInfo(request.operid, request.operSeqno)
+ dtltype = "cardservice"
+ }
+ val transDesc = arrayListOf<String>()
+ 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<Any> {
+ 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<Any> {
+ 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<Any> {
+ 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<Any> {
+ 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)
+ }
- return if(ret.get("code")==200){
++
+ @PostMapping("/userTask")
+ fun userTask(@RequestBody param: UserTaskParam): ResponseEntity<Any> {
+ val ret = pointsService.finishTask(param.userid, param.taskid)
- }else{
++ return if (ret.get("code") == 200) {
+ ResponseEntity.ok(ResponseBodyBuilder.create()
+ .success("ok"))
- return if(ret.get("code")==200){
++ } else {
+ ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(500, ret.get("msg") as String))
+ }
+ }
++
+ @PostMapping("/getTask")
+ fun getTPointsTaskNoPage(): ResponseEntity<Any> {
+ val ret = pointsService.getTPointsTaskNoPage()
- }else{
++ return if (ret.get("code") == 200) {
+ ResponseEntity.ok(ResponseBodyBuilder.create().data("ret", ret.get("dataList")!!)
+ .success("ok"))
- return ResponseEntity.ok(ResponseBodyBuilder.create().data("page", ret!!)
- .success("ok"))
++ } else {
+ ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(500, ret.get("msg") as String))
+ }
+ }
++
+ @PostMapping("/getUserPoints")
+ fun getUserPoints(@RequestBody param: UserPointsParam): ResponseEntity<Any> {
+ 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"))
+ }
+ }