改进支付业务,增加了办卡业务接口
diff --git a/config/application-devel-pg-local.properties b/config/application-devel-pg-local.properties
index 3b2dd4a..d985780 100644
--- a/config/application-devel-pg-local.properties
+++ b/config/application-devel-pg-local.properties
@@ -32,3 +32,26 @@
 resttemplate.proxy.type=http
 resttemplate.proxy.host=127.0.0.1
 resttemplate.proxy.port=1087
+
+#============== kafka ===================
+# 指定kafka 代理地址,可以多个
+spring.kafka.bootstrap-servers=172.28.201.101:9192
+#=============== provider  =======================
+spring.kafka.producer.retries=3
+# 每次批量发送消息的数量
+spring.kafka.producer.batch-size=16384
+spring.kafka.producer.buffer-memory=33554432
+# 指定消息key和消息体的编解码方式
+spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
+spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
+
+#===============kafka consumer  =======================
+# 指定默认消费者group id
+spring.kafka.listen.auto.start=false
+spring.kafka.consumer.group-id=epaymessager1
+spring.kafka.consumer.auto-offset-reset=earliest
+spring.kafka.consumer.enable-auto-commit=true
+spring.kafka.consumer.auto-commit-interval=100
+# 指定消息key和消息体的编解码方式
+spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
+spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
\ No newline at end of file
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/PublishCardParam.java
new file mode 100644
index 0000000..f992df5
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/PublishCardParam.java
@@ -0,0 +1,157 @@
+package com.supwisdom.dlpay.api.bean;
+
+import com.sun.java.swing.action.CancelAction;
+import com.supwisdom.dlpay.api.APIRequestParam;
+import com.supwisdom.dlpay.api.bean.groups.ConfirmAction;
+import com.supwisdom.dlpay.api.bean.groups.InitAction;
+import com.supwisdom.dlpay.api.bean.groups.QueryAction;
+import com.supwisdom.dlpay.api.exception.RequestParamCheckException;
+
+import javax.validation.constraints.NotNull;
+
+public class PublishCardParam extends APIRequestParam {
+  @NotNull(message = "操作员ID不能为空", groups = {InitAction.class, ConfirmAction.class, QueryAction.class})
+  private String operid;
+
+  private @NotNull(message = "操作员流水号不能为空", groups = {InitAction.class, ConfirmAction.class, QueryAction.class}) String operSeqno;
+
+  @NotNull(groups = {InitAction.class})
+  private String transdate;
+
+  @NotNull(groups = {InitAction.class})
+  private String transtime;
+
+  private String userid;
+
+  @NotNull
+  private Integer totalAmount;
+
+  private String capitalSubjno;
+
+  @NotNull
+  private Integer cost;
+
+  @NotNull
+  private Integer cashPledge;
+
+  @NotNull
+  private Integer charge;
+
+  @NotNull(message = "交易摘要不能为空", groups = {InitAction.class})
+  private String summary;
+
+  @NotNull(message = "记账日期不能为空", groups = {ConfirmAction.class, CancelAction.class, QueryAction.class})
+  private String accdate;
+
+  @NotNull(message = "交易参考号不能为空", groups = {ConfirmAction.class, CancelAction.class, QueryAction.class})
+  private String refno;
+
+  public String getOperid() {
+    return operid;
+  }
+
+  public void setOperid(String operid) {
+    this.operid = operid;
+  }
+
+  public @NotNull(message = "操作员流水号不能为空", groups = {InitAction.class, ConfirmAction.class, QueryAction.class}) String getOperSeqno() {
+    return operSeqno;
+  }
+
+  public void setOperSeqno(@NotNull(message = "操作员流水号不能为空", groups = {InitAction.class, ConfirmAction.class, QueryAction.class}) String operSeqno) {
+    this.operSeqno = operSeqno;
+  }
+
+  public String getUserid() {
+    return userid;
+  }
+
+  public void setUserid(String userid) {
+    this.userid = userid;
+  }
+
+  public Integer getTotalAmount() {
+    return totalAmount;
+  }
+
+  public void setTotalAmount(Integer totalAmount) {
+    this.totalAmount = totalAmount;
+  }
+
+  public String getAccdate() {
+    return accdate;
+  }
+
+  public void setAccdate(String accdate) {
+    this.accdate = accdate;
+  }
+
+  public String getRefno() {
+    return refno;
+  }
+
+  public void setRefno(String refno) {
+    this.refno = refno;
+  }
+
+  public String getTransdate() {
+    return transdate;
+  }
+
+  public void setTransdate(String transdate) {
+    this.transdate = transdate;
+  }
+
+  public String getTranstime() {
+    return transtime;
+  }
+
+  public void setTranstime(String transtime) {
+    this.transtime = transtime;
+  }
+
+  public String getCapitalSubjno() {
+    return capitalSubjno;
+  }
+
+  public void setCapitalSubjno(String capitalSubjno) {
+    this.capitalSubjno = capitalSubjno;
+  }
+
+  public String getSummary() {
+    return summary;
+  }
+
+  public void setSummary(String summary) {
+    this.summary = summary;
+  }
+
+  public Integer getCost() {
+    return cost;
+  }
+
+  public void setCost(Integer cost) {
+    this.cost = cost;
+  }
+
+  public Integer getCashPledge() {
+    return cashPledge;
+  }
+
+  public void setCashPledge(Integer cashPledge) {
+    this.cashPledge = cashPledge;
+  }
+
+  public Integer getCharge() {
+    return charge;
+  }
+
+  public void setCharge(Integer charge) {
+    this.charge = charge;
+  }
+
+  @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/PublishCardResponse.java
new file mode 100644
index 0000000..77be206
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/PublishCardResponse.java
@@ -0,0 +1,38 @@
+package com.supwisdom.dlpay.api.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+
+@AllArgsConstructor
+@NoArgsConstructor
+public class PublishCardResponse extends ApiResponse {
+  private String refno;
+
+  private String accdate;
+
+  private String description;
+
+  public String getRefno() {
+    return refno;
+  }
+
+  public void setRefno(String refno) {
+    this.refno = refno;
+  }
+
+  public String getAccdate() {
+    return accdate;
+  }
+
+  public void setAccdate(String accdate) {
+    this.accdate = accdate;
+  }
+
+  public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(String description) {
+    this.description = description;
+  }
+}
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 a8e7808..e023ec7 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,6 +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;
@@ -25,4 +26,16 @@
 
   @PostMapping("/api/user/testmsg")
   ApiResponse testmsg();
+
+  @PostMapping("/api/user/biz_init")
+  PublishCardResponse bizInit(@RequestBody PublishCardParam param);
+
+  @PostMapping("/api/user/biz_confirm")
+  PublishCardResponse bizConfirm(@RequestBody PublishCardParam param);
+
+  @PostMapping("/api/user/biz_refund")
+  PublishCardResponse bizRefund(@RequestBody PublishCardParam param);
+
+  @PostMapping("/api/user/biz_query")
+  PublishCardResponse bizQuery(@RequestBody PublishCardParam 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 32ca0f3..29919c5 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
@@ -30,7 +30,7 @@
 
 @RunWith(SpringRunner.class)
 @SpringBootTest(properties = {
-    "payapi.url=http://localhost:8099/payapi"},
+    "payapi.url=http://localhost:8080/payapi"},
     classes = CitizenCardPayProxyTest.class)
 @ImportAutoConfiguration({RibbonAutoConfiguration.class,
     FeignRibbonClientAutoConfiguration.class, FeignAutoConfiguration.class,
@@ -39,7 +39,7 @@
 @ComponentScan(basePackages = {"com.supwisdom.dlpay.paysdk"})
 public class CitizenCardPayProxyTest {
   private final static String appid = "700001";
-  private final static String secret = "5f788ce433ec44f299351cdf7f137e81";
+  private final static String secret = "d6dd7f0d4551419d8d11736d0f28df0d";
 
   @Autowired
   private ApiLoginProxy apiLoginProxy;
@@ -231,6 +231,38 @@
   }
 
   @Test
+  public void testPublishCard() {
+    ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
+    helper.login(appid, secret);
+
+    PublishCardParam param = new PublishCardParam();
+    param.setTransdate(DateUtil.getNow("yyyyMMdd"));
+    param.setTranstime(DateUtil.getNow("HHmmss"));
+    param.setOperid("1001");
+    param.setOperSeqno(param.getTransdate() + param.getTranstime());
+    param.setTotalAmount(10000);
+    param.setCapitalSubjno("112201");
+    param.setSummary("发卡");
+    param.setCost(1000);
+    param.setCharge(0);
+    param.setCashPledge(0);
+    param.setUserid("ff8080816dd8f3a6016dd8f5e5d80002");
+
+    PublishCardResponse response = userProxy.bizInit(param);
+
+    assertThat("user card biz init " + response.getRetcode() + response.getRetmsg() + response.getException(),
+        response.getRetcode(), equalTo(0));
+
+    param.setAccdate(response.getAccdate());
+    param.setRefno(response.getRefno());
+    response = userProxy.bizConfirm(param);
+
+    assertThat("user card biz confirm " + response.getRetcode() + response.getRetmsg() + response.getException(),
+        response.getRetcode(), equalTo(0));
+
+  }
+
+  @Test
   public void thirdpay() {
 
   }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Subject.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Subject.java
index e80344a..e11c171 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Subject.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Subject.java
@@ -104,7 +104,6 @@
   public static final String SUBJNO_PERSONAL_REFUND = "220211";
 
 
-
   //======================= 损益类 =====================//
   /**
    * 手续费收入 - 支付宝充值手续费
@@ -121,6 +120,10 @@
    */
   public static final String SUBJNO_SERVICEFEE_UNIONPAY = "602103";
 
+  /**
+   * 手续费收入 - 默认
+   */
+  public static final String SUBJNO_SERVICEFEE_DEFAULT = "602104";
 
   /**
    * 销售费用 - (消费)折扣优惠款
@@ -137,4 +140,9 @@
    */
   public static final String SUBJNO_MANAGEFEE = "6602";
 
+  /**
+   * 卡成本费
+   */
+  public static final String SUBJNO_CARD_COST = "6025";
+
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java
index b78049f..d1a85b8 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java
@@ -30,5 +30,6 @@
 
   public static final int TRANSCODE_ERCHARGE = 3500; //账户充值
 
+  public static final int TRANSCODE_CARD_BIZ = 1007; // 卡务业务
 
 }
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 3688191..271af87 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
@@ -1,35 +1,40 @@
 package com.supwisdom.dlpay.api.controller
 
-import com.supwisdom.dlpay.api.bean.ModifyUserParam
-import com.supwisdom.dlpay.api.bean.OpenUserParam
-import com.supwisdom.dlpay.api.bean.QueryCardsParam
-import com.supwisdom.dlpay.api.bean.QueryUserParam
+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.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.util.Subject
+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.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
 
 @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 transactionService: TransactionServiceProxy
+
 
     @PostMapping("/open")
     fun openAccount(@RequestBody param: OpenUserParam): ResponseEntity<Any> {
@@ -127,16 +132,17 @@
                     .transException(et, "业务处理错误"))
         }
     }
