diff --git a/src/main/java/com/supwisdom/dlpay/consume/controller/PayapiAction.java b/src/main/java/com/supwisdom/dlpay/consume/controller/PayapiAction.java
deleted file mode 100644
index ac7d7fe..0000000
--- a/src/main/java/com/supwisdom/dlpay/consume/controller/PayapiAction.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package com.supwisdom.dlpay.consume.controller;
-
-import com.supwisdom.dlpay.consume.bean.BaseResp;
-import com.supwisdom.dlpay.consume.bean.ReqParam;
-import com.supwisdom.dlpay.consume.service.PayapiService;
-import com.supwisdom.dlpay.consume.service.PaytypeService;
-import com.supwisdom.dlpay.framework.data.SystemDateTime;
-import com.supwisdom.dlpay.util.Code;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.StringUtils;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * 统一支付入口
- * 1.支付
- * 2.冲正
- * 3.充值
- *
- * 校验
- * -参数
- * -签名
- */
-@RestController
-@RequestMapping("/unified")
-public class PayapiAction {
-    @Autowired
-    private PayapiService payapiService;
-
-    /**
-     * 公共参数校验
-     * */
-
-    private boolean checkCommonParam(BaseResp resp,ReqParam param){
-        if(param.getAmount()==null){
-            resp.setRetcode("1");
-            resp.setRetmsg("参数错误[amount]");
-            return false;
-        }
-        if(StringUtils.isEmpty(param.getPayinfo())){
-            resp.setRetcode("1");
-            resp.setRetmsg("参数错误[payinfo]");
-            return false;
-        }
-        if(StringUtils.isEmpty(param.getPaytype())){
-            resp.setRetcode("1");
-            resp.setRetmsg("参数错误[paytype]");
-            return false;
-        }
-        if(StringUtils.isEmpty(param.getRefno())){
-            resp.setRetcode("1");
-            resp.setRetmsg("参数错误[refno]");
-            return false;
-        }
-        return true;
-    }
-    /**
-     *
-     * 统一消费接口
-     *
-     *
-     * */
-    @RequestMapping("/consume")
-    public BaseResp consume(@RequestBody ReqParam param) {
-        BaseResp resp = new BaseResp();
-        if(!checkCommonParam(resp,param)){
-            return resp;
-        }
-        payapiService.doConsume(param,resp);
-        return resp;
-    }
-
-    /**
-     *
-     * 统一冲正接口
-     *
-     *
-     * */
-    @RequestMapping("/reverse")
-    public BaseResp reverse() {
-        BaseResp resp = new BaseResp();
-        resp.setCode(Code.SUCCESS);
-        return resp;
-    }
-
-    /**
-     *
-     * 统一充值接口
-     *
-     * */
-    @RequestMapping("/recharge")
-    public BaseResp recharge() {
-        BaseResp resp = new BaseResp();
-        resp.setCode(Code.SUCCESS);
-        return resp;
-    }
-}
diff --git a/src/main/java/com/supwisdom/dlpay/consume/dao/TransdtlDao.java b/src/main/java/com/supwisdom/dlpay/consume/dao/TransdtlDao.java
deleted file mode 100644
index a49de57..0000000
--- a/src/main/java/com/supwisdom/dlpay/consume/dao/TransdtlDao.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.supwisdom.dlpay.consume.dao;
-
-import com.supwisdom.dlpay.consume.domain.TTransdtl;
-import com.supwisdom.dlpay.framework.data.VoucherTemp;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.stereotype.Repository;
-import org.springframework.web.bind.annotation.RequestParam;
-
-import java.util.List;
-
-@Repository
-public interface TransdtlDao extends JpaRepository<TTransdtl, String> {
-//  @Query(value="select a.drsubjno,a.crsubjno,a.summary,t.shopaccno,count(t.refno) as transcnt,sum(t.paidamt) as transamt " +
-//      "from tb_transdtl t left join tb_transtype a on t.transtype=a.transtype " +
-//      "where t.status='success' and t.accdate=:settledate " +
-//      "group by a.drsubjno,a.crsubjno,a.summary,t.shopaccno ", nativeQuery = true)
-//  List<VoucherTemp> getVouhcerData(@RequestParam("settledate") String settledate);
-//
-//  @Query(value="select a.drsubjno,a.crsubjno,a.summary,t.shopaccno,count(t.refno) as transcnt,sum(t.feeamt) as transamt " +
-//      "from tb_transdtl t left join tb_feetype_config a on t.feetype=a.feetype and t.paytype=a.paytype " +
-//      "where t.status='success' and t.feetype!='none' and t.accdate=:settledate " +
-//      "group by a.drsubjno,a.crsubjno,a.summary,t.shopaccno ", nativeQuery = true)
-//  List<VoucherTemp> getFeeVoucherData(@RequestParam("settledate") String settledate);
-
-  TTransdtl getByOuttradenoAndStatus(String outtradeno,String status);
-
-  @Query(value = " select to_char(sysdate,'yyyyMMddhh24missSSS')||to_char(SEQ_REFNO.nextval,'FM0000000') as billno from dual ",nativeQuery = true)
-  String getReno();
-
-  @Query(value = " select to_char(CURRENT_TIMESTAMP,'yyyyMMddhh24missSS')||to_char(nextval('SEQ_REFNO'),'FM0000000') as billno ",nativeQuery = true)
-  String getRenoPG();
-}
diff --git a/src/main/java/com/supwisdom/dlpay/consume/domain/TTransdtl.java b/src/main/java/com/supwisdom/dlpay/consume/domain/TTransdtl.java
deleted file mode 100644
index 309a122..0000000
--- a/src/main/java/com/supwisdom/dlpay/consume/domain/TTransdtl.java
+++ /dev/null
@@ -1,264 +0,0 @@
-package com.supwisdom.dlpay.consume.domain;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-@Entity
-@Table(name = "TB_TRANSDTL")
-public class TTransdtl {
-  @Id
-  @Column(name = "REFNO", nullable = false, length = 32)
-  private String refno;
-
-  @Column(name = "ACCDATE", length = 8)
-  private String accdate;
-
-  @Column(name = "ACCNO", length = 32)
-  private String accno;
-
-  @Column(name = "PAYTYPE", length = 20)
-  private String paytype; //支付方式 balance,wechat,alipay
-
-  @Column(name = "PAYINFO", length = 200)
-  private String payinfo; //记录支付信息备用字段
-
-  @Column(name = "AMOUNT", precision = 9, scale = 2)
-  private Double amount;
-
-  @Column(name = "PAIDAMT", precision = 9, scale = 2)
-  private Double paidamt;
-
-  @Column(name = "FEETYPE", length = 20)
-  private String feetype="none"; //费用类型
-
-  @Column(name = "FEEAMT", precision = 9, scale = 2)
-  private Double feeamt=0D;  //费用金额
-
-  @Column(name = "STATUS", length = 20)
-  private String status;
-
-  @Column(name = "BEFBAL", precision = 9, scale = 2)
-  private Double befbal;
-
-  @Column(name = "AFTBAL", precision = 9, scale = 2)
-  private Double aftbal;
-
-  @Column(name = "SHOPACCNO", length = 32)
-  private String shopaccno;
-
-  @Column(name = "TRANSCODE", precision = 4)
-  private Integer transcode; //指定交易类型
-
-  @Column(name = "TRANSTYPE", precision = 4)
-  private Integer transtype; //指定借贷双方
-
-  @Column(name = "TRANSDESC", length = 240)
-  private String transdesc;
-
-  @Column(name = "CREATETIME", length = 14)
-  private String createtime;
-
-  @Column(name = "ENDTIME", length = 14)
-  private String endtime;
-
-  @Column(name = "OUTTRADENO", length = 60)
-  private String outtradeno;
-
-  @Column(name = "TRANSDATE", length = 8)
-  private String transdate;
-
-  @Column(name = "TRANSTIME", length = 6)
-  private String transtime;
-
-  @Column(name = "REVFLAG", nullable = false, precision = 1)
-  private Integer revflag = 0;
-
-  @Column(name="REMARK", length = 240)
-  private String remark;
-
-  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 getAccno() {
-    return accno;
-  }
-
-  public void setAccno(String accno) {
-    this.accno = accno;
-  }
-
-  public String getPaytype() {
-    return paytype;
-  }
-
-  public void setPaytype(String paytype) {
-    this.paytype = paytype;
-  }
-
-  public String getPayinfo() {
-    return payinfo;
-  }
-
-  public void setPayinfo(String payinfo) {
-    this.payinfo = payinfo;
-  }
-
-  public Double getAmount() {
-    return amount;
-  }
-
-  public void setAmount(Double amount) {
-    this.amount = amount;
-  }
-
-  public Double getPaidamt() {
-    return paidamt;
-  }
-
-  public void setPaidamt(Double paidamt) {
-    this.paidamt = paidamt;
-  }
-
-  public String getFeetype() {
-    return feetype;
-  }
-
-  public void setFeetype(String feetype) {
-    this.feetype = feetype;
-  }
-
-  public Double getFeeamt() {
-    return feeamt;
-  }
-
-  public void setFeeamt(Double feeamt) {
-    this.feeamt = feeamt;
-  }
-
-  public String getStatus() {
-    return status;
-  }
-
-  public void setStatus(String status) {
-    this.status = status;
-  }
-
-  public Double getBefbal() {
-    return befbal;
-  }
-
-  public void setBefbal(Double befbal) {
-    this.befbal = befbal;
-  }
-
-  public Double getAftbal() {
-    return aftbal;
-  }
-
-  public void setAftbal(Double aftbal) {
-    this.aftbal = aftbal;
-  }
-
-  public String getShopaccno() {
-    return shopaccno;
-  }
-
-  public void setShopaccno(String shopaccno) {
-    this.shopaccno = shopaccno;
-  }
-
-  public Integer getTranscode() {
-    return transcode;
-  }
-
-  public void setTranscode(Integer transcode) {
-    this.transcode = transcode;
-  }
-
-  public Integer getTranstype() {
-    return transtype;
-  }
-
-  public void setTranstype(Integer transtype) {
-    this.transtype = transtype;
-  }
-
-  public String getTransdesc() {
-    return transdesc;
-  }
-
-  public void setTransdesc(String transdesc) {
-    this.transdesc = transdesc;
-  }
-
-  public String getCreatetime() {
-    return createtime;
-  }
-
-  public void setCreatetime(String createtime) {
-    this.createtime = createtime;
-  }
-
-  public String getEndtime() {
-    return endtime;
-  }
-
-  public void setEndtime(String endtime) {
-    this.endtime = endtime;
-  }
-
-  public String getOuttradeno() {
-    return outtradeno;
-  }
-
-  public void setOuttradeno(String outtradeno) {
-    this.outtradeno = outtradeno;
-  }
-
-  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 Integer getRevflag() {
-    return revflag;
-  }
-
-  public void setRevflag(Integer revflag) {
-    this.revflag = revflag;
-  }
-
-  public String getRemark() {
-    return remark;
-  }
-
-  public void setRemark(String remark) {
-    this.remark = remark;
-  }
-}
diff --git a/src/main/java/com/supwisdom/dlpay/consume/service/PayapiService.java b/src/main/java/com/supwisdom/dlpay/consume/service/PayapiService.java
deleted file mode 100644
index 0c8bec0..0000000
--- a/src/main/java/com/supwisdom/dlpay/consume/service/PayapiService.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.supwisdom.dlpay.consume.service;
-
-import com.supwisdom.dlpay.consume.bean.BaseResp;
-import com.supwisdom.dlpay.consume.bean.ReqParam;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-
-/**
- * Created by shuwei on 2019/4/9.
- */
-public interface PayapiService {
-    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
-    boolean doConsume(ReqParam param, BaseResp resp);
-}
diff --git a/src/main/java/com/supwisdom/dlpay/consume/service/impl/PayapiServiceImpl.java b/src/main/java/com/supwisdom/dlpay/consume/service/impl/PayapiServiceImpl.java
deleted file mode 100644
index 382d821..0000000
--- a/src/main/java/com/supwisdom/dlpay/consume/service/impl/PayapiServiceImpl.java
+++ /dev/null
@@ -1,186 +0,0 @@
-package com.supwisdom.dlpay.consume.service.impl;
-
-import com.google.gson.Gson;
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
-import com.supwisdom.dlpay.consume.bean.BaseResp;
-import com.supwisdom.dlpay.consume.bean.ReqParam;
-import com.supwisdom.dlpay.consume.bean.SupStatusRevResp;
-import com.supwisdom.dlpay.consume.bean.SupYktResp;
-import com.supwisdom.dlpay.consume.dao.TransdtlDao;
-import com.supwisdom.dlpay.consume.domain.TPaytype;
-import com.supwisdom.dlpay.consume.domain.TTransdtl;
-import com.supwisdom.dlpay.consume.service.PayapiService;
-import com.supwisdom.dlpay.consume.service.PaytypeService;
-import com.supwisdom.dlpay.framework.data.SystemDateTime;
-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.util.*;
-import org.apache.log4j.Logger;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.util.StringUtils;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Created by shuwei on 2019/4/9.
- */
-@Service
-public class PayapiServiceImpl implements PayapiService {
-    @Autowired
-    private TransdtlDao transdtlDao;
-    @Autowired
-    private SystemUtilService systemUtilService;
-    @Autowired
-    private PaytypeService paytypeService;
-    private static final Logger logger = Logger.getLogger(PayapiServiceImpl.class);
-    private static final Gson gson = new Gson();
-
-    @Override
-    public boolean doConsume(ReqParam param, BaseResp resp) {
-        TTransdtl tTransdtl = transdtlDao.getByOuttradenoAndStatus(param.getRefno(), ConstUtil.STATUS_SUCCESS);
-        if (tTransdtl != null) {
-            resp.setRetcode("1");
-            resp.setRetmsg("流水号重复");
-            return false;
-        }
-        String refno = transdtlDao.getReno();
-        if (StringUtils.isEmpty(refno)) {
-            resp.setCode(Code.SYS_ERROR);
-            return false;
-        }
-        tTransdtl = new TTransdtl();
-        tTransdtl.setAccno(param.getAccno());
-        tTransdtl.setAmount(MoneyUtil.FenToYuan(param.getAmount()));
-        tTransdtl.setPaidamt(MoneyUtil.FenToYuan(param.getAmount()));
-        tTransdtl.setShopaccno(param.getShopaccno());
-        tTransdtl.setOuttradeno(param.getRefno());
-        tTransdtl.setPaytype(param.getPaytype());
-        tTransdtl.setTransdate(DateUtil.getNow("yyyyMMdd"));
-        tTransdtl.setTranstime(DateUtil.getNow("hhmmss"));
-        tTransdtl.setCreatetime(DateUtil.getNow());
-        tTransdtl.setPayinfo(param.getPayinfo());
-        tTransdtl.setStatus(ConstUtil.STATUS_INIT);
-        tTransdtl.setRefno(refno);
-        transdtlDao.save(tTransdtl);
-        switch (param.getPaytype()) {
-            case PaytypeUtil.YKTPAY:
-                return doYKTPay(param, tTransdtl, resp);
-        }
-        resp.setCode(Code.PAYTYPE_NOT_SUPPORT);
-        return false;
-    }
-
-    /**
-     * 一卡通支付
-     */
-
-    private boolean doYKTPay(ReqParam param, TTransdtl dtl, BaseResp resp) {
-        //TODO
-        TPaytype paytype = paytypeService.getByPaytype(PaytypeUtil.YKTPAY);
-        if (paytype == null || !ConstUtil.ENABLE_YES.equals(paytype.getEnable())) {
-            resp.setCode(Code.PAYTYPE_NOT_SUPPORT);
-            return false;
-        }
-        Map<String, String> config = paytypeService.getPaytypeConfigByPaytype(PaytypeUtil.YKTPAY);
-        String appid = config.get("appid");
-        String appkey = config.get("appkey");
-        String orderurl = config.get("orderurl");
-        if (config.size() == 0
-                || StringUtils.isEmpty(appid)
-                || StringUtils.isEmpty(appkey)
-                || StringUtils.isEmpty(orderurl)) {
-            resp.setCode(Code.PAYTYPE_CONFIG_ERROR);
-            logger.error("支付方式未配置,appid=" + appid + ",appkey=" + appkey + ",orderurl=" + orderurl);
-            return false;
-        }
-        SystemDateTime systemDateTime = systemUtilService.getSysdatetime();
-        dtl.setAccdate(systemDateTime.getHostdate());
-        Map<String, String> params = new HashMap<String, String>();
-        params.put("partner_id", appid);
-        params.put("stuempno", param.getAccno());
-        params.put("tradeno", dtl.getRefno());
-        params.put("tradename", param.getPayinfo());
-        params.put("amount", param.getAmount() + "");
-        params.put("shopid", param.getYktshopid());
-        params.put("devphyid", param.getDevphyid());
-        params.put("calcmanagefee", "T");//是否计算费率
-        params.put("timestamp", systemDateTime.getHostdatetime());
-
-        params.put("sign_method", "HMAC");
-        params.put("limitflag", "off"); //是否判断消费限额，on-判断；off-不判断。默认on（判断限额）。为空或不为off都是on；
-        String signstr = HmacUtil.createLinkString(HmacUtil.paraFilter(params));
-        String sign = HmacUtil.HMACSHA1(signstr, appkey);
-        signstr += "&sign=" + sign + "&sourcetype=food";
-        Client c = Client.create();
-        c.setConnectTimeout(20000);
-        dtl.setTranstype(TradeCode.TRANSTYPE_YKTPAY);
-        dtl.setTranscode(TradeCode.TRANSCODE_YKTPAY);
-
-        WebResource r = c.resource(orderurl);
-        ClientResponse respClient = r.post(ClientResponse.class, signstr);
-        if (200 == respClient.getStatus()) {
-            String ret = respClient.getEntity(String.class);
-            logger.error("***************yktpay.ret=" + ret + "*************************");
-            if (ret != null) {
-                try {
-                    SupYktResp result = gson.fromJson(ret, SupYktResp.class);
-                    if (result == null) {
-                        resp.setCode(Code.RESPNOSE_CONTENT_ERROR);
-                        logger.error("支付内容转换失败:null");
-                        return false;
-                    }
-                    if (!"0".equals(result.getRetcode())) {
-                        if ("30".equals(result.getRetcode())) {
-                            if (result.getOther() != null) {
-                                try {
-                                    SupStatusRevResp supStatusRevResp = gson.fromJson(result.getOther(), SupStatusRevResp.class);
-                                    if (supStatusRevResp != null) {
-                                        //同流水号，同一笔已经支付完成的，不重复支付。
-                                        if (3 == supStatusRevResp.getStatus() && supStatusRevResp.getRevflag() != null && !supStatusRevResp.getRevflag()) {
-                                            dtl.setStatus(ConstUtil.STATUS_SUCCESS);
-                                            dtl.setAccdate(systemDateTime.getHostdate());
-                                            transdtlDao.save(dtl);
-                                            resp.setCode(Code.SUCCESS);
-                                            return true;
-                                        }
-                                    }
-                                } catch (Exception e) {
-                                    e.printStackTrace();
-                                    logger.error("返回内容转换失败:" + e.getMessage());
-                                }
-                            }
-                        }
-                        resp.setRetcode("1");
-                        resp.setRetmsg("交易失败:" + result.getRetmsg());
-                        logger.error(result.getRetmsg());
-                        //dtl.setErrmsg(result.getRetmsg());
-                        //payApiDTLDao.save(dtl);
-                        return false;
-                    }
-                    dtl.setStatus(ConstUtil.STATUS_SUCCESS);
-                    dtl.setAccdate(systemDateTime.getHostdate());
-                    transdtlDao.save(dtl);
-                    resp.setCode(Code.SUCCESS);
-                    return true;
-                } catch (Exception e) {
-                    e.printStackTrace();
-                    resp.setCode(Code.RESPNOSE_CONTENT_ERROR);
-                    logger.error("支付内容转换失败:" + e.getMessage());
-                    return false;
-                }
-            } else {
-                resp.setCode(Code.REQUEST_ERROR);
-                return false;
-            }
-        } else {
-            resp.setCode(Code.REQUEST_ERROR);
-            logger.error("请求返回失败:" + respClient.getEntity(String.class) + ",code=" + respClient.getStatus());
-            return false;
-        }
-    }
-}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/MoneyUtil.java b/src/main/java/com/supwisdom/dlpay/framework/util/MoneyUtil.java
index 0ac1b7b..d384340 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/MoneyUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/MoneyUtil.java
@@ -28,5 +28,8 @@
     double money = ((double) YuanToFen(yuan)) / 100;
     return df.format(money);
   }
