优化了卡务业务接口,支持退款
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/PublishCardParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CardBizParam.java
similarity index 92%
rename from payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/PublishCardParam.java
rename to payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CardBizParam.java
index f992df5..dd83c93 100644
--- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/PublishCardParam.java
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CardBizParam.java
@@ -9,7 +9,7 @@
 
 import javax.validation.constraints.NotNull;
 
-public class PublishCardParam extends APIRequestParam {
+public class CardBizParam extends APIRequestParam {
   @NotNull(message = "操作员ID不能为空", groups = {InitAction.class, ConfirmAction.class, QueryAction.class})
   private String operid;
 
@@ -23,6 +23,9 @@
 
   private String userid;
 
+  @NotNull(message = "资金方向不能为空", groups = {InitAction.class})
+  private String inOrOut;
+
   @NotNull
   private Integer totalAmount;
 
@@ -150,6 +153,14 @@
     this.charge = charge;
   }
 
+  public String getInOrOut() {
+    return inOrOut;
+  }
+
+  public void setInOrOut(String inOrOut) {
+    this.inOrOut = inOrOut;
+  }
+
   @Override
   public boolean checkParam() throws RequestParamCheckException {
     return true;
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/PublishCardResponse.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CardBizResponse.java
similarity index 91%
rename from payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/PublishCardResponse.java
rename to payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CardBizResponse.java
index 77be206..5ee85f0 100644
--- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/PublishCardResponse.java
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CardBizResponse.java
@@ -5,7 +5,7 @@
 
 @AllArgsConstructor
 @NoArgsConstructor
-public class PublishCardResponse extends ApiResponse {
+public class CardBizResponse extends ApiResponse {
   private String refno;
 
   private String accdate;
diff --git 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
index e023ec7..1b1bcd7 100644
--- 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
@@ -1,9 +1,7 @@
 package com.supwisdom.dlpay.paysdk.proxy;
 
 import com.supwisdom.dlpay.api.bean.*;
-import org.reactivestreams.Publisher;
 import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 
@@ -28,14 +26,14 @@
   ApiResponse testmsg();
 
   @PostMapping("/api/user/biz_init")
-  PublishCardResponse bizInit(@RequestBody PublishCardParam param);
+  CardBizResponse bizInit(@RequestBody CardBizParam param);
 
   @PostMapping("/api/user/biz_confirm")
-  PublishCardResponse bizConfirm(@RequestBody PublishCardParam param);
+  CardBizResponse bizConfirm(@RequestBody CardBizParam param);
 
   @PostMapping("/api/user/biz_refund")
-  PublishCardResponse bizRefund(@RequestBody PublishCardParam param);
+  CardBizResponse bizRefund(@RequestBody CardBizParam param);
 
   @PostMapping("/api/user/biz_query")
-  PublishCardResponse bizQuery(@RequestBody PublishCardParam param);
+  CardBizResponse bizQuery(@RequestBody CardBizParam param);
 }
diff --git a/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
index 8a0ad65..77a02bc 100644
--- a/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
+++ b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
@@ -5,7 +5,6 @@
 import com.supwisdom.dlpay.api.util.DateUtil;
 import com.supwisdom.dlpay.paysdk.ApiLoginHelper;
 import com.supwisdom.dlpay.paysdk.proxy.*;
-import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -17,10 +16,8 @@
 import org.springframework.cloud.openfeign.FeignAutoConfiguration;
 import org.springframework.cloud.openfeign.ribbon.FeignRibbonClientAutoConfiguration;
 import org.springframework.context.annotation.ComponentScan;
-import org.springframework.http.ResponseEntity;
 import org.springframework.test.context.junit4.SpringRunner;
 
-import java.util.LinkedHashMap;
 import java.util.List;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -235,7 +232,7 @@
     ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
     helper.login(appid, secret);
 
-    PublishCardParam param = new PublishCardParam();
+    CardBizParam param = new CardBizParam();
     param.setTransdate(DateUtil.getNow("yyyyMMdd"));
     param.setTranstime(DateUtil.getNow("HHmmss"));
     param.setOperid("1001");
@@ -248,7 +245,7 @@
     param.setCashPledge(0);
     param.setUserid("ff8080816dd8f3a6016dd8f5e5d80002");
 
-    PublishCardResponse response = userProxy.bizInit(param);
+    CardBizResponse response = userProxy.bizInit(param);
 
     assertThat("user card biz init " + response.getRetcode() + response.getRetmsg() + response.getException(),
         response.getRetcode(), equalTo(0));
diff --git 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
index ef0018a..90199c8 100644
--- 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
@@ -169,7 +169,7 @@
     }
 
     @PostMapping("/biz_init")
-    fun userBizInit(@RequestBody @Validated(InitAction::class) request: PublishCardParam): ResponseEntity<Any> {
+    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)
@@ -177,7 +177,7 @@
         }
         val transDesc = arrayListOf<String>()
         transDesc.add(request.summary)
-        val result = PublishCardResponse()
+        val result = CardBizResponse()
 
         val user = useService.findAccountByUserid(request.userid, null)
                 ?: return ResponseBodyBuilder.failEntity(result,
@@ -197,39 +197,76 @@
             setOpposite(capitalSubj.subjno, capitalSubj.subjname)
         }
 
+
         val depositAmount = request.totalAmount - request.cost - request.cashPledge - request.charge
 
-        if (depositAmount < 0) {
+        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,
-                    "交易金额错误")
+                    TradeErrorCode.INPUT_DATA_ERROR, "资金方案向错误或交易金额有误")
         }
         if (request.totalAmount != 0) {
-            if (depositAmount > 0) {
-                builder.addDebitCreditRecord(capitalSubj.subjno, capitalSubj.subjno,
-                        user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT, request.totalAmount / 100.0, request.summary)
-            }
-            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("卡成本费" + "%.2f".format(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("卡押金" + "%.2f".format(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("手续费" + "%.2f".format(request.charge / 100.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)
+                }
+                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(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)
+                }
+                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(";")
@@ -244,9 +281,9 @@
     }
 
     @PostMapping("/biz_confirm")
-    fun userBizConfirm(@RequestBody @Validated(ConfirmAction::class) request: PublishCardParam): ResponseEntity<Any> {
+    fun userBizConfirm(@RequestBody @Validated(ConfirmAction::class) request: CardBizParam): ResponseEntity<Any> {
         val transaction = transactionService.success(request.refno)
-        val response = PublishCardResponse().apply {
+        val response = CardBizResponse().apply {
             accdate = transaction.accdate
             refno = transaction.refno
             description = transaction.personDtl.transdesc
@@ -255,12 +292,12 @@
     }
 
     @PostMapping("/biz_refund")
-    fun userBizRefund(@RequestBody @Valid request: PublishCardParam): ResponseEntity<Any> {
+    fun userBizRefund(@RequestBody @Valid request: CardBizParam): ResponseEntity<Any> {
         return ResponseEntity.ok(ResponseBodyBuilder.create().success())
     }
 
     @GetMapping("/biz_query")
-    fun userBizQuery(@RequestBody @Valid request: PublishCardParam): ResponseEntity<Any> {
+    fun userBizQuery(@RequestBody @Valid request: CardBizParam): ResponseEntity<Any> {
         return ResponseEntity.ok(ResponseBodyBuilder.create().success())
     }
 }
\ No newline at end of file