+
     @PostMapping("/querybycardno")
     fun querybycardno(@RequestBody param: QueryUserParam): ResponseEntity<Any> {
         val ret = when (!param.userid.isNullOrEmpty()) {
             true -> cardService.getPersonByUserid(param.userid)
             false -> cardService.getPersonByCardno(param.citizencardno, param.bankcardno)
         }
-        return if(ret.retcode==0){
+        return if (ret.retcode == 0) {
             ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .success(ret,"ok"))
-        }else{
+                    .success(ret, "ok"))
+        } else {
             ResponseEntity.ok(ResponseBodyBuilder.create()
                     .fail(ret.retcode, ret.retmsg))
         }
@@ -145,10 +151,10 @@
     @PostMapping("/querycards")
     fun querycards(@RequestBody param: QueryCardsParam): ResponseEntity<Any> {
         val ret = cardService.getCardsByLastsaveDate(param.starttime, param.endtime)
-        return if(ret.retcode==0){
+        return if (ret.retcode == 0) {
             ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .success(ret,"ok"))
-        }else{
+                    .success(ret, "ok"))
+        } else {
             ResponseEntity.ok(ResponseBodyBuilder.create()
                     .fail(ret.retcode, ret.retmsg))
         }
@@ -156,8 +162,104 @@
 
     @PostMapping("/testmsg")
     fun testmsg(): ResponseEntity<Any> {
-       kafkaSendMsgService.sendJpushMessage("402882816c2727a2016c2728165f0001","交易提醒","你有一笔0.01元的支出,点击查看详情","20190725133506000018", mutableMapOf(),"")
-       return  ResponseEntity.ok(ResponseBodyBuilder.create()
+        kafkaSendMsgService.sendJpushMessage("402882816c2727a2016c2728165f0001", "交易提醒",
+                "你有一笔0.01元的支出,点击查看详情", "20190725133506000018", mutableMapOf(), "")
+        return ResponseEntity.ok(ResponseBodyBuilder.create()
                 .success("ok"))
     }
+
+    @PostMapping("/biz_init")
+    fun userBizInit(@RequestBody @Validated(InitAction::class) request: PublishCardParam): ResponseEntity<Any> {
+        val builder = TransactionBuilder().apply {
+            setTransInfo(request.transdate, request.transtime, TradeCode.TRANSCODE_CARD_BIZ, "balance")
+            setOutTransInfo(request.operid, request.operSeqno)
+            dtltype = "cardservice"
+            description = request.summary
+        }
+        val result = PublishCardResponse()
+
+        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
+
+        if (depositAmount < 0) {
+            return ResponseBodyBuilder.failEntity(result,
+                    TradeErrorCode.INPUT_DATA_ERROR,
+                    "交易金额错误")
+        }
+        if (depositAmount != 0 && request.totalAmount != 0) {
+            if (depositAmount > 0) {
+                builder.addDebitCreditRecord(capitalSubj.subjno, capitalSubj.subjname,
+                        user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT, request.totalAmount / 100.0, request.summary)
+            }
+            val transDesc = arrayListOf<String>()
+            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) + " 元")
+            }
+            builder.description += transDesc.joinToString(";")
+        }
+        val transaction = transactionService.init(builder)
+
+        result.apply {
+            accdate = transaction.accdate
+            refno = transaction.refno
+            description = builder.description
+        }
+        return ResponseBodyBuilder.successEntity(result, "${request.summary}初始化成功")
+    }
+
+    @PostMapping("/biz_confirm")
+    fun userBizConfirm(@RequestBody @Validated(ConfirmAction::class) request: PublishCardParam): ResponseEntity<Any> {
+        val transaction = transactionService.success(request.refno)
+        val response = PublishCardResponse().apply {
+            accdate = transaction.accdate
+            refno = transaction.refno
+        }
+        return ResponseBodyBuilder.successEntity(response, "${request.summary}确认成功")
+    }
+
+    @PostMapping("/biz_refund")
+    fun userBizRefund(@RequestBody @Valid request: PublishCardParam): ResponseEntity<Any> {
+        return ResponseEntity.ok(ResponseBodyBuilder.create().success())
+    }
+
+    @GetMapping("/biz_query")
+    fun userBizQuery(@RequestBody @Valid request: PublishCardParam): ResponseEntity<Any> {
+        return ResponseEntity.ok(ResponseBodyBuilder.create().success())
+    }
 }
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt
index 1f63e38..c9d61a1 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt
@@ -8,6 +8,7 @@
 import com.supwisdom.dlpay.exception.TransactionException
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
 import mu.KotlinLogging