+  public static double FenToYuan(int fen) {
+    return formatYuan(fen / 100.0);
+  }
 
 }
diff --git a/src/main/java/com/supwisdom/dlpay/util/MoneyUtil.java b/src/main/java/com/supwisdom/dlpay/util/MoneyUtil.java
deleted file mode 100644
index fac8ed4..0000000
--- a/src/main/java/com/supwisdom/dlpay/util/MoneyUtil.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.supwisdom.dlpay.util;
-
-
-import java.text.DecimalFormat;
-
-public class MoneyUtil {
-
-  public static int YuanToFen(double yuan) {
-    return (int) (Math.round(yuan * 100));
-  }
-
-  public static boolean moneyCompare(double x1, double x2) {
-    return YuanToFen(x1) == YuanToFen(x2);
-  }
-
-  public static double formatYuan(double yuan) {
-    DecimalFormat df = new DecimalFormat("##0.00");
-    double money = ((double) YuanToFen(yuan)) / 100;
-    return Double.valueOf(df.format(money));
-  }
-
-  public static double FenToYuan(int fen) {
-    return formatYuan(fen / 100.0);
-  }
-
-  public static String format(double num, String format) {
-    DecimalFormat df = new DecimalFormat(format);
-    return df.format(num);
-  }
-}
diff --git a/src/main/kotlin/com/supwisdom/dlpay/consume/ThirdPayCall.kt b/src/main/kotlin/com/supwisdom/dlpay/consume/ThirdPayCall.kt
index 8419452..52efca0 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/consume/ThirdPayCall.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/consume/ThirdPayCall.kt
@@ -7,8 +7,8 @@
 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.framework.util.MoneyUtil
 import com.supwisdom.dlpay.util.HmacUtil
