diff --git a/src/main/java/com/supwisdom/dlpay/api/service/impl/PosPayServiceImpl.java b/src/main/java/com/supwisdom/dlpay/api/service/impl/PosPayServiceImpl.java
index 7d42137..680db82 100644
--- a/src/main/java/com/supwisdom/dlpay/api/service/impl/PosPayServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/api/service/impl/PosPayServiceImpl.java
@@ -531,7 +531,6 @@
     @Override
     public PosPayReverseResp doPayCancel(PosPayReverseReq req) {
         PosPayReverseResp resp = new PosPayReverseResp();
-        System.out.println("termsqlno:" + req.getTermseqno());
         TTransDtl tTransDtl = transDtlService.getTransDtlByBillno(req.getReversalbillno());
         if (null == tTransDtl) {
             resp.setRetcode(ErrorCode.ERRIF_OK);
diff --git a/src/main/java/com/supwisdom/dlpay/bus/bean/BaseThirdpartReq.java b/src/main/java/com/supwisdom/dlpay/bus/bean/BaseThirdpartReq.java
new file mode 100644
index 0000000..a84a4a4
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/bean/BaseThirdpartReq.java
@@ -0,0 +1,49 @@
+package com.supwisdom.dlpay.bus.bean;
+
+public class BaseThirdpartReq  {
+  private String partner_id;
+  private String version;
+  private String timestamp;
+  private String sign;
+  private String sign_method;
+
+  public String getPartner_id() {
+    return partner_id;
+  }
+
+  public void setPartner_id(String partner_id) {
+    this.partner_id = partner_id;
+  }
+
+  public String getVersion() {
+    return version;
+  }
+
+  public void setVersion(String version) {
+    this.version = version;
+  }
+
+  public String getTimestamp() {
+    return timestamp;
+  }
+
+  public void setTimestamp(String timestamp) {
+    this.timestamp = timestamp;
+  }
+
+  public String getSign() {
+    return sign;
+  }
+
+  public void setSign(String sign) {
+    this.sign = sign;
+  }
+
+  public String getSign_method() {
+    return sign_method;
+  }
+
+  public void setSign_method(String sign_method) {
+    this.sign_method = sign_method;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/bean/BusThirdpartPayReq.java b/src/main/java/com/supwisdom/dlpay/bus/bean/BusThirdpartPayReq.java
new file mode 100644
index 0000000..2b29717
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/bean/BusThirdpartPayReq.java
@@ -0,0 +1,77 @@
+package com.supwisdom.dlpay.bus.bean;
+
+public class BusThirdpartPayReq extends BaseThirdpartReq {
+  private String cardno;
+  private String tac;
+  private String billno;
+  private String transdate;
+  private String transtime;
+  private String termdesc;
+  private String extdata;
+  private Integer amount;
+
+
+  public String getCardno() {
+    return cardno;
+  }
+
+  public void setCardno(String cardno) {
+    this.cardno = cardno;
+  }
+
+  public String getTac() {
+    return tac;
+  }
+
+  public void setTac(String tac) {
+    this.tac = tac;
+  }
+
+  public String getBillno() {
+    return billno;
+  }
+
+  public void setBillno(String billno) {
+    this.billno = billno;
+  }
+
+  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 getTermdesc() {
+    return termdesc;
+  }
+
+  public void setTermdesc(String termdesc) {
+    this.termdesc = termdesc;
+  }
+
+  public String getExtdata() {
+    return extdata;
+  }
+
+  public void setExtdata(String extdata) {
+    this.extdata = extdata;
+  }
+
+  public Integer getAmount() {
+    return amount;
+  }
+
+  public void setAmount(Integer amount) {
+    this.amount = amount;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/bean/BusThirdpartPayResp.java b/src/main/java/com/supwisdom/dlpay/bus/bean/BusThirdpartPayResp.java
new file mode 100644
index 0000000..a48be7d
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/bean/BusThirdpartPayResp.java
@@ -0,0 +1,62 @@
+package com.supwisdom.dlpay.bus.bean;
+
+import java.util.List;
+
+public class BusThirdpartPayResp extends BusApiResp {
+  private String refno;
+  private String billno;
+  private String amount;
+  private String status;
+  private String accdate;
+  private String extdata;
+
+
+
+  public String getRefno() {
+    return refno;
+  }
+
+  public void setRefno(String refno) {
+    this.refno = refno;
+  }
+
+  public String getBillno() {
+    return billno;
+  }
+
+  public void setBillno(String billno) {
+    this.billno = billno;
+  }
+
+  public String getAmount() {
+    return amount;
+  }
+
+  public void setAmount(String amount) {
+    this.amount = amount;
+  }
+
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  public String getAccdate() {
+    return accdate;
+  }
+
+  public void setAccdate(String accdate) {
+    this.accdate = accdate;
+  }
+
+  public String getExtdata() {
+    return extdata;
+  }
+
+  public void setExtdata(String extdata) {
+    this.extdata = extdata;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/bean/BusThirdpartQueryReq.java b/src/main/java/com/supwisdom/dlpay/bus/bean/BusThirdpartQueryReq.java
new file mode 100644
index 0000000..6186c69
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/bean/BusThirdpartQueryReq.java
@@ -0,0 +1,23 @@
+package com.supwisdom.dlpay.bus.bean;
+
+public class BusThirdpartQueryReq extends BaseThirdpartReq {
+  private String refno;
+  private String billno;
+
+
+  public String getRefno() {
+    return refno;
+  }
+
+  public void setRefno(String refno) {
+    this.refno = refno;
+  }
+
+  public String getBillno() {
+    return billno;
+  }
+
+  public void setBillno(String billno) {
+    this.billno = billno;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/bean/BusThirdpartQueryResp.java b/src/main/java/com/supwisdom/dlpay/bus/bean/BusThirdpartQueryResp.java
new file mode 100644
index 0000000..a836ffb
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/bean/BusThirdpartQueryResp.java
@@ -0,0 +1,60 @@
+package com.supwisdom.dlpay.bus.bean;
+
+public class BusThirdpartQueryResp extends BusApiResp {
+  private String refno;
+  private String billno;
+  private String amount;
+  private String status;
+  private String accdate;
+  private String extdata;
+
+
+
+  public String getRefno() {
+    return refno;
+  }
+
+  public void setRefno(String refno) {
+    this.refno = refno;
+  }
+
+  public String getBillno() {
+    return billno;
+  }
+
+  public void setBillno(String billno) {
+    this.billno = billno;
+  }
+
+  public String getAmount() {
+    return amount;
+  }
+
+  public void setAmount(String amount) {
+    this.amount = amount;
+  }
+
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  public String getAccdate() {
+    return accdate;
+  }
+
+  public void setAccdate(String accdate) {
+    this.accdate = accdate;
+  }
+
+  public String getExtdata() {
+    return extdata;
+  }
+
+  public void setExtdata(String extdata) {
+    this.extdata = extdata;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/bean/BusThirdpartRefundReq.java b/src/main/java/com/supwisdom/dlpay/bus/bean/BusThirdpartRefundReq.java
new file mode 100644
index 0000000..64ac123
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/bean/BusThirdpartRefundReq.java
@@ -0,0 +1,51 @@
+package com.supwisdom.dlpay.bus.bean;
+
+public class BusThirdpartRefundReq extends BaseThirdpartReq {
+  private String billno;
+  private String orgrefno;
+  private String orgbillno;
+  private String transdate;
+  private String transtime;
+
+
+  public String getOrgrefno() {
+    return orgrefno;
+  }
+
+  public void setOrgrefno(String orgrefno) {
+    this.orgrefno = orgrefno;
+  }
+
+  public String getOrgbillno() {
+    return orgbillno;
+  }
+
+  public void setOrgbillno(String orgbillno) {
+    this.orgbillno = orgbillno;
+  }
+
+
+  public String getBillno() {
+    return billno;
+  }
+
+  public void setBillno(String billno) {
+    this.billno = billno;
+  }
+
+  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;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/bean/BusThirdpartRefundResp.java b/src/main/java/com/supwisdom/dlpay/bus/bean/BusThirdpartRefundResp.java
new file mode 100644
index 0000000..bd724dc
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/bean/BusThirdpartRefundResp.java
@@ -0,0 +1,51 @@
+package com.supwisdom.dlpay.bus.bean;
+
+public class BusThirdpartRefundResp extends BusApiResp {
+  private String refno;
+  private String billno;
+  private String refundamount;
+  private String refundstatus;
+  private String accdate;
+
+
+
+  public String getRefno() {
+    return refno;
+  }
+
+  public void setRefno(String refno) {
+    this.refno = refno;
+  }
+
+  public String getBillno() {
+    return billno;
+  }
+
+  public void setBillno(String billno) {
+    this.billno = billno;
+  }
+
+  public String getRefundamount() {
+    return refundamount;
+  }
+
+  public void setRefundamount(String refundamount) {
+    this.refundamount = refundamount;
+  }
+
+  public String getRefundstatus() {
+    return refundstatus;
+  }
+
+  public void setRefundstatus(String refundstatus) {
+    this.refundstatus = refundstatus;
+  }
+
+  public String getAccdate() {
+    return accdate;
+  }
+
+  public void setAccdate(String accdate) {
+    this.accdate = accdate;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/controller/BusThirdpartConsumeController.java b/src/main/java/com/supwisdom/dlpay/bus/controller/BusThirdpartConsumeController.java
new file mode 100644
index 0000000..d3ccda0
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/controller/BusThirdpartConsumeController.java
@@ -0,0 +1,49 @@
+package com.supwisdom.dlpay.bus.controller;
+
+import com.supwisdom.dlpay.bus.bean.*;
+import com.supwisdom.dlpay.bus.service.BusConsumeService;
+import com.supwisdom.dlpay.bus.service.ThirdpartService;
+import com.supwisdom.dlpay.bus.util.MapSetUtil;
+import com.supwisdom.dlpay.bus.util.MapSort;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api/thirdpart")
+public class BusThirdpartConsumeController {
+    @Autowired
+    private BusConsumeService busConsumeService;
+    @Autowired
+    private ThirdpartService thirdpartService;
+
+    private static final Logger logger = LoggerFactory.getLogger(BusThirdpartConsumeController.class);
+
+    @PostMapping("/pay")
+    public BusThirdpartPayResp thirdpartBusPay(@ModelAttribute BusThirdpartPayReq param) {
+
+        return thirdpartService.thirdpartBusPay(param);
+    }
+
+    @PostMapping("/query")
+    public BusBlacklistResp thirdpartQuery(@ModelAttribute BusBlacklistReq req) {
+        return busConsumeService.doGetBlacklist(req);
+    }
+
+    @PostMapping("/refund")
+    public BusDtlUploadResp uploadBusdtl(@ModelAttribute BusdtlUploadReq req) {
+        return busConsumeService.saveOfflineDtl(req);
+    }
+
+    //营业额查询
+    @RequestMapping(value = "/getbilldata", method = RequestMethod.POST)
+    @ResponseBody
+    public BusQuerysalesResp getBilldata(@ModelAttribute BusSysparaReq req) {
+        return  busConsumeService.busQuerySales(req);
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/dao/OnlineBusdtlDao.java b/src/main/java/com/supwisdom/dlpay/bus/dao/OnlineBusdtlDao.java
index 73bfad1..688abb9 100644
--- a/src/main/java/com/supwisdom/dlpay/bus/dao/OnlineBusdtlDao.java
+++ b/src/main/java/com/supwisdom/dlpay/bus/dao/OnlineBusdtlDao.java
@@ -9,4 +9,6 @@
 @Repository
 public interface OnlineBusdtlDao extends JpaRepository<TOnlineBusdtl, String> {
     List<TOnlineBusdtl> findAllByTransdateAndStatus(String transdate,String status);
+
+    TOnlineBusdtl findByRefnoOrBillno(String refno,String billno);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/bus/service/BusConsumeService.java b/src/main/java/com/supwisdom/dlpay/bus/service/BusConsumeService.java
index 725a339..aef4e2e 100644
--- a/src/main/java/com/supwisdom/dlpay/bus/service/BusConsumeService.java
+++ b/src/main/java/com/supwisdom/dlpay/bus/service/BusConsumeService.java
@@ -29,4 +29,8 @@
     List<TOfflineBusdtl> getUncheckOfflineTransdtl(String transdate);
 
     List<TOnlineBusdtl> getSubmittingOnlineTransdtl(String transdate);
+
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    BusThirdpartRefundResp doBusRefund(BusThirdpartRefundReq req);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/bus/service/ThirdpartService.java b/src/main/java/com/supwisdom/dlpay/bus/service/ThirdpartService.java
new file mode 100644
index 0000000..93f382b
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/service/ThirdpartService.java
@@ -0,0 +1,18 @@
+package com.supwisdom.dlpay.bus.service;
+
+import com.supwisdom.dlpay.api.bean.CitizenPayResponse;
+import com.supwisdom.dlpay.bus.bean.*;
+import com.supwisdom.dlpay.bus.domain.TOfflineBusdtl;
+import com.supwisdom.dlpay.bus.domain.TOnlineBusdtl;
+
+public interface ThirdpartService {
+    BusThirdpartPayResp thirdpartBusPay(BusThirdpartPayReq param);
+
+    BusThirdpartQueryResp thirdpartBusQuery(BusThirdpartQueryReq param);
+
+    BusThirdpartRefundResp doThirdpartRefund(BusThirdpartRefundReq param);
+
+    TOnlineBusdtl doSetOnlineBusdtl(TOfflineBusdtl dtl);
+
+    void saveFailTransdtls(TOfflineBusdtl dtl, TOnlineBusdtl tTransDtl, CitizenPayResponse finishresp);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/service/impl/BusConsumeServiceImpl.java b/src/main/java/com/supwisdom/dlpay/bus/service/impl/BusConsumeServiceImpl.java
index 712677c..98a15a2 100644
--- a/src/main/java/com/supwisdom/dlpay/bus/service/impl/BusConsumeServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/bus/service/impl/BusConsumeServiceImpl.java
@@ -1,6 +1,8 @@
 package com.supwisdom.dlpay.bus.service.impl;
 
+import com.supwisdom.dlpay.api.bean.ConsumePayCancelParam;
 import com.supwisdom.dlpay.api.bean.DevparaBean;
+import com.supwisdom.dlpay.api.bean.PayReverseResponse;
 import com.supwisdom.dlpay.api.service.impl.PosPayServiceImpl;
 import com.supwisdom.dlpay.api.util.ErrorCode;
 import com.supwisdom.dlpay.bus.bean.*;
@@ -21,19 +23,27 @@
 import com.supwisdom.dlpay.framework.domain.TSyspara;
 import com.supwisdom.dlpay.framework.service.SystemUtilService;
 import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.paysdk.proxy.CitizenCardPayProxy;
 import com.supwisdom.dlpay.paysdk.proxy.TransactionProxy;
 import com.supwisdom.dlpay.paysdk.proxy.UserProxy;
+import com.supwisdom.dlpay.restaurant.bean.AmountCountBean;
 import com.supwisdom.dlpay.restaurant.bean.ManageFeeAmtBean;
 import com.supwisdom.dlpay.restaurant.bean.SalesAmtBean;
 import com.supwisdom.dlpay.restaurant.dao.*;
 import com.supwisdom.dlpay.restaurant.domain.*;
 import com.supwisdom.dlpay.restaurant.service.*;
+import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
+import org.hibernate.query.internal.NativeQueryImpl;
+import org.hibernate.transform.Transformers;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -61,11 +71,14 @@
     private DeviceParamService deviceParamService;
     @Autowired
     private ShopSettlementService shopSettlementService;
-
     @Autowired
     private CitizenCardDao cardDao;
     @Autowired
     private CitizenCardverDao cardverDao;
+    @Autowired
+    private TransactionProxy transactionProxy;
+    @PersistenceContext
+    private EntityManager entityManager;
 
 
     @Override
@@ -304,6 +317,8 @@
         return resp;
     }
 
+
+
     @Override
     public BusQuerysalesResp busQuerySales(BusSysparaReq req) {
         BusQuerysalesResp resp = new BusQuerysalesResp();
@@ -315,7 +330,7 @@
             return resp;
         }
 
-        SalesAmtBean salesAmtBean = transDtlService.getSalesToday(req.getTermdate(), device.getId());
+        SalesAmtBean salesAmtBean = getBusSalesToday(req.getTermdate(), device.getId());
    //     ManageFeeAmtBean feeAmtBean = transDtlService.getManageFeeToday(req.getTermdate(), device.getId());
 
 
@@ -346,6 +361,83 @@
         return onlineBusdtlDao.findAllByTransdateAndStatus(transdate,BusConstant.STATUS_WAIT);
     }
 
+    @Override
+    public BusThirdpartRefundResp doBusRefund(BusThirdpartRefundReq req) {
+        BusThirdpartRefundResp resp = new BusThirdpartRefundResp();
+        TOnlineBusdtl tTransDtl = onlineBusdtlDao.findByRefnoOrBillno(req.getOrgrefno(),req.getOrgbillno());
+        if (null == tTransDtl) {
+            resp.setRetcode(ErrorCode.ERRIF_OK);
+            resp.setRetmsg("交易参考号" + req.getOrgbillno() + "不存在");
+            return resp;
+        }
+        if (!RestaurantConstant.STATUS_TRANSDTL_SUCCESS.toUpperCase().equals(tTransDtl.getStatus().toUpperCase())) {
+           /* tTransDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
+            tTransDtl.setAttr1("交易状态未成功");*/
+            resp.setRetcode(ErrorCode.ERRIF_OK);
+            resp.setRetmsg("流水" + req.getOrgbillno() + "交易状态未成功，不能冲正");
+            return resp;
+        }
+        if (tTransDtl.getRevflag() == 1) {
+            resp.setRetcode(ErrorCode.ERRIF_OK);
+            resp.setRetmsg("流水" + req.getOrgbillno() + "已冲正");
+            return resp;
+        }
+        try {
+
+            TOnlineBusdtl revDtl=new TOnlineBusdtl();
+            revDtl.setBillno(req.getBillno());
+            String date=DateUtil.getNow("yyyyMMdd");
+            String time=DateUtil.getNow("HHmmss");
+            revDtl.setTransdate(date);
+            revDtl.setTranstime(time);
+            revDtl.setStatus(tTransDtl.getStatus());
+            revDtl.setTermid(tTransDtl.getTermid());
+            revDtl.setMerchaccno(tTransDtl.getMerchaccno());
+
+            revDtl.setPayerid(tTransDtl.getPayerid());
+            revDtl.setCardno(tTransDtl.getCardno());
+            revDtl.setPayername(tTransDtl.getPayername());
+            revDtl.setTranstype(BusConstant.TRANSTYPE_TRANSDTL_REVERT);
+            revDtl.setAmount(tTransDtl.getAmount()*-1.00);
+            ConsumePayCancelParam cancelParam=new ConsumePayCancelParam();
+            cancelParam.setRefno(tTransDtl.getRefno());
+            cancelParam.setRequestbillno(revDtl.getBillno());
+            cancelParam.setTransdate(revDtl.getTransdate());
+            cancelParam.setTranstime(revDtl.getTranstime());
+            PayReverseResponse reverseResp=transactionProxy.payCancel(cancelParam);
+
+            if(reverseResp.getRetcode()!=0){
+                revDtl.setStatus(BusConstant.STATUS_TRANSDTL_FAIL);
+                revDtl.setRemark(reverseResp.getRetmsg()+","+reverseResp.getException());
+                onlineBusdtlDao.save(revDtl);
+                resp.setRetcode(BusConstant.BUS_THIRDPART_CONSUME_ERROR);
+                resp.setRetmsg("冲正失败"+revDtl.getRemark());
+                return resp;
+            }
+            revDtl.setStatus(BusConstant.STATUS_TRANSDTL_SUCCESS);
+            revDtl.setAcctime(systemUtilService.getSysdatetime().getHosttime());
+            revDtl.setAccdate(date);
+            revDtl.setRefno(reverseResp.getRefno());
+            onlineBusdtlDao.save(revDtl);
+            tTransDtl.setRevflag(1);
+            onlineBusdtlDao.save(tTransDtl);
+            resp.setRetmsg("冲正成功");
+            resp.setRetcode(BusConstant.STATUS_TRANSDTL_SUCCESS);
+            resp.setRefno(revDtl.getRefno());
+            resp.setAccdate(date);
+            resp.setRefundamount(tTransDtl.getAmount().toString());
+            resp.setRefundstatus(revDtl.getStatus());
+            resp.setBillno(revDtl.getBillno());
+
+            return resp;
+        } catch (Exception e) {
+            e.printStackTrace();
+            resp.setRetcode(ErrorCode.ERRIF_TRANS_REVERSED);
+            resp.setRetmsg("冲正失败，错误：" + e.getMessage());
+            return resp;
+        }
+    }
+
 
     private BusApiResp checkDevice(BusApiResp resp, TDevice device) {
         if (null == device) {
@@ -366,4 +458,24 @@
         resp.setRetcode(ErrorCode.ERRIF_OK);
         return resp;
     }
+
+    private SalesAmtBean getBusSalesToday(String transdate, Integer termid) {
+        StringBuffer querySql = new StringBuffer("select sum(amount) as totalamt,count(billno) as totalcnt " +
+                "from tb_onlinebusdtl where transdate=:transdate and termid=:termid and status=:stat ");
+
+        Query query = entityManager.createNativeQuery(querySql.toString());
+        query.setParameter("transdate", transdate);
+        query.setParameter("termid", termid);
+        query.setParameter("stat", RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
+        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(AmountCountBean.class));
+        List<AmountCountBean> list = query.getResultList();
+        if (!StringUtil.isEmpty(list)) {
+            AmountCountBean acb = list.get(0);
+            SalesAmtBean bean = new SalesAmtBean();
+            bean.setSalescnt(acb.getTotalcnt().longValue());
+            bean.setSalesamt(acb.getTotalamt() == null ? 0 : Math.round(acb.getTotalamt() * 100));
+            return bean;
+        }
+        return new SalesAmtBean(0L, 0L);
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/bus/service/impl/ThirdpartServiceImpl.java b/src/main/java/com/supwisdom/dlpay/bus/service/impl/ThirdpartServiceImpl.java
new file mode 100644
index 0000000..5d786bc
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/service/impl/ThirdpartServiceImpl.java
@@ -0,0 +1,505 @@
+package com.supwisdom.dlpay.bus.service.impl;
+
+import com.supwisdom.dlpay.api.bean.*;
+import com.supwisdom.dlpay.api.util.ErrorCode;
+import com.supwisdom.dlpay.bus.bean.*;
+import com.supwisdom.dlpay.bus.dao.CitizenCardDao;
+import com.supwisdom.dlpay.bus.dao.OfflineBusdtlDao;
+import com.supwisdom.dlpay.bus.dao.OnlineBusdtlDao;
+import com.supwisdom.dlpay.bus.domain.TCitizenCard;
+import com.supwisdom.dlpay.bus.domain.TOfflineBusdtl;
+import com.supwisdom.dlpay.bus.domain.TOnlineBusdtl;
+import com.supwisdom.dlpay.bus.service.BusConsumeService;
+import com.supwisdom.dlpay.bus.service.ThirdpartService;
+import com.supwisdom.dlpay.bus.util.BusConstant;
+import com.supwisdom.dlpay.framework.domain.TApiClient;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.HmacUtil;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.paysdk.proxy.CitizenCardPayProxy;
+import com.supwisdom.dlpay.paysdk.proxy.TransactionProxy;
+import com.supwisdom.dlpay.restaurant.dao.CardDao;
+import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
+import com.supwisdom.dlpay.system.service.ParamService;
+import org.jetbrains.annotations.Contract;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import rx.internal.operators.BackpressureUtils;
+
+import java.util.HashMap;
+
+
+@Service
+public class ThirdpartServiceImpl implements ThirdpartService {
+
+    @Autowired
+    private ParamService paramService;
+    @Autowired
+    private SystemUtilService systemUtilService;
+    @Autowired
+    private CitizenCardDao citizenCardDao;
+    @Autowired
+    private OfflineBusdtlDao offlineBusdtlDao;
+    @Autowired
+    private CitizenCardPayProxy citizenCardPayProxy;
+    @Autowired
+    private OnlineBusdtlDao onlineBusdtlDao;
+    @Autowired
+    private TransactionProxy transactionProxy;
+    @Autowired
+    private BusConsumeService busConsumeService;
+
+    private static final Logger logger = LoggerFactory.getLogger(ThirdpartServiceImpl.class);
+
+
+    @Override
+    public BusThirdpartPayResp thirdpartBusPay(BusThirdpartPayReq req) {
+        BusThirdpartPayResp resp =new BusThirdpartPayResp();
+        resp=checkPayParam(req,resp);
+
+        if(!StringUtil.isEmpty(resp.getRetcode())||!StringUtil.isEmpty(resp.getRetmsg())){
+            return resp;
+        }
+
+        TApiClient client =paramService.getApiClientByAppid(req.getPartner_id());
+        if(null==client){
+            resp.setRetmsg("partner_id错误或未添加");
+            resp.setRetcode(BusConstant.BUS_THIRDPART_SIGNMETHODERR);
+            return resp;
+        }
+        String key=client.getSecret();
+        //签名验证
+        HashMap<String,String> map=new HashMap<>();
+        map.put("billno",req.getBillno());
+        map.put("cardno",req.getCardno());
+        map.put("partner_id",req.getPartner_id());
+        map.put("sign_method",req.getSign_method());
+        map.put("tac",req.getTac());
+        map.put("timestamp",req.getTimestamp());
+        map.put("transdate",req.getTransdate());
+        map.put("transtime",req.getTranstime());
+        map.put("version",req.getVersion());
+        String signstr=StringUtil.createLinkString(map);
+
+        boolean signbol=busVerifySign(key,signstr,req.getSign(),req.getSign_method());
+        if(!signbol){
+            resp.setRetcode(BusConstant.BUS_THIRDPART_WRONGSIGN);
+            resp.setRetmsg("签名错误");
+            return resp;
+        }
+
+        TOfflineBusdtl transDtl = new TOfflineBusdtl();
+        transDtl.setTransdate(req.getTransdate());
+        transDtl.setTranstime(req.getTranstime());
+        transDtl.setBillno(req.getBillno());
+        transDtl.setCardno(req.getCardno());
+        transDtl.setCollecttime(systemUtilService.getSysdatetime().getHostdatetime());
+        transDtl.setCardno(req.getCardno());
+        transDtl.setTranstime(req.getTranstime());
+        transDtl.setTransdate(req.getTransdate());
+        transDtl.setAmount(req.getAmount() / 100.0);
+        transDtl.setDtltype("card");
+        transDtl.setDtlstat(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
+        transDtl.setQrcode("");
+        transDtl.setRemark("第三方车载");
+
+        TCitizenCard tCard = citizenCardDao.findByCardno(req.getCardno());
+        if (null == tCard) {
+            transDtl.setErrcode(BusConstant.BUS_OFFLINE_NOUSER);
+            transDtl.setErrmsg("卡号不存在");
+
+            offlineBusdtlDao.save(transDtl);
+            resp.setRetmsg("保存成功");
+            resp.setRetcode(ErrorCode.ERRIF_OK);
+            return resp;
+        }
+        transDtl.setPayerid(tCard.getPayerid());
+        transDtl.setCardphyid(tCard.getCardphyid());
+        transDtl.setPayername(tCard.getUsername());
+
+/*        TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
+        if (null == device) {
+            transDtl.setErrcode(BusConstant.BUS_OFFLINE_NODEVICE);
+            transDtl.setErrmsg("设备物理ID不存在");
+
+            offlineBusdtlDao.save(transDtl);
+            resp.setRetmsg("保存成功");
+            resp.setRetcode(ErrorCode.ERRIF_OK);
+            return resp;
+        }
+        if (1 != device.getState()) {
+            transDtl.setErrcode(BusConstant.BUS_OFFLINE_DEVICEERROR);
+            transDtl.setErrmsg("设备状态异常");
+            offlineBusdtlDao.save(transDtl);
+            resp.setRetmsg("保存成功");
+            resp.setRetcode(ErrorCode.ERRIF_OK);
+            return resp;
+        }
+        if (!BusConstant.STATUS_NORMAL.equals(device.getCheckstatus())) {
+            transDtl.setErrcode(BusConstant.BUS_OFFLINE_DEVICEERROR);
+            transDtl.setErrmsg("设备审核未通过");
+            offlineBusdtlDao.save(transDtl);
+            resp.setRetmsg("保存成功");
+            resp.setRetcode(ErrorCode.ERRIF_OK);
+            return resp;
+        }
+
+        transDtl.setTermid(device.getId());
+        transDtl.setDevphyid(device.getDevphyid());*/
+        transDtl.setMerchaccno(req.getPartner_id());
+
+        transDtl.setStatus(BusConstant.STATUS_INIT);
+
+
+        TOnlineBusdtl onlineBusdtl = doSetOnlineBusdtl(transDtl);
+
+        CitizenCardPayinitParam param = new CitizenCardPayinitParam();
+        param.setBillno(transDtl.getBillno());
+        param.setShopaccno(transDtl.getMerchaccno());
+        param.setTransdate(transDtl.getTransdate());
+        param.setTranstime(transDtl.getTranstime());
+        param.setCardNo(transDtl.getCardno());
+        param.setDtltype("carbus");
+        Double amt = transDtl.getAmount() * 100;
+        param.setAmount(amt.intValue());
+
+        CitizenPayResponse response = citizenCardPayProxy.citizencardPayinit(param);
+        if (response.getRetcode() != 0) {
+            saveFailTransdtls(transDtl, onlineBusdtl, response);
+            logger.error(transDtl.getBillno() + "初始化失败," + response.getRetcode() + "," + response.getRetmsg() + "," + response.getException());
+
+            resp.setRetcode(response.getRetcode().toString());
+            resp.setRetmsg(response.getRetmsg());
+            return resp;
+
+        }
+        CitizenCardPayfinishParam finishparam = new CitizenCardPayfinishParam();
+        finishparam.setRefno(response.getRefno());
+        CitizenPayResponse finishresp = citizenCardPayProxy.citizencardPayFinish(finishparam);
+        if (finishresp.getRetcode() != 0) {
+            saveFailTransdtls(transDtl, onlineBusdtl, finishresp);
+            logger.error(transDtl.getBillno() + "消费确认失败," + finishresp.getRetcode() + "," + finishresp.getRetmsg() + "," + finishresp.getException());
+
+            resp.setRetmsg(finishresp.getRetmsg());
+            resp.setRetcode(finishresp.getRetcode().toString());
+            return resp;
+        }
+        String date = DateUtil.getNow("yyyyMMdd");
+        onlineBusdtl.setAccdate(date);
+        onlineBusdtl.setAcctime(systemUtilService.getSysdatetime().getHosttime());
+        onlineBusdtl.setCoreStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
+        onlineBusdtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
+        onlineBusdtl.setRefno(response.getRefno());
+        transDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
+        busConsumeService.saveOfflineBusdtlAndOnlinedtl(transDtl,onlineBusdtl);
+
+
+        resp.setRetcode(ErrorCode.ERRIF_OK);
+        resp.setRetmsg("保存成功");
+        resp.setAmount(req.getAmount().toString());
+        resp.setAccdate(req.getTransdate());
+        resp.setStatus(BusConstant.STATUS_TRANSDTL_SUCCESS);
+        resp.setRefno(response.getRefno());
+        resp.setBillno(req.getBillno());
+        return resp;
+    }
+
+    @Override
+    public BusThirdpartQueryResp thirdpartBusQuery(BusThirdpartQueryReq req) {
+
+        BusThirdpartQueryResp resp = new BusThirdpartQueryResp();
+        resp=checkQueryParam(req,resp);
+
+
+        TApiClient client =paramService.getApiClientByAppid(req.getPartner_id());
+        if(null==client){
+            resp.setRetmsg("partner_id错误或未添加");
+            resp.setRetcode(BusConstant.BUS_THIRDPART_SIGNMETHODERR);
+            return resp;
+        }
+        String key=client.getSecret();
+        //签名验证
+        HashMap<String,String> map=new HashMap<>();
+        map.put("billno",req.getBillno());
+        map.put("refno",req.getRefno());
+        map.put("sign_method",req.getSign_method());
+        map.put("timestamp",req.getTimestamp());
+        map.put("version",req.getVersion());
+        String signstr=StringUtil.createLinkString(map);
+
+        boolean signbol=busVerifySign(key,signstr,req.getSign(),req.getSign_method());
+        if(!signbol){
+            resp.setRetcode(BusConstant.BUS_THIRDPART_WRONGSIGN);
+            resp.setRetmsg("签名错误");
+            return resp;
+        }
+
+        TOnlineBusdtl tTransdtl = onlineBusdtlDao.findByRefnoOrBillno(req.getRefno(),req.getBillno());
+        if (null == tTransdtl) {
+            resp.setRetcode(ErrorCode.ERRIF_POSDTL_NOTEXIST);
+            resp.setRetmsg("交易参考号" + req.getBillno() + "不存在");
+            return resp;
+        }
+
+        QueryDtlResultParam param = new QueryDtlResultParam();
+        param.setRefno(tTransdtl.getRefno());
+        param.setBillno(tTransdtl.getBillno());
+        param.setShopaccno(tTransdtl.getMerchaccno());
+        QueryTransDtlResponse queryresp = transactionProxy.queryDtlResult(param);
+
+        resp.setBillno(tTransdtl.getBillno());
+        resp.setRefno(queryresp.getOutTradeNo());
+        Double retAmount = queryresp.getAmount() * 100;
+        resp.setAmount(retAmount.toString());
+        resp.setStatus(queryresp.getStatus());
+        resp.setAccdate(tTransdtl.getAccdate());
+        resp.setRetcode(ErrorCode.ERRIF_OK);
+        resp.setRetmsg("查询成功");
+        return resp;
+    }
+
+    @Override
+    public BusThirdpartRefundResp doThirdpartRefund(BusThirdpartRefundReq req) {
+        BusThirdpartRefundResp resp=new BusThirdpartRefundResp();
+        resp=checkRefundParam(req,resp);
+
+        if(!StringUtil.isEmpty(resp.getRetcode())||!StringUtil.isEmpty(resp.getRetmsg())){
+            return resp;
+        }
+
+        TApiClient client =paramService.getApiClientByAppid(req.getPartner_id());
+        if(null==client){
+            resp.setRetmsg("partner_id错误或未添加");
+            resp.setRetcode(BusConstant.BUS_THIRDPART_SIGNMETHODERR);
+            return resp;
+        }
+        String key=client.getSecret();
+        //签名验证
+        HashMap<String,String> map=new HashMap<>();
+        map.put("billno",req.getBillno());
+        if(!StringUtil.isEmpty(req.getOrgbillno())){
+            map.put("orgBillno",req.getOrgbillno());
+        }else{
+            map.put("orgRefno",req.getOrgrefno());
+        }
+
+        map.put("partner_id",req.getPartner_id());
+        map.put("sign_method",req.getSign_method());
+        map.put("timestamp",req.getTimestamp());
+        map.put("transdate",req.getTransdate());
+        map.put("transtime",req.getTranstime());
+        map.put("version",req.getVersion());
+        String signstr=StringUtil.createLinkString(map);
+
+        boolean signbol=busVerifySign(key,signstr,req.getSign(),req.getSign_method());
+        if(!signbol){
+            resp.setRetcode(BusConstant.BUS_THIRDPART_WRONGSIGN);
+            resp.setRetmsg("签名错误");
+            return resp;
+        }
+
+        return busConsumeService.doBusRefund(req);
+    }
+
+
+    private static BusThirdpartPayResp checkPayParam(BusThirdpartPayReq payReq,BusThirdpartPayResp payResp){
+        BusApiResp busApiResp=checkBaseParam(payReq,payResp);
+
+        if(null!=busApiResp.getRetcode()||null!=busApiResp.getRetmsg()){
+            payResp.setRetcode(busApiResp.getRetcode());
+            payResp.setRetmsg(busApiResp.getRetmsg());
+            return payResp;
+
+        }
+
+        if(StringUtil.isEmpty(payReq.getBillno())){
+            payResp.setRetcode(BusConstant.BUS_THIRDPART_NOPARAM);
+            payResp.setRetmsg("第三方流水号为空");
+            return payResp;
+        }
+        if(StringUtil.isEmpty(payReq.getCardno())){
+            payResp.setRetcode(BusConstant.BUS_THIRDPART_NOPARAM);
+            payResp.setRetmsg("卡号为空");
+            return payResp;
+        }
+        if(StringUtil.isEmpty(payReq.getTac())){
+            payResp.setRetcode(BusConstant.BUS_THIRDPART_NOPARAM);
+            payResp.setRetmsg("校验串为空");
+            return payResp;
+        }
+        if(StringUtil.isEmpty(payReq.getTransdate())){
+            payResp.setRetcode(BusConstant.BUS_THIRDPART_NOPARAM);
+            payResp.setRetmsg("交易日期为空");
+            return payResp;
+        }
+        if(StringUtil.isEmpty(payReq.getTranstime())){
+            payResp.setRetcode(BusConstant.BUS_THIRDPART_NOPARAM);
+            payResp.setRetmsg("交易时间为空");
+            return payResp;
+        }
+        if(null==payReq.getAmount()){
+            payResp.setRetcode(BusConstant.BUS_THIRDPART_NOPARAM);
+            payResp.setRetmsg("交易金额为空");
+            return payResp;
+        }
+        if(payReq.getAmount()<=0){
+            payResp.setRetcode(BusConstant.BUS_THIRDPART_AMOUNTERR);
+            payResp.setRetmsg("交易金额不得小于0");
+            return payResp;
+        }
+        return payResp;
+
+    }
+
+    private static BusThirdpartQueryResp checkQueryParam(BusThirdpartQueryReq req,BusThirdpartQueryResp resp){
+        BusApiResp busApiResp=checkBaseParam(req,resp);
+        if(null!=busApiResp.getRetcode()||null!=busApiResp.getRetmsg()){
+            resp.setRetcode(busApiResp.getRetcode());
+            resp.setRetmsg(busApiResp.getRetmsg());
+            return resp;
+        }
+        if(StringUtil.isEmpty(req.getBillno())){
+            resp.setRetcode(BusConstant.BUS_THIRDPART_NOPARAM);
+            resp.setRetmsg("第三方流水号为空");
+            return resp;
+        }
+        if(StringUtil.isEmpty(req.getRefno())){
+            resp.setRetcode(BusConstant.BUS_THIRDPART_NOPARAM);
+            resp.setRetmsg("核心平台流水号为空");
+            return resp;
+        }
+
+        return resp;
+
+    }
+
+    private static BusThirdpartRefundResp checkRefundParam(BusThirdpartRefundReq req,BusThirdpartRefundResp resp){
+        BusApiResp busApiResp=checkBaseParam(req,resp);
+        if(null!=busApiResp.getRetcode()||null!=busApiResp.getRetmsg()){
+            resp.setRetcode(busApiResp.getRetcode());
+            resp.setRetmsg(busApiResp.getRetmsg());
+            return resp;
+        }
+        if(StringUtil.isEmpty(req.getBillno())){
+            resp.setRetcode(BusConstant.BUS_THIRDPART_NOPARAM);
+            resp.setRetmsg("第三方流水号为空");
+            return resp;
+        }
+        if(StringUtil.isEmpty(req.getOrgbillno())&&StringUtil.isEmpty(req.getOrgrefno())){
+            resp.setRetcode(BusConstant.BUS_THIRDPART_NOPARAM);
+            resp.setRetmsg("冲正流水号和冲正核心平台流水号需至少有一个");
+            return resp;
+        }
+        if(StringUtil.isEmpty(req.getTransdate())){
+            resp.setRetcode(BusConstant.BUS_THIRDPART_NOPARAM);
+            resp.setRetmsg("交易日期为空");
+            return resp;
+        }
+        if(StringUtil.isEmpty(req.getTranstime())){
+            resp.setRetcode(BusConstant.BUS_THIRDPART_NOPARAM);
+            resp.setRetmsg("交易时间为空");
+            return resp;
+        }
+
+        return resp;
+    }
+
+    private static BusApiResp checkBaseParam(BaseThirdpartReq req, BusApiResp resp){
+
+        if(StringUtil.isEmpty(req.getPartner_id())){
+            resp.setRetcode(BusConstant.BUS_THIRDPART_NOPARAM);
+            resp.setRetmsg("partnerid为空");
+            return resp;
+        }
+
+
+        if(StringUtil.isEmpty(req.getVersion())){
+            resp.setRetcode(BusConstant.BUS_THIRDPART_NOPARAM);
+            resp.setRetmsg("version为空");
+            return resp;
+        }
+        if(StringUtil.isEmpty(req.getSign())){
+            resp.setRetcode(BusConstant.BUS_THIRDPART_NOPARAM);
+            resp.setRetmsg("sign为空");
+            return resp;
+        }
+        if(StringUtil.isEmpty(req.getSign_method())){
+            resp.setRetcode(BusConstant.BUS_THIRDPART_NOPARAM);
+            resp.setRetmsg("签名方法为空");
+            return resp;
+        }
+        if(BusConstant.BUS_THIRDPART_SIGNMETHOD.equals(req.getSign_method())){
+            resp.setRetcode(BusConstant.BUS_THIRDPART_SIGNMETHODERR);
+            resp.setRetmsg("签名方法不支持");
+            return resp;
+        }
+        if(StringUtil.isEmpty(req.getTimestamp())){
+            resp.setRetcode(BusConstant.BUS_THIRDPART_NOPARAM);
+            resp.setRetmsg("时间戳为空");
+            return resp;
+        }
+        return resp;
+
+    }
+
+    private static boolean busVerifySign(String key,
+                                         String signdata, String nSign, String nSignmethod) {
+
+
+        signdata = signdata.replaceAll("null", "");//清除空值
+
+        String mysign = "";
+        if ("HMAC".equals(nSignmethod)) {
+            mysign = HmacUtil.HMACSHA1(signdata, key);
+        }
+        if (null != mysign && !"".equals(mysign) && nSign.equalsIgnoreCase(mysign)) {
+            return true;
+        }
+        return false;
+    }
+
+    public TOnlineBusdtl doSetOnlineBusdtl(TOfflineBusdtl dtl) {
+        TOnlineBusdtl tTransDtl = new TOnlineBusdtl();
+        tTransDtl.setManagefee(dtl.getManagefee());
+        tTransDtl.setAmount(dtl.getAmount());
+        tTransDtl.setCardno(dtl.getCardno());
+        tTransDtl.setStatus(dtl.getStatus());
+        tTransDtl.setPayerid(dtl.getPayerid());
+        tTransDtl.setBillno(dtl.getBillno());
+        tTransDtl.setTermseqno(dtl.getTermseqno());
+        tTransDtl.setMerchaccno(dtl.getMerchaccno());
+        tTransDtl.setTransdate(dtl.getTransdate());
+        tTransDtl.setTranstime(dtl.getTranstime());
+        tTransDtl.setTranstype(RestaurantConstant.TRANSTYPE_TRANSDTL_OFFLINE);
+        tTransDtl.setTransmode("card");
+        tTransDtl.setPayername(dtl.getPayername());
+        tTransDtl.setTermid(dtl.getTermid());
+        tTransDtl.setTransdate(dtl.getTransdate());
+        tTransDtl.setTranstime(dtl.getTranstime());
+        tTransDtl.setTranstype("none");
+        tTransDtl.setRevflag(0);
+        tTransDtl.setManagefee(dtl.getManagefee());
+        return tTransDtl;
+    }
+
+    public void saveFailTransdtls(TOfflineBusdtl dtl, TOnlineBusdtl tTransDtl, CitizenPayResponse finishresp) {
+        String status;
+        String attr;
+        if(RestaurantConstant.TRANSDTL_STATUS_WIT==finishresp.getRetcode()){
+            status=RestaurantConstant.STATUS_TRANSDTL_WAIT;
+            attr="";
+            tTransDtl.setRefno(finishresp.getRefno());
+        }else{
+            status=RestaurantConstant.STATUS_TRANSDTL_FAIL;
+            attr=finishresp.getRetmsg() + "," + finishresp.getException()+","+finishresp.getRetcode();
+        }
+        dtl.setStatus(status);
+        dtl.setErrcode(BusConstant.BUS_OFFLINE_DEVICEERROR);
+        dtl.setErrmsg(attr);
+        tTransDtl.setStatus(status);
+        busConsumeService.saveOfflineBusdtlAndOnlinedtl(dtl,tTransDtl);
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/task/BusPayTask.java b/src/main/java/com/supwisdom/dlpay/bus/task/BusPayTask.java
index 0151c06..235277a 100644
--- a/src/main/java/com/supwisdom/dlpay/bus/task/BusPayTask.java
+++ b/src/main/java/com/supwisdom/dlpay/bus/task/BusPayTask.java
@@ -6,6 +6,7 @@
 import com.supwisdom.dlpay.bus.domain.TOfflineBusdtl;
 import com.supwisdom.dlpay.bus.domain.TOnlineBusdtl;
 import com.supwisdom.dlpay.bus.service.BusConsumeService;
+import com.supwisdom.dlpay.bus.service.ThirdpartService;
 import com.supwisdom.dlpay.bus.util.BusConstant;
 import com.supwisdom.dlpay.framework.service.SystemUtilService;
 import com.supwisdom.dlpay.framework.util.DateUtil;
@@ -34,7 +35,7 @@
 
 
     @Autowired
-    private TransDtlService transDtlService;
+    private ThirdpartService thirdpartService;
     @Autowired
     private OnlineBusdtlDao onlineBusdtlDao;
     @Autowired
@@ -54,7 +55,7 @@
         if (dtls.size() > 0) {
             for (TOfflineBusdtl dtl : dtls) {
 
-                TOnlineBusdtl tTransDtl = gettTransDtl(dtl);
+                TOnlineBusdtl tTransDtl = thirdpartService.doSetOnlineBusdtl(dtl);
 
                 CitizenCardPayinitParam param = new CitizenCardPayinitParam();
                 param.setBillno(dtl.getBillno());
@@ -68,7 +69,7 @@
 
                 CitizenPayResponse response = citizenCardPayProxy.citizencardPayinit(param);
                 if (response.getRetcode() != 0) {
-                    saveFailTransdtls(dtl, tTransDtl, response);
+                    thirdpartService.saveFailTransdtls(dtl, tTransDtl, response);
                     logger.error(dtl.getBillno() + "初始化失败," + response.getRetcode() + "," + response.getRetmsg() + "," + response.getException());
                     continue;
                 }
@@ -76,7 +77,7 @@
                 finishparam.setRefno(response.getRefno());
                 CitizenPayResponse finishresp = citizenCardPayProxy.citizencardPayFinish(finishparam);
                 if (finishresp.getRetcode() != 0) {
-                    saveFailTransdtls(dtl, tTransDtl, finishresp);
+                    thirdpartService.saveFailTransdtls(dtl, tTransDtl, finishresp);
                     logger.error(dtl.getBillno() + "消费确认失败," + finishresp.getRetcode() + "," + finishresp.getRetmsg() + "," + finishresp.getException());
                     continue;
                 }
@@ -91,47 +92,6 @@
         }
     }
 
-    private TOnlineBusdtl gettTransDtl(TOfflineBusdtl dtl) {
-        TOnlineBusdtl tTransDtl = new TOnlineBusdtl();
-        tTransDtl.setManagefee(dtl.getManagefee());
-        tTransDtl.setAmount(dtl.getAmount());
-        tTransDtl.setCardno(dtl.getCardno());
-        tTransDtl.setStatus(dtl.getStatus());
-        tTransDtl.setPayerid(dtl.getPayerid());
-        tTransDtl.setBillno(dtl.getBillno());
-        tTransDtl.setTermseqno(dtl.getTermseqno());
-        tTransDtl.setMerchaccno(dtl.getMerchaccno());
-        tTransDtl.setTransdate(dtl.getTransdate());
-        tTransDtl.setTranstime(dtl.getTranstime());
-        tTransDtl.setTranstype(RestaurantConstant.TRANSTYPE_TRANSDTL_OFFLINE);
-        tTransDtl.setTransmode("card");
-        tTransDtl.setPayername(dtl.getPayername());
-        tTransDtl.setTermid(dtl.getTermid());
-        tTransDtl.setTransdate(dtl.getTransdate());
-        tTransDtl.setTranstime(dtl.getTranstime());
-        tTransDtl.setTranstype("none");
-        tTransDtl.setRevflag(0);
-        tTransDtl.setManagefee(dtl.getManagefee());
-        return tTransDtl;
-    }
-
-    private void saveFailTransdtls(TOfflineBusdtl dtl, TOnlineBusdtl tTransDtl, CitizenPayResponse finishresp) {
-        String status;
-        String attr;
-        if(RestaurantConstant.TRANSDTL_STATUS_WIT==finishresp.getRetcode()){
-            status=RestaurantConstant.STATUS_TRANSDTL_WAIT;
-            attr="";
-            tTransDtl.setRefno(finishresp.getRefno());
-        }else{
-            status=RestaurantConstant.STATUS_TRANSDTL_FAIL;
-            attr=finishresp.getRetmsg() + "," + finishresp.getException()+","+finishresp.getRetcode();
-        }
-        dtl.setStatus(status);
-        dtl.setErrcode(BusConstant.BUS_OFFLINE_DEVICEERROR);
-        dtl.setErrmsg(attr);
-        tTransDtl.setStatus(status);
-        busConsumeService.saveOfflineBusdtlAndOnlinedtl(dtl,tTransDtl);
-    }
 
 
     @Scheduled(cron = "0 0/2 * * * ?")
diff --git a/src/main/java/com/supwisdom/dlpay/bus/util/BusConstant.java b/src/main/java/com/supwisdom/dlpay/bus/util/BusConstant.java
index ea512b7..da255ac 100644
--- a/src/main/java/com/supwisdom/dlpay/bus/util/BusConstant.java
+++ b/src/main/java/com/supwisdom/dlpay/bus/util/BusConstant.java
@@ -42,4 +42,20 @@
   public final static String BUS_OFFLINE_NOUSER = "12";
   public final static String BUS_OFFLINE_DEVICEERROR = "13";
 
+
+  public final static String BUS_THIRDPART_NOPARAM = "11";
+  public final static String BUS_THIRDPART_AMOUNTERR = "12";
+  public final static String BUS_THIRDPART_SIGNMETHODERR = "13";
+  public final static String BUS_THIRDPART_WRONGSIGN = "304";
+  public final static String BUS_THIRDPART_CONSUME_ERROR = "99";
+
+  public final static String BUS_THIRDPART_SIGNMETHOD = "HMAC";
+
+  public static final String STATUS_TRANSDTL_INIT = "init";   //初始化
+  public static final String STATUS_TRANSDTL_WAIT = "wip";   //提交中
+  public static final String STATUS_TRANSDTL_SUCCESS = "success";   //已入账
+  public static final String STATUS_TRANSDTL_FAIL = "fail";   //取消
+  public static final String  TRANSTYPE_TRANSDTL_REVERT = "revert";   //取消
+
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/bus/util/MapSetUtil.java b/src/main/java/com/supwisdom/dlpay/bus/util/MapSetUtil.java
new file mode 100644
index 0000000..f7f724b
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/util/MapSetUtil.java
@@ -0,0 +1,69 @@
+package com.supwisdom.dlpay.bus.util;
+
+import com.supwisdom.dlpay.bus.bean.BusThirdpartPayReq;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+public class MapSetUtil {
+    public static boolean setBeanValue(Object bean, String methodname, Object value) throws Exception {
+        Class clazz = bean.getClass();
+        String method = "set" + StringUtil.firstWordUpperCase(methodname);
+        Method m;
+        m = clazz.getMethod(method,value.getClass());
+        m.invoke(bean, value);
+
+        return true;
+    }
+
+    public static HashMap<String, String> ObjecttoMap(Object obj) {
+
+        HashMap<String, String> map = new HashMap<String, String>();
+        try {
+            Class<?> a = null;
+            a = obj.getClass();
+            Field[] fields = a.getDeclaredFields();
+            for (int j = 0; j < fields.length; j++) {
+                String name = fields[j].getName();
+                if ("hashValue".equals(name)) {
+                    continue;
+                }
+                StringBuffer getterMethodName = new StringBuffer();
+                char firstChar = Character.toUpperCase(name.charAt(0));
+                getterMethodName.append("get").append(firstChar)
+                        .append(name.substring(1));
+                Method m = a.getMethod(getterMethodName.toString(), (Class<?>[]) null);
+                Object objectValue = m.invoke(obj, (Object[]) null);
+                String value = "";
+                if (objectValue != null) {
+                    value = objectValue.toString();
+                }
+                map.put(name, value);
+            }
+
+        } catch (Exception e) {
+            System.err.println(e + "error");
+        }
+
+        return map;
+
+    }
+
+
+
+    public static void main(String[] args) {
+        BusThirdpartPayReq req = new BusThirdpartPayReq();
+        try {
+            setBeanValue(req, "amount", 1);
+            System.out.println(req.getAmount());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+
+    }
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/util/MapSort.java b/src/main/java/com/supwisdom/dlpay/bus/util/MapSort.java
new file mode 100644
index 0000000..3946d05
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/util/MapSort.java
@@ -0,0 +1,39 @@
+package com.supwisdom.dlpay.bus.util;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+public class MapSort {
+    /**
+     *
+     * @Title: sortMap
+     * @Description: 对集合内的数据按key的字母顺序做排序
+     */
+    public static List<Map.Entry<String, String>> sortMap( Map<String, String> map) {
+        final List<Map.Entry<String, String>> infos = new ArrayList<>(map.entrySet());
+
+        // 重写集合的排序方法：按字母顺序
+        Collections.sort(infos, Comparator.comparing(Entry::getKey,Comparator.naturalOrder()));
+        return infos;
+    }
+
+    public static void main(final String[] args) {
+        final Map<String, String> map = new HashMap<String, String>();
+        map.put("charSet", "utf-8");
+        map.put("merId", "5412");
+        map.put("acqId", "321");
+
+        List<Map.Entry<String, String>> list = new MapSort().sortMap(map);
+
+        for (Map.Entry<String, String> m : list) {
+            System.out.println(m.getKey() + ":" + m.getValue());
+        }
+
+    }
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/HmacUtil.java b/src/main/java/com/supwisdom/dlpay/framework/util/HmacUtil.java
index f00bbc3..8ee9d7b 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/HmacUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/HmacUtil.java
@@ -113,4 +113,10 @@
         "\"paidamount\": \"1\",\"outtradeno\":\"" + refno + "\",\"yktshopid\": \"2\",\"shopid\":\"68512084\",\"sign\": \"" + sign + "\"}");
   }
 */
+   public static void main(String[] args){
+     String key="dc1d26c0d43e442588092c8d45c21bce";
+     String val="pid=123";
+     String h=HMACSHA1(val,key);
+     System.out.println(h);
+   }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java b/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
index 9d44ea9..c642200 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
@@ -5,122 +5,138 @@
 import java.util.regex.Pattern;
 
 public class StringUtil {
-  /**
-   * 判断字符串是否为空
-   */
-  public static boolean isEmpty(String str) {
-    if (null == str || "".equals(str) || "".equals(str.trim())) {
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * 判断List是否为空
-   */
-  public static boolean isEmpty(List list) {
-    if (null == list || list.size() <= 0) {
-      return true;
-    }
-    return false;
-  }
-
-  public static boolean equalsIgnoreCase(String str1, String str2) {
-    return str1 == null ? str2 == null : str1.equalsIgnoreCase(str2);
-  }
-
-  public static boolean equals(String str1, String str2) {
-    return str1 == null ? str2 == null : str1.equals(str2);
-  }
-
-  /**
-   * 手机号验证
-   *
-   * @param str
-   * @return
-   */
-  public static boolean isMobile(String str) {
-    Pattern p = Pattern.compile("^1[0-9]{10}$"); // 验证手机号
-    Matcher m = p.matcher(str);
-    return m.matches();
-  }
-
-  /**
-   * 邮箱格式验证
-   */
-  public static boolean isEmail(String email) {
-    boolean ret = true;
-    Pattern pattern = Pattern.compile("^([a-zA-Z0-9]+[_|\\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\\.]?)*[a-zA-Z0-9]+\\.[a-zA-Z]{2,3}$");
-    final Matcher mat = pattern.matcher(email);
-    if (!mat.find()) {
-      ret = false;
-    }
-    return ret;
-  }
-
-  /**
-   * 身份证格式验证
-   *
-   * @param str
-   * @return
-   */
-  public static boolean isIdentity(String str) {
-    // 中国公民身份证格式：长度为15或18位，最后一位可以为字母
-    Pattern pattern = Pattern.compile("(\\d{14}[0-9a-zA-Z])|(\\d{17}[0-9a-zA-Z])");
-    final Matcher m = pattern.matcher(str);
-    return m.matches();
-  }
-
-  /**
-   * 除去数组中的空值和签名参数
-   *
-   * @param sArray 签名参数组
-   * @return 去掉空值与签名参数后的新签名参数组
-   */
-  public static Map<String, String> paraFilter(Map<String, String> sArray) {
-    Map<String, String> result = new HashMap<String, String>();
-    if (sArray == null || sArray.size() <= 0) {
-      return result;
-    }
-    for (String key : sArray.keySet()) {
-      String value = sArray.get(key);
-      if (null == value || "".equals(value.trim()) || "null".equalsIgnoreCase(value.trim()) || key.equalsIgnoreCase("sign") || key.equalsIgnoreCase("sign_type")) {
-        continue;
-      }
-      result.put(key, value);
-    }
-    return result;
-  }
-
-  /**
-   * 把数组所有元素排序，并按照“参数=参数值”的模式用“&”字符拼接成字符串
-   *
-   * @param params 需要排序并参与字符拼接的参数组
-   * @return 拼接后字符串
-   */
-  public static String createLinkString(Map<String, String> params) {
-
-    List<String> keys = new ArrayList<String>(params.keySet());
-    Collections.sort(keys);
-
-    String prestr = "";
-
-    for (int i = 0; i < keys.size(); i++) {
-      String key = keys.get(i);
-      String value = params.get(key);
-
-      if (i == keys.size() - 1) {//拼接时，不包括最后一个&字符
-        prestr = prestr + key + "=" + value;
-      } else {
-        prestr = prestr + key + "=" + value + "&";
-      }
+    /**
+     * 判断字符串是否为空
+     */
+    public static boolean isEmpty(String str) {
+        if (null == str || "".equals(str) || "".equals(str.trim())) {
+            return true;
+        }
+        return false;
     }
 
-    return prestr;
-  }
+    /**
+     * 判断List是否为空
+     */
+    public static boolean isEmpty(List list) {
+        if (null == list || list.size() <= 0) {
+            return true;
+        }
+        return false;
+    }
 
-  public static boolean isCharAndNum(String inputStr) {
-    //有问题
+    public static boolean equalsIgnoreCase(String str1, String str2) {
+        return str1 == null ? str2 == null : str1.equalsIgnoreCase(str2);
+    }
+
+    public static boolean equals(String str1, String str2) {
+        return str1 == null ? str2 == null : str1.equals(str2);
+    }
+
+    /**
+     * 手机号验证
+     *
+     * @param str
+     * @return
+     */
+    public static boolean isMobile(String str) {
+        Pattern p = Pattern.compile("^1[0-9]{10}$"); // 验证手机号
+        Matcher m = p.matcher(str);
+        return m.matches();
+    }
+
+    /**
+     * 邮箱格式验证
+     */
+    public static boolean isEmail(String email) {
+        boolean ret = true;
+        Pattern pattern = Pattern.compile("^([a-zA-Z0-9]+[_|\\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\\.]?)*[a-zA-Z0-9]+\\.[a-zA-Z]{2,3}$");
+        final Matcher mat = pattern.matcher(email);
+        if (!mat.find()) {
+            ret = false;
+        }
+        return ret;
+    }
+
+    /**
+     * 身份证格式验证
+     *
+     * @param str
+     * @return
+     */
+    public static boolean isIdentity(String str) {
+        // 中国公民身份证格式：长度为15或18位，最后一位可以为字母
+        Pattern pattern = Pattern.compile("(\\d{14}[0-9a-zA-Z])|(\\d{17}[0-9a-zA-Z])");
+        final Matcher m = pattern.matcher(str);
+        return m.matches();
+    }
+
+    /**
+     * 除去数组中的空值和签名参数
+     *
+     * @param sArray 签名参数组
+     * @return 去掉空值与签名参数后的新签名参数组
+     */
+    public static Map<String, String> paraFilter(Map<String, String> sArray) {
+        Map<String, String> result = new HashMap<String, String>();
+        if (sArray == null || sArray.size() <= 0) {
+            return result;
+        }
+        for (String key : sArray.keySet()) {
+            String value = sArray.get(key);
+            if (null == value || "".equals(value.trim()) || "null".equalsIgnoreCase(value.trim()) || key.equalsIgnoreCase("sign") || key.equalsIgnoreCase("sign_type")) {
+                continue;
+            }
+            result.put(key, value);
+        }
+        return result;
+    }
+
+    /**
+     * 首字母大写
+     * @param str
+     * @return
+     */
+
+    public static String firstWordUpperCase(String str) {
+        char[] ch = str.toCharArray();
+        if (ch[0] >= 'a' && ch[0] <= 'z') {
+            ch[0] = (char) (ch[0] - 32);
+        }
+        return new String(ch);
+    }
+
+    /**
+     * 把数组所有元素排序，并按照“参数=参数值”的模式用“&”字符拼接成字符串
+     *
+     * @param params 需要排序并参与字符拼接的参数组
+     * @return 拼接后字符串
+     */
+    public static String createLinkString(Map<String, String> params) {
+
+        List<String> keys = new ArrayList<String>(params.keySet());
+        Collections.sort(keys);
+
+        String prestr = "";
+
+        for (int i = 0; i < keys.size(); i++) {
+            String key = keys.get(i);
+            if(!"sign".equalsIgnoreCase(key)){
+                String value = params.get(key);
+
+                if (i == keys.size() - 1) {//拼接时，不包括最后一个&字符
+                    prestr = prestr + key + "=" + value;
+                } else {
+                    prestr = prestr + key + "=" + value + "&";
+                }
+            }
+        }
+
+        return prestr;
+    }
+
+    public static boolean isCharAndNum(String inputStr) {
+        //有问题
     /*Pattern p = Pattern.compile("\\w+");
     Matcher m = p.matcher(inputStr);
     if (m.matches()) {
@@ -129,8 +145,8 @@
     } else {
       return true;
     }*/
-    return true;
-  }
+        return true;
+    }
 
 
 }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/security.kt b/src/main/kotlin/com/supwisdom/dlpay/security.kt
index bd7e1e4..d4166cb 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/security.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/security.kt
@@ -121,7 +121,7 @@
                         .antMatcher("/api/**")
                         .authorizeRequests()
                         .antMatchers("/api/auth/**").permitAll()
-                        //.antMatchers("/api/pos/**").permitAll()
+                        .antMatchers("/api/thirdpart/**").permitAll()
                         .antMatchers("/api/notify/**").permitAll()
                         .antMatchers("/api/common/**").hasAnyRole("THIRD_COMMON", "THIRD_ADMIN")
                         .antMatchers("/api/consume/**").hasRole("THIRD_CONSUME")
@@ -130,6 +130,7 @@
                         .antMatchers("/api/shop/**").hasRole("THIRD_SHOP")
                         .antMatchers("/api/pos/**").hasRole("THIRD_SHOP")
                         .antMatchers("/api/bus/**").hasRole("THIRD_SHOP")
+                        .antMatchers("/api/thirdpart/**").hasRole("THIRD_SHOP")
                         .anyRequest().hasRole("THIRD_COMMON")
                         .and()
                         .csrf().ignoringAntMatchers("/api/**")
diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html
index 76b87de..eac4a8c 100755
--- a/src/main/resources/templates/index.html
+++ b/src/main/resources/templates/index.html
@@ -22,7 +22,7 @@
     <div class="layui-header">
         <div class="layui-logo">
             <img th:src="@{/static/custom/images/logo.png}"/>
-            <cite>食堂应用中心</cite>
+            <cite>车载应用中心</cite>
         </div>
         <ul class="layui-nav layui-layout-left">
             <li class="layui-nav-item" lay-unselect>