+import org.springframework.http.ResponseEntity
 
 
 class ResponseBodyBuilder private constructor() {
@@ -16,6 +17,14 @@
         private val RESERVED_KEY = setOf("retcode", "retmsg")
         private val LOGGER = KotlinLogging.logger {}
         fun create() = ResponseBodyBuilder()
+
+        fun successEntity(bean: ApiResponse, msg: String? = null): ResponseEntity<Any> {
+            return ResponseEntity.ok(create().success(bean, msg))
+        }
+
+        fun failEntity(bean: ApiResponse, code: Int, msg: String): ResponseEntity<Any> {
+            return ResponseEntity.ok(create().fail(bean, code, msg))
+        }
     }
 
     private var retCode = INVALIDE_RETCODE
@@ -44,6 +53,7 @@
         return bean
     }
 
+
     fun fail(code: Int, msg: String): Map<String, Any> {
         if (code == 0) {
             throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "错误码未正确定义")
diff --git a/payapi/src/main/resources/data.sql b/payapi/src/main/resources/data.sql
index bcdf83c..7244bf3 100644
--- a/payapi/src/main/resources/data.sql
+++ b/payapi/src/main/resources/data.sql
@@ -534,6 +534,10 @@
 INSERT INTO "tb_subject" ("subjid","subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
 VALUES (26, '602103', 2, 'n', 1, '6021', 20190430, 2, '银联充值手续费', 6, '{tenantid}');
 INSERT INTO "tb_subject" ("subjid","subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES (32, '602104', 2, 'n', 1, '6021', 20190430, 2, '收手续费', 6, '{tenantid}');
+INSERT INTO "tb_subject" ("subjid","subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES (31, '6025', 2, 'y', 0, NULL, 20190430, 1, '卡成本费收入', 6, '{tenantid}');
+INSERT INTO "tb_subject" ("subjid","subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
 VALUES (27, '6601', 2, 'y', 0, NULL, 20190430, 1, '销售费用', 6, '{tenantid}');
 INSERT INTO "tb_subject" ("subjid","subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
 VALUES (28, '660101', 2, 'y', 1, '6601', 20190430, 2, '折扣优惠款', 6, '{tenantid}');
@@ -700,6 +704,8 @@
 VALUES (29, 'canteen', 'dtltypeList', '食堂就餐', '流水类型', '{tenantid}');
 INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
 VALUES (30, 'shopmarket', 'dtltypeList', '商超消费', '流水类型', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (31, 'cardservice', 'dtltypeList', '卡务流水', '流水类型', '{tenantid}');