-import com.supwisdom.dlpay.util.MoneyUtil
 
 /**
  * Created by shuwei on 2019/4/11.
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 61784ec..82406a6 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
@@ -9,7 +9,9 @@
 import com.supwisdom.dlpay.consume.service.PersonBalancePayService
 import com.supwisdom.dlpay.consume.service.PersonService
 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.Tradetype
 import com.supwisdom.dlpay.util.PaytypeUtil
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.http.ResponseEntity
@@ -69,25 +71,32 @@
     @PostMapping("/ykt/payinit")
     fun yktPayInit(userid: String, amount: Int, manageFee: Int,
                    stuempno: String, shopid: String, transdate: String, transtime: String,
-                   outtradeno: String, payinfo: String): ResponseEntity<Any> {
+                   outtradeno: String, payinfo: String,feetype:String): ResponseEntity<Any> {
         //一卡通支付款 112240
+        var drsubjectno = ""
+        var ccsubjectno = ""
+
         var person = personService.getPersonByThirdUniqueIdenty(stuempno)
         val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
                 .setTransDatetime(transdate, transtime)
                 .selectPaytype(PaytypeUtil.YKTPAY, payinfo)
                 .setOuttradeno(outtradeno)
                 .setOwner(person)
+                .setTransinfo(TradeCode.TRANSCODE_YKTPAY,"一卡通支付")
+                .chooseTradetype(Tradetype.CONSUME)
                 .addDetail(AccountHolder.subject("112240"),
                         AccountHolder.shop(shopid),
-                        amount / 100.0, "")
+                        amount / 100.0, "一卡通支付")
+                .addDetail(AccountHolder.subject("112240"),
+                        AccountHolder.subject("2002"),
+                        manageFee / 100.0, "搭伙费")
                 .done(personBalancePayService, false)
         return ResponseEntity.ok(dtl)
     }
 
     @PostMapping("/ykt/payfinish")
     fun yktPayFinish(refno: String, yktshopid: String, devphyid: String?): ResponseEntity<Any> {
-        val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-                .done(refno, TradeDict.DTL_STATUS_WIP, personBalancePayService)
+        var dtl = personBalancePayService.wip(refno)
         var person = personService.getPersonByUserid(dtl.userid)
         val code = CallService.callYktPay(paytypeService.getPaytypeConfigByPaytype(PaytypeUtil.YKTPAY),
                 dtl, DateUtil.getNow(),person?.thirdUniqueIdenty,yktshopid,devphyid)
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 44c0a56..b592a60 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
@@ -149,7 +149,7 @@
     }
 
     private fun doDealShopacc(shopaccno: String, amount: Double) {
-        TODO("商户更新余额逻辑")
+        return
     }
 
     override fun process(builder: PersonTransBuilder): TUserdtl {
@@ -260,12 +260,16 @@
         }
     }
 
-    override fun wip(paydtl: TUserdtl, builder: PersonTransBuilder): TUserdtl {
-        return wip(paydtl.refno, builder)
+    override fun wip(paydtl: TUserdtl): TUserdtl {
+        return wip(paydtl.refno)
     }
 
-    override fun wip(refno: String, builder: PersonTransBuilder): TUserdtl {
+    override fun wip(refno: String): TUserdtl {
         var userdtl = getLockUserdtlNowait(refno)
+        if(TradeDict.DTL_STATUS_WIP == userdtl.status){
+            return userdtl
+        }
+
         if (TradeDict.DTL_STATUS_INIT != userdtl.status)
             throw TransactionProcessException(TradeErrorCode.TRANSDTL_STATUS_NOT_INIT, "交易参考号<$refno>非初始化流水")
 
diff --git a/src/main/kotlin/com/supwisdom/dlpay/consume/service/pay_service.kt b/src/main/kotlin/com/supwisdom/dlpay/consume/service/pay_service.kt
index 8bfc900..84da408 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/consume/service/pay_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/consume/service/pay_service.kt
@@ -43,9 +43,9 @@
     /**
      * 两步交易，交易过程中判断交易状态，并更新交易状态为 wip
      */
-    fun wip(paydtl: TUserdtl, builder: PersonTransBuilder): TUserdtl
+    fun wip(paydtl: TUserdtl): TUserdtl
 
-    fun wip(refno: String, builder: PersonTransBuilder): TUserdtl
+    fun wip(refno: String): TUserdtl
 
 
 }
\ No newline at end of file
