Merge tag '1.0.25' into develop
authorkaixiang.xia <kaixiang.xia@supwisdom.com>
Wed, 9 Sep 2020 01:55:42 +0000 (09:55 +0800)
committerkaixiang.xia <kaixiang.xia@supwisdom.com>
Wed, 9 Sep 2020 01:55:42 +0000 (09:55 +0800)
积分模块

1  2 
payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java
payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt
payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt

@@@ -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);
++
  }
@@@ -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<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"))
+     }
+ }
@@@ -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 {
              }
  
              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);
+             }
          }
      }
  
          }
      }
  
 +    fun findTransactionByRefno(refno: String): TTransactionMain? {
 +        return transactionMainDao.findByRefno(refno)
 +    }
++
  }