第三方车载功能提交
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>