第三方支付:一卡通
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java b/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
index b570823..8465572 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
@@ -24,6 +24,7 @@
   public static final String DTL_STATUS_SUCCESS = "success";
   public static final String DTL_STATUS_FAIL = "fail";
   public static final String DTL_STATUS_CANCEL = "cancel";
+  public static final String DTL_STATUS_WIP = "wip";
 
   /**
    * 交易借方
diff --git a/src/main/kotlin/com/supwisdom/dlpay/consume/ThirdPayCall.kt b/src/main/kotlin/com/supwisdom/dlpay/consume/ThirdPayCall.kt
new file mode 100644
index 0000000..3070350
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/consume/ThirdPayCall.kt
@@ -0,0 +1,95 @@
+package com.supwisdom.dlpay.consume
+
+import com.google.gson.Gson
+import com.sun.jersey.api.client.Client
+import com.sun.jersey.api.client.ClientResponse
+import com.supwisdom.dlpay.consume.bean.BaseResp
+import com.supwisdom.dlpay.consume.bean.SupStatusRevResp
+import com.supwisdom.dlpay.consume.bean.SupYktResp
+import com.supwisdom.dlpay.consume.domain.TUserdtl
+import com.supwisdom.dlpay.util.HmacUtil
+import com.supwisdom.dlpay.util.MoneyUtil
+
+/**
+ * Created by shuwei on 2019/4/11.
+ */
+class CallService {
+
+    companion object {
+        fun callYktPay(config: Map<String, String>, paydtl: TUserdtl, time: String, callback: (code: BaseResp) -> Unit) {
+            lateinit var code:BaseResp
+
+            var appid = config["appid"]
+            var appkey = config["appkey"]
+            var orderurl = config["orderurl"]
+
+            var params = hashMapOf<String, String?>()
+            params.put("partner_id", appid)
+            params.put("stuempno", "")
+            params.put("tradeno", paydtl.refno)
+            params.put("tradename", paydtl.payinfo)
+            params.put("amount", MoneyUtil.YuanToFen(paydtl.amount).toString())
+            params.put("shopid", "")
+            params.put("devphyid", "")
+            params.put("calcmanagefee", "T") //是否计算费率
+            params.put("timestamp", time)
+            params.put("sign_method", "HMAC");
+            params.put("limitflag", "off") //是否判断消费限额,on-判断;off-不判断。默认on(判断限额)。为空或不为off都是on;
+            var signstr = HmacUtil.createLinkString(HmacUtil.paraFilter(params))
+            var sign = HmacUtil.HMACSHA1(signstr, appkey)
+            signstr += "&sign=" + sign + "&sourcetype=food"
+            var c = Client.create ()
+            c.setConnectTimeout(20000)
+            var r = c.resource (orderurl)
+            var respClient = r.post(ClientResponse::class.java, signstr)
+            if (200 == respClient.status) {
+                var ret = respClient.getEntity(String::class.java)
+                if (ret != null) {
+                    try {
+                        lateinit var gson:Gson
+                        var result = gson.fromJson(ret, SupYktResp::class.java)
+                        if (result == null) {
+                            code.retcode = "1"
+                            code.retmsg = "返回内容为空"
+                            callback(code)
+                            return
+                        }
+                        if (!"0".equals(result.getRetcode())) {
+                            if ("30".equals(result.getRetcode())) {
+                                if (result.getOther() != null) {
+                                    try {
+                                        var supStatusRevResp = gson.fromJson (result.getOther(), SupStatusRevResp::class.java)
+                                        if (supStatusRevResp != null) {
+                                            //同流水号,同一笔已经支付完成的,不重复支付。
+                                            if (3 == supStatusRevResp.getStatus() && supStatusRevResp.getRevflag() != null && !supStatusRevResp.getRevflag()) {
+                                                code.retcode = "0"
+                                                code.retmsg = "成功"
+                                                callback(code)
+                                                return
+                                            }
+                                        }
+                                    } catch (e: Exception ) {
+                                        e.printStackTrace()
+                                    }
+                                }
+                            }
+                            code.retcode = "1"
+                            code.retmsg = "交易失败:" + result.getRetmsg()
+                            callback(code)
+                            return
+                        }
+                        code.retcode = "0"
+                        code.retmsg = "成功"
+                        callback(code)
+                        return
+                    } catch (e: Exception) {
+                        e.printStackTrace()
+                    }
+                }
+            }
+            code.retcode = "1"
+            code.retmsg = "请求失败"
+            callback(code)
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt b/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt
index 6e17cef..8a5ac0a 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt
@@ -9,6 +9,7 @@
 import com.supwisdom.dlpay.framework.domain.TShopacc
 import com.supwisdom.dlpay.framework.domain.TSubject
 import com.supwisdom.dlpay.framework.domain.TTranstype
+import com.supwisdom.dlpay.framework.util.TradeDict
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
 
 class AccountHolder<T> private constructor(val accountId: String, val idType: Int) {
@@ -74,6 +75,13 @@
     var overdraft = false
     var description = ""
 
+    /**
+     * 学工号,一卡通商户号 -- 第三方支付一卡通使用
+     * */
+    var stuempno = ""
+    var yktshopid = ""
+
+
     // 内部参数,不需要调用者处理
     val details = mutableListOf<TransDetail>()
     var amount: Double = 0.0
@@ -95,6 +103,16 @@
         return this
     }
 
+    fun setStuempno(s:String):PersonTransBuilder{
+        this.stuempno = s
+        return this
+    }
+
+    fun setYktshopid(s:String):PersonTransBuilder{
+        this.yktshopid = s
+        return this
+    }
+
     private fun prepareData() {
         amount = 0.0
         amount = this.details.sumByDouble { it.amount }
@@ -165,6 +183,15 @@
      */
     fun done(paydtl: TUserdtl, status: String, service: PersonBalancePayService): TUserdtl {
         TODO("finish")
+        prepareData()
+        when (status){
+            TradeDict.DTL_STATUS_INIT -> {
+                return service.init(this)
+            }
+            TradeDict.DTL_STATUS_WIP -> {
+                return service.wip(paydtl,this)
+            }
+        }
     }
 
     fun done(refno: String, status: String, service: PersonBalancePayService): TUserdtl {
diff --git a/src/main/kotlin/com/supwisdom/dlpay/consume/controller/consume_service.kt b/src/main/kotlin/com/supwisdom/dlpay/consume/controller/consume_service.kt
index 7276c02..61ce9f5 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/consume/controller/consume_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/consume/controller/consume_service.kt
@@ -1,10 +1,15 @@
 package com.supwisdom.dlpay.consume.controller
 
 import com.supwisdom.dlpay.consume.AccountHolder
+import com.supwisdom.dlpay.consume.CallService
 import com.supwisdom.dlpay.consume.PersonTransBuilder
+import com.supwisdom.dlpay.consume.domain.TUserdtl
 import com.supwisdom.dlpay.consume.service.AccountUtilServcie
+import com.supwisdom.dlpay.consume.service.PaytypeService
 import com.supwisdom.dlpay.consume.service.PersonBalancePayService
+import com.supwisdom.dlpay.framework.util.DateUtil
 import com.supwisdom.dlpay.framework.util.TradeDict
+import com.supwisdom.dlpay.util.PaytypeUtil
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.http.ResponseEntity
 import org.springframework.web.bind.annotation.GetMapping
@@ -19,6 +24,9 @@
     @Autowired
     lateinit var personBalancePayService: PersonBalancePayService
 
+    @Autowired
+    lateinit var paytypeService: PaytypeService
+
     @PostMapping("/account/pay")
     fun accountPay(userid: String, amount: Int, manageFee: Int): ResponseEntity<Any> {
         val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
@@ -54,4 +62,35 @@
                 .done(refno, TradeDict.DTL_STATUS_SUCCESS, personBalancePayService)
         return ResponseEntity.ok(dtl)
     }
+
+    @PostMapping("/ykt/payinit")
+    fun yktPayInit(userid: String, amount: Int, manageFee: Int, stuempno: String, yktshopid: String): ResponseEntity<Any> {
+        //一卡通支付款 112240
+        val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+                .setTransDatetime("20190411", "112311")
+                .setStuempno(stuempno)
+                .setYktshopid(yktshopid)
+                .addDetail(AccountHolder.subject("112240"),
+                        AccountHolder.shop("12323"),
+                        amount / 100.0, "")
+                .addDetail(AccountHolder.subject("112240"), AccountHolder.transType(301),
+                        manageFee / 100.0, "")
+                .done(TUserdtl(), TradeDict.DTL_STATUS_INIT, personBalancePayService)
+        return ResponseEntity.ok(dtl)
+    }
+
+    @PostMapping("/ykt/payfinish")
+    fun yktPayFinish(refno: String): ResponseEntity<Any> {
+        //一卡通支付款 112240
+        val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+                .done(refno, TradeDict.DTL_STATUS_WIP, personBalancePayService)
+        CallService.callYktPay(paytypeService.getPaytypeConfigByPaytype(PaytypeUtil.YKTPAY), dtl, DateUtil.getNow()) { code ->
+            if (code.retcode == "0") {
+                 //TODO update dtl
+               var dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+                        .done(dtl.refno,TradeDict.DTL_STATUS_SUCCESS,personBalancePayService)
+            }
+        }
+        return ResponseEntity.ok(dtl)
+    }
 }
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/consume/service/impl/pay_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/consume/service/impl/pay_service_impl.kt
index e2c848f..903da27 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/consume/service/impl/pay_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/consume/service/impl/pay_service_impl.kt
@@ -2,6 +2,7 @@
 
 import com.supwisdom.dlpay.consume.PersonTransBuilder
 import com.supwisdom.dlpay.consume.dao.AccountDao
+import com.supwisdom.dlpay.consume.dao.TransdtlDao
 import com.supwisdom.dlpay.consume.dao.UserdtlDao
 import com.supwisdom.dlpay.consume.domain.TAccount
 import com.supwisdom.dlpay.consume.domain.TUserdtl
@@ -11,6 +12,10 @@
 import com.supwisdom.dlpay.framework.domain.TShopacc
 import com.supwisdom.dlpay.framework.domain.TSubject
 import com.supwisdom.dlpay.framework.domain.TTranstype
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.util.DateUtil
+import com.supwisdom.dlpay.framework.util.TradeCode
+import com.supwisdom.dlpay.framework.util.TradeDict
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.stereotype.Service
@@ -54,6 +59,8 @@
 class PersonBalancePayServiceImpl : PersonBalancePayService {
     @Autowired
     lateinit var userdtlDao: UserdtlDao
+    @Autowired
+    lateinit var systemUtilService: SystemUtilService
 
     @Autowired
     lateinit var accountDao: AccountDao
@@ -71,6 +78,15 @@
 
     override fun init(builder: PersonTransBuilder): TUserdtl {
         TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+        lateinit var userdtl: TUserdtl
+        var refno = systemUtilService.refno
+        var systemtime  = systemUtilService.sysdatetime
+        userdtl.refno = refno
+        userdtl.amount = builder.amount
+        userdtl.createtime = systemtime.hostdatetime
+        userdtl.status =  TradeDict.DTL_STATUS_INIT
+        userdtlDao.save(userdtl)
+        return userdtl
     }
 
     override fun wip(paydtl: TUserdtl, builder: PersonTransBuilder): TUserdtl {